@agentxjs/core 1.9.10-dev → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +342 -0
- package/dist/{Processor-DT0N1qI6.d.ts → Processor-CeMyXtsX.d.ts} +1 -1
- package/dist/RpcClient-CMdhJxjS.d.ts +304 -0
- package/dist/agent/engine/internal/index.d.ts +22 -18
- package/dist/agent/engine/internal/index.js +1 -2
- package/dist/agent/engine/mealy/index.d.ts +4 -4
- package/dist/agent/engine/mealy/index.js +1 -2
- package/dist/agent/index.d.ts +92 -92
- package/dist/agent/index.js +16 -16
- package/dist/agent/types/index.d.ts +4 -4
- package/dist/agent/types/index.js +1 -2
- package/dist/bash/index.d.ts +29 -0
- package/dist/bash/index.js +7 -0
- package/dist/{bus-uF1DM2ox.d.ts → bus-C9FLWIu8.d.ts} +3 -1
- package/dist/{chunk-E5FPOAPO.js → chunk-22NTRYNO.js} +60 -60
- package/dist/chunk-22NTRYNO.js.map +1 -0
- package/dist/{chunk-7ZDX3O6I.js → chunk-AAFPAF67.js} +2 -2
- package/dist/{chunk-7ZDX3O6I.js.map → chunk-AAFPAF67.js.map} +1 -1
- package/dist/{chunk-EKHT54KN.js → chunk-APCBNCOW.js} +1 -1
- package/dist/{chunk-EKHT54KN.js.map → chunk-APCBNCOW.js.map} +1 -1
- package/dist/chunk-BHOD5PKR.js +55 -0
- package/dist/chunk-BHOD5PKR.js.map +1 -0
- package/dist/chunk-FI7WQFGV.js +37 -0
- package/dist/chunk-FI7WQFGV.js.map +1 -0
- package/dist/{chunk-AT5P47YA.js → chunk-RWIYC65R.js} +115 -115
- package/dist/chunk-RWIYC65R.js.map +1 -0
- package/dist/chunk-SKS7S2RY.js +1 -0
- package/dist/{chunk-I7GYR3MN.js → chunk-TUFZ2YH6.js} +77 -91
- package/dist/chunk-TUFZ2YH6.js.map +1 -0
- package/dist/{chunk-K6WXQ2RW.js → chunk-YSZG6XIM.js} +1 -2
- package/dist/chunk-YSZG6XIM.js.map +1 -0
- package/dist/{combinators-nEa5dD0T.d.ts → combinators-Dy-7lxKV.d.ts} +50 -50
- package/dist/common/logger/index.js +14 -16
- package/dist/common/logger/index.js.map +1 -1
- package/dist/container/index.d.ts +3 -4
- package/dist/container/index.js +0 -2
- package/dist/container/index.js.map +1 -1
- package/dist/driver/index.d.ts +2 -310
- package/dist/event/index.d.ts +4 -4
- package/dist/event/index.js +2 -3
- package/dist/event/types/index.d.ts +202 -208
- package/dist/event/types/index.js +1 -2
- package/dist/{event-CDuTzs__.d.ts → event-DNsF9EkO.d.ts} +5 -8
- package/dist/image/index.d.ts +9 -5
- package/dist/image/index.js +5 -2
- package/dist/image/index.js.map +1 -1
- package/dist/index--gxNpY5W.d.ts +609 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +17 -17
- package/dist/{message-BMrMm1pq.d.ts → message-Dn-I2vr0.d.ts} +10 -33
- package/dist/mq/index.d.ts +25 -25
- package/dist/mq/index.js +1 -3
- package/dist/mq/index.js.map +1 -1
- package/dist/network/index.d.ts +59 -347
- package/dist/network/index.js +30 -41
- package/dist/network/index.js.map +1 -1
- package/dist/persistence/index.d.ts +2 -155
- package/dist/platform/index.d.ts +76 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/runtime/index.d.ts +26 -59
- package/dist/runtime/index.js +117 -33
- package/dist/runtime/index.js.map +1 -1
- package/dist/session/index.d.ts +4 -52
- package/dist/session/index.js +4 -51
- package/dist/session/index.js.map +1 -1
- package/dist/types-Cb8tKM6Y.d.ts +90 -0
- package/package.json +10 -5
- package/src/agent/AgentStateMachine.ts +2 -2
- package/src/agent/__tests__/AgentStateMachine.test.ts +2 -2
- package/src/agent/__tests__/createAgent.test.ts +4 -4
- package/src/agent/__tests__/engine/internal/messageAssemblerProcessor.test.ts +301 -97
- package/src/agent/__tests__/engine/internal/stateEventProcessor.test.ts +6 -6
- package/src/agent/__tests__/engine/internal/turnTrackerProcessor.test.ts +59 -78
- package/src/agent/__tests__/engine/mealy/Mealy.test.ts +3 -3
- package/src/agent/__tests__/engine/mealy/Store.test.ts +1 -1
- package/src/agent/__tests__/engine/mealy/combinators.test.ts +4 -4
- package/src/agent/createAgent.ts +15 -15
- package/src/agent/engine/AgentProcessor.ts +7 -7
- package/src/agent/engine/MealyMachine.ts +4 -4
- package/src/agent/engine/internal/index.ts +11 -11
- package/src/agent/engine/internal/messageAssemblerProcessor.ts +113 -128
- package/src/agent/engine/internal/stateEventProcessor.ts +13 -15
- package/src/agent/engine/internal/turnTrackerProcessor.ts +27 -31
- package/src/agent/engine/mealy/Mealy.ts +2 -2
- package/src/agent/engine/mealy/combinators.ts +10 -10
- package/src/agent/engine/mealy/index.ts +9 -11
- package/src/agent/index.ts +30 -32
- package/src/agent/types/engine.ts +3 -3
- package/src/agent/types/event.ts +4 -12
- package/src/agent/types/index.ts +86 -88
- package/src/agent/types/message.ts +9 -43
- package/src/bash/index.ts +21 -0
- package/src/bash/tool.ts +57 -0
- package/src/bash/types.ts +108 -0
- package/src/common/logger/ConsoleLogger.ts +1 -1
- package/src/common/logger/LoggerFactoryImpl.ts +14 -14
- package/src/common/logger/index.ts +3 -3
- package/src/container/index.ts +4 -5
- package/src/container/types.ts +1 -1
- package/src/driver/index.ts +15 -16
- package/src/driver/types.ts +201 -73
- package/src/event/EventBus.ts +10 -10
- package/src/event/__tests__/EventBus.test.ts +2 -2
- package/src/event/index.ts +2 -3
- package/src/event/types/agent.ts +186 -191
- package/src/event/types/bus.ts +1 -1
- package/src/event/types/command.ts +293 -264
- package/src/event/types/container.ts +207 -222
- package/src/event/types/driver.ts +153 -155
- package/src/event/types/index.ts +6 -12
- package/src/event/types/session.ts +117 -130
- package/src/image/Image.ts +12 -2
- package/src/image/index.ts +4 -5
- package/src/image/types.ts +8 -2
- package/src/mq/OffsetGenerator.ts +1 -1
- package/src/mq/__tests__/OffsetGenerator.test.ts +1 -1
- package/src/mq/index.ts +4 -5
- package/src/network/RpcClient.ts +26 -25
- package/src/network/index.ts +41 -44
- package/src/network/jsonrpc.ts +5 -5
- package/src/persistence/index.ts +5 -5
- package/src/persistence/types.ts +5 -2
- package/src/platform/index.ts +21 -0
- package/src/platform/types.ts +84 -0
- package/src/runtime/AgentXRuntime.ts +188 -61
- package/src/runtime/__tests__/AgentXRuntime.test.ts +343 -0
- package/src/runtime/index.ts +12 -25
- package/src/runtime/types.ts +10 -62
- package/src/session/index.ts +2 -3
- package/dist/chunk-7D4SUZUM.js +0 -38
- package/dist/chunk-AT5P47YA.js.map +0 -1
- package/dist/chunk-E5FPOAPO.js.map +0 -1
- package/dist/chunk-I7GYR3MN.js.map +0 -1
- package/dist/chunk-K6WXQ2RW.js.map +0 -1
- package/dist/workspace/index.d.ts +0 -111
- package/dist/wrapper-Y3UTVU2E.js +0 -3635
- package/dist/wrapper-Y3UTVU2E.js.map +0 -1
- package/src/workspace/index.ts +0 -27
- package/src/workspace/types.ts +0 -131
- /package/dist/{workspace → bash}/index.js.map +0 -0
- /package/dist/{chunk-7D4SUZUM.js.map → chunk-SKS7S2RY.js.map} +0 -0
- /package/dist/{workspace → platform}/index.js +0 -0
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
* Tests the stateless event transformer: Stream Events -> State Events
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { beforeEach, describe, expect, it } from "bun:test";
|
|
8
8
|
import {
|
|
9
|
-
stateEventProcessor,
|
|
10
9
|
createInitialStateEventProcessorContext,
|
|
11
10
|
type StateEventProcessorContext,
|
|
12
11
|
type StateEventProcessorInput,
|
|
13
12
|
type StateEventProcessorOutput,
|
|
13
|
+
stateEventProcessor,
|
|
14
14
|
} from "../../../engine/internal/stateEventProcessor";
|
|
15
15
|
|
|
16
16
|
// Helper to create test events
|
|
@@ -67,7 +67,7 @@ describe("stateEventProcessor", () => {
|
|
|
67
67
|
it("should emit conversation_end for end_turn stop reason", () => {
|
|
68
68
|
const event = createStreamEvent("message_stop", { stopReason: "end_turn" });
|
|
69
69
|
|
|
70
|
-
const [
|
|
70
|
+
const [_newContext, outputs] = stateEventProcessor(context, event);
|
|
71
71
|
|
|
72
72
|
expect(outputs).toHaveLength(1);
|
|
73
73
|
expect(outputs[0].type).toBe("conversation_end");
|
|
@@ -106,7 +106,7 @@ describe("stateEventProcessor", () => {
|
|
|
106
106
|
it("should emit conversation_responding event", () => {
|
|
107
107
|
const event = createStreamEvent("text_delta", { text: "Hello" });
|
|
108
108
|
|
|
109
|
-
const [
|
|
109
|
+
const [_newContext, outputs] = stateEventProcessor(context, event);
|
|
110
110
|
|
|
111
111
|
expect(outputs).toHaveLength(1);
|
|
112
112
|
expect(outputs[0].type).toBe("conversation_responding");
|
|
@@ -122,7 +122,7 @@ describe("stateEventProcessor", () => {
|
|
|
122
122
|
toolName: "search",
|
|
123
123
|
});
|
|
124
124
|
|
|
125
|
-
const [
|
|
125
|
+
const [_newContext, outputs] = stateEventProcessor(context, event);
|
|
126
126
|
|
|
127
127
|
expect(outputs).toHaveLength(2);
|
|
128
128
|
|
|
@@ -157,7 +157,7 @@ describe("stateEventProcessor", () => {
|
|
|
157
157
|
errorCode: "rate_limit",
|
|
158
158
|
});
|
|
159
159
|
|
|
160
|
-
const [
|
|
160
|
+
const [_newContext, outputs] = stateEventProcessor(context, event);
|
|
161
161
|
|
|
162
162
|
expect(outputs).toHaveLength(1);
|
|
163
163
|
expect(outputs[0].type).toBe("error_occurred");
|
|
@@ -2,15 +2,18 @@
|
|
|
2
2
|
* turnTrackerProcessor.test.ts - Unit tests for turn tracker processor
|
|
3
3
|
*
|
|
4
4
|
* Tests the pure Mealy transition function that tracks request-response turn pairs.
|
|
5
|
+
* Turn events are derived entirely from stream-layer events:
|
|
6
|
+
* - message_start → turn_request
|
|
7
|
+
* - message_stop → turn_response
|
|
5
8
|
*/
|
|
6
9
|
|
|
7
|
-
import {
|
|
10
|
+
import { beforeEach, describe, expect, it } from "bun:test";
|
|
8
11
|
import {
|
|
9
|
-
turnTrackerProcessor,
|
|
10
12
|
createInitialTurnTrackerState,
|
|
11
|
-
type TurnTrackerState,
|
|
12
13
|
type TurnTrackerInput,
|
|
13
14
|
type TurnTrackerOutput,
|
|
15
|
+
type TurnTrackerState,
|
|
16
|
+
turnTrackerProcessor,
|
|
14
17
|
} from "../../../engine/internal/turnTrackerProcessor";
|
|
15
18
|
|
|
16
19
|
// Helper to create test events
|
|
@@ -18,23 +21,12 @@ function createEvent(type: string, data: unknown, timestamp = Date.now()): TurnT
|
|
|
18
21
|
return { type, data, timestamp } as TurnTrackerInput;
|
|
19
22
|
}
|
|
20
23
|
|
|
21
|
-
// Helper to create
|
|
22
|
-
function
|
|
23
|
-
content: string,
|
|
24
|
+
// Helper to create message_start event (begins a turn)
|
|
25
|
+
function createMessageStartEvent(
|
|
24
26
|
messageId: string = `msg_${Date.now()}`,
|
|
25
27
|
timestamp = Date.now()
|
|
26
28
|
): TurnTrackerInput {
|
|
27
|
-
return createEvent(
|
|
28
|
-
"user_message",
|
|
29
|
-
{
|
|
30
|
-
id: messageId,
|
|
31
|
-
role: "user",
|
|
32
|
-
subtype: "user",
|
|
33
|
-
content,
|
|
34
|
-
timestamp,
|
|
35
|
-
},
|
|
36
|
-
timestamp
|
|
37
|
-
);
|
|
29
|
+
return createEvent("message_start", { messageId, model: "test-model" }, timestamp);
|
|
38
30
|
}
|
|
39
31
|
|
|
40
32
|
// Helper to create message_stop event
|
|
@@ -59,16 +51,15 @@ describe("turnTrackerProcessor", () => {
|
|
|
59
51
|
});
|
|
60
52
|
});
|
|
61
53
|
|
|
62
|
-
describe("
|
|
54
|
+
describe("message_start event", () => {
|
|
63
55
|
it("should create pending turn and emit turn_request", () => {
|
|
64
|
-
const event =
|
|
56
|
+
const event = createMessageStartEvent("msg_123", 1000);
|
|
65
57
|
|
|
66
58
|
const [newState, outputs] = turnTrackerProcessor(state, event);
|
|
67
59
|
|
|
68
60
|
// Should have pending turn
|
|
69
61
|
expect(newState.pendingTurn).not.toBeNull();
|
|
70
62
|
expect(newState.pendingTurn?.messageId).toBe("msg_123");
|
|
71
|
-
expect(newState.pendingTurn?.content).toBe("Hello");
|
|
72
63
|
expect(newState.pendingTurn?.requestedAt).toBe(1000);
|
|
73
64
|
expect(newState.pendingTurn?.turnId).toBeDefined();
|
|
74
65
|
|
|
@@ -76,35 +67,39 @@ describe("turnTrackerProcessor", () => {
|
|
|
76
67
|
expect(outputs).toHaveLength(1);
|
|
77
68
|
expect(outputs[0].type).toBe("turn_request");
|
|
78
69
|
expect(outputs[0].data.messageId).toBe("msg_123");
|
|
79
|
-
expect(outputs[0].data.content).toBe("Hello");
|
|
80
70
|
expect(outputs[0].data.timestamp).toBe(1000);
|
|
81
71
|
});
|
|
82
72
|
|
|
83
73
|
it("should generate unique turn IDs", () => {
|
|
84
|
-
const [state1, outputs1] = turnTrackerProcessor(
|
|
85
|
-
state,
|
|
86
|
-
createUserMessageEvent("First", "msg_1")
|
|
87
|
-
);
|
|
74
|
+
const [state1, outputs1] = turnTrackerProcessor(state, createMessageStartEvent("msg_1"));
|
|
88
75
|
|
|
89
76
|
// Complete the turn
|
|
90
77
|
const [state2] = turnTrackerProcessor(state1, createMessageStopEvent("end_turn"));
|
|
91
78
|
|
|
92
79
|
// Start new turn
|
|
93
|
-
const [
|
|
94
|
-
state2,
|
|
95
|
-
createUserMessageEvent("Second", "msg_2")
|
|
96
|
-
);
|
|
80
|
+
const [_state3, outputs3] = turnTrackerProcessor(state2, createMessageStartEvent("msg_2"));
|
|
97
81
|
|
|
98
82
|
expect(outputs1[0].data.turnId).not.toBe(outputs3[0].data.turnId);
|
|
99
83
|
});
|
|
100
84
|
|
|
101
|
-
it("should
|
|
102
|
-
|
|
85
|
+
it("should NOT start a new turn if one is already pending", () => {
|
|
86
|
+
// Start first turn
|
|
87
|
+
const [state1, outputs1] = turnTrackerProcessor(
|
|
88
|
+
state,
|
|
89
|
+
createMessageStartEvent("msg_1", 1000)
|
|
90
|
+
);
|
|
91
|
+
expect(outputs1).toHaveLength(1);
|
|
103
92
|
|
|
104
|
-
|
|
93
|
+
// Second message_start while turn is pending (e.g. after tool_use)
|
|
94
|
+
const [state2, outputs2] = turnTrackerProcessor(
|
|
95
|
+
state1,
|
|
96
|
+
createMessageStartEvent("msg_2", 1500)
|
|
97
|
+
);
|
|
105
98
|
|
|
106
|
-
|
|
107
|
-
expect(
|
|
99
|
+
// Should NOT emit another turn_request
|
|
100
|
+
expect(outputs2).toHaveLength(0);
|
|
101
|
+
// Pending turn should still be the original
|
|
102
|
+
expect(state2.pendingTurn?.messageId).toBe("msg_1");
|
|
108
103
|
});
|
|
109
104
|
});
|
|
110
105
|
|
|
@@ -117,7 +112,7 @@ describe("turnTrackerProcessor", () => {
|
|
|
117
112
|
pendingTurn: {
|
|
118
113
|
turnId: "turn_123",
|
|
119
114
|
messageId: "msg_123",
|
|
120
|
-
content: "
|
|
115
|
+
content: "",
|
|
121
116
|
requestedAt: 1000,
|
|
122
117
|
},
|
|
123
118
|
};
|
|
@@ -196,14 +191,23 @@ describe("turnTrackerProcessor", () => {
|
|
|
196
191
|
});
|
|
197
192
|
});
|
|
198
193
|
|
|
199
|
-
describe("
|
|
200
|
-
it("should
|
|
194
|
+
describe("unhandled events", () => {
|
|
195
|
+
it("should pass through unhandled events", () => {
|
|
196
|
+
const event = createEvent("text_delta", { text: "Hello" });
|
|
197
|
+
|
|
198
|
+
const [newState, outputs] = turnTrackerProcessor(state, event);
|
|
199
|
+
|
|
200
|
+
expect(newState).toEqual(state);
|
|
201
|
+
expect(outputs).toHaveLength(0);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
it("should ignore assistant_message (not a stream event)", () => {
|
|
201
205
|
state = {
|
|
202
206
|
...state,
|
|
203
207
|
pendingTurn: {
|
|
204
208
|
turnId: "turn_123",
|
|
205
209
|
messageId: "msg_123",
|
|
206
|
-
content: "
|
|
210
|
+
content: "",
|
|
207
211
|
requestedAt: 1000,
|
|
208
212
|
},
|
|
209
213
|
};
|
|
@@ -216,39 +220,22 @@ describe("turnTrackerProcessor", () => {
|
|
|
216
220
|
|
|
217
221
|
const [newState, outputs] = turnTrackerProcessor(state, event);
|
|
218
222
|
|
|
219
|
-
// State should be unchanged
|
|
220
223
|
expect(newState.pendingTurn).not.toBeNull();
|
|
221
|
-
|
|
222
|
-
// No output
|
|
223
|
-
expect(outputs).toHaveLength(0);
|
|
224
|
-
});
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
describe("unhandled events", () => {
|
|
228
|
-
it("should pass through unhandled events", () => {
|
|
229
|
-
const event = createEvent("text_delta", { text: "Hello" });
|
|
230
|
-
|
|
231
|
-
const [newState, outputs] = turnTrackerProcessor(state, event);
|
|
232
|
-
|
|
233
|
-
expect(newState).toEqual(state);
|
|
234
224
|
expect(outputs).toHaveLength(0);
|
|
235
225
|
});
|
|
236
226
|
});
|
|
237
227
|
|
|
238
228
|
describe("complete turn flow", () => {
|
|
239
|
-
it("should track complete turn from
|
|
229
|
+
it("should track complete turn from message_start to message_stop", () => {
|
|
240
230
|
const allOutputs: TurnTrackerOutput[] = [];
|
|
241
231
|
let currentState = createInitialTurnTrackerState();
|
|
242
232
|
|
|
243
|
-
//
|
|
244
|
-
const [s1, o1] = turnTrackerProcessor(
|
|
245
|
-
currentState,
|
|
246
|
-
createUserMessageEvent("What is 2+2?", "msg_1", 1000)
|
|
247
|
-
);
|
|
233
|
+
// message_start at time 1000
|
|
234
|
+
const [s1, o1] = turnTrackerProcessor(currentState, createMessageStartEvent("msg_1", 1000));
|
|
248
235
|
currentState = s1;
|
|
249
236
|
allOutputs.push(...o1);
|
|
250
237
|
|
|
251
|
-
//
|
|
238
|
+
// message_stop at time 2500
|
|
252
239
|
const [s2, o2] = turnTrackerProcessor(currentState, createMessageStopEvent("end_turn", 2500));
|
|
253
240
|
currentState = s2;
|
|
254
241
|
allOutputs.push(...o2);
|
|
@@ -257,7 +244,7 @@ describe("turnTrackerProcessor", () => {
|
|
|
257
244
|
|
|
258
245
|
// turn_request
|
|
259
246
|
expect(allOutputs[0].type).toBe("turn_request");
|
|
260
|
-
expect(allOutputs[0].data.
|
|
247
|
+
expect(allOutputs[0].data.messageId).toBe("msg_1");
|
|
261
248
|
|
|
262
249
|
// turn_response
|
|
263
250
|
expect(allOutputs[1].type).toBe("turn_response");
|
|
@@ -271,11 +258,8 @@ describe("turnTrackerProcessor", () => {
|
|
|
271
258
|
const allOutputs: TurnTrackerOutput[] = [];
|
|
272
259
|
let currentState = createInitialTurnTrackerState();
|
|
273
260
|
|
|
274
|
-
//
|
|
275
|
-
const [s1, o1] = turnTrackerProcessor(
|
|
276
|
-
currentState,
|
|
277
|
-
createUserMessageEvent("Search for X", "msg_1", 1000)
|
|
278
|
-
);
|
|
261
|
+
// message_start begins the turn
|
|
262
|
+
const [s1, o1] = turnTrackerProcessor(currentState, createMessageStartEvent("msg_1", 1000));
|
|
279
263
|
currentState = s1;
|
|
280
264
|
allOutputs.push(...o1);
|
|
281
265
|
|
|
@@ -287,7 +271,13 @@ describe("turnTrackerProcessor", () => {
|
|
|
287
271
|
expect(currentState.pendingTurn).not.toBeNull();
|
|
288
272
|
expect(allOutputs).toHaveLength(1); // Only turn_request
|
|
289
273
|
|
|
290
|
-
// Second
|
|
274
|
+
// Second message_start after tool_use — should NOT start new turn (pending exists)
|
|
275
|
+
const [s2b, o2b] = turnTrackerProcessor(currentState, createMessageStartEvent("msg_2", 2000));
|
|
276
|
+
currentState = s2b;
|
|
277
|
+
allOutputs.push(...o2b);
|
|
278
|
+
expect(allOutputs).toHaveLength(1); // Still only turn_request
|
|
279
|
+
|
|
280
|
+
// Final message_stop with end_turn - turn completes
|
|
291
281
|
const [s3, o3] = turnTrackerProcessor(currentState, createMessageStopEvent("end_turn", 3000));
|
|
292
282
|
currentState = s3;
|
|
293
283
|
allOutputs.push(...o3);
|
|
@@ -303,10 +293,7 @@ describe("turnTrackerProcessor", () => {
|
|
|
303
293
|
const allTurnIds: string[] = [];
|
|
304
294
|
|
|
305
295
|
// First turn
|
|
306
|
-
const [s1, o1] = turnTrackerProcessor(
|
|
307
|
-
currentState,
|
|
308
|
-
createUserMessageEvent("First", "msg_1", 1000)
|
|
309
|
-
);
|
|
296
|
+
const [s1, o1] = turnTrackerProcessor(currentState, createMessageStartEvent("msg_1", 1000));
|
|
310
297
|
currentState = s1;
|
|
311
298
|
allTurnIds.push(o1[0].data.turnId);
|
|
312
299
|
|
|
@@ -314,10 +301,7 @@ describe("turnTrackerProcessor", () => {
|
|
|
314
301
|
currentState = s2;
|
|
315
302
|
|
|
316
303
|
// Second turn
|
|
317
|
-
const [s3, o3] = turnTrackerProcessor(
|
|
318
|
-
currentState,
|
|
319
|
-
createUserMessageEvent("Second", "msg_2", 2000)
|
|
320
|
-
);
|
|
304
|
+
const [s3, o3] = turnTrackerProcessor(currentState, createMessageStartEvent("msg_2", 2000));
|
|
321
305
|
currentState = s3;
|
|
322
306
|
allTurnIds.push(o3[0].data.turnId);
|
|
323
307
|
|
|
@@ -325,10 +309,7 @@ describe("turnTrackerProcessor", () => {
|
|
|
325
309
|
currentState = s4;
|
|
326
310
|
|
|
327
311
|
// Third turn
|
|
328
|
-
const [s5, o5] = turnTrackerProcessor(
|
|
329
|
-
currentState,
|
|
330
|
-
createUserMessageEvent("Third", "msg_3", 3000)
|
|
331
|
-
);
|
|
312
|
+
const [s5, o5] = turnTrackerProcessor(currentState, createMessageStartEvent("msg_3", 3000));
|
|
332
313
|
currentState = s5;
|
|
333
314
|
allTurnIds.push(o5[0].data.turnId);
|
|
334
315
|
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
* Mealy.test.ts - Unit tests for Mealy Machine runtime
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { MemoryStore } from "../../../engine/mealy/Store";
|
|
5
|
+
import { beforeEach, describe, expect, it } from "bun:test";
|
|
6
|
+
import { createMealy, Mealy, type MealyConfig } from "../../../engine/mealy/Mealy";
|
|
8
7
|
import type { Processor } from "../../../engine/mealy/Processor";
|
|
9
8
|
import type { Sink, SinkDefinition } from "../../../engine/mealy/Sink";
|
|
9
|
+
import { MemoryStore } from "../../../engine/mealy/Store";
|
|
10
10
|
|
|
11
11
|
// Test types
|
|
12
12
|
interface TestState {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Store.test.ts - Unit tests for MemoryStore
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { beforeEach, describe, expect, it } from "bun:test";
|
|
6
6
|
import { MemoryStore, type Store } from "../../../engine/mealy/Store";
|
|
7
7
|
|
|
8
8
|
describe("MemoryStore", () => {
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
* combinators.test.ts - Unit tests for Mealy processor combinators
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { describe,
|
|
5
|
+
import { describe, expect, it } from "bun:test";
|
|
6
6
|
import {
|
|
7
|
-
combineProcessors,
|
|
8
|
-
combineInitialStates,
|
|
9
7
|
chainProcessors,
|
|
8
|
+
combineInitialStates,
|
|
9
|
+
combineProcessors,
|
|
10
10
|
filterProcessor,
|
|
11
|
+
identityProcessor,
|
|
11
12
|
mapOutput,
|
|
12
13
|
withLogging,
|
|
13
|
-
identityProcessor,
|
|
14
14
|
} from "../../../engine/mealy/combinators";
|
|
15
15
|
import type { Processor } from "../../../engine/mealy/Processor";
|
|
16
16
|
|
package/src/agent/createAgent.ts
CHANGED
|
@@ -21,29 +21,29 @@
|
|
|
21
21
|
* ```
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
+
import { createLogger } from "commonxjs/logger";
|
|
25
|
+
import { isDriveableEvent } from "../event";
|
|
26
|
+
import { AgentStateMachine } from "./AgentStateMachine";
|
|
27
|
+
import { MealyMachine } from "./engine/MealyMachine";
|
|
24
28
|
import type {
|
|
25
29
|
AgentEngine,
|
|
26
|
-
|
|
30
|
+
AgentEventBus,
|
|
31
|
+
AgentInterceptor,
|
|
32
|
+
AgentMiddleware,
|
|
33
|
+
AgentOutput,
|
|
27
34
|
AgentOutputCallback,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
35
|
+
AgentPresenter,
|
|
36
|
+
AgentSource,
|
|
37
|
+
AgentState,
|
|
38
|
+
CreateAgentOptions,
|
|
31
39
|
EventHandlerMap,
|
|
40
|
+
MessageQueue,
|
|
32
41
|
ReactHandlerMap,
|
|
33
|
-
|
|
34
|
-
CreateAgentOptions,
|
|
35
|
-
AgentSource,
|
|
36
|
-
AgentPresenter,
|
|
37
|
-
AgentEventBus,
|
|
42
|
+
StateChangeHandler,
|
|
38
43
|
StreamEvent,
|
|
39
44
|
Unsubscribe,
|
|
40
|
-
|
|
41
|
-
AgentInterceptor,
|
|
45
|
+
UserMessage,
|
|
42
46
|
} from "./types";
|
|
43
|
-
import { MealyMachine } from "./engine/MealyMachine";
|
|
44
|
-
import { AgentStateMachine } from "./AgentStateMachine";
|
|
45
|
-
import { createLogger } from "commonxjs/logger";
|
|
46
|
-
import { isDriveableEvent } from "../event";
|
|
47
47
|
|
|
48
48
|
const logger = createLogger("agent/AgentEngine");
|
|
49
49
|
|
|
@@ -5,24 +5,24 @@
|
|
|
5
5
|
* Composes MessageAssembler, StateMachine, and TurnTracker processors.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import type { AgentOutput } from "../types";
|
|
9
9
|
// Note: StreamEventType and MessageEventType are part of AgentOutput (from Presenter)
|
|
10
10
|
// They flow through the system but AgentProcessor doesn't need to import them directly
|
|
11
11
|
import {
|
|
12
|
-
messageAssemblerProcessor,
|
|
13
|
-
stateEventProcessor,
|
|
14
|
-
turnTrackerProcessor,
|
|
15
12
|
createInitialMessageAssemblerState,
|
|
16
13
|
createInitialStateEventProcessorContext,
|
|
17
14
|
createInitialTurnTrackerState,
|
|
15
|
+
type MessageAssemblerOutput,
|
|
18
16
|
type MessageAssemblerState,
|
|
17
|
+
messageAssemblerProcessor,
|
|
19
18
|
type StateEventProcessorContext,
|
|
20
|
-
type TurnTrackerState,
|
|
21
|
-
type MessageAssemblerOutput,
|
|
22
19
|
type StateEventProcessorOutput,
|
|
20
|
+
stateEventProcessor,
|
|
23
21
|
type TurnTrackerOutput,
|
|
22
|
+
type TurnTrackerState,
|
|
23
|
+
turnTrackerProcessor,
|
|
24
24
|
} from "./internal";
|
|
25
|
-
import type
|
|
25
|
+
import { combineInitialStates, combineProcessors, type Processor } from "./mealy";
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
28
|
* Combined state type for the full agent engine
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* AgentOutput (to AgentEngine/Presenter)
|
|
20
20
|
* │
|
|
21
21
|
* ├── StateEvent (conversation_start, conversation_end...)
|
|
22
|
-
* ├── MessageEvent (assistant_message,
|
|
22
|
+
* ├── MessageEvent (assistant_message, tool_result_message...)
|
|
23
23
|
* └── TurnEvent (turn_request, turn_response)
|
|
24
24
|
* ```
|
|
25
25
|
*
|
|
@@ -45,14 +45,14 @@
|
|
|
45
45
|
* ```
|
|
46
46
|
*/
|
|
47
47
|
|
|
48
|
+
import { createLogger } from "commonxjs/logger";
|
|
49
|
+
import type { AgentOutput, StreamEvent } from "../types";
|
|
48
50
|
import {
|
|
51
|
+
type AgentEngineState,
|
|
49
52
|
agentProcessor,
|
|
50
53
|
createInitialAgentEngineState,
|
|
51
|
-
type AgentEngineState,
|
|
52
54
|
} from "./AgentProcessor";
|
|
53
55
|
import { MemoryStore } from "./mealy";
|
|
54
|
-
import type { AgentOutput, StreamEvent } from "../types";
|
|
55
|
-
import { createLogger } from "commonxjs/logger";
|
|
56
56
|
|
|
57
57
|
const logger = createLogger("engine/MealyMachine");
|
|
58
58
|
|
|
@@ -6,30 +6,30 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
export {
|
|
9
|
-
|
|
10
|
-
messageAssemblerProcessorDef,
|
|
9
|
+
createInitialMessageAssemblerState,
|
|
11
10
|
type MessageAssemblerInput,
|
|
12
11
|
type MessageAssemblerOutput,
|
|
13
12
|
type MessageAssemblerState,
|
|
13
|
+
messageAssemblerProcessor,
|
|
14
|
+
messageAssemblerProcessorDef,
|
|
14
15
|
type PendingContent,
|
|
15
|
-
createInitialMessageAssemblerState,
|
|
16
16
|
} from "./messageAssemblerProcessor";
|
|
17
17
|
|
|
18
18
|
export {
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
createInitialStateEventProcessorContext,
|
|
20
|
+
type StateEventProcessorContext,
|
|
21
21
|
type StateEventProcessorInput,
|
|
22
22
|
type StateEventProcessorOutput,
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
stateEventProcessor,
|
|
24
|
+
stateEventProcessorDef,
|
|
25
25
|
} from "./stateEventProcessor";
|
|
26
26
|
|
|
27
27
|
export {
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
createInitialTurnTrackerState,
|
|
29
|
+
type PendingTurn,
|
|
30
30
|
type TurnTrackerInput,
|
|
31
31
|
type TurnTrackerOutput,
|
|
32
32
|
type TurnTrackerState,
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
turnTrackerProcessor,
|
|
34
|
+
turnTrackerProcessorDef,
|
|
35
35
|
} from "./turnTrackerProcessor";
|