@agentxjs/core 1.9.10-dev → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/README.md +342 -0
  2. package/dist/RpcClient-BcJ_zAGu.d.ts +304 -0
  3. package/dist/agent/engine/internal/index.d.ts +20 -15
  4. package/dist/agent/engine/internal/index.js +1 -2
  5. package/dist/agent/engine/mealy/index.js +0 -1
  6. package/dist/agent/index.d.ts +4 -4
  7. package/dist/agent/index.js +15 -15
  8. package/dist/agent/types/index.d.ts +4 -4
  9. package/dist/agent/types/index.js +1 -2
  10. package/dist/bash/index.d.ts +29 -0
  11. package/dist/bash/index.js +7 -0
  12. package/dist/{bus-uF1DM2ox.d.ts → bus-C9FLWIu8.d.ts} +3 -1
  13. package/dist/{chunk-K6WXQ2RW.js → chunk-23UUBQXR.js} +1 -2
  14. package/dist/chunk-23UUBQXR.js.map +1 -0
  15. package/dist/chunk-BHOD5PKR.js +55 -0
  16. package/dist/chunk-BHOD5PKR.js.map +1 -0
  17. package/dist/{chunk-I7GYR3MN.js → chunk-DEAR6N3O.js} +77 -91
  18. package/dist/chunk-DEAR6N3O.js.map +1 -0
  19. package/dist/chunk-FI7WQFGV.js +37 -0
  20. package/dist/chunk-FI7WQFGV.js.map +1 -0
  21. package/dist/{chunk-AT5P47YA.js → chunk-JTKCV7IS.js} +9 -9
  22. package/dist/chunk-JTKCV7IS.js.map +1 -0
  23. package/dist/{chunk-E5FPOAPO.js → chunk-LTVNPHST.js} +1 -1
  24. package/dist/chunk-LTVNPHST.js.map +1 -0
  25. package/dist/chunk-SKS7S2RY.js +1 -0
  26. package/dist/common/logger/index.js +0 -2
  27. package/dist/common/logger/index.js.map +1 -1
  28. package/dist/container/index.d.ts +3 -4
  29. package/dist/container/index.js +0 -2
  30. package/dist/container/index.js.map +1 -1
  31. package/dist/driver/index.d.ts +2 -310
  32. package/dist/event/index.d.ts +4 -4
  33. package/dist/event/index.js +1 -2
  34. package/dist/event/types/index.d.ts +4 -10
  35. package/dist/event/types/index.js +1 -2
  36. package/dist/{event-CDuTzs__.d.ts → event-DNWOBSBO.d.ts} +3 -4
  37. package/dist/image/index.d.ts +9 -5
  38. package/dist/image/index.js +5 -2
  39. package/dist/image/index.js.map +1 -1
  40. package/dist/index-CuS1i5V-.d.ts +609 -0
  41. package/dist/index.d.ts +2 -2
  42. package/dist/index.js +16 -16
  43. package/dist/{message-BMrMm1pq.d.ts → message-03TJzvIX.d.ts} +10 -33
  44. package/dist/mq/index.js +0 -2
  45. package/dist/mq/index.js.map +1 -1
  46. package/dist/network/index.d.ts +3 -291
  47. package/dist/network/index.js +3 -14
  48. package/dist/network/index.js.map +1 -1
  49. package/dist/persistence/index.d.ts +2 -155
  50. package/dist/platform/index.d.ts +76 -0
  51. package/dist/platform/index.js.map +1 -0
  52. package/dist/runtime/index.d.ts +26 -59
  53. package/dist/runtime/index.js +117 -33
  54. package/dist/runtime/index.js.map +1 -1
  55. package/dist/session/index.d.ts +4 -52
  56. package/dist/session/index.js +4 -51
  57. package/dist/session/index.js.map +1 -1
  58. package/dist/types-aE74Eo6G.d.ts +90 -0
  59. package/package.json +10 -5
  60. package/src/agent/__tests__/engine/internal/messageAssemblerProcessor.test.ts +291 -87
  61. package/src/agent/__tests__/engine/internal/turnTrackerProcessor.test.ts +56 -75
  62. package/src/agent/engine/MealyMachine.ts +1 -1
  63. package/src/agent/engine/internal/messageAssemblerProcessor.ts +99 -114
  64. package/src/agent/engine/internal/turnTrackerProcessor.ts +23 -27
  65. package/src/agent/types/event.ts +0 -4
  66. package/src/agent/types/index.ts +1 -3
  67. package/src/agent/types/message.ts +9 -43
  68. package/src/bash/index.ts +21 -0
  69. package/src/bash/tool.ts +57 -0
  70. package/src/bash/types.ts +108 -0
  71. package/src/driver/index.ts +1 -0
  72. package/src/driver/types.ts +122 -4
  73. package/src/event/__tests__/EventBus.test.ts +1 -1
  74. package/src/event/types/agent.ts +0 -11
  75. package/src/event/types/command.ts +3 -1
  76. package/src/image/Image.ts +11 -1
  77. package/src/image/types.ts +8 -2
  78. package/src/network/RpcClient.ts +21 -20
  79. package/src/network/index.ts +1 -1
  80. package/src/persistence/types.ts +5 -2
  81. package/src/platform/index.ts +21 -0
  82. package/src/platform/types.ts +84 -0
  83. package/src/runtime/AgentXRuntime.ts +184 -57
  84. package/src/runtime/__tests__/AgentXRuntime.test.ts +343 -0
  85. package/src/runtime/index.ts +7 -19
  86. package/src/runtime/types.ts +10 -62
  87. package/dist/chunk-7D4SUZUM.js +0 -38
  88. package/dist/chunk-AT5P47YA.js.map +0 -1
  89. package/dist/chunk-E5FPOAPO.js.map +0 -1
  90. package/dist/chunk-I7GYR3MN.js.map +0 -1
  91. package/dist/chunk-K6WXQ2RW.js.map +0 -1
  92. package/dist/workspace/index.d.ts +0 -111
  93. package/dist/wrapper-Y3UTVU2E.js +0 -3635
  94. package/dist/wrapper-Y3UTVU2E.js.map +0 -1
  95. package/src/workspace/index.ts +0 -27
  96. package/src/workspace/types.ts +0 -131
  97. /package/dist/{workspace → bash}/index.js.map +0 -0
  98. /package/dist/{chunk-7D4SUZUM.js.map → chunk-SKS7S2RY.js.map} +0 -0
  99. /package/dist/{workspace → platform}/index.js +0 -0
@@ -0,0 +1,343 @@
1
+ /**
2
+ * AgentXRuntime.test.ts - AgentEngine pipeline integration
3
+ *
4
+ * Verifies that the Runtime properly integrates with the
5
+ * AgentEngine pipeline (Source → MealyMachine → Presenter):
6
+ * - Message events (assistant_message, tool_result_message)
7
+ * - State events (conversation_start, conversation_end)
8
+ * - Turn events (turn_request, turn_response)
9
+ * - Message persistence (user + assistant + tool messages)
10
+ */
11
+
12
+ import { describe, it, expect, beforeEach, afterEach } from "bun:test";
13
+ import { createAgentXRuntime } from "../AgentXRuntime";
14
+ import { EventBusImpl as EventBus } from "../../event/EventBus";
15
+ import type { AgentXPlatform } from "../../platform/types";
16
+ import type { Message } from "../../agent/types";
17
+ import type { BusEvent } from "../../event/types";
18
+ import type { DriverStreamEvent } from "../../driver/types";
19
+
20
+ // ============================================================================
21
+ // Mock Helpers
22
+ // ============================================================================
23
+
24
+ /**
25
+ * Create a mock Driver that yields predefined stream events
26
+ */
27
+ function createMockDriver(events: DriverStreamEvent[]) {
28
+ return {
29
+ name: "MockDriver",
30
+ initialize: async () => {},
31
+ receive: async function* () {
32
+ for (const event of events) {
33
+ yield event;
34
+ }
35
+ },
36
+ interrupt: () => {},
37
+ dispose: async () => {},
38
+ };
39
+ }
40
+
41
+ /**
42
+ * Simple text response: message_start → text_delta → message_stop
43
+ */
44
+ function simpleTextResponse(text: string): DriverStreamEvent[] {
45
+ return [
46
+ {
47
+ type: "message_start",
48
+ data: { messageId: "msg_test_1", model: "test-model" },
49
+ },
50
+ {
51
+ type: "text_delta",
52
+ data: { text },
53
+ },
54
+ {
55
+ type: "message_stop",
56
+ data: { stopReason: "end_turn" },
57
+ },
58
+ ] as DriverStreamEvent[];
59
+ }
60
+
61
+ /**
62
+ * In-memory SessionRepository
63
+ */
64
+ function createMockSessionRepository() {
65
+ const sessions = new Map<string, { messages: Message[] }>();
66
+
67
+ return {
68
+ saveSession: async (record: { sessionId: string }) => {
69
+ if (!sessions.has(record.sessionId)) {
70
+ sessions.set(record.sessionId, { messages: [] });
71
+ }
72
+ },
73
+ findSessionById: async (sessionId: string) => {
74
+ return sessions.has(sessionId) ? { sessionId } : null;
75
+ },
76
+ findSessionsByImageId: async () => [],
77
+ findSessionsByContainerId: async () => [],
78
+ deleteSession: async () => {},
79
+ addMessage: async (sessionId: string, message: Message) => {
80
+ if (!sessions.has(sessionId)) {
81
+ sessions.set(sessionId, { messages: [] });
82
+ }
83
+ sessions.get(sessionId)!.messages.push(message);
84
+ },
85
+ getMessages: async (sessionId: string) => {
86
+ return sessions.get(sessionId)?.messages ?? [];
87
+ },
88
+ clearMessages: async () => {},
89
+
90
+ // Helper for test assertions
91
+ _getMessages: (sessionId: string) => sessions.get(sessionId)?.messages ?? [],
92
+ };
93
+ }
94
+
95
+ /**
96
+ * Minimal mock platform
97
+ */
98
+ function createMockPlatform(driverEvents: DriverStreamEvent[]) {
99
+ const eventBus = new EventBus();
100
+ const sessionRepo = createMockSessionRepository();
101
+
102
+ const platform: AgentXPlatform = {
103
+ containerRepository: {
104
+ createContainer: async () => {},
105
+ containerExists: async () => true,
106
+ findAllContainers: async () => [],
107
+ deleteContainer: async () => {},
108
+ },
109
+ imageRepository: {
110
+ saveImage: async () => {},
111
+ findImageById: async (imageId: string) => ({
112
+ imageId,
113
+ containerId: "container_1",
114
+ sessionId: "session_1",
115
+ name: "TestBot",
116
+ systemPrompt: "You are a test bot.",
117
+ createdAt: Date.now(),
118
+ }),
119
+ findImagesByContainerId: async () => [],
120
+ deleteImage: async () => {},
121
+ updateMetadata: async () => {},
122
+ },
123
+ sessionRepository: sessionRepo,
124
+ eventBus,
125
+ };
126
+
127
+ const runtime = createAgentXRuntime(platform, () => createMockDriver(driverEvents));
128
+
129
+ return { platform, runtime, eventBus, sessionRepo };
130
+ }
131
+
132
+ // ============================================================================
133
+ // Tests
134
+ // ============================================================================
135
+
136
+ describe("AgentXRuntime - AgentEngine Pipeline", () => {
137
+ let env: ReturnType<typeof createMockPlatform>;
138
+
139
+ afterEach(async () => {
140
+ await env.runtime.shutdown();
141
+ });
142
+
143
+ describe("message event emission", () => {
144
+ it("should emit assistant_message event after text response", async () => {
145
+ env = createMockPlatform(simpleTextResponse("Hello from assistant"));
146
+
147
+ const agent = await env.runtime.createAgent({ imageId: "img_1" });
148
+
149
+ const events: BusEvent[] = [];
150
+ env.eventBus.onAny((event) => {
151
+ events.push(event as BusEvent);
152
+ });
153
+
154
+ await env.runtime.receive(agent.agentId, "Hi");
155
+
156
+ // Wait for async processing
157
+ await new Promise((r) => setTimeout(r, 50));
158
+
159
+ const messageTypes = events.map((e) => e.type);
160
+
161
+ // Runtime should produce assistant_message via MealyMachine → Presenter
162
+ expect(messageTypes).toContain("assistant_message");
163
+ });
164
+
165
+ it("should emit assistant_message with tool calls and tool_result_message", async () => {
166
+ const toolEvents: DriverStreamEvent[] = [
167
+ {
168
+ type: "message_start",
169
+ data: { messageId: "msg_tool", model: "test-model" },
170
+ },
171
+ {
172
+ type: "tool_use_start",
173
+ data: { toolCallId: "tc_1", toolName: "get_weather" },
174
+ },
175
+ {
176
+ type: "input_json_delta",
177
+ data: { partialJson: '{"city":"Tokyo"}' },
178
+ },
179
+ {
180
+ type: "tool_use_stop",
181
+ data: { toolCallId: "tc_1", toolName: "get_weather", input: { city: "Tokyo" } },
182
+ },
183
+ {
184
+ type: "message_stop",
185
+ data: { stopReason: "tool_use" },
186
+ },
187
+ {
188
+ type: "tool_result",
189
+ data: { toolCallId: "tc_1", result: "Sunny, 25°C", isError: false },
190
+ },
191
+ ] as DriverStreamEvent[];
192
+
193
+ env = createMockPlatform(toolEvents);
194
+
195
+ const agent = await env.runtime.createAgent({ imageId: "img_1" });
196
+
197
+ const events: BusEvent[] = [];
198
+ env.eventBus.onAny((event) => {
199
+ events.push(event as BusEvent);
200
+ });
201
+
202
+ await env.runtime.receive(agent.agentId, "What's the weather?");
203
+ await new Promise((r) => setTimeout(r, 50));
204
+
205
+ const messageTypes = events.map((e) => e.type);
206
+ // Tool calls are now part of assistant_message, not separate tool_call_message
207
+ expect(messageTypes).toContain("assistant_message");
208
+ expect(messageTypes).toContain("tool_result_message");
209
+ expect(messageTypes).not.toContain("tool_call_message");
210
+
211
+ // Verify assistant message contains tool call in content
212
+ const assistantEvent = events.find((e) => e.type === "assistant_message");
213
+ const content = (assistantEvent?.data as { content: unknown[] })?.content;
214
+ expect(content).toBeDefined();
215
+ const toolCallPart = content?.find(
216
+ (p: unknown) => (p as { type: string }).type === "tool-call"
217
+ );
218
+ expect(toolCallPart).toBeDefined();
219
+ });
220
+ });
221
+
222
+ describe("state event emission", () => {
223
+ it("should emit conversation lifecycle events", async () => {
224
+ env = createMockPlatform(simpleTextResponse("Hello"));
225
+
226
+ const agent = await env.runtime.createAgent({ imageId: "img_1" });
227
+
228
+ const events: BusEvent[] = [];
229
+ env.eventBus.onAny((event) => {
230
+ events.push(event as BusEvent);
231
+ });
232
+
233
+ await env.runtime.receive(agent.agentId, "Hi");
234
+ await new Promise((r) => setTimeout(r, 50));
235
+
236
+ const types = events.map((e) => e.type);
237
+
238
+ // MealyMachine should produce state events
239
+ expect(types).toContain("conversation_start");
240
+ expect(types).toContain("conversation_end");
241
+ });
242
+ });
243
+
244
+ describe("message persistence", () => {
245
+ it("should persist user message to session", async () => {
246
+ env = createMockPlatform(simpleTextResponse("Hello"));
247
+
248
+ const agent = await env.runtime.createAgent({ imageId: "img_1" });
249
+ await env.runtime.receive(agent.agentId, "Hi");
250
+ await new Promise((r) => setTimeout(r, 50));
251
+
252
+ const messages = env.sessionRepo._getMessages("session_1");
253
+ const userMessages = messages.filter((m) => m.subtype === "user");
254
+
255
+ expect(userMessages.length).toBe(1);
256
+ });
257
+
258
+ it("should persist assistant message to session", async () => {
259
+ env = createMockPlatform(simpleTextResponse("Hello from assistant"));
260
+
261
+ const agent = await env.runtime.createAgent({ imageId: "img_1" });
262
+ await env.runtime.receive(agent.agentId, "Hi");
263
+ await new Promise((r) => setTimeout(r, 50));
264
+
265
+ const messages = env.sessionRepo._getMessages("session_1");
266
+ const assistantMessages = messages.filter((m) => m.subtype === "assistant");
267
+
268
+ expect(assistantMessages.length).toBe(1);
269
+ });
270
+
271
+ it("should persist tool_call and tool_result messages to session", async () => {
272
+ const toolEvents: DriverStreamEvent[] = [
273
+ {
274
+ type: "message_start",
275
+ data: { messageId: "msg_tool", model: "test-model" },
276
+ },
277
+ {
278
+ type: "tool_use_start",
279
+ data: { toolCallId: "tc_1", toolName: "bash" },
280
+ },
281
+ {
282
+ type: "input_json_delta",
283
+ data: { partialJson: '{"cmd":"ls"}' },
284
+ },
285
+ {
286
+ type: "tool_use_stop",
287
+ data: { toolCallId: "tc_1", toolName: "bash", input: { cmd: "ls" } },
288
+ },
289
+ {
290
+ type: "tool_result",
291
+ data: { toolCallId: "tc_1", result: "file.txt", isError: false },
292
+ },
293
+ {
294
+ type: "message_stop",
295
+ data: { stopReason: "end_turn" },
296
+ },
297
+ ] as DriverStreamEvent[];
298
+
299
+ env = createMockPlatform(toolEvents);
300
+
301
+ const agent = await env.runtime.createAgent({ imageId: "img_1" });
302
+ await env.runtime.receive(agent.agentId, "List files");
303
+ await new Promise((r) => setTimeout(r, 50));
304
+
305
+ const messages = env.sessionRepo._getMessages("session_1");
306
+ // Tool calls are inside assistant message content, not separate messages
307
+ const assistantMessages = messages.filter((m) => m.subtype === "assistant");
308
+ const toolResultMessages = messages.filter((m) => m.subtype === "tool-result");
309
+
310
+ expect(assistantMessages.length).toBeGreaterThanOrEqual(1);
311
+ // Verify at least one assistant message has a tool-call part
312
+ const hasToolCall = assistantMessages.some((m) => {
313
+ const content = (m as { content: unknown }).content;
314
+ return (
315
+ Array.isArray(content) &&
316
+ content.some((p: unknown) => (p as { type: string }).type === "tool-call")
317
+ );
318
+ });
319
+ expect(hasToolCall).toBe(true);
320
+ expect(toolResultMessages.length).toBe(1);
321
+ });
322
+ });
323
+
324
+ describe("turn tracking", () => {
325
+ it("should emit turn_request and turn_response events", async () => {
326
+ env = createMockPlatform(simpleTextResponse("Hello"));
327
+
328
+ const agent = await env.runtime.createAgent({ imageId: "img_1" });
329
+
330
+ const events: BusEvent[] = [];
331
+ env.eventBus.onAny((event) => {
332
+ events.push(event as BusEvent);
333
+ });
334
+
335
+ await env.runtime.receive(agent.agentId, "Hi");
336
+ await new Promise((r) => setTimeout(r, 50));
337
+
338
+ const types = events.map((e) => e.type);
339
+ expect(types).toContain("turn_request");
340
+ expect(types).toContain("turn_response");
341
+ });
342
+ });
343
+ });
@@ -1,28 +1,16 @@
1
1
  /**
2
2
  * Runtime Module
3
3
  *
4
- * AgentXProvider and AgentXRuntime interfaces.
5
- * Platform packages provide concrete implementations.
4
+ * AgentXRuntime interface and implementation.
5
+ * AgentXPlatform is re-exported here for backward compatibility,
6
+ * but its canonical home is @agentxjs/core/platform.
6
7
  *
7
8
  * Usage:
8
9
  * ```typescript
9
- * import type {
10
- * AgentXProvider,
11
- * AgentXRuntime,
12
- * RuntimeAgent,
13
- * } from "@agentxjs/core/runtime";
10
+ * import type { AgentXPlatform } from "@agentxjs/core/platform";
11
+ * import type { AgentXRuntime, RuntimeAgent } from "@agentxjs/core/runtime";
14
12
  *
15
- * // Platform provides implementation
16
- * const provider: AgentXProvider = {
17
- * containerRepository,
18
- * imageRepository,
19
- * sessionRepository,
20
- * workspaceProvider,
21
- * driver,
22
- * eventBus,
23
- * };
24
- *
25
- * const runtime: AgentXRuntime = createRuntime({ provider });
13
+ * const runtime = createAgentXRuntime(platform, createDriver);
26
14
  *
27
15
  * // Create agent from image
28
16
  * const agent = await runtime.createAgent({ imageId: "img_xxx" });
@@ -44,7 +32,7 @@
44
32
  export type {
45
33
  AgentLifecycle,
46
34
  RuntimeAgent,
47
- AgentXProvider,
35
+ AgentXPlatform,
48
36
  CreateAgentOptions,
49
37
  AgentEventHandler,
50
38
  Subscription,
@@ -1,27 +1,19 @@
1
1
  /**
2
2
  * Runtime Types
3
3
  *
4
- * AgentXProvider - Dependency injection container
5
4
  * AgentXRuntime - Runtime integration layer
6
5
  *
7
6
  * Architecture:
8
7
  * ```
9
8
  * ┌─────────────────────────────────────────────────────────────┐
10
- * │ AgentXProvider
11
- * │ (Dependency Injection - Platform provides implementations)
12
- * │ │
13
- * │ ┌─────────────┐ ┌─────────────┐ ┌───────────────┐ │
14
- * │ │ Repositories│ │ Workspace │ │ DriverFactory │ │
15
- * │ │ Container │ │ Provider │ │ (per-Agent) │ │
16
- * │ │ Image │ │ │ │ │ │
17
- * │ │ Session │ │ │ │ │ │
18
- * │ └─────────────┘ └─────────────┘ └─────────────┘ │
9
+ * │ AgentXPlatform
10
+ * │ (see @agentxjs/core/platform)
19
11
  * └─────────────────────────────────────────────────────────────┘
20
12
  * │
21
13
  * ▼
22
14
  * ┌─────────────────────────────────────────────────────────────┐
23
15
  * │ AgentXRuntime │
24
- * │ (Integration - Uses Provider dependencies) │
16
+ * │ (Integration - Uses Platform dependencies) │
25
17
  * │ │
26
18
  * │ ┌─────────────────────────────────────────────────────┐ │
27
19
  * │ │ Agent Lifecycle: create / get / destroy │ │
@@ -32,15 +24,13 @@
32
24
  * ```
33
25
  */
34
26
 
35
- import type { ContainerRepository } from "../container/types";
36
- import type { ImageRepository } from "../image/types";
37
- import type { SessionRepository } from "../session/types";
38
- import type { WorkspaceProvider } from "../workspace/types";
39
- import type { CreateDriver } from "../driver/types";
40
- import type { EventBus } from "../event/types";
27
+ import type { AgentXPlatform } from "../platform/types";
41
28
  import type { UserContentPart } from "../agent/types";
42
29
  import type { BusEvent } from "../event/types";
43
30
 
31
+ // Re-export AgentXPlatform for backward compatibility
32
+ export type { AgentXPlatform } from "../platform/types";
33
+
44
34
  // ============================================================================
45
35
  // Agent Runtime State
46
36
  // ============================================================================
@@ -63,48 +53,6 @@ export interface RuntimeAgent {
63
53
  readonly createdAt: number;
64
54
  }
65
55
 
66
- // ============================================================================
67
- // AgentXProvider - Dependency Injection
68
- // ============================================================================
69
-
70
- /**
71
- * AgentXProvider - Collects all dependencies for runtime
72
- *
73
- * Platform packages provide implementations of these interfaces.
74
- * The provider is passed to AgentXRuntime for integration.
75
- */
76
- export interface AgentXProvider {
77
- /**
78
- * Container repository for persistence
79
- */
80
- readonly containerRepository: ContainerRepository;
81
-
82
- /**
83
- * Image repository for persistence
84
- */
85
- readonly imageRepository: ImageRepository;
86
-
87
- /**
88
- * Session repository for persistence
89
- */
90
- readonly sessionRepository: SessionRepository;
91
-
92
- /**
93
- * Workspace provider for isolated environments
94
- */
95
- readonly workspaceProvider: WorkspaceProvider;
96
-
97
- /**
98
- * LLM Driver factory function - creates Driver per Agent
99
- */
100
- readonly createDriver: CreateDriver;
101
-
102
- /**
103
- * Event bus for pub/sub
104
- */
105
- readonly eventBus: EventBus;
106
- }
107
-
108
56
  // ============================================================================
109
57
  // AgentXRuntime - Integration Layer
110
58
  // ============================================================================
@@ -144,9 +92,9 @@ export interface Subscription {
144
92
  */
145
93
  export interface AgentXRuntime {
146
94
  /**
147
- * The provider containing all dependencies
95
+ * The platform containing all dependencies
148
96
  */
149
- readonly provider: AgentXProvider;
97
+ readonly platform: AgentXPlatform;
150
98
 
151
99
  // ==================== Agent Lifecycle ====================
152
100
 
@@ -227,7 +175,7 @@ export interface AgentXRuntime {
227
175
  * Configuration for creating AgentXRuntime
228
176
  */
229
177
  export interface AgentXRuntimeConfig {
230
- provider: AgentXProvider;
178
+ platform: AgentXPlatform;
231
179
  }
232
180
 
233
181
  /**
@@ -1,38 +0,0 @@
1
- var __create = Object.create;
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
8
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
9
- }) : x)(function(x) {
10
- if (typeof require !== "undefined") return require.apply(this, arguments);
11
- throw Error('Dynamic require of "' + x + '" is not supported');
12
- });
13
- var __commonJS = (cb, mod) => function __require2() {
14
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
15
- };
16
- var __copyProps = (to, from, except, desc) => {
17
- if (from && typeof from === "object" || typeof from === "function") {
18
- for (let key of __getOwnPropNames(from))
19
- if (!__hasOwnProp.call(to, key) && key !== except)
20
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
21
- }
22
- return to;
23
- };
24
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
25
- // If the importer is in node compatibility mode or this is not an ESM
26
- // file that has been converted to a CommonJS file using a Babel-
27
- // compatible transform (i.e. "__esModule" has not been set), then set
28
- // "default" to the CommonJS "module.exports" for node compatibility.
29
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
30
- mod
31
- ));
32
-
33
- export {
34
- __require,
35
- __commonJS,
36
- __toESM
37
- };
38
- //# sourceMappingURL=chunk-7D4SUZUM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/agent/engine/AgentProcessor.ts","../src/agent/engine/MealyMachine.ts","../src/agent/AgentStateMachine.ts","../src/agent/createAgent.ts"],"sourcesContent":["/**\n * AgentProcessor\n *\n * Combined Mealy processor for the full AgentX engine.\n * Composes MessageAssembler, StateMachine, and TurnTracker processors.\n */\n\nimport { combineProcessors, combineInitialStates, type Processor } from \"./mealy\";\n// Note: StreamEventType and MessageEventType are part of AgentOutput (from Presenter)\n// They flow through the system but AgentProcessor doesn't need to import them directly\nimport {\n messageAssemblerProcessor,\n stateEventProcessor,\n turnTrackerProcessor,\n createInitialMessageAssemblerState,\n createInitialStateEventProcessorContext,\n createInitialTurnTrackerState,\n type MessageAssemblerState,\n type StateEventProcessorContext,\n type TurnTrackerState,\n type MessageAssemblerOutput,\n type StateEventProcessorOutput,\n type TurnTrackerOutput,\n} from \"./internal\";\nimport type { AgentOutput } from \"../types\";\n\n/**\n * Combined state type for the full agent engine\n */\nexport type AgentEngineState = {\n messageAssembler: MessageAssemblerState;\n stateEventProcessor: StateEventProcessorContext;\n turnTracker: TurnTrackerState;\n};\n\n/**\n * Input event type for AgentProcessor\n *\n * Accepts:\n * - StreamEventType: Raw stream events from Driver\n * - MessageEventType: Re-injected message events (for TurnTracker)\n *\n * Note: AgentOutput is used because re-injected events can be any output type\n */\nexport type AgentProcessorInput = AgentOutput;\n\n/**\n * Output event type from AgentProcessor\n *\n * Produces:\n * - MessageAssemblerOutput: Assembled message events\n * - StateEventProcessorOutput: State transition events\n * - TurnTrackerOutput: Turn analytics events\n *\n * Note: StreamEventType is NOT in output - it's passed through by AgentEngine\n */\nexport type AgentProcessorOutput =\n | MessageAssemblerOutput\n | StateEventProcessorOutput\n | TurnTrackerOutput;\n\n/**\n * Combined processor for the full agent engine\n *\n * This combines:\n * - MessageAssembler: Stream → Message events\n * - StateEventProcessor: Stream → State events\n * - TurnTracker: Message → Turn events\n *\n * Pattern: (state, input) => [newState, outputs]\n * Key insight: State is means, outputs are the goal (Mealy Machine)\n *\n * Note: Raw StreamEvents are NOT output by this processor.\n * The AgentEngine handles pass-through of original events.\n */\nexport const agentProcessor: Processor<\n AgentEngineState,\n AgentProcessorInput,\n AgentProcessorOutput\n> = combineProcessors<AgentEngineState, AgentProcessorInput, AgentProcessorOutput>({\n messageAssembler: messageAssemblerProcessor as unknown as Processor<\n AgentEngineState[\"messageAssembler\"],\n AgentProcessorInput,\n AgentProcessorOutput\n >,\n stateEventProcessor: stateEventProcessor as unknown as Processor<\n AgentEngineState[\"stateEventProcessor\"],\n AgentProcessorInput,\n AgentProcessorOutput\n >,\n turnTracker: turnTrackerProcessor as unknown as Processor<\n AgentEngineState[\"turnTracker\"],\n AgentProcessorInput,\n AgentProcessorOutput\n >,\n});\n\n/**\n * Initial state factory for the full agent engine\n */\nexport const createInitialAgentEngineState: () => AgentEngineState =\n combineInitialStates<AgentEngineState>({\n messageAssembler: createInitialMessageAssemblerState,\n stateEventProcessor: createInitialStateEventProcessorContext,\n turnTracker: createInitialTurnTrackerState,\n });\n","/**\n * MealyMachine - Pure Mealy Machine Event Processor\n *\n * MealyMachine is a stateless event processor that transforms StreamEvents\n * into higher-level events (state, message, turn events).\n *\n * Key Design:\n * - Engine is a pure Mealy Machine: process(agentId, event) → outputs\n * - Engine does NOT hold driver or presenters (those belong to AgentEngine layer)\n * - Engine manages intermediate processing state per agentId\n * - Multiple agents can share the same MealyMachine instance\n *\n * Type Relationship:\n * ```\n * StreamEvent (from Driver)\n * │\n * └── message_start, text_delta, tool_use_start, message_stop...\n * ↓ MealyMachine processes\n * AgentOutput (to AgentEngine/Presenter)\n * │\n * ├── StateEvent (conversation_start, conversation_end...)\n * ├── MessageEvent (assistant_message, tool_call_message...)\n * └── TurnEvent (turn_request, turn_response)\n * ```\n *\n * State Management:\n * - Processing state (pendingContents, etc.) is managed internally per agentId\n * - Business data persistence is NOT handled here - that's AgentEngine layer's job\n *\n * Usage:\n * ```typescript\n * const machine = new MealyMachine();\n *\n * // AgentEngine layer coordinates:\n * // 1. Driver produces StreamEvents\n * // 2. MealyMachine processes events\n * // 3. Presenters handle outputs\n *\n * for await (const streamEvent of driver.receive(message)) {\n * const outputs = machine.process(agentId, streamEvent);\n * for (const output of outputs) {\n * presenters.forEach(p => p.present(agentId, output));\n * }\n * }\n * ```\n */\n\nimport {\n agentProcessor,\n createInitialAgentEngineState,\n type AgentEngineState,\n} from \"./AgentProcessor\";\nimport { MemoryStore } from \"./mealy\";\nimport type { AgentOutput, StreamEvent } from \"../types\";\nimport { createLogger } from \"commonxjs/logger\";\n\nconst logger = createLogger(\"engine/MealyMachine\");\n\n/**\n * MealyMachine - Pure Mealy Machine for event processing\n *\n * - Input: StreamEvent (from Driver)\n * - Output: AgentOutput[] (state, message, turn events)\n * - State: Managed internally per agentId\n */\nexport class MealyMachine {\n private readonly store: MemoryStore<AgentEngineState>;\n\n constructor() {\n this.store = new MemoryStore<AgentEngineState>();\n logger.debug(\"MealyMachine initialized\");\n }\n\n /**\n * Process a single driveable event and return output events\n *\n * This is the core Mealy Machine operation:\n * process(agentId, event) → outputs[]\n *\n * @param agentId - The agent identifier (for state isolation)\n * @param event - StreamEvent to process\n * @returns Array of output events (state, message, turn events)\n */\n process(agentId: string, event: StreamEvent): AgentOutput[] {\n const eventType = (event as { type?: string }).type || \"unknown\";\n logger.debug(\"Processing event\", { agentId, eventType });\n\n // Get current state or create initial state\n const isNewState = !this.store.has(agentId);\n let state = this.store.get(agentId) ?? createInitialAgentEngineState();\n\n if (isNewState) {\n logger.debug(\"Created initial state for agent\", { agentId });\n }\n\n // Collect all outputs\n const allOutputs: AgentOutput[] = [];\n\n // Pass-through: original stream event is also an output\n allOutputs.push(event);\n\n // Process through Mealy Machine\n const [newState, outputs] = agentProcessor(state, event);\n state = newState;\n\n // Collect processor outputs\n for (const output of outputs) {\n allOutputs.push(output);\n\n // Re-inject for event chaining (e.g., TurnTracker needs MessageEvents)\n const [chainedState, chainedOutputs] = this.processChained(state, output);\n state = chainedState;\n allOutputs.push(...chainedOutputs);\n }\n\n // Store updated state\n this.store.set(agentId, state);\n\n if (outputs.length > 0) {\n logger.debug(\"Produced outputs\", {\n agentId,\n inputEvent: eventType,\n outputCount: allOutputs.length,\n processorOutputs: outputs.length,\n });\n }\n\n return allOutputs;\n }\n\n /**\n * Process chained events recursively\n *\n * Some processors produce events that trigger other processors:\n * - MessageAssembler produces MessageEvents\n * - TurnTracker consumes MessageEvents to produce TurnEvents\n */\n private processChained(\n state: AgentEngineState,\n event: AgentOutput\n ): [AgentEngineState, AgentOutput[]] {\n const [newState, outputs] = agentProcessor(state, event);\n\n if (outputs.length === 0) {\n return [newState, []];\n }\n\n // Process outputs recursively\n const allOutputs: AgentOutput[] = [...outputs];\n let currentState = newState;\n\n for (const output of outputs) {\n const [chainedState, chainedOutputs] = this.processChained(currentState, output);\n currentState = chainedState;\n allOutputs.push(...chainedOutputs);\n }\n\n return [currentState, allOutputs];\n }\n\n /**\n * Clear state for an agent\n *\n * Call this when an agent is destroyed to free memory.\n */\n clearState(agentId: string): void {\n logger.debug(\"Clearing state\", { agentId });\n this.store.delete(agentId);\n }\n\n /**\n * Check if state exists for an agent\n */\n hasState(agentId: string): boolean {\n return this.store.has(agentId);\n }\n}\n\n/**\n * Factory function to create MealyMachine\n */\nexport function createMealyMachine(): MealyMachine {\n return new MealyMachine();\n}\n","/**\n * AgentStateMachine - State management driven by StateEvents\n *\n * Manages agent state transitions driven by StateEvents.\n * Single source of truth for agent state in AgentEngine.\n *\n * Flow:\n * StreamEvent → MealyMachine → StateEvent → AgentStateMachine → state update\n *\n * Responsibilities:\n * - Process StateEvents\n * - Maintain current AgentState\n * - Notify state change subscribers\n */\n\nimport type {\n AgentState,\n StateChange,\n StateChangeHandler,\n AgentOutput,\n Unsubscribe,\n} from \"./types\";\nimport { isStateEvent } from \"./types\";\nimport { createLogger } from \"commonxjs/logger\";\n\nconst logger = createLogger(\"agent/AgentStateMachine\");\n\n/**\n * AgentStateMachine implementation\n */\nexport class AgentStateMachine {\n private _state: AgentState = \"idle\";\n private readonly handlers = new Set<StateChangeHandler>();\n\n /**\n * Current agent state\n */\n get state(): AgentState {\n return this._state;\n }\n\n /**\n * Process an event and update internal state if it's a StateEvent\n *\n * @param event - Event from MealyMachine (could be any AgentOutput)\n */\n process(event: AgentOutput): void {\n // Only process StateEvents\n if (!isStateEvent(event)) {\n return;\n }\n\n const prev = this._state;\n const next = this.mapEventToState(event);\n\n if (next !== null && prev !== next) {\n this._state = next;\n logger.debug(\"State transition\", {\n eventType: event.type,\n from: prev,\n to: next,\n });\n this.notifyHandlers({ prev, current: next });\n }\n }\n\n /**\n * Subscribe to state changes\n *\n * @param handler - Callback receiving { prev, current } state change\n * @returns Unsubscribe function\n */\n onStateChange(handler: StateChangeHandler): Unsubscribe {\n this.handlers.add(handler);\n return () => {\n this.handlers.delete(handler);\n };\n }\n\n /**\n * Reset state machine (used on destroy)\n */\n reset(): void {\n const prev = this._state;\n this._state = \"idle\";\n\n // Notify handlers of reset to idle\n if (prev !== \"idle\") {\n this.notifyHandlers({ prev, current: \"idle\" });\n }\n\n this.handlers.clear();\n }\n\n /**\n * Map StateEvent type to AgentState\n *\n * @param event - StateEvent from MealyMachine\n * @returns New AgentState or null if no transition needed\n */\n private mapEventToState(event: AgentOutput): AgentState | null {\n switch (event.type) {\n // Conversation lifecycle\n case \"conversation_start\":\n return \"thinking\";\n case \"conversation_thinking\":\n return \"thinking\";\n case \"conversation_responding\":\n return \"responding\";\n case \"conversation_end\":\n return \"idle\";\n case \"conversation_interrupted\":\n return \"idle\";\n\n // Tool lifecycle\n case \"tool_planned\":\n return \"planning_tool\";\n case \"tool_executing\":\n return \"awaiting_tool_result\";\n case \"tool_completed\":\n return \"responding\";\n case \"tool_failed\":\n return \"responding\";\n\n // Error\n case \"error_occurred\":\n return \"error\";\n\n default:\n // Unknown event type, no state change\n return null;\n }\n }\n\n /**\n * Notify all registered handlers of state change\n */\n private notifyHandlers(change: StateChange): void {\n for (const handler of this.handlers) {\n try {\n handler(change);\n } catch (error) {\n logger.error(\"State change handler error\", {\n from: change.prev,\n to: change.current,\n error,\n });\n }\n }\n }\n}\n","/**\n * createAgent - Factory function to create an AgentEngine\n *\n * Creates an AgentEngine connected to EventBus:\n * - receive() emits user_message to EventBus\n * - Source subscribes to StreamEvent from EventBus\n * - Presenter emits AgentOutput to EventBus\n *\n * ```\n * EventBus\n * ↗ ↘\n * emit │ │ emit\n * user_message │ │ AgentOutput\n * ↑ │ │ ↑\n * ┌─────────────────────────────────────────────────────────────┐\n * │ AgentEngine │\n * │ │\n * │ receive() ──► Source ──► MealyMachine ──► Presenter │\n * │ (sub) (pub) │\n * └─────────────────────────────────────────────────────────────┘\n * ```\n */\n\nimport type {\n AgentEngine,\n AgentState,\n AgentOutputCallback,\n UserMessage,\n MessageQueue,\n StateChangeHandler,\n EventHandlerMap,\n ReactHandlerMap,\n AgentOutput,\n CreateAgentOptions,\n AgentSource,\n AgentPresenter,\n AgentEventBus,\n StreamEvent,\n Unsubscribe,\n AgentMiddleware,\n AgentInterceptor,\n} from \"./types\";\nimport { MealyMachine } from \"./engine/MealyMachine\";\nimport { AgentStateMachine } from \"./AgentStateMachine\";\nimport { createLogger } from \"commonxjs/logger\";\nimport { isDriveableEvent } from \"../event\";\n\nconst logger = createLogger(\"agent/AgentEngine\");\n\n/**\n * Generate unique agent ID\n */\nfunction generateAgentId(): string {\n return `agent_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * StreamEvent types that Source should subscribe to\n */\nconst STREAM_EVENT_TYPES = [\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\n/**\n * Default Source implementation\n * Subscribes to StreamEvent from EventBus\n */\nclass DefaultSource implements AgentSource {\n readonly name = \"DefaultSource\";\n private unsubscribes: Unsubscribe[] = [];\n\n constructor(\n private readonly bus: AgentEventBus,\n private readonly agentId: string\n ) {}\n\n connect(onEvent: (event: StreamEvent) => void): void {\n // Subscribe to each StreamEvent type\n for (const type of STREAM_EVENT_TYPES) {\n const unsub = this.bus.on(type, (event: unknown) => {\n // Only process DriveableEvents (source: \"driver\", category: \"stream\")\n // This prevents circular processing of AgentOutput events\n if (!isDriveableEvent(event as { source?: string; category?: string })) {\n return;\n }\n\n // Filter by agentId if present in context\n const e = event as { context?: { agentId?: string } };\n if (e.context?.agentId && e.context.agentId !== this.agentId) {\n return;\n }\n onEvent(event as StreamEvent);\n });\n this.unsubscribes.push(unsub);\n }\n\n logger.debug(\"DefaultSource connected\", { agentId: this.agentId });\n }\n\n disconnect(): void {\n for (const unsub of this.unsubscribes) {\n unsub();\n }\n this.unsubscribes = [];\n logger.debug(\"DefaultSource disconnected\", { agentId: this.agentId });\n }\n}\n\n/**\n * Default Presenter implementation\n * Emits AgentOutput to EventBus\n */\nclass DefaultPresenter implements AgentPresenter {\n readonly name = \"DefaultPresenter\";\n\n constructor(private readonly bus: AgentEventBus) {}\n\n present(agentId: string, output: AgentOutput): void {\n // Emit to EventBus with agent context\n this.bus.emit({\n ...output,\n source: \"agent\",\n context: { agentId },\n });\n }\n}\n\n/**\n * Simple MessageQueue implementation\n */\nclass SimpleMessageQueue implements MessageQueue {\n private queue: UserMessage[] = [];\n\n get length(): number {\n return this.queue.length;\n }\n\n get isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n enqueue(message: UserMessage): void {\n this.queue.push(message);\n }\n\n dequeue(): UserMessage | undefined {\n return this.queue.shift();\n }\n\n clear(): void {\n this.queue = [];\n }\n}\n\n/**\n * AgentEngineImpl - EventBus-based AgentEngine implementation\n */\nclass AgentEngineImpl implements AgentEngine {\n readonly agentId: string;\n readonly createdAt: number;\n readonly messageQueue: MessageQueue;\n\n private readonly _messageQueue = new SimpleMessageQueue();\n private readonly bus: AgentEventBus;\n private readonly source: AgentSource;\n private readonly presenter: AgentPresenter;\n private readonly machine: MealyMachine;\n private readonly stateMachine: AgentStateMachine;\n\n private readonly handlers: Set<AgentOutputCallback> = new Set();\n private readonly typeHandlers: Map<string, Set<AgentOutputCallback>> = new Map();\n private readonly readyHandlers: Set<() => void> = new Set();\n private readonly destroyHandlers: Set<() => void> = new Set();\n private readonly middlewares: AgentMiddleware[] = [];\n private readonly interceptors: AgentInterceptor[] = [];\n\n private isDestroyed = false;\n\n constructor(options: CreateAgentOptions) {\n this.agentId = options.agentId ?? generateAgentId();\n this.createdAt = Date.now();\n this.messageQueue = this._messageQueue;\n this.bus = options.bus;\n this.machine = new MealyMachine();\n this.stateMachine = new AgentStateMachine();\n\n // Use provided Source/Presenter or create defaults\n this.source = options.source ?? new DefaultSource(this.bus, this.agentId);\n this.presenter = options.presenter ?? new DefaultPresenter(this.bus);\n\n // Connect Source to receive StreamEvents\n this.source.connect((event) => this.handleStreamEvent(event));\n\n logger.debug(\"AgentEngine created\", { agentId: this.agentId });\n }\n\n get state(): AgentState {\n return this.stateMachine.state;\n }\n\n async receive(message: string | UserMessage): Promise<void> {\n if (this.isDestroyed) {\n throw new Error(\"Cannot receive message on destroyed agent\");\n }\n\n const userMessage: UserMessage =\n typeof message === \"string\"\n ? {\n id: `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,\n role: \"user\",\n subtype: \"user\",\n content: message,\n timestamp: Date.now(),\n }\n : message;\n\n logger.debug(\"Receiving message\", { messageId: userMessage.id });\n\n // Run through middleware chain\n let processedMessage = userMessage;\n for (const middleware of this.middlewares) {\n let nextCalled = false;\n await middleware(processedMessage, async (msg) => {\n nextCalled = true;\n processedMessage = msg;\n });\n if (!nextCalled) {\n logger.debug(\"Middleware blocked message\", { messageId: userMessage.id });\n return;\n }\n }\n\n // Emit user_message to EventBus\n // This triggers Driver to send to LLM\n this.bus.emit({\n type: \"user_message\",\n timestamp: Date.now(),\n source: \"agent\",\n data: processedMessage,\n context: { agentId: this.agentId },\n });\n\n logger.debug(\"user_message emitted to EventBus\", { messageId: userMessage.id });\n }\n\n /**\n * Handle a stream event (called by Source)\n */\n handleStreamEvent(event: StreamEvent): void {\n if (this.isDestroyed) return;\n\n logger.debug(\"handleStreamEvent\", { type: event.type });\n\n // Process through MealyMachine\n const outputs = this.machine.process(this.agentId, event);\n\n logger.debug(\"MealyMachine outputs\", {\n count: outputs.length,\n types: outputs.map((o) => o.type),\n });\n\n // Emit all outputs\n for (const output of outputs) {\n this.stateMachine.process(output);\n this.emitOutput(output);\n }\n }\n\n private emitOutput(output: AgentOutput): void {\n // Run through interceptor chain\n let currentOutput: AgentOutput | null = output;\n\n const runInterceptor = (index: number, out: AgentOutput): void => {\n if (index >= this.interceptors.length) {\n currentOutput = out;\n return;\n }\n this.interceptors[index](out, (nextOut) => {\n runInterceptor(index + 1, nextOut);\n });\n };\n\n runInterceptor(0, output);\n if (!currentOutput) return;\n\n // Send to presenter (emits to EventBus)\n this.presenter.present(this.agentId, currentOutput);\n\n // Notify local handlers\n for (const handler of this.handlers) {\n try {\n handler(currentOutput);\n } catch (e) {\n logger.error(\"Event handler error\", { error: e });\n }\n }\n\n // Notify type-specific handlers\n const typeSet = this.typeHandlers.get(currentOutput.type);\n if (typeSet) {\n for (const handler of typeSet) {\n try {\n handler(currentOutput);\n } catch (e) {\n logger.error(\"Event handler error\", { error: e });\n }\n }\n }\n }\n\n on(handler: AgentOutputCallback): Unsubscribe;\n on(handlers: EventHandlerMap): Unsubscribe;\n on(type: string, handler: AgentOutputCallback): Unsubscribe;\n on(types: string[], handler: AgentOutputCallback): Unsubscribe;\n on(\n typeOrHandler: string | string[] | AgentOutputCallback | EventHandlerMap,\n handler?: AgentOutputCallback\n ): Unsubscribe {\n if (typeof typeOrHandler === \"function\") {\n this.handlers.add(typeOrHandler);\n return () => this.handlers.delete(typeOrHandler);\n }\n\n if (typeof typeOrHandler === \"object\" && !Array.isArray(typeOrHandler)) {\n const unsubscribes: Unsubscribe[] = [];\n for (const [type, h] of Object.entries(typeOrHandler)) {\n if (h) {\n unsubscribes.push(this.on(type, h));\n }\n }\n return () => unsubscribes.forEach((u) => u());\n }\n\n const types = Array.isArray(typeOrHandler) ? typeOrHandler : [typeOrHandler];\n const h = handler!;\n\n for (const type of types) {\n if (!this.typeHandlers.has(type)) {\n this.typeHandlers.set(type, new Set());\n }\n this.typeHandlers.get(type)!.add(h);\n }\n\n return () => {\n for (const type of types) {\n this.typeHandlers.get(type)?.delete(h);\n }\n };\n }\n\n onStateChange(handler: StateChangeHandler): Unsubscribe {\n return this.stateMachine.onStateChange(handler);\n }\n\n react(handlers: ReactHandlerMap): Unsubscribe {\n const eventHandlerMap: EventHandlerMap = {};\n for (const [key, handler] of Object.entries(handlers)) {\n if (handler && key.startsWith(\"on\")) {\n const eventType = key\n .slice(2)\n .replace(/([A-Z])/g, \"_$1\")\n .toLowerCase()\n .slice(1);\n eventHandlerMap[eventType] = handler;\n }\n }\n return this.on(eventHandlerMap);\n }\n\n onReady(handler: () => void): Unsubscribe {\n try {\n handler();\n } catch (e) {\n logger.error(\"onReady handler error\", { error: e });\n }\n this.readyHandlers.add(handler);\n return () => this.readyHandlers.delete(handler);\n }\n\n onDestroy(handler: () => void): Unsubscribe {\n this.destroyHandlers.add(handler);\n return () => this.destroyHandlers.delete(handler);\n }\n\n use(middleware: AgentMiddleware): Unsubscribe {\n this.middlewares.push(middleware);\n return () => {\n const index = this.middlewares.indexOf(middleware);\n if (index >= 0) {\n this.middlewares.splice(index, 1);\n }\n };\n }\n\n intercept(interceptor: AgentInterceptor): Unsubscribe {\n this.interceptors.push(interceptor);\n return () => {\n const index = this.interceptors.indexOf(interceptor);\n if (index >= 0) {\n this.interceptors.splice(index, 1);\n }\n };\n }\n\n interrupt(): void {\n if (this.state === \"idle\" || this.isDestroyed) {\n return;\n }\n\n // Emit interrupt event to EventBus\n this.bus.emit({\n type: \"interrupt_request\",\n timestamp: Date.now(),\n source: \"agent\",\n data: {},\n context: { agentId: this.agentId },\n });\n\n logger.debug(\"Interrupt requested\", { agentId: this.agentId });\n }\n\n async destroy(): Promise<void> {\n if (this.isDestroyed) return;\n this.isDestroyed = true;\n\n // Disconnect Source\n this.source.disconnect();\n\n // Notify destroy handlers\n for (const handler of this.destroyHandlers) {\n try {\n handler();\n } catch (e) {\n logger.error(\"onDestroy handler error\", { error: e });\n }\n }\n\n // Clear state\n this.machine.clearState(this.agentId);\n this.stateMachine.reset();\n\n this._messageQueue.clear();\n this.handlers.clear();\n this.typeHandlers.clear();\n this.readyHandlers.clear();\n this.destroyHandlers.clear();\n this.middlewares.length = 0;\n this.interceptors.length = 0;\n\n logger.debug(\"AgentEngine destroyed\", { agentId: this.agentId });\n }\n}\n\n/**\n * Create an AgentEngine instance connected to EventBus\n */\nexport function createAgent(options: CreateAgentOptions): AgentEngine {\n return new AgentEngineImpl(options);\n}\n"],"mappings":"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","names":["createLogger","logger","createLogger","logger","createLogger","h"]}