@zhixuan92/multi-model-agent-core 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -6
- package/dist/config/schema.d.ts +27 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +13 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/context/context-block-store.d.ts +75 -0
- package/dist/context/context-block-store.d.ts.map +1 -0
- package/dist/context/context-block-store.js +82 -0
- package/dist/context/context-block-store.js.map +1 -0
- package/dist/context/expand-context-blocks.d.ts +20 -0
- package/dist/context/expand-context-blocks.d.ts.map +1 -0
- package/dist/context/expand-context-blocks.js +46 -0
- package/dist/context/expand-context-blocks.js.map +1 -0
- package/dist/delegate-with-escalation.d.ts +34 -0
- package/dist/delegate-with-escalation.d.ts.map +1 -0
- package/dist/delegate-with-escalation.js +168 -0
- package/dist/delegate-with-escalation.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/model-profiles.json +8 -4
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +7 -1
- package/dist/provider.js.map +1 -1
- package/dist/routing/model-profiles.d.ts +1 -0
- package/dist/routing/model-profiles.d.ts.map +1 -1
- package/dist/routing/model-profiles.js +4 -0
- package/dist/routing/model-profiles.js.map +1 -1
- package/dist/run-tasks.d.ts +26 -2
- package/dist/run-tasks.d.ts.map +1 -1
- package/dist/run-tasks.js +61 -19
- package/dist/run-tasks.js.map +1 -1
- package/dist/runners/claude-runner.d.ts.map +1 -1
- package/dist/runners/claude-runner.js +643 -32
- package/dist/runners/claude-runner.js.map +1 -1
- package/dist/runners/codex-runner.d.ts.map +1 -1
- package/dist/runners/codex-runner.js +473 -48
- package/dist/runners/codex-runner.js.map +1 -1
- package/dist/runners/error-classification.d.ts +30 -0
- package/dist/runners/error-classification.d.ts.map +1 -0
- package/dist/runners/error-classification.js +72 -0
- package/dist/runners/error-classification.js.map +1 -0
- package/dist/runners/injection-type.d.ts +17 -0
- package/dist/runners/injection-type.d.ts.map +1 -0
- package/dist/runners/injection-type.js +27 -0
- package/dist/runners/injection-type.js.map +1 -0
- package/dist/runners/openai-runner.d.ts +5 -0
- package/dist/runners/openai-runner.d.ts.map +1 -1
- package/dist/runners/openai-runner.js +508 -36
- package/dist/runners/openai-runner.js.map +1 -1
- package/dist/runners/prevention.d.ts +41 -0
- package/dist/runners/prevention.d.ts.map +1 -0
- package/dist/runners/prevention.js +68 -0
- package/dist/runners/prevention.js.map +1 -0
- package/dist/runners/supervision.d.ts +130 -0
- package/dist/runners/supervision.d.ts.map +1 -0
- package/dist/runners/supervision.js +238 -0
- package/dist/runners/supervision.js.map +1 -0
- package/dist/tools/claude-adapter.d.ts.map +1 -1
- package/dist/tools/claude-adapter.js +6 -3
- package/dist/tools/claude-adapter.js.map +1 -1
- package/dist/tools/definitions.d.ts +3 -1
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +56 -5
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/openai-adapter.d.ts.map +1 -1
- package/dist/tools/openai-adapter.js +6 -3
- package/dist/tools/openai-adapter.js.map +1 -1
- package/dist/tools/scratchpad.d.ts +28 -0
- package/dist/tools/scratchpad.d.ts.map +1 -0
- package/dist/tools/scratchpad.js +49 -0
- package/dist/tools/scratchpad.js.map +1 -0
- package/dist/tools/tracker.d.ts +38 -2
- package/dist/tools/tracker.d.ts.map +1 -1
- package/dist/tools/tracker.js +54 -5
- package/dist/tools/tracker.js.map +1 -1
- package/dist/types.d.ts +184 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +17 -1
- package/dist/types.js.map +1 -1
- package/package.json +7 -3
|
@@ -13,8 +13,17 @@ const execAsync = promisify(exec);
|
|
|
13
13
|
// readFile: 50 MB. Larger than any sensible source file.
|
|
14
14
|
// writeFile: 100 MB. Generous enough for build artefacts but caps disk-fill
|
|
15
15
|
// attacks where the model is told to write a multi-gigabyte file.
|
|
16
|
+
// grep: 200 KB rendered output. Recursive grep on a large repo can otherwise
|
|
17
|
+
// dump megabytes of matches into the model's context, which is both
|
|
18
|
+
// expensive and useless. Truncating with a marker forces the worker to
|
|
19
|
+
// refine its pattern.
|
|
20
|
+
// grep child: 4 MB stdout buffer. Process-level cap that's larger than the
|
|
21
|
+
// rendered cap so we never lose a real grep result that fits
|
|
22
|
+
// within the rendered limit just because of buffer overflow.
|
|
16
23
|
export const MAX_READ_FILE_BYTES = 50 * 1024 * 1024;
|
|
17
24
|
export const MAX_WRITE_FILE_BYTES = 100 * 1024 * 1024;
|
|
25
|
+
export const MAX_GREP_OUTPUT_BYTES = 200 * 1024;
|
|
26
|
+
export const GREP_CHILD_BUFFER_BYTES = 4 * 1024 * 1024;
|
|
18
27
|
function isWithin(parent, child) {
|
|
19
28
|
return child === parent || child.startsWith(parent + path.sep);
|
|
20
29
|
}
|
|
@@ -44,6 +53,7 @@ export function createToolImplementations(tracker, cwd, sandboxPolicy = 'cwd-onl
|
|
|
44
53
|
const confine = sandboxPolicy === 'cwd-only';
|
|
45
54
|
return {
|
|
46
55
|
async readFile(filePath) {
|
|
56
|
+
tracker.trackToolCall(`readFile(${filePath})`);
|
|
47
57
|
const resolved = path.resolve(cwd, filePath);
|
|
48
58
|
if (confine)
|
|
49
59
|
await assertWithinCwd(cwd, resolved);
|
|
@@ -53,9 +63,12 @@ export function createToolImplementations(tracker, cwd, sandboxPolicy = 'cwd-onl
|
|
|
53
63
|
if (stats.size > MAX_READ_FILE_BYTES) {
|
|
54
64
|
throw new Error(`File too large: ${filePath} is ${stats.size} bytes (max ${MAX_READ_FILE_BYTES})`);
|
|
55
65
|
}
|
|
56
|
-
|
|
66
|
+
const content = await fs.readFile(resolved, 'utf-8');
|
|
67
|
+
tracker.trackRead(resolved);
|
|
68
|
+
return content;
|
|
57
69
|
},
|
|
58
70
|
async writeFile(filePath, content) {
|
|
71
|
+
tracker.trackToolCall(`writeFile(${filePath}, ${content.length}B)`);
|
|
59
72
|
const resolved = path.resolve(cwd, filePath);
|
|
60
73
|
if (confine)
|
|
61
74
|
await assertWithinCwd(cwd, resolved);
|
|
@@ -70,6 +83,7 @@ export function createToolImplementations(tracker, cwd, sandboxPolicy = 'cwd-onl
|
|
|
70
83
|
tracker.trackWrite(resolved);
|
|
71
84
|
},
|
|
72
85
|
async runShell(command) {
|
|
86
|
+
tracker.trackToolCall(`runShell(${command.length > 80 ? command.slice(0, 77) + '…' : command})`);
|
|
73
87
|
if (confine) {
|
|
74
88
|
throw new Error('runShell is disabled under sandboxPolicy "cwd-only". Use readFile, writeFile, grep, glob, or listFiles instead.');
|
|
75
89
|
}
|
|
@@ -94,6 +108,7 @@ export function createToolImplementations(tracker, cwd, sandboxPolicy = 'cwd-onl
|
|
|
94
108
|
}
|
|
95
109
|
},
|
|
96
110
|
async glob(pattern) {
|
|
111
|
+
tracker.trackToolCall(`glob(${pattern})`);
|
|
97
112
|
try {
|
|
98
113
|
const results = [];
|
|
99
114
|
const realCwd = confine ? await fs.realpath(cwd) : null;
|
|
@@ -118,13 +133,43 @@ export function createToolImplementations(tracker, cwd, sandboxPolicy = 'cwd-onl
|
|
|
118
133
|
return [];
|
|
119
134
|
}
|
|
120
135
|
},
|
|
121
|
-
async grep(pattern,
|
|
122
|
-
|
|
136
|
+
async grep(pattern, target) {
|
|
137
|
+
tracker.trackToolCall(`grep(${target}, "${pattern.length > 60 ? pattern.slice(0, 57) + '…' : pattern}")`);
|
|
138
|
+
const resolved = path.resolve(cwd, target);
|
|
123
139
|
if (confine)
|
|
124
140
|
await assertWithinCwd(cwd, resolved);
|
|
141
|
+
// Detect file vs directory so we can pick the right grep mode. ENOENT
|
|
142
|
+
// is reported as a clear error so the worker doesn't think "no matches".
|
|
143
|
+
let isDirectory = false;
|
|
144
|
+
try {
|
|
145
|
+
const stats = await fs.stat(resolved);
|
|
146
|
+
isDirectory = stats.isDirectory();
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
if (err.code === 'ENOENT') {
|
|
150
|
+
throw new Error(`grep target does not exist: ${target}`);
|
|
151
|
+
}
|
|
152
|
+
throw err;
|
|
153
|
+
}
|
|
154
|
+
tracker.trackRead(resolved);
|
|
155
|
+
// Directory targets get recursive grep with file:line prefixes; file
|
|
156
|
+
// targets keep the original line-only output for compactness.
|
|
157
|
+
const flags = isDirectory ? '-rn' : '-n';
|
|
158
|
+
const escapedPattern = pattern.replace(/'/g, "'\\''");
|
|
159
|
+
const escapedPath = resolved.replace(/'/g, "'\\''");
|
|
125
160
|
try {
|
|
126
|
-
const { stdout } = await execAsync(`grep
|
|
127
|
-
|
|
161
|
+
const { stdout } = await execAsync(`grep ${flags} -e '${escapedPattern}' '${escapedPath}'`, { signal, maxBuffer: GREP_CHILD_BUFFER_BYTES });
|
|
162
|
+
let output = stdout.trim();
|
|
163
|
+
// Cap rendered output so a recursive grep over a huge repo doesn't
|
|
164
|
+
// dump 200k matches into the model's context. The worker can refine
|
|
165
|
+
// its pattern instead.
|
|
166
|
+
if (output.length > MAX_GREP_OUTPUT_BYTES) {
|
|
167
|
+
const truncated = output.slice(0, MAX_GREP_OUTPUT_BYTES);
|
|
168
|
+
const remaining = output.slice(MAX_GREP_OUTPUT_BYTES);
|
|
169
|
+
const droppedLines = remaining.split('\n').length;
|
|
170
|
+
output = `${truncated}\n[grep output truncated: ${droppedLines}+ more lines dropped. Refine your pattern or narrow the search path.]`;
|
|
171
|
+
}
|
|
172
|
+
return output;
|
|
128
173
|
}
|
|
129
174
|
catch (err) {
|
|
130
175
|
if (err.name === 'AbortError')
|
|
@@ -132,14 +177,20 @@ export function createToolImplementations(tracker, cwd, sandboxPolicy = 'cwd-onl
|
|
|
132
177
|
// grep exit 1 = no matches (normal), exit 2+ = real error
|
|
133
178
|
if (err.code === 1)
|
|
134
179
|
return '';
|
|
180
|
+
// Child process buffer overflow surfaces as a stdio max-buffer error.
|
|
181
|
+
if (err.code === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER' || /maxBuffer/.test(err.message ?? '')) {
|
|
182
|
+
throw new Error(`grep output exceeded ${GREP_CHILD_BUFFER_BYTES} bytes before truncation. Refine your pattern or narrow the search path.`);
|
|
183
|
+
}
|
|
135
184
|
throw new Error(err.stderr?.trim() || `grep failed with exit code ${err.code}`);
|
|
136
185
|
}
|
|
137
186
|
},
|
|
138
187
|
async listFiles(dirPath) {
|
|
188
|
+
tracker.trackToolCall(`listFiles(${dirPath})`);
|
|
139
189
|
const resolved = path.resolve(cwd, dirPath);
|
|
140
190
|
if (confine)
|
|
141
191
|
await assertWithinCwd(cwd, resolved);
|
|
142
192
|
const entries = await fs.readdir(resolved, { withFileTypes: true });
|
|
193
|
+
tracker.trackRead(resolved);
|
|
143
194
|
return entries.map(e => e.isDirectory() ? `${e.name}/` : e.name).sort();
|
|
144
195
|
},
|
|
145
196
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAIjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,4EAA4E;AAC5E,8EAA8E;AAC9E,0EAA0E;AAC1E,6EAA6E;AAC7E,2CAA2C;AAC3C,EAAE;AACF,yDAAyD;AACzD,4EAA4E;AAC5E,6EAA6E;AAC7E,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACpD,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-adapter.d.ts","sourceRoot":"","sources":["../../src/tools/openai-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,EAAE,aAAa,GAAE,aAA0B;;;;;;;;
|
|
1
|
+
{"version":3,"file":"openai-adapter.d.ts","sourceRoot":"","sources":["../../src/tools/openai-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,EAAE,aAAa,GAAE,aAA0B;;;;;;;;8BAgFrG"}
|
|
@@ -45,10 +45,13 @@ export function createOpenAITools(impl, sandboxPolicy = 'cwd-only') {
|
|
|
45
45
|
});
|
|
46
46
|
const grepTool = tool({
|
|
47
47
|
name: 'grep',
|
|
48
|
-
description: 'Search for a pattern in a file.
|
|
48
|
+
description: 'Search for a regex pattern in a file or directory. When given a directory, ' +
|
|
49
|
+
'recursively searches all files (output is prefixed with file:line). When given ' +
|
|
50
|
+
'a single file, returns matching lines with line numbers. Use this — not multiple ' +
|
|
51
|
+
'readFile calls — to find usages, imports, or patterns across a codebase.',
|
|
49
52
|
parameters: z.object({
|
|
50
|
-
pattern: z.string().describe('
|
|
51
|
-
path: z.string().describe('File path
|
|
53
|
+
pattern: z.string().describe('Regex pattern to search for'),
|
|
54
|
+
path: z.string().describe('File OR directory path. Directories are searched recursively.'),
|
|
52
55
|
}),
|
|
53
56
|
execute: async ({ pattern, path }) => {
|
|
54
57
|
const result = await impl.grep(pattern, path);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-adapter.js","sourceRoot":"","sources":["../../src/tools/openai-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,iBAAiB,CAAC,IAAyB,EAAE,gBAA+B,UAAU;IACpG,MAAM,QAAQ,GAAG,IAAI,CAAC;QACpB,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,2FAA2F;QACxG,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;SAC5D,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;KACjD,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,CAAC;QACrB,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,4FAA4F;QACzG,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAClD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;SACjD,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;YACnC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACpC,OAAO,iBAAiB,IAAI,EAAE,CAAC;QACjC,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,CAAC;QACpB,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,oHAAoH;QACjI,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;YACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;SACzD,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,CAAC;QACpB,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,8DAA8D;QAC3E,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;YACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;SAC3E,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC;QAC/C,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,CAAC;QACpB,IAAI,EAAE,MAAM;QACZ,WAAW,
|
|
1
|
+
{"version":3,"file":"openai-adapter.js","sourceRoot":"","sources":["../../src/tools/openai-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TextScratchpad — accumulates assistant text emissions across turns of a
|
|
3
|
+
* sub-agent run. The runner appends text from each turn so that, on any
|
|
4
|
+
* termination (clean exit, abort, timeout, error), the salvage layer can
|
|
5
|
+
* return the best buffered text instead of an empty string.
|
|
6
|
+
*
|
|
7
|
+
* See docs/superpowers/specs/2026-04-10-subagent-completion-supervision-design.md
|
|
8
|
+
* Part A.2.1 for the design rationale.
|
|
9
|
+
*/
|
|
10
|
+
export declare class TextScratchpad {
|
|
11
|
+
private turns;
|
|
12
|
+
/** Record a non-empty text emission for the given turn. Empty/whitespace
|
|
13
|
+
* emissions are ignored — they have no salvage value. */
|
|
14
|
+
append(turn: number, text: string): void;
|
|
15
|
+
isEmpty(): boolean;
|
|
16
|
+
/** All buffered text concatenated, in turn order, separated by a fixed
|
|
17
|
+
* delimiter. Used as the salvage payload when no clean final answer
|
|
18
|
+
* was produced. */
|
|
19
|
+
toString(): string;
|
|
20
|
+
/** The most recent buffered emission. Empty string if isEmpty(). */
|
|
21
|
+
latest(): string;
|
|
22
|
+
/** The longest buffered emission across all turns. Empty string if
|
|
23
|
+
* isEmpty(). Used by the escalation layer to pick the best salvageable
|
|
24
|
+
* result across multiple provider attempts. */
|
|
25
|
+
longest(): string;
|
|
26
|
+
reset(): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=scratchpad.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratchpad.d.ts","sourceRoot":"","sources":["../../src/tools/scratchpad.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAwC;IAErD;8DAC0D;IAC1D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAKxC,OAAO,IAAI,OAAO;IAIlB;;wBAEoB;IACpB,QAAQ,IAAI,MAAM;IAIlB,oEAAoE;IACpE,MAAM,IAAI,MAAM;IAIhB;;oDAEgD;IAChD,OAAO,IAAI,MAAM;IASjB,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TextScratchpad — accumulates assistant text emissions across turns of a
|
|
3
|
+
* sub-agent run. The runner appends text from each turn so that, on any
|
|
4
|
+
* termination (clean exit, abort, timeout, error), the salvage layer can
|
|
5
|
+
* return the best buffered text instead of an empty string.
|
|
6
|
+
*
|
|
7
|
+
* See docs/superpowers/specs/2026-04-10-subagent-completion-supervision-design.md
|
|
8
|
+
* Part A.2.1 for the design rationale.
|
|
9
|
+
*/
|
|
10
|
+
export class TextScratchpad {
|
|
11
|
+
turns = [];
|
|
12
|
+
/** Record a non-empty text emission for the given turn. Empty/whitespace
|
|
13
|
+
* emissions are ignored — they have no salvage value. */
|
|
14
|
+
append(turn, text) {
|
|
15
|
+
if (!text || text.trim().length === 0)
|
|
16
|
+
return;
|
|
17
|
+
this.turns.push({ turn, text });
|
|
18
|
+
}
|
|
19
|
+
isEmpty() {
|
|
20
|
+
return this.turns.length === 0;
|
|
21
|
+
}
|
|
22
|
+
/** All buffered text concatenated, in turn order, separated by a fixed
|
|
23
|
+
* delimiter. Used as the salvage payload when no clean final answer
|
|
24
|
+
* was produced. */
|
|
25
|
+
toString() {
|
|
26
|
+
return this.turns.map((t) => t.text).join('\n\n---\n\n');
|
|
27
|
+
}
|
|
28
|
+
/** The most recent buffered emission. Empty string if isEmpty(). */
|
|
29
|
+
latest() {
|
|
30
|
+
return this.turns.length === 0 ? '' : this.turns[this.turns.length - 1].text;
|
|
31
|
+
}
|
|
32
|
+
/** The longest buffered emission across all turns. Empty string if
|
|
33
|
+
* isEmpty(). Used by the escalation layer to pick the best salvageable
|
|
34
|
+
* result across multiple provider attempts. */
|
|
35
|
+
longest() {
|
|
36
|
+
if (this.turns.length === 0)
|
|
37
|
+
return '';
|
|
38
|
+
let best = this.turns[0].text;
|
|
39
|
+
for (const t of this.turns) {
|
|
40
|
+
if (t.text.length > best.length)
|
|
41
|
+
best = t.text;
|
|
42
|
+
}
|
|
43
|
+
return best;
|
|
44
|
+
}
|
|
45
|
+
reset() {
|
|
46
|
+
this.turns = [];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=scratchpad.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratchpad.js","sourceRoot":"","sources":["../../src/tools/scratchpad.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,OAAO,cAAc;IACjB,KAAK,GAAqC,EAAE,CAAC;IAErD;8DAC0D;IAC1D,MAAM,CAAC,IAAY,EAAE,IAAY;QAC/B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC9C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACjC,CAAC;IAED;;wBAEoB;IACpB,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3D,CAAC;IAED,oEAAoE;IACpE,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,CAAC;IAED;;oDAEgD;IAChD,OAAO;QACL,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACvC,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;gBAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACjD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;CACF"}
|
package/dist/tools/tracker.d.ts
CHANGED
|
@@ -1,7 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks file accesses and tool invocations inside a sub-agent run so the
|
|
3
|
+
* runner can report what the worker actually did. Reads, writes, and tool
|
|
4
|
+
* calls are stored separately because they answer different questions for
|
|
5
|
+
* the caller:
|
|
6
|
+
*
|
|
7
|
+
* - filesRead → "what did the worker look at?" (debugging, audit trail)
|
|
8
|
+
* - filesWritten → "what changed on disk?" (review, rollback)
|
|
9
|
+
* - toolCalls → "what did the worker actually do, in order?"
|
|
10
|
+
* (debugging, post-mortem)
|
|
11
|
+
*
|
|
12
|
+
* Read-only tasks (audits, surveys, exploration) used to return an empty
|
|
13
|
+
* `files` array because the original tracker only recorded writes. That made
|
|
14
|
+
* it impossible to tell whether the worker had done substantial work or had
|
|
15
|
+
* bailed out immediately.
|
|
16
|
+
*/
|
|
1
17
|
export declare class FileTracker {
|
|
2
|
-
private
|
|
18
|
+
private reads;
|
|
19
|
+
private writes;
|
|
20
|
+
private toolCalls;
|
|
21
|
+
private readonly onToolCall?;
|
|
22
|
+
/**
|
|
23
|
+
* @param onToolCall Optional callback invoked synchronously after every
|
|
24
|
+
* `trackToolCall(...)`. Used by runners (Task 9+) to stream tool
|
|
25
|
+
* invocations out as `ProgressEvent`s in real time. The callback must
|
|
26
|
+
* not throw; the runner wraps it in `safeSink` before passing it in.
|
|
27
|
+
*/
|
|
28
|
+
constructor(onToolCall?: (summary: string) => void);
|
|
29
|
+
trackRead(filePath: string): void;
|
|
3
30
|
trackWrite(filePath: string): void;
|
|
4
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Record a one-line summary of a tool invocation. Order is preserved so
|
|
33
|
+
* the caller can reconstruct what the worker actually did. If an
|
|
34
|
+
* `onToolCall` callback was supplied at construction, it is fired
|
|
35
|
+
* synchronously after the summary is recorded.
|
|
36
|
+
*/
|
|
37
|
+
trackToolCall(summary: string): void;
|
|
38
|
+
getReads(): string[];
|
|
39
|
+
getWrites(): string[];
|
|
40
|
+
getToolCalls(): string[];
|
|
5
41
|
reset(): void;
|
|
6
42
|
}
|
|
7
43
|
//# sourceMappingURL=tracker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/tools/tracker.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAqB;
|
|
1
|
+
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/tools/tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAA4B;IAExD;;;;;OAKG;gBACS,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IAIlD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIjC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIlC;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKpC,QAAQ,IAAI,MAAM,EAAE;IAIpB,SAAS,IAAI,MAAM,EAAE;IAIrB,YAAY,IAAI,MAAM,EAAE;IAIxB,KAAK,IAAI,IAAI;CAKd"}
|
package/dist/tools/tracker.js
CHANGED
|
@@ -1,13 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks file accesses and tool invocations inside a sub-agent run so the
|
|
3
|
+
* runner can report what the worker actually did. Reads, writes, and tool
|
|
4
|
+
* calls are stored separately because they answer different questions for
|
|
5
|
+
* the caller:
|
|
6
|
+
*
|
|
7
|
+
* - filesRead → "what did the worker look at?" (debugging, audit trail)
|
|
8
|
+
* - filesWritten → "what changed on disk?" (review, rollback)
|
|
9
|
+
* - toolCalls → "what did the worker actually do, in order?"
|
|
10
|
+
* (debugging, post-mortem)
|
|
11
|
+
*
|
|
12
|
+
* Read-only tasks (audits, surveys, exploration) used to return an empty
|
|
13
|
+
* `files` array because the original tracker only recorded writes. That made
|
|
14
|
+
* it impossible to tell whether the worker had done substantial work or had
|
|
15
|
+
* bailed out immediately.
|
|
16
|
+
*/
|
|
1
17
|
export class FileTracker {
|
|
2
|
-
|
|
18
|
+
reads = new Set();
|
|
19
|
+
writes = new Set();
|
|
20
|
+
toolCalls = [];
|
|
21
|
+
onToolCall;
|
|
22
|
+
/**
|
|
23
|
+
* @param onToolCall Optional callback invoked synchronously after every
|
|
24
|
+
* `trackToolCall(...)`. Used by runners (Task 9+) to stream tool
|
|
25
|
+
* invocations out as `ProgressEvent`s in real time. The callback must
|
|
26
|
+
* not throw; the runner wraps it in `safeSink` before passing it in.
|
|
27
|
+
*/
|
|
28
|
+
constructor(onToolCall) {
|
|
29
|
+
this.onToolCall = onToolCall;
|
|
30
|
+
}
|
|
31
|
+
trackRead(filePath) {
|
|
32
|
+
this.reads.add(filePath);
|
|
33
|
+
}
|
|
3
34
|
trackWrite(filePath) {
|
|
4
|
-
this.
|
|
35
|
+
this.writes.add(filePath);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Record a one-line summary of a tool invocation. Order is preserved so
|
|
39
|
+
* the caller can reconstruct what the worker actually did. If an
|
|
40
|
+
* `onToolCall` callback was supplied at construction, it is fired
|
|
41
|
+
* synchronously after the summary is recorded.
|
|
42
|
+
*/
|
|
43
|
+
trackToolCall(summary) {
|
|
44
|
+
this.toolCalls.push(summary);
|
|
45
|
+
this.onToolCall?.(summary);
|
|
46
|
+
}
|
|
47
|
+
getReads() {
|
|
48
|
+
return [...this.reads].sort();
|
|
49
|
+
}
|
|
50
|
+
getWrites() {
|
|
51
|
+
return [...this.writes].sort();
|
|
5
52
|
}
|
|
6
|
-
|
|
7
|
-
return [...this.
|
|
53
|
+
getToolCalls() {
|
|
54
|
+
return [...this.toolCalls];
|
|
8
55
|
}
|
|
9
56
|
reset() {
|
|
10
|
-
this.
|
|
57
|
+
this.reads.clear();
|
|
58
|
+
this.writes.clear();
|
|
59
|
+
this.toolCalls = [];
|
|
11
60
|
}
|
|
12
61
|
}
|
|
13
62
|
//# sourceMappingURL=tracker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../src/tools/tracker.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAW;IACd,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../src/tools/tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,WAAW;IACd,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1B,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3B,SAAS,GAAa,EAAE,CAAC;IAChB,UAAU,CAA6B;IAExD;;;;;OAKG;IACH,YAAY,UAAsC;QAChD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAED,UAAU,CAAC,QAAgB;QACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,OAAe;QAC3B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,QAAQ;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,SAAS;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;IAED,YAAY;QACV,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;CACF"}
|