@agentteams/runner 0.0.90 → 0.0.92

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.
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Parses OpenCode `run --format json` events into human-readable log entries and extracts the
3
+ * final assistant text. OpenCode emits one JSON object per line shaped as
4
+ * { type, timestamp, sessionID, part: { type, ... } }
5
+ * where `part.type` is one of: text | reasoning | tool | patch | step-start | step-finish.
6
+ *
7
+ * Mirrors stream-json-parser.ts (Claude/AMP) so OpenCode runs are refined the same way instead of
8
+ * dumping raw TUI/JSON output as fallback history.
9
+ */
10
+ import { firstSentence, shortenPath } from './stream-json-parser.js';
11
+ const TOOL_PREVIEW_MAX = 120;
12
+ const BASH_PREVIEW_MAX = 100;
13
+ const REASONING_PREVIEW_MAX = 300;
14
+ const PATCH_FILES_MAX = 4;
15
+ const truncate = (text, max) => (text.length <= max ? text : `${text.slice(0, max)}...`);
16
+ const isVerboseEnabled = (options) => {
17
+ if (options && typeof options.verbose === 'boolean') {
18
+ return options.verbose;
19
+ }
20
+ return process.env.AGENTTEAMS_RUNNER_VERBOSE === '1';
21
+ };
22
+ const stringField = (input, key) => {
23
+ const value = input?.[key];
24
+ return typeof value === 'string' ? value : '';
25
+ };
26
+ export const summarizeOpenCodeTool = (tool, input, cwd) => {
27
+ const safeInput = input ?? {};
28
+ switch (tool) {
29
+ case 'bash': {
30
+ const raw = stringField(safeInput, 'command').trim().split(/\r?\n/)[0] ?? '';
31
+ const command = cwd && raw.includes(cwd) ? raw.split(cwd).join('.') : raw;
32
+ return command ? `bash: ${truncate(command, BASH_PREVIEW_MAX)}` : 'bash';
33
+ }
34
+ case 'read':
35
+ case 'edit':
36
+ case 'write': {
37
+ const filePath = stringField(safeInput, 'filePath') || stringField(safeInput, 'file_path');
38
+ return filePath ? `${tool}: ${shortenPath(filePath, cwd)}` : tool;
39
+ }
40
+ case 'grep': {
41
+ const pattern = stringField(safeInput, 'pattern');
42
+ const path = stringField(safeInput, 'path');
43
+ const location = path ? ` in ${shortenPath(path, cwd)}` : '';
44
+ return pattern ? `grep: "${truncate(pattern, 60)}"${location}` : 'grep';
45
+ }
46
+ case 'glob':
47
+ case 'list': {
48
+ const target = stringField(safeInput, 'pattern') || stringField(safeInput, 'path');
49
+ return target ? `${tool}: ${shortenPath(target, cwd)}` : tool;
50
+ }
51
+ case 'webfetch': {
52
+ const url = stringField(safeInput, 'url');
53
+ return url ? `webfetch: ${truncate(url, 100)}` : 'webfetch';
54
+ }
55
+ case 'task': {
56
+ const description = stringField(safeInput, 'description');
57
+ return description ? `task: ${truncate(description, 80)}` : 'task';
58
+ }
59
+ default: {
60
+ const keys = Object.keys(safeInput).slice(0, 3).join(',');
61
+ return keys ? `${tool}(${keys})` : tool;
62
+ }
63
+ }
64
+ };
65
+ export const parseOpenCodeJsonLine = (line, options) => {
66
+ const trimmed = line.trim();
67
+ if (trimmed.length === 0) {
68
+ return [];
69
+ }
70
+ let parsed;
71
+ try {
72
+ parsed = JSON.parse(trimmed);
73
+ }
74
+ catch {
75
+ return [];
76
+ }
77
+ const part = parsed.part;
78
+ if (!part || !part.type) {
79
+ return [];
80
+ }
81
+ const verbose = isVerboseEnabled(options);
82
+ const cwd = options?.cwd;
83
+ switch (part.type) {
84
+ case 'text': {
85
+ const text = part.text;
86
+ if (text && text.trim().length > 0) {
87
+ return [{ level: 'INFO', message: firstSentence(text) }];
88
+ }
89
+ return [];
90
+ }
91
+ case 'reasoning': {
92
+ if (!verbose) {
93
+ return [];
94
+ }
95
+ const text = part.text;
96
+ if (text && text.trim().length > 0) {
97
+ return [{ level: 'INFO', message: `[Thinking] ${truncate(text.trim(), REASONING_PREVIEW_MAX)}` }];
98
+ }
99
+ return [];
100
+ }
101
+ case 'tool': {
102
+ // Tool parts stream once per state transition; only surface the terminal state to avoid
103
+ // duplicate log lines and to capture failures.
104
+ const status = part.state?.status;
105
+ if (status !== 'completed' && status !== 'error') {
106
+ return [];
107
+ }
108
+ const summary = truncate(summarizeOpenCodeTool(part.tool ?? 'unknown', part.state?.input, cwd), TOOL_PREVIEW_MAX);
109
+ return [
110
+ {
111
+ level: status === 'error' ? 'WARN' : 'INFO',
112
+ message: `[Tool] ${summary}${status === 'error' ? ' (error)' : ''}`,
113
+ },
114
+ ];
115
+ }
116
+ case 'patch': {
117
+ const files = Array.isArray(part.files) ? part.files : [];
118
+ if (files.length === 0) {
119
+ return [];
120
+ }
121
+ const shown = files.slice(0, PATCH_FILES_MAX).map((file) => shortenPath(file, cwd));
122
+ const extra = files.length > PATCH_FILES_MAX ? ` (+${files.length - PATCH_FILES_MAX} more)` : '';
123
+ return [{ level: 'INFO', message: `[Patch] ${shown.join(', ')}${extra}` }];
124
+ }
125
+ case 'step-finish': {
126
+ const reason = part.reason ?? 'unknown';
127
+ const outputTokens = part.tokens?.output;
128
+ const cost = typeof part.cost === 'number' ? `, $${part.cost.toFixed(4)}` : '';
129
+ const tokens = typeof outputTokens === 'number' ? `, ${outputTokens} out tok` : '';
130
+ return [{ level: 'INFO', message: `[Step finished: ${reason}${tokens}${cost}]` }];
131
+ }
132
+ default:
133
+ return [];
134
+ }
135
+ };
136
+ /**
137
+ * Line-buffered parser for chunked OpenCode JSON stdout.
138
+ */
139
+ export const createOpenCodeJsonLineParser = (onEntries, options) => {
140
+ let buffer = '';
141
+ return {
142
+ push(chunk) {
143
+ buffer += chunk;
144
+ const lines = buffer.split('\n');
145
+ buffer = lines.pop() ?? '';
146
+ for (const line of lines) {
147
+ const entries = parseOpenCodeJsonLine(line, options);
148
+ if (entries.length > 0) {
149
+ onEntries(entries);
150
+ }
151
+ }
152
+ },
153
+ flush() {
154
+ if (buffer.trim().length > 0) {
155
+ const entries = parseOpenCodeJsonLine(buffer, options);
156
+ if (entries.length > 0) {
157
+ onEntries(entries);
158
+ }
159
+ }
160
+ buffer = '';
161
+ },
162
+ };
163
+ };
164
+ const collectTextPartsByMessage = (line, texts) => {
165
+ const trimmed = line.trim();
166
+ if (!trimmed.includes('"type":"text"')) {
167
+ return null;
168
+ }
169
+ let parsed;
170
+ try {
171
+ parsed = JSON.parse(trimmed);
172
+ }
173
+ catch {
174
+ return null;
175
+ }
176
+ const part = parsed.part;
177
+ if (part?.type !== 'text' || typeof part.text !== 'string' || part.text.length === 0) {
178
+ return null;
179
+ }
180
+ const messageId = part.messageID ?? '';
181
+ const existing = texts.get(messageId);
182
+ if (existing) {
183
+ existing.push(part.text);
184
+ }
185
+ else {
186
+ texts.set(messageId, [part.text]);
187
+ }
188
+ return messageId;
189
+ };
190
+ const joinMessageText = (texts, messageId) => {
191
+ if (messageId === null) {
192
+ return null;
193
+ }
194
+ const parts = texts.get(messageId);
195
+ if (!parts) {
196
+ return null;
197
+ }
198
+ const joined = parts.join('').trim();
199
+ return joined.length > 0 ? joined : null;
200
+ };
201
+ /**
202
+ * Extracts the final assistant message text from a complete OpenCode JSON transcript. Returns the
203
+ * concatenated `text` parts of the last assistant message, or the raw input when none is found.
204
+ * Analogous to extractResultTextFromStreamJson for Claude/AMP.
205
+ */
206
+ export const extractFinalTextFromOpenCodeJson = (outputText) => {
207
+ const trimmedOutput = outputText.trim();
208
+ const texts = new Map();
209
+ let lastMessageId = null;
210
+ for (const line of trimmedOutput.split(/\r?\n/)) {
211
+ const messageId = collectTextPartsByMessage(line, texts);
212
+ if (messageId !== null) {
213
+ lastMessageId = messageId;
214
+ }
215
+ }
216
+ return joinMessageText(texts, lastMessageId) ?? trimmedOutput;
217
+ };
218
+ /**
219
+ * Captures the final assistant text incrementally so it survives the runner's head-capped output
220
+ * buffer on long runs (the closing `text` parts arrive at the end of the stream).
221
+ */
222
+ export const createOpenCodeFinalTextCapturer = () => {
223
+ let buffer = '';
224
+ const texts = new Map();
225
+ let lastMessageId = null;
226
+ const scan = (line) => {
227
+ const messageId = collectTextPartsByMessage(line, texts);
228
+ if (messageId !== null) {
229
+ lastMessageId = messageId;
230
+ }
231
+ };
232
+ return {
233
+ push(chunk) {
234
+ buffer += chunk;
235
+ const lines = buffer.split('\n');
236
+ buffer = lines.pop() ?? '';
237
+ for (const line of lines) {
238
+ scan(line);
239
+ }
240
+ },
241
+ flush() {
242
+ if (buffer.length > 0) {
243
+ scan(buffer);
244
+ }
245
+ buffer = '';
246
+ },
247
+ get: () => joinMessageText(texts, lastMessageId),
248
+ };
249
+ };
250
+ //# sourceMappingURL=opencode-json-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-json-parser.js","sourceRoot":"","sources":["../../src/runners/opencode-json-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,101 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { createOpenCodeFinalTextCapturer, createOpenCodeJsonLineParser, extractFinalTextFromOpenCodeJson, parseOpenCodeJsonLine, summarizeOpenCodeTool, } from './opencode-json-parser.js';
4
+ const cwd = '/Users/justin/Project/Me/AgentTeams';
5
+ // Event envelopes mirror the real `opencode run --format json` output:
6
+ // { type, timestamp, sessionID, part: { type, ... } }
7
+ const textEvent = (text, messageID = 'msg_1') => JSON.stringify({ type: 'text', timestamp: 1, sessionID: 'ses_1', part: { type: 'text', text, messageID } });
8
+ const toolEvent = (tool, input, status) => JSON.stringify({
9
+ type: 'tool',
10
+ timestamp: 1,
11
+ sessionID: 'ses_1',
12
+ part: { type: 'tool', tool, state: { status, input } },
13
+ });
14
+ test('summarizeOpenCodeTool renders readable summaries with opencode input keys', () => {
15
+ assert.equal(summarizeOpenCodeTool('bash', { command: 'git status\necho done' }), 'bash: git status');
16
+ assert.equal(summarizeOpenCodeTool('read', { filePath: `${cwd}/web/src/foo.ts` }, cwd), 'read: web/src/foo.ts');
17
+ assert.equal(summarizeOpenCodeTool('edit', { filePath: `${cwd}/daemon/src/index.ts` }, cwd), 'edit: daemon/src/index.ts');
18
+ assert.equal(summarizeOpenCodeTool('grep', { pattern: 'foo', path: `${cwd}/src` }, cwd), 'grep: "foo" in src');
19
+ assert.equal(summarizeOpenCodeTool('webfetch', { url: 'https://example.com' }), 'webfetch: https://example.com');
20
+ assert.equal(summarizeOpenCodeTool('custom', { alpha: 1, beta: 2, gamma: 3, delta: 4 }), 'custom(alpha,beta,gamma)');
21
+ assert.equal(summarizeOpenCodeTool('custom', {}), 'custom');
22
+ });
23
+ test('parseOpenCodeJsonLine reduces assistant text to first sentence', () => {
24
+ const line = textEvent('Now wire the refetch into the controller. Next steps follow.');
25
+ assert.deepEqual(parseOpenCodeJsonLine(line), [
26
+ { level: 'INFO', message: 'Now wire the refetch into the controller.' },
27
+ ]);
28
+ });
29
+ test('parseOpenCodeJsonLine only surfaces terminal tool state and flags errors', () => {
30
+ const cmd = { command: 'ls dist' };
31
+ assert.deepEqual(parseOpenCodeJsonLine(toolEvent('bash', cmd, 'running')), []);
32
+ assert.deepEqual(parseOpenCodeJsonLine(toolEvent('bash', cmd, 'completed')), [
33
+ { level: 'INFO', message: '[Tool] bash: ls dist' },
34
+ ]);
35
+ assert.deepEqual(parseOpenCodeJsonLine(toolEvent('bash', cmd, 'error')), [
36
+ { level: 'WARN', message: '[Tool] bash: ls dist (error)' },
37
+ ]);
38
+ });
39
+ test('parseOpenCodeJsonLine summarizes patch and step-finish, hides reasoning by default', () => {
40
+ const patch = JSON.stringify({
41
+ type: 'patch',
42
+ part: { type: 'patch', files: [`${cwd}/api/src/a.ts`, `${cwd}/api/src/b.ts`] },
43
+ });
44
+ assert.deepEqual(parseOpenCodeJsonLine(patch, { cwd }), [
45
+ { level: 'INFO', message: '[Patch] api/src/a.ts, api/src/b.ts' },
46
+ ]);
47
+ const step = JSON.stringify({
48
+ type: 'step_finish',
49
+ part: { type: 'step-finish', reason: 'stop', tokens: { output: 23 }, cost: 0.00266898 },
50
+ });
51
+ assert.deepEqual(parseOpenCodeJsonLine(step), [
52
+ { level: 'INFO', message: '[Step finished: stop, 23 out tok, $0.0027]' },
53
+ ]);
54
+ const reasoning = JSON.stringify({ type: 'reasoning', part: { type: 'reasoning', text: 'hidden by default' } });
55
+ assert.deepEqual(parseOpenCodeJsonLine(reasoning), []);
56
+ assert.deepEqual(parseOpenCodeJsonLine(reasoning, { verbose: true }), [
57
+ { level: 'INFO', message: '[Thinking] hidden by default' },
58
+ ]);
59
+ });
60
+ test('parseOpenCodeJsonLine returns empty for malformed, empty, or partless input', () => {
61
+ assert.deepEqual(parseOpenCodeJsonLine(''), []);
62
+ assert.deepEqual(parseOpenCodeJsonLine('not json'), []);
63
+ assert.deepEqual(parseOpenCodeJsonLine('{"type":"text"}'), []); // no part
64
+ assert.deepEqual(parseOpenCodeJsonLine(JSON.stringify({ type: 'step_start', part: { type: 'step-start' } })), []);
65
+ });
66
+ test('createOpenCodeJsonLineParser handles chunked input', () => {
67
+ const collected = [];
68
+ const parser = createOpenCodeJsonLineParser((entries) => collected.push(...entries.map((e) => e.message)), { cwd });
69
+ const a = toolEvent('read', { filePath: `${cwd}/a.ts` }, 'completed');
70
+ const b = textEvent('All done.');
71
+ const half = Math.floor(a.length / 2);
72
+ parser.push(a.slice(0, half));
73
+ parser.push(`${a.slice(half)}\n${b}\n`);
74
+ assert.deepEqual(collected, ['[Tool] read: a.ts', 'All done.']);
75
+ });
76
+ test('extractFinalTextFromOpenCodeJson returns the last assistant message text', () => {
77
+ const transcript = [
78
+ textEvent('first pass thinking out loud', 'msg_1'),
79
+ toolEvent('bash', { command: 'ls' }, 'completed'),
80
+ textEvent('The final ', 'msg_2'),
81
+ textEvent('answer.', 'msg_2'),
82
+ ].join('\n');
83
+ assert.equal(extractFinalTextFromOpenCodeJson(transcript), 'The final answer.');
84
+ });
85
+ test('extractFinalTextFromOpenCodeJson falls back to raw input when no text part exists', () => {
86
+ const raw = JSON.stringify({ type: 'step_finish', part: { type: 'step-finish', reason: 'stop' } });
87
+ assert.equal(extractFinalTextFromOpenCodeJson(raw), raw);
88
+ });
89
+ test('createOpenCodeFinalTextCapturer retains final text across chunks and survives a head cap', () => {
90
+ const capturer = createOpenCodeFinalTextCapturer();
91
+ assert.equal(capturer.get(), null);
92
+ // Early (head) output, then the closing assistant message split mid-line across pushes.
93
+ capturer.push(`${textEvent('early scratch', 'msg_1')}\n`);
94
+ const closing = `${textEvent('Clean final ', 'msg_2')}\n${textEvent('summary.', 'msg_2')}`;
95
+ const half = Math.floor(closing.length / 2);
96
+ capturer.push(closing.slice(0, half));
97
+ capturer.push(closing.slice(half));
98
+ capturer.flush();
99
+ assert.equal(capturer.get(), 'Clean final summary.');
100
+ });
101
+ //# sourceMappingURL=opencode-json-parser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-json-parser.test.js","sourceRoot":"","sources":["../../src/runners/opencode-json-parser.test.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import { platform } from 'node:os';
5
5
  import { dirname, join } from 'node:path';
6
6
  import { describeExecutableResolution, resolveExecutablePathWithPreference, spawnExecutable } from '../executable.js';
7
7
  import { logger } from '../logger.js';
8
+ import { createOpenCodeFinalTextCapturer, createOpenCodeJsonLineParser } from './opencode-json-parser.js';
8
9
  import { setupCloseWatchdog, terminateRunnerChild } from './process-control.js';
9
10
  const PROMPT_PREVIEW_MAX = 500;
10
11
  const OUTPUT_PREVIEW_MAX = 400;
@@ -21,7 +22,7 @@ const toPowerShellEncodedCommand = (resolvedExecutablePath, prompt, model) => {
21
22
  `$promptText = @'`,
22
23
  `${prompt.replaceAll("'@", "'@")}`,
23
24
  `'@`,
24
- `$promptText | & '${resolvedExecutablePath.replaceAll("'", "''")}' 'run'${modelSegment}`,
25
+ `$promptText | & '${resolvedExecutablePath.replaceAll("'", "''")}' 'run' '--format' 'json'${modelSegment}`,
25
26
  ].join('\r\n');
26
27
  return Buffer.from(scriptContent, 'utf16le').toString('base64');
27
28
  };
@@ -153,6 +154,9 @@ export class OpenCodeRunner {
153
154
  windowsWrapper: isWindows ? 'powershell.exe -EncodedCommand' : null,
154
155
  });
155
156
  const modelArgs = opts.model ? ['--model', opts.model] : [];
157
+ // `--format json` emits structured events (one JSON object per line) instead of the default
158
+ // TUI text, so the runner can refine them into readable logs and a clean fallback summary.
159
+ const runArgs = ['run', '--format', 'json', ...modelArgs];
156
160
  const child = isWindows
157
161
  ? spawn('powershell.exe', ['-NoLogo', '-NonInteractive', '-ExecutionPolicy', 'Bypass', '-EncodedCommand', windowsEncodedCommand ?? ''], {
158
162
  cwd,
@@ -169,7 +173,7 @@ export class OpenCodeRunner {
169
173
  AGENTTEAMS_AGENT_NAME: opts.agentConfigId,
170
174
  },
171
175
  })
172
- : spawnExecutable(this.runnerCmd, ['run', ...modelArgs, opts.prompt], {
176
+ : spawnExecutable(this.runnerCmd, [...runArgs, opts.prompt], {
173
177
  cwd,
174
178
  detached: true,
175
179
  stdio: ['ignore', 'pipe', 'pipe'],
@@ -191,21 +195,34 @@ export class OpenCodeRunner {
191
195
  let lastOutput = '';
192
196
  let lastErrorOutput = '';
193
197
  const outputCapture = createOpenCodeOutputCapture();
198
+ // Refine the JSON event stream into readable log lines (live log) and a clean final-text
199
+ // summary (fallback history). finalTextCapturer survives the head-capped raw buffer on long runs.
200
+ const finalTextCapturer = createOpenCodeFinalTextCapturer();
194
201
  const idleTimer = { reset: () => { } };
202
+ const jsonLineParser = createOpenCodeJsonLineParser((entries) => {
203
+ for (const entry of entries) {
204
+ lastOutput = entry.message;
205
+ opts.onStdoutChunk?.(entry.message);
206
+ }
207
+ }, { cwd });
208
+ const finalizeOutputText = () => {
209
+ finalTextCapturer.flush();
210
+ return finalTextCapturer.get() ?? outputCapture.toResultOutputText();
211
+ };
195
212
  child.stdout?.on('data', (chunk) => {
196
213
  const rawOutput = Buffer.isBuffer(chunk) ? chunk.toString('utf8') : String(chunk);
197
- outputCapture.appendStdout(rawOutput);
198
- const output = toOutputPreview(rawOutput);
199
- if (output.length > 0) {
200
- lastOutput = output;
201
- idleTimer.reset();
202
- opts.onStdoutChunk?.(output);
203
- logger.info('Runner stdout', {
204
- triggerId: opts.triggerId,
205
- pid: child.pid,
206
- output,
207
- });
214
+ if (rawOutput.length === 0) {
215
+ return;
208
216
  }
217
+ outputCapture.appendStdout(rawOutput);
218
+ finalTextCapturer.push(rawOutput);
219
+ jsonLineParser.push(rawOutput);
220
+ idleTimer.reset();
221
+ logger.info('Runner stdout', {
222
+ triggerId: opts.triggerId,
223
+ pid: child.pid,
224
+ output: toOutputPreview(rawOutput),
225
+ });
209
226
  });
210
227
  child.stderr?.on('data', (chunk) => {
211
228
  const rawOutput = Buffer.isBuffer(chunk) ? chunk.toString('utf8') : String(chunk);
@@ -291,7 +308,7 @@ export class OpenCodeRunner {
291
308
  resolve({
292
309
  exitCode: 1,
293
310
  lastOutput,
294
- outputText: outputCapture.toResultOutputText(),
311
+ outputText: finalizeOutputText(),
295
312
  errorMessage: error.message,
296
313
  });
297
314
  });
@@ -299,6 +316,7 @@ export class OpenCodeRunner {
299
316
  child.on('close', (code) => {
300
317
  closeWatchdog.cancel();
301
318
  clearTimeout(timeoutId);
319
+ jsonLineParser.flush();
302
320
  cleanup();
303
321
  logger.info('Runner process closed', {
304
322
  triggerId: opts.triggerId,
@@ -311,7 +329,7 @@ export class OpenCodeRunner {
311
329
  exitCode: 1,
312
330
  idleTimedOut,
313
331
  lastOutput,
314
- outputText: outputCapture.toResultOutputText(),
332
+ outputText: finalizeOutputText(),
315
333
  errorMessage: idleTimedOut
316
334
  ? `Runner idle timed out after ${Math.round(opts.idleTimeoutMs / 60_000)}m of no output`
317
335
  : `Runner fail-safe timed out after ${Math.round(opts.timeoutMs / 3_600_000)}h`,
@@ -323,7 +341,7 @@ export class OpenCodeRunner {
323
341
  exitCode: 1,
324
342
  cancelled: true,
325
343
  lastOutput,
326
- outputText: outputCapture.toResultOutputText(),
344
+ outputText: finalizeOutputText(),
327
345
  errorMessage: 'Runner cancelled by user',
328
346
  });
329
347
  return;
@@ -331,7 +349,7 @@ export class OpenCodeRunner {
331
349
  resolve({
332
350
  exitCode: code ?? 1,
333
351
  lastOutput,
334
- outputText: outputCapture.toResultOutputText(),
352
+ outputText: finalizeOutputText(),
335
353
  errorMessage: code === 0 ? undefined : lastErrorOutput || lastOutput || `Runner exited with code ${code ?? 1}`,
336
354
  });
337
355
  });
@@ -1 +1 @@
1
- {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/runners/opencode.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/runners/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,4BAA4B,EAAE,mCAAmC,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACtH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,+BAA+B,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAC1G,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAGhF,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAEnC,MAAM,0BAA0B,GAAG,CAAC,sBAA8B,EAAE,MAAc,EAAE,KAAqB,EAAU,EAAE;IACnH,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,eAAe,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,MAAM,aAAa,GAAG;QACpB,iCAAiC;QACjC,sDAAsD;QACtD,uCAAuC;QACvC,wCAAwC;QACxC,8BAA8B;QAC9B,oBAAoB;QACpB,kBAAkB;QAClB,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;QAClC,IAAI;QACJ,oBAAoB,sBAAsB,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,4BAA4B,YAAY,EAAE;KAC3G,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEf,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,MAAc,EAAU,EAAE;IACjD,IAAI,MAAM,CAAC,MAAM,IAAI,kBAAkB,EAAE,CAAC;QACxC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC;AACrD,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAc,EAAU,EAAE;IACjD,MAAM,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxE,IAAI,IAAI,CAAC,MAAM,IAAI,kBAAkB,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC;AACnD,CAAC,CAAC;AAEF,mEAAmE;AACnE,0DAA0D;AAC1D,wEAAwE;AACxE,qEAAqE;AACrE,4DAA4D;AAC5D,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,KAAa,EAAW,EAAE;IAChE,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACnE,CAAC,CAAC;AAMF,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAEpC,MAAM,qBAAqB,GAAG,CAAC,KAAa,EAAU,EAAE;IACtD,MAAM,OAAO,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACxC,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC;IAErB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,OAAO,WAAW,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC1D,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC1B,MAAM;YACR,CAAC;YAED,MAAM,cAAc,GAClB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACzG,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;YAC/D,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,WAAW,GAAG,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;gBAC7C,SAAS;YACX,CAAC;YAED,WAAW,GAAG,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YAC1F,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,KAAa,EAAE,KAAkC,EAAU,EAAE;IACvG,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;YACtD,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;gBACpB,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACjE,KAAK,CAAC,kBAAkB,GAAG,KAAK,CAAC;YACjC,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,SAAS,CAAC;YACpB,MAAM;QACR,CAAC;QAED,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAC1C,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACzC,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAClC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,EAAE;IAC9C,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,MAAM,WAAW,GAAgC,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC;IAE/E,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAE,EAAE;QACzC,IAAI,UAAU,CAAC,MAAM,IAAI,kBAAkB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClE,OAAO;QACT,CAAC;QAED,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACvE,CAAC,CAAC;IAEF,OAAO;QACL,YAAY,CAAC,KAAa;YACxB,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QACD,YAAY,CAAC,KAAa;YACxB,gBAAgB,CAAC,2BAA2B,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;QACpE,CAAC;QACD,kBAAkB;YAChB,OAAO,UAAU,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;QACxC,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,OAAO,cAAc;IACI;IAA7B,YAA6B,YAAoB,UAAU;QAA9B,cAAS,GAAT,SAAS,CAAqB;IAAG,CAAC;IAE/D,KAAK,CAAC,GAAG,CAAC,IAAmB;QAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxD,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;YAChD,OAAO;gBACL,QAAQ,EAAE,CAAC;gBACX,YAAY,EAAE,iCAAiC;aAChD,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,SAAS,MAAM,CAAC,CAAC;QACnF,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,QAAQ,EAAE,KAAK,OAAO,CAAC;QACzC,MAAM,sBAAsB,GAAG,SAAS;YACtC,CAAC,CAAC,mCAAmC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAChG,CAAC,CAAC,mCAAmC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAC1E,MAAM,qBAAqB,GAAG,SAAS;YACrC,CAAC,CAAC,0BAA0B,CAAC,sBAAsB,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;YAC7E,CAAC,CAAC,IAAI,CAAC;QACT,MAAM,cAAc,GAAG,4BAA4B,CAAC,IAAI,CAAC,SAAS,EAAE;YAClE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;SACnD,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAChC,aAAa,EAAE,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;YAC3C,gBAAgB,EAAE,cAAc,CAAC,gBAAgB;YACjD,sBAAsB;YACtB,QAAQ,EAAE,cAAc,CAAC,QAAQ;YACjC,KAAK,EAAE,cAAc,CAAC,KAAK;YAC3B,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;YAClC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,IAAI;SACpE,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,4FAA4F;QAC5F,2FAA2F;QAC3F,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,SAAS;YACrB,CAAC,CAAC,KAAK,CACH,gBAAgB,EAChB,CAAC,SAAS,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,qBAAqB,IAAI,EAAE,CAAC,EAC5G;gBACE,GAAG;gBACH,QAAQ,EAAE,KAAK;gBACf,KAAK,EAAE,KAAK;gBACZ,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;gBACjC,GAAG,EAAE;oBACH,GAAG,OAAO,CAAC,GAAG;oBACd,kBAAkB,EAAE,IAAI,CAAC,MAAM;oBAC/B,kBAAkB,EAAE,IAAI,CAAC,MAAM;oBAC/B,kBAAkB,EAAE,IAAI,CAAC,MAAM;oBAC/B,qBAAqB,EAAE,IAAI,CAAC,SAAS;oBACrC,qBAAqB,EAAE,IAAI,CAAC,aAAa;iBAC1C;aACF,CACF;YACH,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;gBACzD,GAAG;gBACH,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;gBACjC,GAAG,EAAE;oBACH,GAAG,OAAO,CAAC,GAAG;oBACd,kBAAkB,EAAE,IAAI,CAAC,MAAM;oBAC/B,kBAAkB,EAAE,IAAI,CAAC,MAAM;oBAC/B,kBAAkB,EAAE,IAAI,CAAC,MAAM;oBAC/B,qBAAqB,EAAE,IAAI,CAAC,SAAS;oBACrC,qBAAqB,EAAE,IAAI,CAAC,aAAa;iBAC1C;aACF,CAAC,CAAC;QAEP,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7D,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC5B,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,eAAe,GAAG,EAAE,CAAC;QACzB,MAAM,aAAa,GAAG,2BAA2B,EAAE,CAAC;QACpD,yFAAyF;QACzF,kGAAkG;QAClG,MAAM,iBAAiB,GAAG,+BAA+B,EAAE,CAAC;QAE5D,MAAM,SAAS,GAAG,EAAE,KAAK,EAAE,GAAS,EAAE,GAAE,CAAC,EAAE,CAAC;QAC5C,MAAM,cAAc,GAAG,4BAA4B,CACjD,CAAC,OAAO,EAAE,EAAE;YACV,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC3B,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;QACH,CAAC,EACD,EAAE,GAAG,EAAE,CACR,CAAC;QAEF,MAAM,kBAAkB,GAAG,GAAuB,EAAE;YAClD,iBAAiB,CAAC,KAAK,EAAE,CAAC;YAC1B,OAAO,iBAAiB,CAAC,GAAG,EAAE,IAAI,aAAa,CAAC,kBAAkB,EAAE,CAAC;QACvE,CAAC,CAAC;QAEF,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAClF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO;YACT,CAAC;YACD,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACtC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/B,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;gBAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,MAAM,EAAE,eAAe,CAAC,SAAS,CAAC;aACnC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAClF,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,UAAU,GAAG,MAAM,CAAC;gBACpB,eAAe,GAAG,MAAM,CAAC;gBACzB,SAAS,CAAC,KAAK,EAAE,CAAC;gBAClB,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;oBAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,GAAG,EAAE,KAAK,CAAC,GAAG;oBACd,MAAM;iBACP,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC5B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG;YACH,OAAO;YACP,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC,CAAC;QAEH,OAAO,MAAM,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,EAAE;YAC9C,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,YAAY,GAAG,KAAK,CAAC;YACzB,IAAI,SAAS,GAAG,KAAK,CAAC;YAEtB,IAAI,aAAa,GAAyC,IAAI,CAAC;YAE/D,MAAM,gBAAgB,GAAG,GAAG,EAAE;gBAC5B,IAAI,aAAa,EAAE,CAAC;oBAClB,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC9B,CAAC;gBAED,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC9B,YAAY,GAAG,IAAI,CAAC;oBACpB,QAAQ,GAAG,IAAI,CAAC;oBAChB,MAAM,CAAC,IAAI,CAAC,mEAAmE,EAAE;wBAC/E,SAAS,EAAE,IAAI,CAAC,SAAS;wBACzB,aAAa,EAAE,IAAI,CAAC,aAAa;qBAClC,CAAC,CAAC;oBACH,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBACpE,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YACzB,CAAC,CAAC;YAEF,SAAS,CAAC,KAAK,GAAG,GAAG,EAAE;gBACrB,gBAAgB,EAAE,CAAC;YACrB,CAAC,CAAC;YAEF,gBAAgB,EAAE,CAAC;YAEnB,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,IAAI,QAAQ,EAAE,CAAC;oBACb,OAAO;gBACT,CAAC;gBAED,QAAQ,GAAG,IAAI,CAAC;gBAChB,IAAI,aAAa,EAAE,CAAC;oBAClB,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC9B,CAAC;gBAED,SAAS,CAAC,KAAK,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;gBAC3B,SAAS,CAAC,GAAG,EAAE,CAAC;gBAChB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBAChB,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC,CAAC;YACF,MAAM,WAAW,GAAG,GAAG,EAAE;gBACvB,SAAS,GAAG,IAAI,CAAC;gBACjB,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACnE,CAAC,CAAC;YACF,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAChC,QAAQ,GAAG,IAAI,CAAC;gBAChB,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACpE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAEnB,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;gBACzB,WAAW,EAAE,CAAC;YAChB,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACvB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACrE,CAAC;YAED,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC1B,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;oBAC3C,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,KAAK,EAAE,KAAK,CAAC,OAAO;iBACrB,CAAC,CAAC;gBACH,OAAO,CAAC;oBACN,QAAQ,EAAE,CAAC;oBACX,UAAU;oBACV,UAAU,EAAE,kBAAkB,EAAE;oBAChC,YAAY,EAAE,KAAK,CAAC,OAAO;iBAC5B,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAEhE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,aAAa,CAAC,MAAM,EAAE,CAAC;gBACvB,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,cAAc,CAAC,KAAK,EAAE,CAAC;gBACvB,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;oBACnC,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,GAAG,EAAE,KAAK,CAAC,GAAG;oBACd,QAAQ,EAAE,IAAI;oBACd,QAAQ;iBACT,CAAC,CAAC;gBAEH,IAAI,QAAQ,EAAE,CAAC;oBACb,OAAO,CAAC;wBACN,QAAQ,EAAE,CAAC;wBACX,YAAY;wBACZ,UAAU;wBACV,UAAU,EAAE,kBAAkB,EAAE;wBAChC,YAAY,EAAE,YAAY;4BACxB,CAAC,CAAC,+BAA+B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,gBAAgB;4BACxF,CAAC,CAAC,oCAAoC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG;qBAClF,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,IAAI,SAAS,EAAE,CAAC;oBACd,OAAO,CAAC;wBACN,QAAQ,EAAE,CAAC;wBACX,SAAS,EAAE,IAAI;wBACf,UAAU;wBACV,UAAU,EAAE,kBAAkB,EAAE;wBAChC,YAAY,EAAE,0BAA0B;qBACzC,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC;oBACN,QAAQ,EAAE,IAAI,IAAI,CAAC;oBACnB,UAAU;oBACV,UAAU,EAAE,kBAAkB,EAAE;oBAChC,YAAY,EACV,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,IAAI,UAAU,IAAI,2BAA2B,IAAI,IAAI,CAAC,EAAE;iBACnG,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -14,6 +14,21 @@ export declare const shortenPath: (path: string, cwd?: string) => string;
14
14
  export declare const firstSentence: (text: string, cap?: number) => string;
15
15
  export declare const summarizeToolUse: (name: string, input: Record<string, unknown> | undefined, cwd?: string) => string;
16
16
  export declare const parseStreamJsonLine: (line: string, options?: ParseOptions) => ParsedLogEntry[];
17
+ /**
18
+ * Captures the most recent `"type":"result"` line from chunked stdout, independent of the
19
+ * runner's head-capped output buffer (OUTPUT_CAPTURE_MAX). The terminal `result` event arrives
20
+ * at the very end of a run, so on long runs it falls outside the head-capped buffer and the
21
+ * fallback history (extractResultTextFromStreamJson) can never surface the clean final text.
22
+ * Retaining just that single line lets the fallback stay readable regardless of run length.
23
+ *
24
+ * Uses the same `"type":"result"` substring heuristic as extractResultTextFromStreamJson so the
25
+ * two agree on what counts as a result line.
26
+ */
27
+ export declare const createResultLineCapturer: () => {
28
+ push: (chunk: string) => void;
29
+ flush: () => void;
30
+ get: () => string | null;
31
+ };
17
32
  /**
18
33
  * Creates a line-buffered parser that handles chunked stdout data.
19
34
  * Stream data may arrive as partial lines, so this buffers until newlines.
@@ -181,6 +181,43 @@ export const parseStreamJsonLine = (line, options) => {
181
181
  }
182
182
  return entries;
183
183
  };
184
+ /**
185
+ * Captures the most recent `"type":"result"` line from chunked stdout, independent of the
186
+ * runner's head-capped output buffer (OUTPUT_CAPTURE_MAX). The terminal `result` event arrives
187
+ * at the very end of a run, so on long runs it falls outside the head-capped buffer and the
188
+ * fallback history (extractResultTextFromStreamJson) can never surface the clean final text.
189
+ * Retaining just that single line lets the fallback stay readable regardless of run length.
190
+ *
191
+ * Uses the same `"type":"result"` substring heuristic as extractResultTextFromStreamJson so the
192
+ * two agree on what counts as a result line.
193
+ */
194
+ export const createResultLineCapturer = () => {
195
+ let buffer = '';
196
+ let lastResultLine = null;
197
+ const scan = (line) => {
198
+ const trimmed = line.trim();
199
+ if (trimmed.includes('"type":"result"')) {
200
+ lastResultLine = trimmed;
201
+ }
202
+ };
203
+ return {
204
+ push(chunk) {
205
+ buffer += chunk;
206
+ const lines = buffer.split('\n');
207
+ buffer = lines.pop() ?? '';
208
+ for (const line of lines) {
209
+ scan(line);
210
+ }
211
+ },
212
+ flush() {
213
+ if (buffer.length > 0) {
214
+ scan(buffer);
215
+ }
216
+ buffer = '';
217
+ },
218
+ get: () => lastResultLine,
219
+ };
220
+ };
184
221
  /**
185
222
  * Creates a line-buffered parser that handles chunked stdout data.
186
223
  * Stream data may arrive as partial lines, so this buffers until newlines.