@agentteams/runner 0.0.84-dev.208 → 0.0.85
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 +54 -63
- 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 +22 -20
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/update.test.js +42 -38
- 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 +22 -21
- 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 +49 -46
- 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 +124 -118
- package/dist/handlers/trigger-handler.js.map +1 -1
- package/dist/handlers/trigger-handler.test.js +365 -373
- 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 +53 -54
- package/dist/poller.js.map +1 -1
- package/dist/poller.test.js +181 -209
- package/dist/poller.test.js.map +1 -1
- package/dist/runners/amp.d.ts +1 -1
- package/dist/runners/amp.js +81 -74
- package/dist/runners/amp.js.map +1 -1
- package/dist/runners/antigravity.d.ts +3 -3
- package/dist/runners/antigravity.js +127 -116
- 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 +84 -85
- package/dist/runners/claude-code.js.map +1 -1
- package/dist/runners/claude-code.test.js +40 -37
- package/dist/runners/claude-code.test.js.map +1 -1
- package/dist/runners/codex.d.ts +1 -1
- package/dist/runners/codex.js +96 -87
- 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 +10 -10
- 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 +75 -68
- package/dist/runners/opencode.js.map +1 -1
- package/dist/runners/process-control.d.ts +1 -1
- package/dist/runners/process-control.js +11 -13
- 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 +67 -70
- 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 +78 -76
- 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 +29 -24
- 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 +28 -30
- 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 +21 -22
- package/dist/utils/convention-evaluator.js.map +1 -1
- package/dist/utils/convention-evaluator.test.js +110 -120
- 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 +25 -39
- package/dist/utils/convention-sync.test.js.map +1 -1
- package/dist/utils/git-worktree.js +18 -20
- 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 +30 -35
- 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 +1 -4
- 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) =>
|
|
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,18 +161,15 @@ 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({
|
|
170
|
-
level: 'WARN',
|
|
171
|
-
message: `[Result] Error after ${duration} (${turns} turns): ${truncate(result, 300)}`,
|
|
172
|
-
});
|
|
168
|
+
const result = parsed.result ?? "Unknown error";
|
|
169
|
+
entries.push({ level: "WARN", message: `[Result] Error after ${duration} (${turns} turns): ${truncate(result, 300)}` });
|
|
173
170
|
}
|
|
174
171
|
else {
|
|
175
|
-
entries.push({ level:
|
|
172
|
+
entries.push({ level: "INFO", message: `[Result] Completed in ${duration} (${turns} turns)` });
|
|
176
173
|
}
|
|
177
174
|
break;
|
|
178
175
|
}
|
|
@@ -186,12 +183,12 @@ export const parseStreamJsonLine = (line, options) => {
|
|
|
186
183
|
* Stream data may arrive as partial lines, so this buffers until newlines.
|
|
187
184
|
*/
|
|
188
185
|
export const createStreamJsonLineParser = (onEntries, options) => {
|
|
189
|
-
let buffer =
|
|
186
|
+
let buffer = "";
|
|
190
187
|
return {
|
|
191
188
|
push(chunk) {
|
|
192
189
|
buffer += chunk;
|
|
193
|
-
const lines = buffer.split(
|
|
194
|
-
buffer = lines.pop() ??
|
|
190
|
+
const lines = buffer.split("\n");
|
|
191
|
+
buffer = lines.pop() ?? "";
|
|
195
192
|
for (const line of lines) {
|
|
196
193
|
const entries = parseStreamJsonLine(line, options);
|
|
197
194
|
if (entries.length > 0) {
|
|
@@ -206,8 +203,8 @@ export const createStreamJsonLineParser = (onEntries, options) => {
|
|
|
206
203
|
onEntries(entries);
|
|
207
204
|
}
|
|
208
205
|
}
|
|
209
|
-
buffer =
|
|
210
|
-
}
|
|
206
|
+
buffer = "";
|
|
207
|
+
}
|
|
211
208
|
};
|
|
212
209
|
};
|
|
213
210
|
//# 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":"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"}
|
|
@@ -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,128 +1,130 @@
|
|
|
1
|
-
import assert from
|
|
2
|
-
import test from
|
|
3
|
-
import { createStreamJsonLineParser, firstSentence, parseStreamJsonLine, shortenPath, summarizeToolUse
|
|
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, [
|
|
69
|
+
assert.deepEqual(entries, [
|
|
70
|
+
{ level: "INFO", message: "Now wire the refetch into the controller." }
|
|
71
|
+
]);
|
|
70
72
|
});
|
|
71
|
-
test(
|
|
73
|
+
test("parseStreamJsonLine renders system init and result lines", () => {
|
|
72
74
|
const init = JSON.stringify({
|
|
73
|
-
type:
|
|
74
|
-
subtype:
|
|
75
|
-
model:
|
|
76
|
-
tools: [
|
|
75
|
+
type: "system",
|
|
76
|
+
subtype: "init",
|
|
77
|
+
model: "claude-opus-4-7",
|
|
78
|
+
tools: ["Read", "Edit", "Bash"]
|
|
77
79
|
});
|
|
78
80
|
assert.deepEqual(parseStreamJsonLine(init), [
|
|
79
|
-
{ level:
|
|
81
|
+
{ level: "INFO", message: "Session initialized (model=claude-opus-4-7, tools=3)" }
|
|
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)" }
|
|
80
86
|
]);
|
|
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)' }]);
|
|
83
87
|
const err = JSON.stringify({
|
|
84
|
-
type:
|
|
88
|
+
type: "result",
|
|
85
89
|
duration_ms: 5000,
|
|
86
90
|
num_turns: 2,
|
|
87
91
|
is_error: true,
|
|
88
|
-
result:
|
|
92
|
+
result: "Idle timeout"
|
|
89
93
|
});
|
|
90
94
|
assert.deepEqual(parseStreamJsonLine(err), [
|
|
91
|
-
{ level:
|
|
95
|
+
{ level: "WARN", message: "[Result] Error after 5s (2 turns): Idle timeout" }
|
|
92
96
|
]);
|
|
93
97
|
});
|
|
94
|
-
test(
|
|
95
|
-
assert.deepEqual(parseStreamJsonLine(
|
|
96
|
-
assert.deepEqual(parseStreamJsonLine(
|
|
97
|
-
assert.deepEqual(parseStreamJsonLine(
|
|
98
|
+
test("parseStreamJsonLine returns empty for malformed or empty input", () => {
|
|
99
|
+
assert.deepEqual(parseStreamJsonLine(""), []);
|
|
100
|
+
assert.deepEqual(parseStreamJsonLine(" "), []);
|
|
101
|
+
assert.deepEqual(parseStreamJsonLine("not json"), []);
|
|
98
102
|
assert.deepEqual(parseStreamJsonLine('{"no":"type"}'), []);
|
|
99
103
|
});
|
|
100
|
-
test(
|
|
104
|
+
test("createStreamJsonLineParser handles chunked input and forwards options", () => {
|
|
101
105
|
const collected = [];
|
|
102
|
-
const parser = createStreamJsonLineParser((entries) => collected.push(...entries.map((e) => e.message)), {
|
|
103
|
-
cwd: '/repo',
|
|
104
|
-
});
|
|
106
|
+
const parser = createStreamJsonLineParser((entries) => collected.push(...entries.map((e) => e.message)), { cwd: "/repo" });
|
|
105
107
|
const lineA = JSON.stringify({
|
|
106
|
-
type:
|
|
107
|
-
message: { content: [{ type:
|
|
108
|
+
type: "assistant",
|
|
109
|
+
message: { content: [{ type: "tool_use", name: "Read", input: { file_path: "/repo/a.ts" } }] }
|
|
108
110
|
});
|
|
109
111
|
const lineB = JSON.stringify({
|
|
110
|
-
type:
|
|
111
|
-
message: { content: [{ type:
|
|
112
|
+
type: "assistant",
|
|
113
|
+
message: { content: [{ type: "tool_use", name: "Read", input: { file_path: "/repo/b.ts" } }] }
|
|
112
114
|
});
|
|
113
115
|
// Split first line across two pushes to exercise buffering.
|
|
114
116
|
const half = Math.floor(lineA.length / 2);
|
|
115
117
|
parser.push(lineA.slice(0, half));
|
|
116
118
|
parser.push(`${lineA.slice(half)}\n${lineB}\n`);
|
|
117
|
-
assert.deepEqual(collected, [
|
|
119
|
+
assert.deepEqual(collected, ["[Tool] Read: a.ts", "[Tool] Read: b.ts"]);
|
|
118
120
|
});
|
|
119
|
-
test(
|
|
121
|
+
test("parseStreamJsonLine respects AGENTTEAMS_RUNNER_VERBOSE env when no option given", () => {
|
|
120
122
|
const previous = process.env.AGENTTEAMS_RUNNER_VERBOSE;
|
|
121
|
-
process.env.AGENTTEAMS_RUNNER_VERBOSE =
|
|
123
|
+
process.env.AGENTTEAMS_RUNNER_VERBOSE = "1";
|
|
122
124
|
try {
|
|
123
125
|
const line = JSON.stringify({
|
|
124
|
-
type:
|
|
125
|
-
message: { content: [{ type:
|
|
126
|
+
type: "assistant",
|
|
127
|
+
message: { content: [{ type: "thinking", thinking: "hidden by default" }] }
|
|
126
128
|
});
|
|
127
129
|
const entries = parseStreamJsonLine(line);
|
|
128
130
|
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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"}
|