@agentteams/runner 0.0.124 → 0.0.125

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.
Files changed (43) hide show
  1. package/dist/executable.js +3 -1
  2. package/dist/executable.js.map +1 -1
  3. package/dist/executable.test.js +11 -0
  4. package/dist/executable.test.js.map +1 -1
  5. package/dist/runners/capabilities.d.ts +1 -1
  6. package/dist/runners/capabilities.js +3 -0
  7. package/dist/runners/capabilities.js.map +1 -1
  8. package/dist/runners/capabilities.test.js +12 -2
  9. package/dist/runners/capabilities.test.js.map +1 -1
  10. package/dist/runners/engine-commands.js +3 -0
  11. package/dist/runners/engine-commands.js.map +1 -1
  12. package/dist/runners/index.js +3 -0
  13. package/dist/runners/index.js.map +1 -1
  14. package/dist/runners/index.test.js +2 -0
  15. package/dist/runners/index.test.js.map +1 -1
  16. package/dist/runners/muse-code-identity.d.ts +8 -0
  17. package/dist/runners/muse-code-identity.js +18 -0
  18. package/dist/runners/muse-code-identity.js.map +1 -0
  19. package/dist/runners/muse-code-json-parser.d.ts +14 -0
  20. package/dist/runners/muse-code-json-parser.js +168 -0
  21. package/dist/runners/muse-code-json-parser.js.map +1 -0
  22. package/dist/runners/muse-code.d.ts +28 -0
  23. package/dist/runners/muse-code.js +327 -0
  24. package/dist/runners/muse-code.js.map +1 -0
  25. package/dist/runners/muse-code.test.d.ts +1 -0
  26. package/dist/runners/muse-code.test.js +237 -0
  27. package/dist/runners/muse-code.test.js.map +1 -0
  28. package/dist/utils/engine-probe.js +5 -2
  29. package/dist/utils/engine-probe.js.map +1 -1
  30. package/dist/utils/engine-probe.test.js +10 -0
  31. package/dist/utils/engine-probe.test.js.map +1 -1
  32. package/dist/utils/model-enumerator.d.ts +5 -0
  33. package/dist/utils/model-enumerator.js +36 -0
  34. package/dist/utils/model-enumerator.js.map +1 -1
  35. package/dist/utils/muse-code-models.d.ts +9 -0
  36. package/dist/utils/muse-code-models.js +81 -0
  37. package/dist/utils/muse-code-models.js.map +1 -0
  38. package/dist/utils/muse-code-models.test.d.ts +1 -0
  39. package/dist/utils/muse-code-models.test.js +81 -0
  40. package/dist/utils/muse-code-models.test.js.map +1 -0
  41. package/native/bin/win32-x64/agentrunner-launcher.exe +0 -0
  42. package/native/bin/win32-x64/manifest.json +2 -2
  43. package/package.json +1 -1
@@ -0,0 +1,168 @@
1
+ // muse 1.0.2의 MSP v1 봉투와 echo·tool 실측(2026-09-05)을 기준으로 한다.
2
+ // `run.output.delta`는 토큰 단위 조각이라 그대로 방출하면 단어 중간에서 끊긴 행이 쌓인다.
3
+ // 커서 파서처럼 문단·문장 경계나 길이 상한에서만 TEXT 엔트리로 합쳐 내보낸다.
4
+ const TEXT_LOG_MAX = 800;
5
+ // 최종 텍스트 폴백 누적 상한(다른 러너의 OUTPUT_CAPTURE_MAX와 동일).
6
+ const STREAMED_TEXT_MAX = 200_000;
7
+ const findTextFlushIndex = (text) => {
8
+ const newlineIndex = text.search(/\r?\n/u);
9
+ if (newlineIndex >= 0) {
10
+ return newlineIndex + (text[newlineIndex] === '\r' ? 2 : 1);
11
+ }
12
+ const sentence = /[.!?。](?:\s|$)/u.exec(text);
13
+ if (sentence?.index !== undefined) {
14
+ return sentence.index + sentence[0].length;
15
+ }
16
+ return text.length >= TEXT_LOG_MAX ? TEXT_LOG_MAX : -1;
17
+ };
18
+ const normalizeText = (text) => text.replace(/\s+/gu, ' ').trim();
19
+ const isVerboseEnabled = (options) => typeof options?.verbose === 'boolean' ? options.verbose : process.env.AGENTTEAMS_RUNNER_VERBOSE === '1';
20
+ /**
21
+ * Muse Code `exec --json` NDJSON을 사람이 읽을 수 있는 로그 엔트리, 최종 답변, 스트림 실패 사유로
22
+ * 정제한다. 매핑되지 않은 MSP 봉투(태스크 lifecycle 메타데이터 등)는 기본적으로 버리고
23
+ * `AGENTTEAMS_RUNNER_VERBOSE=1`에서만 원문을 SYSTEM으로 남긴다. 도구 태스크는 lifecycle에서
24
+ * 도구 이름만 요약해 TOOL 엔트리로 방출한다.
25
+ */
26
+ export const createMuseCodeStreamConsumer = (emit, options) => {
27
+ const verbose = isVerboseEnabled(options);
28
+ let buffer = '';
29
+ let pendingText = '';
30
+ // 마지막 도구 호출 이후 흘러온 델타 전체. 종단 텍스트와 대조해 최종 답변 행의 중복 방출을 막는다.
31
+ let turnText = '';
32
+ let streamedText = '';
33
+ let finalText = null;
34
+ let failureMessage = null;
35
+ const toolKindByTaskId = new Map();
36
+ const log = (message, category = 'SYSTEM', toolName) => {
37
+ emit([{ message, category, level: 'INFO', ...(toolName ? { toolName } : {}) }]);
38
+ };
39
+ const logRaw = (line) => {
40
+ if (verbose)
41
+ log(line);
42
+ };
43
+ const flushText = (force = false) => {
44
+ while (pendingText.length > 0) {
45
+ const flushIndex = force ? Math.min(pendingText.length, TEXT_LOG_MAX) : findTextFlushIndex(pendingText);
46
+ if (flushIndex < 0)
47
+ return;
48
+ const message = normalizeText(pendingText.slice(0, flushIndex));
49
+ pendingText = pendingText.slice(flushIndex);
50
+ if (message.length > 0)
51
+ log(message, 'TEXT');
52
+ if (!force && pendingText.length < TEXT_LOG_MAX && findTextFlushIndex(pendingText) < 0)
53
+ return;
54
+ }
55
+ };
56
+ const appendStreamedText = (text) => {
57
+ if (streamedText.length >= STREAMED_TEXT_MAX)
58
+ return;
59
+ streamedText += text.slice(0, STREAMED_TEXT_MAX - streamedText.length);
60
+ };
61
+ // 도구 태스크(task_kind `tool.*`)는 proposed에서 이름을 기억해 두고, started/completed에서
62
+ // 상태를 붙여 TOOL로 방출한다. 모델 응답 태스크(`model.*`)는 진행 상황이 아니므로 버린다.
63
+ const consumeTaskLifecycle = (payloadType, event, line) => {
64
+ const taskId = typeof event?.task_id === 'string' ? event.task_id : '';
65
+ const stage = payloadType.slice('task.lifecycle.'.length);
66
+ if (stage === 'proposed') {
67
+ const taskKind = typeof event?.task_kind === 'string' ? event.task_kind : '';
68
+ if (taskKind.startsWith('tool.') && taskId) {
69
+ toolKindByTaskId.set(taskId, taskKind);
70
+ flushText(true);
71
+ turnText = '';
72
+ log(`[Tool] ${taskKind} (proposed)`, 'TOOL', taskKind);
73
+ return;
74
+ }
75
+ logRaw(line);
76
+ return;
77
+ }
78
+ const toolKind = taskId ? toolKindByTaskId.get(taskId) : undefined;
79
+ if (!toolKind) {
80
+ logRaw(line);
81
+ return;
82
+ }
83
+ if (stage === 'started' || stage === 'completed' || stage === 'failed') {
84
+ log(`[Tool] ${toolKind} (${stage})`, 'TOOL', toolKind);
85
+ if (stage !== 'started')
86
+ toolKindByTaskId.delete(taskId);
87
+ return;
88
+ }
89
+ logRaw(line);
90
+ };
91
+ const consume = (line) => {
92
+ if (!line.trim())
93
+ return;
94
+ let event;
95
+ try {
96
+ event = JSON.parse(line);
97
+ }
98
+ catch {
99
+ logRaw(line);
100
+ return;
101
+ }
102
+ const payload = event?.payload;
103
+ if (event?.schema_version !== 1 || !payload || typeof payload !== 'object') {
104
+ logRaw(line);
105
+ return;
106
+ }
107
+ const payloadType = event.payload_type ?? '';
108
+ if (payloadType.startsWith('task.lifecycle.')) {
109
+ consumeTaskLifecycle(payloadType, payload.event, line);
110
+ return;
111
+ }
112
+ switch (payloadType) {
113
+ case 'run.output.delta':
114
+ if (typeof payload.text !== 'string') {
115
+ logRaw(line);
116
+ return;
117
+ }
118
+ appendStreamedText(payload.text);
119
+ pendingText += payload.text;
120
+ turnText += payload.text;
121
+ flushText();
122
+ return;
123
+ case 'run.terminal.completed':
124
+ if (typeof payload.text !== 'string') {
125
+ logRaw(line);
126
+ return;
127
+ }
128
+ finalText = payload.text;
129
+ // 델타가 최종 답변과 일치하면 남은 조각을 경계 있는 행으로 마저 내보내 답변을 완성한다.
130
+ // 다르면(스트림 누락 등) 조각을 폐기하고 완성된 최종 답변을 한 행으로 남긴다.
131
+ if (normalizeText(turnText) === normalizeText(finalText)) {
132
+ flushText(true);
133
+ }
134
+ else {
135
+ pendingText = '';
136
+ if (finalText.trim().length > 0)
137
+ log(normalizeText(finalText), 'TEXT');
138
+ }
139
+ return;
140
+ case 'run.terminal.failed':
141
+ flushText(true);
142
+ failureMessage = typeof payload.reason === 'string' && payload.reason ? payload.reason : 'Muse Code run failed';
143
+ log(failureMessage, 'SYSTEM');
144
+ return;
145
+ default:
146
+ logRaw(line);
147
+ }
148
+ };
149
+ return {
150
+ push(text) {
151
+ buffer += text;
152
+ let newline;
153
+ while ((newline = buffer.indexOf('\n')) >= 0) {
154
+ consume(buffer.slice(0, newline));
155
+ buffer = buffer.slice(newline + 1);
156
+ }
157
+ },
158
+ flush() {
159
+ consume(buffer);
160
+ buffer = '';
161
+ flushText(true);
162
+ },
163
+ getFinalText: () => finalText,
164
+ getStreamedTextFallback: () => streamedText || null,
165
+ getFailureMessage: () => failureMessage,
166
+ };
167
+ };
168
+ //# sourceMappingURL=muse-code-json-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"muse-code-json-parser.js","sourceRoot":"","sources":["../../src/runners/muse-code-json-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
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 { resolveExecutablePathsWithPreferenceAsync, runProbeCommand } from '../executable.js';
6
+ import { setupCloseWatchdog, terminateRunnerChild } from './process-control.js';
7
+ import type { Runner, RunnerOptions, RunResult } from './types.js';
8
+ export declare const buildMuseCodeArgs: (promptFilePath: string, model?: string | null, effort?: string | null) => string[];
9
+ export declare const getMuseCodeExecutablePreference: (isWindows: boolean) => string[];
10
+ export declare const toMuseCodePowerShellEncodedCommand: (resolvedExecutablePath: string, promptFilePath: string, model?: string | null, effort?: string | null) => string;
11
+ type MuseCodeRunnerDependencies = {
12
+ platform: typeof platform;
13
+ resolveExecutablePathsWithPreferenceAsync: typeof resolveExecutablePathsWithPreferenceAsync;
14
+ runProbeCommand: typeof runProbeCommand;
15
+ spawn: typeof spawn;
16
+ createWriteStream: typeof createWriteStream;
17
+ mkdir: typeof mkdir;
18
+ writeFile: typeof writeFile;
19
+ rm: typeof rm;
20
+ setupCloseWatchdog: typeof setupCloseWatchdog;
21
+ terminateRunnerChild: typeof terminateRunnerChild;
22
+ };
23
+ export declare class MuseCodeRunner implements Runner {
24
+ private readonly deps;
25
+ constructor(dependencies?: Partial<MuseCodeRunnerDependencies>);
26
+ run(opts: RunnerOptions): Promise<RunResult>;
27
+ }
28
+ export {};
@@ -0,0 +1,327 @@
1
+ import { StringDecoder } from 'node:string_decoder';
2
+ import { spawn } from 'node:child_process';
3
+ import { createWriteStream } from 'node:fs';
4
+ import { mkdir, rm, writeFile } from 'node:fs/promises';
5
+ import { platform } from 'node:os';
6
+ import { dirname, join } from 'node:path';
7
+ import { resolveExecutablePathsWithPreferenceAsync, runProbeCommand } from '../executable.js';
8
+ import { logger } from '../logger.js';
9
+ import { selectRunnerFailureMessage } from './failure-message.js';
10
+ import { createAnsiStripper } from './kiro-cli.js';
11
+ import { findMuseCodeExecutable, isMuseCodeExecutable } from './muse-code-identity.js';
12
+ import { createMuseCodeStreamConsumer } from './muse-code-json-parser.js';
13
+ import { setupCloseWatchdog, terminateRunnerChild } from './process-control.js';
14
+ import { buildRunnerChildEnv } from './session-env.js';
15
+ const OUTPUT_PREVIEW_MAX = 400;
16
+ const normalizedModel = (model) => (typeof model === 'string' ? model.trim() : '');
17
+ // muse 1.0.2 (2026-09-04): cwd가 workspace이며 프롬프트는 파일로 전달한다.
18
+ // 승인을 비대화형으로 설정하되 기본 샌드박스는 유지한다.
19
+ export const buildMuseCodeArgs = (promptFilePath, model, effort) => {
20
+ const selectedModel = normalizedModel(model);
21
+ return [
22
+ 'exec',
23
+ '--json',
24
+ '--approval-mode',
25
+ 'never',
26
+ '--prompt-file',
27
+ promptFilePath,
28
+ ...(selectedModel && selectedModel !== 'default' ? ['--model', selectedModel] : []),
29
+ ...(effort?.trim() ? ['--reasoning-effort', effort.trim()] : []),
30
+ ];
31
+ };
32
+ export const getMuseCodeExecutablePreference = (isWindows) => isWindows ? ['muse.exe', 'muse'] : ['muse'];
33
+ const toPowerShellLiteral = (value) => `'${value.replaceAll("'", "''")}'`;
34
+ export const toMuseCodePowerShellEncodedCommand = (resolvedExecutablePath, promptFilePath, model, effort) => {
35
+ const argSegment = buildMuseCodeArgs(promptFilePath, model, effort)
36
+ .map((arg) => ` ${toPowerShellLiteral(arg)}`)
37
+ .join('');
38
+ const scriptContent = [
39
+ "$ErrorActionPreference = 'Stop'",
40
+ '$utf8NoBom = [System.Text.UTF8Encoding]::new($false)',
41
+ '[Console]::InputEncoding = $utf8NoBom',
42
+ '[Console]::OutputEncoding = $utf8NoBom',
43
+ '$OutputEncoding = $utf8NoBom',
44
+ 'chcp 65001 > $null',
45
+ `& ${toPowerShellLiteral(resolvedExecutablePath)}${argSegment}`,
46
+ ].join('\r\n');
47
+ return Buffer.from(scriptContent, 'utf16le').toString('base64');
48
+ };
49
+ const toOutputPreview = (text) => {
50
+ const trimmed = text.trim();
51
+ return trimmed.length <= OUTPUT_PREVIEW_MAX ? trimmed : `${trimmed.slice(0, OUTPUT_PREVIEW_MAX)}...`;
52
+ };
53
+ // 실측된 기동·종료 진단 문구는 실패 사유 후보에서 제외한다.
54
+ const PROGRESS_ONLY_LINE_PATTERNS = [/^muse: workspace root:/, /^run ended with /];
55
+ const isProgressOnlyOutput = (text) => {
56
+ const lines = text
57
+ .split('\n')
58
+ .map((line) => line.trim())
59
+ .filter((line) => line.length > 0);
60
+ return lines.every((line) => PROGRESS_ONLY_LINE_PATTERNS.some((pattern) => pattern.test(line)));
61
+ };
62
+ const looksLikeErrorOutput = (text) => text.trim().length > 0 && !isProgressOnlyOutput(text);
63
+ const defaultDependencies = {
64
+ platform,
65
+ resolveExecutablePathsWithPreferenceAsync,
66
+ runProbeCommand,
67
+ spawn,
68
+ createWriteStream,
69
+ mkdir,
70
+ writeFile,
71
+ rm,
72
+ setupCloseWatchdog,
73
+ terminateRunnerChild,
74
+ };
75
+ export class MuseCodeRunner {
76
+ deps;
77
+ constructor(dependencies = {}) {
78
+ this.deps = { ...defaultDependencies, ...dependencies };
79
+ }
80
+ async run(opts) {
81
+ if (!opts.authPath || opts.authPath.trim().length === 0) {
82
+ logger.error('authPath is missing for trigger');
83
+ return { exitCode: 1, errorMessage: 'authPath is missing for trigger' };
84
+ }
85
+ const cwd = opts.authPath;
86
+ const logPath = join(cwd, '.agentteams', 'runner', 'log', `${opts.triggerId}.log`);
87
+ await this.deps.mkdir(dirname(logPath), { recursive: true });
88
+ const isWindows = this.deps.platform() === 'win32';
89
+ const resolvedExecutablePath = await findMuseCodeExecutable(getMuseCodeExecutablePreference(isWindows), {
90
+ resolveExecutablePathsWithPreferenceAsync: this.deps.resolveExecutablePathsWithPreferenceAsync,
91
+ runProbeCommand: this.deps.runProbeCommand,
92
+ platform: this.deps.platform,
93
+ });
94
+ if (!resolvedExecutablePath) {
95
+ const message = "Cannot find an official Muse Code executable. Every 'muse' candidate failed the Muse Code identity check.";
96
+ logger.error('Muse Code executable identity check failed', { triggerId: opts.triggerId });
97
+ return { exitCode: 1, errorMessage: message };
98
+ }
99
+ const promptFilePath = join(cwd, '.agentteams', 'runner', 'tmp', `${opts.triggerId}.prompt.md`);
100
+ await this.deps.mkdir(dirname(promptFilePath), { recursive: true });
101
+ await this.deps.writeFile(promptFilePath, opts.prompt, { encoding: 'utf8' });
102
+ const removePromptFile = async () => {
103
+ try {
104
+ await this.deps.rm(promptFilePath, { force: true });
105
+ }
106
+ catch (error) {
107
+ logger.warn('Failed to remove Muse Code prompt temp file', {
108
+ triggerId: opts.triggerId,
109
+ promptFilePath,
110
+ error: error instanceof Error ? error.message : String(error),
111
+ });
112
+ }
113
+ };
114
+ const args = buildMuseCodeArgs(promptFilePath, opts.model, opts.effort);
115
+ logger.info('Runner prompt prepared', {
116
+ triggerId: opts.triggerId,
117
+ promptLength: opts.prompt.length,
118
+ promptFilePath,
119
+ requestedCommand: 'muse',
120
+ resolvedExecutablePath,
121
+ platform: isWindows ? 'win32' : this.deps.platform(),
122
+ shell: false,
123
+ detached: !isWindows,
124
+ windowsWrapper: isWindows ? 'powershell.exe -EncodedCommand' : null,
125
+ });
126
+ const env = buildRunnerChildEnv(process.env, opts);
127
+ if (!(await isMuseCodeExecutable(resolvedExecutablePath, {
128
+ runProbeCommand: this.deps.runProbeCommand,
129
+ platform: this.deps.platform,
130
+ }))) {
131
+ await removePromptFile();
132
+ const message = 'The resolved Muse Code executable changed identity before launch; execution was refused.';
133
+ logger.error('Muse Code executable identity changed before launch', { triggerId: opts.triggerId });
134
+ return { exitCode: 1, errorMessage: message };
135
+ }
136
+ let child;
137
+ try {
138
+ child = isWindows
139
+ ? this.deps.spawn('powershell.exe', [
140
+ '-NoLogo',
141
+ '-NonInteractive',
142
+ '-ExecutionPolicy',
143
+ 'Bypass',
144
+ '-EncodedCommand',
145
+ toMuseCodePowerShellEncodedCommand(resolvedExecutablePath, promptFilePath, opts.model, opts.effort),
146
+ ], { cwd, detached: false, shell: false, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'], env })
147
+ : this.deps.spawn(resolvedExecutablePath, args, {
148
+ cwd,
149
+ detached: true,
150
+ shell: false,
151
+ windowsHide: true,
152
+ stdio: ['ignore', 'pipe', 'pipe'],
153
+ env,
154
+ });
155
+ }
156
+ catch (error) {
157
+ await removePromptFile();
158
+ const message = error instanceof Error ? error.message : String(error);
159
+ logger.error('Runner process launch failed', { triggerId: opts.triggerId, error: message });
160
+ return { exitCode: 1, errorMessage: message };
161
+ }
162
+ const logStream = this.deps.createWriteStream(logPath, { flags: 'a' });
163
+ logStream.on('error', (error) => logger.warn('Runner log stream error', { triggerId: opts.triggerId, error: error.message }));
164
+ child.stdout?.pipe(logStream);
165
+ child.stderr?.pipe(logStream);
166
+ let lastOutput = '';
167
+ let lastErrorOutput = '';
168
+ let lastErrorSignal = '';
169
+ const stdoutDecoder = new StringDecoder('utf8');
170
+ const stderrDecoder = new StringDecoder('utf8');
171
+ const stdoutStripper = createAnsiStripper();
172
+ const stderrStripper = createAnsiStripper();
173
+ const idleTimer = { reset: () => { } };
174
+ // 각 NDJSON 라인을 한 번만 파싱해 라이브 로그와 결과 판정 양쪽에 전달한다.
175
+ const streamConsumer = createMuseCodeStreamConsumer((entries) => {
176
+ for (const entry of entries) {
177
+ // 실패 사유 후보(lastOutput)는 모델이 쓴 텍스트로 한정한다. SYSTEM(verbose 원문 봉투)이나
178
+ // TOOL 요약이 사유로 승격되면 사람이 읽을 수 없는 조각이 화면에 노출된다.
179
+ if (entry.category === 'TEXT' || entry.category === 'RESULT') {
180
+ lastOutput = toOutputPreview(entry.message);
181
+ }
182
+ opts.onStdoutChunk?.(entry.message, entry.category, entry.toolName);
183
+ }
184
+ });
185
+ child.stdout?.on('data', (chunk) => {
186
+ const rawOutput = Buffer.isBuffer(chunk) ? stdoutDecoder.write(chunk) : String(chunk);
187
+ const text = stdoutStripper.push(rawOutput);
188
+ if (text.length === 0) {
189
+ return;
190
+ }
191
+ streamConsumer.push(text);
192
+ // 이벤트가 로그 엔트리로 정제되지 않는 구간(델타 연발)에도 살아 있다는 신호이므로,
193
+ // 리셋은 정제 결과가 아니라 데이터 도착을 기준으로 한다.
194
+ idleTimer.reset();
195
+ logger.info('Runner stdout', { triggerId: opts.triggerId, pid: child.pid, output: toOutputPreview(text) });
196
+ });
197
+ child.stderr?.on('data', (chunk) => {
198
+ const rawOutput = Buffer.isBuffer(chunk) ? stderrDecoder.write(chunk) : String(chunk);
199
+ const output = toOutputPreview(stderrStripper.push(rawOutput));
200
+ if (output.length > 0) {
201
+ lastErrorOutput = output;
202
+ // 진행 표시(`run ended with ...`)가 stderr 마지막에 찍혀 실제 오류를 가리므로, 진행 표시가 아닌
203
+ // 가장 최근 청크를 사유로 쓴다. 첫 청크를 고정하면 초반의 무해한 경고가 사유가 된다.
204
+ if (looksLikeErrorOutput(output)) {
205
+ lastErrorSignal = output;
206
+ }
207
+ idleTimer.reset();
208
+ opts.onStderrChunk?.(output, 'STDERR');
209
+ logger.info('Muse Code progress', { triggerId: opts.triggerId, pid: child.pid, output });
210
+ }
211
+ });
212
+ logger.info('Runner started', { triggerId: opts.triggerId, cwd, logPath, pid: child.pid });
213
+ return await new Promise((resolve) => {
214
+ let finished = false;
215
+ let timedOut = false;
216
+ let idleTimedOut = false;
217
+ let cancelled = false;
218
+ let idleTimeoutId = null;
219
+ const startIdleTimeout = () => {
220
+ if (idleTimeoutId)
221
+ clearTimeout(idleTimeoutId);
222
+ idleTimeoutId = setTimeout(() => {
223
+ idleTimedOut = true;
224
+ timedOut = true;
225
+ logger.warn('Runner idle timeout reached; no output for configured idle period', {
226
+ triggerId: opts.triggerId,
227
+ idleTimeoutMs: opts.idleTimeoutMs,
228
+ });
229
+ this.deps.terminateRunnerChild(child, isWindows, opts.triggerId, 'timeout');
230
+ }, opts.idleTimeoutMs);
231
+ };
232
+ idleTimer.reset = startIdleTimeout;
233
+ startIdleTimeout();
234
+ const handleAbort = () => {
235
+ cancelled = true;
236
+ this.deps.terminateRunnerChild(child, isWindows, opts.triggerId, 'cancel');
237
+ };
238
+ const cleanup = async () => {
239
+ if (finished)
240
+ return;
241
+ finished = true;
242
+ if (idleTimeoutId)
243
+ clearTimeout(idleTimeoutId);
244
+ idleTimer.reset = () => { };
245
+ logStream.end();
246
+ await removePromptFile();
247
+ opts.signal?.removeEventListener('abort', handleAbort);
248
+ };
249
+ const timeoutId = setTimeout(() => {
250
+ timedOut = true;
251
+ this.deps.terminateRunnerChild(child, isWindows, opts.triggerId, 'timeout');
252
+ }, opts.timeoutMs);
253
+ if (opts.signal?.aborted)
254
+ handleAbort();
255
+ else
256
+ opts.signal?.addEventListener('abort', handleAbort, { once: true });
257
+ child.on('error', async (error) => {
258
+ clearTimeout(timeoutId);
259
+ await cleanup();
260
+ logger.error('Runner process launch failed', { triggerId: opts.triggerId, error: error.message });
261
+ resolve({
262
+ exitCode: 1,
263
+ lastOutput,
264
+ outputText: streamConsumer.getFinalText() ?? streamConsumer.getStreamedTextFallback() ?? undefined,
265
+ errorMessage: error.message,
266
+ });
267
+ });
268
+ const closeWatchdog = this.deps.setupCloseWatchdog(child, opts.triggerId);
269
+ child.on('close', async (code) => {
270
+ closeWatchdog.cancel();
271
+ clearTimeout(timeoutId);
272
+ await cleanup();
273
+ logger.info('Runner process closed', { triggerId: opts.triggerId, pid: child.pid, exitCode: code, timedOut });
274
+ streamConsumer.push(stdoutStripper.push(stdoutDecoder.end()));
275
+ stdoutStripper.flush();
276
+ // 라인 스캐너가 개행 없이 끝난 마지막 NDJSON 라인을 회수한다.
277
+ streamConsumer.flush();
278
+ const finalizedOutputText = streamConsumer.getFinalText() ?? streamConsumer.getStreamedTextFallback() ?? undefined;
279
+ const streamFailureMessage = streamConsumer.getFailureMessage();
280
+ if (timedOut) {
281
+ resolve({
282
+ exitCode: 1,
283
+ timedOut,
284
+ idleTimedOut,
285
+ lastOutput,
286
+ outputText: finalizedOutputText,
287
+ errorMessage: idleTimedOut
288
+ ? `Runner idle timed out after ${Math.round(opts.idleTimeoutMs / 60_000)}m of no output`
289
+ : `Runner fail-safe timed out after ${Math.round(opts.timeoutMs / 3_600_000)}h`,
290
+ });
291
+ return;
292
+ }
293
+ if (cancelled) {
294
+ resolve({
295
+ exitCode: 1,
296
+ cancelled: true,
297
+ lastOutput,
298
+ outputText: finalizedOutputText,
299
+ errorMessage: 'Runner cancelled by user',
300
+ });
301
+ return;
302
+ }
303
+ // 종단 실패 이벤트는 종료 코드와 무관하게 보존한다.
304
+ if (streamFailureMessage) {
305
+ resolve({
306
+ exitCode: code && code !== 0 ? code : 1,
307
+ lastOutput,
308
+ outputText: finalizedOutputText,
309
+ errorMessage: streamFailureMessage,
310
+ });
311
+ return;
312
+ }
313
+ resolve({
314
+ exitCode: code ?? 1,
315
+ lastOutput,
316
+ outputText: finalizedOutputText,
317
+ errorMessage: selectRunnerFailureMessage({
318
+ exitCode: code,
319
+ lastErrorOutput: lastErrorSignal || lastErrorOutput,
320
+ lastOutput,
321
+ }),
322
+ });
323
+ });
324
+ });
325
+ }
326
+ }
327
+ //# sourceMappingURL=muse-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"muse-code.js","sourceRoot":"","sources":["../../src/runners/muse-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};