@agentteams/runner 0.0.84 → 0.0.85-dev.209
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/api-client.d.ts +2 -2
- package/dist/api-client.js +66 -66
- package/dist/api-client.js.map +1 -1
- package/dist/api-client.test.js +63 -54
- package/dist/api-client.test.js.map +1 -1
- package/dist/autostart.js +81 -81
- package/dist/autostart.js.map +1 -1
- package/dist/autostart.test.js +35 -35
- package/dist/autostart.test.js.map +1 -1
- package/dist/commands/cleanup.js +4 -4
- package/dist/commands/init.js +14 -14
- package/dist/commands/restart.js +3 -3
- package/dist/commands/start.js +10 -10
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.js +7 -7
- package/dist/commands/stop.js +7 -7
- package/dist/commands/uninstall.js +6 -6
- package/dist/commands/update.d.ts +4 -4
- package/dist/commands/update.js +20 -22
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/update.test.js +38 -42
- package/dist/commands/update.test.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +12 -12
- package/dist/config.test.js +61 -61
- package/dist/config.test.js.map +1 -1
- package/dist/daemon-control.d.ts +5 -5
- package/dist/daemon-control.js +21 -22
- package/dist/daemon-control.js.map +1 -1
- package/dist/daemon-control.test.js +29 -29
- package/dist/executable.d.ts +3 -3
- package/dist/executable.js +46 -49
- package/dist/executable.js.map +1 -1
- package/dist/executable.test.js +62 -62
- package/dist/executable.test.js.map +1 -1
- package/dist/handlers/trigger-handler.d.ts +6 -6
- package/dist/handlers/trigger-handler.js +172 -134
- package/dist/handlers/trigger-handler.js.map +1 -1
- package/dist/handlers/trigger-handler.test.js +442 -328
- package/dist/handlers/trigger-handler.test.js.map +1 -1
- package/dist/index.js +25 -25
- package/dist/logger.js +1 -1
- package/dist/pid.js +6 -6
- package/dist/poller.d.ts +7 -7
- package/dist/poller.js +54 -53
- package/dist/poller.js.map +1 -1
- package/dist/poller.test.js +209 -181
- package/dist/poller.test.js.map +1 -1
- package/dist/runners/amp.d.ts +1 -1
- package/dist/runners/amp.js +74 -81
- package/dist/runners/amp.js.map +1 -1
- package/dist/runners/antigravity.d.ts +3 -3
- package/dist/runners/antigravity.js +116 -127
- package/dist/runners/antigravity.js.map +1 -1
- package/dist/runners/antigravity.replay.test.js +25 -25
- package/dist/runners/antigravity.replay.test.js.map +1 -1
- package/dist/runners/antigravity.test.js +98 -98
- package/dist/runners/antigravity.test.js.map +1 -1
- package/dist/runners/claude-code.d.ts +1 -1
- package/dist/runners/claude-code.js +85 -84
- package/dist/runners/claude-code.js.map +1 -1
- package/dist/runners/claude-code.test.js +37 -40
- package/dist/runners/claude-code.test.js.map +1 -1
- package/dist/runners/codex.d.ts +1 -1
- package/dist/runners/codex.js +87 -96
- package/dist/runners/codex.js.map +1 -1
- package/dist/runners/codex.test.js +68 -68
- package/dist/runners/codex.test.js.map +1 -1
- package/dist/runners/index.d.ts +1 -1
- package/dist/runners/index.js +10 -10
- package/dist/runners/index.test.js +16 -16
- package/dist/runners/log-reporter.d.ts +2 -2
- package/dist/runners/log-reporter.js +12 -10
- package/dist/runners/log-reporter.js.map +1 -1
- package/dist/runners/log-reporter.test.js +70 -70
- package/dist/runners/log-reporter.test.js.map +1 -1
- package/dist/runners/opencode.d.ts +1 -1
- package/dist/runners/opencode.js +68 -75
- package/dist/runners/opencode.js.map +1 -1
- package/dist/runners/process-control.d.ts +1 -1
- package/dist/runners/process-control.js +13 -11
- package/dist/runners/process-control.js.map +1 -1
- package/dist/runners/stream-json-parser.d.ts +1 -1
- package/dist/runners/stream-json-parser.js +70 -67
- package/dist/runners/stream-json-parser.js.map +1 -1
- package/dist/runners/stream-json-parser.replay.test.js +17 -17
- package/dist/runners/stream-json-parser.replay.test.js.map +1 -1
- package/dist/runners/stream-json-parser.test.js +76 -78
- package/dist/runners/stream-json-parser.test.js.map +1 -1
- package/dist/types.d.ts +4 -4
- package/dist/utils/auth-path-store.js +7 -7
- package/dist/utils/auth-path-store.test.js +24 -29
- package/dist/utils/auth-path-store.test.js.map +1 -1
- package/dist/utils/auto-update.d.ts +4 -4
- package/dist/utils/auto-update.js +30 -28
- package/dist/utils/auto-update.js.map +1 -1
- package/dist/utils/auto-update.test.js +30 -30
- package/dist/utils/convention-evaluator.d.ts +1 -1
- package/dist/utils/convention-evaluator.js +22 -21
- package/dist/utils/convention-evaluator.js.map +1 -1
- package/dist/utils/convention-evaluator.test.js +120 -110
- package/dist/utils/convention-evaluator.test.js.map +1 -1
- package/dist/utils/convention-sync.d.ts +3 -3
- package/dist/utils/convention-sync.js +10 -10
- package/dist/utils/convention-sync.test.js +43 -25
- package/dist/utils/convention-sync.test.js.map +1 -1
- package/dist/utils/git-worktree.js +20 -18
- package/dist/utils/git-worktree.js.map +1 -1
- package/dist/utils/git-worktree.test.js +98 -98
- package/dist/utils/git-worktree.test.js.map +1 -1
- package/dist/utils/origin-issue-safeguard.js +35 -30
- package/dist/utils/origin-issue-safeguard.js.map +1 -1
- package/dist/utils/power-save-blocker.d.ts +4 -4
- package/dist/utils/power-save-blocker.js +33 -33
- package/dist/utils/power-save-blocker.test.js +37 -37
- package/dist/utils/power-save-blocker.test.js.map +1 -1
- package/dist/utils/runner-cleanup.d.ts +3 -3
- package/dist/utils/runner-cleanup.js +13 -13
- package/dist/utils/runner-cleanup.test.js +35 -35
- package/dist/utils/runner-history.js +3 -3
- package/dist/utils/runner-history.test.js +17 -17
- package/package.json +9 -2
- package/readme.md +10 -10
|
@@ -6,93 +6,93 @@ const THINKING_PREVIEW_MAX = 300;
|
|
|
6
6
|
const TEXT_PREVIEW_MAX = 160;
|
|
7
7
|
const TOOL_PREVIEW_MAX = 120;
|
|
8
8
|
const BASH_PREVIEW_MAX = 100;
|
|
9
|
-
const truncate = (text, max) => text.length <= max ? text : `${text.slice(0, max)}
|
|
9
|
+
const truncate = (text, max) => (text.length <= max ? text : `${text.slice(0, max)}...`);
|
|
10
10
|
const isVerboseEnabled = (options) => {
|
|
11
|
-
if (options && typeof options.verbose ===
|
|
11
|
+
if (options && typeof options.verbose === 'boolean') {
|
|
12
12
|
return options.verbose;
|
|
13
13
|
}
|
|
14
|
-
return process.env.AGENTTEAMS_RUNNER_VERBOSE ===
|
|
14
|
+
return process.env.AGENTTEAMS_RUNNER_VERBOSE === '1';
|
|
15
15
|
};
|
|
16
16
|
export const shortenPath = (path, cwd) => {
|
|
17
17
|
if (!path) {
|
|
18
|
-
return
|
|
18
|
+
return '';
|
|
19
19
|
}
|
|
20
20
|
if (cwd && path.startsWith(cwd)) {
|
|
21
|
-
const relative = path.slice(cwd.length).replace(/^\/+/,
|
|
21
|
+
const relative = path.slice(cwd.length).replace(/^\/+/, '');
|
|
22
22
|
return relative.length > 0 ? relative : path;
|
|
23
23
|
}
|
|
24
24
|
return path;
|
|
25
25
|
};
|
|
26
26
|
export const firstSentence = (text, cap = TEXT_PREVIEW_MAX) => {
|
|
27
|
-
const normalized = text.replace(/\s+/g,
|
|
27
|
+
const normalized = text.replace(/\s+/g, ' ').trim();
|
|
28
28
|
const match = normalized.match(/^.*?[.!?。](?:\s|$)/);
|
|
29
29
|
const candidate = match ? match[0].trim() : normalized;
|
|
30
30
|
return truncate(candidate, cap);
|
|
31
31
|
};
|
|
32
32
|
const stringField = (input, key) => {
|
|
33
33
|
const value = input?.[key];
|
|
34
|
-
return typeof value ===
|
|
34
|
+
return typeof value === 'string' ? value : '';
|
|
35
35
|
};
|
|
36
36
|
export const summarizeToolUse = (name, input, cwd) => {
|
|
37
37
|
const safeInput = input ?? {};
|
|
38
38
|
switch (name) {
|
|
39
|
-
case
|
|
40
|
-
case
|
|
41
|
-
case
|
|
42
|
-
case
|
|
43
|
-
const filePath = stringField(safeInput,
|
|
39
|
+
case 'Read':
|
|
40
|
+
case 'Edit':
|
|
41
|
+
case 'Write':
|
|
42
|
+
case 'NotebookEdit': {
|
|
43
|
+
const filePath = stringField(safeInput, 'file_path');
|
|
44
44
|
return filePath ? `${name}: ${shortenPath(filePath, cwd)}` : name;
|
|
45
45
|
}
|
|
46
|
-
case
|
|
47
|
-
const raw = stringField(safeInput,
|
|
48
|
-
const command = cwd && raw.includes(cwd) ? raw.split(cwd).join(
|
|
49
|
-
return command ? `Bash: ${truncate(command, BASH_PREVIEW_MAX)}` :
|
|
46
|
+
case 'Bash': {
|
|
47
|
+
const raw = stringField(safeInput, 'command').trim().split(/\r?\n/)[0] ?? '';
|
|
48
|
+
const command = cwd && raw.includes(cwd) ? raw.split(cwd).join('.') : raw;
|
|
49
|
+
return command ? `Bash: ${truncate(command, BASH_PREVIEW_MAX)}` : 'Bash';
|
|
50
50
|
}
|
|
51
|
-
case
|
|
52
|
-
const pattern = stringField(safeInput,
|
|
53
|
-
const path = stringField(safeInput,
|
|
54
|
-
const location = path ? ` in ${shortenPath(path, cwd)}` :
|
|
55
|
-
return pattern ? `Grep: "${truncate(pattern, 60)}"${location}` :
|
|
51
|
+
case 'Grep': {
|
|
52
|
+
const pattern = stringField(safeInput, 'pattern');
|
|
53
|
+
const path = stringField(safeInput, 'path');
|
|
54
|
+
const location = path ? ` in ${shortenPath(path, cwd)}` : '';
|
|
55
|
+
return pattern ? `Grep: "${truncate(pattern, 60)}"${location}` : 'Grep';
|
|
56
56
|
}
|
|
57
|
-
case
|
|
58
|
-
const pattern = stringField(safeInput,
|
|
59
|
-
return pattern ? `Glob: ${pattern}` :
|
|
57
|
+
case 'Glob': {
|
|
58
|
+
const pattern = stringField(safeInput, 'pattern');
|
|
59
|
+
return pattern ? `Glob: ${pattern}` : 'Glob';
|
|
60
60
|
}
|
|
61
|
-
case
|
|
62
|
-
const description = stringField(safeInput,
|
|
63
|
-
return description ? `Task: ${truncate(description, 80)}` :
|
|
61
|
+
case 'Task': {
|
|
62
|
+
const description = stringField(safeInput, 'description');
|
|
63
|
+
return description ? `Task: ${truncate(description, 80)}` : 'Task';
|
|
64
64
|
}
|
|
65
|
-
case
|
|
66
|
-
const subject = stringField(safeInput,
|
|
67
|
-
return subject ? `TaskCreate: ${truncate(subject, 80)}` :
|
|
65
|
+
case 'TaskCreate': {
|
|
66
|
+
const subject = stringField(safeInput, 'subject');
|
|
67
|
+
return subject ? `TaskCreate: ${truncate(subject, 80)}` : 'TaskCreate';
|
|
68
68
|
}
|
|
69
|
-
case
|
|
70
|
-
const taskId = stringField(safeInput,
|
|
71
|
-
const status = stringField(safeInput,
|
|
69
|
+
case 'TaskUpdate': {
|
|
70
|
+
const taskId = stringField(safeInput, 'taskId');
|
|
71
|
+
const status = stringField(safeInput, 'status');
|
|
72
72
|
if (taskId && status) {
|
|
73
73
|
return `TaskUpdate: ${taskId} -> ${status}`;
|
|
74
74
|
}
|
|
75
|
-
return taskId ? `TaskUpdate: ${taskId}` :
|
|
75
|
+
return taskId ? `TaskUpdate: ${taskId}` : 'TaskUpdate';
|
|
76
76
|
}
|
|
77
|
-
case
|
|
77
|
+
case 'TodoWrite': {
|
|
78
78
|
const todos = safeInput.todos;
|
|
79
79
|
const count = Array.isArray(todos) ? todos.length : 0;
|
|
80
80
|
return `TodoWrite: ${count} item(s)`;
|
|
81
81
|
}
|
|
82
|
-
case
|
|
83
|
-
const query = stringField(safeInput,
|
|
84
|
-
return query ? `WebSearch: "${truncate(query, 80)}"` :
|
|
82
|
+
case 'WebSearch': {
|
|
83
|
+
const query = stringField(safeInput, 'query');
|
|
84
|
+
return query ? `WebSearch: "${truncate(query, 80)}"` : 'WebSearch';
|
|
85
85
|
}
|
|
86
|
-
case
|
|
87
|
-
const url = stringField(safeInput,
|
|
88
|
-
return url ? `WebFetch: ${truncate(url, 100)}` :
|
|
86
|
+
case 'WebFetch': {
|
|
87
|
+
const url = stringField(safeInput, 'url');
|
|
88
|
+
return url ? `WebFetch: ${truncate(url, 100)}` : 'WebFetch';
|
|
89
89
|
}
|
|
90
|
-
case
|
|
91
|
-
const query = stringField(safeInput,
|
|
92
|
-
return query ? `ToolSearch: ${truncate(query, 80)}` :
|
|
90
|
+
case 'ToolSearch': {
|
|
91
|
+
const query = stringField(safeInput, 'query');
|
|
92
|
+
return query ? `ToolSearch: ${truncate(query, 80)}` : 'ToolSearch';
|
|
93
93
|
}
|
|
94
94
|
default: {
|
|
95
|
-
const keys = Object.keys(safeInput).slice(0, 3).join(
|
|
95
|
+
const keys = Object.keys(safeInput).slice(0, 3).join(',');
|
|
96
96
|
return keys ? `${name}(${keys})` : name;
|
|
97
97
|
}
|
|
98
98
|
}
|
|
@@ -116,43 +116,43 @@ export const parseStreamJsonLine = (line, options) => {
|
|
|
116
116
|
const cwd = options?.cwd;
|
|
117
117
|
const entries = [];
|
|
118
118
|
switch (parsed.type) {
|
|
119
|
-
case
|
|
120
|
-
if (parsed.subtype ===
|
|
119
|
+
case 'system': {
|
|
120
|
+
if (parsed.subtype === 'init') {
|
|
121
121
|
const toolCount = parsed.tools?.length ?? 0;
|
|
122
|
-
const model = parsed.model ??
|
|
123
|
-
entries.push({ level:
|
|
122
|
+
const model = parsed.model ?? 'unknown';
|
|
123
|
+
entries.push({ level: 'INFO', message: `Session initialized (model=${model}, tools=${toolCount})` });
|
|
124
124
|
}
|
|
125
125
|
break;
|
|
126
126
|
}
|
|
127
|
-
case
|
|
127
|
+
case 'assistant': {
|
|
128
128
|
const content = parsed.message?.content;
|
|
129
129
|
if (!Array.isArray(content)) {
|
|
130
130
|
break;
|
|
131
131
|
}
|
|
132
132
|
for (const block of content) {
|
|
133
133
|
switch (block.type) {
|
|
134
|
-
case
|
|
134
|
+
case 'thinking': {
|
|
135
135
|
if (!verbose) {
|
|
136
136
|
break;
|
|
137
137
|
}
|
|
138
138
|
const thinking = block.thinking;
|
|
139
139
|
if (thinking && thinking.trim().length > 0) {
|
|
140
|
-
entries.push({ level:
|
|
140
|
+
entries.push({ level: 'INFO', message: `[Thinking] ${truncate(thinking.trim(), THINKING_PREVIEW_MAX)}` });
|
|
141
141
|
}
|
|
142
142
|
break;
|
|
143
143
|
}
|
|
144
|
-
case
|
|
144
|
+
case 'text': {
|
|
145
145
|
const text = block.text;
|
|
146
146
|
if (text && text.trim().length > 0) {
|
|
147
|
-
entries.push({ level:
|
|
147
|
+
entries.push({ level: 'INFO', message: firstSentence(text) });
|
|
148
148
|
}
|
|
149
149
|
break;
|
|
150
150
|
}
|
|
151
|
-
case
|
|
151
|
+
case 'tool_use': {
|
|
152
152
|
const toolBlock = block;
|
|
153
|
-
const name = toolBlock.name ??
|
|
153
|
+
const name = toolBlock.name ?? 'unknown';
|
|
154
154
|
const summary = truncate(summarizeToolUse(name, toolBlock.input, cwd), TOOL_PREVIEW_MAX);
|
|
155
|
-
entries.push({ level:
|
|
155
|
+
entries.push({ level: 'INFO', message: `[Tool] ${summary}` });
|
|
156
156
|
break;
|
|
157
157
|
}
|
|
158
158
|
default:
|
|
@@ -161,15 +161,18 @@ export const parseStreamJsonLine = (line, options) => {
|
|
|
161
161
|
}
|
|
162
162
|
break;
|
|
163
163
|
}
|
|
164
|
-
case
|
|
165
|
-
const duration = parsed.duration_ms ? `${Math.round(parsed.duration_ms / 1000)}s` :
|
|
164
|
+
case 'result': {
|
|
165
|
+
const duration = parsed.duration_ms ? `${Math.round(parsed.duration_ms / 1000)}s` : 'unknown';
|
|
166
166
|
const turns = parsed.num_turns ?? 0;
|
|
167
167
|
if (parsed.is_error) {
|
|
168
|
-
const result = parsed.result ??
|
|
169
|
-
entries.push({
|
|
168
|
+
const result = parsed.result ?? 'Unknown error';
|
|
169
|
+
entries.push({
|
|
170
|
+
level: 'WARN',
|
|
171
|
+
message: `[Result] Error after ${duration} (${turns} turns): ${truncate(result, 300)}`,
|
|
172
|
+
});
|
|
170
173
|
}
|
|
171
174
|
else {
|
|
172
|
-
entries.push({ level:
|
|
175
|
+
entries.push({ level: 'INFO', message: `[Result] Completed in ${duration} (${turns} turns)` });
|
|
173
176
|
}
|
|
174
177
|
break;
|
|
175
178
|
}
|
|
@@ -183,12 +186,12 @@ export const parseStreamJsonLine = (line, options) => {
|
|
|
183
186
|
* Stream data may arrive as partial lines, so this buffers until newlines.
|
|
184
187
|
*/
|
|
185
188
|
export const createStreamJsonLineParser = (onEntries, options) => {
|
|
186
|
-
let buffer =
|
|
189
|
+
let buffer = '';
|
|
187
190
|
return {
|
|
188
191
|
push(chunk) {
|
|
189
192
|
buffer += chunk;
|
|
190
|
-
const lines = buffer.split(
|
|
191
|
-
buffer = lines.pop() ??
|
|
193
|
+
const lines = buffer.split('\n');
|
|
194
|
+
buffer = lines.pop() ?? '';
|
|
192
195
|
for (const line of lines) {
|
|
193
196
|
const entries = parseStreamJsonLine(line, options);
|
|
194
197
|
if (entries.length > 0) {
|
|
@@ -203,8 +206,8 @@ export const createStreamJsonLineParser = (onEntries, options) => {
|
|
|
203
206
|
onEntries(entries);
|
|
204
207
|
}
|
|
205
208
|
}
|
|
206
|
-
buffer =
|
|
207
|
-
}
|
|
209
|
+
buffer = '';
|
|
210
|
+
},
|
|
208
211
|
};
|
|
209
212
|
};
|
|
210
213
|
//# sourceMappingURL=stream-json-parser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-json-parser.js","sourceRoot":"","sources":["../../src/runners/stream-json-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6BH,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,GAAW,EAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"stream-json-parser.js","sourceRoot":"","sources":["../../src/runners/stream-json-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6BH,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,GAAW,EAAU,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;AAEjH,MAAM,gBAAgB,GAAG,CAAC,OAAsB,EAAW,EAAE;IAC3D,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACpD,OAAO,OAAO,CAAC,OAAO,CAAC;IACzB,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,GAAG,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,GAAY,EAAU,EAAE;IAChE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC5D,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,MAAc,gBAAgB,EAAU,EAAE;IACpF,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;IACvD,OAAO,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,KAA0C,EAAE,GAAW,EAAU,EAAE;IACtF,MAAM,KAAK,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,KAA0C,EAAE,GAAY,EAAU,EAAE;IACjH,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE,CAAC;IAE9B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACrD,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACpE,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7E,MAAM,OAAO,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC1E,OAAO,OAAO,CAAC,CAAC,CAAC,SAAS,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3E,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAClD,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,OAAO,OAAO,CAAC,CAAC,CAAC,UAAU,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1E,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAClD,OAAO,OAAO,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAC/C,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YAC1D,OAAO,WAAW,CAAC,CAAC,CAAC,SAAS,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QACrE,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAClD,OAAO,OAAO,CAAC,CAAC,CAAC,eAAe,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;QACzE,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAChD,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;gBACrB,OAAO,eAAe,MAAM,OAAO,MAAM,EAAE,CAAC;YAC9C,CAAC;YACD,OAAO,MAAM,CAAC,CAAC,CAAC,eAAe,MAAM,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;QACzD,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACtD,OAAO,cAAc,KAAK,UAAU,CAAC;QACvC,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,KAAK,CAAC,CAAC,CAAC,eAAe,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;QACrE,CAAC;QAED,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC1C,OAAO,GAAG,CAAC,CAAC,CAAC,aAAa,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;QAC9D,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,KAAK,CAAC,CAAC,CAAC,eAAe,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;QACrE,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1D,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1C,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAE,OAAsB,EAAoB,EAAE;IAC5F,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,MAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,CAAC;IACzB,MAAM,OAAO,GAAqB,EAAE,CAAC;IAErC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;gBAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;gBAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,SAAS,CAAC;gBACxC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,8BAA8B,KAAK,WAAW,SAAS,GAAG,EAAE,CAAC,CAAC;YACvG,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,MAAM;YACR,CAAC;YAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;oBACnB,KAAK,UAAU,CAAC,CAAC,CAAC;wBAChB,IAAI,CAAC,OAAO,EAAE,CAAC;4BACb,MAAM;wBACR,CAAC;wBACD,MAAM,QAAQ,GAAI,KAA+B,CAAC,QAAQ,CAAC;wBAC3D,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC3C,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,oBAAoB,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC5G,CAAC;wBACD,MAAM;oBACR,CAAC;oBACD,KAAK,MAAM,CAAC,CAAC,CAAC;wBACZ,MAAM,IAAI,GAAI,KAA2B,CAAC,IAAI,CAAC;wBAC/C,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACnC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAChE,CAAC;wBACD,MAAM;oBACR,CAAC;oBACD,KAAK,UAAU,CAAC,CAAC,CAAC;wBAChB,MAAM,SAAS,GAAG,KAA2D,CAAC;wBAC9E,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC;wBACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,gBAAgB,CAAC,CAAC;wBACzF,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC,CAAC;wBAC9D,MAAM;oBACR,CAAC;oBACD;wBACE,MAAM;gBACV,CAAC;YACH,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9F,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;YACpC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,eAAe,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC;oBACX,KAAK,EAAE,MAAM;oBACb,OAAO,EAAE,wBAAwB,QAAQ,KAAK,KAAK,YAAY,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;iBACvF,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,yBAAyB,QAAQ,KAAK,KAAK,SAAS,EAAE,CAAC,CAAC;YACjG,CAAC;YACD,MAAM;QACR,CAAC;QAED;YACE,MAAM;IACV,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,SAA8C,EAC9C,OAAsB,EACgC,EAAE;IACxD,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,OAAO;QACL,IAAI,CAAC,KAAa;YAChB,MAAM,IAAI,KAAK,CAAC;YAChB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACnD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,SAAS,CAAC,OAAO,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QACD,KAAK;YACH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBACrD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,SAAS,CAAC,OAAO,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;YACD,MAAM,GAAG,EAAE,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import assert from
|
|
2
|
-
import { readFileSync, existsSync } from
|
|
3
|
-
import { fileURLToPath } from
|
|
4
|
-
import test from
|
|
5
|
-
import { parseStreamJsonLine } from
|
|
6
|
-
const BACKUP_LOG = fileURLToPath(new URL(
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import test from 'node:test';
|
|
5
|
+
import { parseStreamJsonLine } from './stream-json-parser.js';
|
|
6
|
+
const BACKUP_LOG = fileURLToPath(new URL('../../../.agentteams/runner/backup/claude.log', import.meta.url));
|
|
7
7
|
const skipIfMissing = (t) => {
|
|
8
8
|
if (!existsSync(BACKUP_LOG)) {
|
|
9
9
|
t.skip(`Backup log fixture not present at ${BACKUP_LOG}`);
|
|
@@ -12,27 +12,27 @@ const skipIfMissing = (t) => {
|
|
|
12
12
|
return false;
|
|
13
13
|
};
|
|
14
14
|
const collectEntries = (verbose) => {
|
|
15
|
-
const cwd =
|
|
16
|
-
const lines = readFileSync(BACKUP_LOG,
|
|
15
|
+
const cwd = '/Users/justin/Project/Me/AgentTeams';
|
|
16
|
+
const lines = readFileSync(BACKUP_LOG, 'utf8').split(/\r?\n/);
|
|
17
17
|
return lines.flatMap((line) => parseStreamJsonLine(line, { cwd, verbose }));
|
|
18
18
|
};
|
|
19
|
-
test(
|
|
19
|
+
test('backup log replay: default mode hides thinking and renders readable tool lines', (t) => {
|
|
20
20
|
if (skipIfMissing(t))
|
|
21
21
|
return;
|
|
22
22
|
const entries = collectEntries(false);
|
|
23
|
-
assert.ok(entries.length > 0,
|
|
24
|
-
const thinkingLines = entries.filter((e) => e.message.startsWith(
|
|
25
|
-
assert.equal(thinkingLines.length, 0,
|
|
26
|
-
const toolLines = entries.filter((e) => e.message.startsWith(
|
|
27
|
-
assert.ok(toolLines.length > 0,
|
|
23
|
+
assert.ok(entries.length > 0, 'expected at least one parsed entry');
|
|
24
|
+
const thinkingLines = entries.filter((e) => e.message.startsWith('[Thinking]'));
|
|
25
|
+
assert.equal(thinkingLines.length, 0, 'default mode must not emit any [Thinking] lines');
|
|
26
|
+
const toolLines = entries.filter((e) => e.message.startsWith('[Tool]'));
|
|
27
|
+
assert.ok(toolLines.length > 0, 'expected some [Tool] lines in the backup fixture');
|
|
28
28
|
for (const entry of toolLines) {
|
|
29
|
-
assert.ok(!entry.message.includes(
|
|
29
|
+
assert.ok(!entry.message.includes('{') && !entry.message.includes('}'), `tool line should not contain raw JSON: ${entry.message}`);
|
|
30
30
|
}
|
|
31
31
|
for (const entry of entries) {
|
|
32
|
-
assert.ok(!entry.message.includes(
|
|
32
|
+
assert.ok(!entry.message.includes('/Users/'), `absolute /Users/... path leaked into output: ${entry.message}`);
|
|
33
33
|
}
|
|
34
34
|
});
|
|
35
|
-
test(
|
|
35
|
+
test('backup log replay: verbose mode re-enables [Thinking] lines', (t) => {
|
|
36
36
|
if (skipIfMissing(t))
|
|
37
37
|
return;
|
|
38
38
|
const defaultCount = collectEntries(false).length;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-json-parser.replay.test.js","sourceRoot":"","sources":["../../src/runners/stream-json-parser.replay.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,UAAU,GAAG,aAAa,
|
|
1
|
+
{"version":3,"file":"stream-json-parser.replay.test.js","sourceRoot":"","sources":["../../src/runners/stream-json-parser.replay.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,130 +1,128 @@
|
|
|
1
|
-
import assert from
|
|
2
|
-
import test from
|
|
3
|
-
import { createStreamJsonLineParser, firstSentence, parseStreamJsonLine, shortenPath, summarizeToolUse } from
|
|
4
|
-
test(
|
|
5
|
-
const cwd =
|
|
6
|
-
assert.equal(shortenPath(`${cwd}/web/src/foo.ts`, cwd),
|
|
7
|
-
assert.equal(shortenPath(
|
|
8
|
-
assert.equal(shortenPath(
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test from 'node:test';
|
|
3
|
+
import { createStreamJsonLineParser, firstSentence, parseStreamJsonLine, shortenPath, summarizeToolUse, } from './stream-json-parser.js';
|
|
4
|
+
test('shortenPath strips cwd prefix and falls back to original when unmatched', () => {
|
|
5
|
+
const cwd = '/Users/justin/Project/Me/AgentTeams';
|
|
6
|
+
assert.equal(shortenPath(`${cwd}/web/src/foo.ts`, cwd), 'web/src/foo.ts');
|
|
7
|
+
assert.equal(shortenPath('/other/place/foo.ts', cwd), '/other/place/foo.ts');
|
|
8
|
+
assert.equal(shortenPath('', cwd), '');
|
|
9
9
|
});
|
|
10
|
-
test(
|
|
11
|
-
assert.equal(firstSentence(
|
|
12
|
-
assert.equal(firstSentence(
|
|
13
|
-
assert.equal(firstSentence(
|
|
10
|
+
test('firstSentence trims to first terminator within cap', () => {
|
|
11
|
+
assert.equal(firstSentence('Hello world. This is the second sentence.'), 'Hello world.');
|
|
12
|
+
assert.equal(firstSentence('No terminator here just a long sentence'), 'No terminator here just a long sentence');
|
|
13
|
+
assert.equal(firstSentence('a'.repeat(200), 50), `${'a'.repeat(50)}...`);
|
|
14
14
|
});
|
|
15
|
-
test(
|
|
16
|
-
const cwd =
|
|
17
|
-
assert.equal(summarizeToolUse(
|
|
18
|
-
assert.equal(summarizeToolUse(
|
|
19
|
-
assert.equal(summarizeToolUse(
|
|
20
|
-
assert.equal(summarizeToolUse(
|
|
21
|
-
assert.equal(summarizeToolUse(
|
|
22
|
-
assert.equal(summarizeToolUse(
|
|
23
|
-
assert.equal(summarizeToolUse(
|
|
24
|
-
assert.equal(summarizeToolUse(
|
|
25
|
-
assert.equal(summarizeToolUse(
|
|
26
|
-
assert.equal(summarizeToolUse(
|
|
27
|
-
assert.equal(summarizeToolUse(
|
|
28
|
-
assert.equal(summarizeToolUse(
|
|
29
|
-
assert.equal(summarizeToolUse(
|
|
15
|
+
test('summarizeToolUse renders human-readable summaries per tool', () => {
|
|
16
|
+
const cwd = '/Users/justin/Project/Me/AgentTeams';
|
|
17
|
+
assert.equal(summarizeToolUse('Read', { file_path: `${cwd}/web/src/foo.ts` }, cwd), 'Read: web/src/foo.ts');
|
|
18
|
+
assert.equal(summarizeToolUse('Edit', { file_path: `${cwd}/daemon/src/index.ts` }, cwd), 'Edit: daemon/src/index.ts');
|
|
19
|
+
assert.equal(summarizeToolUse('Bash', { command: 'git status\necho done', description: '...' }), 'Bash: git status');
|
|
20
|
+
assert.equal(summarizeToolUse('Bash', { command: `git -C ${cwd}/web add foo.ts` }, cwd), 'Bash: git -C ./web add foo.ts');
|
|
21
|
+
assert.equal(summarizeToolUse('Grep', { pattern: 'foo', path: `${cwd}/src` }, cwd), 'Grep: "foo" in src');
|
|
22
|
+
assert.equal(summarizeToolUse('Glob', { pattern: '**/*.ts' }), 'Glob: **/*.ts');
|
|
23
|
+
assert.equal(summarizeToolUse('TaskCreate', { subject: 'Refactor parser' }), 'TaskCreate: Refactor parser');
|
|
24
|
+
assert.equal(summarizeToolUse('TaskUpdate', { taskId: '1', status: 'in_progress' }), 'TaskUpdate: 1 -> in_progress');
|
|
25
|
+
assert.equal(summarizeToolUse('TodoWrite', { todos: [{}, {}, {}] }), 'TodoWrite: 3 item(s)');
|
|
26
|
+
assert.equal(summarizeToolUse('WebSearch', { query: 'node test' }), 'WebSearch: "node test"');
|
|
27
|
+
assert.equal(summarizeToolUse('WebFetch', { url: 'https://example.com' }), 'WebFetch: https://example.com');
|
|
28
|
+
assert.equal(summarizeToolUse('CustomTool', { alpha: 1, beta: 2, gamma: 3, delta: 4 }), 'CustomTool(alpha,beta,gamma)');
|
|
29
|
+
assert.equal(summarizeToolUse('CustomTool', {}), 'CustomTool');
|
|
30
30
|
});
|
|
31
|
-
test(
|
|
31
|
+
test('parseStreamJsonLine skips thinking blocks by default and emits when verbose', () => {
|
|
32
32
|
const line = JSON.stringify({
|
|
33
|
-
type:
|
|
34
|
-
message: { content: [{ type:
|
|
33
|
+
type: 'assistant',
|
|
34
|
+
message: { content: [{ type: 'thinking', thinking: 'Let me consider this.' }] },
|
|
35
35
|
});
|
|
36
36
|
assert.deepEqual(parseStreamJsonLine(line), []);
|
|
37
37
|
assert.deepEqual(parseStreamJsonLine(line, { verbose: true }), [
|
|
38
|
-
{ level:
|
|
38
|
+
{ level: 'INFO', message: '[Thinking] Let me consider this.' },
|
|
39
39
|
]);
|
|
40
40
|
});
|
|
41
|
-
test(
|
|
42
|
-
const cwd =
|
|
41
|
+
test('parseStreamJsonLine emits readable [Tool] line instead of JSON dump', () => {
|
|
42
|
+
const cwd = '/Users/justin/Project/Me/AgentTeams';
|
|
43
43
|
const line = JSON.stringify({
|
|
44
|
-
type:
|
|
44
|
+
type: 'assistant',
|
|
45
45
|
message: {
|
|
46
46
|
content: [
|
|
47
47
|
{
|
|
48
|
-
type:
|
|
49
|
-
name:
|
|
50
|
-
input: { file_path: `${cwd}/web/src/components/Foo.tsx` }
|
|
51
|
-
}
|
|
52
|
-
]
|
|
53
|
-
}
|
|
48
|
+
type: 'tool_use',
|
|
49
|
+
name: 'Read',
|
|
50
|
+
input: { file_path: `${cwd}/web/src/components/Foo.tsx` },
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
54
|
});
|
|
55
55
|
const entries = parseStreamJsonLine(line, { cwd });
|
|
56
56
|
assert.equal(entries.length, 1);
|
|
57
|
-
assert.equal(entries[0].level,
|
|
58
|
-
assert.equal(entries[0].message,
|
|
59
|
-
assert.ok(!entries[0].message.includes(
|
|
57
|
+
assert.equal(entries[0].level, 'INFO');
|
|
58
|
+
assert.equal(entries[0].message, '[Tool] Read: web/src/components/Foo.tsx');
|
|
59
|
+
assert.ok(!entries[0].message.includes('{'), 'tool line must not contain raw JSON braces');
|
|
60
60
|
});
|
|
61
|
-
test(
|
|
61
|
+
test('parseStreamJsonLine reduces assistant text to first sentence', () => {
|
|
62
62
|
const line = JSON.stringify({
|
|
63
|
-
type:
|
|
63
|
+
type: 'assistant',
|
|
64
64
|
message: {
|
|
65
|
-
content: [{ type:
|
|
66
|
-
}
|
|
65
|
+
content: [{ type: 'text', text: 'Now wire the refetch into the controller. Next steps follow.' }],
|
|
66
|
+
},
|
|
67
67
|
});
|
|
68
68
|
const entries = parseStreamJsonLine(line);
|
|
69
|
-
assert.deepEqual(entries, [
|
|
70
|
-
{ level: "INFO", message: "Now wire the refetch into the controller." }
|
|
71
|
-
]);
|
|
69
|
+
assert.deepEqual(entries, [{ level: 'INFO', message: 'Now wire the refetch into the controller.' }]);
|
|
72
70
|
});
|
|
73
|
-
test(
|
|
71
|
+
test('parseStreamJsonLine renders system init and result lines', () => {
|
|
74
72
|
const init = JSON.stringify({
|
|
75
|
-
type:
|
|
76
|
-
subtype:
|
|
77
|
-
model:
|
|
78
|
-
tools: [
|
|
73
|
+
type: 'system',
|
|
74
|
+
subtype: 'init',
|
|
75
|
+
model: 'claude-opus-4-7',
|
|
76
|
+
tools: ['Read', 'Edit', 'Bash'],
|
|
79
77
|
});
|
|
80
78
|
assert.deepEqual(parseStreamJsonLine(init), [
|
|
81
|
-
{ level:
|
|
82
|
-
]);
|
|
83
|
-
const ok = JSON.stringify({ type: "result", duration_ms: 12345, num_turns: 4 });
|
|
84
|
-
assert.deepEqual(parseStreamJsonLine(ok), [
|
|
85
|
-
{ level: "INFO", message: "[Result] Completed in 12s (4 turns)" }
|
|
79
|
+
{ level: 'INFO', message: 'Session initialized (model=claude-opus-4-7, tools=3)' },
|
|
86
80
|
]);
|
|
81
|
+
const ok = JSON.stringify({ type: 'result', duration_ms: 12345, num_turns: 4 });
|
|
82
|
+
assert.deepEqual(parseStreamJsonLine(ok), [{ level: 'INFO', message: '[Result] Completed in 12s (4 turns)' }]);
|
|
87
83
|
const err = JSON.stringify({
|
|
88
|
-
type:
|
|
84
|
+
type: 'result',
|
|
89
85
|
duration_ms: 5000,
|
|
90
86
|
num_turns: 2,
|
|
91
87
|
is_error: true,
|
|
92
|
-
result:
|
|
88
|
+
result: 'Idle timeout',
|
|
93
89
|
});
|
|
94
90
|
assert.deepEqual(parseStreamJsonLine(err), [
|
|
95
|
-
{ level:
|
|
91
|
+
{ level: 'WARN', message: '[Result] Error after 5s (2 turns): Idle timeout' },
|
|
96
92
|
]);
|
|
97
93
|
});
|
|
98
|
-
test(
|
|
99
|
-
assert.deepEqual(parseStreamJsonLine(
|
|
100
|
-
assert.deepEqual(parseStreamJsonLine(
|
|
101
|
-
assert.deepEqual(parseStreamJsonLine(
|
|
94
|
+
test('parseStreamJsonLine returns empty for malformed or empty input', () => {
|
|
95
|
+
assert.deepEqual(parseStreamJsonLine(''), []);
|
|
96
|
+
assert.deepEqual(parseStreamJsonLine(' '), []);
|
|
97
|
+
assert.deepEqual(parseStreamJsonLine('not json'), []);
|
|
102
98
|
assert.deepEqual(parseStreamJsonLine('{"no":"type"}'), []);
|
|
103
99
|
});
|
|
104
|
-
test(
|
|
100
|
+
test('createStreamJsonLineParser handles chunked input and forwards options', () => {
|
|
105
101
|
const collected = [];
|
|
106
|
-
const parser = createStreamJsonLineParser((entries) => collected.push(...entries.map((e) => e.message)), {
|
|
102
|
+
const parser = createStreamJsonLineParser((entries) => collected.push(...entries.map((e) => e.message)), {
|
|
103
|
+
cwd: '/repo',
|
|
104
|
+
});
|
|
107
105
|
const lineA = JSON.stringify({
|
|
108
|
-
type:
|
|
109
|
-
message: { content: [{ type:
|
|
106
|
+
type: 'assistant',
|
|
107
|
+
message: { content: [{ type: 'tool_use', name: 'Read', input: { file_path: '/repo/a.ts' } }] },
|
|
110
108
|
});
|
|
111
109
|
const lineB = JSON.stringify({
|
|
112
|
-
type:
|
|
113
|
-
message: { content: [{ type:
|
|
110
|
+
type: 'assistant',
|
|
111
|
+
message: { content: [{ type: 'tool_use', name: 'Read', input: { file_path: '/repo/b.ts' } }] },
|
|
114
112
|
});
|
|
115
113
|
// Split first line across two pushes to exercise buffering.
|
|
116
114
|
const half = Math.floor(lineA.length / 2);
|
|
117
115
|
parser.push(lineA.slice(0, half));
|
|
118
116
|
parser.push(`${lineA.slice(half)}\n${lineB}\n`);
|
|
119
|
-
assert.deepEqual(collected, [
|
|
117
|
+
assert.deepEqual(collected, ['[Tool] Read: a.ts', '[Tool] Read: b.ts']);
|
|
120
118
|
});
|
|
121
|
-
test(
|
|
119
|
+
test('parseStreamJsonLine respects AGENTTEAMS_RUNNER_VERBOSE env when no option given', () => {
|
|
122
120
|
const previous = process.env.AGENTTEAMS_RUNNER_VERBOSE;
|
|
123
|
-
process.env.AGENTTEAMS_RUNNER_VERBOSE =
|
|
121
|
+
process.env.AGENTTEAMS_RUNNER_VERBOSE = '1';
|
|
124
122
|
try {
|
|
125
123
|
const line = JSON.stringify({
|
|
126
|
-
type:
|
|
127
|
-
message: { content: [{ type:
|
|
124
|
+
type: 'assistant',
|
|
125
|
+
message: { content: [{ type: 'thinking', thinking: 'hidden by default' }] },
|
|
128
126
|
});
|
|
129
127
|
const entries = parseStreamJsonLine(line);
|
|
130
128
|
assert.equal(entries.length, 1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-json-parser.test.js","sourceRoot":"","sources":["../../src/runners/stream-json-parser.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,0BAA0B,EAC1B,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,gBAAgB,
|
|
1
|
+
{"version":3,"file":"stream-json-parser.test.js","sourceRoot":"","sources":["../../src/runners/stream-json-parser.test.ts"],"names":[],"mappings":"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"}
|