@agentxjs/core 1.9.5-dev → 1.9.7-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.
- package/dist/Processor-DT0N1qI6.d.ts +64 -0
- package/dist/agent/engine/internal/index.d.ts +223 -0
- package/dist/agent/engine/internal/index.js +24 -0
- package/dist/agent/engine/internal/index.js.map +1 -0
- package/dist/agent/engine/mealy/index.d.ts +157 -0
- package/dist/agent/engine/mealy/index.js +26 -0
- package/dist/agent/engine/mealy/index.js.map +1 -0
- package/dist/agent/index.d.ts +244 -0
- package/dist/agent/index.js +66 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/types/index.d.ts +322 -0
- package/dist/agent/types/index.js +12 -0
- package/dist/agent/types/index.js.map +1 -0
- package/dist/base-m40r3Qgu.d.ts +157 -0
- package/dist/bus-uF1DM2ox.d.ts +906 -0
- package/dist/chunk-7D4SUZUM.js +38 -0
- package/dist/chunk-7D4SUZUM.js.map +1 -0
- package/dist/chunk-7ZDX3O6I.js +173 -0
- package/dist/chunk-7ZDX3O6I.js.map +1 -0
- package/dist/chunk-E5FPOAPO.js +123 -0
- package/dist/chunk-E5FPOAPO.js.map +1 -0
- package/dist/chunk-EKHT54KN.js +272 -0
- package/dist/chunk-EKHT54KN.js.map +1 -0
- package/dist/chunk-I7GYR3MN.js +502 -0
- package/dist/chunk-I7GYR3MN.js.map +1 -0
- package/dist/chunk-K6WXQ2RW.js +38 -0
- package/dist/chunk-K6WXQ2RW.js.map +1 -0
- package/dist/chunk-RL3JRNXM.js +3 -0
- package/dist/chunk-RL3JRNXM.js.map +1 -0
- package/dist/chunk-TBU7FFZT.js +543 -0
- package/dist/chunk-TBU7FFZT.js.map +1 -0
- package/dist/combinators-nEa5dD0T.d.ts +271 -0
- package/dist/common/index.d.ts +1 -0
- package/dist/common/index.js +2 -0
- package/dist/common/index.js.map +1 -0
- package/dist/common/logger/index.d.ts +163 -0
- package/dist/common/logger/index.js +184 -0
- package/dist/common/logger/index.js.map +1 -0
- package/dist/container/index.d.ts +110 -0
- package/dist/container/index.js +127 -0
- package/dist/container/index.js.map +1 -0
- package/dist/driver/index.d.ts +266 -0
- package/dist/driver/index.js +1 -0
- package/dist/driver/index.js.map +1 -0
- package/dist/event/index.d.ts +55 -0
- package/dist/event/index.js +60 -0
- package/dist/event/index.js.map +1 -0
- package/dist/event/types/index.d.ts +1149 -0
- package/dist/event/types/index.js +56 -0
- package/dist/event/types/index.js.map +1 -0
- package/dist/event-CDuTzs__.d.ts +296 -0
- package/dist/image/index.d.ts +112 -0
- package/dist/image/index.js +151 -0
- package/dist/image/index.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +67 -0
- package/dist/index.js.map +1 -0
- package/dist/message-BMrMm1pq.d.ts +305 -0
- package/dist/mq/index.d.ts +165 -0
- package/dist/mq/index.js +37 -0
- package/dist/mq/index.js.map +1 -0
- package/dist/network/index.d.ts +567 -0
- package/dist/network/index.js +435 -0
- package/dist/network/index.js.map +1 -0
- package/dist/persistence/index.d.ts +155 -0
- package/dist/persistence/index.js +1 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/runtime/index.d.ts +240 -0
- package/dist/runtime/index.js +347 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/session/index.d.ts +92 -0
- package/dist/session/index.js +56 -0
- package/dist/session/index.js.map +1 -0
- package/dist/workspace/index.d.ts +111 -0
- package/dist/workspace/index.js +1 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/wrapper-Y3UTVU2E.js +3635 -0
- package/dist/wrapper-Y3UTVU2E.js.map +1 -0
- package/package.json +73 -14
- package/tsconfig.json +0 -10
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
// src/agent/engine/internal/messageAssemblerProcessor.ts
|
|
2
|
+
function createInitialMessageAssemblerState() {
|
|
3
|
+
return {
|
|
4
|
+
currentMessageId: null,
|
|
5
|
+
messageStartTime: null,
|
|
6
|
+
pendingContents: {},
|
|
7
|
+
pendingToolCalls: {}
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function generateId() {
|
|
11
|
+
return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
|
|
12
|
+
}
|
|
13
|
+
var messageAssemblerProcessor = (state, input) => {
|
|
14
|
+
switch (input.type) {
|
|
15
|
+
case "message_start":
|
|
16
|
+
return handleMessageStart(state, input);
|
|
17
|
+
case "text_delta":
|
|
18
|
+
return handleTextDelta(state, input);
|
|
19
|
+
case "tool_use_start":
|
|
20
|
+
return handleToolUseStart(state, input);
|
|
21
|
+
case "input_json_delta":
|
|
22
|
+
return handleInputJsonDelta(state, input);
|
|
23
|
+
case "tool_use_stop":
|
|
24
|
+
return handleToolUseStop(state, input);
|
|
25
|
+
case "tool_result":
|
|
26
|
+
return handleToolResult(state, input);
|
|
27
|
+
case "message_stop":
|
|
28
|
+
return handleMessageStop(state, input);
|
|
29
|
+
case "error_received":
|
|
30
|
+
return handleErrorReceived(state, input);
|
|
31
|
+
default:
|
|
32
|
+
return [state, []];
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
function handleMessageStart(state, event) {
|
|
36
|
+
const { data } = event;
|
|
37
|
+
return [
|
|
38
|
+
{
|
|
39
|
+
...state,
|
|
40
|
+
currentMessageId: data.messageId,
|
|
41
|
+
messageStartTime: event.timestamp,
|
|
42
|
+
pendingContents: {}
|
|
43
|
+
},
|
|
44
|
+
[]
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
function handleTextDelta(state, event) {
|
|
48
|
+
const { data } = event;
|
|
49
|
+
const index = 0;
|
|
50
|
+
const existingContent = state.pendingContents[index];
|
|
51
|
+
const pendingContent = existingContent?.type === "text" ? {
|
|
52
|
+
...existingContent,
|
|
53
|
+
textDeltas: [...existingContent.textDeltas || [], data.text]
|
|
54
|
+
} : {
|
|
55
|
+
type: "text",
|
|
56
|
+
index,
|
|
57
|
+
textDeltas: [data.text]
|
|
58
|
+
};
|
|
59
|
+
return [
|
|
60
|
+
{
|
|
61
|
+
...state,
|
|
62
|
+
pendingContents: {
|
|
63
|
+
...state.pendingContents,
|
|
64
|
+
[index]: pendingContent
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
[]
|
|
68
|
+
];
|
|
69
|
+
}
|
|
70
|
+
function handleToolUseStart(state, event) {
|
|
71
|
+
const { data } = event;
|
|
72
|
+
const index = 1;
|
|
73
|
+
const pendingContent = {
|
|
74
|
+
type: "tool_use",
|
|
75
|
+
index,
|
|
76
|
+
toolId: data.toolCallId,
|
|
77
|
+
toolName: data.toolName,
|
|
78
|
+
toolInputJson: ""
|
|
79
|
+
};
|
|
80
|
+
return [
|
|
81
|
+
{
|
|
82
|
+
...state,
|
|
83
|
+
pendingContents: {
|
|
84
|
+
...state.pendingContents,
|
|
85
|
+
[index]: pendingContent
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
[]
|
|
89
|
+
];
|
|
90
|
+
}
|
|
91
|
+
function handleInputJsonDelta(state, event) {
|
|
92
|
+
const { data } = event;
|
|
93
|
+
const index = 1;
|
|
94
|
+
const existingContent = state.pendingContents[index];
|
|
95
|
+
if (!existingContent || existingContent.type !== "tool_use") {
|
|
96
|
+
return [state, []];
|
|
97
|
+
}
|
|
98
|
+
const pendingContent = {
|
|
99
|
+
...existingContent,
|
|
100
|
+
toolInputJson: (existingContent.toolInputJson || "") + data.partialJson
|
|
101
|
+
};
|
|
102
|
+
return [
|
|
103
|
+
{
|
|
104
|
+
...state,
|
|
105
|
+
pendingContents: {
|
|
106
|
+
...state.pendingContents,
|
|
107
|
+
[index]: pendingContent
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
[]
|
|
111
|
+
];
|
|
112
|
+
}
|
|
113
|
+
function handleToolUseStop(state, _event) {
|
|
114
|
+
const index = 1;
|
|
115
|
+
const pendingContent = state.pendingContents[index];
|
|
116
|
+
if (!pendingContent || pendingContent.type !== "tool_use") {
|
|
117
|
+
return [state, []];
|
|
118
|
+
}
|
|
119
|
+
const toolId = pendingContent.toolId || "";
|
|
120
|
+
const toolName = pendingContent.toolName || "";
|
|
121
|
+
let toolInput = {};
|
|
122
|
+
try {
|
|
123
|
+
toolInput = pendingContent.toolInputJson ? JSON.parse(pendingContent.toolInputJson) : {};
|
|
124
|
+
} catch {
|
|
125
|
+
toolInput = {};
|
|
126
|
+
}
|
|
127
|
+
const toolCall = {
|
|
128
|
+
type: "tool-call",
|
|
129
|
+
id: toolId,
|
|
130
|
+
name: toolName,
|
|
131
|
+
input: toolInput
|
|
132
|
+
};
|
|
133
|
+
const messageId = generateId();
|
|
134
|
+
const timestamp = Date.now();
|
|
135
|
+
const toolCallMessage = {
|
|
136
|
+
id: messageId,
|
|
137
|
+
role: "assistant",
|
|
138
|
+
subtype: "tool-call",
|
|
139
|
+
toolCall,
|
|
140
|
+
timestamp,
|
|
141
|
+
parentId: state.currentMessageId || void 0
|
|
142
|
+
};
|
|
143
|
+
const toolCallMessageEvent = {
|
|
144
|
+
type: "tool_call_message",
|
|
145
|
+
timestamp,
|
|
146
|
+
data: toolCallMessage
|
|
147
|
+
};
|
|
148
|
+
const { [index]: _, ...remainingContents } = state.pendingContents;
|
|
149
|
+
return [
|
|
150
|
+
{
|
|
151
|
+
...state,
|
|
152
|
+
pendingContents: remainingContents,
|
|
153
|
+
pendingToolCalls: {
|
|
154
|
+
...state.pendingToolCalls,
|
|
155
|
+
[toolId]: { id: toolId, name: toolName }
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
[toolCallMessageEvent]
|
|
159
|
+
];
|
|
160
|
+
}
|
|
161
|
+
function handleToolResult(state, event) {
|
|
162
|
+
const { data } = event;
|
|
163
|
+
const { toolCallId, result, isError } = data;
|
|
164
|
+
const pendingToolCall = state.pendingToolCalls[toolCallId];
|
|
165
|
+
const toolName = pendingToolCall?.name || "unknown";
|
|
166
|
+
const toolResult = {
|
|
167
|
+
type: "tool-result",
|
|
168
|
+
id: toolCallId,
|
|
169
|
+
name: toolName,
|
|
170
|
+
output: {
|
|
171
|
+
type: isError ? "error-text" : "text",
|
|
172
|
+
value: typeof result === "string" ? result : JSON.stringify(result)
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
const messageId = generateId();
|
|
176
|
+
const timestamp = Date.now();
|
|
177
|
+
const toolResultMessage = {
|
|
178
|
+
id: messageId,
|
|
179
|
+
role: "tool",
|
|
180
|
+
subtype: "tool-result",
|
|
181
|
+
toolCallId,
|
|
182
|
+
toolResult,
|
|
183
|
+
timestamp
|
|
184
|
+
};
|
|
185
|
+
const toolResultMessageEvent = {
|
|
186
|
+
type: "tool_result_message",
|
|
187
|
+
timestamp,
|
|
188
|
+
data: toolResultMessage
|
|
189
|
+
};
|
|
190
|
+
const { [toolCallId]: _, ...remainingToolCalls } = state.pendingToolCalls;
|
|
191
|
+
return [
|
|
192
|
+
{
|
|
193
|
+
...state,
|
|
194
|
+
pendingToolCalls: remainingToolCalls
|
|
195
|
+
},
|
|
196
|
+
[toolResultMessageEvent]
|
|
197
|
+
];
|
|
198
|
+
}
|
|
199
|
+
function handleMessageStop(state, event) {
|
|
200
|
+
const { data } = event;
|
|
201
|
+
if (!state.currentMessageId) {
|
|
202
|
+
return [state, []];
|
|
203
|
+
}
|
|
204
|
+
const textParts = [];
|
|
205
|
+
const sortedContents = Object.values(state.pendingContents).sort((a, b) => a.index - b.index);
|
|
206
|
+
for (const pending of sortedContents) {
|
|
207
|
+
if (pending.type === "text" && pending.textDeltas) {
|
|
208
|
+
textParts.push(pending.textDeltas.join(""));
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const textContent = textParts.join("");
|
|
212
|
+
const stopReason = data.stopReason;
|
|
213
|
+
if (!textContent || textContent.trim().length === 0) {
|
|
214
|
+
const shouldPreserveToolCalls2 = stopReason === "tool_use";
|
|
215
|
+
return [
|
|
216
|
+
{
|
|
217
|
+
...createInitialMessageAssemblerState(),
|
|
218
|
+
pendingToolCalls: shouldPreserveToolCalls2 ? state.pendingToolCalls : {}
|
|
219
|
+
},
|
|
220
|
+
[]
|
|
221
|
+
];
|
|
222
|
+
}
|
|
223
|
+
const contentParts = [
|
|
224
|
+
{
|
|
225
|
+
type: "text",
|
|
226
|
+
text: textContent
|
|
227
|
+
}
|
|
228
|
+
];
|
|
229
|
+
const timestamp = state.messageStartTime || Date.now();
|
|
230
|
+
const assistantMessage = {
|
|
231
|
+
id: state.currentMessageId,
|
|
232
|
+
role: "assistant",
|
|
233
|
+
subtype: "assistant",
|
|
234
|
+
content: contentParts,
|
|
235
|
+
timestamp
|
|
236
|
+
};
|
|
237
|
+
const assistantEvent = {
|
|
238
|
+
type: "assistant_message",
|
|
239
|
+
timestamp,
|
|
240
|
+
data: assistantMessage
|
|
241
|
+
};
|
|
242
|
+
const shouldPreserveToolCalls = stopReason === "tool_use";
|
|
243
|
+
return [
|
|
244
|
+
{
|
|
245
|
+
...createInitialMessageAssemblerState(),
|
|
246
|
+
pendingToolCalls: shouldPreserveToolCalls ? state.pendingToolCalls : {}
|
|
247
|
+
},
|
|
248
|
+
[assistantEvent]
|
|
249
|
+
];
|
|
250
|
+
}
|
|
251
|
+
function handleErrorReceived(_state, event) {
|
|
252
|
+
const data = event.data;
|
|
253
|
+
const messageId = generateId();
|
|
254
|
+
const timestamp = Date.now();
|
|
255
|
+
const errorMessage = {
|
|
256
|
+
id: messageId,
|
|
257
|
+
role: "error",
|
|
258
|
+
subtype: "error",
|
|
259
|
+
content: data.message,
|
|
260
|
+
errorCode: data.errorCode,
|
|
261
|
+
timestamp
|
|
262
|
+
};
|
|
263
|
+
const errorMessageEvent = {
|
|
264
|
+
type: "error_message",
|
|
265
|
+
timestamp,
|
|
266
|
+
data: errorMessage
|
|
267
|
+
};
|
|
268
|
+
return [createInitialMessageAssemblerState(), [errorMessageEvent]];
|
|
269
|
+
}
|
|
270
|
+
var messageAssemblerProcessorDef = {
|
|
271
|
+
name: "MessageAssembler",
|
|
272
|
+
description: "Assembles complete messages from stream events",
|
|
273
|
+
initialState: createInitialMessageAssemblerState,
|
|
274
|
+
processor: messageAssemblerProcessor
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
// src/agent/engine/internal/stateEventProcessor.ts
|
|
278
|
+
import { createLogger } from "commonxjs/logger";
|
|
279
|
+
var logger = createLogger("engine/stateEventProcessor");
|
|
280
|
+
function createInitialStateEventProcessorContext() {
|
|
281
|
+
return {};
|
|
282
|
+
}
|
|
283
|
+
var stateEventProcessor = (context, input) => {
|
|
284
|
+
logger.debug(`[Stream Event] ${input.type}`, {
|
|
285
|
+
context,
|
|
286
|
+
eventData: "data" in input ? input.data : void 0
|
|
287
|
+
});
|
|
288
|
+
switch (input.type) {
|
|
289
|
+
case "message_start":
|
|
290
|
+
return handleMessageStart2(context, input);
|
|
291
|
+
case "message_delta":
|
|
292
|
+
return handleMessageDelta(context);
|
|
293
|
+
case "message_stop":
|
|
294
|
+
return handleMessageStop2(context, input);
|
|
295
|
+
case "text_delta":
|
|
296
|
+
return handleTextDelta2(context);
|
|
297
|
+
case "tool_use_start":
|
|
298
|
+
return handleToolUseStart2(context, input);
|
|
299
|
+
case "tool_use_stop":
|
|
300
|
+
return handleToolUseStop2(context);
|
|
301
|
+
case "error_received":
|
|
302
|
+
return handleErrorReceived2(context, input);
|
|
303
|
+
default:
|
|
304
|
+
logger.debug(`[Stream Event] ${input.type} (unhandled)`);
|
|
305
|
+
return [context, []];
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
function handleMessageStart2(context, event) {
|
|
309
|
+
const { data } = event;
|
|
310
|
+
const conversationStartEvent = {
|
|
311
|
+
type: "conversation_start",
|
|
312
|
+
timestamp: Date.now(),
|
|
313
|
+
data: {
|
|
314
|
+
messageId: data.messageId
|
|
315
|
+
}
|
|
316
|
+
};
|
|
317
|
+
return [context, [conversationStartEvent]];
|
|
318
|
+
}
|
|
319
|
+
function handleMessageDelta(context) {
|
|
320
|
+
return [context, []];
|
|
321
|
+
}
|
|
322
|
+
function handleMessageStop2(context, event) {
|
|
323
|
+
const { data } = event;
|
|
324
|
+
const stopReason = data.stopReason;
|
|
325
|
+
logger.debug("message_stop received", { stopReason });
|
|
326
|
+
if (stopReason === "tool_use") {
|
|
327
|
+
logger.debug("Skipping conversation_end (tool_use in progress)");
|
|
328
|
+
return [context, []];
|
|
329
|
+
}
|
|
330
|
+
const conversationEndEvent = {
|
|
331
|
+
type: "conversation_end",
|
|
332
|
+
timestamp: Date.now(),
|
|
333
|
+
data: {
|
|
334
|
+
reason: "completed"
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
return [context, [conversationEndEvent]];
|
|
338
|
+
}
|
|
339
|
+
function handleTextDelta2(context) {
|
|
340
|
+
const respondingEvent = {
|
|
341
|
+
type: "conversation_responding",
|
|
342
|
+
timestamp: Date.now(),
|
|
343
|
+
data: {}
|
|
344
|
+
};
|
|
345
|
+
return [context, [respondingEvent]];
|
|
346
|
+
}
|
|
347
|
+
function handleToolUseStart2(context, event) {
|
|
348
|
+
const { data } = event;
|
|
349
|
+
const outputs = [];
|
|
350
|
+
const toolPlannedEvent = {
|
|
351
|
+
type: "tool_planned",
|
|
352
|
+
timestamp: Date.now(),
|
|
353
|
+
data: {
|
|
354
|
+
toolId: data.toolCallId,
|
|
355
|
+
toolName: data.toolName
|
|
356
|
+
}
|
|
357
|
+
};
|
|
358
|
+
outputs.push(toolPlannedEvent);
|
|
359
|
+
const toolExecutingEvent = {
|
|
360
|
+
type: "tool_executing",
|
|
361
|
+
timestamp: Date.now(),
|
|
362
|
+
data: {
|
|
363
|
+
toolId: data.toolCallId,
|
|
364
|
+
toolName: data.toolName,
|
|
365
|
+
input: {}
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
outputs.push(toolExecutingEvent);
|
|
369
|
+
return [context, outputs];
|
|
370
|
+
}
|
|
371
|
+
function handleToolUseStop2(context) {
|
|
372
|
+
return [context, []];
|
|
373
|
+
}
|
|
374
|
+
function handleErrorReceived2(context, event) {
|
|
375
|
+
const { data } = event;
|
|
376
|
+
const errorOccurredEvent = {
|
|
377
|
+
type: "error_occurred",
|
|
378
|
+
timestamp: Date.now(),
|
|
379
|
+
data: {
|
|
380
|
+
code: data.errorCode || "unknown_error",
|
|
381
|
+
message: data.message,
|
|
382
|
+
recoverable: true
|
|
383
|
+
}
|
|
384
|
+
};
|
|
385
|
+
return [context, [errorOccurredEvent]];
|
|
386
|
+
}
|
|
387
|
+
var stateEventProcessorDef = {
|
|
388
|
+
name: "StateEventProcessor",
|
|
389
|
+
description: "Transform Stream Events into State Events",
|
|
390
|
+
initialState: createInitialStateEventProcessorContext,
|
|
391
|
+
processor: stateEventProcessor
|
|
392
|
+
};
|
|
393
|
+
|
|
394
|
+
// src/agent/engine/internal/turnTrackerProcessor.ts
|
|
395
|
+
function createInitialTurnTrackerState() {
|
|
396
|
+
return {
|
|
397
|
+
pendingTurn: null,
|
|
398
|
+
costPerInputToken: 3e-6,
|
|
399
|
+
// $3 per 1M tokens
|
|
400
|
+
costPerOutputToken: 15e-6
|
|
401
|
+
// $15 per 1M tokens
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
function generateId2() {
|
|
405
|
+
return `turn_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
|
|
406
|
+
}
|
|
407
|
+
var turnTrackerProcessor = (state, input) => {
|
|
408
|
+
switch (input.type) {
|
|
409
|
+
case "user_message":
|
|
410
|
+
return handleUserMessage(state, input);
|
|
411
|
+
case "message_stop":
|
|
412
|
+
return handleMessageStop3(state, input);
|
|
413
|
+
case "assistant_message":
|
|
414
|
+
return [state, []];
|
|
415
|
+
default:
|
|
416
|
+
return [state, []];
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
function handleUserMessage(state, event) {
|
|
420
|
+
const { data } = event;
|
|
421
|
+
const turnId = generateId2();
|
|
422
|
+
const contentText = typeof data.content === "string" ? data.content : "";
|
|
423
|
+
const pendingTurn = {
|
|
424
|
+
turnId,
|
|
425
|
+
messageId: data.id,
|
|
426
|
+
content: contentText,
|
|
427
|
+
requestedAt: event.timestamp
|
|
428
|
+
};
|
|
429
|
+
const turnRequestEvent = {
|
|
430
|
+
type: "turn_request",
|
|
431
|
+
timestamp: Date.now(),
|
|
432
|
+
data: {
|
|
433
|
+
turnId,
|
|
434
|
+
messageId: data.id,
|
|
435
|
+
content: contentText,
|
|
436
|
+
timestamp: event.timestamp
|
|
437
|
+
}
|
|
438
|
+
};
|
|
439
|
+
return [
|
|
440
|
+
{
|
|
441
|
+
...state,
|
|
442
|
+
pendingTurn
|
|
443
|
+
},
|
|
444
|
+
[turnRequestEvent]
|
|
445
|
+
];
|
|
446
|
+
}
|
|
447
|
+
function handleMessageStop3(state, event) {
|
|
448
|
+
if (!state.pendingTurn) {
|
|
449
|
+
return [state, []];
|
|
450
|
+
}
|
|
451
|
+
const { data } = event;
|
|
452
|
+
const stopReason = data.stopReason;
|
|
453
|
+
if (stopReason === "end_turn" || stopReason === "max_tokens" || stopReason === "stop_sequence") {
|
|
454
|
+
return completeTurn(state, event.timestamp);
|
|
455
|
+
}
|
|
456
|
+
return [state, []];
|
|
457
|
+
}
|
|
458
|
+
function completeTurn(state, completedAt) {
|
|
459
|
+
if (!state.pendingTurn) {
|
|
460
|
+
return [state, []];
|
|
461
|
+
}
|
|
462
|
+
const { turnId, messageId, requestedAt } = state.pendingTurn;
|
|
463
|
+
const duration = completedAt - requestedAt;
|
|
464
|
+
const usage = { inputTokens: 0, outputTokens: 0 };
|
|
465
|
+
const turnResponseEvent = {
|
|
466
|
+
type: "turn_response",
|
|
467
|
+
timestamp: Date.now(),
|
|
468
|
+
data: {
|
|
469
|
+
turnId,
|
|
470
|
+
messageId,
|
|
471
|
+
duration,
|
|
472
|
+
usage,
|
|
473
|
+
timestamp: completedAt
|
|
474
|
+
}
|
|
475
|
+
};
|
|
476
|
+
return [
|
|
477
|
+
{
|
|
478
|
+
...state,
|
|
479
|
+
pendingTurn: null
|
|
480
|
+
},
|
|
481
|
+
[turnResponseEvent]
|
|
482
|
+
];
|
|
483
|
+
}
|
|
484
|
+
var turnTrackerProcessorDef = {
|
|
485
|
+
name: "TurnTracker",
|
|
486
|
+
description: "Tracks request-response turn pairs",
|
|
487
|
+
initialState: createInitialTurnTrackerState,
|
|
488
|
+
processor: turnTrackerProcessor
|
|
489
|
+
};
|
|
490
|
+
|
|
491
|
+
export {
|
|
492
|
+
createInitialMessageAssemblerState,
|
|
493
|
+
messageAssemblerProcessor,
|
|
494
|
+
messageAssemblerProcessorDef,
|
|
495
|
+
createInitialStateEventProcessorContext,
|
|
496
|
+
stateEventProcessor,
|
|
497
|
+
stateEventProcessorDef,
|
|
498
|
+
createInitialTurnTrackerState,
|
|
499
|
+
turnTrackerProcessor,
|
|
500
|
+
turnTrackerProcessorDef
|
|
501
|
+
};
|
|
502
|
+
//# sourceMappingURL=chunk-I7GYR3MN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/agent/engine/internal/messageAssemblerProcessor.ts","../src/agent/engine/internal/stateEventProcessor.ts","../src/agent/engine/internal/turnTrackerProcessor.ts"],"sourcesContent":["/**\n * messageAssemblerProcessor\n *\n * Pure Mealy transition function that assembles complete Message Layer events\n * from Stream Layer events.\n *\n * Input Events (Stream Layer):\n * - message_start\n * - text_delta\n * - tool_use_start\n * - input_json_delta\n * - tool_use_stop\n * - tool_result\n * - message_stop\n *\n * Output Events (Message Layer):\n * - tool_call_message (Message - AI's request to call a tool)\n * - tool_result_message (Message - tool execution result)\n * - assistant_message (Message - complete assistant response)\n */\n\nimport type { Processor, ProcessorDefinition } from \"../mealy\";\nimport type {\n // Input: StreamEvent (from agent layer)\n StreamEvent,\n MessageStartEvent,\n TextDeltaEvent,\n ToolUseStartEvent,\n InputJsonDeltaEvent,\n ToolResultEvent,\n MessageStopEvent,\n // Output: Message events\n AssistantMessageEvent,\n ToolCallMessageEvent,\n ToolResultMessageEvent,\n ErrorMessageEvent,\n // Message types\n AssistantMessage,\n ToolCallMessage,\n ToolResultMessage,\n ErrorMessage,\n // Content parts\n TextPart,\n ToolCallPart,\n ToolResultPart,\n} from \"../../types\";\n\n// ===== State Types =====\n\n/**\n * Pending content accumulator\n */\nexport interface PendingContent {\n type: \"text\" | \"tool_use\";\n index: number;\n // For text content\n textDeltas?: string[];\n // For tool use\n toolId?: string;\n toolName?: string;\n toolInputJson?: string;\n}\n\n/**\n * Pending tool call info (for matching with tool_result)\n */\nexport interface PendingToolCall {\n id: string;\n name: string;\n}\n\n/**\n * MessageAssemblerState\n *\n * Tracks the state of message assembly from stream events.\n */\nexport interface MessageAssemblerState {\n /**\n * Current message ID being assembled\n */\n currentMessageId: string | null;\n\n /**\n * Timestamp when the current message started\n */\n messageStartTime: number | null;\n\n /**\n * Pending content blocks being accumulated\n * Key is the content block index\n */\n pendingContents: Record<number, PendingContent>;\n\n /**\n * Pending tool calls waiting for results\n * Key is the tool call ID\n */\n pendingToolCalls: Record<string, PendingToolCall>;\n}\n\n/**\n * Initial state factory for MessageAssembler\n */\nexport function createInitialMessageAssemblerState(): MessageAssemblerState {\n return {\n currentMessageId: null,\n messageStartTime: null,\n pendingContents: {},\n pendingToolCalls: {},\n };\n}\n\n// ===== Processor Implementation =====\n\n/**\n * Generate a unique ID\n */\nfunction generateId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Output event types from MessageAssembler\n */\nexport type MessageAssemblerOutput =\n | AssistantMessageEvent\n | ToolCallMessageEvent\n | ToolResultMessageEvent\n | ErrorMessageEvent;\n\n/**\n * Input event types for MessageAssembler\n */\nexport type MessageAssemblerInput = StreamEvent;\n\n/**\n * messageAssemblerProcessor\n *\n * Pure Mealy transition function for message assembly.\n * Pattern: (state, input) => [newState, outputs]\n */\nexport const messageAssemblerProcessor: Processor<\n MessageAssemblerState,\n MessageAssemblerInput,\n MessageAssemblerOutput\n> = (state, input): [MessageAssemblerState, MessageAssemblerOutput[]] => {\n switch (input.type) {\n case \"message_start\":\n return handleMessageStart(state, input);\n\n case \"text_delta\":\n return handleTextDelta(state, input);\n\n case \"tool_use_start\":\n return handleToolUseStart(state, input);\n\n case \"input_json_delta\":\n return handleInputJsonDelta(state, input);\n\n case \"tool_use_stop\":\n return handleToolUseStop(state, input);\n\n case \"tool_result\":\n return handleToolResult(state, input);\n\n case \"message_stop\":\n return handleMessageStop(state, input);\n\n case \"error_received\":\n return handleErrorReceived(state, input);\n\n default:\n // Pass through unhandled events (no state change, no output)\n return [state, []];\n }\n};\n\n/**\n * Handle message_start event\n */\nfunction handleMessageStart(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const { data } = event as MessageStartEvent;\n return [\n {\n ...state,\n currentMessageId: data.messageId,\n messageStartTime: event.timestamp,\n pendingContents: {},\n },\n [],\n ];\n}\n\n/**\n * Handle text_delta event\n */\nfunction handleTextDelta(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const { data } = event as TextDeltaEvent;\n const index = 0; // Text content uses index 0\n const existingContent = state.pendingContents[index];\n\n const pendingContent: PendingContent =\n existingContent?.type === \"text\"\n ? {\n ...existingContent,\n textDeltas: [...(existingContent.textDeltas || []), data.text],\n }\n : {\n type: \"text\",\n index,\n textDeltas: [data.text],\n };\n\n return [\n {\n ...state,\n pendingContents: {\n ...state.pendingContents,\n [index]: pendingContent,\n },\n },\n [],\n ];\n}\n\n/**\n * Handle tool_use_start event\n */\nfunction handleToolUseStart(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const { data } = event as ToolUseStartEvent;\n const index = 1; // Tool use uses index 1\n\n const pendingContent: PendingContent = {\n type: \"tool_use\",\n index,\n toolId: data.toolCallId,\n toolName: data.toolName,\n toolInputJson: \"\",\n };\n\n return [\n {\n ...state,\n pendingContents: {\n ...state.pendingContents,\n [index]: pendingContent,\n },\n },\n [],\n ];\n}\n\n/**\n * Handle input_json_delta event\n */\nfunction handleInputJsonDelta(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const { data } = event as InputJsonDeltaEvent;\n const index = 1; // Tool use uses index 1\n const existingContent = state.pendingContents[index];\n\n if (!existingContent || existingContent.type !== \"tool_use\") {\n // No pending tool_use content, ignore\n return [state, []];\n }\n\n const pendingContent: PendingContent = {\n ...existingContent,\n toolInputJson: (existingContent.toolInputJson || \"\") + data.partialJson,\n };\n\n return [\n {\n ...state,\n pendingContents: {\n ...state.pendingContents,\n [index]: pendingContent,\n },\n },\n [],\n ];\n}\n\n/**\n * Handle tool_use_stop event\n *\n * Emits:\n * - tool_call_message (Message Event) - for UI display and tool execution\n */\nfunction handleToolUseStop(\n state: Readonly<MessageAssemblerState>,\n _event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const index = 1;\n const pendingContent = state.pendingContents[index];\n\n if (!pendingContent || pendingContent.type !== \"tool_use\") {\n return [state, []];\n }\n\n // Get tool info from pendingContent (saved during tool_use_start)\n const toolId = pendingContent.toolId || \"\";\n const toolName = pendingContent.toolName || \"\";\n\n // Parse tool input JSON (accumulated during input_json_delta)\n let toolInput: Record<string, unknown> = {};\n try {\n toolInput = pendingContent.toolInputJson ? JSON.parse(pendingContent.toolInputJson) : {};\n } catch {\n // Failed to parse, use empty object\n toolInput = {};\n }\n\n // Create ToolCallPart\n const toolCall: ToolCallPart = {\n type: \"tool-call\",\n id: toolId,\n name: toolName,\n input: toolInput,\n };\n\n // Create ToolCallMessage (complete Message object)\n // parentId links this tool call to its parent assistant message\n const messageId = generateId();\n const timestamp = Date.now();\n const toolCallMessage: ToolCallMessage = {\n id: messageId,\n role: \"assistant\",\n subtype: \"tool-call\",\n toolCall,\n timestamp,\n parentId: state.currentMessageId || undefined,\n };\n\n // Emit tool_call_message event - data is complete Message object\n const toolCallMessageEvent: ToolCallMessageEvent = {\n type: \"tool_call_message\",\n timestamp,\n data: toolCallMessage,\n };\n\n // Remove from pending contents, add to pending tool calls\n const { [index]: _, ...remainingContents } = state.pendingContents;\n\n return [\n {\n ...state,\n pendingContents: remainingContents,\n pendingToolCalls: {\n ...state.pendingToolCalls,\n [toolId]: { id: toolId, name: toolName },\n },\n },\n [toolCallMessageEvent],\n ];\n}\n\n/**\n * Handle tool_result event\n *\n * Emits:\n * - tool_result_message (Message Event) - for UI display\n */\nfunction handleToolResult(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const { data } = event as ToolResultEvent;\n const { toolCallId, result, isError } = data;\n\n // Find pending tool call\n const pendingToolCall = state.pendingToolCalls[toolCallId];\n const toolName = pendingToolCall?.name || \"unknown\";\n\n // Create tool result part\n const toolResult: ToolResultPart = {\n type: \"tool-result\",\n id: toolCallId,\n name: toolName,\n output: {\n type: isError ? \"error-text\" : \"text\",\n value: typeof result === \"string\" ? result : JSON.stringify(result),\n },\n };\n\n // Create ToolResultMessage (complete Message object)\n const messageId = generateId();\n const timestamp = Date.now();\n const toolResultMessage: ToolResultMessage = {\n id: messageId,\n role: \"tool\",\n subtype: \"tool-result\",\n toolCallId,\n toolResult,\n timestamp,\n };\n\n // Emit tool_result_message event - data is complete Message object\n const toolResultMessageEvent: ToolResultMessageEvent = {\n type: \"tool_result_message\",\n timestamp,\n data: toolResultMessage,\n };\n\n // Remove from pending tool calls\n const { [toolCallId]: _, ...remainingToolCalls } = state.pendingToolCalls;\n\n return [\n {\n ...state,\n pendingToolCalls: remainingToolCalls,\n },\n [toolResultMessageEvent],\n ];\n}\n\n/**\n * Handle message_stop event\n */\nfunction handleMessageStop(\n state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const { data } = event as MessageStopEvent;\n\n if (!state.currentMessageId) {\n return [state, []];\n }\n\n // Assemble all text content\n const textParts: string[] = [];\n const sortedContents = Object.values(state.pendingContents).sort((a, b) => a.index - b.index);\n\n for (const pending of sortedContents) {\n if (pending.type === \"text\" && pending.textDeltas) {\n textParts.push(pending.textDeltas.join(\"\"));\n }\n }\n\n const textContent = textParts.join(\"\");\n\n // Skip empty messages (but preserve pendingToolCalls if stopReason is \"tool_use\")\n const stopReason = data.stopReason;\n if (!textContent || textContent.trim().length === 0) {\n const shouldPreserveToolCalls = stopReason === \"tool_use\";\n return [\n {\n ...createInitialMessageAssemblerState(),\n pendingToolCalls: shouldPreserveToolCalls ? state.pendingToolCalls : {},\n },\n [],\n ];\n }\n\n // Create content parts (new structure uses ContentPart[])\n const contentParts: TextPart[] = [\n {\n type: \"text\",\n text: textContent,\n },\n ];\n\n // Create AssistantMessage (complete Message object)\n const timestamp = state.messageStartTime || Date.now();\n const assistantMessage: AssistantMessage = {\n id: state.currentMessageId,\n role: \"assistant\",\n subtype: \"assistant\",\n content: contentParts,\n timestamp,\n };\n\n // Emit AssistantMessageEvent - data is complete Message object\n const assistantEvent: AssistantMessageEvent = {\n type: \"assistant_message\",\n timestamp,\n data: assistantMessage,\n };\n\n // Reset state, but preserve pendingToolCalls if stopReason is \"tool_use\"\n // (tool_result events arrive after message_stop in tool call scenarios)\n const shouldPreserveToolCalls = stopReason === \"tool_use\";\n\n return [\n {\n ...createInitialMessageAssemblerState(),\n pendingToolCalls: shouldPreserveToolCalls ? state.pendingToolCalls : {},\n },\n [assistantEvent],\n ];\n}\n\n/**\n * Handle error_received event\n *\n * Emits: error_message (Message Event) - for UI display\n */\nfunction handleErrorReceived(\n _state: Readonly<MessageAssemblerState>,\n event: StreamEvent\n): [MessageAssemblerState, MessageAssemblerOutput[]] {\n const data = event.data as { message: string; errorCode?: string };\n\n // Create ErrorMessage (complete Message object)\n const messageId = generateId();\n const timestamp = Date.now();\n const errorMessage: ErrorMessage = {\n id: messageId,\n role: \"error\",\n subtype: \"error\",\n content: data.message,\n errorCode: data.errorCode,\n timestamp,\n };\n\n // Emit error_message event - data is complete Message object\n const errorMessageEvent: ErrorMessageEvent = {\n type: \"error_message\",\n timestamp,\n data: errorMessage,\n };\n\n // Reset state on error\n return [createInitialMessageAssemblerState(), [errorMessageEvent]];\n}\n\n/**\n * MessageAssembler Processor Definition\n */\nexport const messageAssemblerProcessorDef: ProcessorDefinition<\n MessageAssemblerState,\n MessageAssemblerInput,\n MessageAssemblerOutput\n> = {\n name: \"MessageAssembler\",\n description: \"Assembles complete messages from stream events\",\n initialState: createInitialMessageAssemblerState,\n processor: messageAssemblerProcessor,\n};\n","/**\n * stateEventProcessor\n *\n * Stateless event transformer: Stream Events → State Events\n *\n * Input Events (Stream Layer):\n * - message_start\n * - message_stop\n * - text_delta (triggers responding state)\n * - tool_use_start\n * - tool_use_stop\n *\n * Output Events (State Layer):\n * - conversation_start\n * - conversation_responding\n * - conversation_end\n * - tool_planned\n * - tool_executing\n */\n\nimport type { Processor, ProcessorDefinition } from \"../mealy\";\nimport type {\n // Base type\n EngineEvent,\n // Input: StreamEvent (from agent layer)\n StreamEvent,\n MessageStartEvent,\n MessageStopEvent,\n ToolUseStartEvent,\n // Output: State events\n ConversationStartEvent,\n ConversationRespondingEvent,\n ConversationEndEvent,\n ConversationInterruptedEvent,\n ToolPlannedEvent,\n ToolExecutingEvent,\n ErrorOccurredEvent,\n} from \"../../types\";\nimport { createLogger } from \"commonxjs/logger\";\n\nconst logger = createLogger(\"engine/stateEventProcessor\");\n\n// ===== State Types =====\n\n/**\n * StateEventProcessorContext\n *\n * Minimal context needed for event transformation logic.\n * Does NOT track agent state - only auxiliary info for decision-making.\n *\n * Currently empty - no context needed as all information comes from events.\n */\nexport interface StateEventProcessorContext {\n // Empty - all information comes from events\n}\n\n/**\n * Initial context factory for StateEventProcessor\n */\nexport function createInitialStateEventProcessorContext(): StateEventProcessorContext {\n return {};\n}\n\n// ===== Processor Implementation =====\n\n/**\n * Output event types from StateEventProcessor\n */\nexport type StateEventProcessorOutput =\n | ConversationStartEvent\n | ConversationRespondingEvent\n | ConversationEndEvent\n | ConversationInterruptedEvent\n | ToolPlannedEvent\n | ToolExecutingEvent\n | ErrorOccurredEvent;\n\n/**\n * Input event types for StateEventProcessor\n */\nexport type StateEventProcessorInput = StreamEvent;\n\n/**\n * stateEventProcessor\n *\n * Stateless event transformer: Stream Events → State Events\n *\n * Design:\n * - Does NOT track agent state (that's StateMachine's job)\n * - Only maintains auxiliary context (timestamps, etc.)\n * - Emits State Events that StateMachine consumes\n *\n * Pattern: (context, input) => [newContext, outputs]\n */\nexport const stateEventProcessor: Processor<\n StateEventProcessorContext,\n StateEventProcessorInput,\n StateEventProcessorOutput\n> = (context, input): [StateEventProcessorContext, StateEventProcessorOutput[]] => {\n // Log all incoming Stream Events\n logger.debug(`[Stream Event] ${input.type}`, {\n context,\n eventData: \"data\" in input ? input.data : undefined,\n });\n\n switch (input.type) {\n case \"message_start\":\n return handleMessageStart(context, input);\n\n case \"message_delta\":\n return handleMessageDelta(context);\n\n case \"message_stop\":\n return handleMessageStop(context, input);\n\n case \"text_delta\":\n return handleTextDelta(context);\n\n case \"tool_use_start\":\n return handleToolUseStart(context, input);\n\n case \"tool_use_stop\":\n return handleToolUseStop(context);\n\n case \"error_received\":\n return handleErrorReceived(context, input);\n\n default:\n // Pass through unhandled events\n logger.debug(`[Stream Event] ${input.type} (unhandled)`);\n return [context, []];\n }\n};\n\n/**\n * Handle message_start event\n *\n * Emits: conversation_start\n */\nfunction handleMessageStart(\n context: Readonly<StateEventProcessorContext>,\n event: StreamEvent\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const { data } = event as MessageStartEvent;\n\n const conversationStartEvent: ConversationStartEvent = {\n type: \"conversation_start\",\n timestamp: Date.now(),\n data: {\n messageId: data.messageId,\n },\n };\n\n return [context, [conversationStartEvent]];\n}\n\n/**\n * Handle message_delta event\n *\n * No longer needed as stopReason is now in message_stop event.\n * Kept for compatibility with event routing.\n */\nfunction handleMessageDelta(\n context: Readonly<StateEventProcessorContext>\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n // No-op: stopReason now comes from message_stop\n return [context, []];\n}\n\n/**\n * Handle message_stop event\n *\n * Emits: conversation_end (only if stopReason is NOT \"tool_use\")\n *\n * This event signals that Claude has finished streaming a message.\n * However, if stopReason is \"tool_use\", the conversation continues\n * because Claude will execute tools and send more messages.\n */\nfunction handleMessageStop(\n context: Readonly<StateEventProcessorContext>,\n event: StreamEvent\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const { data } = event as MessageStopEvent;\n const stopReason = data.stopReason;\n\n logger.debug(\"message_stop received\", { stopReason });\n\n // If stopReason is \"tool_use\", don't emit conversation_end\n // The conversation continues after tool execution\n if (stopReason === \"tool_use\") {\n logger.debug(\"Skipping conversation_end (tool_use in progress)\");\n return [context, []];\n }\n\n // For all other cases (end_turn, max_tokens, etc.), emit conversation_end\n const conversationEndEvent: ConversationEndEvent = {\n type: \"conversation_end\",\n timestamp: Date.now(),\n data: {\n reason: \"completed\",\n },\n };\n\n return [context, [conversationEndEvent]];\n}\n\n/**\n * Handle text_delta event\n *\n * Emits: conversation_responding\n */\nfunction handleTextDelta(\n context: Readonly<StateEventProcessorContext>\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const respondingEvent: ConversationRespondingEvent = {\n type: \"conversation_responding\",\n timestamp: Date.now(),\n data: {},\n };\n\n return [context, [respondingEvent]];\n}\n\n/**\n * Handle tool_use_start event\n *\n * Emits: tool_planned, tool_executing\n */\nfunction handleToolUseStart(\n context: Readonly<StateEventProcessorContext>,\n event: StreamEvent\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const { data } = event as ToolUseStartEvent;\n const outputs: StateEventProcessorOutput[] = [];\n\n // Emit ToolPlannedEvent\n const toolPlannedEvent: ToolPlannedEvent = {\n type: \"tool_planned\",\n timestamp: Date.now(),\n data: {\n toolId: data.toolCallId,\n toolName: data.toolName,\n },\n };\n outputs.push(toolPlannedEvent);\n\n // Emit ToolExecutingEvent\n const toolExecutingEvent: ToolExecutingEvent = {\n type: \"tool_executing\",\n timestamp: Date.now(),\n data: {\n toolId: data.toolCallId,\n toolName: data.toolName,\n input: {},\n },\n };\n outputs.push(toolExecutingEvent);\n\n return [context, outputs];\n}\n\n/**\n * Handle tool_use_stop event\n *\n * Pass through - no State Event emitted.\n * StateMachine handles the state transition internally.\n */\nfunction handleToolUseStop(\n context: Readonly<StateEventProcessorContext>\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n // Pass through - no State Event\n return [context, []];\n}\n\n/**\n * Handle error_received event\n *\n * Emits: error_occurred\n */\nfunction handleErrorReceived(\n context: Readonly<StateEventProcessorContext>,\n event: StreamEvent\n): [StateEventProcessorContext, StateEventProcessorOutput[]] {\n const { data } = event as EngineEvent<\"error_received\", { message: string; errorCode?: string }>;\n\n const errorOccurredEvent: ErrorOccurredEvent = {\n type: \"error_occurred\",\n timestamp: Date.now(),\n data: {\n code: data.errorCode || \"unknown_error\",\n message: data.message,\n recoverable: true,\n },\n };\n\n return [context, [errorOccurredEvent]];\n}\n\n/**\n * StateEvent Processor Definition\n *\n * Stateless event transformer: Stream Events → State Events\n */\nexport const stateEventProcessorDef: ProcessorDefinition<\n StateEventProcessorContext,\n StateEventProcessorInput,\n StateEventProcessorOutput\n> = {\n name: \"StateEventProcessor\",\n description: \"Transform Stream Events into State Events\",\n initialState: createInitialStateEventProcessorContext,\n processor: stateEventProcessor,\n};\n","/**\n * turnTrackerProcessor\n *\n * Pure Mealy transition function that tracks request-response turn pairs.\n *\n * Input Events:\n * - user_message (Message Layer)\n * - message_stop (Stream Layer - contains stop reason)\n * - assistant_message (Message Layer)\n *\n * Output Events (Turn Layer):\n * - turn_request\n * - turn_response\n */\n\nimport type { Processor, ProcessorDefinition } from \"../mealy\";\nimport type {\n // Input: combined stream and message events\n StreamEvent,\n AgentMessageEvent,\n MessageStopEvent,\n UserMessageEvent,\n // Output: Turn events\n TurnRequestEvent,\n TurnResponseEvent,\n // Data types\n TokenUsage,\n} from \"../../types\";\n\n// ===== State Types =====\n\n/**\n * Pending turn tracking\n */\nexport interface PendingTurn {\n turnId: string;\n messageId: string;\n content: string;\n requestedAt: number;\n}\n\n/**\n * TurnTrackerState\n *\n * Tracks the current turn state.\n */\nexport interface TurnTrackerState {\n /**\n * Currently pending turn (waiting for response)\n */\n pendingTurn: PendingTurn | null;\n\n /**\n * Cost per input token (USD)\n */\n costPerInputToken: number;\n\n /**\n * Cost per output token (USD)\n */\n costPerOutputToken: number;\n}\n\n/**\n * Initial state factory for TurnTracker\n */\nexport function createInitialTurnTrackerState(): TurnTrackerState {\n return {\n pendingTurn: null,\n costPerInputToken: 0.000003, // $3 per 1M tokens\n costPerOutputToken: 0.000015, // $15 per 1M tokens\n };\n}\n\n// ===== Processor Implementation =====\n\n/**\n * Generate a unique ID\n */\nfunction generateId(): string {\n return `turn_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Output event types from TurnTracker\n */\nexport type TurnTrackerOutput = TurnRequestEvent | TurnResponseEvent;\n\n/**\n * Input event types for TurnTracker\n * Accepts both Stream and Message layer events\n */\nexport type TurnTrackerInput = StreamEvent | AgentMessageEvent;\n\n/**\n * turnTrackerProcessor\n *\n * Pure Mealy transition function for turn tracking.\n * Pattern: (state, input) => [newState, outputs]\n */\nexport const turnTrackerProcessor: Processor<\n TurnTrackerState,\n TurnTrackerInput,\n TurnTrackerOutput\n> = (state, input): [TurnTrackerState, TurnTrackerOutput[]] => {\n switch (input.type) {\n case \"user_message\":\n return handleUserMessage(state, input as AgentMessageEvent);\n\n case \"message_stop\":\n return handleMessageStop(state, input as StreamEvent);\n\n case \"assistant_message\":\n // Turn completion is handled in message_stop\n // This handler is kept for potential future use\n return [state, []];\n\n default:\n return [state, []];\n }\n};\n\n/**\n * Handle user_message event\n */\nfunction handleUserMessage(\n state: Readonly<TurnTrackerState>,\n event: AgentMessageEvent\n): [TurnTrackerState, TurnTrackerOutput[]] {\n const { data } = event as UserMessageEvent;\n const turnId = generateId();\n\n // Extract content as string (UserMessage.content can be string or array)\n const contentText = typeof data.content === \"string\" ? data.content : \"\";\n\n const pendingTurn: PendingTurn = {\n turnId,\n messageId: data.id,\n content: contentText,\n requestedAt: event.timestamp,\n };\n\n const turnRequestEvent: TurnRequestEvent = {\n type: \"turn_request\",\n timestamp: Date.now(),\n data: {\n turnId,\n messageId: data.id,\n content: contentText,\n timestamp: event.timestamp,\n },\n };\n\n return [\n {\n ...state,\n pendingTurn,\n },\n [turnRequestEvent],\n ];\n}\n\n/**\n * Handle message_stop event\n */\nfunction handleMessageStop(\n state: Readonly<TurnTrackerState>,\n event: StreamEvent\n): [TurnTrackerState, TurnTrackerOutput[]] {\n if (!state.pendingTurn) {\n return [state, []];\n }\n\n const { data } = event as MessageStopEvent;\n const stopReason = data.stopReason;\n\n // Complete turn based on stop reason\n // - \"end_turn\": Normal completion (no tool use)\n // - \"tool_use\": Tool calling in progress, DON'T complete yet\n // - \"max_tokens\": Hit token limit, complete turn\n // - \"stop_sequence\": Hit stop sequence, complete turn\n if (stopReason === \"end_turn\" || stopReason === \"max_tokens\" || stopReason === \"stop_sequence\") {\n return completeTurn(state, event.timestamp);\n }\n\n // For tool_use, don't complete turn yet\n return [state, []];\n}\n\n/**\n * Complete the turn and emit TurnResponseEvent\n */\nfunction completeTurn(\n state: Readonly<TurnTrackerState>,\n completedAt: number\n): [TurnTrackerState, TurnTrackerOutput[]] {\n if (!state.pendingTurn) {\n return [state, []];\n }\n\n const { turnId, messageId, requestedAt } = state.pendingTurn;\n const duration = completedAt - requestedAt;\n\n const usage: TokenUsage = { inputTokens: 0, outputTokens: 0 };\n\n const turnResponseEvent: TurnResponseEvent = {\n type: \"turn_response\",\n timestamp: Date.now(),\n data: {\n turnId,\n messageId,\n duration,\n usage,\n timestamp: completedAt,\n },\n };\n\n return [\n {\n ...state,\n pendingTurn: null,\n },\n [turnResponseEvent],\n ];\n}\n\n/**\n * TurnTracker Processor Definition\n */\nexport const turnTrackerProcessorDef: ProcessorDefinition<\n TurnTrackerState,\n TurnTrackerInput,\n TurnTrackerOutput\n> = {\n name: \"TurnTracker\",\n description: \"Tracks request-response turn pairs\",\n initialState: createInitialTurnTrackerState,\n processor: turnTrackerProcessor,\n};\n"],"mappings":"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","names":["shouldPreserveToolCalls","handleMessageStart","handleMessageStop","handleTextDelta","handleToolUseStart","handleToolUseStop","handleErrorReceived","generateId","handleMessageStop"]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// src/agent/types/event.ts
|
|
2
|
+
function isStateEvent(event) {
|
|
3
|
+
const stateTypes = [
|
|
4
|
+
"conversation_queued",
|
|
5
|
+
"conversation_start",
|
|
6
|
+
"conversation_thinking",
|
|
7
|
+
"conversation_responding",
|
|
8
|
+
"conversation_end",
|
|
9
|
+
"conversation_interrupted",
|
|
10
|
+
"tool_planned",
|
|
11
|
+
"tool_executing",
|
|
12
|
+
"tool_completed",
|
|
13
|
+
"tool_failed",
|
|
14
|
+
"error_occurred"
|
|
15
|
+
];
|
|
16
|
+
return stateTypes.includes(event.type);
|
|
17
|
+
}
|
|
18
|
+
function isMessageEvent(event) {
|
|
19
|
+
const messageTypes = [
|
|
20
|
+
"user_message",
|
|
21
|
+
"assistant_message",
|
|
22
|
+
"tool_call_message",
|
|
23
|
+
"tool_result_message",
|
|
24
|
+
"error_message"
|
|
25
|
+
];
|
|
26
|
+
return messageTypes.includes(event.type);
|
|
27
|
+
}
|
|
28
|
+
function isTurnEvent(event) {
|
|
29
|
+
const turnTypes = ["turn_request", "turn_response"];
|
|
30
|
+
return turnTypes.includes(event.type);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export {
|
|
34
|
+
isStateEvent,
|
|
35
|
+
isMessageEvent,
|
|
36
|
+
isTurnEvent
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=chunk-K6WXQ2RW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/agent/types/event.ts"],"sourcesContent":["/**\n * Event Types - Stream, State, Message, and Turn Events\n *\n * This file defines all event types for the AgentEngine:\n * - Base EngineEvent type\n * - Stream Events: message_start, text_delta, tool_use_*, etc.\n * - State Events: conversation_*, tool_*, error_*\n * - Message Events: user_message, assistant_message, etc.\n * - Turn Events: turn_request, turn_response\n * - AgentOutput: Union of all output events\n *\n * @packageDocumentation\n */\n\nimport type {\n UserMessage,\n AssistantMessage,\n ToolCallMessage,\n ToolResultMessage,\n ErrorMessage,\n TokenUsage,\n} from \"./message\";\n\n// =============================================================================\n// Base Types\n// =============================================================================\n\n/**\n * EngineEvent - Lightweight event base for AgentEngine domain\n *\n * EngineEvent is the simplified event structure used inside AgentEngine.\n * It only contains: type, timestamp, data\n *\n * This is a self-contained type without external dependencies.\n * All specific event types (StreamEvent, StateEvent, etc.) extend this base.\n */\nexport interface EngineEvent<T extends string = string, D = unknown> {\n /**\n * Event type identifier (e.g., \"text_delta\", \"assistant_message\")\n */\n readonly type: T;\n\n /**\n * Event timestamp (Unix milliseconds)\n */\n readonly timestamp: number;\n\n /**\n * Event payload data\n */\n readonly data: D;\n}\n\n/**\n * @deprecated Use EngineEvent instead\n */\nexport type AgentEvent<T extends string = string, D = unknown> = EngineEvent<T, D>;\n\n// =============================================================================\n// Agent State\n// =============================================================================\n\n/**\n * AgentState\n *\n * Agent conversation states for fine-grained monitoring.\n *\n * State transitions:\n * ```\n * idle -> thinking -> responding -> idle\n * |\n * planning_tool -> awaiting_tool_result\n * |\n * thinking -> responding -> idle\n *\n * Any state can transition to error:\n * thinking/responding/planning_tool/awaiting_tool_result -> error -> idle\n * ```\n */\nexport type AgentState =\n | \"idle\" // Waiting for user input\n | \"thinking\" // LLM is thinking\n | \"responding\" // LLM is generating response\n | \"planning_tool\" // Generating tool call parameters\n | \"awaiting_tool_result\" // Waiting for tool execution result\n | \"error\"; // Error occurred during processing\n\n// =============================================================================\n// Agent Error\n// =============================================================================\n\n/**\n * Error category\n */\nexport type AgentErrorCategory =\n | \"network\" // Network/API errors\n | \"validation\" // Input validation errors\n | \"system\" // Internal system errors\n | \"business\"; // Business logic errors\n\n/**\n * AgentError - Standardized error structure\n */\nexport interface AgentError {\n /**\n * Error category\n */\n category: AgentErrorCategory;\n\n /**\n * Error code (e.g., \"NETWORK_TIMEOUT\", \"INVALID_INPUT\")\n */\n code: string;\n\n /**\n * Human-readable error message\n */\n message: string;\n\n /**\n * Whether the error is recoverable\n */\n recoverable: boolean;\n\n /**\n * Original error (if any)\n */\n cause?: Error;\n\n /**\n * Additional context\n */\n context?: Record<string, unknown>;\n}\n\n// =============================================================================\n// Stream Events\n// =============================================================================\n\n/**\n * Stop reason for message completion\n */\nexport type StopReason = \"end_turn\" | \"max_tokens\" | \"stop_sequence\" | \"tool_use\";\n\n// --- Stream Event Data Types ---\n\nexport interface MessageStartData {\n messageId: string;\n model: string;\n}\n\nexport interface MessageDeltaData {\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n}\n\nexport interface MessageStopData {\n stopReason?: StopReason;\n}\n\nexport interface TextDeltaData {\n text: string;\n}\n\nexport interface ToolUseStartData {\n toolCallId: string;\n toolName: string;\n}\n\nexport interface InputJsonDeltaData {\n partialJson: string;\n}\n\nexport interface ToolUseStopData {\n toolCallId: string;\n toolName: string;\n input: Record<string, unknown>;\n}\n\nexport interface ToolResultData {\n toolCallId: string;\n result: unknown;\n isError?: boolean;\n}\n\nexport interface ErrorReceivedData {\n message: string;\n errorCode?: string;\n}\n\n// --- Stream Event Types ---\n\nexport type MessageStartEvent = EngineEvent<\"message_start\", MessageStartData>;\nexport type MessageDeltaEvent = EngineEvent<\"message_delta\", MessageDeltaData>;\nexport type MessageStopEvent = EngineEvent<\"message_stop\", MessageStopData>;\nexport type TextDeltaEvent = EngineEvent<\"text_delta\", TextDeltaData>;\nexport type ToolUseStartEvent = EngineEvent<\"tool_use_start\", ToolUseStartData>;\nexport type InputJsonDeltaEvent = EngineEvent<\"input_json_delta\", InputJsonDeltaData>;\nexport type ToolUseStopEvent = EngineEvent<\"tool_use_stop\", ToolUseStopData>;\nexport type ToolResultEvent = EngineEvent<\"tool_result\", ToolResultData>;\nexport type ErrorReceivedEvent = EngineEvent<\"error_received\", ErrorReceivedData>;\n\n/**\n * StreamEvent - All lightweight stream events\n */\nexport type StreamEvent =\n | MessageStartEvent\n | MessageDeltaEvent\n | MessageStopEvent\n | TextDeltaEvent\n | ToolUseStartEvent\n | InputJsonDeltaEvent\n | ToolUseStopEvent\n | ToolResultEvent\n | ErrorReceivedEvent;\n\n/**\n * StreamEventType - String literal union\n */\nexport type StreamEventType = StreamEvent[\"type\"];\n\n// =============================================================================\n// State Events\n// =============================================================================\n\n// --- State Event Data Types ---\n\nexport interface ConversationQueuedData {\n messageId: string;\n}\n\nexport interface ConversationStartData {\n messageId: string;\n}\n\nexport interface ConversationThinkingData {\n // Empty\n}\n\nexport interface ConversationRespondingData {\n // Empty\n}\n\nexport interface ConversationEndData {\n reason: \"completed\" | \"interrupted\" | \"error\";\n}\n\nexport interface ConversationInterruptedData {\n reason: string;\n}\n\nexport interface ToolPlannedData {\n toolId: string;\n toolName: string;\n}\n\nexport interface ToolExecutingData {\n toolId: string;\n toolName: string;\n input: Record<string, unknown>;\n}\n\nexport interface ToolCompletedData {\n toolId: string;\n toolName: string;\n result: unknown;\n}\n\nexport interface ToolFailedData {\n toolId: string;\n toolName: string;\n error: string;\n}\n\nexport interface ErrorOccurredData {\n code: string;\n message: string;\n recoverable: boolean;\n category?: string;\n}\n\n/**\n * StateEvent - Base type for state events\n * @deprecated Use specific event types instead\n */\nexport interface StateEvent<T extends string = string, D = unknown> extends EngineEvent<T, D> {}\n\n// --- State Event Types ---\n\nexport type ConversationQueuedEvent = EngineEvent<\"conversation_queued\", ConversationQueuedData>;\nexport type ConversationStartEvent = EngineEvent<\"conversation_start\", ConversationStartData>;\nexport type ConversationThinkingEvent = EngineEvent<\n \"conversation_thinking\",\n ConversationThinkingData\n>;\nexport type ConversationRespondingEvent = EngineEvent<\n \"conversation_responding\",\n ConversationRespondingData\n>;\nexport type ConversationEndEvent = EngineEvent<\"conversation_end\", ConversationEndData>;\nexport type ConversationInterruptedEvent = EngineEvent<\n \"conversation_interrupted\",\n ConversationInterruptedData\n>;\nexport type ToolPlannedEvent = EngineEvent<\"tool_planned\", ToolPlannedData>;\nexport type ToolExecutingEvent = EngineEvent<\"tool_executing\", ToolExecutingData>;\nexport type ToolCompletedEvent = EngineEvent<\"tool_completed\", ToolCompletedData>;\nexport type ToolFailedEvent = EngineEvent<\"tool_failed\", ToolFailedData>;\nexport type ErrorOccurredEvent = EngineEvent<\"error_occurred\", ErrorOccurredData>;\n\n/**\n * Alias for ErrorOccurredEvent (legacy compatibility)\n */\nexport type AgentErrorOccurredEvent = ErrorOccurredEvent;\n\n/**\n * AgentStateEvent - All lightweight state events\n */\nexport type AgentStateEvent =\n // Conversation\n | ConversationQueuedEvent\n | ConversationStartEvent\n | ConversationThinkingEvent\n | ConversationRespondingEvent\n | ConversationEndEvent\n | ConversationInterruptedEvent\n // Tool\n | ToolPlannedEvent\n | ToolExecutingEvent\n | ToolCompletedEvent\n | ToolFailedEvent\n // Error\n | ErrorOccurredEvent;\n\n/**\n * Type guard: is this a state event?\n */\nexport function isStateEvent(event: EngineEvent): event is AgentStateEvent {\n const stateTypes = [\n \"conversation_queued\",\n \"conversation_start\",\n \"conversation_thinking\",\n \"conversation_responding\",\n \"conversation_end\",\n \"conversation_interrupted\",\n \"tool_planned\",\n \"tool_executing\",\n \"tool_completed\",\n \"tool_failed\",\n \"error_occurred\",\n ];\n return stateTypes.includes(event.type);\n}\n\n// =============================================================================\n// Message Events\n// =============================================================================\n\n/**\n * MessageEvent - Base type for message events\n * @deprecated Use specific event types instead\n */\nexport interface MessageEvent<T extends string = string, D = unknown> extends EngineEvent<T, D> {}\n\n// --- Message Event Types ---\n\nexport type UserMessageEvent = EngineEvent<\"user_message\", UserMessage>;\nexport type AssistantMessageEvent = EngineEvent<\"assistant_message\", AssistantMessage>;\nexport type ToolCallMessageEvent = EngineEvent<\"tool_call_message\", ToolCallMessage>;\nexport type ToolResultMessageEvent = EngineEvent<\"tool_result_message\", ToolResultMessage>;\nexport type ErrorMessageEvent = EngineEvent<\"error_message\", ErrorMessage>;\n\n/**\n * AgentMessageEvent - All lightweight message events\n */\nexport type AgentMessageEvent =\n | UserMessageEvent\n | AssistantMessageEvent\n | ToolCallMessageEvent\n | ToolResultMessageEvent\n | ErrorMessageEvent;\n\n/**\n * Type guard: is this a message event?\n */\nexport function isMessageEvent(event: EngineEvent): event is AgentMessageEvent {\n const messageTypes = [\n \"user_message\",\n \"assistant_message\",\n \"tool_call_message\",\n \"tool_result_message\",\n \"error_message\",\n ];\n return messageTypes.includes(event.type);\n}\n\n// =============================================================================\n// Turn Events\n// =============================================================================\n\n// --- Turn Event Data Types ---\n\nexport interface TurnRequestData {\n turnId: string;\n messageId: string;\n content: string;\n timestamp: number;\n}\n\nexport interface TurnResponseData {\n turnId: string;\n messageId: string;\n duration: number;\n usage?: TokenUsage;\n model?: string;\n stopReason?: string;\n timestamp: number;\n}\n\n/**\n * TurnEvent - Base type for turn events\n * @deprecated Use specific event types instead\n */\nexport interface TurnEvent<T extends string = string, D = unknown> extends EngineEvent<T, D> {}\n\n// --- Turn Event Types ---\n\nexport type TurnRequestEvent = EngineEvent<\"turn_request\", TurnRequestData>;\nexport type TurnResponseEvent = EngineEvent<\"turn_response\", TurnResponseData>;\n\n/**\n * AgentTurnEvent - All lightweight turn events\n */\nexport type AgentTurnEvent = TurnRequestEvent | TurnResponseEvent;\n\n/**\n * Type guard: is this a turn event?\n */\nexport function isTurnEvent(event: EngineEvent): event is AgentTurnEvent {\n const turnTypes = [\"turn_request\", \"turn_response\"];\n return turnTypes.includes(event.type);\n}\n\n// =============================================================================\n// Agent Output\n// =============================================================================\n\n/**\n * AgentOutput - Union of all possible agent output events\n *\n * Includes all event layers:\n * - Stream: Real-time streaming events from Driver\n * - State: State machine transitions\n * - Message: Assembled messages\n * - Turn: Turn analytics\n */\nexport type AgentOutput = StreamEvent | AgentStateEvent | AgentMessageEvent | AgentTurnEvent;\n\n// =============================================================================\n// Event Handling Types\n// =============================================================================\n\n/**\n * Unsubscribe function returned by on()\n */\nexport type Unsubscribe = () => void;\n\n/**\n * Agent output event callback function type\n */\nexport type AgentOutputCallback<T extends AgentOutput = AgentOutput> = (event: T) => void;\n\n/**\n * @deprecated Use AgentOutputCallback instead\n */\nexport type AgentEventHandler<T extends AgentOutput = AgentOutput> = AgentOutputCallback<T>;\n"],"mappings":";AAmVO,SAAS,aAAa,OAA8C;AACzE,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,WAAW,SAAS,MAAM,IAAI;AACvC;AAiCO,SAAS,eAAe,OAAgD;AAC7E,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,aAAa,SAAS,MAAM,IAAI;AACzC;AA4CO,SAAS,YAAY,OAA6C;AACvE,QAAM,YAAY,CAAC,gBAAgB,eAAe;AAClD,SAAO,UAAU,SAAS,MAAM,IAAI;AACtC;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/common/index.ts"],"sourcesContent":["/**\n * Common utilities module\n *\n * Re-exports from commonxjs for backward compatibility.\n * Prefer importing directly from \"commonxjs/logger\".\n */\n\nexport * from \"commonxjs/logger\";\n"],"mappings":";AAOA,cAAc;","names":[]}
|