@xdevops/issue-auto-finish 1.0.83 → 1.0.85

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/{LockNote-7OF7ADI2.js → LockNote-Z2CLDZNN.js} +3 -3
  2. package/dist/{ai-runner-MCGEQGXS.js → ai-runner-SVUNA3FX.js} +2 -2
  3. package/dist/{analyze-ZITN3CSH.js → analyze-SXXPE5XL.js} +3 -3
  4. package/dist/{braindump-LQU65XND.js → braindump-4E5SDMSZ.js} +6 -6
  5. package/dist/{chunk-7FLKETBC.js → chunk-4LFNFRCL.js} +13 -1
  6. package/dist/chunk-4LFNFRCL.js.map +1 -0
  7. package/dist/{chunk-HKI3BON6.js → chunk-4QV6D34Y.js} +3 -3
  8. package/dist/{chunk-UDCMSDNT.js → chunk-5UPYA6KH.js} +528 -214
  9. package/dist/chunk-5UPYA6KH.js.map +1 -0
  10. package/dist/{chunk-MV2CADMB.js → chunk-FWEW5E3B.js} +2 -2
  11. package/dist/{chunk-NZ7K73B7.js → chunk-GXFG4JU6.js} +2 -2
  12. package/dist/{chunk-3V3GQCB7.js → chunk-HDFNMVRQ.js} +2 -2
  13. package/dist/{chunk-3RNGPMRE.js → chunk-HOFYJEJ4.js} +7 -7
  14. package/dist/{chunk-LFN7NUFS.js → chunk-JINMYD56.js} +3 -3
  15. package/dist/{chunk-GV2ORWT3.js → chunk-K2OTLYJI.js} +118 -17
  16. package/dist/chunk-K2OTLYJI.js.map +1 -0
  17. package/dist/{chunk-GDTS2J2P.js → chunk-KTYPZTF4.js} +2 -2
  18. package/dist/{chunk-6S7ERGQ7.js → chunk-P4O4ZXEC.js} +10 -5
  19. package/dist/chunk-P4O4ZXEC.js.map +1 -0
  20. package/dist/{chunk-KWODU7HB.js → chunk-YCYVNRLF.js} +15 -1
  21. package/dist/chunk-YCYVNRLF.js.map +1 -0
  22. package/dist/cli.js +8 -8
  23. package/dist/{config-C7AKWCPA.js → config-QLINHCHD.js} +3 -3
  24. package/dist/{doctor-P2ZH6PFX.js → doctor-37JNBGDN.js} +3 -3
  25. package/dist/errors/PhaseAbortedError.d.ts +13 -0
  26. package/dist/errors/PhaseAbortedError.d.ts.map +1 -0
  27. package/dist/errors/index.d.ts +1 -0
  28. package/dist/errors/index.d.ts.map +1 -1
  29. package/dist/events/EventBus.d.ts +1 -1
  30. package/dist/events/EventBus.d.ts.map +1 -1
  31. package/dist/i18n/locales/en.d.ts.map +1 -1
  32. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  33. package/dist/index.js +11 -11
  34. package/dist/{init-D2BQIVVD.js → init-TDKDC6YP.js} +7 -7
  35. package/dist/lib.js +5 -5
  36. package/dist/lifecycle/ActionLifecycle.d.ts +1 -1
  37. package/dist/lifecycle/ActionLifecycle.d.ts.map +1 -1
  38. package/dist/lifecycle/ActionLifecycleManager.d.ts.map +1 -1
  39. package/dist/orchestrator/IssueProcessingContext.d.ts +3 -0
  40. package/dist/orchestrator/IssueProcessingContext.d.ts.map +1 -1
  41. package/dist/orchestrator/PipelineOrchestrator.d.ts +19 -0
  42. package/dist/orchestrator/PipelineOrchestrator.d.ts.map +1 -1
  43. package/dist/orchestrator/steps/FailureHandler.d.ts.map +1 -1
  44. package/dist/orchestrator/steps/PhaseLoopStep.d.ts.map +1 -1
  45. package/dist/phases/BasePhase.d.ts +10 -8
  46. package/dist/phases/BasePhase.d.ts.map +1 -1
  47. package/dist/phases/UatPhase.d.ts +32 -1
  48. package/dist/phases/UatPhase.d.ts.map +1 -1
  49. package/dist/pipeline/PipelineDefinition.d.ts.map +1 -1
  50. package/dist/prompts/templates.d.ts.map +1 -1
  51. package/dist/{restart-KFRHCALK.js → restart-RNXGTDWZ.js} +5 -5
  52. package/dist/run.js +11 -11
  53. package/dist/{start-46GW453L.js → start-27GRO4DP.js} +5 -5
  54. package/dist/tracker/IssueState.d.ts +4 -0
  55. package/dist/tracker/IssueState.d.ts.map +1 -1
  56. package/dist/tracker/IssueTracker.d.ts +2 -0
  57. package/dist/tracker/IssueTracker.d.ts.map +1 -1
  58. package/dist/webhook/CommandExecutor.d.ts +3 -0
  59. package/dist/webhook/CommandExecutor.d.ts.map +1 -1
  60. package/dist/webhook/CommandParser.d.ts +1 -1
  61. package/dist/webhook/CommandParser.d.ts.map +1 -1
  62. package/package.json +2 -1
  63. package/src/web/frontend/dist/assets/{index-GfpCL9Wn.js → index-C4NXoH9S.js} +55 -49
  64. package/src/web/frontend/dist/assets/{index-CPNbFsHB.css → index-C7lorIa0.css} +1 -1
  65. package/src/web/frontend/dist/index.html +2 -2
  66. package/dist/chunk-6S7ERGQ7.js.map +0 -1
  67. package/dist/chunk-7FLKETBC.js.map +0 -1
  68. package/dist/chunk-GV2ORWT3.js.map +0 -1
  69. package/dist/chunk-KWODU7HB.js.map +0 -1
  70. package/dist/chunk-UDCMSDNT.js.map +0 -1
  71. /package/dist/{LockNote-7OF7ADI2.js.map → LockNote-Z2CLDZNN.js.map} +0 -0
  72. /package/dist/{ai-runner-MCGEQGXS.js.map → ai-runner-SVUNA3FX.js.map} +0 -0
  73. /package/dist/{analyze-ZITN3CSH.js.map → analyze-SXXPE5XL.js.map} +0 -0
  74. /package/dist/{braindump-LQU65XND.js.map → braindump-4E5SDMSZ.js.map} +0 -0
  75. /package/dist/{chunk-HKI3BON6.js.map → chunk-4QV6D34Y.js.map} +0 -0
  76. /package/dist/{chunk-MV2CADMB.js.map → chunk-FWEW5E3B.js.map} +0 -0
  77. /package/dist/{chunk-NZ7K73B7.js.map → chunk-GXFG4JU6.js.map} +0 -0
  78. /package/dist/{chunk-3V3GQCB7.js.map → chunk-HDFNMVRQ.js.map} +0 -0
  79. /package/dist/{chunk-3RNGPMRE.js.map → chunk-HOFYJEJ4.js.map} +0 -0
  80. /package/dist/{chunk-LFN7NUFS.js.map → chunk-JINMYD56.js.map} +0 -0
  81. /package/dist/{chunk-GDTS2J2P.js.map → chunk-KTYPZTF4.js.map} +0 -0
  82. /package/dist/{config-C7AKWCPA.js.map → config-QLINHCHD.js.map} +0 -0
  83. /package/dist/{doctor-P2ZH6PFX.js.map → doctor-37JNBGDN.js.map} +0 -0
  84. /package/dist/{init-D2BQIVVD.js.map → init-TDKDC6YP.js.map} +0 -0
  85. /package/dist/{restart-KFRHCALK.js.map → restart-RNXGTDWZ.js.map} +0 -0
  86. /package/dist/{start-46GW453L.js.map → start-27GRO4DP.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ai-runner/ModelMapping.ts","../src/shutdown/ShutdownSignal.ts","../src/ai-runner/BaseAIRunner.ts","../src/ai-runner/ClaudeInternalRunner.ts","../src/ai-runner/CursorAgentRunner.ts","../src/ai-runner/CodebuddyRunner.ts","../src/ai-runner/CodebuddyAcpRunner.ts","../src/ai-runner/acp/AcpProtocol.ts","../src/ai-runner/AIRunnerRegistry.ts","../src/errors/BaseError.ts","../src/errors/ApiError.ts","../src/errors/AIExecutionError.ts","../src/errors/NotFoundError.ts","../src/errors/InvalidOperationError.ts","../src/errors/ShutdownError.ts","../src/errors/ParseError.ts","../src/errors/RegistryError.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// 模型名称映射:规范名 (AI_MODEL 配置值) → 各 Runner CLI 接受的模型 ID\n// ---------------------------------------------------------------------------\n\nimport { logger as rootLogger } from '../logger.js';\n\nconst logger = rootLogger.child('ModelMapping');\n\ntype RunnerModelMap = Record<string, string>;\n\n/**\n * 每个 Runner 的模型名映射表。\n * key = runner mode(如 'codebuddy'),value = { 规范名 → CLI 模型名 }。\n * 未列出的 runner(如 claude-internal、cursor-agent)表示无需映射,直接透传。\n */\nconst MODEL_MAPS: Record<string, RunnerModelMap> = {\n codebuddy: {\n // Claude 系列\n 'Claude-4.6-Opus': 'claude-opus-4.6',\n 'claude-4.6-opus-high-thinking': 'claude-opus-4.6',\n 'claude-opus-4.6-1m': 'claude-opus-4.6-1m',\n 'Claude-Sonnet-4.6': 'claude-sonnet-4.6',\n 'claude-sonnet-4.6-1m': 'claude-sonnet-4.6-1m',\n 'Claude-4.5': 'claude-4.5',\n 'Claude-Opus-4.5': 'claude-opus-4.5',\n 'Claude-Haiku-4.5': 'claude-haiku-4.5',\n // GPT 系列\n 'GPT-5.4': 'gpt-5.4',\n 'GPT-5.3': 'gpt-5.3',\n 'GPT-5.3-Codex': 'gpt-5.3-codex',\n 'GPT-5.2': 'gpt-5.2',\n 'GPT-5.2-Codex': 'gpt-5.2-codex',\n 'GPT-5.1': 'gpt-5.1',\n 'GPT-5.1-Codex': 'gpt-5.1-codex',\n 'GPT-5.1-Codex-Max': 'gpt-5.1-codex-max',\n 'GPT-5.1-Codex-Mini': 'gpt-5.1-codex-mini',\n // Gemini 系列\n 'Gemini-2.5-Pro': 'gemini-2.5-pro',\n 'Gemini-3.0-Flash': 'gemini-3.0-flash',\n 'Gemini-3.1-Pro': 'gemini-3.1-pro',\n 'Gemini-3.1-Flash-Lite': 'gemini-3.1-flash-lite',\n // GLM 系列\n 'GLM-5.0-Turbo': 'glm-5.0-turbo-ioa',\n 'GLM-5.0': 'glm-5.0-ioa',\n 'GLM-4.7': 'glm-4.7-ioa',\n // 其他国产模型\n 'MiniMax-M2.7': 'minimax-m2.7-ioa',\n 'MiniMax-M2.5': 'minimax-m2.5-ioa',\n 'Kimi-K2.5': 'kimi-k2.5-ioa',\n 'DeepSeek-V3-2': 'deepseek-v3-2-volc-ioa',\n 'Hunyuan-2.0': 'hunyuan-2.0-thinking-ioa',\n },\n // claude-internal 和 cursor-agent 无需映射,直接透传\n};\n\n// codebuddy-acp 复用 codebuddy 的模型映射\nMODEL_MAPS['codebuddy-acp'] = MODEL_MAPS['codebuddy'];\n\n/**\n * 根据 runner mode 将规范模型名映射为该 CLI 接受的模型 ID。\n * 如果该 runner 没有映射表,则原样返回。\n * 如果有映射表但找不到对应条目,返回 undefined(由调用方使用默认模型)。\n */\nexport function resolveModelForRunner(runnerMode: string, model: string): string | undefined {\n const map = MODEL_MAPS[runnerMode];\n if (!map) return model;\n const resolved = map[model];\n if (resolved) return resolved;\n logger.warn('Model not in mapping table, will use runner default', {\n runnerMode,\n requestedModel: model,\n availableModels: Object.keys(map),\n });\n return undefined;\n}\n","let _shuttingDown = false;\n\nexport function isShuttingDown(): boolean {\n return _shuttingDown;\n}\n\nexport function setShuttingDown(): void {\n _shuttingDown = true;\n}\n","import { spawn, type ChildProcess, type SpawnOptions } from 'node:child_process';\nimport { logger as rootLogger } from '../logger.js';\nimport { isShuttingDown } from '../shutdown/ShutdownSignal.js';\nimport type { RunOptions, RunResult, StreamEvent } from './AIRunner.js';\n\nconst logger = rootLogger.child('AIRunner');\n\nconst SIGKILL_GRACE_MS = 10_000;\nconst IDLE_CHECK_INTERVAL_MS = 5_000;\nconst RESULT_EXIT_GRACE_MS = 30_000;\n\ninterface ActiveChild {\n child: ChildProcess;\n workDir: string;\n}\n\nexport abstract class BaseAIRunner {\n protected abstract getBinary(): string;\n protected abstract buildArgs(options: RunOptions): string[];\n protected abstract getSpawnOptions(options: RunOptions): SpawnOptions;\n\n private activeChildren = new Map<ChildProcess, ActiveChild>();\n\n async run(options: RunOptions): Promise<RunResult> {\n if (isShuttingDown()) {\n logger.warn('AI runner skipped — service is shutting down');\n return { success: false, output: 'Service shutting down', exitCode: null };\n }\n\n const { prompt, workDir, timeoutMs, sessionId, continueSession, idleTimeoutMs, onStreamEvent } = options;\n\n logger.info('Running AI runner', {\n workDir,\n timeoutMs,\n idleTimeoutMs,\n continueSession: !!continueSession,\n sessionId,\n });\n\n return new Promise<RunResult>((resolve) => {\n const chunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let timedOut = false;\n let timeoutType: 'wall-clock' | 'idle' | undefined;\n let lineBuffer = '';\n let killTimer: ReturnType<typeof setTimeout> | undefined;\n let lastActivityTime = Date.now();\n let resultGraceTimer: ReturnType<typeof setTimeout> | undefined;\n\n const binary = this.getBinary();\n const args = this.buildArgs(options);\n const spawnOpts = this.getSpawnOptions(options);\n\n const child = spawn(binary, args, {\n ...spawnOpts,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n this.activeChildren.set(child, { child, workDir });\n\n const timer = setTimeout(() => {\n timedOut = true;\n timeoutType = 'wall-clock';\n child.kill('SIGTERM');\n logger.warn('AI runner timed out', { timeoutMs });\n\n killTimer = setTimeout(() => {\n if (child.exitCode === null) {\n child.kill('SIGKILL');\n child.stdout?.destroy();\n child.stderr?.destroy();\n logger.warn('AI runner force-killed (SIGKILL fallback)', { workDir });\n }\n }, SIGKILL_GRACE_MS);\n }, timeoutMs);\n\n // Idle timeout: kill process if no stdout/stderr activity for idleTimeoutMs\n const idleCheckInterval = idleTimeoutMs\n ? setInterval(() => {\n const idleMs = Date.now() - lastActivityTime;\n if (idleMs >= idleTimeoutMs) {\n timedOut = true;\n timeoutType = 'idle';\n child.kill('SIGTERM');\n logger.warn('AI runner idle timed out', {\n idleTimeoutMs,\n idleSinceMs: idleMs,\n });\n clearInterval(idleCheckInterval!);\n\n killTimer = setTimeout(() => {\n if (child.exitCode === null) {\n child.kill('SIGKILL');\n child.stdout?.destroy();\n child.stderr?.destroy();\n logger.warn('AI runner force-killed after idle timeout (SIGKILL fallback)', { workDir });\n }\n }, SIGKILL_GRACE_MS);\n }\n }, IDLE_CHECK_INTERVAL_MS)\n : undefined;\n\n const flushInterval = onStreamEvent\n ? setInterval(() => {\n if (lineBuffer.trim()) {\n onStreamEvent({ type: 'partial', content: lineBuffer.trim(), timestamp: new Date().toISOString() });\n }\n }, 200)\n : undefined;\n\n child.stdout.on('data', (chunk: Buffer) => {\n lastActivityTime = Date.now();\n chunks.push(chunk);\n\n lineBuffer += chunk.toString();\n let newlineIdx: number;\n while ((newlineIdx = lineBuffer.indexOf('\\n')) !== -1) {\n const line = lineBuffer.slice(0, newlineIdx).trim();\n lineBuffer = lineBuffer.slice(newlineIdx + 1);\n if (!line) continue;\n\n if (onStreamEvent) {\n this.emitStreamLine(line, onStreamEvent);\n }\n\n // Detect result event: start grace timer to kill hanging process\n if (!resultGraceTimer) {\n try {\n const parsed = JSON.parse(line) as Record<string, unknown>;\n if (parsed.type === 'result') {\n resultGraceTimer = setTimeout(() => {\n if (child.exitCode === null) {\n logger.warn('AI runner process did not exit after result event, sending SIGTERM', {\n graceMs: RESULT_EXIT_GRACE_MS,\n });\n child.kill('SIGTERM');\n\n killTimer = setTimeout(() => {\n if (child.exitCode === null) {\n child.kill('SIGKILL');\n child.stdout?.destroy();\n child.stderr?.destroy();\n logger.warn('AI runner force-killed after result grace (SIGKILL fallback)', { workDir });\n }\n }, SIGKILL_GRACE_MS);\n }\n }, RESULT_EXIT_GRACE_MS);\n }\n } catch {\n // not JSON, ignore\n }\n }\n }\n });\n\n child.stderr.on('data', (chunk: Buffer) => {\n lastActivityTime = Date.now();\n stderrChunks.push(chunk);\n const text = chunk.toString();\n logger.debug('AI runner stderr: ' + text);\n if (onStreamEvent) {\n onStreamEvent({ type: 'stderr', content: text, timestamp: new Date().toISOString() });\n }\n });\n\n child.on('close', (code) => {\n this.activeChildren.delete(child);\n clearTimeout(timer);\n if (killTimer) clearTimeout(killTimer);\n if (resultGraceTimer) clearTimeout(resultGraceTimer);\n if (idleCheckInterval) clearInterval(idleCheckInterval);\n if (flushInterval) clearInterval(flushInterval);\n\n if (onStreamEvent && lineBuffer.trim()) {\n this.emitStreamLine(lineBuffer.trim(), onStreamEvent);\n }\n\n const rawOutput = Buffer.concat(chunks as unknown as Uint8Array[]).toString('utf-8');\n const { output, resolvedSessionId, hasError, errorMessage: parsedErrorMessage } = this.parseOutput(rawOutput, sessionId);\n\n const success = code === 0 && !timedOut && !hasError;\n logger.info('AI runner finished', { exitCode: code, success, timedOut });\n\n const stderrText = stderrChunks.length > 0 ? Buffer.concat(stderrChunks as unknown as Uint8Array[]).toString('utf-8').trim() : '';\n const finalOutput = (!success && !output.trim() && stderrText) ? stderrText : output;\n\n // 组装真正的错误原因\n let errorMessage: string | undefined;\n if (!success) {\n const parts: string[] = [];\n if (timedOut) parts.push(timeoutType === 'idle' ? 'AI 长时间无响应,已超时终止' : '执行超时');\n if (parsedErrorMessage) parts.push(parsedErrorMessage);\n if (code !== 0 && code !== null) parts.push(`进程退出码: ${code}`);\n if (!parts.length && stderrText) parts.push(stderrText.slice(0, 500));\n errorMessage = parts.join(' | ') || undefined;\n }\n\n resolve({\n success,\n output: finalOutput,\n errorMessage,\n sessionId: resolvedSessionId ?? sessionId,\n exitCode: code,\n timeoutType,\n });\n });\n\n child.on('error', (err) => {\n this.activeChildren.delete(child);\n clearTimeout(timer);\n if (killTimer) clearTimeout(killTimer);\n if (resultGraceTimer) clearTimeout(resultGraceTimer);\n if (idleCheckInterval) clearInterval(idleCheckInterval);\n if (flushInterval) clearInterval(flushInterval);\n logger.error('AI runner spawn error', { error: err.message });\n resolve({\n success: false,\n output: err.message,\n errorMessage: err.message,\n exitCode: null,\n });\n });\n\n child.stdin.write(prompt);\n child.stdin.end();\n });\n }\n\n killAll(): void {\n for (const [child] of this.activeChildren) {\n this.forceKillChild(child);\n }\n logger.info('Killed all active AI runner children', { count: this.activeChildren.size });\n }\n\n killByWorkDir(targetWorkDir: string): number {\n let killed = 0;\n for (const [child, entry] of this.activeChildren) {\n if (entry.workDir === targetWorkDir) {\n this.forceKillChild(child);\n killed++;\n }\n }\n if (killed > 0) {\n logger.info('Killed AI runner children by workDir', { workDir: targetWorkDir, killed });\n }\n return killed;\n }\n\n private forceKillChild(child: ChildProcess): void {\n try {\n if (child.exitCode === null) {\n child.kill('SIGTERM');\n setTimeout(() => {\n if (child.exitCode === null) {\n child.kill('SIGKILL');\n }\n }, SIGKILL_GRACE_MS);\n }\n } catch {\n // process may have already exited\n }\n }\n\n private emitStreamLine(line: string, onStreamEvent: (event: StreamEvent) => void): void {\n try {\n const parsed = JSON.parse(line) as Record<string, unknown>;\n onStreamEvent({\n type: (typeof parsed.type === 'string' ? parsed.type : 'raw'),\n content: parsed,\n timestamp: new Date().toISOString(),\n });\n } catch {\n onStreamEvent({ type: 'raw', content: line, timestamp: new Date().toISOString() });\n }\n }\n\n /**\n * Handles both stream-json (one JSON object per line) and legacy single-JSON formats.\n */\n parseOutput(rawOutput: string, _sessionId?: string): { output: string; resolvedSessionId?: string; hasError?: boolean; errorMessage?: string } {\n let output = rawOutput;\n let resolvedSessionId: string | undefined;\n\n const events = this.tryParseStreamJson(rawOutput);\n if (events) {\n output = events\n .filter((item: { type?: string }) => item.type === 'result')\n .map((item: { result?: string }) => item.result ?? '')\n .join('\\n');\n const sessionItem = events.find(\n (item: { type?: string; session_id?: string }) => item.session_id != null,\n );\n if (sessionItem) {\n resolvedSessionId = (sessionItem as { session_id: string }).session_id;\n }\n if (!output) {\n output = this.extractAssistantText(events);\n }\n if (!output) {\n output = this.summarizeStreamEvents(events);\n }\n\n // 始终检查 error 事件,不论 output 是否有值\n const hasError = this.hasErrorEvents(events);\n const errorMessage = hasError ? this.extractErrorMessage(events) : undefined;\n return { output, resolvedSessionId, hasError, errorMessage };\n }\n\n try {\n const parsed = JSON.parse(rawOutput);\n if (Array.isArray(parsed)) {\n output = parsed\n .filter((item: { type?: string }) => item.type === 'result')\n .map((item: { result?: string }) => item.result ?? '')\n .join('\\n');\n const sessionItem = parsed.find(\n (item: { type?: string; session_id?: string }) => item.session_id != null,\n );\n if (sessionItem) {\n resolvedSessionId = sessionItem.session_id;\n }\n if (!output) {\n output = this.extractAssistantText(parsed);\n }\n // 始终检查 error 事件\n const hasError = this.hasErrorEvents(parsed);\n const errorMessage = hasError ? this.extractErrorMessage(parsed) : undefined;\n return { output, resolvedSessionId, hasError, errorMessage };\n } else if (parsed.result != null) {\n output = parsed.result;\n resolvedSessionId = parsed.session_id;\n }\n } catch {\n // raw text output\n }\n\n return { output, resolvedSessionId };\n }\n\n /**\n * Extract plain text from assistant events as fallback when result.result is empty.\n * Looks for message.content[].text in assistant-type events.\n */\n private extractAssistantText(events: Record<string, unknown>[]): string {\n const texts: string[] = [];\n for (const evt of events) {\n if (evt.type !== 'assistant') continue;\n const message = evt.message as { content?: Array<{ type?: string; text?: string }> } | undefined;\n if (!message?.content || !Array.isArray(message.content)) continue;\n for (const block of message.content) {\n if (block.type === 'text' && block.text) {\n texts.push(block.text);\n }\n }\n }\n return texts.join('');\n }\n\n private hasErrorEvents(events: Record<string, unknown>[]): boolean {\n return events.some(e => e.type === 'error' || e.subtype === 'error');\n }\n\n /** 提取 error 事件中的错误描述信息 */\n private extractErrorMessage(events: Record<string, unknown>[]): string {\n const errorEvents = events.filter(e => e.type === 'error' || e.subtype === 'error');\n if (errorEvents.length === 0) return '';\n return errorEvents.map(e => String(e.message ?? e.error ?? JSON.stringify(e))).join('; ');\n }\n\n private summarizeStreamEvents(events: Record<string, unknown>[]): string {\n const errorEvents = events.filter(\n (e) => e.type === 'error' || e.subtype === 'error',\n );\n if (errorEvents.length > 0) {\n const messages = errorEvents.map(\n (e) => String(e.message ?? e.error ?? JSON.stringify(e)),\n );\n return `AI runner 错误: ${messages.join('; ')}`;\n }\n\n const types = events.map((e) => String(e.type ?? 'unknown'));\n const typeCounts: Record<string, number> = {};\n for (const t of types) {\n typeCounts[t] = (typeCounts[t] ?? 0) + 1;\n }\n const summary = Object.entries(typeCounts)\n .map(([t, c]) => `${t}(${c})`)\n .join(', ');\n return `AI runner 未返回结果 (收到 ${events.length} 个事件: ${summary})`;\n }\n\n private tryParseStreamJson(raw: string): Record<string, unknown>[] | null {\n const lines = raw.split('\\n').filter((l) => l.trim());\n if (lines.length < 2) return null;\n\n const objects: Record<string, unknown>[] = [];\n for (const line of lines) {\n try {\n objects.push(JSON.parse(line) as Record<string, unknown>);\n } catch {\n return null;\n }\n }\n return objects;\n }\n}\n","import type { SpawnOptions } from 'node:child_process';\nimport { BaseAIRunner } from './BaseAIRunner.js';\nimport type { RunOptions } from './AIRunner.js';\n\nexport class ClaudeInternalRunner extends BaseAIRunner {\n private readonly binary: string;\n private readonly nvmNodeVersion: string;\n private readonly model?: string;\n\n constructor(binary: string, nvmNodeVersion: string, model?: string) {\n super();\n this.binary = binary;\n this.nvmNodeVersion = nvmNodeVersion;\n this.model = model;\n }\n\n protected getBinary(): string {\n return this.binary;\n }\n\n protected buildArgs(options: RunOptions): string[] {\n const args = ['-p', '-', '--output-format', 'stream-json', '--verbose'];\n if (options.mode === 'plan') {\n args.push('--permission-mode', 'plan', '--allowedTools', 'Read,Grep,Glob,WebSearch');\n } else {\n args.push('--dangerously-skip-permissions');\n }\n if (this.model) {\n args.push('--model', this.model);\n }\n if (options.continueSession && options.sessionId) {\n args.push('--resume', options.sessionId);\n }\n return args;\n }\n\n protected getSpawnOptions(options: RunOptions): SpawnOptions {\n const { CLAUDECODE, ...env } = process.env;\n return {\n cwd: options.workDir,\n env: {\n ...env,\n NODE_VERSION: this.nvmNodeVersion,\n },\n };\n }\n}\n","import type { SpawnOptions } from 'node:child_process';\nimport { BaseAIRunner } from './BaseAIRunner.js';\nimport type { RunOptions } from './AIRunner.js';\n\nexport class CursorAgentRunner extends BaseAIRunner {\n private readonly binary: string;\n private readonly nvmNodeVersion: string;\n private readonly model?: string;\n\n constructor(binary: string, nvmNodeVersion: string, model?: string) {\n super();\n this.binary = binary;\n this.nvmNodeVersion = nvmNodeVersion;\n this.model = model;\n }\n\n protected getBinary(): string {\n return this.binary;\n }\n\n protected buildArgs(options: RunOptions): string[] {\n const args = [\n 'agent',\n '-p',\n '--force',\n '--trust',\n '--output-format',\n 'stream-json',\n '--workspace',\n options.workDir,\n ];\n if (options.mode === 'plan') {\n args.push('--mode', 'plan');\n }\n if (this.model) {\n args.push('--model', this.model);\n }\n if (options.continueSession && options.sessionId) {\n args.push('--resume', options.sessionId);\n }\n return args;\n }\n\n protected getSpawnOptions(_options: RunOptions): SpawnOptions {\n return {\n cwd: process.cwd(),\n env: {\n ...process.env,\n NODE_VERSION: this.nvmNodeVersion,\n },\n };\n }\n}\n","import type { SpawnOptions } from 'node:child_process';\nimport { BaseAIRunner } from './BaseAIRunner.js';\nimport type { RunOptions } from './AIRunner.js';\n\nexport class CodebuddyRunner extends BaseAIRunner {\n private readonly binary: string;\n private readonly nvmNodeVersion: string;\n private readonly model?: string;\n\n constructor(binary: string, nvmNodeVersion: string, model?: string) {\n super();\n this.binary = binary;\n this.nvmNodeVersion = nvmNodeVersion;\n this.model = model;\n }\n\n protected getBinary(): string {\n return this.binary;\n }\n\n protected buildArgs(options: RunOptions): string[] {\n const args = ['-p', '-', '--output-format', 'stream-json', '--verbose'];\n if (this.model) {\n args.push('--model', this.model);\n }\n if (options.continueSession && options.sessionId) {\n args.push('--resume', options.sessionId);\n }\n // CodeBuddy 的 --permission-mode plan 设计为交互式审批,与 -p 非交互模式不兼容,\n // 会导致进程卡死。plan 阶段的行为约束通过 Prompt 层(planModeFallback)控制。\n args.push('-y');\n return args;\n }\n\n protected getSpawnOptions(options: RunOptions): SpawnOptions {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { CLAUDECODE, ...env } = process.env;\n return {\n cwd: options.workDir,\n env: {\n ...env,\n NODE_VERSION: this.nvmNodeVersion,\n },\n };\n }\n}\n","/**\n * CodeBuddy ACP Runner — uses the Agent Client Protocol (JSON-RPC 2.0 over stdio)\n * for native plan-mode support with programmatic input/output control.\n *\n * Unlike CodebuddyRunner (pipe mode), this runner maintains a persistent session\n * with three-step handshake (initialize → session/new → session/prompt) and handles\n * permission requests from the agent.\n */\nimport { spawn, type ChildProcess } from 'node:child_process';\nimport { logger as rootLogger } from '../logger.js';\nimport { isShuttingDown } from '../shutdown/ShutdownSignal.js';\nimport type { RunOptions, RunResult, StreamEvent } from './AIRunner.js';\nimport { BaseAIRunner } from './BaseAIRunner.js';\nimport {\n AcpProtocol,\n isNotification,\n isAgentRequest,\n isResponse,\n isPermissionRequest,\n isSessionUpdate,\n type AcpInboundMessage,\n type AcpUpdatePayload,\n type AcpUpdateChunk,\n type AcpUpdateToolCall,\n type AcpUpdateToolCallUpdate,\n} from './acp/AcpProtocol.js';\n\nconst logger = rootLogger.child('CodebuddyAcpRunner');\n\nconst SIGKILL_GRACE_MS = 10_000;\nconst IDLE_CHECK_INTERVAL_MS = 5_000;\n\ninterface ActiveChild {\n child: ChildProcess;\n workDir: string;\n}\n\n/** Handshake FSM states */\ntype HandshakeState = 'init' | 'session_new' | 'prompting' | 'done';\n\nexport class CodebuddyAcpRunner extends BaseAIRunner {\n private readonly binary: string;\n private readonly nvmNodeVersion: string;\n private readonly model?: string;\n private acpActiveChildren = new Map<ChildProcess, ActiveChild>();\n\n constructor(binary: string, nvmNodeVersion: string, model?: string) {\n super();\n this.binary = binary;\n this.nvmNodeVersion = nvmNodeVersion;\n this.model = model;\n }\n\n // ── Overrides required by BaseAIRunner (kept for compatibility) ──\n\n protected getBinary(): string {\n return this.binary;\n }\n\n protected buildArgs(_options: RunOptions): string[] {\n const args = ['--acp', '--acp-transport', 'stdio', '--permission-mode', 'plan', '--verbose'];\n if (this.model) args.push('--model', this.model);\n return args;\n }\n\n protected getSpawnOptions(options: RunOptions): Record<string, unknown> {\n const { CLAUDECODE, ...env } = process.env;\n void CLAUDECODE;\n return {\n cwd: options.workDir,\n env: { ...env, NODE_VERSION: this.nvmNodeVersion },\n };\n }\n\n // ── Main entry: override BaseAIRunner.run() for ACP session lifecycle ──\n\n async run(options: RunOptions): Promise<RunResult> {\n if (isShuttingDown()) {\n logger.warn('ACP runner skipped — service is shutting down');\n return { success: false, output: 'Service shutting down', exitCode: null };\n }\n\n const { prompt, workDir, timeoutMs, idleTimeoutMs, onStreamEvent } = options;\n\n logger.info('Starting CodeBuddy ACP session', {\n workDir,\n timeoutMs,\n idleTimeoutMs,\n model: this.model,\n });\n\n return new Promise<RunResult>((resolve) => {\n const protocol = new AcpProtocol();\n let rpcId = 1;\n let sessionId: string | undefined;\n let handshake: HandshakeState = 'init';\n const outputChunks: string[] = [];\n let timedOut = false;\n let timeoutType: 'wall-clock' | 'idle' | undefined;\n let lastActivityTime = Date.now();\n let resolved = false;\n const stderrChunks: string[] = [];\n\n const safeResolve = (result: RunResult) => {\n if (resolved) return;\n resolved = true;\n cleanup();\n resolve(result);\n };\n\n const binary = this.getBinary();\n const args = this.buildArgs(options);\n const spawnOpts = this.getSpawnOptions(options);\n\n const child = spawn(binary, args, {\n ...(spawnOpts as Record<string, unknown>),\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n this.acpActiveChildren.set(child, { child, workDir });\n\n // ── Timers ──\n\n const wallTimer = setTimeout(() => {\n timedOut = true;\n timeoutType = 'wall-clock';\n logger.warn('ACP runner wall-clock timeout', { timeoutMs });\n killChild(child);\n }, timeoutMs);\n\n let killTimer: ReturnType<typeof setTimeout> | undefined;\n\n const idleInterval = idleTimeoutMs\n ? setInterval(() => {\n if (Date.now() - lastActivityTime >= idleTimeoutMs) {\n timedOut = true;\n timeoutType = 'idle';\n logger.warn('ACP runner idle timeout', { idleTimeoutMs });\n clearInterval(idleInterval!);\n killChild(child);\n }\n }, IDLE_CHECK_INTERVAL_MS)\n : undefined;\n\n const cleanup = () => {\n clearTimeout(wallTimer);\n if (killTimer) clearTimeout(killTimer);\n if (idleInterval) clearInterval(idleInterval);\n this.acpActiveChildren.delete(child);\n };\n\n const killChild = (proc: ChildProcess) => {\n try {\n proc.kill('SIGTERM');\n killTimer = setTimeout(() => {\n if (proc.exitCode === null) {\n proc.kill('SIGKILL');\n proc.stdout?.destroy();\n proc.stderr?.destroy();\n }\n }, SIGKILL_GRACE_MS);\n } catch { /* already exited */ }\n };\n\n // ── Send initialize as first message ──\n child.stdin!.write(protocol.encodeRequest('initialize', { protocolVersion: 1 }, rpcId++));\n\n // ── Stdout handler ──\n child.stdout!.on('data', (chunk: Buffer) => {\n lastActivityTime = Date.now();\n\n for (const msg of protocol.parseChunk(chunk)) {\n this.handleMessage(\n msg, child, protocol, handshake,\n () => rpcId++,\n (s) => { sessionId = s; },\n () => sessionId,\n (h) => { handshake = h; },\n () => handshake,\n workDir, prompt, outputChunks, onStreamEvent,\n (result) => safeResolve(result),\n options,\n );\n }\n });\n\n child.stderr!.on('data', (chunk: Buffer) => {\n lastActivityTime = Date.now();\n const text = chunk.toString();\n stderrChunks.push(text);\n logger.debug('ACP runner stderr: ' + text.slice(0, 500));\n if (onStreamEvent) {\n onStreamEvent({ type: 'stderr', content: text, timestamp: new Date().toISOString() });\n }\n });\n\n child.on('close', (code) => {\n // Flush remaining buffer\n for (const msg of protocol.flush()) {\n this.handleMessage(\n msg, child, protocol, handshake,\n () => rpcId++,\n (s) => { sessionId = s; },\n () => sessionId,\n (h) => { handshake = h; },\n () => handshake,\n workDir, prompt, outputChunks, onStreamEvent,\n (result) => safeResolve(result),\n options,\n );\n }\n\n const output = outputChunks.join('');\n const stderrText = stderrChunks.join('').trim();\n const success = code === 0 && !timedOut;\n\n let errorMessage: string | undefined;\n if (!success) {\n const parts: string[] = [];\n if (timedOut) parts.push(timeoutType === 'idle' ? 'AI 长时间无响应,已超时终止' : '执行超时');\n if (code !== 0 && code !== null) parts.push(`进程退出码: ${code}`);\n if (!parts.length && stderrText) parts.push(stderrText.slice(0, 500));\n errorMessage = parts.join(' | ') || undefined;\n }\n\n logger.info('ACP runner finished', { exitCode: code, success, timedOut });\n safeResolve({\n success,\n output: output || stderrText,\n errorMessage,\n sessionId,\n exitCode: code,\n timeoutType,\n });\n });\n\n child.on('error', (err) => {\n logger.error('ACP runner spawn error', { error: err.message });\n safeResolve({\n success: false,\n output: err.message,\n errorMessage: err.message,\n exitCode: null,\n });\n });\n });\n }\n\n // ── Message dispatch ──\n\n private handleMessage(\n msg: AcpInboundMessage,\n child: ChildProcess,\n protocol: AcpProtocol,\n _handshake: HandshakeState,\n nextId: () => number,\n setSessionId: (s: string) => void,\n getSessionId: () => string | undefined,\n setHandshake: (h: HandshakeState) => void,\n getHandshake: () => HandshakeState,\n workDir: string,\n prompt: string,\n outputChunks: string[],\n onStreamEvent: ((event: StreamEvent) => void) | undefined,\n onComplete: (result: RunResult) => void,\n options: RunOptions,\n ): void {\n if (isResponse(msg)) {\n this.handleResponse(\n msg, child, protocol, nextId, setSessionId, getSessionId,\n setHandshake, getHandshake, workDir, prompt, outputChunks,\n onStreamEvent, onComplete, options,\n );\n } else if (isNotification(msg)) {\n this.handleNotification(msg, outputChunks, onStreamEvent);\n } else if (isAgentRequest(msg)) {\n this.handleAgentRequest(msg, child, protocol, onStreamEvent, options);\n }\n }\n\n private handleResponse(\n msg: AcpInboundMessage,\n child: ChildProcess,\n protocol: AcpProtocol,\n nextId: () => number,\n setSessionId: (s: string) => void,\n getSessionId: () => string | undefined,\n setHandshake: (h: HandshakeState) => void,\n getHandshake: () => HandshakeState,\n workDir: string,\n prompt: string,\n outputChunks: string[],\n onStreamEvent: ((event: StreamEvent) => void) | undefined,\n _onComplete: (result: RunResult) => void,\n _options: RunOptions,\n ): void {\n const result = msg.result as Record<string, unknown> | undefined;\n const state = getHandshake();\n\n if (state === 'init' && result?.protocolVersion !== undefined) {\n // initialize response → send session/new\n setHandshake('session_new');\n child.stdin!.write(\n protocol.encodeRequest('session/new', { cwd: workDir, mcpServers: [] }, nextId()),\n );\n } else if (state === 'session_new' && result?.sessionId) {\n // session/new response → send session/prompt\n setSessionId(result.sessionId as string);\n setHandshake('prompting');\n child.stdin!.write(\n protocol.encodeRequest(\n 'session/prompt',\n {\n sessionId: result.sessionId,\n prompt: [{ type: 'text', text: prompt }],\n },\n nextId(),\n ),\n );\n } else if (state === 'prompting') {\n // session/prompt final response\n setHandshake('done');\n const stopReason = (result as Record<string, unknown> | undefined)?.stopReason as string | undefined;\n logger.info('ACP session/prompt completed', {\n stopReason,\n sessionId: getSessionId(),\n });\n if (onStreamEvent) {\n onStreamEvent({\n type: 'system',\n content: `ACP session completed: ${stopReason ?? 'unknown'}`,\n timestamp: new Date().toISOString(),\n });\n }\n // Collect final output text\n if (stopReason === 'refusal') {\n outputChunks.push('[REFUSED] Agent 拒绝执行');\n }\n }\n }\n\n private handleNotification(\n msg: AcpInboundMessage,\n outputChunks: string[],\n onStreamEvent: ((event: StreamEvent) => void) | undefined,\n ): void {\n if (!isSessionUpdate(msg)) return;\n\n const update = msg.params?.update as AcpUpdatePayload | undefined;\n if (!update) return;\n\n const event = this.mapUpdateToStreamEvent(update, outputChunks);\n if (event && onStreamEvent) {\n onStreamEvent(event);\n }\n }\n\n private handleAgentRequest(\n msg: AcpInboundMessage,\n child: ChildProcess,\n protocol: AcpProtocol,\n onStreamEvent: ((event: StreamEvent) => void) | undefined,\n options: RunOptions,\n ): void {\n if (!isPermissionRequest(msg)) {\n // Unknown agent request — send empty result to avoid blocking\n child.stdin!.write(protocol.encodeResponse(msg.id as number, {}));\n return;\n }\n\n const toolTitle = msg.params.toolCall.rawInput\n ? JSON.stringify(msg.params.toolCall.rawInput).slice(0, 200)\n : msg.params.toolCall.toolCallId;\n\n if (onStreamEvent) {\n onStreamEvent({\n type: 'system',\n content: `Permission requested: ${toolTitle}`,\n timestamp: new Date().toISOString(),\n });\n }\n\n if (options.onInputRequired) {\n const permissionContent = JSON.stringify({\n toolCallId: msg.params.toolCall.toolCallId,\n options: msg.params.options,\n rawInput: msg.params.toolCall.rawInput,\n });\n\n options.onInputRequired({ type: 'plan-approval', content: permissionContent })\n .then((decision) => {\n const optionId = decision === 'reject' ? 'reject' : 'allow';\n child.stdin!.write(\n protocol.encodeResponse(msg.id, {\n outcome: { outcome: 'selected', optionId },\n }),\n );\n })\n .catch((err) => {\n logger.warn('onInputRequired callback failed, auto-approving', { error: (err as Error).message });\n this.autoApprove(child, protocol, msg.id, msg.params.options);\n });\n return;\n }\n\n // No callback: auto-approve all permissions\n this.autoApprove(child, protocol, msg.id, msg.params.options);\n }\n\n private autoApprove(\n child: ChildProcess,\n protocol: AcpProtocol,\n requestId: number,\n options: Array<{ optionId: string; kind: string }>,\n ): void {\n const allowOption = options.find(\n (o) => o.kind === 'allow_always' || o.kind === 'allow_once',\n );\n child.stdin!.write(\n protocol.encodeResponse(requestId, {\n outcome: { outcome: 'selected', optionId: allowOption?.optionId ?? 'allow' },\n }),\n );\n }\n\n // ── StreamEvent mapping (reuses existing frontend log pipeline) ──\n\n private mapUpdateToStreamEvent(\n update: AcpUpdatePayload,\n outputChunks: string[],\n ): StreamEvent | null {\n switch (update.sessionUpdate) {\n case 'agent_message_chunk': {\n const chunk = update as AcpUpdateChunk;\n if (chunk.content.type === 'thinking') {\n return {\n type: 'thinking',\n content: { text: chunk.content.text },\n timestamp: new Date().toISOString(),\n };\n }\n outputChunks.push(chunk.content.text);\n return {\n type: 'assistant',\n content: {\n message: { content: [{ type: 'text', text: chunk.content.text }] },\n },\n timestamp: new Date().toISOString(),\n };\n }\n\n case 'tool_call': {\n const tc = update as AcpUpdateToolCall;\n return {\n type: 'tool_use',\n content: { tool: { name: tc.title, input: tc.rawInput ?? {} } },\n timestamp: new Date().toISOString(),\n };\n }\n\n case 'tool_call_update': {\n const tcu = update as AcpUpdateToolCallUpdate;\n return {\n type: 'tool_result',\n content: tcu.status,\n timestamp: new Date().toISOString(),\n };\n }\n\n default:\n return null;\n }\n }\n\n // ── Process management ──\n\n killAll(): void {\n for (const [child] of this.acpActiveChildren) {\n this.forceKill(child);\n }\n logger.info('Killed all ACP runner children', { count: this.acpActiveChildren.size });\n }\n\n killByWorkDir(targetWorkDir: string): number {\n let killed = 0;\n for (const [child, entry] of this.acpActiveChildren) {\n if (entry.workDir === targetWorkDir) {\n this.forceKill(child);\n killed++;\n }\n }\n if (killed > 0) {\n logger.info('Killed ACP runner children by workDir', { workDir: targetWorkDir, killed });\n }\n return killed;\n }\n\n private forceKill(child: ChildProcess): void {\n try {\n if (child.exitCode === null) {\n child.kill('SIGTERM');\n setTimeout(() => {\n if (child.exitCode === null) child.kill('SIGKILL');\n }, SIGKILL_GRACE_MS);\n }\n } catch { /* already exited */ }\n }\n}\n","/**\n * ACP (Agent Client Protocol) JSON-RPC 2.0 codec.\n *\n * Handles line-buffered parsing of newline-delimited JSON messages from\n * CodeBuddy's stdin/stdout ACP transport and encoding of outbound requests/responses.\n *\n * Protocol reference: https://agentclientprotocol.com/protocol/schema\n */\n\n// ---------------------------------------------------------------------------\n// Outbound types (Agent → Client)\n// ---------------------------------------------------------------------------\n\nexport interface AcpUpdateChunk {\n sessionUpdate: 'agent_message_chunk';\n content: { type: 'text' | 'thinking'; text: string };\n}\n\nexport interface AcpUpdateToolCall {\n sessionUpdate: 'tool_call';\n toolCallId: string;\n title: string;\n kind: string;\n status: string;\n content?: Array<{\n type: string;\n path?: string;\n oldText?: string | null;\n newText?: string;\n text?: string;\n }>;\n rawInput?: Record<string, unknown>;\n}\n\nexport interface AcpUpdateToolCallUpdate {\n sessionUpdate: 'tool_call_update';\n toolCallId: string;\n status: string;\n}\n\nexport interface AcpUpdateGeneric {\n sessionUpdate: string;\n [key: string]: unknown;\n}\n\nexport type AcpUpdatePayload =\n | AcpUpdateChunk\n | AcpUpdateToolCall\n | AcpUpdateToolCallUpdate\n | AcpUpdateGeneric;\n\nexport interface AcpSessionUpdate {\n jsonrpc: '2.0';\n method: 'session/update';\n params: {\n sessionId: string;\n update: AcpUpdatePayload;\n };\n}\n\nexport interface AcpPermissionOption {\n optionId: string;\n name: string;\n kind: string;\n}\n\nexport interface AcpPermissionRequest {\n jsonrpc: '2.0';\n id: number;\n method: 'session/request_permission';\n params: {\n sessionId: string;\n options: AcpPermissionOption[];\n toolCall: {\n toolCallId: string;\n rawInput?: Record<string, unknown>;\n };\n };\n}\n\nexport interface AcpResponse {\n jsonrpc: '2.0';\n id: number;\n result: Record<string, unknown>;\n}\n\nexport interface AcpError {\n jsonrpc: '2.0';\n id: number;\n error: { code: number; message: string; data?: unknown };\n}\n\n// Discriminated message type from the agent\nexport type AcpInboundMessage = Record<string, unknown>;\n\n// ---------------------------------------------------------------------------\n// Message classification helpers\n// ---------------------------------------------------------------------------\n\nexport function isNotification(msg: AcpInboundMessage): boolean {\n return typeof msg.method === 'string' && msg.id === undefined;\n}\n\nexport function isAgentRequest(msg: AcpInboundMessage): boolean {\n return typeof msg.method === 'string' && msg.id !== undefined;\n}\n\nexport function isResponse(msg: AcpInboundMessage): boolean {\n return msg.method === undefined && msg.id !== undefined;\n}\n\nexport function isPermissionRequest(msg: AcpInboundMessage): msg is AcpPermissionRequest & AcpInboundMessage {\n return isAgentRequest(msg) && msg.method === 'session/request_permission';\n}\n\nexport function isSessionUpdate(msg: AcpInboundMessage): msg is AcpSessionUpdate & AcpInboundMessage {\n return isNotification(msg) && msg.method === 'session/update';\n}\n\n// ---------------------------------------------------------------------------\n// Protocol codec\n// ---------------------------------------------------------------------------\n\nexport class AcpProtocol {\n private lineBuffer = '';\n\n /** Parse incoming data chunk into zero or more complete JSON-RPC messages. */\n parseChunk(chunk: Buffer | string): AcpInboundMessage[] {\n this.lineBuffer += typeof chunk === 'string' ? chunk : chunk.toString('utf-8');\n\n const messages: AcpInboundMessage[] = [];\n let newlineIdx: number;\n\n while ((newlineIdx = this.lineBuffer.indexOf('\\n')) !== -1) {\n const line = this.lineBuffer.slice(0, newlineIdx).trim();\n this.lineBuffer = this.lineBuffer.slice(newlineIdx + 1);\n\n if (!line) continue;\n\n try {\n messages.push(JSON.parse(line) as AcpInboundMessage);\n } catch {\n // Malformed line — skip silently (could be debug output from --verbose)\n }\n }\n\n return messages;\n }\n\n /** Flush any remaining buffered data (e.g. on stream end). */\n flush(): AcpInboundMessage[] {\n const remaining = this.lineBuffer.trim();\n this.lineBuffer = '';\n if (!remaining) return [];\n\n try {\n return [JSON.parse(remaining) as AcpInboundMessage];\n } catch {\n return [];\n }\n }\n\n /** Encode a JSON-RPC request (Client → Agent). */\n encodeRequest(method: string, params: Record<string, unknown>, id: number): string {\n return JSON.stringify({ jsonrpc: '2.0', method, params, id }) + '\\n';\n }\n\n /** Encode a JSON-RPC response (Client → Agent, replying to agent request). */\n encodeResponse(id: number, result: Record<string, unknown>): string {\n return JSON.stringify({ jsonrpc: '2.0', id, result }) + '\\n';\n }\n}\n","import { spawn } from 'node:child_process';\nimport type { AIRunner } from './AIRunner.js';\nimport type { BaseAIRunner } from './BaseAIRunner.js';\nimport { RunnerNotRegisteredError } from '../errors/index.js';\nimport { resolveModelForRunner } from './ModelMapping.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface AIConfig {\n mode: string;\n binary: string;\n phaseTimeoutMs: number;\n nvmNodeVersion: string;\n model?: string;\n}\n\ntype RunnerConstructor = new (binary: string, nvmNodeVersion: string, model?: string) => BaseAIRunner;\n\nexport interface RunnerCapabilities {\n /** Whether the runner natively supports plan mode (AI enters planning mindset) */\n nativePlanMode: boolean;\n}\n\nexport interface RunnerRegistryEntry {\n ctor: RunnerConstructor;\n defaultBinary: string;\n binaryEnvKey: string;\n capabilities: RunnerCapabilities;\n}\n\n// ---------------------------------------------------------------------------\n// Registry\n// ---------------------------------------------------------------------------\n\nconst AI_RUNNER_REGISTRY: Record<string, RunnerRegistryEntry> = {};\n\nexport function registerAIRunner(mode: string, entry: RunnerRegistryEntry): void {\n AI_RUNNER_REGISTRY[mode] = entry;\n}\n\nexport function getRegisteredRunnerModes(): string[] {\n return Object.keys(AI_RUNNER_REGISTRY);\n}\n\nexport function isRegisteredRunner(mode: string): boolean {\n return mode in AI_RUNNER_REGISTRY;\n}\n\n// ---------------------------------------------------------------------------\n// Resolve helpers (replace config.ts switch/case)\n// ---------------------------------------------------------------------------\n\nexport function resolveRunnerMode(raw: string): string {\n return raw || 'claude-internal';\n}\n\nexport function getDefaultBinary(mode: string): string {\n const entry = AI_RUNNER_REGISTRY[mode];\n return entry?.defaultBinary ?? mode;\n}\n\nexport function getBinaryEnvKey(mode: string): string | undefined {\n return AI_RUNNER_REGISTRY[mode]?.binaryEnvKey;\n}\n\nexport function getRunnerCapabilities(mode: string): RunnerCapabilities | undefined {\n return AI_RUNNER_REGISTRY[mode]?.capabilities;\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createAIRunner(ai: AIConfig): AIRunner {\n const entry = AI_RUNNER_REGISTRY[ai.mode];\n if (!entry) {\n throw new RunnerNotRegisteredError(ai.mode, getRegisteredRunnerModes());\n }\n const resolvedModel = ai.model ? resolveModelForRunner(ai.mode, ai.model) : undefined;\n return new entry.ctor(ai.binary, ai.nvmNodeVersion, resolvedModel);\n}\n\n// ---------------------------------------------------------------------------\n// Startup validation\n// ---------------------------------------------------------------------------\n\nexport function validateRunnerRegistry(modes: string[]): void {\n const missing = modes.filter((m) => !isRegisteredRunner(m));\n if (missing.length > 0) {\n throw new RunnerNotRegisteredError(\n missing.join(', '),\n getRegisteredRunnerModes(),\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Binary availability check\n// ---------------------------------------------------------------------------\n\n/** Check if a binary is available on the system PATH. */\nexport function isBinaryAvailable(binary: string): Promise<boolean> {\n return new Promise((resolve) => {\n const proc = spawn('which', [binary], { stdio: ['ignore', 'pipe', 'ignore'] });\n proc.on('close', (code) => resolve(code === 0));\n proc.on('error', () => resolve(false));\n });\n}\n\n// ---------------------------------------------------------------------------\n// Built-in registrations\n// ---------------------------------------------------------------------------\n\nimport { ClaudeInternalRunner } from './ClaudeInternalRunner.js';\nimport { CursorAgentRunner } from './CursorAgentRunner.js';\nimport { CodebuddyRunner } from './CodebuddyRunner.js';\nimport { CodebuddyAcpRunner } from './CodebuddyAcpRunner.js';\n\nregisterAIRunner('claude-internal', {\n ctor: ClaudeInternalRunner,\n defaultBinary: 'claude-internal',\n binaryEnvKey: 'CLAUDE_BINARY',\n capabilities: { nativePlanMode: false },\n});\n\nregisterAIRunner('cursor-agent', {\n ctor: CursorAgentRunner,\n defaultBinary: 'cursor-agent',\n binaryEnvKey: 'CURSOR_BINARY',\n capabilities: { nativePlanMode: true },\n});\n\nregisterAIRunner('codebuddy', {\n ctor: CodebuddyRunner,\n defaultBinary: 'codebuddy',\n binaryEnvKey: 'CODEBUDDY_BINARY',\n capabilities: { nativePlanMode: false },\n});\n\nregisterAIRunner('codebuddy-acp', {\n ctor: CodebuddyAcpRunner,\n defaultBinary: 'codebuddy',\n binaryEnvKey: 'CODEBUDDY_BINARY',\n capabilities: { nativePlanMode: true },\n});\n","/**\n * Base application error with structured error code and cause chain.\n */\nexport class AppError extends Error {\n /** Unique error code for programmatic matching (e.g. 'GONGFENG_API_ERROR'). */\n public readonly code: string;\n /** Original cause, if any. */\n public override readonly cause?: Error;\n\n constructor(code: string, message: string, cause?: Error) {\n super(message, { cause });\n this.name = this.constructor.name;\n this.code = code;\n this.cause = cause;\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n ...(this.cause ? { cause: this.cause.message } : {}),\n };\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class GongfengApiError extends AppError {\n public readonly statusCode: number;\n public readonly responseBody?: string;\n\n constructor(statusCode: number, message: string, responseBody?: string) {\n super('GONGFENG_API_ERROR', message);\n this.statusCode = statusCode;\n this.responseBody = responseBody;\n }\n\n /** Whether this error is potentially retryable (5xx or network). */\n get isRetryable(): boolean {\n return this.statusCode >= 500 || this.statusCode === 0;\n }\n}\n\nexport class GongfengUploadError extends GongfengApiError {\n constructor(statusCode: number, message: string, responseBody?: string) {\n super(statusCode, message, responseBody);\n this.name = 'GongfengUploadError';\n // Override code\n Object.defineProperty(this, 'code', { value: 'GONGFENG_UPLOAD_ERROR' });\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class AIExecutionError extends AppError {\n public readonly phase: string;\n public readonly output?: string;\n public readonly exitCode?: number | null;\n public readonly isRetryable: boolean;\n\n constructor(phase: string, message: string, opts?: { output?: string; exitCode?: number | null; cause?: Error; isRetryable?: boolean }) {\n super('AI_EXECUTION_ERROR', message, opts?.cause);\n this.phase = phase;\n this.output = opts?.output;\n this.exitCode = opts?.exitCode;\n this.isRetryable = opts?.isRetryable ?? true;\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class IssueNotFoundError extends AppError {\n public readonly issueIid: number;\n constructor(issueIid: number) {\n super('ISSUE_NOT_FOUND', `Issue ${issueIid} not found in tracker`);\n this.issueIid = issueIid;\n }\n}\n\nexport class BatchNotFoundError extends AppError {\n public readonly batchId: string;\n constructor(batchId: string) {\n super('BATCH_NOT_FOUND', `Braindump batch not found: ${batchId}`);\n this.batchId = batchId;\n }\n}\n\nexport class SessionNotFoundError extends AppError {\n public readonly sessionId: string;\n constructor(sessionId: string) {\n super('SESSION_NOT_FOUND', `Chat session not found: ${sessionId}`);\n this.sessionId = sessionId;\n }\n}\n\nexport class TaskNotFoundError extends AppError {\n public readonly taskId: string;\n constructor(taskId: string) {\n super('TASK_NOT_FOUND', `Braindump task not found: ${taskId}`);\n this.taskId = taskId;\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class InvalidPhaseError extends AppError {\n public readonly phase: string;\n constructor(phase: string, message?: string) {\n super('INVALID_PHASE', message ?? `Invalid phase for retry: ${phase}`);\n this.phase = phase;\n }\n}\n\nexport class InvalidStateError extends AppError {\n public readonly state: string;\n constructor(state: string, message?: string) {\n super('INVALID_STATE', message ?? `Invalid state: ${state}`);\n this.state = state;\n }\n}\n\nexport class PortExhaustionError extends AppError {\n constructor(message?: string) {\n super('PORT_EXHAUSTION', message ?? 'No available ports in the configured range');\n }\n}\n\nexport class SessionLimitError extends AppError {\n public readonly limit: number;\n constructor(limit: number) {\n super('SESSION_LIMIT', `Session message limit reached (${limit})`);\n this.limit = limit;\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class ServiceShutdownError extends AppError {\n constructor() {\n super('SERVICE_SHUTDOWN', 'Service shutting down');\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class AIOutputParseError extends AppError {\n public readonly rawOutput?: string;\n constructor(message: string, rawOutput?: string) {\n super('AI_OUTPUT_PARSE_ERROR', message);\n this.rawOutput = rawOutput;\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class PhaseNotRegisteredError extends AppError {\n public readonly phaseName: string;\n public readonly registeredPhases: string[];\n constructor(phaseName: string, registeredPhases: string[]) {\n super(\n 'PHASE_NOT_REGISTERED',\n `Unknown phase: ${phaseName}. Registered phases: ${registeredPhases.join(', ')}`,\n );\n this.phaseName = phaseName;\n this.registeredPhases = registeredPhases;\n }\n}\n\nexport class RunnerNotRegisteredError extends AppError {\n public readonly mode: string;\n public readonly registeredModes: string[];\n constructor(mode: string, registeredModes: string[]) {\n super(\n 'RUNNER_NOT_REGISTERED',\n `Unknown AI runner mode: ${mode}. Registered modes: ${registeredModes.join(', ')}`,\n );\n this.mode = mode;\n this.registeredModes = registeredModes;\n }\n}\n\nexport class PipelineNotFoundError extends AppError {\n public readonly pipelineMode: string;\n constructor(pipelineMode: string) {\n super('PIPELINE_NOT_FOUND', `Unknown pipeline mode: ${pipelineMode}`);\n this.pipelineMode = pipelineMode;\n }\n}\n\nexport class UnregisteredPhasesError extends AppError {\n public readonly missingPhases: string[];\n public readonly registeredPhases: string[];\n constructor(missingPhases: string[], registeredPhases: string[]) {\n super(\n 'UNREGISTERED_PHASES',\n `Pipeline defines unregistered phases: ${missingPhases.join(', ')}. Registered: ${registeredPhases.join(', ')}`,\n );\n this.missingPhases = missingPhases;\n this.registeredPhases = registeredPhases;\n }\n}\n"],"mappings":"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","names":["logger","logger","spawn","logger","SIGKILL_GRACE_MS","IDLE_CHECK_INTERVAL_MS","spawn","spawn","spawn"]}