@agentxjs/devtools 1.9.5-dev → 1.9.6-dev
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-6OHXS7LW.js +297 -0
- package/dist/chunk-6OHXS7LW.js.map +1 -0
- package/dist/chunk-SQDCFUA3.js +293 -0
- package/dist/chunk-SQDCFUA3.js.map +1 -0
- package/dist/chunk-YRTTCKHM.js +152 -0
- package/dist/chunk-YRTTCKHM.js.map +1 -0
- package/dist/fixtures/index.d.ts +49 -0
- package/dist/fixtures/index.js +21 -0
- package/dist/fixtures/index.js.map +1 -0
- package/dist/index.d.ts +207 -0
- package/dist/index.js +273 -0
- package/dist/index.js.map +1 -0
- package/dist/mock/index.d.ts +115 -0
- package/dist/mock/index.js +10 -0
- package/dist/mock/index.js.map +1 -0
- package/dist/recorder/index.d.ts +120 -0
- package/dist/recorder/index.js +9 -0
- package/dist/recorder/index.js.map +1 -0
- package/dist/types-C6Lf3vz2.d.ts +78 -0
- package/package.json +40 -7
- package/scripts/record-fixture.ts +0 -148
- package/tsconfig.json +0 -10
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
// fixtures/index.ts
|
|
2
|
+
var SIMPLE_REPLY = {
|
|
3
|
+
name: "simple-reply",
|
|
4
|
+
description: "Simple text response without tool calls",
|
|
5
|
+
events: [
|
|
6
|
+
{
|
|
7
|
+
type: "message_start",
|
|
8
|
+
delay: 0,
|
|
9
|
+
data: {
|
|
10
|
+
message: {
|
|
11
|
+
id: "msg_mock_001",
|
|
12
|
+
model: "claude-mock"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
type: "text_content_block_start",
|
|
18
|
+
delay: 5,
|
|
19
|
+
index: 0,
|
|
20
|
+
data: {}
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
type: "text_delta",
|
|
24
|
+
delay: 5,
|
|
25
|
+
data: { text: "Hello! " }
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
type: "text_delta",
|
|
29
|
+
delay: 10,
|
|
30
|
+
data: { text: "How can I " }
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
type: "text_delta",
|
|
34
|
+
delay: 10,
|
|
35
|
+
data: { text: "help you " }
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
type: "text_delta",
|
|
39
|
+
delay: 10,
|
|
40
|
+
data: { text: "today?" }
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
type: "text_content_block_stop",
|
|
44
|
+
delay: 5,
|
|
45
|
+
index: 0,
|
|
46
|
+
data: {}
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
type: "message_stop",
|
|
50
|
+
delay: 5,
|
|
51
|
+
data: {
|
|
52
|
+
stopReason: "end_turn"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
};
|
|
57
|
+
var LONG_REPLY = {
|
|
58
|
+
name: "long-reply",
|
|
59
|
+
description: "Longer multi-sentence response",
|
|
60
|
+
events: [
|
|
61
|
+
{
|
|
62
|
+
type: "message_start",
|
|
63
|
+
delay: 0,
|
|
64
|
+
data: {
|
|
65
|
+
message: {
|
|
66
|
+
id: "msg_mock_002",
|
|
67
|
+
model: "claude-mock"
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
type: "text_content_block_start",
|
|
73
|
+
delay: 5,
|
|
74
|
+
index: 0,
|
|
75
|
+
data: {}
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
type: "text_delta",
|
|
79
|
+
delay: 5,
|
|
80
|
+
data: { text: "I'd be happy to help you with that!\n\n" }
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
type: "text_delta",
|
|
84
|
+
delay: 10,
|
|
85
|
+
data: { text: "Here's what I can do:\n" }
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
type: "text_delta",
|
|
89
|
+
delay: 10,
|
|
90
|
+
data: { text: "1. Answer your questions\n" }
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
type: "text_delta",
|
|
94
|
+
delay: 10,
|
|
95
|
+
data: { text: "2. Help with coding tasks\n" }
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
type: "text_delta",
|
|
99
|
+
delay: 10,
|
|
100
|
+
data: { text: "3. Assist with writing\n\n" }
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
type: "text_delta",
|
|
104
|
+
delay: 10,
|
|
105
|
+
data: { text: "What would you like to work on?" }
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
type: "text_content_block_stop",
|
|
109
|
+
delay: 5,
|
|
110
|
+
index: 0,
|
|
111
|
+
data: {}
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
type: "message_stop",
|
|
115
|
+
delay: 5,
|
|
116
|
+
data: {
|
|
117
|
+
stopReason: "end_turn"
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
]
|
|
121
|
+
};
|
|
122
|
+
var TOOL_CALL = {
|
|
123
|
+
name: "tool-call",
|
|
124
|
+
description: "Response that includes a tool call",
|
|
125
|
+
events: [
|
|
126
|
+
{
|
|
127
|
+
type: "message_start",
|
|
128
|
+
delay: 0,
|
|
129
|
+
data: {
|
|
130
|
+
message: {
|
|
131
|
+
id: "msg_mock_003",
|
|
132
|
+
model: "claude-mock"
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
type: "text_content_block_start",
|
|
138
|
+
delay: 5,
|
|
139
|
+
index: 0,
|
|
140
|
+
data: {}
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: "text_delta",
|
|
144
|
+
delay: 5,
|
|
145
|
+
data: { text: "Let me check that for you." }
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
type: "text_content_block_stop",
|
|
149
|
+
delay: 5,
|
|
150
|
+
index: 0,
|
|
151
|
+
data: {}
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
type: "tool_use_content_block_start",
|
|
155
|
+
delay: 10,
|
|
156
|
+
index: 1,
|
|
157
|
+
data: {
|
|
158
|
+
id: "tool_001",
|
|
159
|
+
name: "get_current_time"
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
type: "input_json_delta",
|
|
164
|
+
delay: 5,
|
|
165
|
+
index: 1,
|
|
166
|
+
data: { partialJson: "{" }
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
type: "input_json_delta",
|
|
170
|
+
delay: 5,
|
|
171
|
+
index: 1,
|
|
172
|
+
data: { partialJson: '"timezone":' }
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
type: "input_json_delta",
|
|
176
|
+
delay: 5,
|
|
177
|
+
index: 1,
|
|
178
|
+
data: { partialJson: '"UTC"' }
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
type: "input_json_delta",
|
|
182
|
+
delay: 5,
|
|
183
|
+
index: 1,
|
|
184
|
+
data: { partialJson: "}" }
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
type: "tool_use_content_block_stop",
|
|
188
|
+
delay: 5,
|
|
189
|
+
index: 1,
|
|
190
|
+
data: {}
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: "message_stop",
|
|
194
|
+
delay: 5,
|
|
195
|
+
data: {
|
|
196
|
+
stopReason: "tool_use"
|
|
197
|
+
}
|
|
198
|
+
},
|
|
199
|
+
// After tool result, continue with text
|
|
200
|
+
{
|
|
201
|
+
type: "message_start",
|
|
202
|
+
delay: 50,
|
|
203
|
+
data: {
|
|
204
|
+
message: {
|
|
205
|
+
id: "msg_mock_003b",
|
|
206
|
+
model: "claude-mock"
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
type: "text_content_block_start",
|
|
212
|
+
delay: 5,
|
|
213
|
+
index: 0,
|
|
214
|
+
data: {}
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
type: "text_delta",
|
|
218
|
+
delay: 5,
|
|
219
|
+
data: { text: "The current time is 2:30 PM UTC." }
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
type: "text_content_block_stop",
|
|
223
|
+
delay: 5,
|
|
224
|
+
index: 0,
|
|
225
|
+
data: {}
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
type: "message_stop",
|
|
229
|
+
delay: 5,
|
|
230
|
+
data: {
|
|
231
|
+
stopReason: "end_turn"
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
]
|
|
235
|
+
};
|
|
236
|
+
var ERROR_RESPONSE = {
|
|
237
|
+
name: "error",
|
|
238
|
+
description: "Simulates an API error",
|
|
239
|
+
events: [
|
|
240
|
+
{
|
|
241
|
+
type: "error_received",
|
|
242
|
+
delay: 50,
|
|
243
|
+
data: {
|
|
244
|
+
message: "Rate limit exceeded. Please try again later.",
|
|
245
|
+
errorCode: "rate_limit_error"
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
]
|
|
249
|
+
};
|
|
250
|
+
var EMPTY_RESPONSE = {
|
|
251
|
+
name: "empty",
|
|
252
|
+
description: "Empty response with no content",
|
|
253
|
+
events: [
|
|
254
|
+
{
|
|
255
|
+
type: "message_start",
|
|
256
|
+
delay: 0,
|
|
257
|
+
data: {
|
|
258
|
+
message: {
|
|
259
|
+
id: "msg_mock_empty",
|
|
260
|
+
model: "claude-mock"
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
type: "message_stop",
|
|
266
|
+
delay: 5,
|
|
267
|
+
data: {
|
|
268
|
+
stopReason: "end_turn"
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
]
|
|
272
|
+
};
|
|
273
|
+
var BUILTIN_FIXTURES = /* @__PURE__ */ new Map([
|
|
274
|
+
["simple-reply", SIMPLE_REPLY],
|
|
275
|
+
["long-reply", LONG_REPLY],
|
|
276
|
+
["tool-call", TOOL_CALL],
|
|
277
|
+
["error", ERROR_RESPONSE],
|
|
278
|
+
["empty", EMPTY_RESPONSE]
|
|
279
|
+
]);
|
|
280
|
+
function getFixture(name) {
|
|
281
|
+
return BUILTIN_FIXTURES.get(name);
|
|
282
|
+
}
|
|
283
|
+
function listFixtures() {
|
|
284
|
+
return Array.from(BUILTIN_FIXTURES.keys());
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
export {
|
|
288
|
+
SIMPLE_REPLY,
|
|
289
|
+
LONG_REPLY,
|
|
290
|
+
TOOL_CALL,
|
|
291
|
+
ERROR_RESPONSE,
|
|
292
|
+
EMPTY_RESPONSE,
|
|
293
|
+
BUILTIN_FIXTURES,
|
|
294
|
+
getFixture,
|
|
295
|
+
listFixtures
|
|
296
|
+
};
|
|
297
|
+
//# sourceMappingURL=chunk-6OHXS7LW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../fixtures/index.ts"],"sourcesContent":["/**\n * Built-in Fixtures for MockDriver\n *\n * These fixtures simulate common conversation patterns.\n * They can be used directly or as templates for custom fixtures.\n */\n\nimport type { Fixture } from \"../src/types\";\n\n/**\n * Simple text reply - no tool calls\n *\n * Simulates: \"Hello!\" -> \"Hello! How can I help you today?\"\n */\nexport const SIMPLE_REPLY: Fixture = {\n name: \"simple-reply\",\n description: \"Simple text response without tool calls\",\n events: [\n {\n type: \"message_start\",\n delay: 0,\n data: {\n message: {\n id: \"msg_mock_001\",\n model: \"claude-mock\",\n },\n },\n },\n {\n type: \"text_content_block_start\",\n delay: 5,\n index: 0,\n data: {},\n },\n {\n type: \"text_delta\",\n delay: 5,\n data: { text: \"Hello! \" },\n },\n {\n type: \"text_delta\",\n delay: 10,\n data: { text: \"How can I \" },\n },\n {\n type: \"text_delta\",\n delay: 10,\n data: { text: \"help you \" },\n },\n {\n type: \"text_delta\",\n delay: 10,\n data: { text: \"today?\" },\n },\n {\n type: \"text_content_block_stop\",\n delay: 5,\n index: 0,\n data: {},\n },\n {\n type: \"message_stop\",\n delay: 5,\n data: {\n stopReason: \"end_turn\",\n },\n },\n ],\n};\n\n/**\n * Multi-paragraph response\n *\n * Simulates a longer response with multiple sentences\n */\nexport const LONG_REPLY: Fixture = {\n name: \"long-reply\",\n description: \"Longer multi-sentence response\",\n events: [\n {\n type: \"message_start\",\n delay: 0,\n data: {\n message: {\n id: \"msg_mock_002\",\n model: \"claude-mock\",\n },\n },\n },\n {\n type: \"text_content_block_start\",\n delay: 5,\n index: 0,\n data: {},\n },\n {\n type: \"text_delta\",\n delay: 5,\n data: { text: \"I'd be happy to help you with that!\\n\\n\" },\n },\n {\n type: \"text_delta\",\n delay: 10,\n data: { text: \"Here's what I can do:\\n\" },\n },\n {\n type: \"text_delta\",\n delay: 10,\n data: { text: \"1. Answer your questions\\n\" },\n },\n {\n type: \"text_delta\",\n delay: 10,\n data: { text: \"2. Help with coding tasks\\n\" },\n },\n {\n type: \"text_delta\",\n delay: 10,\n data: { text: \"3. Assist with writing\\n\\n\" },\n },\n {\n type: \"text_delta\",\n delay: 10,\n data: { text: \"What would you like to work on?\" },\n },\n {\n type: \"text_content_block_stop\",\n delay: 5,\n index: 0,\n data: {},\n },\n {\n type: \"message_stop\",\n delay: 5,\n data: {\n stopReason: \"end_turn\",\n },\n },\n ],\n};\n\n/**\n * Tool call response - demonstrates tool_use flow\n *\n * Simulates: \"What time is it?\" -> tool_call(get_current_time) -> \"It's 2:30 PM\"\n */\nexport const TOOL_CALL: Fixture = {\n name: \"tool-call\",\n description: \"Response that includes a tool call\",\n events: [\n {\n type: \"message_start\",\n delay: 0,\n data: {\n message: {\n id: \"msg_mock_003\",\n model: \"claude-mock\",\n },\n },\n },\n {\n type: \"text_content_block_start\",\n delay: 5,\n index: 0,\n data: {},\n },\n {\n type: \"text_delta\",\n delay: 5,\n data: { text: \"Let me check that for you.\" },\n },\n {\n type: \"text_content_block_stop\",\n delay: 5,\n index: 0,\n data: {},\n },\n {\n type: \"tool_use_content_block_start\",\n delay: 10,\n index: 1,\n data: {\n id: \"tool_001\",\n name: \"get_current_time\",\n },\n },\n {\n type: \"input_json_delta\",\n delay: 5,\n index: 1,\n data: { partialJson: \"{\" },\n },\n {\n type: \"input_json_delta\",\n delay: 5,\n index: 1,\n data: { partialJson: '\"timezone\":' },\n },\n {\n type: \"input_json_delta\",\n delay: 5,\n index: 1,\n data: { partialJson: '\"UTC\"' },\n },\n {\n type: \"input_json_delta\",\n delay: 5,\n index: 1,\n data: { partialJson: \"}\" },\n },\n {\n type: \"tool_use_content_block_stop\",\n delay: 5,\n index: 1,\n data: {},\n },\n {\n type: \"message_stop\",\n delay: 5,\n data: {\n stopReason: \"tool_use\",\n },\n },\n // After tool result, continue with text\n {\n type: \"message_start\",\n delay: 50,\n data: {\n message: {\n id: \"msg_mock_003b\",\n model: \"claude-mock\",\n },\n },\n },\n {\n type: \"text_content_block_start\",\n delay: 5,\n index: 0,\n data: {},\n },\n {\n type: \"text_delta\",\n delay: 5,\n data: { text: \"The current time is 2:30 PM UTC.\" },\n },\n {\n type: \"text_content_block_stop\",\n delay: 5,\n index: 0,\n data: {},\n },\n {\n type: \"message_stop\",\n delay: 5,\n data: {\n stopReason: \"end_turn\",\n },\n },\n ],\n};\n\n/**\n * Error response\n */\nexport const ERROR_RESPONSE: Fixture = {\n name: \"error\",\n description: \"Simulates an API error\",\n events: [\n {\n type: \"error_received\",\n delay: 50,\n data: {\n message: \"Rate limit exceeded. Please try again later.\",\n errorCode: \"rate_limit_error\",\n },\n },\n ],\n};\n\n/**\n * Empty response (for edge case testing)\n */\nexport const EMPTY_RESPONSE: Fixture = {\n name: \"empty\",\n description: \"Empty response with no content\",\n events: [\n {\n type: \"message_start\",\n delay: 0,\n data: {\n message: {\n id: \"msg_mock_empty\",\n model: \"claude-mock\",\n },\n },\n },\n {\n type: \"message_stop\",\n delay: 5,\n data: {\n stopReason: \"end_turn\",\n },\n },\n ],\n};\n\n/**\n * All built-in fixtures\n */\nexport const BUILTIN_FIXTURES: Map<string, Fixture> = new Map([\n [\"simple-reply\", SIMPLE_REPLY],\n [\"long-reply\", LONG_REPLY],\n [\"tool-call\", TOOL_CALL],\n [\"error\", ERROR_RESPONSE],\n [\"empty\", EMPTY_RESPONSE],\n]);\n\n/**\n * Get a built-in fixture by name\n */\nexport function getFixture(name: string): Fixture | undefined {\n return BUILTIN_FIXTURES.get(name);\n}\n\n/**\n * List all built-in fixture names\n */\nexport function listFixtures(): string[] {\n return Array.from(BUILTIN_FIXTURES.keys());\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BUILTIN_FIXTURES
|
|
3
|
+
} from "./chunk-6OHXS7LW.js";
|
|
4
|
+
|
|
5
|
+
// src/mock/MockDriver.ts
|
|
6
|
+
import { createLogger } from "commonxjs/logger";
|
|
7
|
+
var logger = createLogger("devtools/MockDriver");
|
|
8
|
+
var MockDriver = class {
|
|
9
|
+
name = "MockDriver";
|
|
10
|
+
_sessionId = null;
|
|
11
|
+
_state = "idle";
|
|
12
|
+
config;
|
|
13
|
+
options;
|
|
14
|
+
fixtures;
|
|
15
|
+
currentFixture;
|
|
16
|
+
// For interrupt handling
|
|
17
|
+
isInterrupted = false;
|
|
18
|
+
// Event cursor for multi-turn conversations
|
|
19
|
+
eventCursor = 0;
|
|
20
|
+
/**
|
|
21
|
+
* Create a MockDriver
|
|
22
|
+
*
|
|
23
|
+
* @param options - MockDriverOptions or DriverConfig
|
|
24
|
+
* @param mockOptions - MockDriverOptions if first param is DriverConfig
|
|
25
|
+
*/
|
|
26
|
+
constructor(optionsOrConfig, mockOptions) {
|
|
27
|
+
if (mockOptions !== void 0 || "apiKey" in optionsOrConfig) {
|
|
28
|
+
this.config = optionsOrConfig;
|
|
29
|
+
const opts = mockOptions || {};
|
|
30
|
+
this.options = {
|
|
31
|
+
defaultDelay: 10,
|
|
32
|
+
speedMultiplier: 0,
|
|
33
|
+
...opts
|
|
34
|
+
};
|
|
35
|
+
} else {
|
|
36
|
+
this.config = null;
|
|
37
|
+
const opts = optionsOrConfig;
|
|
38
|
+
this.options = {
|
|
39
|
+
defaultDelay: 10,
|
|
40
|
+
speedMultiplier: 0,
|
|
41
|
+
...opts
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
this.fixtures = new Map(BUILTIN_FIXTURES);
|
|
45
|
+
if (this.options.fixtures) {
|
|
46
|
+
for (const [name, fixture] of this.options.fixtures) {
|
|
47
|
+
this.fixtures.set(name, fixture);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
this.currentFixture = this.resolveFixture(this.options.fixture || "simple-reply");
|
|
51
|
+
logger.debug("MockDriver created", {
|
|
52
|
+
fixture: this.currentFixture.name,
|
|
53
|
+
agentId: this.config?.agentId
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// Driver Interface Properties
|
|
58
|
+
// ============================================================================
|
|
59
|
+
get sessionId() {
|
|
60
|
+
return this._sessionId;
|
|
61
|
+
}
|
|
62
|
+
get state() {
|
|
63
|
+
return this._state;
|
|
64
|
+
}
|
|
65
|
+
// ============================================================================
|
|
66
|
+
// Lifecycle Methods
|
|
67
|
+
// ============================================================================
|
|
68
|
+
/**
|
|
69
|
+
* Initialize the Driver
|
|
70
|
+
*/
|
|
71
|
+
async initialize() {
|
|
72
|
+
if (this._state !== "idle") {
|
|
73
|
+
throw new Error(`Cannot initialize: MockDriver is in "${this._state}" state`);
|
|
74
|
+
}
|
|
75
|
+
this._sessionId = `mock-session-${Date.now()}`;
|
|
76
|
+
logger.debug("MockDriver initialized", {
|
|
77
|
+
sessionId: this._sessionId,
|
|
78
|
+
fixture: this.currentFixture.name
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Dispose and cleanup resources
|
|
83
|
+
*/
|
|
84
|
+
async dispose() {
|
|
85
|
+
if (this._state === "disposed") {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
this._state = "disposed";
|
|
89
|
+
this.isInterrupted = true;
|
|
90
|
+
logger.debug("MockDriver disposed");
|
|
91
|
+
}
|
|
92
|
+
// ============================================================================
|
|
93
|
+
// Core Methods
|
|
94
|
+
// ============================================================================
|
|
95
|
+
/**
|
|
96
|
+
* Receive a user message and return stream of events
|
|
97
|
+
*
|
|
98
|
+
* Plays back the current fixture as DriverStreamEvent.
|
|
99
|
+
*
|
|
100
|
+
* @param message - User message (ignored for playback)
|
|
101
|
+
* @returns AsyncIterable of stream events
|
|
102
|
+
*/
|
|
103
|
+
async *receive(_message) {
|
|
104
|
+
if (this._state === "disposed") {
|
|
105
|
+
throw new Error("Cannot receive: MockDriver is disposed");
|
|
106
|
+
}
|
|
107
|
+
if (this._state === "active") {
|
|
108
|
+
throw new Error("Cannot receive: MockDriver is already processing a message");
|
|
109
|
+
}
|
|
110
|
+
this._state = "active";
|
|
111
|
+
this.isInterrupted = false;
|
|
112
|
+
const { speedMultiplier = 0, defaultDelay = 10 } = this.options;
|
|
113
|
+
const events = this.currentFixture.events;
|
|
114
|
+
try {
|
|
115
|
+
while (this.eventCursor < events.length) {
|
|
116
|
+
const fixtureEvent = events[this.eventCursor];
|
|
117
|
+
this.eventCursor++;
|
|
118
|
+
if (this.isInterrupted) {
|
|
119
|
+
yield {
|
|
120
|
+
type: "interrupted",
|
|
121
|
+
timestamp: Date.now(),
|
|
122
|
+
data: { reason: "user" }
|
|
123
|
+
};
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
const delay = fixtureEvent.delay || defaultDelay;
|
|
127
|
+
if (delay > 0 && speedMultiplier > 0) {
|
|
128
|
+
await this.sleep(delay * speedMultiplier);
|
|
129
|
+
}
|
|
130
|
+
const event = this.convertFixtureEvent(fixtureEvent);
|
|
131
|
+
if (event) {
|
|
132
|
+
yield event;
|
|
133
|
+
}
|
|
134
|
+
if (fixtureEvent.type === "message_stop") {
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
} finally {
|
|
139
|
+
this._state = "idle";
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Interrupt current operation
|
|
144
|
+
*/
|
|
145
|
+
interrupt() {
|
|
146
|
+
if (this._state !== "active") {
|
|
147
|
+
logger.debug("Interrupt called but no active operation");
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
logger.debug("MockDriver interrupted");
|
|
151
|
+
this.isInterrupted = true;
|
|
152
|
+
}
|
|
153
|
+
// ============================================================================
|
|
154
|
+
// Fixture Management
|
|
155
|
+
// ============================================================================
|
|
156
|
+
/**
|
|
157
|
+
* Set the fixture to use for next playback
|
|
158
|
+
*/
|
|
159
|
+
setFixture(fixture) {
|
|
160
|
+
this.currentFixture = this.resolveFixture(fixture);
|
|
161
|
+
this.eventCursor = 0;
|
|
162
|
+
logger.debug("Fixture changed", { fixture: this.currentFixture.name });
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Add a custom fixture
|
|
166
|
+
*/
|
|
167
|
+
addFixture(fixture) {
|
|
168
|
+
this.fixtures.set(fixture.name, fixture);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get the current fixture
|
|
172
|
+
*/
|
|
173
|
+
getFixture() {
|
|
174
|
+
return this.currentFixture;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get available fixture names
|
|
178
|
+
*/
|
|
179
|
+
getFixtureNames() {
|
|
180
|
+
return Array.from(this.fixtures.keys());
|
|
181
|
+
}
|
|
182
|
+
// ============================================================================
|
|
183
|
+
// Private Methods
|
|
184
|
+
// ============================================================================
|
|
185
|
+
/**
|
|
186
|
+
* Resolve fixture from name or Fixture object
|
|
187
|
+
*/
|
|
188
|
+
resolveFixture(fixture) {
|
|
189
|
+
if (typeof fixture === "string") {
|
|
190
|
+
const found = this.fixtures.get(fixture);
|
|
191
|
+
if (!found) {
|
|
192
|
+
logger.warn(`Fixture "${fixture}" not found, using "simple-reply"`);
|
|
193
|
+
return this.fixtures.get("simple-reply");
|
|
194
|
+
}
|
|
195
|
+
return found;
|
|
196
|
+
}
|
|
197
|
+
return fixture;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Convert FixtureEvent to DriverStreamEvent
|
|
201
|
+
*/
|
|
202
|
+
convertFixtureEvent(fixtureEvent) {
|
|
203
|
+
const timestamp = Date.now();
|
|
204
|
+
const data = fixtureEvent.data;
|
|
205
|
+
switch (fixtureEvent.type) {
|
|
206
|
+
case "message_start":
|
|
207
|
+
return {
|
|
208
|
+
type: "message_start",
|
|
209
|
+
timestamp,
|
|
210
|
+
data: {
|
|
211
|
+
messageId: data.messageId || `msg_${timestamp}`,
|
|
212
|
+
model: data.model || "mock-model"
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
case "text_delta":
|
|
216
|
+
return {
|
|
217
|
+
type: "text_delta",
|
|
218
|
+
timestamp,
|
|
219
|
+
data: { text: data.text || "" }
|
|
220
|
+
};
|
|
221
|
+
case "tool_use_start":
|
|
222
|
+
return {
|
|
223
|
+
type: "tool_use_start",
|
|
224
|
+
timestamp,
|
|
225
|
+
data: {
|
|
226
|
+
toolCallId: data.toolCallId || `tool_${timestamp}`,
|
|
227
|
+
toolName: data.toolName || ""
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
case "input_json_delta":
|
|
231
|
+
return {
|
|
232
|
+
type: "input_json_delta",
|
|
233
|
+
timestamp,
|
|
234
|
+
data: { partialJson: data.partialJson || "" }
|
|
235
|
+
};
|
|
236
|
+
case "tool_use_stop":
|
|
237
|
+
return {
|
|
238
|
+
type: "tool_use_stop",
|
|
239
|
+
timestamp,
|
|
240
|
+
data: {
|
|
241
|
+
toolCallId: data.toolCallId || "",
|
|
242
|
+
toolName: data.toolName || "",
|
|
243
|
+
input: data.input || {}
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
case "tool_result":
|
|
247
|
+
return {
|
|
248
|
+
type: "tool_result",
|
|
249
|
+
timestamp,
|
|
250
|
+
data: {
|
|
251
|
+
toolCallId: data.toolCallId || "",
|
|
252
|
+
result: data.result,
|
|
253
|
+
isError: data.isError
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
case "message_stop":
|
|
257
|
+
return {
|
|
258
|
+
type: "message_stop",
|
|
259
|
+
timestamp,
|
|
260
|
+
data: {
|
|
261
|
+
stopReason: data.stopReason || "end_turn"
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
case "error":
|
|
265
|
+
return {
|
|
266
|
+
type: "error",
|
|
267
|
+
timestamp,
|
|
268
|
+
data: {
|
|
269
|
+
message: data.message || "Unknown error",
|
|
270
|
+
errorCode: data.errorCode || "mock_error"
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
default:
|
|
274
|
+
logger.debug(`Unknown fixture event type: ${fixtureEvent.type}`);
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Sleep for specified milliseconds
|
|
280
|
+
*/
|
|
281
|
+
sleep(ms) {
|
|
282
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
function createMockDriver(mockOptions = {}) {
|
|
286
|
+
return (config) => new MockDriver(config, mockOptions);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
export {
|
|
290
|
+
MockDriver,
|
|
291
|
+
createMockDriver
|
|
292
|
+
};
|
|
293
|
+
//# sourceMappingURL=chunk-SQDCFUA3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/mock/MockDriver.ts"],"sourcesContent":["/**\n * MockDriver - Mock Driver for Testing\n *\n * Plays back recorded fixtures when receiving messages.\n * Implements the new Driver interface with receive() returning AsyncIterable.\n *\n * Usage:\n * ```typescript\n * const driver = new MockDriver({\n * fixture: \"simple-reply\",\n * });\n *\n * await driver.initialize();\n *\n * for await (const event of driver.receive({ content: \"Hello\" })) {\n * if (event.type === \"text_delta\") {\n * console.log(event.data.text);\n * }\n * }\n *\n * await driver.dispose();\n * ```\n */\n\nimport type {\n Driver,\n DriverConfig,\n DriverState,\n DriverStreamEvent,\n} from \"@agentxjs/core/driver\";\nimport type { UserMessage } from \"@agentxjs/core/agent\";\nimport type { Fixture, FixtureEvent, MockDriverOptions } from \"../types\";\nimport { BUILTIN_FIXTURES } from \"../../fixtures\";\nimport { createLogger } from \"commonxjs/logger\";\n\nconst logger = createLogger(\"devtools/MockDriver\");\n\n/**\n * MockDriver - Playback driver for testing\n *\n * Implements the new Driver interface:\n * - receive() returns AsyncIterable<DriverStreamEvent>\n * - Clear input/output boundaries for testing\n */\nexport class MockDriver implements Driver {\n readonly name = \"MockDriver\";\n\n private _sessionId: string | null = null;\n private _state: DriverState = \"idle\";\n\n private readonly config: DriverConfig | null;\n private readonly options: MockDriverOptions;\n private readonly fixtures: Map<string, Fixture>;\n private currentFixture: Fixture;\n\n // For interrupt handling\n private isInterrupted = false;\n\n // Event cursor for multi-turn conversations\n private eventCursor = 0;\n\n /**\n * Create a MockDriver\n *\n * @param options - MockDriverOptions or DriverConfig\n * @param mockOptions - MockDriverOptions if first param is DriverConfig\n */\n constructor(\n optionsOrConfig: MockDriverOptions | DriverConfig,\n mockOptions?: MockDriverOptions\n ) {\n // Detect which constructor form is being used\n if (mockOptions !== undefined || \"apiKey\" in optionsOrConfig) {\n // Factory mode: (DriverConfig, MockDriverOptions)\n this.config = optionsOrConfig as DriverConfig;\n const opts = mockOptions || {};\n this.options = {\n defaultDelay: 10,\n speedMultiplier: 0,\n ...opts,\n };\n } else {\n // Simple mode: (MockDriverOptions)\n this.config = null;\n const opts = optionsOrConfig as MockDriverOptions;\n this.options = {\n defaultDelay: 10,\n speedMultiplier: 0,\n ...opts,\n };\n }\n\n // Initialize fixtures\n this.fixtures = new Map(BUILTIN_FIXTURES);\n if (this.options.fixtures) {\n for (const [name, fixture] of this.options.fixtures) {\n this.fixtures.set(name, fixture);\n }\n }\n\n // Set initial fixture\n this.currentFixture = this.resolveFixture(this.options.fixture || \"simple-reply\");\n\n logger.debug(\"MockDriver created\", {\n fixture: this.currentFixture.name,\n agentId: this.config?.agentId,\n });\n }\n\n // ============================================================================\n // Driver Interface Properties\n // ============================================================================\n\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n get state(): DriverState {\n return this._state;\n }\n\n // ============================================================================\n // Lifecycle Methods\n // ============================================================================\n\n /**\n * Initialize the Driver\n */\n async initialize(): Promise<void> {\n if (this._state !== \"idle\") {\n throw new Error(`Cannot initialize: MockDriver is in \"${this._state}\" state`);\n }\n\n // Generate a mock session ID\n this._sessionId = `mock-session-${Date.now()}`;\n\n logger.debug(\"MockDriver initialized\", {\n sessionId: this._sessionId,\n fixture: this.currentFixture.name,\n });\n }\n\n /**\n * Dispose and cleanup resources\n */\n async dispose(): Promise<void> {\n if (this._state === \"disposed\") {\n return;\n }\n\n this._state = \"disposed\";\n this.isInterrupted = true;\n\n logger.debug(\"MockDriver disposed\");\n }\n\n // ============================================================================\n // Core Methods\n // ============================================================================\n\n /**\n * Receive a user message and return stream of events\n *\n * Plays back the current fixture as DriverStreamEvent.\n *\n * @param message - User message (ignored for playback)\n * @returns AsyncIterable of stream events\n */\n async *receive(_message: UserMessage): AsyncIterable<DriverStreamEvent> {\n if (this._state === \"disposed\") {\n throw new Error(\"Cannot receive: MockDriver is disposed\");\n }\n\n if (this._state === \"active\") {\n throw new Error(\"Cannot receive: MockDriver is already processing a message\");\n }\n\n this._state = \"active\";\n this.isInterrupted = false;\n\n const { speedMultiplier = 0, defaultDelay = 10 } = this.options;\n const events = this.currentFixture.events;\n\n try {\n // Start from cursor position and play until message_stop\n while (this.eventCursor < events.length) {\n const fixtureEvent = events[this.eventCursor];\n this.eventCursor++;\n\n // Check for interrupt\n if (this.isInterrupted) {\n yield {\n type: \"interrupted\",\n timestamp: Date.now(),\n data: { reason: \"user\" },\n };\n break;\n }\n\n // Apply delay\n const delay = fixtureEvent.delay || defaultDelay;\n if (delay > 0 && speedMultiplier > 0) {\n await this.sleep(delay * speedMultiplier);\n }\n\n // Convert and yield event\n const event = this.convertFixtureEvent(fixtureEvent);\n if (event) {\n yield event;\n }\n\n // Stop at message_stop (end of one turn)\n if (fixtureEvent.type === \"message_stop\") {\n break;\n }\n }\n } finally {\n this._state = \"idle\";\n }\n }\n\n /**\n * Interrupt current operation\n */\n interrupt(): void {\n if (this._state !== \"active\") {\n logger.debug(\"Interrupt called but no active operation\");\n return;\n }\n\n logger.debug(\"MockDriver interrupted\");\n this.isInterrupted = true;\n }\n\n // ============================================================================\n // Fixture Management\n // ============================================================================\n\n /**\n * Set the fixture to use for next playback\n */\n setFixture(fixture: string | Fixture): void {\n this.currentFixture = this.resolveFixture(fixture);\n this.eventCursor = 0; // Reset cursor when fixture changes\n logger.debug(\"Fixture changed\", { fixture: this.currentFixture.name });\n }\n\n /**\n * Add a custom fixture\n */\n addFixture(fixture: Fixture): void {\n this.fixtures.set(fixture.name, fixture);\n }\n\n /**\n * Get the current fixture\n */\n getFixture(): Fixture {\n return this.currentFixture;\n }\n\n /**\n * Get available fixture names\n */\n getFixtureNames(): string[] {\n return Array.from(this.fixtures.keys());\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n /**\n * Resolve fixture from name or Fixture object\n */\n private resolveFixture(fixture: string | Fixture): Fixture {\n if (typeof fixture === \"string\") {\n const found = this.fixtures.get(fixture);\n if (!found) {\n logger.warn(`Fixture \"${fixture}\" not found, using \"simple-reply\"`);\n return this.fixtures.get(\"simple-reply\")!;\n }\n return found;\n }\n return fixture;\n }\n\n /**\n * Convert FixtureEvent to DriverStreamEvent\n */\n private convertFixtureEvent(fixtureEvent: FixtureEvent): DriverStreamEvent | null {\n const timestamp = Date.now();\n const data = fixtureEvent.data as Record<string, unknown>;\n\n switch (fixtureEvent.type) {\n case \"message_start\":\n return {\n type: \"message_start\",\n timestamp,\n data: {\n messageId: (data.messageId as string) || `msg_${timestamp}`,\n model: (data.model as string) || \"mock-model\",\n },\n };\n\n case \"text_delta\":\n return {\n type: \"text_delta\",\n timestamp,\n data: { text: (data.text as string) || \"\" },\n };\n\n case \"tool_use_start\":\n return {\n type: \"tool_use_start\",\n timestamp,\n data: {\n toolCallId: (data.toolCallId as string) || `tool_${timestamp}`,\n toolName: (data.toolName as string) || \"\",\n },\n };\n\n case \"input_json_delta\":\n return {\n type: \"input_json_delta\",\n timestamp,\n data: { partialJson: (data.partialJson as string) || \"\" },\n };\n\n case \"tool_use_stop\":\n return {\n type: \"tool_use_stop\",\n timestamp,\n data: {\n toolCallId: (data.toolCallId as string) || \"\",\n toolName: (data.toolName as string) || \"\",\n input: (data.input as Record<string, unknown>) || {},\n },\n };\n\n case \"tool_result\":\n return {\n type: \"tool_result\",\n timestamp,\n data: {\n toolCallId: (data.toolCallId as string) || \"\",\n result: data.result,\n isError: data.isError as boolean | undefined,\n },\n };\n\n case \"message_stop\":\n return {\n type: \"message_stop\",\n timestamp,\n data: {\n stopReason: (data.stopReason as \"end_turn\" | \"tool_use\" | \"max_tokens\" | \"stop_sequence\" | \"other\") || \"end_turn\",\n },\n };\n\n case \"error\":\n return {\n type: \"error\",\n timestamp,\n data: {\n message: (data.message as string) || \"Unknown error\",\n errorCode: (data.errorCode as string) || \"mock_error\",\n },\n };\n\n default:\n // Pass through unknown events with generic structure\n logger.debug(`Unknown fixture event type: ${fixtureEvent.type}`);\n return null;\n }\n }\n\n /**\n * Sleep for specified milliseconds\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\n/**\n * Create a MockDriver factory function\n *\n * Returns a CreateDriver-compatible function.\n *\n * @param mockOptions - Options for all created drivers\n * @returns CreateDriver function\n */\nexport function createMockDriver(mockOptions: MockDriverOptions = {}): (config: DriverConfig) => Driver {\n return (config: DriverConfig) => new MockDriver(config, mockOptions);\n}\n"],"mappings":"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","names":[]}
|