@agentteams/runner 0.0.119 → 0.0.120
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/executable.js +14 -1
- package/dist/executable.js.map +1 -1
- package/dist/executable.test.js +12 -0
- package/dist/executable.test.js.map +1 -1
- package/dist/runners/capabilities.js +9 -0
- package/dist/runners/capabilities.js.map +1 -1
- package/dist/runners/capabilities.test.js +12 -2
- package/dist/runners/capabilities.test.js.map +1 -1
- package/dist/runners/engine-commands.js +4 -0
- package/dist/runners/engine-commands.js.map +1 -1
- package/dist/runners/index.js +3 -0
- package/dist/runners/index.js.map +1 -1
- package/dist/runners/index.test.js +2 -0
- package/dist/runners/index.test.js.map +1 -1
- package/dist/runners/omp-identity.d.ts +12 -0
- package/dist/runners/omp-identity.js +21 -0
- package/dist/runners/omp-identity.js.map +1 -0
- package/dist/runners/omp.d.ts +49 -0
- package/dist/runners/omp.js +341 -0
- package/dist/runners/omp.js.map +1 -0
- package/dist/runners/omp.test.d.ts +1 -0
- package/dist/runners/omp.test.js +194 -0
- package/dist/runners/omp.test.js.map +1 -0
- package/dist/utils/engine-probe.js +7 -3
- package/dist/utils/engine-probe.js.map +1 -1
- package/dist/utils/engine-probe.test.js +10 -0
- package/dist/utils/engine-probe.test.js.map +1 -1
- package/dist/utils/model-enumerator.d.ts +25 -0
- package/dist/utils/model-enumerator.js +62 -0
- package/dist/utils/model-enumerator.js.map +1 -1
- package/dist/utils/model-enumerator.test.js +56 -1
- package/dist/utils/model-enumerator.test.js.map +1 -1
- package/native/bin/win32-x64/agentrunner-launcher.exe +0 -0
- package/native/bin/win32-x64/manifest.json +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { createWriteStream } from 'node:fs';
|
|
3
|
+
import { mkdir, rm, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { platform } from 'node:os';
|
|
5
|
+
import { dirname, join } from 'node:path';
|
|
6
|
+
import { resolveExecutablePathsWithPreferenceAsync, runProbeCommand } from '../executable.js';
|
|
7
|
+
import { logger } from '../logger.js';
|
|
8
|
+
import { selectRunnerFailureMessage } from './failure-message.js';
|
|
9
|
+
import { createAnsiStripper, stripAnsiSequences } from './kiro-cli.js';
|
|
10
|
+
import { findOmpExecutable, isOmpExecutable } from './omp-identity.js';
|
|
11
|
+
import { setupCloseWatchdog, terminateRunnerChild } from './process-control.js';
|
|
12
|
+
import { buildRunnerChildEnv } from './session-env.js';
|
|
13
|
+
const OUTPUT_PREVIEW_MAX = 400;
|
|
14
|
+
const OUTPUT_CAPTURE_MAX = 200_000;
|
|
15
|
+
const normalizedModel = (model) => (typeof model === 'string' ? model.trim() : '');
|
|
16
|
+
const toPromptAttachArg = (promptFilePath) => `@${promptFilePath}`;
|
|
17
|
+
/**
|
|
18
|
+
* Headless argument contract, measured against omp/18.0.4 on 2026-08-24 (macOS arm64).
|
|
19
|
+
*
|
|
20
|
+
* - `-p/--print` is the oneshot flag. The prompt must not be a positional argument
|
|
21
|
+
* that starts with `-` — clap reports `Error: unknown flag` and exits 2. Every
|
|
22
|
+
* runner prompt starts with a markdown bullet, so the prompt is passed as `@file`.
|
|
23
|
+
* - `--no-session` keeps the run from writing a reusable session next to the user's.
|
|
24
|
+
* - Permission bypass is `--auto-approve` plus `--approval-mode yolo`. `--yolo` is
|
|
25
|
+
* accepted as an alias but is undocumented in `--help`; the long flags are the
|
|
26
|
+
* measured surface. Default config is already `tools.approvalMode=yolo`.
|
|
27
|
+
* - `--cwd` sets the workspace. `--model` is consumed; unknown ids exit 1 with
|
|
28
|
+
* `Model "…" not found` (no silent fallback). `default` is the platform sentinel.
|
|
29
|
+
* - 스트림 분리(2026-08-25 재실측, 로컬 OpenAI 호환 목 공급자로 성공 경로를 재현):
|
|
30
|
+
* 성공하면 **stdout**에 최종 답변만 나오고(`OMP_STDOUT_PROBE_ANSWER_42\n`, exit 0),
|
|
31
|
+
* stderr에는 `Working...\n` 한 줄만 남는다. 실패하면 stdout은 0바이트이고 오류는
|
|
32
|
+
* 전부 stderr로 나온다(exit 1). 그래서 stdout만 `outputText`/`onStdoutChunk`로
|
|
33
|
+
* 흘리고 stderr는 진행 로그로 취급하는 이 배선이 맞다.
|
|
34
|
+
* - 구조화 `--mode json`은 쓰지 않는다. NDJSON을 stdout으로 내기는 하지만 402 같은
|
|
35
|
+
* 공급자 실패에도 **exit 0**을 돌려줘 종료 코드 기반 실패 판정이 무력화된다
|
|
36
|
+
* (2026-08-25 실측). 평문 모드는 실패를 exit 1로 정직하게 보고한다.
|
|
37
|
+
*/
|
|
38
|
+
export const buildOmpArgs = (promptFilePath, cwd, model) => {
|
|
39
|
+
const selectedModel = normalizedModel(model);
|
|
40
|
+
const modelArgs = selectedModel.length > 0 && selectedModel !== 'default' ? ['--model', selectedModel] : [];
|
|
41
|
+
return [
|
|
42
|
+
'-p',
|
|
43
|
+
'--no-session',
|
|
44
|
+
'--auto-approve',
|
|
45
|
+
'--approval-mode',
|
|
46
|
+
'yolo',
|
|
47
|
+
'--cwd',
|
|
48
|
+
cwd,
|
|
49
|
+
toPromptAttachArg(promptFilePath),
|
|
50
|
+
...modelArgs,
|
|
51
|
+
];
|
|
52
|
+
};
|
|
53
|
+
export const getOmpExecutablePreference = (isWindows) => (isWindows ? ['omp.exe', 'omp'] : ['omp']);
|
|
54
|
+
const toPowerShellLiteral = (value) => `'${value.replaceAll("'", "''")}'`;
|
|
55
|
+
export const toOmpPowerShellEncodedCommand = (resolvedExecutablePath, promptFilePath, cwd, model) => {
|
|
56
|
+
const argSegment = buildOmpArgs(promptFilePath, cwd, model)
|
|
57
|
+
.map((arg) => ` ${toPowerShellLiteral(arg)}`)
|
|
58
|
+
.join('');
|
|
59
|
+
const scriptContent = [
|
|
60
|
+
"$ErrorActionPreference = 'Stop'",
|
|
61
|
+
'$utf8NoBom = [System.Text.UTF8Encoding]::new($false)',
|
|
62
|
+
'[Console]::InputEncoding = $utf8NoBom',
|
|
63
|
+
'[Console]::OutputEncoding = $utf8NoBom',
|
|
64
|
+
'$OutputEncoding = $utf8NoBom',
|
|
65
|
+
'chcp 65001 > $null',
|
|
66
|
+
`& ${toPowerShellLiteral(resolvedExecutablePath)}${argSegment}`,
|
|
67
|
+
].join('\r\n');
|
|
68
|
+
return Buffer.from(scriptContent, 'utf16le').toString('base64');
|
|
69
|
+
};
|
|
70
|
+
const toOutputPreview = (text) => {
|
|
71
|
+
const trimmed = text.trim();
|
|
72
|
+
return trimmed.length <= OUTPUT_PREVIEW_MAX ? trimmed : `${trimmed.slice(0, OUTPUT_PREVIEW_MAX)}...`;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* omp는 성공·실패를 가리지 않고 stderr로 진행 로그를 먼저 쓴다. 판정은 Kiro와 같은
|
|
76
|
+
* **차단목록**이다 — 오류 문구를 열거하면 형태를 모르는 공급자 오류를 통째로 놓친다.
|
|
77
|
+
*
|
|
78
|
+
* 여기 열거한 진행 문구는 omp/18.0.4 바이너리에서 실제로 stderr에 쓰는 것들이다
|
|
79
|
+
* (2026-08-25 실측).
|
|
80
|
+
* - `Working...`: 요청 시작 시점에 text 모드에서 한 번 쓴다. **성공 실행에서도 나온다.**
|
|
81
|
+
* 이 줄을 걸러내지 않으면 첫 오류 신호로 latch돼 수 초 뒤 도착하는 진짜 사유
|
|
82
|
+
* (`402 Insufficient credits …`, `404 No endpoints found …`)를 덮어쓴다.
|
|
83
|
+
* - `Still starting after <N>s — phase: …` + 뒤따르는 `logs: … PI_DEBUG_STARTUP …`:
|
|
84
|
+
* 기동이 느릴 때 주기적으로 쓰는 2줄 안내.
|
|
85
|
+
* - `Reading prompt from piped stdin …`: 러너는 stdin을 `ignore`로 두므로 도달하지
|
|
86
|
+
* 않지만, 진행 문구지 오류가 아니라 함께 막아 둔다.
|
|
87
|
+
*/
|
|
88
|
+
const PROGRESS_ONLY_LINE_PATTERNS = [
|
|
89
|
+
/^\(node:\d+\) Warning:/i,
|
|
90
|
+
/NO_COLOR/i,
|
|
91
|
+
/FORCE_COLOR/i,
|
|
92
|
+
/trace-warnings/i,
|
|
93
|
+
/^Use `omp --trace-warnings/i,
|
|
94
|
+
/^Working\.\.\.$/,
|
|
95
|
+
/^Still starting after \d+s/i,
|
|
96
|
+
/^logs:\s.*PI_DEBUG_STARTUP/i,
|
|
97
|
+
/^Reading prompt from piped stdin/i,
|
|
98
|
+
];
|
|
99
|
+
const isProgressOnlyOutput = (text) => {
|
|
100
|
+
const lines = text
|
|
101
|
+
.split('\n')
|
|
102
|
+
.map((line) => line.trim())
|
|
103
|
+
.filter((line) => line.length > 0);
|
|
104
|
+
return lines.every((line) => PROGRESS_ONLY_LINE_PATTERNS.some((pattern) => pattern.test(line)));
|
|
105
|
+
};
|
|
106
|
+
const looksLikeErrorOutput = (text) => text.trim().length > 0 && !isProgressOnlyOutput(text);
|
|
107
|
+
const defaultDependencies = {
|
|
108
|
+
platform,
|
|
109
|
+
resolveExecutablePathsWithPreferenceAsync,
|
|
110
|
+
runProbeCommand,
|
|
111
|
+
spawn,
|
|
112
|
+
createWriteStream,
|
|
113
|
+
mkdir,
|
|
114
|
+
writeFile,
|
|
115
|
+
rm,
|
|
116
|
+
setupCloseWatchdog,
|
|
117
|
+
terminateRunnerChild,
|
|
118
|
+
};
|
|
119
|
+
export class OmpRunner {
|
|
120
|
+
deps;
|
|
121
|
+
constructor(dependencies = {}) {
|
|
122
|
+
this.deps = { ...defaultDependencies, ...dependencies };
|
|
123
|
+
}
|
|
124
|
+
async run(opts) {
|
|
125
|
+
if (!opts.authPath || opts.authPath.trim().length === 0) {
|
|
126
|
+
logger.error('authPath is missing for trigger');
|
|
127
|
+
return { exitCode: 1, errorMessage: 'authPath is missing for trigger' };
|
|
128
|
+
}
|
|
129
|
+
const cwd = opts.authPath;
|
|
130
|
+
const logPath = join(cwd, '.agentteams', 'runner', 'log', `${opts.triggerId}.log`);
|
|
131
|
+
await this.deps.mkdir(dirname(logPath), { recursive: true });
|
|
132
|
+
const isWindows = this.deps.platform() === 'win32';
|
|
133
|
+
const resolvedExecutablePath = await findOmpExecutable(getOmpExecutablePreference(isWindows), {
|
|
134
|
+
resolveExecutablePathsWithPreferenceAsync: this.deps.resolveExecutablePathsWithPreferenceAsync,
|
|
135
|
+
runProbeCommand: this.deps.runProbeCommand,
|
|
136
|
+
platform: this.deps.platform,
|
|
137
|
+
});
|
|
138
|
+
if (!resolvedExecutablePath) {
|
|
139
|
+
const message = "Cannot find an official Oh My Pi executable. Every 'omp' candidate failed the 'Oh My Pi' identity check.";
|
|
140
|
+
logger.error('Oh My Pi executable identity check failed', { triggerId: opts.triggerId });
|
|
141
|
+
return { exitCode: 1, errorMessage: message };
|
|
142
|
+
}
|
|
143
|
+
const promptFilePath = join(cwd, '.agentteams', 'runner', 'tmp', `${opts.triggerId}.prompt.md`);
|
|
144
|
+
await this.deps.mkdir(dirname(promptFilePath), { recursive: true });
|
|
145
|
+
await this.deps.writeFile(promptFilePath, opts.prompt, { encoding: 'utf8' });
|
|
146
|
+
const removePromptFile = async () => {
|
|
147
|
+
try {
|
|
148
|
+
await this.deps.rm(promptFilePath, { force: true });
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
logger.warn('Failed to remove Oh My Pi prompt temp file', {
|
|
152
|
+
triggerId: opts.triggerId,
|
|
153
|
+
promptFilePath,
|
|
154
|
+
error: error instanceof Error ? error.message : String(error),
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
const args = buildOmpArgs(promptFilePath, cwd, opts.model);
|
|
159
|
+
logger.info('Runner prompt prepared', {
|
|
160
|
+
triggerId: opts.triggerId,
|
|
161
|
+
promptLength: opts.prompt.length,
|
|
162
|
+
promptFilePath,
|
|
163
|
+
requestedCommand: 'omp',
|
|
164
|
+
resolvedExecutablePath,
|
|
165
|
+
platform: isWindows ? 'win32' : this.deps.platform(),
|
|
166
|
+
shell: false,
|
|
167
|
+
detached: !isWindows,
|
|
168
|
+
windowsWrapper: isWindows ? 'powershell.exe -EncodedCommand' : null,
|
|
169
|
+
});
|
|
170
|
+
const env = buildRunnerChildEnv(process.env, opts);
|
|
171
|
+
if (!(await isOmpExecutable(resolvedExecutablePath, {
|
|
172
|
+
runProbeCommand: this.deps.runProbeCommand,
|
|
173
|
+
platform: this.deps.platform,
|
|
174
|
+
}))) {
|
|
175
|
+
await removePromptFile();
|
|
176
|
+
const message = 'The resolved Oh My Pi executable changed identity before launch; execution was refused.';
|
|
177
|
+
logger.error('Oh My Pi executable identity changed before launch', { triggerId: opts.triggerId });
|
|
178
|
+
return { exitCode: 1, errorMessage: message };
|
|
179
|
+
}
|
|
180
|
+
let child;
|
|
181
|
+
try {
|
|
182
|
+
child = isWindows
|
|
183
|
+
? this.deps.spawn('powershell.exe', [
|
|
184
|
+
'-NoLogo',
|
|
185
|
+
'-NonInteractive',
|
|
186
|
+
'-ExecutionPolicy',
|
|
187
|
+
'Bypass',
|
|
188
|
+
'-EncodedCommand',
|
|
189
|
+
toOmpPowerShellEncodedCommand(resolvedExecutablePath, promptFilePath, cwd, opts.model),
|
|
190
|
+
], { cwd, detached: false, shell: false, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'], env })
|
|
191
|
+
: this.deps.spawn(resolvedExecutablePath, args, {
|
|
192
|
+
cwd,
|
|
193
|
+
detached: true,
|
|
194
|
+
shell: false,
|
|
195
|
+
windowsHide: true,
|
|
196
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
197
|
+
env,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
await removePromptFile();
|
|
202
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
203
|
+
logger.error('Runner process launch failed', { triggerId: opts.triggerId, error: message });
|
|
204
|
+
return { exitCode: 1, errorMessage: message };
|
|
205
|
+
}
|
|
206
|
+
const logStream = this.deps.createWriteStream(logPath, { flags: 'a' });
|
|
207
|
+
logStream.on('error', (error) => logger.warn('Runner log stream error', { triggerId: opts.triggerId, error: error.message }));
|
|
208
|
+
child.stdout?.pipe(logStream);
|
|
209
|
+
child.stderr?.pipe(logStream);
|
|
210
|
+
let lastOutput = '';
|
|
211
|
+
let lastErrorOutput = '';
|
|
212
|
+
let firstErrorSignal = '';
|
|
213
|
+
let outputText = '';
|
|
214
|
+
const appendOutputText = (chunk) => {
|
|
215
|
+
if (outputText.length < OUTPUT_CAPTURE_MAX) {
|
|
216
|
+
outputText += chunk.slice(0, OUTPUT_CAPTURE_MAX - outputText.length);
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
const stdoutStripper = createAnsiStripper();
|
|
220
|
+
const stderrStripper = createAnsiStripper();
|
|
221
|
+
const idleTimer = { reset: () => { } };
|
|
222
|
+
child.stdout?.on('data', (chunk) => {
|
|
223
|
+
const rawOutput = Buffer.isBuffer(chunk) ? chunk.toString('utf8') : String(chunk);
|
|
224
|
+
const text = stdoutStripper.push(rawOutput);
|
|
225
|
+
appendOutputText(text);
|
|
226
|
+
const output = toOutputPreview(text);
|
|
227
|
+
if (output.length > 0) {
|
|
228
|
+
lastOutput = output;
|
|
229
|
+
idleTimer.reset();
|
|
230
|
+
opts.onStdoutChunk?.(output, 'TEXT');
|
|
231
|
+
logger.info('Runner stdout', { triggerId: opts.triggerId, pid: child.pid, output });
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
child.stderr?.on('data', (chunk) => {
|
|
235
|
+
const rawOutput = Buffer.isBuffer(chunk) ? chunk.toString('utf8') : String(chunk);
|
|
236
|
+
const output = toOutputPreview(stderrStripper.push(rawOutput));
|
|
237
|
+
if (output.length > 0) {
|
|
238
|
+
lastErrorOutput = output;
|
|
239
|
+
if (firstErrorSignal.length === 0 && looksLikeErrorOutput(output)) {
|
|
240
|
+
firstErrorSignal = output;
|
|
241
|
+
}
|
|
242
|
+
idleTimer.reset();
|
|
243
|
+
logger.info('Oh My Pi progress', { triggerId: opts.triggerId, pid: child.pid, output });
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
logger.info('Runner started', { triggerId: opts.triggerId, cwd, logPath, pid: child.pid });
|
|
247
|
+
return await new Promise((resolve) => {
|
|
248
|
+
let finished = false;
|
|
249
|
+
let timedOut = false;
|
|
250
|
+
let idleTimedOut = false;
|
|
251
|
+
let cancelled = false;
|
|
252
|
+
let idleTimeoutId = null;
|
|
253
|
+
const startIdleTimeout = () => {
|
|
254
|
+
if (idleTimeoutId)
|
|
255
|
+
clearTimeout(idleTimeoutId);
|
|
256
|
+
idleTimeoutId = setTimeout(() => {
|
|
257
|
+
idleTimedOut = true;
|
|
258
|
+
timedOut = true;
|
|
259
|
+
logger.warn('Runner idle timeout reached; no output for configured idle period', {
|
|
260
|
+
triggerId: opts.triggerId,
|
|
261
|
+
idleTimeoutMs: opts.idleTimeoutMs,
|
|
262
|
+
});
|
|
263
|
+
this.deps.terminateRunnerChild(child, isWindows, opts.triggerId, 'timeout');
|
|
264
|
+
}, opts.idleTimeoutMs);
|
|
265
|
+
};
|
|
266
|
+
idleTimer.reset = startIdleTimeout;
|
|
267
|
+
startIdleTimeout();
|
|
268
|
+
const handleAbort = () => {
|
|
269
|
+
cancelled = true;
|
|
270
|
+
this.deps.terminateRunnerChild(child, isWindows, opts.triggerId, 'cancel');
|
|
271
|
+
};
|
|
272
|
+
const cleanup = async () => {
|
|
273
|
+
if (finished)
|
|
274
|
+
return;
|
|
275
|
+
finished = true;
|
|
276
|
+
if (idleTimeoutId)
|
|
277
|
+
clearTimeout(idleTimeoutId);
|
|
278
|
+
idleTimer.reset = () => { };
|
|
279
|
+
logStream.end();
|
|
280
|
+
await removePromptFile();
|
|
281
|
+
opts.signal?.removeEventListener('abort', handleAbort);
|
|
282
|
+
};
|
|
283
|
+
const timeoutId = setTimeout(() => {
|
|
284
|
+
timedOut = true;
|
|
285
|
+
this.deps.terminateRunnerChild(child, isWindows, opts.triggerId, 'timeout');
|
|
286
|
+
}, opts.timeoutMs);
|
|
287
|
+
if (opts.signal?.aborted)
|
|
288
|
+
handleAbort();
|
|
289
|
+
else
|
|
290
|
+
opts.signal?.addEventListener('abort', handleAbort, { once: true });
|
|
291
|
+
child.on('error', async (error) => {
|
|
292
|
+
clearTimeout(timeoutId);
|
|
293
|
+
await cleanup();
|
|
294
|
+
logger.error('Runner process launch failed', { triggerId: opts.triggerId, error: error.message });
|
|
295
|
+
resolve({ exitCode: 1, lastOutput, outputText: outputText.trim() || undefined, errorMessage: error.message });
|
|
296
|
+
});
|
|
297
|
+
const closeWatchdog = this.deps.setupCloseWatchdog(child, opts.triggerId);
|
|
298
|
+
child.on('close', async (code) => {
|
|
299
|
+
closeWatchdog.cancel();
|
|
300
|
+
clearTimeout(timeoutId);
|
|
301
|
+
await cleanup();
|
|
302
|
+
logger.info('Runner process closed', { triggerId: opts.triggerId, pid: child.pid, exitCode: code, timedOut });
|
|
303
|
+
appendOutputText(stdoutStripper.flush());
|
|
304
|
+
const finalizedOutputText = stripAnsiSequences(outputText).trim() || undefined;
|
|
305
|
+
if (timedOut) {
|
|
306
|
+
resolve({
|
|
307
|
+
exitCode: 1,
|
|
308
|
+
idleTimedOut,
|
|
309
|
+
lastOutput,
|
|
310
|
+
outputText: finalizedOutputText,
|
|
311
|
+
errorMessage: idleTimedOut
|
|
312
|
+
? `Runner idle timed out after ${Math.round(opts.idleTimeoutMs / 60_000)}m of no output`
|
|
313
|
+
: `Runner fail-safe timed out after ${Math.round(opts.timeoutMs / 3_600_000)}h`,
|
|
314
|
+
});
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
if (cancelled) {
|
|
318
|
+
resolve({
|
|
319
|
+
exitCode: 1,
|
|
320
|
+
cancelled: true,
|
|
321
|
+
lastOutput,
|
|
322
|
+
outputText: finalizedOutputText,
|
|
323
|
+
errorMessage: 'Runner cancelled by user',
|
|
324
|
+
});
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
resolve({
|
|
328
|
+
exitCode: code ?? 1,
|
|
329
|
+
lastOutput,
|
|
330
|
+
outputText: finalizedOutputText,
|
|
331
|
+
errorMessage: selectRunnerFailureMessage({
|
|
332
|
+
exitCode: code,
|
|
333
|
+
lastErrorOutput: firstErrorSignal || lastErrorOutput,
|
|
334
|
+
lastOutput,
|
|
335
|
+
}),
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
//# sourceMappingURL=omp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omp.js","sourceRoot":"","sources":["../../src/runners/omp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { EventEmitter } from 'node:events';
|
|
3
|
+
import { PassThrough } from 'node:stream';
|
|
4
|
+
import test from 'node:test';
|
|
5
|
+
import { buildOmpArgs, getOmpExecutablePreference, OmpRunner, toOmpPowerShellEncodedCommand } from './omp.js';
|
|
6
|
+
const PROMPT_FILE = '/repo/.agentteams/runner/tmp/trigger-1.prompt.md';
|
|
7
|
+
const CWD = '/repo';
|
|
8
|
+
test('buildOmpArgs uses print mode, yolo approval, and an @file prompt', () => {
|
|
9
|
+
assert.deepEqual(buildOmpArgs(PROMPT_FILE, CWD), [
|
|
10
|
+
'-p',
|
|
11
|
+
'--no-session',
|
|
12
|
+
'--auto-approve',
|
|
13
|
+
'--approval-mode',
|
|
14
|
+
'yolo',
|
|
15
|
+
'--cwd',
|
|
16
|
+
CWD,
|
|
17
|
+
`@${PROMPT_FILE}`,
|
|
18
|
+
]);
|
|
19
|
+
});
|
|
20
|
+
test('buildOmpArgs never passes the prompt as a leading-dash positional', () => {
|
|
21
|
+
const args = buildOmpArgs(PROMPT_FILE, CWD, 'anthropic/claude-sonnet-4');
|
|
22
|
+
assert.equal(args.some((arg) => arg.startsWith('- ') || arg === '- this is a markdown bullet'), false);
|
|
23
|
+
assert.equal(args.includes(`@${PROMPT_FILE}`), true);
|
|
24
|
+
});
|
|
25
|
+
test('buildOmpArgs appends the requested model', () => {
|
|
26
|
+
const args = buildOmpArgs(PROMPT_FILE, CWD, 'anthropic/claude-sonnet-4');
|
|
27
|
+
assert.deepEqual(args.slice(-2), ['--model', 'anthropic/claude-sonnet-4']);
|
|
28
|
+
});
|
|
29
|
+
test('buildOmpArgs drops the default sentinel and blank models', () => {
|
|
30
|
+
for (const model of ['default', '', ' ', null, undefined]) {
|
|
31
|
+
const args = buildOmpArgs(PROMPT_FILE, CWD, model);
|
|
32
|
+
assert.equal(args.includes('--model'), false, `model ${JSON.stringify(model)} should not be forwarded`);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
test('getOmpExecutablePreference adds the .exe candidate only on Windows', () => {
|
|
36
|
+
assert.deepEqual(getOmpExecutablePreference(true), ['omp.exe', 'omp']);
|
|
37
|
+
assert.deepEqual(getOmpExecutablePreference(false), ['omp']);
|
|
38
|
+
});
|
|
39
|
+
test('OmpRunner refuses a conflicting omp before spawning it', async () => {
|
|
40
|
+
let spawnCalled = false;
|
|
41
|
+
const runner = new OmpRunner({
|
|
42
|
+
platform: () => 'linux',
|
|
43
|
+
resolveExecutablePathsWithPreferenceAsync: (async () => ['/usr/local/bin/omp']),
|
|
44
|
+
runProbeCommand: (async () => 'omp 1.0.0\nnew '),
|
|
45
|
+
mkdir: (async () => undefined),
|
|
46
|
+
spawn: (() => {
|
|
47
|
+
spawnCalled = true;
|
|
48
|
+
throw new Error('must not spawn');
|
|
49
|
+
}),
|
|
50
|
+
});
|
|
51
|
+
const options = {
|
|
52
|
+
triggerId: 'trigger-omp-identity',
|
|
53
|
+
prompt: 'private runner prompt',
|
|
54
|
+
authPath: '/repo',
|
|
55
|
+
apiKey: 'key',
|
|
56
|
+
apiUrl: 'https://api.example.com',
|
|
57
|
+
teamId: 'team',
|
|
58
|
+
projectId: 'project',
|
|
59
|
+
timeoutMs: 1_000,
|
|
60
|
+
idleTimeoutMs: 1_000,
|
|
61
|
+
agentConfigId: 'agent',
|
|
62
|
+
runnerType: 'OMP',
|
|
63
|
+
};
|
|
64
|
+
const result = await runner.run(options);
|
|
65
|
+
assert.equal(spawnCalled, false);
|
|
66
|
+
assert.equal(result.exitCode, 1);
|
|
67
|
+
assert.match(result.errorMessage ?? '', /official Oh My Pi executable/);
|
|
68
|
+
});
|
|
69
|
+
test('OmpRunner re-checks the resolved path immediately before spawn', async () => {
|
|
70
|
+
let probeCount = 0;
|
|
71
|
+
let spawnCalled = false;
|
|
72
|
+
let promptRemoved = false;
|
|
73
|
+
const runner = new OmpRunner({
|
|
74
|
+
platform: () => 'linux',
|
|
75
|
+
resolveExecutablePathsWithPreferenceAsync: (async () => ['/usr/local/bin/omp']),
|
|
76
|
+
runProbeCommand: (async () => {
|
|
77
|
+
probeCount += 1;
|
|
78
|
+
return probeCount === 1 ? 'omp v18.0.4\nOh My Pi as an ACP' : 'omp 1.0.0';
|
|
79
|
+
}),
|
|
80
|
+
mkdir: (async () => undefined),
|
|
81
|
+
writeFile: (async () => undefined),
|
|
82
|
+
rm: (async () => {
|
|
83
|
+
promptRemoved = true;
|
|
84
|
+
}),
|
|
85
|
+
spawn: (() => {
|
|
86
|
+
spawnCalled = true;
|
|
87
|
+
throw new Error('must not spawn');
|
|
88
|
+
}),
|
|
89
|
+
});
|
|
90
|
+
const result = await runner.run({
|
|
91
|
+
triggerId: 'trigger-omp-replaced',
|
|
92
|
+
prompt: 'private runner prompt',
|
|
93
|
+
authPath: '/repo',
|
|
94
|
+
apiKey: 'key',
|
|
95
|
+
apiUrl: 'https://api.example.com',
|
|
96
|
+
teamId: 'team',
|
|
97
|
+
projectId: 'project',
|
|
98
|
+
timeoutMs: 1_000,
|
|
99
|
+
idleTimeoutMs: 1_000,
|
|
100
|
+
agentConfigId: 'agent',
|
|
101
|
+
runnerType: 'OMP',
|
|
102
|
+
});
|
|
103
|
+
assert.equal(probeCount, 2);
|
|
104
|
+
assert.equal(spawnCalled, false);
|
|
105
|
+
assert.equal(promptRemoved, true);
|
|
106
|
+
assert.match(result.errorMessage ?? '', /changed identity before launch/);
|
|
107
|
+
});
|
|
108
|
+
test('the Windows command carries exactly the POSIX argument vector', () => {
|
|
109
|
+
const encoded = toOmpPowerShellEncodedCommand('C:\\bin\\omp.exe', PROMPT_FILE, CWD, 'anthropic/claude-sonnet-4');
|
|
110
|
+
const script = Buffer.from(encoded, 'base64').toString('utf16le');
|
|
111
|
+
for (const arg of buildOmpArgs(PROMPT_FILE, CWD, 'anthropic/claude-sonnet-4')) {
|
|
112
|
+
assert.equal(script.includes(`'${arg}'`), true, `Windows command is missing '${arg}'`);
|
|
113
|
+
}
|
|
114
|
+
assert.equal(script.includes("& 'C:\\bin\\omp.exe'"), true);
|
|
115
|
+
});
|
|
116
|
+
test('the Windows command escapes single quotes in the resolved path', () => {
|
|
117
|
+
const encoded = toOmpPowerShellEncodedCommand("C:\\o'brien\\omp.exe", PROMPT_FILE, CWD);
|
|
118
|
+
const script = Buffer.from(encoded, 'base64').toString('utf16le');
|
|
119
|
+
assert.equal(script.includes("& 'C:\\o''brien\\omp.exe'"), true);
|
|
120
|
+
});
|
|
121
|
+
const createFakeChild = () => {
|
|
122
|
+
const child = new EventEmitter();
|
|
123
|
+
child.pid = 5151;
|
|
124
|
+
child.stdout = new PassThrough();
|
|
125
|
+
child.stderr = new PassThrough();
|
|
126
|
+
return child;
|
|
127
|
+
};
|
|
128
|
+
const createStreamingRunner = (emit) => new OmpRunner({
|
|
129
|
+
platform: () => 'linux',
|
|
130
|
+
resolveExecutablePathsWithPreferenceAsync: (async () => ['/home/user/.local/bin/omp']),
|
|
131
|
+
runProbeCommand: (async () => 'omp v18.0.4\nRun Oh My Pi as an ACP'),
|
|
132
|
+
mkdir: (async () => undefined),
|
|
133
|
+
writeFile: (async () => undefined),
|
|
134
|
+
rm: (async () => undefined),
|
|
135
|
+
createWriteStream: (() => new PassThrough()),
|
|
136
|
+
setupCloseWatchdog: (() => ({ cancel: () => { } })),
|
|
137
|
+
terminateRunnerChild: (() => { }),
|
|
138
|
+
spawn: (() => {
|
|
139
|
+
const child = createFakeChild();
|
|
140
|
+
queueMicrotask(() => emit(child));
|
|
141
|
+
return child;
|
|
142
|
+
}),
|
|
143
|
+
});
|
|
144
|
+
const streamingOptions = {
|
|
145
|
+
triggerId: 'trigger-omp-stream',
|
|
146
|
+
prompt: 'private runner prompt',
|
|
147
|
+
authPath: '/repo',
|
|
148
|
+
apiKey: 'key',
|
|
149
|
+
apiUrl: 'https://api.example.com',
|
|
150
|
+
teamId: 'team',
|
|
151
|
+
projectId: 'project',
|
|
152
|
+
timeoutMs: 5_000,
|
|
153
|
+
idleTimeoutMs: 5_000,
|
|
154
|
+
agentConfigId: 'agent',
|
|
155
|
+
runnerType: 'OMP',
|
|
156
|
+
};
|
|
157
|
+
// 2026-08-25 실측: 성공 실행은 최종 답변을 stdout으로 내고 stderr에는 `Working...`만 남긴다.
|
|
158
|
+
test('OmpRunner captures the stdout answer and keeps the Working progress line out of the result', async () => {
|
|
159
|
+
const runner = createStreamingRunner((child) => {
|
|
160
|
+
child.stderr.emit('data', Buffer.from('Working...\n'));
|
|
161
|
+
child.stdout.emit('data', Buffer.from('OMP_STDOUT_PROBE_ANSWER_42\n'));
|
|
162
|
+
child.emit('close', 0);
|
|
163
|
+
});
|
|
164
|
+
const result = await runner.run(streamingOptions);
|
|
165
|
+
assert.equal(result.exitCode, 0);
|
|
166
|
+
assert.equal(result.outputText, 'OMP_STDOUT_PROBE_ANSWER_42');
|
|
167
|
+
assert.equal(result.lastOutput, 'OMP_STDOUT_PROBE_ANSWER_42');
|
|
168
|
+
assert.equal(result.errorMessage, undefined);
|
|
169
|
+
});
|
|
170
|
+
// 2026-08-25 실측: `Working...`이 먼저 오고 수 초 뒤 진짜 사유가 별도 청크로 온다.
|
|
171
|
+
test('OmpRunner reports the real stderr cause instead of the leading Working progress line', async () => {
|
|
172
|
+
const runner = createStreamingRunner((child) => {
|
|
173
|
+
child.stderr.emit('data', Buffer.from('Working...\n'));
|
|
174
|
+
child.stderr.emit('data', Buffer.from('402 Insufficient credits. This account never purchased credits.\n'));
|
|
175
|
+
child.emit('close', 1);
|
|
176
|
+
});
|
|
177
|
+
const result = await runner.run(streamingOptions);
|
|
178
|
+
assert.equal(result.exitCode, 1);
|
|
179
|
+
assert.equal(result.errorMessage, '402 Insufficient credits. This account never purchased credits.');
|
|
180
|
+
});
|
|
181
|
+
// 기동이 느릴 때 나오는 2줄 안내도 실패 사유를 덮으면 안 된다.
|
|
182
|
+
test('OmpRunner treats the slow-startup notice as progress, not as a failure cause', async () => {
|
|
183
|
+
const runner = createStreamingRunner((child) => {
|
|
184
|
+
child.stderr.emit('data', Buffer.from('Working...\n'));
|
|
185
|
+
child.stderr.emit('data', Buffer.from('Still starting after 12s — phase: module load / pre-phase work\n' +
|
|
186
|
+
' logs: /tmp/omp.log · re-run with PI_DEBUG_STARTUP=1 for streaming phase markers\n'));
|
|
187
|
+
child.stderr.emit('data', Buffer.from('404 No endpoints found for arcee-ai/trinity-mini:free\n'));
|
|
188
|
+
child.emit('close', 1);
|
|
189
|
+
});
|
|
190
|
+
const result = await runner.run(streamingOptions);
|
|
191
|
+
assert.equal(result.exitCode, 1);
|
|
192
|
+
assert.equal(result.errorMessage, '404 No endpoints found for arcee-ai/trinity-mini:free');
|
|
193
|
+
});
|
|
194
|
+
//# sourceMappingURL=omp.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omp.test.js","sourceRoot":"","sources":["../../src/runners/omp.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getNpmGlobalPrefixAsync, isExecutableLookupAvailable, resolveExecutablePathWithPreferenceAsync, runProbeCommand, } from '../executable.js';
|
|
2
2
|
import { ENGINE_COMMANDS, getEngineCommand, getEngineExecutablePreference } from '../runners/engine-commands.js';
|
|
3
3
|
import { findGrokBuildExecutable } from '../runners/grok-build-identity.js';
|
|
4
|
+
import { findOmpExecutable } from '../runners/omp-identity.js';
|
|
4
5
|
const isCursorAgent = async (executablePath, run, deps) => {
|
|
5
6
|
const output = await run(executablePath, ['--help'], deps);
|
|
6
7
|
return output !== null && output.includes('Start the Cursor Agent');
|
|
@@ -18,9 +19,9 @@ export const probeInstalledEngines = async (runnerCmd, deps = {}) => {
|
|
|
18
19
|
};
|
|
19
20
|
const engines = [];
|
|
20
21
|
for (const runnerType of Object.keys(ENGINE_COMMANDS)) {
|
|
21
|
-
if (runnerType === 'GROK_BUILD') {
|
|
22
|
+
if (runnerType === 'GROK_BUILD' || runnerType === 'OMP') {
|
|
22
23
|
const preferredNames = getEngineExecutablePreference(runnerType, runnerCmd, isWindows);
|
|
23
|
-
const
|
|
24
|
+
const identityDependencies = deps.resolveExecutablePathWithPreferenceAsync && !deps.resolveExecutablePathsWithPreferenceAsync
|
|
24
25
|
? {
|
|
25
26
|
...executableDeps,
|
|
26
27
|
runProbeCommand: runCommand,
|
|
@@ -30,7 +31,10 @@ export const probeInstalledEngines = async (runnerCmd, deps = {}) => {
|
|
|
30
31
|
},
|
|
31
32
|
}
|
|
32
33
|
: { ...executableDeps, runProbeCommand: runCommand };
|
|
33
|
-
|
|
34
|
+
const found = runnerType === 'GROK_BUILD'
|
|
35
|
+
? await findGrokBuildExecutable(preferredNames, identityDependencies)
|
|
36
|
+
: await findOmpExecutable(preferredNames, identityDependencies);
|
|
37
|
+
if (found)
|
|
34
38
|
engines.push(runnerType);
|
|
35
39
|
continue;
|
|
36
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-probe.js","sourceRoot":"","sources":["../../src/utils/engine-probe.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,wCAAwC,EAExC,eAAe,GAEhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AACjH,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"engine-probe.js","sourceRoot":"","sources":["../../src/utils/engine-probe.ts"],"names":[],"mappings":"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"}
|
|
@@ -102,6 +102,16 @@ describe('probeInstalledEngines', () => {
|
|
|
102
102
|
assert.deepEqual(probed, ['/custom/bin/grok', '/usr/local/bin/grok']);
|
|
103
103
|
assert.deepEqual(result.engines, ['GROK_BUILD']);
|
|
104
104
|
});
|
|
105
|
+
it('accepts omp only when the executable identifies itself as Oh My Pi', async () => {
|
|
106
|
+
const probe = (helpText) => probeInstalledEngines('opencode', {
|
|
107
|
+
getNpmGlobalPrefixAsync: async () => null,
|
|
108
|
+
runProbeCommand: async () => helpText,
|
|
109
|
+
resolveExecutablePathWithPreferenceAsync: async (name) => (name === 'omp' ? '/bin/omp' : null),
|
|
110
|
+
});
|
|
111
|
+
assert.deepEqual((await probe('omp v18.0.4\nOh My Pi as an ACP')).engines, ['OMP']);
|
|
112
|
+
assert.deepEqual((await probe('omp 1.0.0\nnew ')).engines, []);
|
|
113
|
+
assert.deepEqual((await probe(null)).engines, []);
|
|
114
|
+
});
|
|
105
115
|
// 빈 목록은 서버에서 "제한 없음"으로 해석되므로, 조회 자체가 불가능한 환경은 보고 대상에서 빼야 한다.
|
|
106
116
|
it('marks a zero-engine result unreliable when the lookup command cannot run', async () => {
|
|
107
117
|
const result = await probeInstalledEngines('opencode', {
|