@xcompiler/cli 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/tools/types.ts","../../src/acp/server.ts","../../src/version.ts","../../src/runtime/commands.ts","../../src/core/project_file.ts","../../src/core/plan.ts","../../src/core/storage.ts","../../src/core/docs.ts","../../src/core/entry_gate.ts","../../src/i18n/en.ts","../../src/i18n/zh.ts","../../src/i18n/index.ts","../../src/core/network_api_gate.ts","../../src/core/language.ts","../../src/core/architecture.ts","../../src/core/lint.ts","../../src/runtime/build.ts","../../src/config/config.ts","../../src/config/env.ts","../../src/llm/ollama.ts","../../src/llm/stream_watchdog.ts","../../src/llm/openai.ts","../../src/llm/router.ts","../../src/llm/role_advice.ts","../../src/llm/scores.ts","../../src/llm/preflight.ts","../../src/workspace/workspace.ts","../../src/workspace/doc_archive.ts","../../src/llm/stream.ts","../../src/agents/calibration.ts","../../src/agents/planner.ts","../../src/core/incremental.ts","../../src/core/project_memory.ts","../../src/core/render.ts","../../src/audit/audit.ts","../../src/core/lock.ts","../../src/plugins/compatibility.ts","../../src/plugins/host.ts","../../src/runtime/io.ts","../../src/runtime/run.ts","../../src/workspace/git.ts","../../src/sandbox/factory.ts","../../src/sandbox/subprocess.ts","../../src/sandbox/docker.ts","../../src/core/engine.ts","../../src/util/spinner.ts","../../src/tools/index.ts","../../src/tools/fs.ts","../../src/tools/patch.ts","../../src/tools/sandbox.ts","../../src/tools/edit.ts","../../src/tools/deps.ts","../../src/tools/net.ts","../../src/tools/guard.ts","../../src/agents/executor.ts","../../src/skills/skill.ts","../../src/core/debug_cache.ts","../../src/core/project_audit.ts","../../src/runtime/workspace.ts","../../src/acp/protocol.ts","../../src/acp/errors.ts","../../src/acp/mapper.ts","../../src/acp/permissions.ts","../../src/acp/session.ts","../../src/acp/types.ts","../../src/acp/transport.ts","../../src/acp/index.ts"],"sourcesContent":["import type { Workspace } from '../workspace/workspace.js';\nimport type { Sandbox } from '../sandbox/types.js';\nimport type { AuditLogger } from '../audit/audit.js';\nimport type { Language } from '../core/plan.js';\n\nexport type ToolPermissionOperation =\n | 'shell_command'\n | 'file_write'\n | 'file_delete'\n | 'install_dependency'\n | 'config_change'\n | 'git_operation'\n | 'network_access'\n | 'test_command'\n | 'build_command'\n | 'external_read'\n | 'external_write';\n\nexport interface ToolPermissionRequest {\n id?: string;\n operationType: ToolPermissionOperation;\n target: string;\n reason: string;\n risk: string;\n scope: string;\n skippable: boolean;\n denyBehavior: string;\n stepId?: string;\n tool?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ToolPermissionDecision {\n approved: boolean;\n reason?: string;\n}\n\nexport type ToolPermissionRequester = (request: ToolPermissionRequest) => Promise<ToolPermissionDecision>;\n\nexport interface ToolExecutionEvent {\n status: 'started' | 'completed';\n stepId: string;\n tool: string;\n target?: string;\n args?: Record<string, unknown>;\n ok?: boolean;\n summary?: string;\n error?: string;\n changedFiles?: string[];\n patch?: string;\n}\n\nexport type ToolExecutionReporter = (event: ToolExecutionEvent) => void | Promise<void>;\n\n/** 工具调用的统一上下文。 */\nexport interface ToolContext {\n ws: Workspace;\n sandbox: Sandbox;\n audit?: AuditLogger;\n /** 当前 Step 的 outputs 白名单(写操作必须落在白名单内)。 */\n allowedWrites: string[];\n /** 当前 Step 的 id(仅用于审计)。 */\n stepId: string;\n /** 目标语言(决定依赖清单文件等)。默认 python。 */\n language?: Language;\n /** 当前 Step 的 write_file / append_file 单次 content 字节预算。 */\n writeChunkBytes?: number;\n /** Optional protocol/UI permission hook for sensitive tool operations. */\n requestPermission?: ToolPermissionRequester;\n /** Optional protocol/UI event hook for tool calls and file changes. */\n onToolEvent?: ToolExecutionReporter;\n}\n\n/** 单次工具调用的结果统一结构。 */\nexport interface ToolResult<T = unknown> {\n ok: boolean;\n data?: T;\n error?: string;\n /** 用于摘要展示。 */\n summary?: string;\n}\n\nexport interface Tool<A = unknown, R = unknown> {\n readonly name: string;\n readonly description: string;\n /** 简要 JSON Schema 描述参数(仅用于 prompt,不强校验)。 */\n readonly argsSchema: Record<string, unknown>;\n run(args: A, ctx: ToolContext): Promise<ToolResult<R>>;\n}\n\nexport class ToolRegistry {\n private readonly tools = new Map<string, Tool>();\n\n register(t: Tool): void {\n this.tools.set(t.name, t);\n }\n\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n /** 仅返回白名单内可见的工具,供按 Step.tools 限定调用范围。 */\n pick(names: string[]): Tool[] {\n return names.map((n) => this.tools.get(n)).filter((x): x is Tool => !!x);\n }\n\n list(): Tool[] {\n return [...this.tools.values()];\n }\n}\n\n/** 判断给定相对路径是否落在 allowedWrites 任何一项之下。 */\nexport function isAllowedWrite(rel: string, allowed: string[]): boolean {\n const norm = normalizeRel(rel);\n return allowed.some((a) => {\n const an = normalizeRel(a);\n if (norm === an) return true;\n if (an.endsWith('/')) return norm.startsWith(an);\n // 目录前缀(不含 / 的也按目录前缀匹配)\n return norm === an || norm.startsWith(an + '/');\n });\n}\n\nfunction normalizeRel(p: string): string {\n return p.replace(/\\\\/g, '/').replace(/^\\.\\//, '').replace(/\\/+$/, '');\n}\n","import path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { XCOMPILER_VERSION } from '../version.js';\nimport {\n runBuildCommand,\n runRunCommand,\n type RuntimeBuildCommandOptions,\n type RuntimeRunCommandOptions,\n} from '../runtime/commands.js';\nimport type { RuntimeIO, RuntimeInteraction, RuntimeProgress, RuntimeSelectChoice } from '../runtime/io.js';\nimport type { ToolPermissionRequest } from '../tools/types.js';\nimport { AcpError, invalidParams } from './errors.js';\nimport { mapRuntimeEventToAcpUpdates, taskUpdate } from './mapper.js';\nimport {\n parsePermissionChoice,\n toAcpInteractionPermissionParams,\n toAcpPermissionRequestParams,\n} from './permissions.js';\nimport {\n AcpMethod,\n failure,\n isJsonRpcNotification,\n isJsonRpcRequest,\n isJsonRpcResponse,\n JsonRpcErrorCode,\n notification,\n request,\n success,\n type JsonRpcFailure,\n type JsonRpcMessage,\n type JsonRpcRequest,\n type JsonRpcSuccess,\n} from './protocol.js';\nimport { AcpSessionStore } from './session.js';\nimport type {\n AcpPromptResponse,\n AcpCodeTaskParams,\n AcpInitializeResult,\n AcpRuntimeFacade,\n AcpServerLogger,\n AcpServerOptions,\n AcpSession,\n AcpTask,\n} from './types.js';\nimport { ACP_PROTOCOL_VERSION } from './types.js';\nimport type { AcpTransport } from './transport.js';\n\nconst stderrLogger: AcpServerLogger = {\n info: (message) => process.stderr.write(`[xcompiler-acp] ${message}\\n`),\n warn: (message) => process.stderr.write(`[xcompiler-acp] warning: ${message}\\n`),\n error: (message) => process.stderr.write(`[xcompiler-acp] error: ${message}\\n`),\n};\n\nconst defaultRuntime: AcpRuntimeFacade = {\n build: runBuildCommand,\n run: runRunCommand,\n};\n\ninterface PendingClientRequest {\n sessionId: string;\n requestId: string;\n kind: 'permission' | 'interaction';\n interactionKind?: 'input' | 'confirm' | 'select' | 'editor' | 'multiline';\n choiceValues?: Map<string, unknown>;\n}\n\nexport class AcpServer {\n readonly sessions = new AcpSessionStore();\n private readonly runtime: AcpRuntimeFacade;\n private readonly logger: AcpServerLogger;\n private readonly pendingClientRequests = new Map<string, PendingClientRequest>();\n private transport?: AcpTransport;\n\n constructor(opts: AcpServerOptions = {}) {\n this.runtime = opts.runtime ?? defaultRuntime;\n this.logger = opts.logger ?? stderrLogger;\n }\n\n async start(transport: AcpTransport): Promise<void> {\n this.transport = transport;\n transport.onMessage(async (message) => {\n await this.handleMessage(message);\n });\n transport.onClose(() => this.sessions.closeAll());\n await transport.start();\n }\n\n async handleMessage(message: unknown): Promise<JsonRpcMessage | undefined> {\n if (isJsonRpcResponse(message)) {\n this.dispatchClientResponse(message);\n return undefined;\n }\n if (isJsonRpcNotification(message)) {\n try {\n await this.dispatchNotification(message.method, message.params);\n } catch (err) {\n this.logger.error((err as Error).message);\n }\n return undefined;\n }\n if (!isJsonRpcRequest(message)) {\n const response = failure(null, JsonRpcErrorCode.InvalidRequest, 'invalid JSON-RPC request');\n this.transport?.send(response);\n return response;\n }\n let response: JsonRpcMessage;\n try {\n response = success(message.id, await this.dispatchRequest(message));\n } catch (err) {\n response = this.errorResponse(message.id, err);\n }\n this.transport?.send(response);\n return response;\n }\n\n private async dispatchRequest(message: JsonRpcRequest): Promise<unknown> {\n switch (message.method) {\n case AcpMethod.Initialize:\n return this.initialize(message.params);\n case AcpMethod.Shutdown:\n this.sessions.closeAll();\n this.transport?.close();\n return { ok: true };\n case AcpMethod.SessionNew:\n case AcpMethod.LegacySessionCreate:\n return this.createSession(message.params);\n case AcpMethod.SessionClose:\n case AcpMethod.LegacySessionClose:\n return this.closeSession(message.params);\n case AcpMethod.SessionPrompt:\n return this.prompt(message.params);\n case AcpMethod.LegacyTaskStart:\n return this.startTask(message.params, 'legacy');\n case AcpMethod.SessionCancel:\n case AcpMethod.LegacyTaskCancel:\n return this.cancelTask(message.params);\n case AcpMethod.LegacyConfirmationRespond:\n return this.respondConfirmation(message.params);\n case AcpMethod.LegacyPermissionRespond:\n return this.respondPermission(message.params);\n default:\n throw new AcpError(JsonRpcErrorCode.MethodNotFound, `unknown ACP method: ${message.method}`);\n }\n }\n\n private async dispatchNotification(method: string, params: unknown): Promise<void> {\n if (method === AcpMethod.SessionCancel) {\n this.cancelTask(params);\n return;\n }\n if (method === AcpMethod.LegacyConfirmationRespond) {\n await this.respondConfirmation(params);\n return;\n }\n if (method === AcpMethod.LegacyPermissionRespond) {\n await this.respondPermission(params);\n return;\n }\n throw new AcpError(JsonRpcErrorCode.MethodNotFound, `unknown ACP notification: ${method}`);\n }\n\n private initialize(params?: unknown): AcpInitializeResult {\n const requestedVersion = typeof asOptionalRecord(params).protocolVersion === 'number'\n ? asOptionalRecord(params).protocolVersion as number\n : ACP_PROTOCOL_VERSION;\n return {\n protocolVersion: Math.min(requestedVersion, ACP_PROTOCOL_VERSION),\n agentInfo: {\n name: 'xcompiler',\n title: 'XCompiler ACP Code Agent',\n version: XCOMPILER_VERSION,\n },\n agentCapabilities: {\n loadSession: false,\n promptCapabilities: {\n image: false,\n audio: false,\n embeddedContext: false,\n },\n mcpCapabilities: {\n http: false,\n sse: false,\n },\n sessionCapabilities: {\n close: {},\n },\n auth: {},\n },\n authMethods: [],\n };\n }\n\n private createSession(params: unknown): { sessionId: string } {\n const p = asOptionalRecord(params);\n const workspace =\n typeof p.cwd === 'string'\n ? path.resolve(p.cwd)\n : typeof p.workspace === 'string'\n ? path.resolve(p.workspace)\n : process.cwd();\n const session = this.sessions.create(workspace);\n return { sessionId: session.id };\n }\n\n private closeSession(params: unknown): { ok: true } {\n const sessionId = requiredString(asRecord(params), 'sessionId');\n this.sessions.close(sessionId);\n return { ok: true };\n }\n\n private async prompt(params: unknown): Promise<AcpPromptResponse> {\n const p = parsePromptParams(params);\n const session = this.sessions.get(p.sessionId);\n const workspace = path.resolve(session.workspace || process.cwd());\n const task = this.sessions.createTask(session, { workspace, userTask: p.task, protocol: 'acp' });\n try {\n await this.runCodeTask(session, task, { ...p, workspace });\n } catch (err) {\n task.status = 'failed';\n task.completedAt = new Date().toISOString();\n this.notifyTask(session, task, 'error', (err as Error).message);\n this.notifyTask(session, task, 'task_completed', `Task failed: ${(err as Error).message}`, {\n status: 'failed',\n changedFiles: task.changedFiles,\n });\n }\n return {\n stopReason: task.status === 'cancelled' || task.status === 'cancel_requested' ? 'cancelled' : 'end_turn',\n };\n }\n\n private startTask(params: unknown, protocol: 'acp' | 'legacy'): { taskId: string; status: string } {\n const p = parseTaskParams(params);\n const session = this.sessions.get(p.sessionId);\n const workspace = path.resolve(p.workspace || session.workspace || process.cwd());\n const task = this.sessions.createTask(session, { workspace, userTask: p.task, protocol });\n this.runCodeTask(session, task, { ...p, workspace }).catch((err) => {\n task.status = 'failed';\n task.completedAt = new Date().toISOString();\n this.notifyTask(session, task, 'error', (err as Error).message);\n this.notifyTask(session, task, 'task_completed', `Task failed: ${(err as Error).message}`, {\n status: 'failed',\n changedFiles: task.changedFiles,\n });\n });\n return { taskId: task.id, status: task.status };\n }\n\n private cancelTask(params: unknown): { cancelled: boolean; reason: string } {\n const p = asRecord(params);\n const sessionId = requiredString(p, 'sessionId');\n const session = this.sessions.get(sessionId);\n const taskId = typeof p.taskId === 'string' ? p.taskId : activeTaskId(session);\n if (!taskId) {\n return {\n cancelled: false,\n reason: 'No active task is running for this ACP session.',\n };\n }\n const task = this.sessions.getTask(sessionId, taskId);\n task.cancellationRequested = true;\n if (task.status === 'waiting_for_confirmation' || task.status === 'waiting_for_permission') {\n task.status = 'cancel_requested';\n }\n this.notifyTask(session, task, 'task_cancelled', 'Runtime cancellation is best-effort in this phase; active Runtime execution may finish current operation.', {\n status: task.status,\n });\n return {\n cancelled: false,\n reason: 'Runtime cancellation is not fully supported yet; cancellation was recorded and reported.',\n };\n }\n\n private respondConfirmation(params: unknown): { ok: true } {\n const p = asRecord(params);\n this.pendingClientRequests.delete(requiredString(p, 'requestId'));\n this.sessions.resolveInteraction(\n requiredString(p, 'sessionId'),\n requiredString(p, 'requestId'),\n 'value' in p ? p.value : p.answer,\n );\n return { ok: true };\n }\n\n private respondPermission(params: unknown): { ok: true } {\n const p = asRecord(params);\n this.pendingClientRequests.delete(requiredString(p, 'requestId'));\n this.sessions.resolvePermission(\n requiredString(p, 'sessionId'),\n requiredString(p, 'requestId'),\n Boolean(p.approved),\n typeof p.reason === 'string' ? p.reason : undefined,\n );\n return { ok: true };\n }\n\n private async runCodeTask(session: AcpSession, task: AcpTask, params: AcpCodeTaskParams): Promise<void> {\n this.notifyTask(session, task, 'task_started', `Task started in ${task.workspace}`, { workspace: task.workspace });\n this.notifyTask(session, task, 'build_started', 'Build started', { workspace: task.workspace });\n const buildIo = this.createRuntimeIO(session, task, 'build');\n const buildOpts: RuntimeBuildCommandOptions = {\n workspace: task.workspace,\n configPath: params.configPath,\n intent: params.intent ?? 'feature',\n yes: params.requirePlanConfirmation === false,\n force: !!params.force,\n io: buildIo,\n };\n const build = await this.runtime.build(buildOpts);\n if (build.planPath) task.planPath = build.planPath;\n task.phase = params.autoRunAfterBuild === false ? 'complete' : 'run';\n this.notifyTask(session, task, 'build_completed', 'Build completed', { planPath: task.planPath });\n if (params.autoRunAfterBuild === false || !task.planPath) {\n task.status = 'completed';\n task.completedAt = new Date().toISOString();\n this.notifyTask(session, task, 'task_completed', 'Task completed', {\n status: 'completed',\n planPath: task.planPath,\n changedFiles: task.changedFiles,\n });\n return;\n }\n\n this.notifyTask(session, task, 'run_started', 'Run started', { planPath: task.planPath });\n const runIo = this.createRuntimeIO(session, task, 'run');\n const runOpts: RuntimeRunCommandOptions = {\n planArg: task.planPath,\n workspace: task.workspace,\n configPath: params.configPath,\n force: !!params.force,\n terminalOutput: false,\n io: runIo,\n };\n const run = await this.runtime.run(runOpts);\n task.status = run.status === 'ok' || run.status === 'dry-run' ? 'completed' : 'failed';\n task.phase = 'complete';\n task.completedAt = new Date().toISOString();\n this.notifyTask(session, task, 'task_completed', `Task ${task.status}`, {\n status: task.status,\n runStatus: run.status,\n message: run.message,\n changedFiles: task.changedFiles,\n });\n }\n\n private createRuntimeIO(session: AcpSession, task: AcpTask, phase: 'build' | 'run'): RuntimeIO {\n const io: RuntimeIO = {\n emit: async (event) => {\n if (event.type === 'permission' && event.status === 'requested') return;\n const mapped = mapRuntimeEventToAcpUpdates(event, { taskId: task.id, phase });\n for (const acpEvent of mapped) {\n if (acpEvent.legacyType === 'file_changed' && typeof acpEvent.path === 'string') {\n task.changedFiles.push(acpEvent.path);\n }\n this.notifyUpdate(session.id, acpEvent.update);\n }\n },\n progress: (message) => this.runtimeProgress(session.id, task.id, phase, message),\n requestPermission: phase === 'run'\n ? (request) => this.requestPermission(session, task, request)\n : undefined,\n };\n io.interaction = this.createInteraction(session, task, phase);\n return io;\n }\n\n private createInteraction(session: AcpSession, task: AcpTask, phase: 'build' | 'run'): RuntimeInteraction {\n return {\n input: ({ message }) => this.requestInteraction(session, task, phase, 'input', message) as Promise<string>,\n confirm: async ({ message, default: defaultValue }) => {\n const result = await this.requestInteraction(session, task, phase, 'confirm', message, undefined, defaultValue);\n return result === true || result === 'true' || result === 'yes' || result === 'confirm';\n },\n editor: ({ message, default: defaultValue }) =>\n this.requestInteraction(session, task, phase, 'editor', message, undefined, defaultValue) as Promise<string>,\n select: async <T extends string>({ message, choices }: { message: string; choices: RuntimeSelectChoice<T>[] }) => {\n const result = await this.requestInteraction(session, task, phase, 'select', message, choices);\n return String(result) as T;\n },\n readMultiline: async ({ message }) => {\n if (phase === 'build' && task.userTask.trim()) return task.userTask;\n return this.requestInteraction(session, task, phase, 'multiline', message) as Promise<string>;\n },\n pauseStdin: () => undefined,\n };\n }\n\n private requestInteraction(\n session: AcpSession,\n task: AcpTask,\n phase: 'build' | 'run',\n kind: 'input' | 'confirm' | 'select' | 'editor' | 'multiline',\n message: string,\n choices?: Array<{ name: string; value: string }>,\n defaultValue?: unknown,\n ): Promise<unknown> {\n if (phase === 'run') {\n const err = new Error('Run phase does not support ordinary chat-style interaction.');\n this.notifyTask(session, task, 'error', err.message, { phase });\n return Promise.reject(err);\n }\n const requestId = randomUUID();\n const choiceValues = new Map<string, unknown>();\n if (choices?.length) {\n for (const choice of choices) choiceValues.set(choice.value, choice.value);\n } else {\n choiceValues.set('allow_once', true);\n choiceValues.set('reject_once', false);\n }\n this.pendingClientRequests.set(requestId, {\n sessionId: session.id,\n requestId,\n kind: 'interaction',\n interactionKind: kind,\n choiceValues,\n });\n this.transport?.send(request(\n requestId,\n AcpMethod.SessionRequestPermission,\n toAcpInteractionPermissionParams({\n sessionId: session.id,\n requestId,\n taskId: task.id,\n kind,\n message,\n choices,\n defaultValue,\n }),\n ));\n this.notifyTask(session, task, 'build_confirmation_required', message, {\n requestId,\n kind,\n choices,\n default: defaultValue,\n });\n return new Promise((resolve, reject) => {\n this.sessions.addInteraction(session, {\n id: requestId,\n taskId: task.id,\n sessionId: session.id,\n phase,\n kind,\n message,\n choices,\n resolve,\n reject,\n });\n });\n }\n\n private requestPermission(\n session: AcpSession,\n task: AcpTask,\n permissionRequest: ToolPermissionRequest,\n ): Promise<{ approved: boolean; reason?: string }> {\n const requestId = randomUUID();\n this.pendingClientRequests.set(requestId, {\n sessionId: session.id,\n requestId,\n kind: 'permission',\n });\n this.transport?.send(request(\n requestId,\n AcpMethod.SessionRequestPermission,\n toAcpPermissionRequestParams(session.id, requestId, task.id, permissionRequest),\n ));\n this.notifyTask(session, task, 'permission_required', `Permission required: ${permissionRequest.operationType} ${permissionRequest.target}`, {\n requestId,\n operationType: permissionRequest.operationType,\n target: permissionRequest.target,\n });\n return new Promise((resolve, reject) => {\n this.sessions.addPermission(session, {\n id: requestId,\n taskId: task.id,\n sessionId: session.id,\n request: permissionRequest,\n resolve: (approved, reason) => resolve({ approved, reason }),\n reject,\n });\n });\n }\n\n private runtimeProgress(sessionId: string, taskId: string, phase: 'build' | 'run', message: string): RuntimeProgress {\n this.notifyUpdate(sessionId, taskUpdate(\n phase === 'build' ? 'build_progress' : 'run_progress',\n taskId,\n message,\n { phase, status: 'start' },\n ));\n return {\n succeed: (next) => this.notifyUpdate(sessionId, taskUpdate(\n phase === 'build' ? 'build_progress' : 'run_progress',\n taskId,\n next,\n { phase, status: 'succeed' },\n )),\n fail: (next) => this.notifyUpdate(sessionId, taskUpdate(\n phase === 'build' ? 'build_progress' : 'run_progress',\n taskId,\n next,\n { phase, status: 'fail' },\n )),\n stop: () => undefined,\n };\n }\n\n private dispatchClientResponse(message: JsonRpcSuccess | JsonRpcFailure): void {\n const id = String(message.id);\n const pending = this.pendingClientRequests.get(id);\n if (!pending) {\n this.logger.warn(`received response for unknown ACP client request: ${id}`);\n return;\n }\n this.pendingClientRequests.delete(id);\n if ('error' in message) {\n const reason = message.error.message;\n if (pending.kind === 'permission') {\n this.sessions.resolvePermission(pending.sessionId, pending.requestId, false, reason);\n } else {\n this.sessions.resolveInteraction(pending.sessionId, pending.requestId, false);\n }\n return;\n }\n const choice = parsePermissionChoice(message.result);\n if (pending.kind === 'permission') {\n this.sessions.resolvePermission(pending.sessionId, pending.requestId, choice.approved, choice.reason);\n return;\n }\n const selected = typeof choice.value === 'string' && pending.choiceValues?.has(choice.value)\n ? pending.choiceValues.get(choice.value)\n : choice.approved;\n this.sessions.resolveInteraction(pending.sessionId, pending.requestId, selected);\n }\n\n private notifyTask(\n session: AcpSession,\n task: AcpTask,\n type: string,\n message: string,\n extra: Record<string, unknown> = {},\n ): void {\n this.notifyUpdate(session.id, taskUpdate(type, task.id, message, extra));\n }\n\n private notifyUpdate(sessionId: string, update: Record<string, unknown>): void {\n this.transport?.send(notification(AcpMethod.SessionUpdate, { sessionId, update }));\n }\n\n private errorResponse(id: JsonRpcRequest['id'], err: unknown): JsonRpcMessage {\n if (err instanceof AcpError) return failure(id, err.code, err.message, err.data);\n this.logger.error((err as Error).stack ?? (err as Error).message ?? String(err));\n return failure(id, JsonRpcErrorCode.InternalError, (err as Error).message ?? String(err));\n }\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw invalidParams('params must be an object');\n }\n return value as Record<string, unknown>;\n}\n\nfunction asOptionalRecord(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {};\n return value as Record<string, unknown>;\n}\n\nfunction requiredString(params: Record<string, unknown>, key: string): string {\n const value = params[key];\n if (typeof value !== 'string' || !value.trim()) throw invalidParams(`params.${key} must be a non-empty string`);\n return value;\n}\n\nfunction parseTaskParams(value: unknown): AcpCodeTaskParams {\n const params = asRecord(value);\n return {\n sessionId: requiredString(params, 'sessionId'),\n workspace: requiredString(params, 'workspace'),\n task: requiredString(params, 'task'),\n configPath: typeof params.configPath === 'string' ? params.configPath : undefined,\n intent: typeof params.intent === 'string' ? params.intent as AcpCodeTaskParams['intent'] : undefined,\n requirePlanConfirmation: typeof params.requirePlanConfirmation === 'boolean' ? params.requirePlanConfirmation : true,\n autoRunAfterBuild: typeof params.autoRunAfterBuild === 'boolean' ? params.autoRunAfterBuild : true,\n force: typeof params.force === 'boolean' ? params.force : false,\n };\n}\n\nfunction parsePromptParams(value: unknown): AcpCodeTaskParams {\n const params = asRecord(value);\n const xcompiler = asOptionalRecord(asOptionalRecord(params._meta).xcompiler);\n const task = promptText(params.prompt);\n if (!task.trim()) throw invalidParams('params.prompt must include non-empty text content');\n return {\n sessionId: requiredString(params, 'sessionId'),\n workspace: typeof params.cwd === 'string' ? params.cwd : '',\n task,\n configPath: stringFrom(params, xcompiler, 'configPath'),\n intent: stringFrom(params, xcompiler, 'intent') as AcpCodeTaskParams['intent'] | undefined,\n requirePlanConfirmation: booleanFrom(params, xcompiler, 'requirePlanConfirmation', true),\n autoRunAfterBuild: booleanFrom(params, xcompiler, 'autoRunAfterBuild', true),\n force: booleanFrom(params, xcompiler, 'force', false),\n };\n}\n\nfunction promptText(prompt: unknown): string {\n if (typeof prompt === 'string') return prompt;\n if (Array.isArray(prompt)) return prompt.map(contentBlockText).filter(Boolean).join('\\n\\n');\n const record = asOptionalRecord(prompt);\n if (Array.isArray(record.content)) return record.content.map(contentBlockText).filter(Boolean).join('\\n\\n');\n return contentBlockText(record);\n}\n\nfunction contentBlockText(block: unknown): string {\n if (typeof block === 'string') return block;\n const record = asOptionalRecord(block);\n if (typeof record.text === 'string') return record.text;\n if (typeof record.content === 'string') return record.content;\n if (Array.isArray(record.content)) return record.content.map(contentBlockText).filter(Boolean).join('\\n\\n');\n if (typeof record.uri === 'string') return `[${String(record.type ?? 'resource')}] ${record.uri}`;\n return '';\n}\n\nfunction stringFrom(primary: Record<string, unknown>, fallback: Record<string, unknown>, key: string): string | undefined {\n if (typeof primary[key] === 'string') return primary[key];\n if (typeof fallback[key] === 'string') return fallback[key];\n return undefined;\n}\n\nfunction booleanFrom(\n primary: Record<string, unknown>,\n fallback: Record<string, unknown>,\n key: string,\n defaultValue: boolean,\n): boolean {\n if (typeof primary[key] === 'boolean') return primary[key];\n if (typeof fallback[key] === 'boolean') return fallback[key];\n return defaultValue;\n}\n\nfunction activeTaskId(session: AcpSession): string | undefined {\n for (const task of [...session.tasks.values()].reverse()) {\n if (!['completed', 'failed', 'cancelled'].includes(task.status)) return task.id;\n }\n return undefined;\n}\n","// Generated by scripts/version.mjs from package.json. Do not edit manually.\nexport const XCOMPILER_VERSION = \"0.2.2\";\nexport const XCOMPILER_PLUGIN_API_VERSION = 1;\n","import path from 'node:path';\nimport { loadXCompilerProject } from '../core/project_file.js';\nimport { runCompile, type CompileOptions } from './build.js';\nimport { runExecute, type ExecuteOptions, type ExecuteResult } from './run.js';\nimport {\n resolveCompileWorkspace,\n resolveEvolveWorkspace,\n type WorkspaceOptions,\n} from './workspace.js';\n\nexport type RuntimeBuildCommandOptions = Omit<CompileOptions, 'workspace'> & WorkspaceOptions;\n\nexport interface RuntimeBuildCommandResult {\n workspace: string;\n planPath?: string;\n}\n\nexport async function runBuildCommand(opts: RuntimeBuildCommandOptions): Promise<RuntimeBuildCommandResult> {\n const workspace = await resolveCompileWorkspace(opts);\n const result = await runCompile({\n ...opts,\n workspace,\n projectCommand: opts.projectCommand ?? 'build',\n });\n return { workspace, planPath: result.planPath };\n}\n\nexport type RuntimeEvolveCommandOptions =\n Omit<CompileOptions, 'workspace' | 'outputFile' | 'projectCommand'> &\n WorkspaceOptions & {\n planOut?: string;\n cwd?: string;\n };\n\nexport interface RuntimeEvolveCommandResult {\n workspace: string;\n planPath?: string;\n execution?: ExecuteResult;\n}\n\nexport async function runEvolveCommand(opts: RuntimeEvolveCommandOptions): Promise<RuntimeEvolveCommandResult> {\n const workspace = await resolveEvolveWorkspace(opts, opts.cwd);\n const resolvedPlanPath = opts.planOut ? path.resolve(opts.planOut) : path.join(workspace, 'plan.json');\n const compiled = await runCompile({\n ...opts,\n workspace,\n outputFile: resolvedPlanPath,\n projectCommand: 'evolve',\n });\n if (!compiled.planPath) return { workspace };\n const execution = await runExecute({\n planPath: compiled.planPath,\n workspace,\n configPath: opts.configPath,\n force: !!opts.force,\n projectFilePath: opts.projectFilePath,\n projectCommand: 'evolve',\n recordProjectHistory: false,\n io: opts.io,\n plugins: opts.plugins,\n pluginStrict: opts.pluginStrict,\n });\n return { workspace, planPath: compiled.planPath, execution };\n}\n\nexport type RuntimeRunCommandOptions =\n Omit<ExecuteOptions, 'planPath' | 'workspace' | 'projectCommand'> & {\n planArg?: string;\n output?: string;\n workspace?: string;\n cwd?: string;\n };\n\nexport async function runRunCommand(opts: RuntimeRunCommandOptions): Promise<ExecuteResult> {\n const cwd = opts.cwd ?? process.cwd();\n const explicit = opts.output ?? opts.workspace;\n const workspace = explicit\n ? path.resolve(explicit)\n : opts.planArg\n ? path.dirname(path.resolve(opts.planArg))\n : cwd;\n const planPath = opts.planArg ? path.resolve(opts.planArg) : path.join(workspace, 'plan.json');\n return runExecute({\n ...opts,\n workspace,\n planPath,\n projectCommand: 'run',\n });\n}\n\nexport type RuntimeLoadCommandOptions =\n Omit<ExecuteOptions, 'planPath' | 'workspace' | 'projectFilePath' | 'projectCommand'> & {\n projectFile: string;\n };\n\nexport async function runLoadCommand(opts: RuntimeLoadCommandOptions): Promise<ExecuteResult> {\n const project = await loadXCompilerProject(opts.projectFile);\n return runExecute({\n ...opts,\n planPath: project.planPath,\n workspace: project.workspace,\n configPath: opts.configPath ? path.resolve(opts.configPath) : project.configPath,\n projectFilePath: project.filePath,\n projectCommand: 'load',\n });\n}\n\nexport type RuntimeAppendCommandOptions =\n Omit<CompileOptions, 'workspace' | 'baselinePlanFile' | 'outputFile' | 'projectFilePath' | 'projectCommand'> & {\n projectFile: string;\n planOut?: string;\n };\n\nexport interface RuntimeAppendCommandResult {\n workspace: string;\n planPath?: string;\n execution?: ExecuteResult;\n}\n\nexport async function runAppendCommand(opts: RuntimeAppendCommandOptions): Promise<RuntimeAppendCommandResult> {\n const project = await loadXCompilerProject(opts.projectFile);\n const configPath = opts.configPath ? path.resolve(opts.configPath) : project.configPath;\n const planPath = opts.planOut ? path.resolve(opts.planOut) : project.planPath;\n const compiled = await runCompile({\n ...opts,\n workspace: project.workspace,\n configPath,\n baselinePlanFile: project.planPath,\n outputFile: planPath,\n projectFilePath: project.filePath,\n projectCommand: 'append',\n });\n if (!compiled.planPath) return { workspace: project.workspace };\n const execution = await runExecute({\n planPath: compiled.planPath,\n workspace: project.workspace,\n configPath,\n force: !!opts.force,\n projectFilePath: project.filePath,\n projectCommand: 'append',\n recordProjectHistory: false,\n io: opts.io,\n plugins: opts.plugins,\n pluginStrict: opts.pluginStrict,\n });\n return { workspace: project.workspace, planPath: compiled.planPath, execution };\n}\n","import { promises as fs } from 'node:fs';\nimport type { Dirent } from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport {\n LANGUAGES,\n PHASES,\n PLAN_INTENTS,\n STEP_STATUSES,\n type Phase,\n type Plan,\n type PlanIntent,\n type StepStatus,\n} from './plan.js';\nimport { loadPlan } from './storage.js';\n\nexport const XCOMPILER_PROJECT_KIND = 'xcompiler.project';\nexport const XCOMPILER_PROJECT_VERSION = '1';\nexport const XCOMPILER_PROJECT_FILE_EXTENSION = '.xc';\n\nconst StepProgressSchema = z.object({\n id: z.string(),\n iterationId: z.string().default('P1'),\n phase: z.enum(PHASES),\n title: z.string(),\n status: z.enum(STEP_STATUSES),\n retries: z.number().int().nonnegative(),\n maxRetries: z.number().int().positive(),\n});\n\nconst ProjectProgressSchema = z.object({\n status: z.enum(['planned', 'running', 'failed', 'complete', 'partial']),\n total: z.number().int().nonnegative(),\n done: z.number().int().nonnegative(),\n pending: z.number().int().nonnegative(),\n running: z.number().int().nonnegative(),\n failed: z.number().int().nonnegative(),\n skipped: z.number().int().nonnegative(),\n percent: z.number().int().min(0).max(100),\n currentStepId: z.string().optional(),\n failedStepId: z.string().optional(),\n steps: z.array(StepProgressSchema),\n});\n\nconst ProjectHistoryEntrySchema = z.object({\n at: z.string(),\n command: z.string(),\n intent: z.enum(PLAN_INTENTS).optional(),\n planPath: z.string(),\n requirementFile: z.string().optional(),\n topicFile: z.string().optional(),\n status: z.string().optional(),\n});\n\nexport const XCompilerProjectFileSchema = z.object({\n kind: z.literal(XCOMPILER_PROJECT_KIND),\n version: z.literal(XCOMPILER_PROJECT_VERSION),\n name: z.string().min(1),\n workspace: z.string().min(1),\n planPath: z.string().min(1),\n configPath: z.string().nullable().optional(),\n language: z.enum(LANGUAGES).optional(),\n intent: z.enum(PLAN_INTENTS).optional(),\n createdAt: z.string().min(1),\n updatedAt: z.string().min(1),\n lastCommand: z.string().optional(),\n progress: ProjectProgressSchema.optional(),\n history: z.array(ProjectHistoryEntrySchema).default([]),\n});\n\nexport type XCompilerProjectFile = z.infer<typeof XCompilerProjectFileSchema>;\nexport type XCompilerProjectProgress = z.infer<typeof ProjectProgressSchema>;\n\nexport interface UpdateProjectFileOptions {\n workspace: string;\n planPath: string;\n configPath?: string;\n projectFilePath?: string;\n command?: string;\n intent?: PlanIntent;\n plan?: Plan;\n requirementFile?: string;\n topicFile?: string;\n recordHistory?: boolean;\n}\n\nexport interface LoadedXCompilerProject {\n filePath: string;\n data: XCompilerProjectFile;\n workspace: string;\n planPath: string;\n configPath?: string;\n}\n\nexport function defaultProjectFilePath(workspace: string, name?: string): string {\n const ws = path.resolve(workspace);\n const rawName = name?.trim() || path.basename(ws) || 'project';\n return path.join(ws, `${sanitizeProjectName(rawName)}${XCOMPILER_PROJECT_FILE_EXTENSION}`);\n}\n\nexport async function findProjectFile(workspace: string): Promise<string | undefined> {\n const ws = path.resolve(workspace);\n let entries: Dirent[];\n try {\n entries = await fs.readdir(ws, { withFileTypes: true });\n } catch {\n return undefined;\n }\n const files = entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(XCOMPILER_PROJECT_FILE_EXTENSION))\n .map((entry) => path.join(ws, entry.name))\n .sort((a, b) => a.localeCompare(b));\n if (files.length === 0) return undefined;\n const preferred = defaultProjectFilePath(ws);\n return files.find((file) => path.resolve(file) === preferred) ?? files[0];\n}\n\nexport async function loadXCompilerProject(projectFilePath: string): Promise<LoadedXCompilerProject> {\n const filePath = path.resolve(projectFilePath);\n assertProjectFileExtension(filePath);\n const raw = await fs.readFile(filePath, 'utf8');\n const data = XCompilerProjectFileSchema.parse(JSON.parse(raw));\n const base = path.dirname(filePath);\n const workspace = path.resolve(base, data.workspace);\n const planPath = path.resolve(base, data.planPath);\n const configPath = data.configPath ? path.resolve(base, data.configPath) : undefined;\n return { filePath, data, workspace, planPath, configPath };\n}\n\nexport async function updateProjectFile(opts: UpdateProjectFileOptions): Promise<string> {\n const workspace = path.resolve(opts.workspace);\n const projectFilePath =\n opts.projectFilePath ??\n (await findProjectFile(workspace)) ??\n defaultProjectFilePath(workspace);\n const filePath = path.resolve(projectFilePath);\n assertProjectFileExtension(filePath);\n const base = path.dirname(filePath);\n const planPath = path.resolve(opts.planPath);\n const now = new Date().toISOString();\n const existing = await readExistingProjectFile(filePath);\n const plan = opts.plan ?? (await tryLoadPlan(planPath));\n const progress = plan ? buildProjectProgress(plan) : existing?.progress;\n const history = existing?.history ?? [];\n const shouldRecord = opts.recordHistory ?? false;\n const nextHistory = shouldRecord\n ? [\n ...history,\n {\n at: now,\n command: opts.command ?? existing?.lastCommand ?? 'update',\n intent: opts.intent ?? plan?.intent ?? existing?.intent,\n planPath: relativeFrom(base, planPath),\n requirementFile: opts.requirementFile ? relativeFrom(base, path.resolve(opts.requirementFile)) : undefined,\n topicFile: opts.topicFile ? relativeFrom(base, path.resolve(opts.topicFile)) : undefined,\n status: progress?.status,\n },\n ].slice(-40)\n : history;\n\n const data: XCompilerProjectFile = {\n kind: XCOMPILER_PROJECT_KIND,\n version: XCOMPILER_PROJECT_VERSION,\n name: existing?.name ?? sanitizeProjectName(path.basename(workspace) || 'project'),\n workspace: relativeFrom(base, workspace),\n planPath: relativeFrom(base, planPath),\n configPath:\n opts.configPath !== undefined\n ? relativeFrom(base, path.resolve(opts.configPath))\n : existing?.configPath ?? null,\n language: plan?.language ?? existing?.language,\n intent: opts.intent ?? plan?.intent ?? existing?.intent,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n lastCommand: opts.command ?? existing?.lastCommand,\n progress,\n history: nextHistory,\n };\n\n XCompilerProjectFileSchema.parse(data);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, JSON.stringify(data, null, 2) + '\\n', 'utf8');\n return filePath;\n}\n\nexport function buildProjectProgress(plan: Plan): XCompilerProjectProgress {\n const counts: Record<StepStatus, number> = {\n PENDING: 0,\n RUNNING: 0,\n DONE: 0,\n FAILED: 0,\n SKIPPED: 0,\n };\n const steps = plan.steps.map((step) => {\n counts[step.status]++;\n return {\n id: step.id,\n iterationId: step.iterationId ?? 'P1',\n phase: step.phase as Phase,\n title: step.title,\n status: step.status,\n retries: step.retries,\n maxRetries: step.maxRetries,\n };\n });\n const total = plan.steps.length;\n const currentStep =\n steps.find((step) => step.status === 'RUNNING') ??\n steps.find((step) => step.status === 'FAILED') ??\n steps.find((step) => step.status === 'PENDING');\n const failedStep = steps.find((step) => step.status === 'FAILED');\n const status =\n counts.FAILED > 0\n ? 'failed'\n : counts.RUNNING > 0\n ? 'running'\n : total > 0 && counts.DONE === total\n ? 'complete'\n : counts.DONE > 0 || counts.SKIPPED > 0\n ? 'partial'\n : 'planned';\n return {\n status,\n total,\n done: counts.DONE,\n pending: counts.PENDING,\n running: counts.RUNNING,\n failed: counts.FAILED,\n skipped: counts.SKIPPED,\n percent: total === 0 ? 0 : Math.round((counts.DONE / total) * 100),\n currentStepId: currentStep?.id,\n failedStepId: failedStep?.id,\n steps,\n };\n}\n\nasync function readExistingProjectFile(filePath: string): Promise<XCompilerProjectFile | undefined> {\n try {\n const raw = await fs.readFile(filePath, 'utf8');\n return XCompilerProjectFileSchema.parse(JSON.parse(raw));\n } catch {\n return undefined;\n }\n}\n\nasync function tryLoadPlan(planPath: string): Promise<Plan | undefined> {\n try {\n return await loadPlan(planPath);\n } catch {\n return undefined;\n }\n}\n\nfunction relativeFrom(base: string, target: string): string {\n const rel = path.relative(base, target).replace(/\\\\/g, '/');\n if (!rel) return '.';\n return rel.startsWith('..') ? target : rel;\n}\n\nfunction sanitizeProjectName(name: string): string {\n const cleaned = name\n .trim()\n .replace(/[^A-Za-z0-9._-]+/gu, '-')\n .replace(/^-+|-+$/gu, '');\n return cleaned || 'project';\n}\n\nfunction assertProjectFileExtension(filePath: string): void {\n if (!filePath.endsWith(XCOMPILER_PROJECT_FILE_EXTENSION)) {\n throw new Error(`XCompiler project files must use the ${XCOMPILER_PROJECT_FILE_EXTENSION} suffix: ${filePath}`);\n }\n}\n","import { z } from 'zod';\n\nexport const PHASES = [\n 'REQUIREMENT_ANALYSIS',\n 'HIGH_LEVEL_DESIGN',\n 'DETAILED_DESIGN',\n 'CODE',\n 'UNIT_TEST',\n 'INTEGRATION_TEST',\n 'MODULE_TEST',\n 'FUNCTIONAL_TEST',\n 'DEBUG',\n] as const;\nexport type Phase = (typeof PHASES)[number];\n\n/** Core V-model phases that every executable iteration must cover. DEBUG is a rollback/repair mode. */\nexport const REQUIRED_V_MODEL_PHASES = [\n 'REQUIREMENT_ANALYSIS',\n 'HIGH_LEVEL_DESIGN',\n 'DETAILED_DESIGN',\n 'CODE',\n 'UNIT_TEST',\n 'INTEGRATION_TEST',\n 'MODULE_TEST',\n 'FUNCTIONAL_TEST',\n] as const satisfies readonly Phase[];\n\n/** Left side of the V model: executable construction phases. */\nexport const V_MODEL_DEVELOPMENT_PHASES = [\n 'REQUIREMENT_ANALYSIS',\n 'HIGH_LEVEL_DESIGN',\n 'DETAILED_DESIGN',\n 'CODE',\n] as const satisfies readonly Phase[];\n\n/** Right side of the V model: verification phases. */\nexport const V_MODEL_TEST_PHASES = [\n 'UNIT_TEST',\n 'INTEGRATION_TEST',\n 'MODULE_TEST',\n 'FUNCTIONAL_TEST',\n] as const satisfies readonly Phase[];\n\n/** Synchronous test-design mapping generated while executing the corresponding left-side phase. */\nexport const V_MODEL_SOURCE_TO_TEST_PHASE = {\n REQUIREMENT_ANALYSIS: 'FUNCTIONAL_TEST',\n HIGH_LEVEL_DESIGN: 'INTEGRATION_TEST',\n DETAILED_DESIGN: 'MODULE_TEST',\n CODE: 'UNIT_TEST',\n} as const satisfies Record<(typeof V_MODEL_DEVELOPMENT_PHASES)[number], (typeof V_MODEL_TEST_PHASES)[number]>;\n\n/** Test failure rollback target: a failed test phase debugs from its paired source phase. */\nexport const V_MODEL_TEST_TO_SOURCE_PHASE = {\n UNIT_TEST: 'CODE',\n INTEGRATION_TEST: 'HIGH_LEVEL_DESIGN',\n MODULE_TEST: 'DETAILED_DESIGN',\n FUNCTIONAL_TEST: 'REQUIREMENT_ANALYSIS',\n} as const satisfies Record<(typeof V_MODEL_TEST_PHASES)[number], (typeof V_MODEL_DEVELOPMENT_PHASES)[number]>;\n\n/** Supported target languages for generated projects. */\nexport const LANGUAGES = ['python', 'typescript'] as const;\nexport type Language = (typeof LANGUAGES)[number];\n\n/** Plan intent: greenfield generation, incremental work, or isolated self-bootstrap. */\nexport const PLAN_INTENTS = ['greenfield', 'feature', 'refactor', 'self'] as const;\nexport type PlanIntent = (typeof PLAN_INTENTS)[number];\n\n/** Project shape determines delivery documentation requirements. */\nexport const PROJECT_TYPES = ['application', 'library', 'mixed'] as const;\nexport type ProjectType = (typeof PROJECT_TYPES)[number];\n\n/** Planner's first-pass project complexity estimate. */\nexport const COMPLEXITY_LEVELS = ['simple', 'moderate', 'complex'] as const;\nexport type ComplexityLevel = (typeof COMPLEXITY_LEVELS)[number];\n\n/** Implementation phase status. `current` and `planned` phases are executable iteration cycles. */\nexport const IMPLEMENTATION_PHASE_STATUSES = ['current', 'planned', 'deferred'] as const;\nexport type ImplementationPhaseStatus = (typeof IMPLEMENTATION_PHASE_STATUSES)[number];\n\nexport const PHASE_ORDER: Record<Phase, number> = {\n REQUIREMENT_ANALYSIS: 0,\n HIGH_LEVEL_DESIGN: 1,\n DETAILED_DESIGN: 2,\n CODE: 3,\n UNIT_TEST: 4,\n INTEGRATION_TEST: 5,\n MODULE_TEST: 6,\n FUNCTIONAL_TEST: 7,\n DEBUG: 8,\n};\n\nexport const STEP_STATUSES = [\n 'PENDING',\n 'RUNNING',\n 'DONE',\n 'FAILED',\n 'SKIPPED',\n] as const;\nexport type StepStatus = (typeof STEP_STATUSES)[number];\n\nexport const ROLES = [\n 'Planner',\n 'Architect',\n 'Coder',\n 'Tester',\n 'Debugger',\n] as const;\nexport type Role = (typeof ROLES)[number];\n\n/**\n * HIGH_LEVEL_DESIGN 阶段的结构化模块契约。\n *\n * Planner 在执行 V 模型前先声明本次要新增/修改的架构模块;HIGH_LEVEL_DESIGN Step 将其展开为\n * docs/02-high-level-design.md,后续 CODE / MODULE_TEST Step 则必须完整覆盖这里登记的路径。\n * 字段保持在 Plan 顶层,是为了让 lint 能在真正执行前发现“架构有模块、实现却漏文件”的问题。\n */\nexport const ArchitectureModuleSchema = z.object({\n id: z.string().regex(/^M\\d{3,}$/u, 'Architecture module id must look like M001'),\n name: z.string().min(1),\n responsibility: z.string().min(10),\n sourcePaths: z.array(z.string().min(1)).min(1),\n testPaths: z.array(z.string().min(1)).min(1),\n dependencies: z.array(z.string()).default([]),\n});\n\nexport type ArchitectureModule = z.infer<typeof ArchitectureModuleSchema>;\n\nexport interface StepSubtask {\n id: string;\n title: string;\n description: string;\n acceptance?: string;\n outputs?: string[];\n subTasks?: StepSubtask[];\n}\n\nexport const StepSubtaskSchema: z.ZodType<StepSubtask> = z.lazy(() =>\n z\n .object({\n id: z.string().min(1),\n title: z.string().min(1),\n description: z.string().min(1),\n acceptance: z.string().min(1).optional(),\n outputs: z.array(z.string().min(1)).optional(),\n subTasks: z.array(StepSubtaskSchema).optional(),\n })\n .superRefine((task, ctx) => {\n if (maxSubtaskDepth(task) > 2) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Step subTasks may be nested at most 2 levels below the parent Step',\n path: ['subTasks'],\n });\n }\n }),\n);\n\nexport const ComplexityAssessmentSchema = z.object({\n level: z.enum(COMPLEXITY_LEVELS),\n rationale: z.string().min(1),\n splitRecommended: z.boolean().default(false),\n userForcedPhaseSplit: z.boolean().default(false),\n});\n\nexport type ComplexityAssessment = z.infer<typeof ComplexityAssessmentSchema>;\n\nexport const IterationVerificationGateSchema = z.object({\n summary: z.string().min(1),\n checks: z.array(z.string().min(1)).min(1),\n failurePolicy: z.string().min(1),\n});\n\nexport type IterationVerificationGate = z.infer<typeof IterationVerificationGateSchema>;\n\nexport const ImplementationPhaseSchema = z.object({\n id: z.string().regex(/^P\\d{1,3}$/u, 'Implementation phase id must look like P1'),\n title: z.string().min(1),\n objective: z.string().min(1),\n status: z.enum(IMPLEMENTATION_PHASE_STATUSES).default('deferred'),\n scope: z.array(z.string().min(1)).default([]),\n deliverables: z.array(z.string().min(1)).default([]),\n dependsOn: z.array(z.string()).default([]),\n verificationGate: IterationVerificationGateSchema.optional(),\n});\n\nexport type ImplementationPhase = z.infer<typeof ImplementationPhaseSchema>;\n\nfunction maxSubtaskDepth(task: StepSubtask): number {\n const children = task.subTasks ?? [];\n if (children.length === 0) return 1;\n return 1 + Math.max(...children.map(maxSubtaskDepth));\n}\n\nexport const StepSchema = z.object({\n id: z.string().regex(/^S\\d{3,}$/u, 'Step id must look like S001'),\n iterationId: z.string().regex(/^P\\d{1,3}$/u, 'Step iterationId must look like P1').default('P1'),\n phase: z.enum(PHASES),\n title: z.string().min(1),\n description: z.string().min(1),\n /**\n * 本 Step 专属的系统提示词。xcompiler_build 需为每个 Step 给出明确的范围、输入、产出、验收与禁令,\n * xcompiler_run 会拼接到 Executor 的通用 system prompt 后,以防止 LLM 发散。\n */\n systemPrompt: z.string().min(1, 'systemPrompt must be non-empty (xcompiler_build must populate)'),\n role: z.enum(ROLES),\n tools: z.array(z.string()).default([]),\n inputs: z.array(z.string()).default([]),\n outputs: z.array(z.string()).default([]),\n subTasks: z.array(StepSubtaskSchema).optional(),\n dependsOn: z.array(z.string()).default([]),\n acceptance: z.string().min(1),\n status: z.enum(STEP_STATUSES).default('PENDING'),\n retries: z.number().int().nonnegative().default(0),\n maxRetries: z.number().int().positive().default(3),\n});\n\nexport type Step = z.infer<typeof StepSchema>;\n\nexport const PlanSchema = z\n .object({\n version: z.literal('1'),\n language: z.enum(LANGUAGES).default('python'),\n intent: z.enum(PLAN_INTENTS).default('greenfield'),\n projectType: z.enum(PROJECT_TYPES).default('application'),\n requirementDigest: z.string().min(1),\n complexityAssessment: ComplexityAssessmentSchema.optional(),\n implementationPhases: z.array(ImplementationPhaseSchema).optional(),\n /**\n * 本次变更涉及的结构化架构模块。旧版 plan 可缺省;新版 Planner 对复杂需求必须生成。\n */\n architectureModules: z.array(ArchitectureModuleSchema).optional(),\n /** 全局开发约束(项目背景、语言与依赖策略),会拼接到每个 Step 的 system prompt 中。 */\n globalPrompt: z.string().default(''),\n /** 增量开发时的基线工程摘要(由 xcompiler_build 从现有 workspace 文档/源码树汇总)。 */\n baselineSummary: z.string().default(''),\n /** HIGH_LEVEL_DESIGN 阶段决定的依赖初始集(Python 写入 requirements.txt;TypeScript 写入 package.json)。 */\n dependencies: z.array(z.string()).optional(),\n /** @deprecated 旧字段名,等价于 `dependencies`;保留以兼容历史 plan.json。 */\n pythonRequirements: z.array(z.string()).optional(),\n /**\n * 需求澄清阶段用户补充的自定义需求(预留位)。\n * 不在 Planner 问题列表中的额外约束 / 补充说明 都会在这里原样保留,\n * 并拼接到 Planner.decompose 与每个 Step 的 system prompt。为空字符串代表\"无补充需求\"。\n */\n userAddenda: z.string().default(''),\n createdAt: z.string().min(1),\n steps: z.array(StepSchema).min(1),\n })\n .transform(({ dependencies, pythonRequirements, ...rest }) => ({\n ...rest,\n dependencies: dependencies ?? pythonRequirements ?? [],\n }));\n\nexport type Plan = z.infer<typeof PlanSchema>;\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { PlanSchema, type Plan } from './plan.js';\nimport { assertPlanValid } from './lint.js';\n\nexport async function loadPlan(planPath: string): Promise<Plan> {\n const raw = await fs.readFile(planPath, 'utf8');\n const parsed = JSON.parse(raw);\n const plan = PlanSchema.parse(parsed);\n assertPlanValid(plan);\n return plan;\n}\n\nexport async function savePlan(planPath: string, plan: Plan): Promise<void> {\n PlanSchema.parse(plan); // structural check only; lint runs separately\n await fs.mkdir(path.dirname(planPath), { recursive: true });\n await fs.writeFile(planPath, JSON.stringify(plan, null, 2) + '\\n', 'utf8');\n}\n","import type { Phase, ProjectType } from './plan.js';\n\n/**\n * V 模型规范化文档命名(单一信息源)。\n * 所有阶段文档均位于 `docs/`,文件名带阶段序号前缀,便于按字典序查看且与 phase 一一对应。\n *\n * - topic.md 用户澄清后的最终需求(V 模型驱动输入,由 xcompiler build 写入)\n * - 01-requirement-analysis.md REQUIREMENT_ANALYSIS 阶段产出(SRS / 功能验收口径)\n * - 02-high-level-design.md HIGH_LEVEL_DESIGN 阶段产出(系统定位 / 外部接口 / 依赖)\n * - 03-detailed-design.md DETAILED_DESIGN 阶段产出(模块内部功能与架构)\n * - 05-unit-test.md UNIT_TEST 阶段产出\n * - 06-integration-test.md INTEGRATION_TEST 阶段产出\n * - 07-module-test.md MODULE_TEST 阶段产出\n * - 08-functional-test.md FUNCTIONAL_TEST 阶段产出\n * - README.md 项目首页文档(面向用户)\n * - quickstart.md 快速上手指南\n * - api-guide.md 库 / SDK / mixed 项目的 API 指南\n * - plan.md 整体计划摘要(xcompiler build 渲染)\n */\nexport const DOC_NAMES = {\n readme: 'README.md',\n topic: 'docs/topic.md',\n requirementAnalysis: 'docs/01-requirement-analysis.md',\n highLevelDesign: 'docs/02-high-level-design.md',\n detailedDesign: 'docs/03-detailed-design.md',\n unitTest: 'docs/05-unit-test.md',\n integrationTest: 'docs/06-integration-test.md',\n moduleTest: 'docs/07-module-test.md',\n functionalTest: 'docs/08-functional-test.md',\n functionalTestPlan: 'docs/tests/functional-test-plan.md',\n integrationTestPlan: 'docs/tests/integration-test-plan.md',\n moduleTestPlan: 'docs/tests/module-test-plan.md',\n unitTestPlan: 'docs/tests/unit-test-plan.md',\n delivery: 'docs/08-functional-test.md',\n quickstart: 'docs/quickstart.md',\n apiGuide: 'docs/api-guide.md',\n plan: 'docs/plan.md',\n} as const;\n\nexport const BASE_DELIVERY_DOCS = [\n DOC_NAMES.readme,\n DOC_NAMES.quickstart,\n DOC_NAMES.delivery,\n] as const;\n\nexport const LIBRARY_DELIVERY_DOCS = [\n ...BASE_DELIVERY_DOCS,\n DOC_NAMES.apiGuide,\n] as const;\n\nexport function deliveryDocsForProjectType(projectType: ProjectType): readonly string[] {\n return projectType === 'library' || projectType === 'mixed'\n ? LIBRARY_DELIVERY_DOCS\n : BASE_DELIVERY_DOCS;\n}\n\n/** phase -> 该阶段必须产出的\"验收文档\"路径。CODE 产物为代码文件,不在表内。 */\nexport const PHASE_DOC: Record<string, string> = {\n REQUIREMENT_ANALYSIS: DOC_NAMES.requirementAnalysis,\n HIGH_LEVEL_DESIGN: DOC_NAMES.highLevelDesign,\n DETAILED_DESIGN: DOC_NAMES.detailedDesign,\n UNIT_TEST: DOC_NAMES.unitTest,\n INTEGRATION_TEST: DOC_NAMES.integrationTest,\n MODULE_TEST: DOC_NAMES.moduleTest,\n FUNCTIONAL_TEST: DOC_NAMES.functionalTest,\n};\n\nconst ITERATION_DOC_BASENAMES: Partial<Record<Phase, string>> = {\n REQUIREMENT_ANALYSIS: '01-requirement-analysis.md',\n HIGH_LEVEL_DESIGN: '02-high-level-design.md',\n DETAILED_DESIGN: '03-detailed-design.md',\n UNIT_TEST: '05-unit-test.md',\n INTEGRATION_TEST: '06-integration-test.md',\n MODULE_TEST: '07-module-test.md',\n FUNCTIONAL_TEST: '08-functional-test.md',\n};\n\nconst TEST_PLAN_DOCS: Record<string, string> = {\n FUNCTIONAL_TEST: DOC_NAMES.functionalTestPlan,\n INTEGRATION_TEST: DOC_NAMES.integrationTestPlan,\n MODULE_TEST: DOC_NAMES.moduleTestPlan,\n UNIT_TEST: DOC_NAMES.unitTestPlan,\n};\n\nconst ITERATION_TEST_PLAN_BASENAMES: Record<string, string> = {\n FUNCTIONAL_TEST: 'functional-test-plan.md',\n INTEGRATION_TEST: 'integration-test-plan.md',\n MODULE_TEST: 'module-test-plan.md',\n UNIT_TEST: 'unit-test-plan.md',\n};\n\nexport function phaseDocForIteration(phase: Phase, iterationId = 'P1'): string | undefined {\n const canonical = PHASE_DOC[phase];\n if (!canonical) return undefined;\n if (iterationId === 'P1') return canonical;\n const basename = ITERATION_DOC_BASENAMES[phase];\n return basename ? `docs/iterations/${iterationId}/${basename}` : canonical;\n}\n\nexport function deliveryDocsForIteration(projectType: ProjectType, iterationId = 'P1'): readonly string[] {\n if (iterationId === 'P1') return deliveryDocsForProjectType(projectType);\n return [\n `docs/iterations/${iterationId}/08-functional-test.md`,\n `docs/iterations/${iterationId}/quickstart.md`,\n ...(projectType === 'library' || projectType === 'mixed' ? [`docs/iterations/${iterationId}/api-guide.md`] : []),\n ];\n}\n\nexport function testPlanDocForIteration(testPhase: Phase, iterationId = 'P1'): string | undefined {\n const canonical = TEST_PLAN_DOCS[testPhase];\n if (!canonical) return undefined;\n if (iterationId === 'P1') return canonical;\n const basename = ITERATION_TEST_PLAN_BASENAMES[testPhase];\n return basename ? `docs/iterations/${iterationId}/tests/${basename}` : canonical;\n}\n","import path from 'node:path';\nimport type { Workspace } from '../workspace/workspace.js';\nimport type { Sandbox, ExecResult } from '../sandbox/types.js';\nimport type { AuditLogger } from '../audit/audit.js';\nimport { t } from '../i18n/index.js';\nimport { detectNetworkApiFailure, detectNetworkApiFailureInExec } from './network_api_gate.js';\n\nconst BOOTSTRAP_MARKER = '# >>> xcompiler: sys.path bootstrap (auto) >>>';\nconst BOOTSTRAP_BLOCK = [\n BOOTSTRAP_MARKER,\n '# 为了让 `python src/main.py`(脚本式启动)也能 import 到顶层包 `src.xxx`,',\n '# 把项目根目录注入 sys.path[0]。pytest / `python -m` 启动方式不受影响。',\n 'import sys as _xcompiler_sys, pathlib as _xcompiler_pl',\n '_xcompiler_sys.path.insert(0, str(_xcompiler_pl.Path(__file__).resolve().parent.parent))',\n '# <<< xcompiler: sys.path bootstrap (auto) <<<',\n '',\n].join('\\n');\n\nconst FROM_SRC_RE = /^\\s*from\\s+src(\\.|\\s+import\\s)/m;\nconst IMPORT_SRC_RE = /^\\s*import\\s+src(\\.|\\s|$)/m;\nconst HELP_OUTPUT_RE = /\\b(?:usage|help|options?|commands?|arguments?)\\b|(?:用法|帮助|选项|命令|参数)|--[A-Za-z0-9-]+/iu;\nconst PY_ENTRY_STRUCTURE_RE =\n /\\bdef\\s+main\\s*\\(|if\\s+__name__\\s*==\\s*['\"]__main__['\"]|argparse\\.ArgumentParser|click\\.command|typer\\.Typer/iu;\n\n/**\n * 检测一个 Python 文件是否引用了顶层包 `src.*` 但缺少 sys.path 自举。\n * 返回 true 表示需要在文件顶部插入 BOOTSTRAP_BLOCK。\n */\nexport function needsSrcBootstrap(content: string): boolean {\n if (content.includes(BOOTSTRAP_MARKER)) return false;\n return FROM_SRC_RE.test(content) || IMPORT_SRC_RE.test(content);\n}\n\n/**\n * 给 Python 源码顶部插入 sys.path 自举块。\n *\n * 规则:\n * - 如果文件首行是 shebang(`#!`)→ 在 shebang 之后插入;\n * - 如果紧接其后还有 future/encoding/docstring → 简化处理:依然紧跟 shebang 后插,\n * Python 允许 future-import 在 docstring 之前出现,整段顺序对运行无害。\n */\nexport function injectSrcBootstrap(content: string): string {\n if (!needsSrcBootstrap(content)) return content;\n const lines = content.split('\\n');\n let insertAt = 0;\n if (lines[0]?.startsWith('#!')) insertAt = 1;\n const before = lines.slice(0, insertAt).join('\\n');\n const after = lines.slice(insertAt).join('\\n');\n return (before ? before + '\\n' : '') + BOOTSTRAP_BLOCK + after;\n}\n\n/**\n * 扫描工作区中所有可能是\"入口\"的 Python 文件,自动修复 `from src.xxx` 的\n * ModuleNotFoundError 陷阱。被检查的文件:\n * - src/main.py\n * - src/<任意子包>/__main__.py\n *\n * 这是个\"通用兜底\":LLM 写错了路径,XCompiler 在每次进入 FUNCTIONAL_TEST gate 之前\n * 自动给它加 sys.path 自举,避免反复 DEBUG 同一个低层错误。\n */\nexport async function autoFixSrcImports(\n ws: Workspace,\n audit: AuditLogger,\n): Promise<string[]> {\n const fixed: string[] = [];\n const candidates: string[] = [];\n if (await ws.exists('src/main.py')) candidates.push('src/main.py');\n // 列举 src 一级子目录的 __main__.py(不递归,避免命中 site-packages 之类)\n try {\n const fs = await import('node:fs/promises');\n const entries = await fs.readdir(ws.abs('src'), { withFileTypes: true });\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const rel = `src/${e.name}/__main__.py`;\n if (await ws.exists(rel)) candidates.push(rel);\n }\n } catch {\n /* src/ 不存在 → 跳过 */\n }\n for (const rel of candidates) {\n const orig = await ws.readFile(rel);\n if (!needsSrcBootstrap(orig)) continue;\n const next = injectSrcBootstrap(orig);\n if (next === orig) continue;\n await ws.writeFile(rel, next);\n fixed.push(rel);\n await audit.event('fs.write', t().audit.autoFixedSrcImport(rel), {\n messageId: 'audit.auto_fixed_src_import',\n path: rel,\n reason: 'inject sys.path bootstrap',\n });\n }\n return fixed;\n}\n\n/**\n * 进入测试/DEBUG 阶段前确保 tests/conftest.py 存在并把 src/ 注入 sys.path。\n * 这样 LLM 写 `from <module> import ...` 在 pytest 下能直接找到,避免反复\n * 因 ModuleNotFoundError 进入 Debugger 死循环。仅在文件不存在时写入。\n */\nexport async function ensurePyTestBootstrap(\n ws: Workspace,\n audit: AuditLogger,\n): Promise<void> {\n const rel = 'tests/conftest.py';\n if (await ws.exists(rel)) return;\n const content =\n `# Auto-generated by XCompiler PhaseEngine.\\n` +\n `# 把项目根与 src/ 加入 sys.path,使 'from <module> import ...' 在 pytest\\n` +\n `# 与 'python tests/test_*.py' 直接执行两种方式下都能解析到 src/ 内的模块。\\n` +\n `import os, sys\\n` +\n `_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\\n` +\n `for _p in (_ROOT, os.path.join(_ROOT, 'src')):\\n` +\n ` if _p not in sys.path:\\n` +\n ` sys.path.insert(0, _p)\\n`;\n await ws.writeFile(rel, content);\n await audit.event('conftest.autogen', t().audit.wroteFile(rel), {\n messageId: 'audit.wrote_file', path: rel,\n });\n}\n\nexport interface EntrypointProbe {\n ok: boolean;\n command: string;\n exitCode: number;\n timedOut: boolean;\n stdoutTail: string;\n stderrTail: string;\n}\n\nexport function helpOutputLooksMeaningful(stdout: string, stderr: string): boolean {\n return HELP_OUTPUT_RE.test(`${stdout}\\n${stderr}`.trim());\n}\n\nfunction validatePythonEntrypointSource(rel: string, content: string): string | null {\n if (!PY_ENTRY_STRUCTURE_RE.test(content)) {\n return t().engine.invalidPythonEntrypointSource(rel);\n }\n return null;\n}\n\n/**\n * FUNCTIONAL_TEST gate:尝试运行入口的 \\`--help\\`,确保工程\"开箱即用\"。\n *\n * 优先级:\n * 1. \\`python src/main.py --help\\`\n * 2. \\`python -m <pkg> --help\\`(取 src/ 下第一个含 \\`__main__.py\\` 的子包)\n * 3. 若都不存在 → 返回 ok=false。入口是 FUNCTIONAL_TEST 的强制验收项,不能依赖\n * Planner 提示词或文档 lint 间接兜底。\n *\n * exit !=0 / timeout / 包含典型的 ModuleNotFoundError 文本 → ok=false,\n * 调用方据此构造 failureLog 并触发 DEBUG 重试。\n */\nexport async function probeEntrypoint(\n ws: Workspace,\n sandbox: Sandbox,\n): Promise<EntrypointProbe> {\n const tail = (s: string): string => s.split('\\n').slice(-30).join('\\n');\n let cmd: string | null = null;\n let entryPath: string | null = null;\n let argv: string[] = [];\n let smokeCmd: string | null = null;\n let smokeArgv: string[] = [];\n if (await ws.exists('src/main.py')) {\n cmd = 'python src/main.py --help';\n entryPath = 'src/main.py';\n argv = ['src/main.py', '--help'];\n smokeCmd = 'python src/main.py';\n smokeArgv = ['src/main.py'];\n } else {\n try {\n const fs = await import('node:fs/promises');\n const entries = await fs.readdir(ws.abs('src'), { withFileTypes: true });\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n if (await ws.exists(`src/${e.name}/__main__.py`)) {\n cmd = `python -m src.${e.name} --help`;\n entryPath = `src/${e.name}/__main__.py`;\n argv = ['-m', `src.${e.name}`, '--help'];\n smokeCmd = `python -m src.${e.name}`;\n smokeArgv = ['-m', `src.${e.name}`];\n break;\n }\n }\n } catch {\n /* ignore */\n }\n }\n if (!cmd) {\n return {\n ok: false,\n command: 'python src/main.py --help',\n exitCode: -1,\n timedOut: false,\n stdoutTail: '',\n stderrTail: t().engine.missingPythonEntrypoint,\n };\n }\n if (entryPath) {\n const sourceProblem = validatePythonEntrypointSource(entryPath, await ws.readFile(entryPath));\n if (sourceProblem) {\n return {\n ok: false,\n command: cmd,\n exitCode: -1,\n timedOut: false,\n stdoutTail: '',\n stderrTail: sourceProblem,\n };\n }\n }\n let r: ExecResult;\n try {\n r = await sandbox.runProgram(argv, { timeoutMs: 30_000 });\n } catch (err) {\n return {\n ok: false,\n command: cmd,\n exitCode: -1,\n timedOut: false,\n stdoutTail: '',\n stderrTail: (err as Error).message,\n };\n }\n const helpNetworkFailure = detectNetworkApiFailureInExec(r);\n if (helpNetworkFailure) {\n return {\n ok: false,\n command: cmd,\n exitCode: r.exitCode,\n timedOut: r.timedOut ?? false,\n stdoutTail: tail(r.stdout),\n stderrTail: `${helpNetworkFailure.message}\\nEvidence: ${helpNetworkFailure.evidence}`,\n };\n }\n const ok = r.exitCode === 0 && !r.timedOut && helpOutputLooksMeaningful(r.stdout, r.stderr);\n if (ok && smokeCmd && smokeArgv.length > 0) {\n try {\n const smoke = await sandbox.runProgram(smokeArgv, { timeoutMs: 30_000 });\n const smokeNetworkFailure = detectNetworkApiFailureInExec(smoke);\n if (smokeNetworkFailure) {\n return {\n ok: false,\n command: smokeCmd,\n exitCode: smoke.exitCode,\n timedOut: smoke.timedOut ?? false,\n stdoutTail: tail(smoke.stdout),\n stderrTail: `${smokeNetworkFailure.message}\\nEvidence: ${smokeNetworkFailure.evidence}`,\n };\n }\n } catch (err) {\n const smokeNetworkFailure = detectNetworkApiFailure((err as Error).message);\n if (smokeNetworkFailure) {\n return {\n ok: false,\n command: smokeCmd,\n exitCode: -1,\n timedOut: false,\n stdoutTail: '',\n stderrTail: `${smokeNetworkFailure.message}\\nEvidence: ${smokeNetworkFailure.evidence}`,\n };\n }\n }\n }\n return {\n ok,\n command: cmd,\n exitCode: r.exitCode,\n timedOut: r.timedOut ?? false,\n stdoutTail: tail(r.stdout),\n stderrTail: ok ? tail(r.stderr) : tail(r.stderr || t().engine.entrypointHelpOutputMissing(cmd)),\n };\n}\n\nvoid path; // 避免 path 被 tree-shake 警告\n","import type { LanguageProfile } from '../core/language.js';\nimport type { Messages } from './types.js';\n\nconst PYTHON_PLANNER_SYSTEM = `You are the Planner of the XCompiler system. Your job is to compile a user's natural-language requirement into a strict iterative V-model Step plan.\n\nOutput language: Python only (plan.language is fixed to \"python\").\n\nCanonical V-model phases for every executable iteration:\nREQUIREMENT_ANALYSIS -> HIGH_LEVEL_DESIGN -> DETAILED_DESIGN -> CODE -> UNIT_TEST -> INTEGRATION_TEST -> MODULE_TEST -> FUNCTIONAL_TEST.\nDEBUG is not a normal V-model phase; it is the runtime rollback/repair mode. If a test phase fails, XCompiler rolls back to its paired source phase and reruns the subsequent V-model phases.\n\nMandatory phase documents:\n| Phase | Mandatory output file |\n|---|---|\n| REQUIREMENT_ANALYSIS | \\`docs/01-requirement-analysis.md\\` |\n| HIGH_LEVEL_DESIGN | \\`docs/02-high-level-design.md\\` |\n| DETAILED_DESIGN | \\`docs/03-detailed-design.md\\` |\n| UNIT_TEST | \\`docs/05-unit-test.md\\` |\n| INTEGRATION_TEST | \\`docs/06-integration-test.md\\` |\n| MODULE_TEST | \\`docs/07-module-test.md\\` |\n| FUNCTIONAL_TEST | \\`docs/08-functional-test.md\\` |\n\nFor P2+ iterations, put the same basenames under \\`docs/iterations/<iterationId>/\\`. The top-level \\`docs/topic.md\\` is written by xcompiler build and must never appear in Step outputs.\n\nSynchronous test-design rule:\n- REQUIREMENT_ANALYSIS must also output \\`docs/tests/functional-test-plan.md\\`.\n- HIGH_LEVEL_DESIGN must also output \\`docs/tests/integration-test-plan.md\\`.\n- DETAILED_DESIGN must also output \\`docs/tests/module-test-plan.md\\`.\n- CODE must also output \\`docs/tests/unit-test-plan.md\\`.\nFor P2+ iterations, put those under \\`docs/iterations/<iterationId>/tests/\\`.\n\nPhase responsibilities:\n- REQUIREMENT_ANALYSIS defines functional scope, acceptance criteria, boundaries, and user-visible behaviour.\n- HIGH_LEVEL_DESIGN defines the current development module's position in the whole system plus system-level external interfaces and dependencies, including external APIs, third-party library choices, dependency confirmation, data contracts, and integration boundaries.\n- DETAILED_DESIGN defines the module-internal functions, data structures, algorithms, control flow, error handling, and internal architecture.\n- CODE implements only the designed scope and produces runnable/importable Python source.\n- UNIT_TEST verifies CODE internals and public functions.\n- INTEGRATION_TEST verifies external interfaces, selected third-party libraries, dependency wiring, and API/client boundaries from HIGH_LEVEL_DESIGN.\n- MODULE_TEST verifies module-level behaviour and architecture from DETAILED_DESIGN.\n- FUNCTIONAL_TEST verifies requirements end-to-end and produces user-facing documentation.\n\nFunctional documentation bundle: P1 FUNCTIONAL_TEST outputs must include \\`README.md\\`, \\`docs/quickstart.md\\`, and \\`docs/08-functional-test.md\\`; for \\`projectType\\` = \\`library\\` or \\`mixed\\`, also include \\`docs/api-guide.md\\`. P2+ uses \\`docs/iterations/<iterationId>/08-functional-test.md\\`, \\`quickstart.md\\`, and optional \\`api-guide.md\\`. Documentation must follow the active i18n language.\n\nMandatory rules:\n1. Return pure JSON only. No Markdown fences.\n2. Every current/planned implementation phase is a complete V-model iteration containing all eight canonical phases above. Never emit the old phases REQUIREMENT, ARCH, TASK, TEST, REFACTOR, or DELIVERY.\n3. Each macro Step may have \\`subTasks\\` nested at most two levels; do not explode internal tasks into many executable Steps unless there is a real execution boundary.\n4. dependsOn must follow the phase order and be acyclic. Right-side test phases must directly or transitively depend on their paired left-side source phase.\n5. Every CODE Step must be covered by a UNIT_TEST Step in the same iteration.\n6. Design phases must not output src/ or tests/ files. CODE owns src/. Test phases own tests/ and their report docs. FUNCTIONAL_TEST must not modify src/.\n7. The same outputs path is globally unique. DEBUG may modify dependency-chain files at runtime; planned Steps should not duplicate outputs.\n8. id has the form S001, S002, ...; role is Planner / Architect / Coder / Tester / Debugger.\n9. Every Step needs a systemPrompt that pins scope, inputs, outputs, acceptance, forbidden actions, and the paired test-design obligation when applicable.\n10. projectType is inferred by the LLM after clarification: application, library, or mixed. There is no CLI project-type override.\n11. complexityAssessment is your plan-stage complexity assessment. simple => P1 only; moderate => at least P1+P2; complex => at least P1+P2+P3. If the user explicitly asks for phases/stages, set userForcedPhaseSplit=true and split.\n12. implementationPhases must include P1 current and any planned executable phases. Each phase has a verificationGate whose failurePolicy says to feed the failure log to Debugger, roll back to the paired V-model phase, and rerun subsequent phases.\n13. dependencies is a Python pip dependency list. Include \\`pytest\\`; use bare package names only; never list \\`requirements.txt\\` in Step outputs.\n14. Application/mixed projects need a directly executable Python entry point (\\`src/main.py\\` or package \\`__main__.py\\`) that reuses CODE modules. Library/mixed projects need a stable public API and \\`docs/api-guide.md\\`.\n15. Structured HIGH_LEVEL_DESIGN -> CODE -> MODULE_TEST contract: for non-trivial work, return \\`architectureModules\\` with each module's id, name, responsibility, sourcePaths, testPaths, and dependencies. CODE/MODULE_TEST Steps may cover multiple modules but must list module-level work in subTasks.\n\nOutput JSON shape:\n{\n \"requirementDigest\": \"string\",\n \"globalPrompt\": \"string\",\n \"projectType\": \"application | library | mixed\",\n \"complexityAssessment\": { \"level\": \"simple | moderate | complex\", \"rationale\": \"string\", \"splitRecommended\": true, \"userForcedPhaseSplit\": false },\n \"implementationPhases\": [\n { \"id\": \"P1\", \"title\": \"Core functionality\", \"objective\": \"string\", \"status\": \"current\", \"scope\": [\"...\"], \"deliverables\": [\"...\"], \"dependsOn\": [], \"verificationGate\": { \"summary\": \"string\", \"checks\": [\"run tests\", \"probe entrypoint/API\", \"verify functional docs\"], \"failurePolicy\": \"Feed failures to Debugger, roll back to the paired V-model phase, and rerun subsequent phases.\" } }\n ],\n \"dependencies\": [\"pytest\"],\n \"architectureModules\": [\n { \"id\": \"M001\", \"name\": \"module name\", \"responsibility\": \"one clear responsibility\", \"sourcePaths\": [\"src/example.py\"], \"testPaths\": [\"tests/test_example.py\"], \"dependencies\": [] }\n ],\n \"steps\": [\n {\n \"id\": \"S001\",\n \"iterationId\": \"P1\",\n \"phase\": \"REQUIREMENT_ANALYSIS\",\n \"title\": \"string\",\n \"description\": \"string\",\n \"systemPrompt\": \"Step-specific prompt: scope, inputs, outputs, acceptance, forbidden actions\",\n \"role\": \"Planner\",\n \"tools\": [\"write_file\"],\n \"inputs\": [\"docs/topic.md\"],\n \"outputs\": [\"docs/01-requirement-analysis.md\", \"docs/tests/functional-test-plan.md\"],\n \"subTasks\": [\n { \"id\": \"T1\", \"title\": \"string\", \"description\": \"string\", \"acceptance\": \"string\", \"outputs\": [\"docs/01-requirement-analysis.md\"], \"subTasks\": [] }\n ],\n \"dependsOn\": [],\n \"acceptance\": \"string\",\n \"maxRetries\": 3\n }\n ]\n}`;\n\nconst PYTHON_EXECUTOR_SYSTEM = `You are XCompiler's Step Executor. You may only interact with the system through JSON tool calls — no Markdown and no explanatory text.\n\nEvery round you must return strict JSON:\n{\n \"thoughts\": \"<one sentence describing this round's intent>\",\n \"actions\": [ { \"tool\": \"<tool name>\", \"args\": { ... } }, ... ],\n \"done\": true | false\n}\n\nRules:\n1. Only call tools in the Step's authorised whitelist.\n2. File writes must land within the Step's writable allowlist (other paths are rejected); required outputs are the final artifacts that must exist for acceptance.\n For FUNCTIONAL_TEST documentation outputs, write the complete declared bundle in the active i18n language: P1 paths such as \\`README.md\\`, \\`docs/quickstart.md\\`, \\`docs/08-functional-test.md\\`, and \\`docs/api-guide.md\\` when present, or the declared iteration-scoped equivalents under \\`docs/iterations/<iterationId>/\\`. Do not set done=true while any declared documentation output is missing.\n3. Generated code must follow the target language's best practice; modules importable, functions typed appropriately.\n - [Import convention] When modules under src/ import each other, use \"from <module> import …\" (sibling name).\n **Never write \"from src.<module> import …\".** If main.py needs to run from the project root, prepend\n \"sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))\" before any import,\n so that both \"python src/main.py …\" and \"python -m src.main …\" work.\n - [Test convention] Files under tests/ also import targets via \"from <module> import …\".\n **XCompiler auto-generates tests/conftest.py to inject project-root and src/ into sys.path**,\n so both pytest and \"python tests/test_*.py\" can resolve modules — test files\n **must NOT** add their own sys.path.insert(...). If you create or edit conftest.py yourself,\n keep the existing sys.path injection — do not delete it.\n - [Self-contained tests] Tests **must NOT** open() a sample file that does not exist on disk\n (e.g. \"test.dbc\", \"sample.csv\"). When a target function needs file input, do exactly one of:\n (a) use pytest's tmp_path fixture inside the test, e.g. tmp_path.joinpath(\"x.dbc\").write_text(...);\n (b) use write_file to put a fixture under tests/fixtures/<name> — test/DEBUG phases have\n write permission to tests/fixtures/ by default, sub-directories are auto-mkdir'd, and\n **fixture paths do NOT need to be pre-declared in outputs**.\n A test that references a file nobody created will trap the Debugger in an endless FileNotFoundError loop.\n - [Fixture iteration] When a test runs but the target function raises \"Invalid syntax / Parse error / Malformed\",\n the **fixture itself is malformed** (DBC/CSV/JSON/...), **not the implementation**.\n read_file the fixture → write_file a minimal valid sample for that format → run_tests again.\n Never edit the implementation, the assertion, or mock out the parser to \"fix\" a parse error — fix the fixture first.\n4. When all outputs files exist and self-check passes, set done = true with empty actions.\n5. Correct any error in the next round's actions; never overstep authority or invent tools.\n6. [Large-file chunked writes] write_file / append_file content must stay under the current Step's runtime chunk limit shown in the tool docs.\n - For larger files: in the same actions array, first write_file the head (imports + top-level constants + first function/class),\n then several append_file calls each adding one function/class block (preserving trailing newlines).\n - For complex projects, prefer multiple cohesive modules/files and separate CODE/UNIT_TEST/INTEGRATION_TEST/MODULE_TEST/FUNCTIONAL_TEST Steps over one giant file.\n - The concatenated result must be valid Python; never split inside a function body.\n - For partial edits to existing files, use replace_in_file / apply_patch — do not overwrite the whole file repeatedly.`;\n\nconst TYPESCRIPT_PLANNER_SYSTEM = `You are the Planner of the XCompiler system. Your job is to compile a user's natural-language requirement into a strict iterative V-model Step plan.\n\nOutput language: TypeScript / Node.js only (plan.language is fixed to \"typescript\").\n\nCanonical V-model phases for every executable iteration:\nREQUIREMENT_ANALYSIS -> HIGH_LEVEL_DESIGN -> DETAILED_DESIGN -> CODE -> UNIT_TEST -> INTEGRATION_TEST -> MODULE_TEST -> FUNCTIONAL_TEST.\nDEBUG is runtime rollback/repair only. If a test phase fails, XCompiler rolls back to its paired source phase and reruns subsequent phases.\n\nUse the same phase documents and synchronous test-design rule as the Python planner:\n- REQUIREMENT_ANALYSIS: \\`docs/01-requirement-analysis.md\\` plus \\`docs/tests/functional-test-plan.md\\`.\n- HIGH_LEVEL_DESIGN: \\`docs/02-high-level-design.md\\` plus \\`docs/tests/integration-test-plan.md\\`.\n- DETAILED_DESIGN: \\`docs/03-detailed-design.md\\` plus \\`docs/tests/module-test-plan.md\\`.\n- CODE: implementation outputs plus \\`docs/tests/unit-test-plan.md\\`.\n- UNIT_TEST: \\`docs/05-unit-test.md\\`.\n- INTEGRATION_TEST: \\`docs/06-integration-test.md\\`.\n- MODULE_TEST: \\`docs/07-module-test.md\\`.\n- FUNCTIONAL_TEST: \\`docs/08-functional-test.md\\`, \\`README.md\\`, \\`docs/quickstart.md\\`, and \\`docs/api-guide.md\\` for library/mixed projects.\nFor P2+ iterations, put phase docs under \\`docs/iterations/<iterationId>/\\` and test plans under \\`docs/iterations/<iterationId>/tests/\\`.\n\nHIGH_LEVEL_DESIGN must place the current development module in the whole system and define system-level external interfaces and dependencies, including external APIs, third-party library choices, dependency confirmation, package.json scripts, package dependencies/devDependencies, tsconfig, data contracts, and integration boundaries.\nDETAILED_DESIGN must define module-internal functions, types, data structures, algorithms, control flow, error handling, and internal architecture.\n\nMandatory rules:\n1. Return pure JSON only. Never emit the old phases REQUIREMENT, ARCH, TASK, TEST, REFACTOR, or DELIVERY.\n2. Every current/planned implementation phase is a complete V-model iteration containing all eight canonical phases.\n3. Each macro Step may contain \\`subTasks\\` nested at most two levels.\n4. Every CODE Step must be covered by a UNIT_TEST Step in the same iteration; module testPaths from architectureModules must be produced by MODULE_TEST.\n5. Design phases must not output src/ or tests/ files. HIGH_LEVEL_DESIGN is the only phase that may output \\`package.json\\` / \\`tsconfig.json\\`.\n6. Exactly one HIGH_LEVEL_DESIGN Step must output \\`package.json\\` for greenfield TypeScript plans; ensure one HIGH_LEVEL_DESIGN Step output \\`package.json\\`. It must include scripts for \\`build\\`, \\`test\\`, and preferably \\`lint\\`.\n7. Local TypeScript source imports must use explicit \\`.ts\\` ESM specifiers. Configure \\`allowImportingTsExtensions: true\\` and use \\`tsc --noEmit\\`. Generated TypeScript must be compatible with Node native type stripping: avoid enums, namespaces, parameter properties, and transform-required syntax.\n8. dependencies is an advisory runtime npm package list; the authoritative manifest is \\`package.json\\` from HIGH_LEVEL_DESIGN. Do not invent package names.\n9. Application/mixed projects need \\`src/main.ts\\` with a directly runnable \\`main()\\`; library/mixed projects need \\`src/index.ts\\` or equivalent public API plus API guide.\n10. complexityAssessment and implementationPhases follow the same rules as Python: simple => P1, moderate => at least P1+P2, complex => at least P1+P2+P3, forced phase split => set userForcedPhaseSplit=true.\n11. verificationGate failurePolicy must say: Feed failures to Debugger, roll back to the paired V-model phase, and rerun subsequent phases.\n12. For non-trivial work, return architectureModules with sourcePaths and testPaths; CODE/MODULE_TEST Steps may cover multiple modules but must list module-level work in subTasks.\n\nOutput JSON shape is identical to Python and must include \\`\"projectType\": \"application | library | mixed\"\\`, with TypeScript paths such as \\`src/example.ts\\` and \\`tests/example.test.ts\\`; the first Step phase must be \\`REQUIREMENT_ANALYSIS\\`, not \\`REQUIREMENT\\`. There is no CLI project-type override.`;\n\nconst TYPESCRIPT_EXECUTOR_SYSTEM = `You are XCompiler's Step Executor. You may only interact with the system through JSON tool calls — no Markdown and no explanatory text.\n\nEvery round you must return strict JSON:\n{\n \"thoughts\": \"<one sentence describing this round's intent>\",\n \"actions\": [ { \"tool\": \"<tool name>\", \"args\": { ... } }, ... ],\n \"done\": true | false\n}\n\nRules:\n1. Only call tools in the Step's authorised whitelist.\n2. File writes must land within the Step's writable allowlist (other paths are rejected); required outputs are the final artifacts that must exist for acceptance.\n For FUNCTIONAL_TEST documentation outputs, write the complete declared bundle in the active i18n language: P1 paths such as \\`README.md\\`, \\`docs/quickstart.md\\`, \\`docs/08-functional-test.md\\`, and \\`docs/api-guide.md\\` when present, or the declared iteration-scoped equivalents under \\`docs/iterations/<iterationId>/\\`. Do not set done=true while any declared documentation output is missing.\n3. Generated code must follow TypeScript / Node.js best practice; modules importable, APIs typed, and runtime code directly runnable.\n - [Import convention] Local source modules under src/ use ESM relative imports with explicit \".ts\" specifiers, e.g. \\`import { x } from \"./util.ts\";\\`. Keep code compatible with Node's native TypeScript type stripping: use erasable type syntax only, and avoid enums, namespaces, parameter properties, or other transform-required TS features. Never use Python-style imports, \\`from src.<module>\\`, or sys.path hacks.\n - [Test convention] Tests use Vitest: \\`import { describe, it, expect } from \"vitest\";\\`. Test files live under \\`tests/**/*.test.ts\\`.\n - [Self-contained tests] Tests **must NOT** read a sample file that does not exist on disk. When a target function needs file input, either create the content inside the test or write fixtures under \\`tests/fixtures/<name>\\`.\n - [Fixture iteration] When a test runs but the target function raises \"Invalid syntax / Parse error / Malformed\", the **fixture itself is malformed**. read_file the fixture → write_file a minimal valid sample → run_tests again. Never \"fix\" a parse error by weakening the implementation or the assertion.\n4. When all outputs files exist and self-check passes, set done = true with empty actions.\n5. Correct any error in the next round's actions; never overstep authority or invent tools.\n6. [Large-file chunked writes] write_file / append_file content must stay under the current Step's runtime chunk limit shown in the tool docs.\n - For larger files: in the same actions array, first write_file the head (imports + top-level constants + first function/class), then several append_file calls each adding one function/class block.\n - For complex projects, prefer multiple cohesive modules/files and separate CODE/UNIT_TEST/INTEGRATION_TEST/MODULE_TEST/FUNCTIONAL_TEST Steps over one giant file.\n - The concatenated result must be valid TypeScript; never split inside a function body.\n - For partial edits to existing files, use replace_in_file / apply_patch — do not overwrite the whole file repeatedly.\n7. package.json is the dependency manifest. Use add_dependency for npm packages; never write requirements.txt.\n8. run_program runs the project entry with \\`npx tsx\\`, run_tests runs Vitest via \\`npm test\\`, and the final delivery gate also verifies the direct Node entry command.`;\n\nconst PLANNER_CLARIFY_SYSTEM = `You are the requirements analyst for XCompiler's V-model. Do not restate the topic; expose unresolved decisions that would change functional design, acceptance, or architecture boundaries.\nReturn strict JSON only. Each question must be directly answerable by a product owner, cover one decision, and avoid vague catch-all or implementation-stack questions.`;\n\nfunction buildPlannerSystem(profile: LanguageProfile): string {\n return (profile.id === 'typescript' ? TYPESCRIPT_PLANNER_SYSTEM : PYTHON_PLANNER_SYSTEM) + profile.plannerPromptOverride;\n}\n\nfunction buildExecutorSystem(profile: LanguageProfile): string {\n return (profile.id === 'typescript' ? TYPESCRIPT_EXECUTOR_SYSTEM : PYTHON_EXECUTOR_SYSTEM) + profile.executorPromptOverride;\n}\nconst messages: Messages = {\n llm: {\n coderDebuggerSameModel: (model, coderProvider, debuggerProvider) =>\n `Model configuration advice: Coder (${coderProvider}) and Debugger (${debuggerProvider}) both use ${model}. Prefer different models so debugging provides an independent reasoning path.`,\n invalidBaseUrl: (raw, fallback) => `[xcompiler] invalid base_url (${raw}); falling back to ${fallback}`,\n providerValidationFailed: (role, model) => `[${role}] provider ${model} failed output validation; trying next`,\n providerCallFailed: (role, model) => `[${role}] provider ${model} failed; trying next`,\n scoreReadFailed: (p, message) => `failed to read ${p}: ${message}`,\n scoreChanged: (provider, score, previous) => `score(${provider}) = ${score} (was ${previous})`,\n scorePersistFailed: (message) => `failed to persist scores: ${message}`,\n preflightOllamaReachable: (baseUrl, models) => `preflight: ollama ${baseUrl} reachable; found ${models} model(s)`,\n preflightOllamaUnreachable: (baseUrl, message) => `preflight: ollama ${baseUrl} unreachable: ${message}`,\n preflightAutoAdded: (providers, roles) => `preflight: auto-added ${providers} provider(s) for roles [${roles}]`,\n scoreFileHeader: '# XCompiler LLM provider score snapshot (maintained automatically by ScoreStore; do not edit)',\n scoreFileSemantics: '# Scores: default 1.0; failure -0.5 (floor 0=disabled); success +0.1 (cap 10).',\n },\n system: {\n configEnvMissing: (names) => `[xcompiler] unset config environment variables were replaced with empty strings: ${names}`,\n unhandledError: (message) => `Unhandled error: ${message}`,\n unsupportedPypiOnlyNetwork:\n 'network=pypi-only is rejected because Docker cannot enforce a PyPI-only allowlist by itself. Use network=off for isolation or network=download-only for explicitly unrestricted outbound downloads.',\n dockerInsideContainerUnsupported:\n 'XCompiler is running inside a container, so sandbox=docker is unsupported because Docker-outside-of-Docker can mis-map bind mounts and docker.sock permissions. Use agent.sandbox=subprocess, run XCompiler on the host, or set XC_IN_CONTAINER=0 only in a controlled environment.',\n firejailUnsupported: 'sandbox=firejail is not implemented; use subprocess or docker.',\n smokeHeader: (baseUrl) => `Smoke test against ${baseUrl} (streaming)`,\n smokeOk: (model, totalMs, firstTokenMs, chunks, preview) =>\n `[OK total=${totalMs}ms first-token=${firstTokenMs}ms chunks=${chunks}] ${model} -> ${preview}`,\n smokeFail: (model, message) => `[FAIL] ${model} -> ${message}`,\n },\n plugins: {\n invalidId: (id) => `Plugin ID \"${id}\" is invalid; use lowercase letters, digits, dots, hyphens, or underscores.`,\n duplicateId: (id) => `Duplicate plugin ID: ${id}`,\n invalidVersion: (plugin, version) => `Plugin ${plugin} has an invalid SemVer version: ${version}`,\n invalidCoreVersion: (version) => `XCompiler core has an invalid SemVer version: ${version}`,\n apiVersionMismatch: (plugin, actual, expected) => `Plugin ${plugin} targets Plugin API ${actual}; this XCompiler runtime requires API ${expected}.`,\n invalidMinimumVersion: (plugin, version) => `Plugin ${plugin} has an invalid minimum XCompiler version: ${version}`,\n coreVersionTooOld: (plugin, minimum, actual) => `Plugin ${plugin} requires XCompiler >= ${minimum}; current version is ${actual}.`,\n loaded: (plugin, version) => `Plugin ${plugin}@${version} loaded.`,\n extensionConflict: (plugin, kind, name) => `Plugin ${plugin} cannot replace existing ${kind} \"${name}\".`,\n hookFailed: (plugin, stage, message) => `Plugin ${plugin} failed during ${stage}: ${message}`,\n manifestReadFailed: (path, message) => `Cannot read plugin manifest ${path}: ${message}`,\n moduleLoadFailed: (plugin, path, message) => `Cannot load plugin ${plugin} from ${path}: ${message}`,\n exportInvalid: (plugin, exportName) => `Plugin ${plugin} export ${exportName} is not a valid XCompiler plugin`,\n manifestMismatch: (plugin) => `Plugin ${plugin} runtime manifest does not match its preflight manifest`,\n },\n audit: {\n processLogTitle: '# XCompiler Development Process Log',\n processLogPreamble: '> Generated by XCompiler. Records CLI sessions, user input, LLM interactions, and execution actions for delivery traceability.',\n sessionStart: (ts, command) => `## ▶ Session ${ts} — \\`${command}\\``,\n sessionEnd: (ts) => `### ◀ Session end ${ts}`,\n eventSessionStart: (command) => `start ${command}`,\n eventSessionEnd: (command) => `end ${command}`,\n userInput: (label) => `#### 👤 User input — ${label}`,\n llmRequest: (role, model) => `🤖 LLM Request — <code>${role}</code> via <code>${model}</code>`,\n llmResponse: (role, model) => `📩 LLM Response — <code>${role}</code> via <code>${model}</code>`,\n executorTurn: (stepId, round, role, provider, actions, done) =>\n `🧠 Executor turn — <code>${stepId}</code> round ${round} / role <code>${role}</code>${provider ? ` · via <code>${provider}</code>` : ''} (actions=${actions}, done=${done})`,\n thoughtsLabel: '**thoughts:**',\n actionsLabel: '**actions:**',\n noThoughts: '(no thoughts)',\n plannerThought: (stage, provider) => `🧩 Planner thought — ${stage}${provider ? ` · via <code>${provider}</code>` : ''}`,\n markdownAppendFailed: (message) => `[audit] markdown append failed: ${message}`,\n jsonlAppendFailed: (message) => `[audit] jsonl append failed: ${message}`,\n traceLine: (kind, message) => `[audit] ${kind} ${message}`,\n autoFixedSrcImport: (p) => `auto-fixed src import in ${p}`,\n wroteFile: (p) => `wrote ${p}`,\n userDecision: (label, value) => `${label} → ${value}`,\n eventLlmRequest: (role, model) => `${role} → ${model}`,\n eventLlmResponse: (role, model) => `${role} ← ${model}`,\n eventLlmError: (role, model, message) => `${role} via ${model}: ${message}`,\n eventExecutorTurn: (stepId, round, role, provider) => `${stepId} round=${round} role=${role}${provider ? ` via ${provider}` : ''}`,\n eventPlannerThought: (stage, provider) => `Planner ${stage}${provider ? ` via ${provider}` : ''}`,\n llmChatFailedThought: (message) => `LLM chat failed: ${message}`,\n llmChatAborted: (stepId, round, chars, message) => `${stepId} round ${round} aborted after ${chars} chars: ${message}`,\n toolDenied: (tool) => `denied tool ${tool}`,\n toolCalled: (tool) => `called tool ${tool}`,\n toolResult: (tool, ok, detail) => `tool ${tool} ${ok ? 'succeeded' : 'failed'}: ${detail}`,\n documentArchived: (from, to) => `archived ${from} → ${to}`,\n documentArchiveFailed: (p, message) => `failed to archive ${p}: ${message}`,\n httpFetchSaved: (method, url, p, bytes) => `http_fetch ${method} ${url} → ${p} (${bytes} B)`,\n httpFetchResponse: (method, url, status, bytes) => `http_fetch ${method} ${url} → ${status} (${bytes} B)`,\n partialFailureHeader: (message) => `# LLM chat failed: ${message}`,\n streamLength: (chars) => `# Stream length: ${chars} chars`,\n },\n stream: {\n resolvingModel: 'resolving-model',\n waiting: 'waiting',\n streaming: 'streaming',\n done: 'done',\n failed: 'failed',\n chars: (n) => `${n} chars`,\n toolRunner: 'local-tool',\n toolExecution: (stepId, tool) => `${stepId} tool ${tool}`,\n },\n sandboxLog: {\n subprocessBuilt: (deps) => `subprocess sandbox built (${deps ? 'with dependencies' : 'empty'})`,\n subprocessNodeBuilt: 'Node subprocess sandbox built (npm install)',\n dockerBuilt: (deps) => `Docker sandbox built (${deps ? 'with dependencies' : 'empty'})`,\n dockerNodeBuilt: 'Docker Node sandbox built (npm install)',\n command: (runtime, command) => `${runtime} ${command}`,\n },\n cli: {\n rootDescription: 'XCompiler — AI Software Factory CLI',\n compileDescription: 'Interactively compile a requirement into plan.json (with mandatory human gates)',\n runDescription: 'Execute a confirmed plan.json (supports phased runs: --phase / --from)',\n loadDescription: 'Load a XXX.xc project file and continue its current plan',\n appendDescription: 'Append a new requirement to an existing XXX.xc project through clarification and V-model execution',\n lsDescription: 'Scan workspace and list every plan.json status summary',\n showDescription: 'Print Step definition / status / outputs / recent audit',\n optWorkspace: 'workspace directory (alias of --output, defaults to current directory)',\n optOutput: 'project / workspace output directory (highest priority, alias of -w)',\n optConfig: 'path to config.yaml',\n optInput: 'read requirement from a file (non-interactive)',\n optTopic: 'reuse an already-clarified topic.md as input: skip intake / clarify / addenda / Gate 1 and go straight to decompose',\n optPlanOut: 'output path for plan.json (default <workspace>/plan.json)',\n optBaseDir: 'project root output directory (creates <name> subdir under it)',\n optName: 'project name (default xcompiler-<timestamp>)',\n optYes: 'skip human confirmation (only meaningful with -i / -t)',\n optForce: 'force regenerate: override workspace lock and ignore existing plan.json',\n optDryRun: 'print topology only, do not execute',\n optFrom: 'start from the given Step (earlier ones are skipped)',\n optPhase: 'execute only the given phase (REQUIREMENT_ANALYSIS/HIGH_LEVEL_DESIGN/DETAILED_DESIGN/CODE/UNIT_TEST/INTEGRATION_TEST/MODULE_TEST/FUNCTIONAL_TEST/DEBUG)',\n optReset: 'reset all Step status to PENDING',\n optMaxDepth: 'maximum recursion depth',\n optTail: 'number of recent audit entries',\n optPlan: 'plan.json path, default <workspace>/plan.json',\n optLang: 'UI / prompt language: EN | CN (ISO 3166-1 Alpha-2)',\n optIntent: 'plan intent: greenfield | feature | refactor | self',\n optBaselinePlan: 'existing baseline plan.json path (default <workspace>/plan.json)',\n optProjectFile: 'XXX.xc project file path (default <workspace>/<name>.xc)',\n argPlan: 'plan.json path (default = <workspace>/plan.json)',\n argProjectFile: 'XXX.xc project file',\n argStepId: 'Step ID, e.g. S001',\n evolveDescription: 'Generate and execute an incremental feature/refactor plan on top of an existing workspace',\n bootstrapDescription: 'Build and qualify the next XCompiler generation in an isolated Git worktree',\n optRepository: 'XCompiler Git repository to bootstrap (default current directory)',\n optPromote: 'fast-forward the current branch after every qualification gate passes',\n optCleanup: 'remove the isolated worktree after writing the report (branch is retained)',\n optDockerQualification: 'use the experimental Docker runner for candidate qualification',\n invalidLocale: (value) => `Unsupported language \"${value}\"; use EN or CN.`,\n invalidIntent: (value, allowed) => `Invalid intent \"${value}\"; expected one of: ${allowed}.`,\n invalidPhase: (value, allowed) => `Invalid phase \"${value}\"; expected one of: ${allowed}.`,\n invalidStepId: (value) => `Invalid Step ID \"${value}\"; expected S followed by at least three digits.`,\n invalidNonNegativeInteger: (value) => `Expected a non-negative integer, received \"${value}\".`,\n helpUsage: 'Usage:',\n helpArguments: 'Arguments:',\n helpOptions: 'Options:',\n helpCommands: 'Commands:',\n helpOption: 'display help for command',\n versionOption: 'output the version number',\n defaultValue: (value) => `(default: ${value})`,\n },\n bootstrap: {\n notGitRepository: (p) => `Not a Git repository: ${p}`,\n dirtyRepository: (files) => `Self-bootstrap requires a clean host repository. Pending paths: ${files}`,\n worktreeReady: (p, branch) => `Bootstrap worktree ready: ${p} (${branch})`,\n compileStarted: 'Compiling the self-bootstrap V-model plan…',\n compileFailed: (code, message) => `Self-bootstrap compilation failed (exit=${code}): ${message}`,\n compileCancelled: 'Self-bootstrap compilation was cancelled before a plan was confirmed.',\n executeStarted: 'Executing the candidate generation in the isolated worktree…',\n executeFailed: (status) => `Candidate execution did not complete successfully (${status}).`,\n qualificationStarted: 'Running deterministic bootstrap qualification gates…',\n qualificationDockerExperimental: 'Docker qualification is experimental and has not completed environment validation.',\n missingScript: (name) => `required package.json script is missing: ${name}`,\n missingBin: 'package.json does not declare a CLI bin entry',\n checkPassed: (name, ms) => `${name} passed (${ms}ms)`,\n checkFailed: (name, code) => `${name} failed (exit=${code})`,\n reportWritten: (p) => `Bootstrap report written: ${p}`,\n candidateReady: (branch) => `Candidate is qualified on ${branch}; promotion still requires explicit --promote.`,\n promoted: (branch) => `Bootstrap candidate promoted by fast-forward merge: ${branch}`,\n cleanupDone: (p) => `Bootstrap worktree removed: ${p}`,\n promotionBlocked: 'Promotion blocked because one or more qualification gates failed.',\n hostHeadChanged: 'host HEAD changed during bootstrap',\n candidateDirty: (files) => `Candidate worktree changed outside a committed generation: ${files}`,\n candidateStatusUnknown: '(unknown path)',\n candidateMoved: (expected, actual) => `Candidate commit changed after qualification (expected ${expected}, got ${actual}).`,\n candidateNotBasedOnBase: (candidate, base) => `Candidate ${candidate} is not descended from bootstrap base ${base}.`,\n promotionVerificationFailed: (expected, actual) => `Promotion verification failed (expected HEAD ${expected}, got ${actual}).`,\n reportTitle: 'XCompiler Self-Bootstrap Report',\n reportNone: '(none)',\n reportNextQualified: (repository, candidateCommit) => `git -C \"${repository}\" merge --ff-only \"${candidateCommit}\"`,\n reportNextPromoted: 'Run the next self-bootstrap request with the promoted generation.',\n reportNextFailed: 'Inspect the candidate worktree and fix the failed gate before promotion.',\n reportLabels: {\n status: 'Status', repository: 'Repository', baseCommit: 'Base commit',\n candidateCommit: 'Candidate commit', branch: 'Candidate branch', worktree: 'Worktree',\n createdAt: 'Created at', checks: 'Qualification checks', changedFiles: 'Changed files',\n nextStep: 'Next step',\n },\n },\n compile: {\n workspaceReady: (p) => `Workspace: ${p}`,\n forceOverride: '--force: overriding workspace lock and regenerating plan.',\n topicInputConflict: '--topic and --input were both supplied; --topic wins and --input is ignored.',\n auditTopicInput: 'topic.md (--topic)',\n auditOriginalRequirement: 'Original requirement (Intake)',\n auditUserAddenda: 'User addenda',\n auditEditedTopic: 'Edited topic.md',\n auditTopicPersisted: (p) => `topic.md written: ${p}`,\n auditDecomposeFailed: 'planner.decompose failed',\n lintIssue: (id, message) => ` - [${id}] ${message}`,\n planPreviewTruncated: '… (truncated; see docs/plan.md)',\n auditPlanPersisted: (p) => `plan.json written: ${p}`,\n projectFileWritten: (p) => `project file updated: ${p}`,\n nextCommand: (command) => ` Next: ${command}`,\n topicEmptyExit: '--topic file is empty, aborting.',\n topicLoaded: (p) => `topic loaded: ${p} (skipping intake / clarify / Gate 1)`,\n requirementEmptyExit: 'requirement is empty, aborting.',\n requirementInputHint: 'Please describe your requirement (multi-line, blank line to finish):',\n spinClarify: 'Planner is clarifying the requirement…',\n clarifySucceed: (n) => `clarification questions: ${n}`,\n clarifyFail: 'clarification failed',\n clarifyChoiceHint: (range) => `Reply with ${range} to choose a shown option, or type a custom answer.`,\n addendaConfirm: 'Any extra requirements to append? (Will be sent to Planner together with the clarification and kept in plan.userAddenda)',\n addendaEditorMsg: 'Enter custom addenda (multi-line, Markdown allowed)',\n auditClarifyAnswer: (qid, q) => `clarify answer ${qid}: ${q}`,\n spinDecompose: 'Planner is decomposing along the V-model…',\n decomposeFail: 'Planner decomposition failed',\n plannerInvalidPlan: 'Planner could not produce a valid plan:',\n plannerInvalidPlanHint1: ' Common cause: every LLM provider returned malformed/truncated JSON (e.g. token loop).',\n plannerInvalidPlanHint2: ' Investigate: check llm.error / planner.thought entries in .xcompiler/audit.jsonl.',\n decomposeSucceed: (n) => `generated ${n} Step(s)`,\n schemaFail: 'Plan schema validation failed:',\n schemaInvalidSavedAt: (p) => ` full plan saved to: ${p}`,\n lintFail: (n) => `Plan lint failed (${n}):`,\n topicPreviewHeader: '─── topic.md (preview) ───',\n topicPreviewFooter: '──────────────────────────────',\n gate1Confirm: 'Does the requirement match expectations?',\n gate1ChoiceConfirm: '✅ confirm — proceed to plan generation',\n gate1ChoiceEdit: '✏️ edit — open editor to modify',\n gate1ChoiceCancel: '❌ cancel — abandon this session',\n gate1AuditLabel: 'Requirement Confirmation Gate (Gate 1)',\n gate1Cancelled: 'Cancelled, no files written.',\n editTopicMsg: 'Edit topic.md',\n topicWritten: (p) => `topic written: ${p}`,\n planWritten: (p) => `plan written: ${p}`,\n planPreviewHeader: '─── plan.md (preview) ───',\n planPreviewFooter: '─────────────────────────',\n gate2Confirm: 'Confirm this plan? (Final confirmation — confirms write to plan.json)',\n gate2AuditLabel: 'Plan Confirmation Gate (Gate 2)',\n gate2Rejected: 'Not confirmed, abandoned. plan.json was not written.',\n baselineLoaded: (kind, sources) => `loaded ${kind} baseline from: ${sources}`,\n baselineMissing: (workspace) => `incremental mode requires an existing project baseline in ${workspace} (topic / docs / plan / src).`,\n baselineLanguageOverride: (baseline, source, configured) =>\n `incremental mode: using baseline language ${baseline} from ${source} instead of config language ${configured}.`,\n topicTitle: '# Project Topic',\n topicPreamble: '> This file is the project topic frozen after requirement clarification. All subsequent V-model decomposition and every phase output use this file as the sole requirement input.',\n topicSecRequirement: '## Original requirement',\n topicSecClarify: '## Clarification record',\n topicSecAddenda: '## User addenda',\n topicSecBaseline: '## Existing project baseline',\n },\n inspect: {\n noPlanFound: 'No plan.json found',\n digestLabel: 'digest:',\n stepNotFound: (id) => `Step ${id} not found`,\n secDescription: '— description —',\n secAcceptance: '— acceptance —',\n secSubtasks: '— subtasks —',\n secSystemPrompt: '— systemPrompt —',\n secOutputs: '— outputs —',\n secRecentAudit: (n) => `— recent audit (${n}) —`,\n planHeader: (p, language) => `${p} lang=${language}`,\n planStatusSummary: (total, done, pending, failed, skipped, running) =>\n `steps=${total} done=${done} pending=${pending} failed=${failed} skipped=${skipped} running=${running}`,\n planReadFailed: (p, message) => `${p} — ${message}`,\n stepHeader: (id, phase, title, status, retries, maxRetries) => `${id} ${phase} ${title} ${status} retries=${retries}/${maxRetries}`,\n stepRoleTools: (role, tools) => `role=${role} tools=[${tools}]`,\n stepDependsOn: (ids) => `dependsOn: ${ids}`,\n outputStatus: (exists, p) => `${exists ? '✓' : '✗'} ${p}`,\n auditEntry: (ts, kind, message) => `${ts} ${kind} ${message}`,\n },\n execute: {\n forceReset: '--force: resetting every Step to PENDING and overriding the workspace lock.',\n manifestRecalibrated: (p) => `recalibrated ${p} (removed version pins / hallucinated names)`,\n manifestSeeded: (p) => `seeded ${p} from plan.dependencies`,\n auditPlanLoaded: (p) => `plan loaded: ${p}`,\n planLoaded: (p) => `Plan loaded: ${p}`,\n planSummary: (language, steps) => ` language=${language}, steps=${steps}`,\n preflightModelMissing: (names) => `LLM preflight: missing models, disabled [${names}]`,\n preflightAutoAdded: (n) => `LLM preflight: auto-injected ${n} provider(s) (from ollama /api/tags)`,\n runInterrupted: (id, e, total) => `execution interrupted at ${id} (executed ${e}/${total})`,\n runReasonLabel: ' reason: ',\n runFailureLogHeader: ' --- failure log (tail, 40 lines) ---',\n runAllDone: (e, total) => `Plan fully completed (${e}/${total})`,\n projectAuditSummary: (errors, warnings) => `project audit: ${errors} error(s), ${warnings} warning(s)`,\n projectMemoryRefreshFailed: (message) => `project memory refresh failed: ${message}`,\n projectAuditCheck: (name, summary) => `[audit:${name}] ${summary}`,\n auditDocPresent: (p) => `${p} present`,\n auditDocMissing: (p) => `missing ${p}`,\n auditDeliveryDocPresent: 'delivery documentation present',\n auditDeliveryDocMissing: 'missing docs/08-functional-test.md',\n auditTestFilesFound: (count) => `found ${count} concrete test file(s)`,\n auditTestFilesMissing: 'no concrete test files found under tests/',\n auditEntrypointOk: (command) => `entrypoint ok: ${command}`,\n auditEntrypointFailed: (command) => `entrypoint failed: ${command}`,\n auditPackageJsonMissing: 'missing package.json',\n auditScriptMissing: (name) => `package.json has no ${name} script`,\n auditCommandOk: (name) => `${name} ok`,\n auditCommandFailed: (name, exitCode, timedOut) =>\n `${name} failed (exit=${exitCode}${timedOut ? ', timeout' : ''})`,\n },\n engine: {\n spinSandboxBuild: (profile) =>\n profile.id === 'typescript'\n ? `building sandbox (npm install, ${profile.manifestFile})…`\n : `building sandbox (pip install -r ${profile.manifestFile})…`,\n sandboxReady: (r) => `sandbox ready: ${r}`,\n stepSkipDone: (id, phase) => ` ↪ ${id} ${phase} already done, skipping`,\n spinSandboxRebuild: (id, profile) =>\n profile.id === 'typescript'\n ? `Step ${id} wrote ${profile.manifestFile} — rebuilding npm sandbox…`\n : `Step ${id} wrote ${profile.manifestFile} — rebuilding pip sandbox…`,\n sandboxStatus: (r) => `sandbox: ${r}`,\n autoFixedSrcImports: (n, files) => ` ⚠ auto-fixed sys.path bootstrap in ${n} entry file(s): ${files}`,\n debugResumeNotice: (id, n) => ` ↻ ${id} previous session ended FAILED (${n} attempts so far); first round of this run goes straight into Debugger mode.`,\n spinDebugRetry: (id, attempt, budget, cap, reason) => `🛠 ${id} DEBUG retry ${attempt}/${budget} (cap=${cap}) — ${reason}`,\n retryException: (a, b, msg) => `retry ${a}/${b} threw: ${msg}`,\n fixSucceeded: (id, a) => `${id} fix succeeded (retry=${a})`,\n retryHealthyButFailed: (a, before, b, tag, reason) =>\n `retry ${a}/${before}→${b} still failing but healthy (expand window) · ${tag} · ${reason}`,\n retryLowQuality: (a, before, b, tag, reason) =>\n `retry ${a}/${before}→${b} low-quality output (shrink window) · ${tag} · ${reason}`,\n retryStillFailed: (a, b, tag, reason) =>\n `retry ${a}/${b} still failing · ${tag} · ${reason}`,\n earlyAbortLowQuality: (id, n) => ` ⚡ ${id} ${n} consecutive low-quality rounds — early-aborting DEBUG retries`,\n stepFinalFailed: (id, phase, role) => `✖ Step ${id} (${phase} / ${role}) finally failed`,\n finalAttemptsLine: (a, b, c, ea) =>\n ` attempts=${a} final_budget=${b} cap=${c}` + (ea ? ' (early-abort: low-quality)' : ''),\n finalMetricsLine: (h, p, r, tf, pr) =>\n ` health=${h} parseFail=${p} repeat=${r} toolFail=${tf} progress=${pr}`,\n reasonLabel: 'reason: ',\n failureLogHeader: '--- failure log (tail, max 80 lines) ---',\n fixSuggestionsHeader: '--- fix suggestions (calibration) ---',\n auditHint: (id) => ` audit: see .xcompiler/audit.jsonl and .xcompiler/llm-stream/${id}-*.txt for the raw stream`,\n spinStepRunning: (id, phase, title) => `▶ ${id} ${phase} ${title}`,\n noFailureLog: '(no log captured)',\n suggestionLine: (index, code, hint) => ` ${index}. [${code}] ${hint}`,\n phaseStart: (id, phase, title) => `${id} ${phase} ${title}`,\n phaseFailed: (id, debug, reason) => `${id} ${debug ? 'DEBUG ' : ''}FAILED — ${reason}`,\n phaseDone: (id, rounds) => `${id} DONE (rounds=${rounds})`,\n phaseException: (id, message) => `${id} FAILED (exception) — ${message}`,\n archGateReason: (missing) => `HIGH_LEVEL_DESIGN gate: architecture contract missing ${missing} token(s)`,\n archGateMissing: (tokens) => `missing module ids/paths: ${tokens}`,\n archGateInstruction: (p) => `Update ${p} so every architectureModules item is traceable before CODE starts.`,\n testGateReason: (exitCode, timedOut) => `Test gate: tests exit=${exitCode}${timedOut ? ' (timeout)' : ''}`,\n deliveryGateReason: (command, exitCode, timedOut) => `FUNCTIONAL_TEST gate: \\`${command}\\` exit=${exitCode}${timedOut ? ' (timeout)' : ''}`,\n missingPythonEntrypoint:\n 'missing Python entrypoint: expected src/main.py or src/<package>/__main__.py',\n missingTypeScriptEntrypoint:\n 'missing TypeScript entrypoint: expected package.json start/bin or one of src/main.ts, src/index.ts, src/main.tsx',\n invalidPythonEntrypointSource: (path) =>\n `invalid Python entrypoint source in ${path}: expected a real CLI entry structure such as def main(...), argparse.ArgumentParser, or if __name__ == \"__main__\"; placeholder/import-only files are not runnable applications.`,\n entrypointHelpOutputMissing: (command) =>\n `entrypoint probe \\`${command}\\` exited 0 but produced no meaningful help/usage text; implement --help instead of relying on an empty script exit.`,\n reasonLine: (reason) => `reason: ${reason}`,\n roundsLine: (rounds) => `rounds: ${rounds}`,\n commandLine: (command) => `command: ${command}`,\n stdoutTailHeader: '--- stdout (tail) ---',\n stderrTailHeader: '--- stderr (tail) ---',\n testStdoutTailHeader: '--- test stdout (tail) ---',\n testStderrTailHeader: '--- test stderr (tail) ---',\n outputsMissing: (paths) => `outputs missing: ${paths}`,\n metricsLine: (health, parseFail, repeat, toolFail, progress) =>\n `metrics: health=${health} parseFail=${parseFail} repeat=${repeat} toolFail=${toolFail} progress=${progress}`,\n metricsUnavailable: 'metrics: (n/a)',\n toolCallsHeader: 'tool calls:',\n toolCallLine: (tool, ok, detail) => ` - ${tool} ${ok ? 'OK' : 'FAIL'} ${detail}`,\n projectMemoryRefreshFailed: (message) => `project memory refresh failed: ${message}`,\n deliveryFixHints: (language) => language === 'typescript'\n ? [\n 'Fix directions (priority order):',\n ' 1. For module resolution / ERR_MODULE_NOT_FOUND in TypeScript source, use relative ESM imports with explicit .ts specifiers.',\n ' 2. For --help / unknown option, main() must support --help and exit 0.',\n ' 3. For application exceptions, fix the implementation and keep the entrypoint thin.',\n ]\n : [\n 'Fix directions (priority order):',\n ' 1. For ModuleNotFoundError involving src, add the planner #19 sys.path bootstrap or remove the src. import prefix.',\n ' 2. main() must be a real CLI entrypoint: parse --help, call the project modules, print meaningful output, and use if __name__ == \"__main__\": main().',\n ' 3. For argparse errors, main() must support --help without other required arguments and exit 0.',\n ' 4. For business exceptions, fix the implementation and keep the entrypoint limited to parsing and dispatch.',\n ],\n },\n render: {\n sectionGlobalPrompt: '## Global prompt (injected into every Step\\'s system prompt)',\n sectionDependencies: (manifestFile) => `## Dependencies (written to ${manifestFile})`,\n sectionBaselineSummary: '## Existing project baseline',\n labelSystemPrompt: '**System prompt (sole mandate):**',\n },\n prompts: {\n plannerSystem: (p) => buildPlannerSystem(p),\n plannerSelfMode: `SELF-BOOTSTRAP OVERRIDE (takes precedence over conflicting greenfield rules above):\n- The target is the existing XCompiler repository. Preserve its current package.json, tsconfig, bin entries, CLI entrypoints, module layout, public exports, and documentation unless the requirement explicitly changes them.\n- Do not create src/main.ts merely to satisfy a greenfield entrypoint convention. Reuse the entrypoints declared by the existing package.json.\n- Do not list package.json or tsconfig.json as HIGH_LEVEL_DESIGN outputs unless this change genuinely needs to modify them.\n- Every CODE/test output must be scoped to the requested delta. Never rebuild or replace the repository wholesale.\n- Treat the stable host binary as generation N and the worktree candidate as N+1; do not design in-process hot replacement.`,\n plannerClarifySystem: PLANNER_CLARIFY_SYSTEM,\n plannerClarify: (raw, opts = {}) =>\n `The user's original requirement is:\n\n\"\"\"\n${raw}\n\"\"\"\n\nGenerate ${opts.complex ? '8-10' : '7-10'} non-duplicate clarification questions about unresolved decisions whose answers materially affect implementation or acceptance. Never return an empty array; when the functional description is already detailed, ask for acceptance examples, failure behaviour, and explicit exclusions.\n\nReturn ONLY a JSON array. Every item must be shaped exactly as:\n{\"id\":\"Q1\",\"category\":\"functionality|data|acceptance|boundary|quality|extensibility\",\"question\":\"one concrete directly-answerable question\",\"why\":\"what design or acceptance decision this answer affects\",\"options\":[{\"label\":\"A\",\"answer\":\"highest-priority feasible setting\"},{\"label\":\"B\",\"answer\":\"second feasible setting\"}]}\n\nQuestion mix (functionality first):\n- At least ${opts.complex ? '5' : '4'} function-focused questions categorized as functionality / data / acceptance, so functional questions remain the majority. Prioritize actors, core journeys, business rules and state transitions, inputs/outputs, failure behaviour, and verifiable acceptance examples.\n- At least one boundary question defining in-scope, explicitly out-of-scope, external-system ownership, or compatibility limits.\n- At least one quality question requesting measurable latency, throughput, volume, concurrency, accuracy, reliability, or security targets. Never ask only “Any performance requirements?”.\n- At least one extensibility question identifying the most likely future business capability, extension axis, or interface that must remain stable. Never ask only “Should it be extensible?”.\n- If the deliverable shape is unclear, include one boundary question asking whether this should be an API library/SDK/package, a runnable application/CLI/service, or a mixed deliverable with both.\n- Order by blocking impact: core functional/data decisions first, then scope and quality, then future evolution.\n- One primary decision per question. Include useful business choices/examples; do not join unrelated questions with “and/or”.\n- For every question, generate 2-5 feasible answer options ordered by priority. The option count is not fixed: use 2 for binary choices, 3 for common defaults, and 4-5 only when there are genuinely distinct viable settings. Do not pad or force every question to exactly 3 options.\n- Label options sequentially from A through the last generated option, for example A-B, A-C, A-D, or A-E. A should be the recommended/default setting when one is apparent. Options must be concrete business/product settings, not vague placeholders.\n- Do not include “Other”, “Custom”, or “Let the user decide” as an option. The CLI already allows the user to reply with one of the shown labels or enter a custom free-form answer.\n${opts.projectShapeAmbiguous\n ? '- Required for this topic: ask the API library vs runnable application vs mixed-deliverable boundary explicitly.\\n'\n : ''}\n\n[Hard constraint] The implementation stack is already fixed by XCompiler config / the existing project baseline. Do not reopen language/runtime/package-manager decisions.\n**Do NOT** ask questions of these forms:\n - \"Which programming language / framework / runtime should this use?\"\n - \"Which test framework / build tool / package manager?\"\n - \"Which OS is the target platform?\"\n${opts.intent && opts.intent !== 'greenfield'\n ? `This is an incremental ${opts.intent} request against an existing project${opts.hasBaseline ? ' with a separate baseline summary that will be provided during decomposition' : ''}. Ask ONLY delta questions; do not ask to rebuild the project from scratch.`\n : ''}The majority of questions must concern functional behaviour; performance, boundaries, and extensibility should eliminate ambiguities that affect this delivery.`,\n plannerDecompose: (raw, qa, addenda, opts = {}) =>\n `Original requirement:\n\"\"\"\n${raw}\n\"\"\"\n\nClarification Q&A:\n${qa || '(none)'}\n\n${addenda ? `User addenda (must be strictly followed; takes priority over any vague parts of the original):\\n\"\"\"\\n${addenda}\\n\"\"\"\\n\\n` : ''}${opts.intent && opts.intent !== 'greenfield'\n ? `Incremental intent: ${opts.intent}\n\nGenerate an incremental ${opts.intent} plan on top of the existing project. Reuse the current architecture, files, tests and dependencies where possible instead of rebootstrapping the whole project. Outside the requested change, preserve existing behaviour.\n\nExisting project baseline:\n\"\"\"\n${opts.baseline || '(missing baseline)'}\n\"\"\"\n\n`\n : ''}Planning depth rules:\n- Unless the request is explicitly tiny (single function / toy script / one-file utility), do not collapse the solution into one source file and one test.\n- If the requirement spans multiple concerns (domain logic, API/CLI surface, persistence, integration, orchestration, tests), reflect that with multiple architecture modules and Step.subTasks under CODE/MODULE_TEST macro Steps.\n- Assess project complexity in the plan and size implementationPhases from that assessment: simple => P1 current only; moderate => P1 current + at least P2 planned; complex => P1 current + at least P2/P3 planned. If the user explicitly requested phases/stages, use at least P1+P2 and set userForcedPhaseSplit=true. Every current/planned implementation phase must be represented by a full V-model cycle in steps, with Step.iterationId pointing to that phase.\n- Use HIGH_LEVEL_DESIGN/DETAILED_DESIGN steps to describe module boundaries, responsibilities, dependencies, and extension points that future incremental work can build on.\n- When baseline files already exist, prefer editing/extending those modules over creating shadow implementations with duplicate behaviour.\n\nOutput a strict JSON plan per the system rules.`,\n executorSystem: (p) => buildExecutorSystem(p),\n executorDebugBlock: (reason: string, suggestions?: string) =>\n `\\n\\nYou are now in DEBUG retry mode. Previous failure reason: ${reason}\\n` +\n 'DEBUG may edit upstream source files and tests within the current allowedWrites. If the failure reveals a real implementation, contract, or downstream integration mismatch, fix that real defect; do not pass by weakening assertions, skipping tests, deleting failing cases, or merely accommodating an incorrect test. ' +\n 'Begin with read_file / code_search to localise the issue, then make the smallest possible fix via apply_patch / replace_in_file / add_dependency, and finally run_tests to verify. ' +\n 'If the failure log shows a network/API failure, do not stop at probing endpoints: use at most two consecutive http_fetch probes, reject 2xx responses with empty or unusable bodies, then patch the real integration and verify with run_program plus run_tests. Do not set done=true while the entrypoint still reports a network/API failure.' +\n (suggestions ? `\\n\\n${suggestions}` : ''),\n executorGlobalBlock: (globalPrompt: string) => `\\n\\n## Project-wide constraints\\n${globalPrompt}`,\n executorStepBlock: (sp: string) =>\n `\\n\\n## Current Step prompt (sole mission — do not drift across steps)\\n${sp}`,\n executorUserPromptOutro: 'Now return the first round of JSON per the protocol.',\n executorFeedbackHeader: 'Tool results this round:',\n executorFeedbackVerifyOk:\n 'outputs verified. If you are done, set done=true and actions=[].',\n executorFeedbackVerifyMissing: (paths: string) =>\n `outputs still missing: ${paths}. Please continue.`,\n },\n skills: {\n patcher: 'Use apply_patch / replace_in_file for small in-place edits to existing files; never overwrite a whole file.',\n author: 'Use write_file to create new files; prefer paths inside the current Step writable allowlist.',\n tester:\n 'Write and run pytest tests verifying function behaviour; on failure parse with analyze_error. ' +\n '[Self-contained fixtures] Tests **must NOT** open() a sample file that does not exist on disk (e.g. \"test.dbc\"); ' +\n 'when the target function needs file input, either use pytest tmp_path to construct content inside the test, ' +\n 'or use write_file to put a fixture under tests/fixtures/<name> — test/DEBUG phases already grant write permission ' +\n 'to that directory, sub-dirs are auto-mkdir\\'d, and **fixture paths do NOT need to be pre-declared in outputs**. ' +\n 'When generating tests, always emit every dependent resource so the Debugger does not loop on FileNotFoundError. ' +\n '[Fixture iteration] If a running test raises \"Invalid syntax / Parse error / Malformed\" from the target function, ' +\n 'your fixture content does not match the format spec: read_file to inspect, write_file to rewrite a minimal valid ' +\n 'sample, then run_tests. Never edit the implementation or assertions to \"fix\" a parse error.',\n dep_resolver: 'On ModuleNotFoundError, use add_dependency to write the package back into requirements.txt and rebuild the sandbox.',\n debugger:\n 'First run_tests / run_python to reproduce the error → analyze_error → patch / replace_in_file to fix → run_tests again. Make the smallest possible change each round. ' +\n '[Network/API failures] Locate the failing URL, try only a small number of replacement API probes, then patch the source and run_program to prove the entrypoint no longer emits API failure. ' +\n '[Important] If replace_in_file on the same file fails ≥ 2 times in a row, switch to read_file and then patch or rewrite within the current runtime chunk limit; stop guessing the find string. ' +\n '[No no-ops] replace_in_file find and replace must differ — if you only want to \"verify\" a snippet, use read_file; do not submit identical-string replacements.',\n refactorer: 'Refactors must preserve behaviour: run regression tests → modify → run regression tests again.',\n },\n doctor: {\n cliDescription: 'check that config / LLM / sandbox / skills are ready',\n optStrict: 'treat warnings as failures (exit non-zero on any warn)',\n header: 'XCompiler environment check',\n sectionConfig: '[config]',\n sectionLLM: '[LLM]',\n sectionSandbox: '[sandbox]',\n sectionSkills: '[skills]',\n summaryOk: 'all checks passed.',\n summaryWarn: (n) => `passed with ${n} warning(s).`,\n summaryFail: (n) => `${n} failure(s) detected.`,\n configLoadOk: (path) => `config loaded: ${path}`,\n configLoadFail: (msg) => `failed to load config: ${msg}`,\n configLocale: (locale) => `locale=${locale}`,\n llmNoProviders: 'no LLM providers defined in config.llm.providers',\n llmProviderListed: (n) => `${n} provider(s) declared`,\n ollamaUnreachable: (baseUrl, msg) => `ollama unreachable @ ${baseUrl} — ${msg}`,\n ollamaReachable: (baseUrl, n) => `ollama reachable @ ${baseUrl} (${n} model(s))`,\n ollamaModelMissing: (provider, model, baseUrl) =>\n `provider \"${provider}\": model \"${model}\" NOT installed on ${baseUrl} (run \\`ollama pull ${model}\\`)`,\n ollamaModelOk: (provider, model) => `provider \"${provider}\": model \"${model}\" available`,\n openaiKeyMissing: (provider) => `provider \"${provider}\": api_key empty (set OPENAI_API_KEY or config.llm.providers.${provider}.api_key)`,\n openaiReachable: (provider, baseUrl) => `provider \"${provider}\": OpenAI endpoint reachable @ ${baseUrl}`,\n openaiUnreachable: (provider, baseUrl, msg) => `provider \"${provider}\": OpenAI endpoint unreachable @ ${baseUrl} — ${msg}`,\n openaiModelListMissing: (provider, model) =>\n `provider \"${provider}\": model \"${model}\" not in /models response (it may still work if your account has access)`,\n providerScoreZero: (provider) => `provider \"${provider}\" disabled (score=0)`,\n roleNoLiveProvider: (role) => `role \"${role}\" has no live provider (no candidate is reachable & enabled)`,\n roleOk: (role, provider) => `role \"${role}\" → ${provider}`,\n sandboxKind: (kind) => `sandbox=${kind}`,\n sandboxNetworkPolicy: (policy, ports) =>\n `network=${policy}` + (ports.length ? ` (expose_ports=[${ports.join(', ')}])` : ''),\n sandboxFullNoPorts:\n 'network=full but no expose_ports configured — host-side cannot reach container services. ' +\n 'Add `agent.sandbox_limits.expose_ports: [<port>]` in config.yaml.',\n sandboxNodeMissing: 'node not found on PATH (required by TypeScript subprocess sandbox)',\n sandboxNodeOk: (version) => `node OK (${version})`,\n sandboxNpmMissing: 'npm not found on PATH (required by TypeScript subprocess sandbox)',\n sandboxNpmOk: (version) => `npm OK (${version})`,\n sandboxNpxMissing: 'npx not found on PATH (required by TypeScript subprocess sandbox)',\n sandboxNpxOk: (version) => `npx OK (${version})`,\n sandboxPythonMissing: 'python3 not found on PATH (required by subprocess sandbox)',\n sandboxPythonOk: (version) => `python3 OK (${version})`,\n sandboxVenvMissing: 'python3 venv module unavailable (install python3-venv / python3-virtualenv)',\n sandboxVenvOk: 'python3 venv module OK',\n sandboxDockerMissing: (bin) => `docker binary \"${bin}\" not found on PATH`,\n sandboxDockerOk: (version) => `docker OK (${version})`,\n sandboxDockerDaemonDown: (msg) => `docker daemon not reachable: ${msg}`,\n sandboxInContainerWarn:\n 'XCompiler appears to be running inside a container; sandbox=docker is unsupported in this mode (use subprocess).',\n skillToolMissing: (skill, tool) => `skill \"${skill}\" references unknown tool \"${tool}\"`,\n skillOk: (n, tools) => `${n} skill(s) registered, ${tools} underlying tool(s)`,\n },\n};\n\nexport default messages;\n","import type { LanguageProfile } from '../core/language.js';\nimport type { Messages } from './types.js';\n\nconst PYTHON_PLANNER_SYSTEM = `你是 XCompiler 系统的 Planner。你的任务是把用户的自然语言需求编译成严格的“迭代模型 + V 模型”Step 计划。\n\n输出语言:仅 Python (plan.language 固定为 \"python\")。\n\n每个可执行迭代周期必须使用标准 V 模型流程:\nREQUIREMENT_ANALYSIS -> HIGH_LEVEL_DESIGN -> DETAILED_DESIGN -> CODE -> UNIT_TEST -> INTEGRATION_TEST -> MODULE_TEST -> FUNCTIONAL_TEST。\nDEBUG 不是正常 V 模型阶段,只是运行时失败回退/修复模式。任意测试阶段失败时,XCompiler 会回退到该测试对应的左侧阶段开始 Debugger 修复,并重新执行后续 V 模型动作。\n\n阶段文档:\n| Phase | 必须输出文件 |\n|---|---|\n| REQUIREMENT_ANALYSIS | \\`docs/01-requirement-analysis.md\\` |\n| HIGH_LEVEL_DESIGN | \\`docs/02-high-level-design.md\\` |\n| DETAILED_DESIGN | \\`docs/03-detailed-design.md\\` |\n| UNIT_TEST | \\`docs/05-unit-test.md\\` |\n| INTEGRATION_TEST | \\`docs/06-integration-test.md\\` |\n| MODULE_TEST | \\`docs/07-module-test.md\\` |\n| FUNCTIONAL_TEST | \\`docs/08-functional-test.md\\` |\n\nP2+ 迭代把同名阶段文档写入 \\`docs/iterations/<iterationId>/\\`。顶层 \\`docs/topic.md\\` 由 xcompiler build 写入,任何 Step 都不得把它列为 outputs。\n\n同步测试设计规则:\n- REQUIREMENT_ANALYSIS 同步输出 \\`docs/tests/functional-test-plan.md\\`。\n- HIGH_LEVEL_DESIGN 同步输出 \\`docs/tests/integration-test-plan.md\\`。\n- DETAILED_DESIGN 同步输出 \\`docs/tests/module-test-plan.md\\`。\n- CODE 同步输出 \\`docs/tests/unit-test-plan.md\\`。\nP2+ 迭代把这些测试计划写到 \\`docs/iterations/<iterationId>/tests/\\`。\n\n阶段职责:\n- REQUIREMENT_ANALYSIS 定义功能范围、验收标准、边界条件和用户可见行为。\n- HIGH_LEVEL_DESIGN 负责架构设计,说明当前开发模块在整体系统中的定位,并定义系统层面的对外接口和依赖,包括外部 API、第三方库选型、依赖确认、数据契约和集成边界。\n- DETAILED_DESIGN 定义模块内部的具体功能实现和架构,包括函数/类、数据结构、算法、控制流、错误处理和内部协作。\n- CODE 只实现已设计范围并产出可运行/可导入的 Python 源码。\n- UNIT_TEST 验证 CODE 的内部函数和公开 API。\n- INTEGRATION_TEST 验证 HIGH_LEVEL_DESIGN 中的外部接口、第三方库、依赖接线和 API/client 边界。\n- MODULE_TEST 验证 DETAILED_DESIGN 中的模块级行为和内部架构。\n- FUNCTIONAL_TEST 按需求端到端验收,并产出面向用户的文档。\n\n功能验收文档包:P1 FUNCTIONAL_TEST outputs 必须包含 \\`README.md\\`、\\`docs/quickstart.md\\`、\\`docs/08-functional-test.md\\`;当 \\`projectType\\` 为 \\`library\\` 或 \\`mixed\\` 时还必须包含 \\`docs/api-guide.md\\`。P2+ 使用 \\`docs/iterations/<iterationId>/08-functional-test.md\\`、\\`quickstart.md\\` 和可选 \\`api-guide.md\\`。文档语言遵循当前 i18n。\n\n强制规则:\n1. 只返回纯 JSON,禁止 Markdown 代码块和解释文字。\n2. 每个 current/planned implementation phase 都是完整 V 模型迭代,必须包含上述 8 个标准阶段。禁止输出旧阶段 REQUIREMENT、ARCH、TASK、TEST、REFACTOR、DELIVERY。\n3. 每个宏 Step 的 \\`subTasks\\` 最多嵌套 2 层;不要为了内部细节拆出大量可执行 Step。\n4. dependsOn 必须按阶段顺序且无环。右侧测试阶段必须直接或间接依赖其对应左侧阶段。\n5. 每个 CODE Step 必须被同迭代的 UNIT_TEST Step 覆盖。\n6. 需求/设计阶段不得输出 src/ 或 tests/ 文件;CODE 产出 src/;测试阶段产出 tests/ 和报告文档;FUNCTIONAL_TEST 不得修改 src/。\n7. outputs 路径全局唯一。DEBUG 运行时可修改依赖链文件,计划 Step 不要重复声明 outputs。\n8. id 形如 S001、S002;role 只能是 Planner / Architect / Coder / Tester / Debugger。\n9. 每个 Step 必须有 systemPrompt,明确范围、输入、产出、验收、禁令,以及左侧阶段的同步测试设计义务。\n10. projectType 由 LLM 在澄清后判定:application / library / mixed,不存在命令行 project-type 覆盖。\n11. complexityAssessment 由 plan 阶段评估:simple => P1;moderate => 至少 P1+P2;complex => 至少 P1+P2+P3。用户明确要求分阶段时必须 userForcedPhaseSplit=true。\n12. implementationPhases 必须包含 P1 current 和后续 planned 可执行迭代;verificationGate 的 failurePolicy 必须说明把失败日志传给 Debugger,回退到对应 V 模型阶段并重新执行后续阶段。\n13. dependencies 是 Python pip 依赖列表;必须包含 \\`pytest\\`;只写裸包名;任何 Step 都不要输出 \\`requirements.txt\\`。\n14. application/mixed 项目需要可直接运行的 Python 入口(\\`src/main.py\\` 或包 \\`__main__.py\\`)并复用 CODE 模块;library/mixed 项目需要稳定公开 API 和 \\`docs/api-guide.md\\`。\n15. 复杂需求必须返回 \\`architectureModules\\`:每个模块包含 id、name、responsibility、sourcePaths、testPaths、dependencies。CODE/MODULE_TEST Step 可覆盖多个模块,但必须在 subTasks 中列出模块级工作。\n\n输出 JSON 形如:\n{\n \"requirementDigest\": \"string\",\n \"globalPrompt\": \"string\",\n \"projectType\": \"application | library | mixed\",\n \"complexityAssessment\": { \"level\": \"simple | moderate | complex\", \"rationale\": \"string\", \"splitRecommended\": true, \"userForcedPhaseSplit\": false },\n \"implementationPhases\": [\n { \"id\": \"P1\", \"title\": \"核心功能\", \"objective\": \"string\", \"status\": \"current\", \"scope\": [\"...\"], \"deliverables\": [\"...\"], \"dependsOn\": [], \"verificationGate\": { \"summary\": \"string\", \"checks\": [\"run tests\", \"probe entrypoint/API\", \"verify functional docs\"], \"failurePolicy\": \"Feed failures to Debugger, roll back to the paired V-model phase, and rerun subsequent phases.\" } }\n ],\n \"dependencies\": [\"pytest\"],\n \"architectureModules\": [\n { \"id\": \"M001\", \"name\": \"模块名\", \"responsibility\": \"单一且明确的模块职责\", \"sourcePaths\": [\"src/example.py\"], \"testPaths\": [\"tests/test_example.py\"], \"dependencies\": [] }\n ],\n \"steps\": [\n {\n \"id\": \"S001\",\n \"iterationId\": \"P1\",\n \"phase\": \"REQUIREMENT_ANALYSIS\",\n \"title\": \"string\",\n \"description\": \"string\",\n \"systemPrompt\": \"本 Step 专属提示:范围、输入、产出、验收、禁令\",\n \"role\": \"Planner\",\n \"tools\": [\"write_file\"],\n \"inputs\": [\"docs/topic.md\"],\n \"outputs\": [\"docs/01-requirement-analysis.md\", \"docs/tests/functional-test-plan.md\"],\n \"subTasks\": [\n { \"id\": \"T1\", \"title\": \"string\", \"description\": \"string\", \"acceptance\": \"string\", \"outputs\": [\"docs/01-requirement-analysis.md\"], \"subTasks\": [] }\n ],\n \"dependsOn\": [],\n \"acceptance\": \"string\",\n \"maxRetries\": 3\n }\n ]\n}`;\n\nconst PYTHON_EXECUTOR_SYSTEM = `你是 XCompiler 的 Step Executor。你只能通过 JSON 工具调用与系统交互,禁止任何 Markdown 或解释性文本。\n\n每一轮你必须返回严格 JSON:\n{\n \"thoughts\": \"<用一句话说明本轮意图>\",\n \"actions\": [ { \"tool\": \"<工具名>\", \"args\": { ... } }, ... ],\n \"done\": true | false\n}\n\n规则:\n1. 仅可调用本 Step 授权的工具白名单。\n2. 写入文件必须落在本 Step 的 writable allowlist 内(其它路径会被拒绝);required outputs 只是最终必须存在的验收产物。\n 对 FUNCTIONAL_TEST 文档产物,必须按当前 i18n 语言写完整声明的文档包:P1 路径如 \\`README.md\\`、\\`docs/quickstart.md\\`、\\`docs/08-functional-test.md\\`,以及 outputs 中出现时的 \\`docs/api-guide.md\\`;P2+ 则写 outputs 声明的 \\`docs/iterations/<iterationId>/\\` 等价路径。任何已声明文档缺失时不得设置 done=true。\n3. 对生成代码遵循目标语言的最佳实践;模块可导入、函数应带合适的类型信息。\n - 【导入约定】src/ 下的模块互相 import 时使用 \"from <module> import ...\"(同级名称),\n **严禁写成 \"from src.<module> import ...\"**。如果 main.py 需要从项目根运行,\n 在 import 之前加一行:sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))),\n 以保证 \"python src/main.py ...\" 和 \"python -m src.main ...\" 两种调用都能走通。\n - 【测试约定】tests/ 下的文件同样以 \"from <module> import ...\" 导入被测模块;\n **XCompiler 已自动生成 tests/conftest.py 把项目根与 src/ 注入 sys.path**,\n 因此 pytest 与 \"python tests/test_*.py\" 两种执行方式都能解析模块,\n 测试文件头部**无需**再写 sys.path.insert(...),避免重复污染。\n 如果 LLM 自己额外创建/编辑 conftest.py,必须保留上面 sys.path 注入逻辑,禁止删除。\n - 【测试自包含】测试**严禁**直接 open() 一个磁盘上不存在的样例文件(如 \"test.dbc\"、\"sample.csv\");\n 当被测函数需要文件输入时,必须二选一:\n (a) 用 pytest 的 tmp_path fixture 在测试函数内 tmp_path.joinpath(\"x.dbc\").write_text(...) 构造内容并传入;\n (b) 用 write_file 把样例写到 tests/fixtures/<name>——测试/DEBUG 阶段 tests/fixtures/ 已默认放开写权限,\n 子目录会自动 mkdir -p,**无需**提前在 outputs 登记 fixture 路径。\n 绝不允许出现\"测试代码引用了一个谁都没创建的文件\"——这会让 Debugger 反复 FileNotFoundError 死循环。\n - 【fixture 迭代】当测试已经能运行但被测函数报\"Invalid syntax / Parse error / Malformed\"等解析失败错误,\n 说明 fixture 文件本身格式不合法(DBC/CSV/JSON/...),**不是被测代码的 bug**。\n 必须 read_file 看清当前 fixture 内容 → write_file 按目标格式的最小合法样例**整文件重写** → 再 run_tests。\n 严禁因为解析错误就去改被测模块、测试断言或 mock 掉解析逻辑——先把 fixture 修对再说。\n4. 当所有 outputs 文件均已生成且自检通过,把 done 设为 true 且 actions 为空。\n5. 任何错误都通过下一轮的 actions 修正;不要尝试越权或捏造工具。\n6. 【大文件拆块写入】write_file / append_file 单次 content 必须低于工具文档展示的当前 Step 运行时 chunk limit。\n - 超过时请拆分:同一轮 actions 里先一个 write_file 写首段(import + 顶层常量 + 第一个函数/类),\n 紧跟多个 append_file 逐段追加(按函数/类边界切块,每段收尾保留换行)。\n - 复杂工程优先拆成多个内聚模块/文件,并用独立 CODE/UNIT_TEST/INTEGRATION_TEST/MODULE_TEST/FUNCTIONAL_TEST Step 增量推进,不要写一个巨型万能文件。\n - 拆分必须保证拼接后仓 Python 语法合法;严禁在函数体中间拆断。\n - 对已存在文件的局部修改使用 replace_in_file / apply_patch,不要重复覆盖整个文件。`;\n\nconst TYPESCRIPT_PLANNER_SYSTEM = `你是 XCompiler 系统的 Planner。你的任务是把用户的自然语言需求编译成严格的“迭代模型 + V 模型”Step 计划。\n\n输出语言:仅 TypeScript / Node.js(plan.language 固定为 \"typescript\")。\n\n每个可执行迭代周期必须使用标准 V 模型流程:\nREQUIREMENT_ANALYSIS -> HIGH_LEVEL_DESIGN -> DETAILED_DESIGN -> CODE -> UNIT_TEST -> INTEGRATION_TEST -> MODULE_TEST -> FUNCTIONAL_TEST。\nDEBUG 只是运行时失败回退/修复模式。任意测试阶段失败时,XCompiler 会回退到该测试对应的左侧阶段并重新执行后续阶段。\n\n沿用 Python Planner 的阶段文档和同步测试设计规则:\n- REQUIREMENT_ANALYSIS:\\`docs/01-requirement-analysis.md\\` + \\`docs/tests/functional-test-plan.md\\`。\n- HIGH_LEVEL_DESIGN:\\`docs/02-high-level-design.md\\` + \\`docs/tests/integration-test-plan.md\\`。\n- DETAILED_DESIGN:\\`docs/03-detailed-design.md\\` + \\`docs/tests/module-test-plan.md\\`。\n- CODE:实现产物 + \\`docs/tests/unit-test-plan.md\\`。\n- UNIT_TEST:\\`docs/05-unit-test.md\\`。\n- INTEGRATION_TEST:\\`docs/06-integration-test.md\\`。\n- MODULE_TEST:\\`docs/07-module-test.md\\`。\n- FUNCTIONAL_TEST:\\`docs/08-functional-test.md\\`、\\`README.md\\`、\\`docs/quickstart.md\\`,library/mixed 还要 \\`docs/api-guide.md\\`。\nP2+ 迭代把阶段文档写到 \\`docs/iterations/<iterationId>/\\`,测试计划写到 \\`docs/iterations/<iterationId>/tests/\\`。\n\nHIGH_LEVEL_DESIGN 必须说明当前开发模块在整体系统中的定位,并定义系统层面的对外接口和依赖,包括外部 API、第三方库选型、依赖确认、package.json scripts、dependencies/devDependencies、tsconfig、数据契约和集成边界。\nDETAILED_DESIGN 必须定义模块内部具体功能实现和架构,包括函数/类型、数据结构、算法、控制流、错误处理和内部协作。\n\n强制规则:\n1. 只返回纯 JSON。禁止输出旧阶段 REQUIREMENT、ARCH、TASK、TEST、REFACTOR、DELIVERY。\n2. 每个 current/planned implementation phase 都必须包含完整 8 阶段 V 模型。\n3. 每个宏 Step 的 \\`subTasks\\` 最多嵌套 2 层。\n4. 每个 CODE Step 必须被同迭代 UNIT_TEST 覆盖;architectureModules 的 testPaths 必须由 MODULE_TEST 产出。\n5. 设计阶段不得输出 src/ 或 tests/ 文件;HIGH_LEVEL_DESIGN 是唯一可输出 \\`package.json\\` / \\`tsconfig.json\\` 的阶段。\n6. TypeScript greenfield 计划必须且只能有一个 HIGH_LEVEL_DESIGN Step 输出 \\`package.json\\`,并确保 one HIGH_LEVEL_DESIGN Step output \\`package.json\\`,包含 \\`build\\`、\\`test\\`、最好还有 \\`lint\\` 脚本。\n7. 本地 TypeScript 源码模块必须使用带显式 \\`.ts\\` 后缀的 ESM 相对导入;配置 \\`allowImportingTsExtensions: true\\`,build/lint 使用 \\`tsc --noEmit\\`。代码必须兼容 Node 原生 type stripping,避免 enum、namespace、参数属性等需转译语法。\n8. dependencies 只是运行时 npm 包建议;真正依赖清单以 HIGH_LEVEL_DESIGN 产出的 \\`package.json\\` 为准,不要编造包名。\n9. application/mixed 需要 \\`src/main.ts\\` 且可直接 \\`node src/main.ts --help\\`;library/mixed 需要 \\`src/index.ts\\` 或等价公共 API 并写 API Guide。\n10. complexityAssessment 和 implementationPhases 规则同 Python:simple=>P1,moderate => 至少 P1+P2,complex => 至少 P1+P2+P3,用户强制分阶段时 userForcedPhaseSplit=true。\n11. verificationGate failurePolicy 必须说明把失败日志传给 Debugger,回退到对应 V 模型阶段并重跑后续阶段。\n12. 复杂需求返回 architectureModules;CODE/MODULE_TEST Step 可覆盖多个模块,但必须在 subTasks 中列出模块级工作。\n\n输出 JSON 结构同 Python,必须包含 \\`\"projectType\": \"application | library | mixed\"\\`,路径使用 \\`src/example.ts\\` 和 \\`tests/example.test.ts\\`;第一个 Step phase 必须是 \\`REQUIREMENT_ANALYSIS\\`,不是 \\`REQUIREMENT\\`。不存在命令行 project-type 覆盖。`;\n\nconst TYPESCRIPT_EXECUTOR_SYSTEM = `你是 XCompiler 的 Step Executor。你只能通过 JSON 工具调用与系统交互,禁止任何 Markdown 或解释性文本。\n\n每一轮你必须返回严格 JSON:\n{\n \"thoughts\": \"<用一句话说明本轮意图>\",\n \"actions\": [ { \"tool\": \"<工具名>\", \"args\": { ... } }, ... ],\n \"done\": true | false\n}\n\n规则:\n1. 仅可调用本 Step 授权的工具白名单。\n2. 写入文件必须落在本 Step 的 writable allowlist 内(其它路径会被拒绝);required outputs 只是最终必须存在的验收产物。\n 对 FUNCTIONAL_TEST 文档产物,必须按当前 i18n 语言写完整声明的文档包:P1 路径如 \\`README.md\\`、\\`docs/quickstart.md\\`、\\`docs/08-functional-test.md\\`,以及 outputs 中出现时的 \\`docs/api-guide.md\\`;P2+ 则写 outputs 声明的 \\`docs/iterations/<iterationId>/\\` 等价路径。任何已声明文档缺失时不得设置 done=true。\n3. 生成代码必须符合 TypeScript / Node.js 最佳实践;API 要有类型,运行代码必须能直接执行。\n - 【导入约定】src/ 下的本地源码模块使用带显式 \".ts\" 后缀的 ESM 相对导入,例如 \\`import { x } from \"./util.ts\";\\`。代码必须兼容 Node 原生 TypeScript type stripping:只使用可擦除类型语法,避免 enum、namespace、参数属性等需要转译的 TS 特性。禁止使用 Python 风格 import、\\`from src.<module>\\` 或任何 sys.path hack。\n - 【测试约定】测试使用 Vitest:\\`import { describe, it, expect } from \"vitest\";\\`,测试文件放在 \\`tests/**/*.test.ts\\`。\n - 【测试自包含】测试**严禁**读取一个磁盘上不存在的样例文件;当被测函数需要文件输入时,要么在测试里构造内容,要么写入 \\`tests/fixtures/<name>\\`。\n - 【fixture 迭代】当测试已经能运行但被测函数报\"Invalid syntax / Parse error / Malformed\"等解析失败错误,说明 fixture 文件本身格式不合法。必须 read_file 看清当前 fixture 内容 → write_file 按目标格式的最小合法样例整文件重写 → 再 run_tests。严禁因为解析错误去弱化实现或断言。\n4. 当所有 outputs 文件均已生成且自检通过,把 done 设为 true 且 actions 为空。\n5. 任何错误都通过下一轮的 actions 修正;不要尝试越权或捏造工具。\n6. 【大文件拆块写入】write_file / append_file 单次 content 必须低于工具文档展示的当前 Step 运行时 chunk limit。\n - 超过时请拆分:同一轮 actions 里先一个 write_file 写首段(import + 顶层常量 + 第一个函数/类),紧跟多个 append_file 逐段追加。\n - 复杂工程优先拆成多个内聚模块/文件,并用独立 CODE/UNIT_TEST/INTEGRATION_TEST/MODULE_TEST/FUNCTIONAL_TEST Step 增量推进,不要写一个巨型万能文件。\n - 拆分必须保证拼接后 TypeScript 语法合法;严禁在函数体中间拆断。\n - 对已存在文件的局部修改使用 replace_in_file / apply_patch,不要重复覆盖整个文件。\n7. package.json 是依赖清单。新增 npm 包要用 add_dependency,禁止去写 requirements.txt。\n8. run_program 会通过 \\`npx tsx\\` 运行入口,run_tests 会通过 \\`npm test\\` 跑 Vitest,最终交付门禁还会验证 direct Node 入口命令。`;\n\nfunction buildPlannerSystem(profile: LanguageProfile): string {\n return (profile.id === 'typescript' ? TYPESCRIPT_PLANNER_SYSTEM : PYTHON_PLANNER_SYSTEM) + profile.plannerPromptOverride;\n}\n\nfunction buildExecutorSystem(profile: LanguageProfile): string {\n return (profile.id === 'typescript' ? TYPESCRIPT_EXECUTOR_SYSTEM : PYTHON_EXECUTOR_SYSTEM) + profile.executorPromptOverride;\n}\n\nconst messages: Messages = {\n llm: {\n coderDebuggerSameModel: (model, coderProvider, debuggerProvider) =>\n `模型配置建议:Coder(${coderProvider})和 Debugger(${debuggerProvider})当前都使用 ${model}。建议配置不同模型,让调试阶段获得独立的推理路径。`,\n invalidBaseUrl: (raw, fallback) => `[xcompiler] base_url 无效(${raw}),回退到 ${fallback}`,\n providerValidationFailed: (role, model) => `[${role}] provider ${model} 输出验证失败,切换到下一个`,\n providerCallFailed: (role, model) => `[${role}] provider ${model} 调用失败,切换到下一个`,\n scoreReadFailed: (p, message) => `读取 ${p} 失败:${message}`,\n scoreChanged: (provider, score, previous) => `评分(${provider})=${score}(原值 ${previous})`,\n scorePersistFailed: (message) => `持久化评分失败:${message}`,\n preflightOllamaReachable: (baseUrl, models) => `预检:Ollama ${baseUrl} 可达,发现 ${models} 个模型`,\n preflightOllamaUnreachable: (baseUrl, message) => `预检:Ollama ${baseUrl} 不可达:${message}`,\n preflightAutoAdded: (providers, roles) => `预检:自动增加 ${providers} 个 provider,覆盖角色 [${roles}]`,\n scoreFileHeader: '# XCompiler LLM provider 评分快照(由 ScoreStore 自动维护,请勿手工编辑)',\n scoreFileSemantics: '# 评分语义:默认 1.0;失败 -0.5(下限 0=禁用);成功 +0.1(上限 10)。',\n },\n system: {\n configEnvMissing: (names) => `[xcompiler] 配置中的环境变量未设置,已替换为空字符串:${names}`,\n unhandledError: (message) => `未处理错误:${message}`,\n unsupportedPypiOnlyNetwork:\n '拒绝 network=pypi-only:Docker 本身无法可靠执行“仅 PyPI”域名白名单。需要隔离请使用 network=off;明确允许任意出站下载时使用 network=download-only。',\n dockerInsideContainerUnsupported:\n '检测到 XCompiler 运行在容器内,sandbox=docker 可能导致 bind-mount 路径及 docker.sock 权限错位,因此不受支持。请使用 agent.sandbox=subprocess、改在宿主机运行,或仅在受控环境设置 XC_IN_CONTAINER=0。',\n firejailUnsupported: '尚未实现 sandbox=firejail,请使用 subprocess 或 docker。',\n smokeHeader: (baseUrl) => `正在对 ${baseUrl} 执行流式冒烟测试`,\n smokeOk: (model, totalMs, firstTokenMs, chunks, preview) =>\n `[成功 总耗时=${totalMs}ms 首Token=${firstTokenMs}ms 分块=${chunks}] ${model} -> ${preview}`,\n smokeFail: (model, message) => `[失败] ${model} -> ${message}`,\n },\n plugins: {\n invalidId: (id) => `插件 ID“${id}”无效;仅允许小写字母、数字、点、连字符或下划线。`,\n duplicateId: (id) => `插件 ID 重复:${id}`,\n invalidVersion: (plugin, version) => `插件 ${plugin} 的版本不是有效 SemVer:${version}`,\n invalidCoreVersion: (version) => `XCompiler 核心版本不是有效 SemVer:${version}`,\n apiVersionMismatch: (plugin, actual, expected) => `插件 ${plugin} 面向 Plugin API ${actual},当前 XCompiler 运行时要求 API ${expected}。`,\n invalidMinimumVersion: (plugin, version) => `插件 ${plugin} 声明的最低 XCompiler 版本无效:${version}`,\n coreVersionTooOld: (plugin, minimum, actual) => `插件 ${plugin} 要求 XCompiler >= ${minimum},当前版本为 ${actual}。`,\n loaded: (plugin, version) => `插件 ${plugin}@${version} 已加载。`,\n extensionConflict: (plugin, kind, name) => `插件 ${plugin} 不能覆盖已有 ${kind} “${name}”。`,\n hookFailed: (plugin, stage, message) => `插件 ${plugin} 在 ${stage} 阶段执行失败:${message}`,\n manifestReadFailed: (path, message) => `无法读取插件清单 ${path}:${message}`,\n moduleLoadFailed: (plugin, path, message) => `无法从 ${path} 加载插件 ${plugin}:${message}`,\n exportInvalid: (plugin, exportName) => `插件 ${plugin} 的导出 ${exportName} 不是有效 XCompiler 插件`,\n manifestMismatch: (plugin) => `插件 ${plugin} 的运行时清单与预检清单不一致`,\n },\n audit: {\n processLogTitle: '# XCompiler 开发过程记录',\n processLogPreamble: '> 由 XCompiler 自动生成,记录 CLI 会话、用户输入、LLM 交互与执行动作,用于交付追踪。',\n sessionStart: (ts, command) => `## ▶ 会话 ${ts} — \\`${command}\\``,\n sessionEnd: (ts) => `### ◀ 会话结束 ${ts}`,\n eventSessionStart: (command) => `启动 ${command}`,\n eventSessionEnd: (command) => `结束 ${command}`,\n userInput: (label) => `#### 👤 用户输入 — ${label}`,\n llmRequest: (role, model) => `🤖 LLM 请求 — <code>${role}</code> 使用 <code>${model}</code>`,\n llmResponse: (role, model) => `📩 LLM 响应 — <code>${role}</code> 使用 <code>${model}</code>`,\n executorTurn: (stepId, round, role, provider, actions, done) =>\n `🧠 执行轮次 — <code>${stepId}</code> 第 ${round} 轮 / 角色 <code>${role}</code>${provider ? ` · 使用 <code>${provider}</code>` : ''}(actions=${actions}, done=${done})`,\n thoughtsLabel: '**思考:**',\n actionsLabel: '**动作:**',\n noThoughts: '(无思考内容)',\n plannerThought: (stage, provider) => `🧩 Planner 思考 — ${stage}${provider ? ` · 使用 <code>${provider}</code>` : ''}`,\n markdownAppendFailed: (message) => `[audit] Markdown 追加失败:${message}`,\n jsonlAppendFailed: (message) => `[audit] JSONL 追加失败:${message}`,\n traceLine: (kind, message) => `[audit] ${kind} ${message}`,\n autoFixedSrcImport: (p) => `已自动修复 ${p} 中的 src import`,\n wroteFile: (p) => `已写入 ${p}`,\n userDecision: (label, value) => `${label} → ${value}`,\n eventLlmRequest: (role, model) => `${role} → ${model}`,\n eventLlmResponse: (role, model) => `${role} ← ${model}`,\n eventLlmError: (role, model, message) => `${role} 使用 ${model}:${message}`,\n eventExecutorTurn: (stepId, round, role, provider) => `${stepId} 轮次=${round} 角色=${role}${provider ? ` 使用 ${provider}` : ''}`,\n eventPlannerThought: (stage, provider) => `Planner ${stage}${provider ? ` 使用 ${provider}` : ''}`,\n llmChatFailedThought: (message) => `LLM 调用失败:${message}`,\n llmChatAborted: (stepId, round, chars, message) => `${stepId} 第 ${round} 轮在收到 ${chars} 字符后中止:${message}`,\n toolDenied: (tool) => `拒绝调用工具 ${tool}`,\n toolCalled: (tool) => `调用工具 ${tool}`,\n toolResult: (tool, ok, detail) => `工具 ${tool}${ok ? '执行成功' : '执行失败'}:${detail}`,\n documentArchived: (from, to) => `已归档 ${from} → ${to}`,\n documentArchiveFailed: (p, message) => `归档 ${p} 失败:${message}`,\n httpFetchSaved: (method, url, p, bytes) => `http_fetch ${method} ${url} → ${p}(${bytes} 字节)`,\n httpFetchResponse: (method, url, status, bytes) => `http_fetch ${method} ${url} → ${status}(${bytes} 字节)`,\n partialFailureHeader: (message) => `# LLM 调用失败:${message}`,\n streamLength: (chars) => `# 流式响应长度:${chars} 字符`,\n },\n stream: {\n resolvingModel: '正在解析模型',\n waiting: '等待响应',\n streaming: '流式响应',\n done: '完成',\n failed: '失败',\n chars: (n) => `${n} 字符`,\n toolRunner: '本地工具',\n toolExecution: (stepId, tool) => `${stepId} 工具 ${tool}`,\n },\n sandboxLog: {\n subprocessBuilt: (deps) => `子进程沙箱已构建(${deps ? '含依赖' : '空环境'})`,\n subprocessNodeBuilt: 'Node 子进程沙箱已构建(npm install)',\n dockerBuilt: (deps) => `Docker 沙箱已构建(${deps ? '含依赖' : '空环境'})`,\n dockerNodeBuilt: 'Docker Node 沙箱已构建(npm install)',\n command: (runtime, command) => `${runtime} ${command}`,\n },\n cli: {\n rootDescription: 'XCompiler — AI Software Factory CLI',\n compileDescription: '交互式编译需求为 plan.json(含强制人工确认)',\n runDescription: '执行已确认的 plan.json(支持分阶段运行:--phase / --from)',\n loadDescription: '加载 XXX.xc 工程文件并继续当前 plan',\n appendDescription: '在已有 XXX.xc 工程基础上追加新需求,并重新走澄清与 V 模型执行',\n lsDescription: '扫描 workspace 列出所有 plan.json 状态摘要',\n showDescription: '打印 Step 定义 / 状态 / 产物 / 最近审计',\n optWorkspace: 'workspace 目录(同 --output,默认为当前目录)',\n optOutput: '工程/workspace 输出目录(优先级最高,等价于 -w)',\n optConfig: 'config.yaml 路径',\n optInput: '从需求文件读取(非交互)',\n optTopic: '直接使用已澄清的 topic.md 作为输入:跳过 intake / clarify / Addenda / Gate 1,直接进入 decompose',\n optPlanOut: '指定 plan.json 输出文件(默认 <workspace>/plan.json)',\n optBaseDir: '项目输出根目录(在其下创建 <name> 子目录)',\n optName: '项目名(默认 xcompiler-<时间戳>)',\n optYes: '跳过人工确认(仅在 -i / -t 提供时有意义)',\n optForce: '强制重新生成:覆写 workspace 锁、忽略旧 plan.json',\n optDryRun: '仅打印拓扑顺序,不执行',\n optFrom: '从指定 Step 开始(之前的跳过)',\n optPhase: '仅执行指定 phase(REQUIREMENT_ANALYSIS/HIGH_LEVEL_DESIGN/DETAILED_DESIGN/CODE/UNIT_TEST/INTEGRATION_TEST/MODULE_TEST/FUNCTIONAL_TEST/DEBUG)',\n optReset: '重置所有 Step 状态为 PENDING',\n optMaxDepth: '递归最大深度',\n optTail: '最近审计条数',\n optPlan: 'plan.json 路径,默认 <workspace>/plan.json',\n optLang: 'UI / 提示词语言:EN | CN(ISO 3166-1 Alpha-2)',\n optIntent: '计划意图:greenfield | feature | refactor | self',\n optBaselinePlan: '已有基线 plan.json 路径(默认 <workspace>/plan.json)',\n optProjectFile: 'XXX.xc 工程文件路径(默认 <workspace>/<name>.xc)',\n argPlan: 'plan.json 路径(默认 = <workspace>/plan.json)',\n argProjectFile: 'XXX.xc 工程文件',\n argStepId: 'Step ID,如 S001',\n evolveDescription: '在现有 workspace 基础上生成并执行增量 feature/refactor 计划',\n bootstrapDescription: '在隔离 Git worktree 中构建并验证下一代 XCompiler',\n optRepository: '要执行自举的 XCompiler Git 仓库(默认当前目录)',\n optPromote: '全部质量门通过后,快进合并到当前分支',\n optCleanup: '写入报告后删除隔离 worktree(保留候选分支)',\n optDockerQualification: '使用尚处于实验阶段的 Docker 环境执行候选质量门',\n invalidLocale: (value) => `不支持的语言“${value}”,请使用 EN 或 CN。`,\n invalidIntent: (value, allowed) => `无效 intent“${value}”,可选值:${allowed}。`,\n invalidPhase: (value, allowed) => `无效阶段“${value}”,可选值:${allowed}。`,\n invalidStepId: (value) => `无效 Step ID“${value}”,格式应为 S 加至少三位数字。`,\n invalidNonNegativeInteger: (value) => `参数必须是非负整数,当前值为“${value}”。`,\n helpUsage: '用法:',\n helpArguments: '参数:',\n helpOptions: '选项:',\n helpCommands: '命令:',\n helpOption: '显示命令帮助',\n versionOption: '输出版本号',\n defaultValue: (value) => `(默认值:${value})`,\n },\n bootstrap: {\n notGitRepository: (p) => `不是 Git 仓库:${p}`,\n dirtyRepository: (files) => `功能自举要求宿主仓库保持干净,待处理路径:${files}`,\n worktreeReady: (p, branch) => `自举 worktree 已就绪:${p}(${branch})`,\n compileStarted: '正在编译自举 V 模型计划…',\n compileFailed: (code, message) => `自举计划编译失败(exit=${code}):${message}`,\n compileCancelled: '自举计划尚未确认,已取消执行。',\n executeStarted: '正在隔离 worktree 中执行候选版本…',\n executeFailed: (status) => `候选版本执行未成功完成(${status})。`,\n qualificationStarted: '正在执行确定性自举质量门…',\n qualificationDockerExperimental: 'Docker 质量门环境尚未完成验证,本次按显式选项以实验模式执行。',\n missingScript: (name) => `package.json 缺少必选脚本:${name}`,\n missingBin: 'package.json 未声明 CLI bin 入口',\n checkPassed: (name, ms) => `${name} 通过(${ms}ms)`,\n checkFailed: (name, code) => `${name} 失败(exit=${code})`,\n reportWritten: (p) => `自举报告已写入:${p}`,\n candidateReady: (branch) => `候选版本已在 ${branch} 通过验证;仍需显式使用 --promote 才会晋级。`,\n promoted: (branch) => `候选版本已通过快进合并完成晋级:${branch}`,\n cleanupDone: (p) => `自举 worktree 已删除:${p}`,\n promotionBlocked: '存在未通过的质量门,禁止晋级候选版本。',\n hostHeadChanged: '自举期间宿主 HEAD 已变化',\n candidateDirty: (files) => `候选 worktree 存在未提交变更:${files}`,\n candidateStatusUnknown: '(未知路径)',\n candidateMoved: (expected, actual) => `质量门之后候选提交发生漂移(预期 ${expected},实际 ${actual})。`,\n candidateNotBasedOnBase: (candidate, base) => `候选提交 ${candidate} 不是自举基线 ${base} 的后代。`,\n promotionVerificationFailed: (expected, actual) => `晋级后 HEAD 校验失败(预期 ${expected},实际 ${actual})。`,\n reportTitle: 'XCompiler 功能自举报告',\n reportNone: '(无)',\n reportNextQualified: (repository, candidateCommit) => `git -C \"${repository}\" merge --ff-only \"${candidateCommit}\"`,\n reportNextPromoted: '使用已晋级版本执行下一轮功能自举。',\n reportNextFailed: '检查候选 worktree,修复失败质量门后再晋级。',\n reportLabels: {\n status: '状态', repository: '仓库', baseCommit: '基线提交',\n candidateCommit: '候选提交', branch: '候选分支', worktree: '隔离工作区',\n createdAt: '创建时间', checks: '质量门', changedFiles: '变更文件',\n nextStep: '下一步',\n },\n },\n compile: {\n workspaceReady: (p) => `工作区:${p}`,\n forceOverride: '--force:覆盖工作区锁并重新生成计划。',\n topicInputConflict: '同时提供了 --topic 和 --input;优先使用 --topic,忽略 --input。',\n auditTopicInput: 'topic.md(--topic)',\n auditOriginalRequirement: '原始需求(Intake)',\n auditUserAddenda: '用户补充需求',\n auditEditedTopic: '已编辑 topic.md',\n auditTopicPersisted: (p) => `topic.md 已写入:${p}`,\n auditDecomposeFailed: 'planner.decompose 失败',\n lintIssue: (id, message) => ` - [${id}] ${message}`,\n planPreviewTruncated: '…(已截断,完整内容见 docs/plan.md)',\n auditPlanPersisted: (p) => `plan.json 已写入:${p}`,\n projectFileWritten: (p) => `工程文件已更新:${p}`,\n nextCommand: (command) => ` 下一步:${command}`,\n topicEmptyExit: '--topic 文件为空,已退出。',\n topicLoaded: (p) => `已加载 topic:${p}(跳过 intake / clarify / Gate 1)`,\n requirementEmptyExit: '需求为空,已退出。',\n requirementInputHint: '请描述你的需求(多行,输入空行结束):',\n spinClarify: 'Planner 正在澄清需求…',\n clarifySucceed: (n) => `澄清问题:${n} 条`,\n clarifyFail: '澄清失败',\n clarifyChoiceHint: (range) => `输入 ${range} 选择已展示选项,或直接输入自定义回答内容。`,\n addendaConfirm: '是否有补充需求要追加?(会连同澄清一起发给 Planner,并保留在 plan.userAddenda 字段)',\n addendaEditorMsg: '输入自定义补充需求(多行、Markdown 可)',\n auditClarifyAnswer: (qid, q) => `澄清回答 ${qid}: ${q}`,\n spinDecompose: 'Planner 正在按 V 模型拆解…',\n decomposeFail: 'Planner 拆解失败',\n plannerInvalidPlan: 'Planner 无法生成有效 plan:',\n plannerInvalidPlanHint1: ' 常见原因:所有 LLM provider 都返回了非法/截断 JSON(如 token loop)。',\n plannerInvalidPlanHint2: ' 排查:检查 .xcompiler/audit.jsonl 中的 llm.error / planner.thought 原文。',\n decomposeSucceed: (n) => `已生成 ${n} 个 Step`,\n schemaFail: 'Plan schema 校验失败:',\n schemaInvalidSavedAt: (p) => ` 完整 plan 已落盘:${p}`,\n lintFail: (n) => `Plan lint 失败(${n}):`,\n topicPreviewHeader: '─── topic.md (preview) ───',\n topicPreviewFooter: '──────────────────────────────',\n gate1Confirm: '需求是否符合预期?',\n gate1ChoiceConfirm: '✅ confirm — 进入计划生成',\n gate1ChoiceEdit: '✏️ edit — 打开编辑器修改',\n gate1ChoiceCancel: '❌ cancel — 放弃本次会话',\n gate1AuditLabel: '需求确认门 (Gate 1)',\n gate1Cancelled: '已取消,未写入任何文件。',\n editTopicMsg: '编辑 topic.md',\n topicWritten: (p) => `已写入 ${p}`,\n planWritten: (p) => `plan 已写入 ${p}`,\n planPreviewHeader: '─── plan.md (preview) ───',\n planPreviewFooter: '─────────────────────────',\n gate2Confirm: '是否确认该计划? (此为最终确认,确认后将写入 plan.json)',\n gate2AuditLabel: '计划确认门 (Gate 2)',\n gate2Rejected: '未确认,已放弃。plan.json 未写入。',\n baselineLoaded: (kind, sources) => `已加载 ${kind} 基线:${sources}`,\n baselineMissing: (workspace) => `增量模式需要在 ${workspace} 中找到已有工程基线(topic / docs / plan / src)。`,\n baselineLanguageOverride: (baseline, source, configured) =>\n `增量模式将沿用基线语言 ${baseline}(来源:${source}),而不是配置中的 ${configured}。`,\n topicTitle: '# Project Topic (项目选题)',\n topicPreamble: '> 本文件是需求澄清后冻结的项目选题,后续 V 模型拆解与所有阶段产出皆以本文件为唯一需求输入。',\n topicSecRequirement: '## 原始需求',\n topicSecClarify: '## 澄清记录',\n topicSecAddenda: '## 用户补充需求 (Addenda)',\n topicSecBaseline: '## 现有工程基线',\n },\n inspect: {\n noPlanFound: '未找到任何 plan.json',\n digestLabel: 'digest:',\n stepNotFound: (id) => `Step ${id} 未找到`,\n secDescription: '— description —',\n secAcceptance: '— acceptance —',\n secSubtasks: '— subtasks —',\n secSystemPrompt: '— systemPrompt —',\n secOutputs: '— outputs —',\n secRecentAudit: (n) => `— recent audit (${n}) —`,\n planHeader: (p, language) => `${p} 语言=${language}`,\n planStatusSummary: (total, done, pending, failed, skipped, running) =>\n `步骤=${total} 完成=${done} 待执行=${pending} 失败=${failed} 跳过=${skipped} 运行中=${running}`,\n planReadFailed: (p, message) => `${p} — ${message}`,\n stepHeader: (id, phase, title, status, retries, maxRetries) => `${id} ${phase} ${title} ${status} 重试=${retries}/${maxRetries}`,\n stepRoleTools: (role, tools) => `角色=${role} 工具=[${tools}]`,\n stepDependsOn: (ids) => `依赖:${ids}`,\n outputStatus: (exists, p) => `${exists ? '✓' : '✗'} ${p}`,\n auditEntry: (ts, kind, message) => `${ts} ${kind} ${message}`,\n },\n execute: {\n forceReset: '--force:重置所有 Step 为 PENDING,并覆盖工作区锁。',\n manifestRecalibrated: (p) => `已重新校准 ${p}(移除版本锁和幻觉包名)`,\n manifestSeeded: (p) => `已根据 plan.dependencies 生成 ${p}`,\n auditPlanLoaded: (p) => `已加载 plan:${p}`,\n planLoaded: (p) => `已加载 Plan:${p}`,\n planSummary: (language, steps) => ` 语言=${language},步骤=${steps}`,\n preflightModelMissing: (names) => `LLM preflight: 模型缺失,已禁用 [${names}]`,\n preflightAutoAdded: (n) => `LLM preflight: 自动注入 ${n} 个 provider(来自 ollama /api/tags)`,\n runInterrupted: (id, e, total) => `执行中断于 ${id}(已执行 ${e}/${total})`,\n runReasonLabel: ' 原因: ',\n runFailureLogHeader: ' --- 详细失败日志(tail 40 行) ---',\n runAllDone: (e, total) => `Plan 全部完成(${e}/${total})`,\n projectAuditSummary: (errors, warnings) => `项目审计:${errors} 个错误,${warnings} 个警告`,\n projectMemoryRefreshFailed: (message) => `项目记忆刷新失败:${message}`,\n projectAuditCheck: (name, summary) => `[审计:${name}] ${summary}`,\n auditDocPresent: (p) => `${p} 存在`,\n auditDocMissing: (p) => `缺少 ${p}`,\n auditDeliveryDocPresent: '交付文档存在',\n auditDeliveryDocMissing: '缺少 docs/08-functional-test.md',\n auditTestFilesFound: (count) => `发现 ${count} 个有效测试文件`,\n auditTestFilesMissing: 'tests/ 下没有有效测试文件',\n auditEntrypointOk: (command) => `入口验证通过:${command}`,\n auditEntrypointFailed: (command) => `入口验证失败:${command}`,\n auditPackageJsonMissing: '缺少 package.json',\n auditScriptMissing: (name) => `package.json 缺少 ${name} 脚本`,\n auditCommandOk: (name) => `${name} 通过`,\n auditCommandFailed: (name, exitCode, timedOut) =>\n `${name} 失败(exit=${exitCode}${timedOut ? ',超时' : ''})`,\n },\n engine: {\n spinSandboxBuild: (profile) =>\n profile.id === 'typescript'\n ? `构建沙盒(npm install,${profile.manifestFile})…`\n : `构建沙盒(pip install -r ${profile.manifestFile})…`,\n sandboxReady: (r) => `沙盒就绪:${r}`,\n stepSkipDone: (id, phase) => ` ↪ ${id} ${phase} 已完成,跳过`,\n spinSandboxRebuild: (id, profile) =>\n profile.id === 'typescript'\n ? `Step ${id} 写入 ${profile.manifestFile},重建 npm 沙盒…`\n : `Step ${id} 写入 ${profile.manifestFile},重建 pip 沙盒…`,\n sandboxStatus: (r) => `沙盒:${r}`,\n autoFixedSrcImports: (n, files) => ` ⚠ auto-fixed sys.path bootstrap in ${n} 个入口文件:${files}`,\n debugResumeNotice: (id, n) => ` ↻ ${id} 检测到上次会话以 FAILED 结束(已累积 ${n} 次尝试),本次首轮直接进入 Debugger 模式。`,\n spinDebugRetry: (id, attempt, budget, cap, reason) => `🛠 ${id} DEBUG retry ${attempt}/${budget} (cap=${cap}) — ${reason}`,\n retryException: (a, b, msg) => `retry ${a}/${b} 抛出异常:${msg}`,\n fixSucceeded: (id, a) => `${id} 修复成功 (retry=${a})`,\n retryHealthyButFailed: (a, before, b, tag, reason) =>\n `retry ${a}/${before}→${b} 仍失败但健康(扩窗) · ${tag} · ${reason}`,\n retryLowQuality: (a, before, b, tag, reason) =>\n `retry ${a}/${before}→${b} 低质量输出(缩窗) · ${tag} · ${reason}`,\n retryStillFailed: (a, b, tag, reason) => `retry ${a}/${b} 仍失败 · ${tag} · ${reason}`,\n earlyAbortLowQuality: (id, n) => ` ⚡ ${id} 检测到连续 ${n} 次低质量 LLM 输出(解析失败/重复 actions/无进展),快速终止 DEBUG 重试`,\n stepFinalFailed: (id, phase, role) => `✖ Step ${id} (${phase} / ${role}) 最终失败`,\n finalAttemptsLine: (a, b, c, ea) =>\n ` attempts=${a} final_budget=${b} cap=${c}` + (ea ? ' (early-abort: low-quality)' : ''),\n finalMetricsLine: (h, p, r, tf, pr) =>\n ` health=${h} parseFail=${p} repeat=${r} toolFail=${tf} progress=${pr}`,\n reasonLabel: 'reason: ',\n failureLogHeader: '--- failure log (tail, max 80 lines) ---',\n fixSuggestionsHeader: '--- 修复建议(calibration) ---',\n auditHint: (id) => ` 审计: 查看 .xcompiler/audit.jsonl 与 .xcompiler/llm-stream/${id}-*.txt 获取完整原始流`,\n spinStepRunning: (id, phase, title) => `▶ ${id} ${phase} ${title}`,\n noFailureLog: '(未捕获日志)',\n suggestionLine: (index, code, hint) => ` ${index}. [${code}] ${hint}`,\n phaseStart: (id, phase, title) => `${id} ${phase} ${title}`,\n phaseFailed: (id, debug, reason) => `${id} ${debug ? 'DEBUG ' : ''}失败 — ${reason}`,\n phaseDone: (id, rounds) => `${id} 完成(轮次=${rounds})`,\n phaseException: (id, message) => `${id} 异常失败 — ${message}`,\n archGateReason: (missing) => `HIGH_LEVEL_DESIGN 门禁:架构契约缺少 ${missing} 个标记`,\n archGateMissing: (tokens) => `缺失模块 ID/路径:${tokens}`,\n archGateInstruction: (p) => `请更新 ${p},确保每个 architectureModules 项在进入 CODE 前均可追踪。`,\n testGateReason: (exitCode, timedOut) => `测试门禁:测试退出码=${exitCode}${timedOut ? '(超时)' : ''}`,\n deliveryGateReason: (command, exitCode, timedOut) => `FUNCTIONAL_TEST 门禁:\\`${command}\\` 退出码=${exitCode}${timedOut ? '(超时)' : ''}`,\n missingPythonEntrypoint: '缺少 Python 入口:需要 src/main.py 或 src/<package>/__main__.py',\n missingTypeScriptEntrypoint:\n '缺少 TypeScript 入口:需要 package.json start/bin 或 src/main.ts、src/index.ts、src/main.tsx 之一',\n invalidPythonEntrypointSource: (path) =>\n `Python 入口源码无效:${path} 必须是真实 CLI 入口,至少包含 def main(...)、argparse.ArgumentParser 或 if __name__ == \"__main__\" 这类入口结构;仅 import/comment 的占位文件不能算可运行应用。`,\n entrypointHelpOutputMissing: (command) =>\n `入口探测 \\`${command}\\` 虽然退出码为 0,但没有输出有意义的 help/usage 文本;必须实现 --help,不能靠空脚本自然退出过关。`,\n reasonLine: (reason) => `原因:${reason}`,\n roundsLine: (rounds) => `轮次:${rounds}`,\n commandLine: (command) => `命令:${command}`,\n stdoutTailHeader: '--- 标准输出(尾部)---',\n stderrTailHeader: '--- 标准错误(尾部)---',\n testStdoutTailHeader: '--- 测试标准输出(尾部)---',\n testStderrTailHeader: '--- 测试标准错误(尾部)---',\n outputsMissing: (paths) => `缺失输出:${paths}`,\n metricsLine: (health, parseFail, repeat, toolFail, progress) =>\n `指标:健康度=${health} 解析失败=${parseFail} 重复=${repeat} 工具失败=${toolFail} 进度=${progress}`,\n metricsUnavailable: '指标:无',\n toolCallsHeader: '工具调用:',\n toolCallLine: (tool, ok, detail) => ` - ${tool} ${ok ? '成功' : '失败'} ${detail}`,\n projectMemoryRefreshFailed: (message) => `项目记忆刷新失败:${message}`,\n deliveryFixHints: (language) => language === 'typescript'\n ? [\n '修复方向(按优先级):',\n ' 1. 若 TypeScript 源码出现模块解析或 ERR_MODULE_NOT_FOUND,使用带显式 .ts 后缀的相对 ESM import。',\n ' 2. 若为 --help 或未知选项,main() 必须支持 --help 并以 0 退出。',\n ' 3. 若为应用异常,修复实现并保持入口轻量。',\n ]\n : [\n '修复方向(按优先级):',\n ' 1. 若为 src 相关 ModuleNotFoundError,加入 planner #19 的 sys.path 自举或移除 import 的 src. 前缀。',\n ' 2. main() 必须是真实 CLI 入口:解析 --help、调用项目模块、打印有意义输出,并用 if __name__ == \"__main__\": main() 启动。',\n ' 3. 若为 argparse 错误,main() 必须无需其他必填参数即可支持 --help 并以 0 退出。',\n ' 4. 若为业务异常,修复实现;入口只负责参数解析与调用。',\n ],\n },\n render: {\n sectionGlobalPrompt: '## Global prompt (注入每个 Step 的 system prompt)',\n sectionDependencies: (manifestFile) => `## Dependencies (将写入 ${manifestFile})`,\n sectionBaselineSummary: '## 现有工程基线',\n labelSystemPrompt: '**System prompt (唯一使命):**',\n },\n prompts: {\n plannerSystem: (p) => buildPlannerSystem(p),\n plannerSelfMode: `自举模式覆盖规则(优先级高于上方与之冲突的 greenfield 规则):\n- 目标是现有 XCompiler 仓库。除非需求明确要求修改,否则必须保留当前 package.json、tsconfig、bin、CLI 入口、模块结构、公共导出和设计文档。\n- 不得为了满足新建工程入口约定而创建 src/main.ts;必须复用现有 package.json 声明的入口。\n- 除非本次变更确实需要修改,否则 HIGH_LEVEL_DESIGN outputs 不得包含 package.json 或 tsconfig.json。\n- 每个 CODE/测试产物必须严格限定在本次增量范围,禁止整体重建或替换仓库。\n- 将稳定宿主视为 N 代、隔离 worktree 中的候选版本视为 N+1 代;禁止设计进程内热替换。`,\n plannerClarifySystem: `你是 XCompiler V 模型的需求分析师。你的职责不是复述 topic,而是发现会改变功能设计、验收结果或架构边界的未决事项。\n只返回严格 JSON。问题必须可由业务方直接作答、一次只确认一个决策,避免空泛的“还有什么要求”或技术栈选型问题。`,\n plannerClarify: (raw, opts = {}) =>\n `用户的原始需求如下:\n\n\"\"\"\n${raw}\n\"\"\"\n\n请针对 topic 中尚未明确、且答案会实质改变实现或验收的事项,生成${opts.complex ? '8-10' : '7-10'}个互不重复的澄清问题。不得返回空数组;如果功能描述已经较完整,就追问验收示例、失败行为和明确的不做范围。\n\n仅返回 JSON 数组,每项严格为:\n{\"id\":\"Q1\",\"category\":\"functionality|data|acceptance|boundary|quality|extensibility\",\"question\":\"一个可直接回答的具体问题\",\"why\":\"该答案会影响什么设计或验收\",\"options\":[{\"label\":\"A\",\"answer\":\"最高优先级的可行设定\"},{\"label\":\"B\",\"answer\":\"第二个可行设定\"}]}\n\n问题组合要求(功能优先):\n- 至少 ${opts.complex ? '5' : '4'} 个功能性问题,category 使用 functionality / data / acceptance,确保功能问题占多数。优先质询:目标用户与角色、核心使用流程、功能规则与状态变化、输入输出、失败/异常行为、可验证验收示例。\n- 至少 1 个 boundary:明确本期必须做、明确不做、外部系统责任边界或兼容范围。\n- 至少 1 个 quality:询问可量化的性能、容量、并发、时延、准确性、可靠性或安全指标;不要只问“性能有什么要求”。\n- 至少 1 个 extensibility:询问最可能新增的业务能力、扩展维度或需要稳定保留的接口,不要泛问“是否需要扩展性”。\n- 如果交付形态不明确,必须包含 1 个 boundary 问题,确认本项目应是 API library/SDK/软件包、可运行应用/CLI/服务,还是二者兼具的 mixed 交付。\n- 按阻塞程度排序:先问会改变核心功能/数据模型的问题,再问范围与质量,最后问未来扩展。\n- 一题只包含一个主要决策,给出必要的业务选项或示例,禁止把多个无关问题用“以及/或者”拼成一题。\n- 每个问题都必须预生成 2-5 个可行回答设定,按优先级排序。选项数量不是固定值:二选一场景用 2 个,常见默认设定用 3 个,只有确实存在 4-5 个彼此不同的可行设定时才生成 4-5 个;不要填充或强制每题都是 3 个选项。\n- 选项从 A 开始连续标号,到实际最后一个选项结束,例如 A-B、A-C、A-D 或 A-E;如果能判断推荐/默认方案,A 应是最高优先级方案。选项必须是具体业务/产品设定,不要写成空泛占位。\n- 不要把“其他 / 自定义 / 用户决定”作为选项;CLI 已支持用户输入已展示的选项字母或直接输入自定义回答内容。\n${opts.projectShapeAmbiguous\n ? '- 本 topic 必问:明确确认 API library / 可运行应用 / mixed 交付边界。\\n'\n : ''}\n\n【硬约束】实现技术栈已经由 XCompiler 配置 / 现有工程基线固定,不要重新询问语言、运行时、包管理器这类问题。\n**严禁**提出以下类型的问题:\n - \"希望用什么编程语言 / 框架 / 运行时实现?\"\n - \"需要哪种测试框架 / 构建工具 / 包管理器?\"\n - \"目标平台是哪种操作系统?\"\n${opts.intent && opts.intent !== 'greenfield'\n ? `这是一条针对现有工程的增量 ${opts.intent} 请求${opts.hasBaseline ? ';分解阶段还会提供一份基线摘要' : ''}。请只问“变更增量”相关问题,不要把项目当成从零开始重做。`\n : ''}问题主体必须聚焦功能行为;性能、边界和扩展性用于消除会影响本期设计的关键歧义。`,\n plannerDecompose: (raw, qa, addenda, opts = {}) =>\n `原始需求:\n\"\"\"\n${raw}\n\"\"\"\n\n澄清问答:\n${qa || '(无)'}\n\n${addenda ? `用户补充需求(需严格遵守,优先级高于原始描述中模糊的部分):\\n\"\"\"\\n${addenda}\\n\"\"\"\\n\\n` : ''}${opts.intent && opts.intent !== 'greenfield'\n ? `增量意图:${opts.intent}\n\n请在现有工程基础上生成一份增量 ${opts.intent} 计划,优先复用当前架构、文件、测试与依赖,而不是把整个项目重新搭一遍。除本次需求涉及的范围外,默认保持既有行为不变。\n\n现有工程基线:\n\"\"\"\n${opts.baseline || '(缺少基线摘要)'}\n\"\"\"\n\n`\n : ''}规划深度约束:\n- 除非需求明确只是一个很小的单函数 / 单脚本 / 小工具,否则不要把方案压缩成“一个源码文件 + 一个测试文件”的最小实现。\n- 如果需求横跨多个关注点(领域逻辑、API/CLI 接口、持久化、外部集成、流程编排、测试),必须在计划里体现为多个架构模块,并在 CODE/MODULE_TEST 宏 Step 的 subTasks 下分解模块级工作。\n- 在 plan 中评估项目复杂度,并按评估结果确定 implementationPhases 数量:simple => 只有 P1 current;moderate => P1 current + 至少 P2 planned;complex => P1 current + 至少 P2/P3 planned。若用户明确要求分阶段/里程碑,至少使用 P1+P2,并设置 userForcedPhaseSplit=true。每个 current/planned implementation phase 都必须在 steps 中拥有一套完整 V 模型,并让 Step.iterationId 指向对应 phase。\n- 请通过 HIGH_LEVEL_DESIGN / DETAILED_DESIGN Step 明确模块边界、职责划分、依赖和后续可扩展点,让后续增量开发可以持续追加,而不是每次重写。\n- 如果基线里已经存在相关文件,优先在原模块上扩展/重构,不要新造一套行为重复的影子实现。\n\n请按系统规则输出严格 JSON 计划。`,\n executorSystem: (p) => buildExecutorSystem(p),\n executorDebugBlock: (reason: string, suggestions?: string) =>\n `\\n\\n正处于 DEBUG 重试模式。上一轮失败原因: ${reason}\\n` +\n 'DEBUG 可以修改当前 allowedWrites 内的上游源码与测试文件;若失败暴露的是实现、契约或下游调用不一致,必须修真实缺陷,禁止通过削弱断言、跳过测试、删除失败用例或只迎合错误测试来过关。' +\n '请包含 read_file/code_search 先定位问题,再以 apply_patch / replace_in_file / add_dependency 作最小修改,最后 run_tests 验证。' +\n '如果失败日志显示网络/API 调用失败,不允许只停留在探测接口:最多连续执行 2 次 http_fetch 探测;HTTP 2xx 但 body 为空或格式不可用不算可用接口;随后必须 patch 真实集成代码,并用 run_program 和 run_tests 验证。入口仍输出网络/API 失败时不得 done=true。' +\n (suggestions ? `\\n\\n${suggestions}` : ''),\n executorGlobalBlock: (globalPrompt: string) => `\\n\\n## 项目全局约束\\n${globalPrompt}`,\n executorStepBlock: (sp: string) =>\n `\\n\\n## 当前 Step 专属提示 (唯一使命,禁止跨 Step 发散)\\n${sp}`,\n executorUserPromptOutro: '现在按协议返回第一轮 JSON。',\n executorFeedbackHeader: '本轮工具结果:',\n executorFeedbackVerifyOk: 'outputs 校验通过。如已完成,请把 done 设为 true 且 actions=[]。',\n executorFeedbackVerifyMissing: (paths: string) => `outputs 仍缺失:${paths}。请继续。`,\n },\n skills: {\n patcher: '通过 apply_patch / replace_in_file 对已有文件做小改动,禁止整文件覆盖。',\n author: '通过 write_file 创建新文件;优先放在当前 Step writable allowlist 内。',\n tester:\n '编写并运行 pytest 测试,验证函数行为;失败时通过 analyze_error 解析。' +\n '【fixture 自包含】测试**严禁**直接 open() 磁盘上不存在的样例文件(如 \"test.dbc\");' +\n '若被测函数需要文件输入,请用 pytest 的 tmp_path fixture 在测试里临时构造内容,' +\n '或用 write_file 直接写到 tests/fixtures/<name>——测试/DEBUG 阶段该目录已默认放开写权限,' +\n '子目录自动 mkdir -p,**无需**提前把 fixture 路径登记到 outputs。' +\n '生成测试时务必同时输出全部依赖资源,避免后续 Debugger 因 FileNotFoundError 反复重试。' +\n '【fixture 迭代】若测试运行中被测函数报\"Invalid syntax / Parse error / Malformed\"等解析错误,' +\n '说明你写出的 fixture 内容不合该格式 spec:read_file 看清,write_file 整文件重写为合法样例,再 run_tests,' +\n '严禁去改被测模块或断言。',\n dep_resolver: '当出现 ModuleNotFoundError 时,用 add_dependency 写回 requirements.txt 并重建沙盒。',\n debugger:\n '先 run_tests / run_python 复现错误 → analyze_error → patch/replace_in_file 修复 → 再次 run_tests。每次只做最小修改。【网络/API 失败】定位失败 URL 后,只允许少量探测替代 API,随后必须 patch 源码并用 run_program 证明入口不再输出 API 失败。【重要】同一文件上 replace_in_file 连续失败 2 次以上请立即 read_file,再用 patch 或在当前运行时 chunk limit 内整文件重写,不要反复猜测 find 字符串。【禁止 no-op】replace_in_file 的 find 与 replace 必须不同——若你只是想\"确认\"某段代码,请用 read_file,不要提交相同字符串的替换。',\n refactorer: '重构必须保证行为不变;先跑回归测试 → 修改 → 再跑回归测试。',\n },\n doctor: {\n cliDescription: '检查 config / LLM / sandbox / skills 是否就绪',\n optStrict: '把 warning 也视为失败(任一 warn 即非零退出)',\n header: 'XCompiler 启动环境自检',\n sectionConfig: '[配置]',\n sectionLLM: '[LLM]',\n sectionSandbox: '[沙盒]',\n sectionSkills: '[技能]',\n summaryOk: '全部检查通过。',\n summaryWarn: (n) => `通过,但有 ${n} 条 warning。`,\n summaryFail: (n) => `检测到 ${n} 项失败。`,\n configLoadOk: (path) => `配置已加载:${path}`,\n configLoadFail: (msg) => `配置加载失败:${msg}`,\n configLocale: (locale) => `locale=${locale}`,\n llmNoProviders: 'config.llm.providers 为空,未声明任何 provider',\n llmProviderListed: (n) => `已声明 ${n} 个 provider`,\n ollamaUnreachable: (baseUrl, msg) => `ollama 不可达 @ ${baseUrl} —— ${msg}`,\n ollamaReachable: (baseUrl, n) => `ollama 可达 @ ${baseUrl}(共 ${n} 个模型)`,\n ollamaModelMissing: (provider, model, baseUrl) =>\n `provider \"${provider}\":模型 \"${model}\" 未安装于 ${baseUrl}(请执行 \\`ollama pull ${model}\\`)`,\n ollamaModelOk: (provider, model) => `provider \"${provider}\":模型 \"${model}\" 可用`,\n openaiKeyMissing: (provider) => `provider \"${provider}\":api_key 为空(请设置 OPENAI_API_KEY 或 config.llm.providers.${provider}.api_key)`,\n openaiReachable: (provider, baseUrl) => `provider \"${provider}\":OpenAI 端点可达 @ ${baseUrl}`,\n openaiUnreachable: (provider, baseUrl, msg) => `provider \"${provider}\":OpenAI 端点不可达 @ ${baseUrl} —— ${msg}`,\n openaiModelListMissing: (provider, model) =>\n `provider \"${provider}\":/models 响应中未列出 \"${model}\"(若你的账号有访问权限仍可正常调用)`,\n providerScoreZero: (provider) => `provider \"${provider}\" 已禁用(score=0)`,\n roleNoLiveProvider: (role) => `角色 \"${role}\" 没有可用 provider(候选列表全部不可达或被禁用)`,\n roleOk: (role, provider) => `角色 \"${role}\" → ${provider}`,\n sandboxKind: (kind) => `sandbox=${kind}`,\n sandboxNetworkPolicy: (policy, ports) =>\n `network=${policy}` + (ports.length ? `(expose_ports=[${ports.join(', ')}])` : ''),\n sandboxFullNoPorts:\n 'network=full 但未配置 expose_ports—宿主侧无法访问容器内服务。' +\n '请在 config.yaml 中设置 `agent.sandbox_limits.expose_ports: [<port>]`。',\n sandboxNodeMissing: 'PATH 上找不到 node(TypeScript subprocess 沙盒必需)',\n sandboxNodeOk: (version) => `node OK(${version})`,\n sandboxNpmMissing: 'PATH 上找不到 npm(TypeScript subprocess 沙盒必需)',\n sandboxNpmOk: (version) => `npm OK(${version})`,\n sandboxNpxMissing: 'PATH 上找不到 npx(TypeScript subprocess 沙盒必需)',\n sandboxNpxOk: (version) => `npx OK(${version})`,\n sandboxPythonMissing: 'PATH 上找不到 python3(subprocess 沙盒必需)',\n sandboxPythonOk: (version) => `python3 OK(${version})`,\n sandboxVenvMissing: 'python3 venv 模块不可用(请安装 python3-venv / python3-virtualenv)',\n sandboxVenvOk: 'python3 venv 模块 OK',\n sandboxDockerMissing: (bin) => `PATH 上找不到 docker 二进制 \"${bin}\"`,\n sandboxDockerOk: (version) => `docker OK(${version})`,\n sandboxDockerDaemonDown: (msg) => `docker daemon 不可达:${msg}`,\n sandboxInContainerWarn: '检测到 XCompiler 运行在容器内,此模式不支持 sandbox=docker(请使用 subprocess)。',\n skillToolMissing: (skill, tool) => `skill \"${skill}\" 引用了未注册的工具 \"${tool}\"`,\n skillOk: (n, tools) => `已注册 ${n} 个 skill,对应 ${tools} 个底层工具`,\n },\n};\n\nexport default messages;\n","import en from './en.js';\nimport zh from './zh.js';\nimport type { Locale, Messages } from './types.js';\n\nexport type { Locale, Messages } from './types.js';\n\nconst TABLES: Record<Locale, Messages> = { en, zh };\n\nlet current: Locale = 'en';\n\n/** Current active locale (defaults to `en`). */\nexport function getLocale(): Locale {\n return current;\n}\n\n/** Set active locale. Accepts loose forms: `en`, `EN`, `cn`, `CN`, `zh`, `zh-CN`. */\nexport function setLocale(loc: string | Locale | undefined): Locale {\n current = normaliseLocale(loc);\n return current;\n}\n\n/** Normalise CLI / config inputs to internal {@link Locale}. */\nexport function normaliseLocale(loc: string | undefined | null): Locale {\n if (!loc) return current;\n const v = String(loc).trim().toLowerCase();\n if (v === 'en' || v === 'us' || v === 'uk' || v === 'gb' || v === 'en-us' || v === 'en-gb') return 'en';\n if (v === 'zh' || v === 'cn' || v === 'zh-cn' || v === 'zh-hans' || v === 'chinese') return 'zh';\n return 'en';\n}\n\n/** Active message bundle for the current locale. */\nexport function t(): Messages {\n return TABLES[current];\n}\n\n/** Explicit lookup against an arbitrary locale (does not change current). */\nexport function tFor(loc: Locale): Messages {\n return TABLES[loc];\n}\n","import type { ExecResult } from '../sandbox/types.js';\n\nexport interface NetworkApiFailure {\n message: string;\n evidence: string;\n}\n\nconst FAILURE_LINE_RE =\n /\\b(?:network|api|http|https|request|requests|fetch|connection|dns|ssl|tls|socket|timeout|timed out|status code|client error|server error)\\b.*\\b(?:fail(?:ed|ure)?|error|timeout|timed out|refused|reset|unreachable|unavailable|forbidden|unauthorized|not found|too many requests|bad gateway|service unavailable)\\b|\\b(?:fail(?:ed|ure)?|error|timeout|timed out|refused|reset|unreachable|unavailable)\\b.*\\b(?:network|api|http|https|request|requests|fetch|connection|dns|ssl|tls|socket)\\b|(?:网络|接口|API|HTTP|请求|连接|超时|限流|不可用)[^\\n]{0,80}(?:失败|错误|异常|超时|拒绝|不可达|不可用|限流)|(?:失败|错误|异常|超时|拒绝|不可达|不可用|限流)[^\\n]{0,80}(?:网络|接口|API|HTTP|请求|连接|服务)/iu;\n\nconst EXCEPTION_RE =\n /\\b(?:ConnectionError|Timeout|ReadTimeout|ConnectTimeout|HTTPError|SSLError|ProxyError|TooManyRedirects|MaxRetryError|NameResolutionError|gaierror|ECONNREFUSED|ECONNRESET|ENOTFOUND|ETIMEDOUT|EAI_AGAIN)\\b/u;\n\nconst HTTP_STATUS_RE = /\\b(?:HTTP\\s*)?(?:status(?:\\s*code)?\\s*[=:]?\\s*)?(?:401|403|404|408|409|425|429|5\\d\\d)\\b[^\\n]{0,80}\\b(?:api|http|request|fetch|接口|请求)\\b|\\b(?:api|http|request|fetch|接口|请求)\\b[^\\n]{0,80}\\b(?:401|403|404|408|409|425|429|5\\d\\d)\\b/iu;\n\nexport function detectNetworkApiFailure(text: string): NetworkApiFailure | null {\n const lines = text.replace(/\\r\\n?/g, '\\n').split('\\n');\n for (const rawLine of lines) {\n const line = rawLine.trim();\n if (!line) continue;\n if (FAILURE_LINE_RE.test(line) || EXCEPTION_RE.test(line) || HTTP_STATUS_RE.test(line)) {\n return {\n message:\n 'Network API failure detected. Treat this task as failed and select a reachable, suitable API or fix the API integration.',\n evidence: line.slice(0, 500),\n };\n }\n }\n return null;\n}\n\nexport function detectNetworkApiFailureInExec(result: ExecResult): NetworkApiFailure | null {\n return detectNetworkApiFailure(`${result.stderr ?? ''}\\n${result.stdout ?? ''}`);\n}\n","import type { Workspace } from '../workspace/workspace.js';\nimport type { AuditLogger } from '../audit/audit.js';\nimport type { Sandbox } from '../sandbox/types.js';\nimport type { Language } from './plan.js';\nimport {\n autoFixSrcImports,\n ensurePyTestBootstrap,\n helpOutputLooksMeaningful,\n probeEntrypoint,\n type EntrypointProbe,\n} from './entry_gate.js';\nimport { detectNetworkApiFailureInExec } from './network_api_gate.js';\nimport { t } from '../i18n/index.js';\n\n/**\n * LanguageProfile:把\"某种目标语言的工程化知识\"集中到一处,\n * 让 sandbox / engine / lint / render / planner / executor 等都通过 profile 取用,\n * 而不是在各处硬编码 Python 的 venv / pip / pytest / requirements.txt 假设。\n *\n * 默认语言仍是 Python(完全向后兼容);TypeScript 作为新 profile 接入。\n */\nexport interface LanguageProfile {\n readonly id: Language;\n readonly displayName: string;\n\n /** 依赖清单文件(相对 workspace 根)。python: requirements.txt;ts: package.json */\n readonly manifestFile: string;\n\n /** 源码/测试文件扩展名,用于 lint 阶段纯度检查与入口探测。 */\n readonly codeExtensions: string[];\n\n /**\n * 是否由 runtime(cli/execute)根据 plan.dependencies 生成 manifest。\n * - Python:true —— 渲染器把依赖写入 requirements.txt,HIGH_LEVEL_DESIGN 不得直接产出该文件。\n * - TypeScript:false —— package.json 由 HIGH_LEVEL_DESIGN 步骤撰写(含 scripts / devDependencies)。\n */\n readonly seedManifestFromDeps: boolean;\n\n /** 默认 Docker 镜像。 */\n readonly defaultDockerImage: string;\n\n /** 把依赖列表渲染为 manifest 文件内容(仅当 seedManifestFromDeps=true 时使用)。 */\n renderManifest(deps: string[]): string;\n\n /** 给 lint S004/S005 提示用:依据 CODE Step 的源码输出推导建议测试文件路径。 */\n testFileFor(srcOutput: string | undefined, stepId: string): string;\n\n /** 追加到 Planner system prompt 末尾的语言专属覆盖块(python 为空串)。 */\n readonly plannerPromptOverride: string;\n /** 追加到 Executor system prompt 末尾的语言专属覆盖块(python 为空串)。 */\n readonly executorPromptOverride: string;\n\n /** 测试/DEBUG 前置:确保测试可解析到源码(python 写 conftest.py;ts 无需)。 */\n ensureTestBootstrap?(ws: Workspace, audit: AuditLogger): Promise<void>;\n /** 通用兜底:修复入口 import 路径问题(python sys.path;ts 无需)。 */\n autoFixImports?(ws: Workspace, audit: AuditLogger): Promise<string[]>;\n /** FUNCTIONAL_TEST gate:探测入口 `--help` 是否开箱即用;缺失入口必须返回失败。 */\n probeEntry(ws: Workspace, sandbox: Sandbox): Promise<EntrypointProbe>;\n}\n\nconst PY_TEST_RE = /\\.py$/;\n\nconst pythonProfile: LanguageProfile = {\n id: 'python',\n displayName: 'Python',\n manifestFile: 'requirements.txt',\n codeExtensions: ['.py'],\n seedManifestFromDeps: true,\n defaultDockerImage: 'python:3.11-slim',\n renderManifest(deps) {\n return [...new Set(deps.map((d) => d.trim()).filter(Boolean))].sort().join('\\n') + '\\n';\n },\n testFileFor(srcOutput, stepId) {\n if (srcOutput && srcOutput.startsWith('src/') && PY_TEST_RE.test(srcOutput)) {\n const base = srcOutput.replace(/^src\\//, '').replace(/\\.py$/, '').replace(/\\//g, '_');\n return `tests/test_${base}.py`;\n }\n return `tests/test_${stepId.toLowerCase()}.py`;\n },\n plannerPromptOverride: '',\n executorPromptOverride: '',\n async ensureTestBootstrap(ws, audit) {\n await ensurePyTestBootstrap(ws, audit);\n },\n async autoFixImports(ws, audit) {\n return autoFixSrcImports(ws, audit);\n },\n async probeEntry(ws, sandbox) {\n return probeEntrypoint(ws, sandbox);\n },\n};\n\nconst typescriptProfile: LanguageProfile = {\n id: 'typescript',\n displayName: 'TypeScript',\n manifestFile: 'package.json',\n codeExtensions: ['.ts', '.tsx'],\n seedManifestFromDeps: false,\n defaultDockerImage: 'node:20-slim',\n renderManifest(deps) {\n const pkg = {\n name: 'app',\n version: '0.0.0',\n private: true,\n type: 'module',\n scripts: { test: 'vitest run', start: 'tsx src/main.ts' },\n dependencies: Object.fromEntries(\n [...new Set(deps.map((d) => d.trim()).filter(Boolean))].sort().map((d) => [d, '*']),\n ),\n devDependencies: {\n vitest: '*',\n typescript: '*',\n tsx: '*',\n '@types/node': '*',\n },\n };\n return JSON.stringify(pkg, null, 2) + '\\n';\n },\n testFileFor(srcOutput, stepId) {\n if (srcOutput && srcOutput.startsWith('src/') && /\\.tsx?$/.test(srcOutput)) {\n const base = srcOutput.replace(/^src\\//, '').replace(/\\.tsx?$/, '').replace(/\\//g, '_');\n return `tests/${base}.test.ts`;\n }\n return `tests/${stepId.toLowerCase()}.test.ts`;\n },\n plannerPromptOverride: '',\n executorPromptOverride: '',\n async probeEntry(ws, sandbox) {\n return probeTsEntrypoint(ws, sandbox);\n },\n};\n\nconst PROFILES: Record<Language, LanguageProfile> = {\n python: pythonProfile,\n typescript: typescriptProfile,\n};\n\nexport function getLanguageProfile(language: Language): LanguageProfile {\n return PROFILES[language] ?? pythonProfile;\n}\n\n/** FUNCTIONAL_TEST gate(TypeScript):优先尝试 `node src/main.ts --help`,确保源码入口开箱即用。 */\nasync function probeTsEntrypoint(\n ws: Workspace,\n sandbox: Sandbox,\n): Promise<EntrypointProbe> {\n const tail = (s: string): string => s.split('\\n').slice(-30).join('\\n');\n const entry = await detectTsEntrypoint(ws);\n if (!entry) {\n return {\n ok: false,\n command: 'npm run start -- --help',\n exitCode: -1,\n timedOut: false,\n stdoutTail: '',\n stderrTail: t().engine.missingTypeScriptEntrypoint,\n };\n }\n let r;\n try {\n r = await runTsEntryProbe(entry, sandbox);\n } catch (err) {\n return {\n ok: false,\n command: entry.command,\n exitCode: -1,\n timedOut: false,\n stdoutTail: '',\n stderrTail: (err as Error).message,\n };\n }\n const helpNetworkFailure = detectNetworkApiFailureInExec(r);\n if (helpNetworkFailure) {\n return {\n ok: false,\n command: entry.command,\n exitCode: r.exitCode,\n timedOut: r.timedOut ?? false,\n stdoutTail: tail(r.stdout),\n stderrTail: `${helpNetworkFailure.message}\\nEvidence: ${helpNetworkFailure.evidence}`,\n };\n }\n const ok = r.exitCode === 0 && !r.timedOut && helpOutputLooksMeaningful(r.stdout, r.stderr);\n if (ok) {\n try {\n const smoke = await runTsEntrySmoke(entry, sandbox);\n const smokeNetworkFailure = detectNetworkApiFailureInExec(smoke);\n if (smokeNetworkFailure) {\n return {\n ok: false,\n command: tsSmokeCommand(entry),\n exitCode: smoke.exitCode,\n timedOut: smoke.timedOut ?? false,\n stdoutTail: tail(smoke.stdout),\n stderrTail: `${smokeNetworkFailure.message}\\nEvidence: ${smokeNetworkFailure.evidence}`,\n };\n }\n } catch {\n // Smoke run is only a network/API failure detector; ordinary no-arg failures\n // still fall back to the --help entrypoint verdict.\n }\n }\n return {\n ok,\n command: entry.command,\n exitCode: r.exitCode,\n timedOut: r.timedOut ?? false,\n stdoutTail: tail(r.stdout),\n stderrTail: ok ? tail(r.stderr) : tail(r.stderr || t().engine.entrypointHelpOutputMissing(entry.command)),\n };\n}\n\nasync function detectTsEntrypoint(\n ws: Workspace,\n): Promise<\n | { type: 'start-script'; command: string }\n | { type: 'run-program'; entry: string; command: string }\n | { type: 'exec'; cmd: string; argv: string[]; command: string }\n | null\n> {\n const pkg = await readJsonFile<Record<string, unknown>>(ws, 'package.json');\n\n for (const cand of ['src/main.ts', 'src/index.ts']) {\n if (await ws.exists(cand)) {\n return toTsSourceProbe(cand);\n }\n }\n if (await ws.exists('src/main.tsx')) {\n return { type: 'run-program', entry: 'src/main.tsx', command: 'npx tsx src/main.tsx --help' };\n }\n\n const scripts =\n pkg?.scripts && typeof pkg.scripts === 'object' && !Array.isArray(pkg.scripts)\n ? (pkg.scripts as Record<string, unknown>)\n : {};\n if (typeof scripts.start === 'string' && scripts.start.trim()) {\n return { type: 'start-script', command: 'npm run --silent start -- --help' };\n }\n\n const binValue = pkg?.bin;\n if (typeof binValue === 'string' && binValue.trim()) {\n return toTsBinProbe(binValue);\n }\n if (binValue && typeof binValue === 'object' && !Array.isArray(binValue)) {\n const firstBin = Object.values(binValue as Record<string, unknown>).find(\n (value): value is string => typeof value === 'string' && value.trim().length > 0,\n );\n if (firstBin) return toTsBinProbe(firstBin);\n }\n\n const mainValue = typeof pkg?.main === 'string' ? pkg.main.trim() : '';\n if (mainValue && (mainValue.endsWith('.ts') || mainValue.endsWith('.tsx') || mainValue.endsWith('.js'))) {\n return toTsBinProbe(mainValue);\n }\n return null;\n}\n\nasync function runTsEntryProbe(\n probe:\n | { type: 'start-script'; command: string }\n | { type: 'run-program'; entry: string; command: string }\n | { type: 'exec'; cmd: string; argv: string[]; command: string },\n sandbox: Sandbox,\n): Promise<Awaited<ReturnType<Sandbox['runProgram']>>> {\n if (probe.type === 'start-script') {\n return sandbox.exec('npm', ['run', '--silent', 'start', '--', '--help'], { timeoutMs: 60_000 });\n }\n if (probe.type === 'exec') {\n return sandbox.exec(probe.cmd, probe.argv, { timeoutMs: 60_000 });\n }\n return sandbox.runProgram([probe.entry, '--help'], { timeoutMs: 60_000 });\n}\n\nasync function runTsEntrySmoke(\n probe:\n | { type: 'start-script'; command: string }\n | { type: 'run-program'; entry: string; command: string }\n | { type: 'exec'; cmd: string; argv: string[]; command: string },\n sandbox: Sandbox,\n): Promise<Awaited<ReturnType<Sandbox['runProgram']>>> {\n if (probe.type === 'start-script') {\n return sandbox.exec('npm', ['run', '--silent', 'start'], { timeoutMs: 60_000 });\n }\n if (probe.type === 'exec') {\n return sandbox.exec(probe.cmd, probe.argv.filter((arg) => arg !== '--help'), { timeoutMs: 60_000 });\n }\n return sandbox.runProgram([probe.entry], { timeoutMs: 60_000 });\n}\n\nfunction tsSmokeCommand(\n probe:\n | { type: 'start-script'; command: string }\n | { type: 'run-program'; entry: string; command: string }\n | { type: 'exec'; cmd: string; argv: string[]; command: string },\n): string {\n if (probe.type === 'start-script') return 'npm run --silent start';\n if (probe.type === 'exec') {\n const argv = probe.argv.filter((arg) => arg !== '--help');\n return [probe.cmd, ...argv].join(' ');\n }\n return `npx tsx ${probe.entry}`;\n}\n\nfunction toTsBinProbe(\n entry: string,\n): { type: 'run-program'; entry: string; command: string } | { type: 'exec'; cmd: string; argv: string[]; command: string } {\n if (entry.endsWith('.js') || entry.endsWith('.ts')) {\n return { type: 'exec', cmd: 'node', argv: [entry, '--help'], command: `node ${entry} --help` };\n }\n return { type: 'run-program', entry, command: `npx tsx ${entry} --help` };\n}\n\nfunction toTsSourceProbe(\n entry: string,\n): { type: 'exec'; cmd: string; argv: string[]; command: string } {\n return { type: 'exec', cmd: 'node', argv: [entry, '--help'], command: `node ${entry} --help` };\n}\n\nasync function readJsonFile<T>(\n ws: Workspace,\n rel: string,\n): Promise<T | null> {\n try {\n return JSON.parse(await ws.readFile(rel)) as T;\n } catch {\n return null;\n }\n}\n","import type { ArchitectureModule, Language, PlanIntent, Step } from './plan.js';\nimport { getLanguageProfile } from './language.js';\n\nexport interface ArchitectureDemandInput {\n requirementDigest: string;\n rawRequirement?: string;\n userAddenda?: string;\n globalPrompt?: string;\n baselineSummary?: string;\n intent?: PlanIntent;\n}\n\nexport interface ArchitectureDemand {\n nonTrivial: boolean;\n surfaces: string[];\n baselineModules: number;\n minModules: number;\n reasonLabel: string;\n}\n\ninterface ModuleDemandParts {\n foundationModules: number;\n surfaceModules: number;\n baselinePressureModules: number;\n intentPressureModules: number;\n minModules: number;\n}\n\nconst COMPLEXITY_SURFACES: Array<{ name: string; pattern: RegExp }> = [\n {\n name: 'api',\n // “调用第三方 API”属于 integration,不应额外计为“本项目暴露 API/服务端接口”。\n pattern:\n /\\b(openapi|endpoint|http\\s+server|api\\s+(?:server|endpoint|gateway|route)|server|router|rest|graphql)\\b|(?:提供|暴露|实现|构建|创建|开发)[^。!?;;\\n]{0,32}(?:\\bapi\\b|接口)|接口|服务端|路由/u,\n },\n { name: 'cli', pattern: /\\b(cli|command|subcommand|terminal|console)\\b|命令行|终端|子命令/u },\n { name: 'persistence', pattern: /\\b(sqlite|postgres|mysql|database|persist|storage|repository)\\b|数据库|持久化|存储|仓储/u },\n { name: 'auth', pattern: /\\b(auth|login|oauth|permission|role|session|token)\\b|认证|登录|权限|角色|会话|令牌/u },\n { name: 'io', pattern: /\\b(import|export|csv|excel|pdf|report|upload|download)\\b|导入|导出|报表|上传|下载/u },\n { name: 'integration', pattern: /\\b(webhook|github|slack|third[- ]party|external|integration|sdk)\\b|第三方|外部集成|外部系统|钩子/u },\n { name: 'streaming', pattern: /\\b(stream|streaming|sse|websocket|realtime)\\b|流式|实时|长连接/u },\n { name: 'ui', pattern: /\\b(ui|frontend|page|screen|react|view|dashboard)\\b|前端|页面|界面|仪表盘/u },\n { name: 'workflow', pattern: /\\b(workflow|pipeline|orchestration|scheduler|queue|worker)\\b|工作流|流程编排|调度|队列|任务执行/u },\n { name: 'catalog', pattern: /\\b(catalog|product|inventory|sku)\\b|商品|产品目录|库存/u },\n { name: 'ordering', pattern: /\\b(order|checkout|cart|fulfillment)\\b|订单|购物车|履约/u },\n { name: 'billing', pattern: /\\b(payment|billing|invoice|refund)\\b|支付|计费|发票|退款/u },\n { name: 'notification', pattern: /\\b(notification|email|sms|push)\\b|通知|邮件|短信|推送/u },\n];\n\nconst EXPLICIT_COMPLEXITY = /\\b(complex|platform|enterprise|end[- ]to[- ]end|multi[- ]module)\\b|复杂(?:任务|系统|工程)?|完整系统|平台|端到端|多模块/u;\n\n/**\n * 根据“本次需求”而不是整个基线文本评估拆分规模,避免在大型旧工程里改一个小函数也被强制拆十几个模块。\n */\nexport function analyzeArchitectureDemand(\n input: ArchitectureDemandInput,\n language: Language,\n): ArchitectureDemand {\n const requestText = buildDemandText(input).toLowerCase();\n const surfaces = COMPLEXITY_SURFACES\n .filter((surface) => hasAffirmativeMention(requestText, surface.pattern))\n .map((surface) => surface.name);\n const explicitComplexity = EXPLICIT_COMPLEXITY.test(requestText);\n const baselineModules = countBaselineModules(\n input.baselineSummary ?? '',\n getLanguageProfile(language).codeExtensions,\n );\n const intent = input.intent ?? 'greenfield';\n const nonTrivial =\n explicitComplexity ||\n surfaces.length >= 2 ||\n (surfaces.length >= 1 && baselineModules >= 4) ||\n (intent !== 'greenfield' && surfaces.length >= 2);\n\n const moduleDemand = estimateModuleDemand({\n nonTrivial,\n surfaceCount: surfaces.length,\n baselineModules,\n explicitComplexity,\n intent,\n });\n\n return {\n nonTrivial,\n surfaces,\n baselineModules,\n minModules: moduleDemand.minModules,\n reasonLabel:\n `surfaces=${surfaces.join('/') || '(none)'}, explicitComplexity=${explicitComplexity}, ` +\n `baselineModules=${baselineModules}, intent=${intent}, moduleDemand=` +\n `foundation:${moduleDemand.foundationModules}+surfaces:${moduleDemand.surfaceModules}+` +\n `baseline:${moduleDemand.baselinePressureModules}+intent:${moduleDemand.intentPressureModules}` +\n `=>${moduleDemand.minModules}`,\n };\n}\n\nfunction estimateModuleDemand(input: {\n nonTrivial: boolean;\n surfaceCount: number;\n baselineModules: number;\n explicitComplexity: boolean;\n intent: PlanIntent;\n}): ModuleDemandParts {\n if (!input.nonTrivial) {\n return {\n foundationModules: 1,\n surfaceModules: 0,\n baselinePressureModules: 0,\n intentPressureModules: 0,\n minModules: 1,\n };\n }\n\n // Complex work needs independently owned foundations before concern-specific modules:\n // an entry/orchestration boundary and a core domain boundary.\n const foundationModules = input.explicitComplexity || input.surfaceCount > 0 ? 2 : 1;\n const surfaceModules = input.surfaceCount;\n\n // Existing projects should influence the split, but sub-linearly: a 40-file baseline\n // should not force 40 new CODE steps for a focused feature. log2 keeps the pressure\n // proportional to project scale while still growing as the baseline gets larger.\n const baselinePressureModules =\n input.baselineModules > 0 ? Math.max(0, Math.ceil(Math.log2(input.baselineModules)) - 2) : 0;\n\n // Incremental work has to preserve integration boundaries in the existing project.\n // Scale the extra split by both touched surfaces and baseline size.\n const intentPressureModules =\n input.intent === 'greenfield' || input.surfaceCount === 0 || input.baselineModules === 0\n ? 0\n : Math.min(input.surfaceCount, Math.max(1, Math.ceil(Math.sqrt(input.baselineModules))));\n\n const minModules =\n foundationModules + surfaceModules + baselinePressureModules + intentPressureModules;\n\n return {\n foundationModules,\n surfaceModules,\n baselinePressureModules,\n intentPressureModules,\n minModules,\n };\n}\n\nfunction buildDemandText(input: ArchitectureDemandInput): string {\n return [\n input.requirementDigest,\n extractDemandBearingText(input.rawRequirement ?? ''),\n extractDemandBearingText(input.userAddenda ?? ''),\n // globalPrompt 是 Planner 生成的执行约定,常包含“API/CLI/持久化/通知”等示例清单;\n // 它不是用户需求,不能参与复杂度 surface 判定。\n ]\n .map((part) => part.trim())\n .filter(Boolean)\n .join('\\n');\n}\n\nfunction extractDemandBearingText(text: string): string {\n const normalized = text.replace(/\\r\\n/g, '\\n');\n if (!normalized.trim()) return '';\n\n const topicPieces = [\n extractMarkdownSection(normalized, /^(?:原始需求|original\\s+requirement|raw\\s+requirement)\\s*$/iu),\n extractMarkdownSection(normalized, /^(?:补充需求|追加需求|附加要求|user\\s+addenda|additional\\s+requirements?)\\s*$/iu),\n extractClarificationAnswers(normalized),\n ]\n .map((part) => part.trim())\n .filter(Boolean);\n\n if (topicPieces.length > 0) return topicPieces.join('\\n');\n\n return normalized\n .split('\\n')\n .filter((line) => !/^\\s*(?:[-*]\\s*)?(?:\\*\\*)?(?:Q\\d+|Why|澄清目的|澄清记录)(?:\\b|\\s*[·::-]|\\*\\*)/iu.test(line))\n .join('\\n');\n}\n\nfunction extractMarkdownSection(text: string, titlePattern: RegExp): string {\n const lines = text.split('\\n');\n const start = lines.findIndex((line) => {\n const match = /^\\s*#{1,6}\\s+(.+?)\\s*#*\\s*$/u.exec(line);\n return Boolean(match && titlePattern.test(match[1]!.trim()));\n });\n if (start < 0) return '';\n\n const collected: string[] = [];\n for (let i = start + 1; i < lines.length; i += 1) {\n if (/^\\s*#{1,6}\\s+/u.test(lines[i]!)) break;\n collected.push(lines[i]!);\n }\n return stripMarkdownNoise(collected.join('\\n'));\n}\n\nfunction extractClarificationAnswers(text: string): string {\n const answers: string[] = [];\n const answerLine =\n /^\\s*(?:[-*]\\s*)?(?:\\*\\*)?A\\d*\\s*(?:\\*\\*)?\\s*(?:[·::-]\\s*)?(.+?)\\s*$/gimu;\n for (const match of text.matchAll(answerLine)) {\n const answer = stripMarkdownNoise(match[1] ?? '');\n if (answer) answers.push(answer);\n }\n return answers.join('\\n');\n}\n\nfunction stripMarkdownNoise(text: string): string {\n return text\n .split('\\n')\n .map((line) => line.replace(/^\\s*>\\s?/u, '').trim())\n .filter(Boolean)\n .join('\\n');\n}\n\n/**\n * 复杂度关键词只在肯定语义下生效。需求边界经常写成“无数据库/不使用第三方集成”;\n * 把这些排除项当成待实现关注面,会反过来强迫小任务拆成多个虚假模块。\n */\nfunction hasAffirmativeMention(text: string, pattern: RegExp): boolean {\n const matcher = new RegExp(pattern.source, pattern.flags.includes('g') ? pattern.flags : `${pattern.flags}g`);\n return [...text.matchAll(matcher)].some((match) => !isNegatedMention(text, match.index ?? 0));\n}\n\nfunction isNegatedMention(text: string, mentionIndex: number): boolean {\n const prefix = text.slice(Math.max(0, mentionIndex - 160), mentionIndex);\n // 句号、分号、换行和转折词会结束此前的否定作用域;逗号不能结束,因为排除项常写成列表。\n const scope = prefix.split(/(?:[.!?;。!?;\\n]|\\b(?:but|however|whereas)\\b|但(?:是)?|不过)/u).at(-1) ?? '';\n const negations = [\n /\\b(?:no|without|excluding?|avoid(?:ing)?|forbid(?:den)?|disable[ds]?|do(?:es)?\\s+not\\s+(?:use|require|include)|don't\\s+(?:use|require|include)|not\\s+(?:using|required|included|supported|allowed))\\b/giu,\n /(?:不使用|不需要|无需|不要|不得|禁止|禁用|排除|不含|不支持|没有|无)(?:任何)?/gu,\n ];\n let lastNegationEnd = -1;\n for (const negation of negations) {\n for (const match of scope.matchAll(negation)) {\n lastNegationEnd = Math.max(lastNegationEnd, (match.index ?? 0) + match[0].length);\n }\n }\n if (lastNegationEnd < 0) return false;\n\n // “不使用数据库,提供 CLI”中,新的肯定动作开启了另一项需求。\n const positiveReset = /\\b(?:support|provide|implement|create|build|expose|enable|use|include)\\b|(?:支持|提供|实现|创建|构建|启用|使用|包含)/giu;\n return ![...scope.matchAll(positiveReset)].some((match) => (match.index ?? 0) >= lastNegationEnd);\n}\n\nexport interface ArchitectureContractIssue {\n stepId?: string;\n message: string;\n}\n\n/** 校验 HIGH_LEVEL_DESIGN 模块契约到 CODE / MODULE_TEST 两侧的可追踪性。 */\nexport function validateArchitectureContract(\n modules: ArchitectureModule[],\n steps: Step[],\n language: Language,\n demand: ArchitectureDemand,\n): ArchitectureContractIssue[] {\n const issues: ArchitectureContractIssue[] = [];\n const profile = getLanguageProfile(language);\n const codeSteps = steps.filter((step) => step.phase === 'CODE');\n const testSteps = steps.filter((step) => step.phase === 'MODULE_TEST');\n const stepById = new Map(steps.map((step) => [step.id, step]));\n\n if (demand.nonTrivial && modules.length < demand.minModules) {\n issues.push({\n message:\n `Architecture contract has ${modules.length} module(s); requirement scale expects at least ${demand.minModules} ` +\n `(${demand.reasonLabel}).`,\n });\n }\n\n const moduleIds = new Set<string>();\n const allSourcePaths = new Set<string>();\n const allTestPaths = new Set<string>();\n const modulesByCodeOwner = new Map<string, ArchitectureModule[]>();\n\n for (const module of modules) {\n if (moduleIds.has(module.id)) {\n issues.push({ message: `Architecture module id ${module.id} is duplicated.` });\n }\n moduleIds.add(module.id);\n\n for (const sourcePath of module.sourcePaths) {\n if (!isSourcePath(sourcePath, profile.codeExtensions)) {\n issues.push({ message: `${module.id} sourcePath must be a target-language file under src/: ${sourcePath}` });\n }\n if (allSourcePaths.has(sourcePath)) {\n issues.push({ message: `Architecture sourcePath ${sourcePath} is owned by more than one module.` });\n }\n allSourcePaths.add(sourcePath);\n }\n for (const testPath of module.testPaths) {\n if (!isTestPath(testPath, profile.codeExtensions)) {\n issues.push({ message: `${module.id} testPath must be a target-language file under tests/: ${testPath}` });\n }\n allTestPaths.add(testPath);\n }\n\n const owners = codeSteps.filter((step) =>\n module.sourcePaths.every((path) => pathCoveredByOutputs(path, step.outputs)),\n );\n if (owners.length !== 1) {\n issues.push({\n message:\n `${module.id} must map all sourcePaths to exactly one CODE macro step; found ${owners.length}.`,\n });\n continue;\n }\n const codeOwner = owners[0]!;\n const ownedModules = modulesByCodeOwner.get(codeOwner.id) ?? [];\n ownedModules.push(module);\n modulesByCodeOwner.set(codeOwner.id, ownedModules);\n\n const matchingTests = testSteps.filter((step) =>\n module.testPaths.some((path) => pathCoveredByOutputs(path, step.outputs)),\n );\n if (matchingTests.length === 0) {\n issues.push({ message: `${module.id} testPaths are not produced by any MODULE_TEST step.` });\n } else if (!matchingTests.some((step) => transitivelyDependsOn(step, codeOwner.id, stepById))) {\n issues.push({\n message: `${module.id} MODULE_TEST step must depend directly or transitively on its CODE step ${codeOwner.id}.`,\n });\n }\n }\n\n for (const module of modules) {\n for (const dependency of module.dependencies) {\n if (dependency === module.id || !moduleIds.has(dependency)) {\n issues.push({ message: `${module.id} has invalid architecture dependency ${dependency}.` });\n }\n }\n }\n\n for (const [stepId, ownedModules] of modulesByCodeOwner) {\n if (ownedModules.length <= 1) continue;\n const step = stepById.get(stepId);\n if (!step || hasModuleSubTasks(step, ownedModules)) continue;\n issues.push({\n stepId,\n message:\n `${stepId} owns ${ownedModules.length} architecture modules; keep it as one CODE macro step but list each module in subTasks.`,\n });\n }\n\n // 复杂计划里的源码必须能回溯到 HIGH_LEVEL_DESIGN,避免 Planner 额外塞入未设计的“万能 app.py”。\n if (demand.nonTrivial) {\n for (const step of codeSteps) {\n for (const output of step.outputs) {\n if (!isSourcePath(output, profile.codeExtensions) || output.endsWith('/__init__.py')) continue;\n if (!allSourcePaths.has(output)) {\n issues.push({ stepId: step.id, message: `CODE output is missing from architectureModules: ${output}` });\n }\n }\n }\n }\n\n return issues;\n}\n\nfunction hasModuleSubTasks(step: Step, modules: ArchitectureModule[]): boolean {\n const subTaskText = flattenSubTasks(step)\n .map((task) => [task.id, task.title, task.description, task.acceptance, ...(task.outputs ?? [])].filter(Boolean).join('\\n'))\n .join('\\n');\n return modules.every((module) =>\n subTaskText.includes(module.id) ||\n module.sourcePaths.some((sourcePath) => subTaskText.includes(sourcePath)),\n );\n}\n\nfunction flattenSubTasks(step: Step): NonNullable<Step['subTasks']> {\n const out: NonNullable<Step['subTasks']> = [];\n const stack = [...(step.subTasks ?? [])];\n while (stack.length > 0) {\n const task = stack.shift()!;\n out.push(task);\n stack.unshift(...(task.subTasks ?? []));\n }\n return out;\n}\n\nexport function pathCoveredByOutputs(path: string, outputs: string[]): boolean {\n const normalizedPath = normalizePath(path);\n return outputs.some((output) => {\n const normalizedOutput = normalizePath(output);\n return normalizedPath === normalizedOutput || normalizedPath.startsWith(`${normalizedOutput}/`);\n });\n}\n\n/** HIGH_LEVEL_DESIGN gate:架构文档必须显式保留结构化契约中的模块 id 与全部源码/测试路径。 */\nexport function missingArchitectureDocumentTokens(\n content: string,\n modules: ArchitectureModule[],\n): string[] {\n const required = modules.flatMap((module) => [module.id, ...module.sourcePaths, ...module.testPaths]);\n return [...new Set(required)].filter((token) => !content.includes(token));\n}\n\nfunction isSourcePath(path: string, extensions: string[]): boolean {\n return path.startsWith('src/') && extensions.some((extension) => path.endsWith(extension));\n}\n\nfunction isTestPath(path: string, extensions: string[]): boolean {\n return path.startsWith('tests/') && extensions.some((extension) => path.endsWith(extension));\n}\n\nfunction normalizePath(path: string): string {\n return path.replace(/\\\\/g, '/').replace(/^\\.\\//u, '').replace(/\\/+$/u, '');\n}\n\nfunction transitivelyDependsOn(step: Step, targetId: string, byId: Map<string, Step>): boolean {\n const seen = new Set<string>();\n const stack = [...step.dependsOn];\n while (stack.length > 0) {\n const current = stack.pop()!;\n if (current === targetId) return true;\n if (seen.has(current)) continue;\n seen.add(current);\n const dependency = byId.get(current);\n if (dependency) stack.push(...dependency.dependsOn);\n }\n return false;\n}\n\nfunction countBaselineModules(summary: string, codeExtensions: string[]): number {\n if (!summary) return 0;\n const modules = new Set<string>();\n for (const line of summary.split('\\n')) {\n const trimmed = line.trim();\n if (!/(^###\\s+|^- )src\\//u.test(trimmed)) continue;\n const normalized = trimmed\n .replace(/^###\\s+/u, '')\n .replace(/^- /u, '')\n .split(':')[0]!\n .trim();\n if (codeExtensions.some((extension) => normalized.endsWith(extension))) modules.add(normalized);\n }\n return modules.size;\n}\n","import {\n PHASE_ORDER,\n REQUIRED_V_MODEL_PHASES,\n V_MODEL_SOURCE_TO_TEST_PHASE,\n type ComplexityAssessment,\n type Phase,\n type Plan,\n type Step,\n} from './plan.js';\nimport { DOC_NAMES, deliveryDocsForIteration, phaseDocForIteration, testPlanDocForIteration } from './docs.js';\nimport { getLanguageProfile } from './language.js';\nimport { analyzeArchitectureDemand, validateArchitectureContract } from './architecture.js';\n\nexport interface LintIssue {\n level: 'error' | 'warn';\n stepId?: string;\n message: string;\n}\n\nexport class PlanLintError extends Error {\n constructor(public readonly issues: LintIssue[]) {\n super(\n `Plan lint failed with ${issues.length} issue(s):\\n` +\n issues.map((i) => ` [${i.level}] ${i.stepId ?? '*'}: ${i.message}`).join('\\n'),\n );\n this.name = 'PlanLintError';\n }\n}\n\nexport function lintPlan(plan: Plan): LintIssue[] {\n const issues: LintIssue[] = [];\n const ids = new Set<string>();\n const profile = getLanguageProfile(plan.language);\n\n // 1. unique ids + dependsOn closure\n for (const s of plan.steps) {\n if (ids.has(s.id)) issues.push({ level: 'error', stepId: s.id, message: 'Duplicate step id' });\n ids.add(s.id);\n }\n for (const s of plan.steps) {\n for (const dep of s.dependsOn) {\n if (!ids.has(dep)) {\n issues.push({ level: 'error', stepId: s.id, message: `dependsOn ${dep} not found` });\n }\n }\n }\n\n const implementationPhases = plan.implementationPhases ?? [];\n const implementationPhaseIds = new Set(implementationPhases.map((phase) => phase.id));\n const executableImplementationPhases = implementationPhases.filter((phase) => phase.status !== 'deferred');\n const executableIterationIds = new Set(executableImplementationPhases.map((phase) => phase.id));\n const iterationOrder = new Map(implementationPhases.map((phase, index) => [phase.id, index]));\n const stepIterationId = (step: Step): string => step.iterationId ?? 'P1';\n const stepIterationOrder = (step: Step): number => iterationOrder.get(stepIterationId(step)) ?? 0;\n\n for (const step of plan.steps) {\n const iterationId = stepIterationId(step);\n if (implementationPhases.length > 0 && !implementationPhaseIds.has(iterationId)) {\n issues.push({\n level: 'error',\n stepId: step.id,\n message: `Step iterationId ${iterationId} is not declared in implementationPhases.`,\n });\n }\n if (implementationPhases.length > 0 && !executableIterationIds.has(iterationId)) {\n issues.push({\n level: 'error',\n stepId: step.id,\n message: `Step belongs to deferred implementation phase ${iterationId}; deferred phases must not contain executable Steps.`,\n });\n }\n }\n\n for (const iteration of executableImplementationPhases) {\n const iterationSteps = plan.steps.filter((step) => stepIterationId(step) === iteration.id);\n const phases = new Set(iterationSteps.map((s) => s.phase));\n for (const phase of REQUIRED_V_MODEL_PHASES) {\n if (!phases.has(phase)) {\n issues.push({\n level: 'error',\n message:\n `Plan must include a ${phase} macro Step for implementation phase ${iteration.id}. ` +\n `Each iteration is a complete V-model cycle: ${REQUIRED_V_MODEL_PHASES.join(' -> ')}; ` +\n `DEBUG is optional when explicit remediation work is planned.`,\n });\n }\n }\n }\n\n // 2. acyclic\n if (hasCycle(plan.steps)) {\n issues.push({ level: 'error', message: 'Plan contains a dependency cycle' });\n }\n\n // 3. outputs unique(允许 DEBUG 阶段修改其依赖链上已存在的产物)\n const outputOwners = new Map<string, string>();\n const stepByIdEarly = new Map(plan.steps.map((s) => [s.id, s]));\n for (const s of plan.steps) {\n for (const out of s.outputs) {\n const prev = outputOwners.get(out);\n if (prev) {\n const prevStep = stepByIdEarly.get(prev);\n const allowModify =\n s.phase === 'DEBUG' &&\n prevStep !== undefined &&\n transitivelyDependsOn(s, prev, stepByIdEarly);\n if (!allowModify) {\n issues.push({\n level: 'error',\n stepId: s.id,\n message: `Output ${out} already produced by ${prev}`,\n });\n }\n } else {\n outputOwners.set(out, s.id);\n }\n }\n }\n\n // 4. phase order along dependency edges\n const stepById = new Map(plan.steps.map((s) => [s.id, s]));\n for (const s of plan.steps) {\n for (const dep of s.dependsOn) {\n const d = stepById.get(dep);\n if (!d) continue;\n const depOrder = stepIterationOrder(d);\n const currentOrder = stepIterationOrder(s);\n if (depOrder > currentOrder) {\n issues.push({\n level: 'error',\n stepId: s.id,\n message: `Iteration ${stepIterationId(s)} depends on later iteration ${stepIterationId(d)} (${dep}).`,\n });\n }\n if (depOrder === currentOrder && PHASE_ORDER[d.phase] > PHASE_ORDER[s.phase]) {\n issues.push({\n level: 'error',\n stepId: s.id,\n message: `Phase ${s.phase} depends on later phase ${d.phase} (${dep})`,\n });\n }\n }\n }\n\n // 5. each CODE step needs at least one UNIT_TEST step that depends on it (directly or transitively).\n // Exception: CODE steps whose outputs are entirely Python package marker files (`__init__.py`)\n // are not independently testable.\n const codeSteps = plan.steps.filter((s) => s.phase === 'CODE');\n for (const c of codeSteps) {\n const onlyInitFiles =\n c.outputs.length > 0 && c.outputs.every((o) => o === '__init__.py' || o.endsWith('/__init__.py'));\n if (onlyInitFiles) continue;\n const covered = plan.steps.some(\n (t) => t.phase === 'UNIT_TEST' && stepIterationId(t) === stepIterationId(c) && transitivelyDependsOn(t, c.id, stepById),\n );\n if (!covered) {\n const suggestedId = nextStepId(plan.steps);\n const srcOut = c.outputs.find(\n (o) => o.startsWith('src/') && profile.codeExtensions.some((e) => o.endsWith(e)),\n );\n const testFile = profile.testFileFor(srcOut, c.id);\n issues.push({\n level: 'error',\n stepId: c.id,\n message:\n `CODE step ${c.id} has no corresponding UNIT_TEST step. ` +\n `Add a UNIT_TEST step (e.g. id=\"${suggestedId}\", phase=\"UNIT_TEST\", role=\"Tester\", dependsOn=[\"${c.id}\"], ` +\n `outputs=[\"${testFile}\"]) so plan lint rule S004/S005 passes; ` +\n `or have an existing UNIT_TEST step include \"${c.id}\" in its dependsOn (chain-style coverage is allowed).`,\n });\n }\n }\n\n // 6. 依赖清单规则(按语言 profile 分流)。\n const ownsManifest = (step: Step): boolean =>\n step.outputs.some((o) => o === profile.manifestFile || o.endsWith(`/${profile.manifestFile}`));\n if (profile.seedManifestFromDeps) {\n // Python:runtime 依据 plan.dependencies 渲染 requirements.txt;HIGH_LEVEL_DESIGN 不得直接产出该文件。\n if (!plan.dependencies || plan.dependencies.length === 0) {\n issues.push({\n level: 'error',\n message: `For ${profile.displayName} plans, plan.dependencies must be non-empty (will seed ${profile.manifestFile} at runtime).`,\n });\n }\n for (const s of plan.steps) {\n if (ownsManifest(s)) {\n issues.push({\n level: 'error',\n stepId: s.id,\n message: `${profile.manifestFile} is renderer-owned; do not list it as a Step output. Use add_dependency tool instead.`,\n });\n }\n }\n } else {\n // Greenfield TypeScript:HIGH_LEVEL_DESIGN 必须创建 package.json。\n // 增量/自举:现有 manifest 是基线契约,除非需求确实修改它,否则不应列为输出。\n const manifestSteps = plan.steps.filter((s) => ownsManifest(s));\n const archManifestSteps = manifestSteps.filter((s) => s.phase === 'HIGH_LEVEL_DESIGN');\n if (\n (plan.intent === 'greenfield' && archManifestSteps.length !== 1) ||\n (plan.intent !== 'greenfield' && archManifestSteps.length > 1)\n ) {\n issues.push({\n level: 'error',\n message:\n plan.intent === 'greenfield'\n ? `For ${profile.displayName} greenfield plans, exactly one HIGH_LEVEL_DESIGN step must output ${profile.manifestFile} (scripts + dependencies + devDependencies).`\n : `For ${profile.displayName} incremental plans, at most one HIGH_LEVEL_DESIGN step may modify the existing ${profile.manifestFile}.`,\n });\n }\n for (const s of manifestSteps) {\n if (s.phase !== 'HIGH_LEVEL_DESIGN') {\n issues.push({\n level: 'error',\n stepId: s.id,\n message: `${profile.manifestFile} must be authored by a HIGH_LEVEL_DESIGN step, not ${s.phase}.`,\n });\n }\n }\n }\n\n // 7. phase purity — 需求/设计阶段不得产出实现/测试源码;功能测试阶段不得产出 src 实现代码。\n const SRC_RE = /^(?:src|tests)\\//;\n const DOC_ONLY_PHASES = new Set(['REQUIREMENT_ANALYSIS', 'HIGH_LEVEL_DESIGN', 'DETAILED_DESIGN']);\n for (const s of plan.steps) {\n const docOnly = DOC_ONLY_PHASES.has(s.phase);\n const functionalTestSrcWrite = s.phase === 'FUNCTIONAL_TEST';\n if (!docOnly && !functionalTestSrcWrite) continue;\n for (const out of s.outputs) {\n const isCodeOrTestPath = SRC_RE.test(out) && (profile.codeExtensions.some((e) => out.endsWith(e)) || out.endsWith('/'));\n const isImplementationPath = out.startsWith('src/') && (profile.codeExtensions.some((e) => out.endsWith(e)) || out.endsWith('/'));\n if ((docOnly && isCodeOrTestPath) || (functionalTestSrcWrite && isImplementationPath)) {\n issues.push({\n level: 'error',\n stepId: s.id,\n message: `${s.phase} step must not output implementation/test code: ${out}`,\n });\n }\n }\n }\n\n // 8. 每个 Step 必须带 systemPrompt(schema 已强制非空,这里再校验长度避免 xcompiler_build 偷懒)\n for (const s of plan.steps) {\n if (s.systemPrompt.trim().length < 20) {\n issues.push({\n level: 'error',\n stepId: s.id,\n message: 'systemPrompt too short — xcompiler_build must specify scope/inputs/outputs/forbidden',\n });\n }\n const subTaskDepth = maxSubTaskDepth(s.subTasks ?? []);\n if (subTaskDepth > 2) {\n issues.push({\n level: 'error',\n stepId: s.id,\n message: `Step subTasks may be nested at most 2 levels; got depth ${subTaskDepth}`,\n });\n }\n }\n\n // 9. FUNCTIONAL_TEST 阶段:每个 FUNCTIONAL_TEST Step outputs 必须包含完整交付文档包。\n for (const d of plan.steps.filter((s) => s.phase === 'FUNCTIONAL_TEST')) {\n const requiredDocs = deliveryDocsForIteration(plan.projectType ?? 'application', stepIterationId(d));\n for (const doc of requiredDocs) {\n if (!d.outputs.includes(doc)) {\n issues.push({\n level: 'error',\n stepId: d.id,\n message: `FUNCTIONAL_TEST step outputs must include ${doc}`,\n });\n }\n }\n }\n\n // 10. 每个迭代周期都必须产出各阶段规范验收文档;左侧阶段同步产出对应测试计划。\n for (const iteration of executableImplementationPhases) {\n for (const phase of REQUIRED_V_MODEL_PHASES) {\n const expected = phaseDocForIteration(phase, iteration.id);\n if (!expected) continue;\n const phaseSteps = plan.steps.filter((s) => s.phase === phase && stepIterationId(s) === iteration.id);\n if (phaseSteps.length === 0) continue;\n const covered = phaseSteps.some((s) => s.outputs.includes(expected));\n if (!covered) {\n issues.push({\n level: 'error',\n stepId: phaseSteps[0]!.id,\n message: `${iteration.id} ${phase} 阶段未产出规范验收文档:${expected}`,\n });\n }\n }\n for (const [sourcePhase, testPhase] of Object.entries(V_MODEL_SOURCE_TO_TEST_PHASE) as Array<[Phase, Phase]>) {\n const sourceSteps = plan.steps.filter((s) => s.phase === sourcePhase && stepIterationId(s) === iteration.id);\n if (sourceSteps.length === 0) continue;\n const expectedTestPlan = testPlanDocForIteration(testPhase, iteration.id);\n if (expectedTestPlan && !sourceSteps.some((step) => step.outputs.includes(expectedTestPlan))) {\n issues.push({\n level: 'error',\n stepId: sourceSteps[0]!.id,\n message: `${sourcePhase} must synchronously output paired ${testPhase} plan: ${expectedTestPlan}`,\n });\n }\n for (const sourceStep of sourceSteps) {\n const covered = plan.steps.some(\n (candidate) =>\n candidate.phase === testPhase &&\n stepIterationId(candidate) === iteration.id &&\n transitivelyDependsOn(candidate, sourceStep.id, stepById),\n );\n if (!covered) {\n issues.push({\n level: 'error',\n stepId: sourceStep.id,\n message: `${sourceStep.phase} step ${sourceStep.id} must be covered by a paired ${testPhase} step in ${iteration.id}.`,\n });\n }\n }\n }\n }\n\n // 10c. 任何 Step 都不允许在 outputs 里多名习寫 topic.md(仅由 xcompiler build 写入)\n for (const s of plan.steps) {\n if (s.outputs.includes(DOC_NAMES.topic)) {\n issues.push({\n level: 'error',\n stepId: s.id,\n message: `${DOC_NAMES.topic} 是 xcompiler build 专属产物,不得列为 Step 输出。`,\n });\n }\n }\n\n // 11. 除 DEBUG 以外的所有阶段必须声明至少 1 个 output。\n for (const s of plan.steps) {\n if (s.phase !== 'DEBUG' && s.outputs.length === 0) {\n issues.push({\n level: 'error',\n stepId: s.id,\n message: `${s.phase} step must declare at least one output`,\n });\n }\n }\n\n // 12. 架构规模门槛:按需求关注面线性扩展,不再把复杂工程的最低要求固定封顶为 3。\n const demand = analyzeArchitectureDemand(plan, plan.language);\n if (demand.nonTrivial) {\n const codeSteps = plan.steps.filter((s) => s.phase === 'CODE');\n const sourceOutputs = dedup(\n codeSteps.flatMap((s) =>\n s.outputs.filter((out) => out.startsWith('src/') && profile.codeExtensions.some((ext) => out.endsWith(ext))),\n ),\n );\n if (sourceOutputs.length < demand.minModules) {\n issues.push({\n level: 'error',\n stepId: codeSteps[0]?.id,\n message:\n `Non-trivial request detected (${demand.reasonLabel}). ` +\n `CODE outputs currently cover only ${sourceOutputs.length} source module(s); expected at least ${demand.minModules}.`,\n });\n }\n }\n\n // 13. V 模型可追踪性:HIGH_LEVEL_DESIGN 模块必须落到 CODE 宏 Step,并被对应 MODULE_TEST 宏 Step 验证。\n const architectureModules = plan.architectureModules ?? [];\n if (demand.nonTrivial && architectureModules.length === 0) {\n issues.push({\n level: 'warn',\n message:\n 'Legacy plan has no architectureModules contract; regenerate with `xcompiler build` to enable HIGH_LEVEL_DESIGN → CODE → MODULE_TEST traceability.',\n });\n }\n if (architectureModules.length > 0) {\n for (const contractIssue of validateArchitectureContract(\n architectureModules,\n plan.steps,\n plan.language,\n demand,\n )) {\n issues.push({ level: 'error', ...contractIssue });\n }\n }\n\n if (!plan.complexityAssessment) {\n issues.push({\n level: 'error',\n message: 'Plan must include complexityAssessment from the planning phase.',\n });\n }\n if (implementationPhases.length === 0) {\n issues.push({\n level: 'error',\n message: 'Plan must include implementationPhases with executable V-model iteration goals.',\n });\n } else {\n const current = implementationPhases.filter((phase) => phase.status === 'current');\n if (current.length !== 1 || current[0]?.id !== 'P1') {\n issues.push({\n level: 'error',\n message: 'implementationPhases must have exactly one current phase and it must be P1.',\n });\n }\n for (const phase of executableImplementationPhases) {\n if (!phase.verificationGate || phase.verificationGate.checks.length === 0) {\n issues.push({\n level: 'error',\n message:\n `implementation phase ${phase.id} must define a verificationGate with concrete end-of-iteration checks.`,\n });\n }\n }\n }\n if (plan.complexityAssessment) {\n const requiredPhaseCount = requiredImplementationPhaseCount(plan.complexityAssessment);\n if (executableImplementationPhases.length > 0 && executableImplementationPhases.length < requiredPhaseCount) {\n issues.push({\n level: 'error',\n message:\n `complexityAssessment.level=${plan.complexityAssessment.level} requires at least ` +\n `${requiredPhaseCount} executable implementation iteration(s).`,\n });\n }\n if (plan.complexityAssessment.level !== 'simple' && !plan.complexityAssessment.splitRecommended) {\n issues.push({\n level: 'error',\n message: 'moderate/complex complexityAssessment requires splitRecommended=true.',\n });\n }\n if (plan.complexityAssessment?.splitRecommended && executableImplementationPhases.length < 2) {\n issues.push({\n level: 'error',\n message: 'complexityAssessment.splitRecommended requires at least two executable implementation iterations.',\n });\n }\n if (\n plan.complexityAssessment.level === 'simple' &&\n !plan.complexityAssessment.splitRecommended &&\n !plan.complexityAssessment.userForcedPhaseSplit &&\n executableImplementationPhases.length > 1\n ) {\n issues.push({\n level: 'error',\n message: 'simple complexity without splitRecommended must use exactly one executable implementation iteration.',\n });\n }\n }\n\n return issues;\n}\n\nfunction requiredImplementationPhaseCount(assessment: ComplexityAssessment): number {\n if (assessment.level !== 'simple' || assessment.splitRecommended || assessment.userForcedPhaseSplit) return 2;\n return 1;\n}\n\nexport function assertPlanValid(plan: Plan): void {\n const issues = lintPlan(plan);\n const errs = issues.filter((i) => i.level === 'error');\n if (errs.length > 0) throw new PlanLintError(errs);\n}\n\nfunction hasCycle(steps: Step[]): boolean {\n const graph = new Map<string, string[]>();\n for (const s of steps) graph.set(s.id, s.dependsOn);\n const WHITE = 0, GRAY = 1, BLACK = 2;\n const color = new Map<string, number>();\n for (const s of steps) color.set(s.id, WHITE);\n\n const dfs = (id: string): boolean => {\n color.set(id, GRAY);\n for (const next of graph.get(id) ?? []) {\n const c = color.get(next);\n if (c === GRAY) return true;\n if (c === WHITE && dfs(next)) return true;\n }\n color.set(id, BLACK);\n return false;\n };\n\n for (const s of steps) if (color.get(s.id) === WHITE && dfs(s.id)) return true;\n return false;\n}\n\nfunction transitivelyDependsOn(\n step: Step,\n targetId: string,\n byId: Map<string, Step>,\n): boolean {\n const seen = new Set<string>();\n const stack = [...step.dependsOn];\n while (stack.length > 0) {\n const cur = stack.pop()!;\n if (cur === targetId) return true;\n if (seen.has(cur)) continue;\n seen.add(cur);\n const s = byId.get(cur);\n if (s) stack.push(...s.dependsOn);\n }\n return false;\n}\n\n/** 给 lint S004/S005 错误提示用:算出下一个未被占用的 S### id。 */\nfunction nextStepId(steps: Step[]): string {\n const max = steps.reduce((m, s) => {\n const mm = String(s.id).match(/^S(\\d{3,})$/);\n return mm ? Math.max(m, parseInt(mm[1]!, 10)) : m;\n }, 0);\n return 'S' + String(max + 1).padStart(3, '0');\n}\n\nfunction dedup<T>(values: T[]): T[] {\n return [...new Set(values)];\n}\n\nfunction maxSubTaskDepth(tasks: NonNullable<Step['subTasks']>): number {\n if (tasks.length === 0) return 0;\n return Math.max(\n ...tasks.map((task) => {\n const children = task.subTasks ?? [];\n return 1 + maxSubTaskDepth(children);\n }),\n );\n}\n\nexport function topoSort(steps: Step[]): Step[] {\n const byId = new Map(steps.map((s) => [s.id, s]));\n const indeg = new Map<string, number>();\n for (const s of steps) indeg.set(s.id, s.dependsOn.length);\n const queue: string[] = [];\n for (const [id, d] of indeg) if (d === 0) queue.push(id);\n // tie-break by phase order then id for determinism\n queue.sort((a, b) => cmp(byId.get(a)!, byId.get(b)!));\n\n const out: Step[] = [];\n const remaining = new Map(indeg);\n const dependents = new Map<string, string[]>();\n for (const s of steps) {\n for (const dep of s.dependsOn) {\n const arr = dependents.get(dep) ?? [];\n arr.push(s.id);\n dependents.set(dep, arr);\n }\n }\n\n while (queue.length > 0) {\n const id = queue.shift()!;\n const s = byId.get(id)!;\n out.push(s);\n for (const n of dependents.get(id) ?? []) {\n const r = (remaining.get(n) ?? 0) - 1;\n remaining.set(n, r);\n if (r === 0) {\n queue.push(n);\n queue.sort((a, b) => cmp(byId.get(a)!, byId.get(b)!));\n }\n }\n }\n\n if (out.length !== steps.length) throw new Error('Cycle detected during topoSort');\n return out;\n\n function cmp(a: Step, b: Step): number {\n const ia = iterationSortValue(a.iterationId ?? 'P1');\n const ib = iterationSortValue(b.iterationId ?? 'P1');\n if (ia !== ib) return ia - ib;\n const pa = PHASE_ORDER[a.phase];\n const pb = PHASE_ORDER[b.phase];\n if (pa !== pb) return pa - pb;\n return a.id.localeCompare(b.id);\n }\n}\n\nfunction iterationSortValue(iterationId: string): number {\n const match = iterationId.match(/^P(\\d{1,3})$/u);\n return match ? Number(match[1]) : Number.MAX_SAFE_INTEGER;\n}\n","import path from 'node:path';\nimport { promises as fs } from 'node:fs';\nimport { loadConfigWithPath } from '../config/config.js';\nimport { LLMRouter } from '../llm/router.js';\nimport { reportRoleModelAdvice } from '../llm/role_advice.js';\nimport { ScoreStore } from '../llm/scores.js';\nimport { preflightProviders } from '../llm/preflight.js';\nimport { Workspace } from '../workspace/workspace.js';\nimport { archiveIfExists } from '../workspace/doc_archive.js';\nimport { Planner, buildPlan, type ClarificationCategory, type ClarifyOption, type ClarifyQuestion, type PlannerInput } from '../agents/planner.js';\nimport { PlanSchema } from '../core/plan.js';\nimport { DOC_NAMES } from '../core/docs.js';\nimport { loadIncrementalBaseline, isIncrementalIntent } from '../core/incremental.js';\nimport { lintPlan } from '../core/lint.js';\nimport { refreshProjectMemory } from '../core/project_memory.js';\nimport { renderPlanMarkdown } from '../core/render.js';\nimport { savePlan } from '../core/storage.js';\nimport { updateProjectFile } from '../core/project_file.js';\nimport { AuditLogger } from '../audit/audit.js';\nimport { acquireLock, LockError } from '../core/lock.js';\nimport { setLocale, t } from '../i18n/index.js';\nimport type { Language, PlanIntent } from '../core/plan.js';\nimport { PluginHost } from '../plugins/host.js';\nimport type { XCompilerPlugin } from '../plugins/types.js';\nimport { hasXcEnv, xcEnv } from '../config/env.js';\nimport {\n requireRuntimeInteraction,\n runtimeLog,\n runtimeResult,\n silentRuntimeIO,\n type RuntimeIO,\n} from './io.js';\n\nexport interface CompileOptions {\n workspace: string;\n configPath?: string;\n inputFile?: string;\n /**\n * 已澄清的 topic.md 直接输入:跳过 intake / clarify / Addenda / Gate 1,把该文件\n * 内容当作冻结后的项目选题书,直接进入 decompose。常用于:\n * - 用户上次已澄清并保留了 topic.md,重新跑 decompose 不想再问一遍\n * - 离线编辑了 topic.md 想直接拿来出 plan.json\n * 与 --input 互斥;同时给则 --topic 优先并打印警告。\n */\n topicFile?: string;\n outputFile?: string;\n intent?: PlanIntent;\n baselinePlanFile?: string;\n yes?: boolean;\n force?: boolean;\n /** Optional XXX.xc project file to create/update with config, plan, and progress. */\n projectFilePath?: string;\n /** Project-file history command label; defaults to build. */\n projectCommand?: string;\n /** 程序化插件入口;动态插件加载将在后续版本基于它实现。 */\n plugins?: XCompilerPlugin[];\n pluginStrict?: boolean;\n /** Runtime event and interaction adapter. CLI supplies a terminal implementation; SDKs may stay silent. */\n io?: RuntimeIO;\n}\n\n/** CLI 可映射为退出码、程序化调用方可捕获并安全收尾的编译终止。 */\nexport class CompileExitError extends Error {\n constructor(public readonly exitCode: number, message: string) {\n super(message);\n this.name = 'CompileExitError';\n }\n}\n\nexport function formatClarificationQuestion(q: ClarifyQuestion): string {\n const choiceRange = formatClarificationChoiceRange(q.options);\n const lines = [\n `${q.id} [${q.category}] ${q.question}`,\n ` ↳ ${q.why}`,\n ];\n for (const option of q.options) {\n lines.push(` ${option.label}. ${option.answer}`);\n }\n lines.push(` ${t().compile.clarifyChoiceHint(choiceRange)}`);\n return lines.join('\\n');\n}\n\nfunction formatClarificationChoiceRange(options: ClarifyOption[]): string {\n if (options.length === 0) return 'A-E';\n const first = options[0]?.label ?? 'A';\n const last = options[options.length - 1]?.label ?? first;\n return first === last ? first : `${first}-${last}`;\n}\n\nexport function resolveClarificationAnswer(q: ClarifyQuestion, rawAnswer: string): string {\n const answer = rawAnswer.trim();\n const label = answer.toUpperCase();\n if (/^[A-E]$/u.test(label)) {\n const option = q.options.find((candidate) => candidate.label === label);\n if (option) return `${option.label}. ${option.answer}`;\n }\n return answer;\n}\n\nexport function resolveCompileLanguage(\n configuredLanguage: Language,\n intent: PlanIntent,\n baseline: { language?: Language },\n): Language {\n return isIncrementalIntent(intent) ? baseline.language ?? configuredLanguage : configuredLanguage;\n}\n\nexport async function runCompile(opts: CompileOptions): Promise<{ planPath?: string }> {\n const io = opts.io ?? silentRuntimeIO;\n const ws = new Workspace(path.resolve(opts.workspace));\n const { config: cfg, path: cfgPath } = await loadConfigWithPath(opts.configPath);\n // Locale 必须在第一条输出之前生效,确保终端与审计文件从头到尾使用同一语言。\n if (!hasXcEnv('LANG')) setLocale(cfg.locale);\n await runtimeLog(io, 'success', t().compile.workspaceReady(ws.root));\n\n let lock;\n try {\n lock = await acquireLock(ws.root, 'xcompiler_build', { force: !!opts.force });\n } catch (err) {\n if (err instanceof LockError) {\n await runtimeLog(io, 'error', t().system.unhandledError(err.message));\n throw new CompileExitError(6, err.message);\n }\n throw err;\n }\n if (opts.force) {\n await runtimeLog(io, 'warning', t().compile.forceOverride);\n }\n\n let scoreStore: ScoreStore | undefined;\n try {\n const M = t();\n const audit = new AuditLogger({ root: ws.root, command: 'xcompiler_build' });\n await audit.start({\n workspace: ws.root,\n config: opts.configPath ?? '(default)',\n inputFile: opts.inputFile ?? '(stdin)',\n intent: opts.intent ?? 'greenfield',\n baselinePlanFile: opts.baselinePlanFile ?? '',\n yes: !!opts.yes,\n roles: cfg.llm.roles,\n default_provider: cfg.llm.default,\n });\n const pluginHost = new PluginHost({\n plugins: opts.plugins,\n strict: opts.pluginStrict,\n audit,\n });\n await pluginHost.initialize();\n if (opts.topicFile && opts.inputFile) {\n await runtimeLog(io, 'warning', M.compile.topicInputConflict);\n }\n const topicMode = !!opts.topicFile;\n const intent = opts.intent ?? 'greenfield';\n await pluginHost.emit('compile.start', { workspace: ws.root, intent, topicMode });\n scoreStore = new ScoreStore(cfgPath, cfg.llm.scores, audit);\n await scoreStore.load();\n let unavailableProviders = new Set<string>();\n try {\n const pf = await preflightProviders(cfg, scoreStore, audit);\n unavailableProviders = new Set(pf.unreachable);\n if (pf.zeroed.length > 0) {\n await runtimeLog(io, 'warning', t().execute.preflightModelMissing(pf.zeroed.join(', ')));\n }\n if (Object.keys(pf.autoAdded).length > 0) {\n await runtimeLog(io, 'warning', t().execute.preflightAutoAdded(Object.keys(pf.autoAdded).length));\n }\n } catch (err) {\n await runtimeLog(io, 'error', t().system.unhandledError((err as Error).message));\n await audit.end({ status: 'error', message: (err as Error).message, stage: 'llm-preflight' });\n await scoreStore.flush();\n throw new CompileExitError(7, (err as Error).message);\n }\n const router = new LLMRouter(cfg, audit, scoreStore, unavailableProviders, pluginHost);\n await reportRoleModelAdvice(router, audit, (message) => runtimeLog(io, 'warning', message));\n const baseline =\n isIncrementalIntent(intent)\n ? await loadIncrementalBaseline(ws, { planPath: opts.baselinePlanFile })\n : { summary: '', sources: [] };\n if (isIncrementalIntent(intent) && !baseline.summary) {\n const msg = M.compile.baselineMissing(ws.root);\n await runtimeLog(io, 'error', msg);\n await audit.end({ status: 'aborted', reason: 'incremental baseline missing', workspace: ws.root });\n throw new CompileExitError(8, msg);\n }\n if (baseline.summary) {\n await runtimeLog(io, 'success', M.compile.baselineLoaded(intent, baseline.sources.join(', ')));\n }\n const language = resolveCompileLanguage(cfg.agent.language, intent, baseline);\n if (\n isIncrementalIntent(intent) &&\n baseline.language &&\n baseline.language !== cfg.agent.language\n ) {\n await runtimeLog(\n io,\n 'warning',\n M.compile.baselineLanguageOverride(baseline.language, baseline.languageSource ?? 'baseline', cfg.agent.language),\n );\n }\n const planner = new Planner(router.for('Planner'), audit, language);\n\n const trace = (msg: string) => {\n if (xcEnv('TRACE') === '1') {\n void runtimeLog(io, 'dim', t().audit.traceLine('xcompiler-trace', msg));\n }\n };\n\n // 1. Intake — topic 模式下读取已有 topic.md 直接当作 raw\n let rawRequirement: string;\n if (topicMode) {\n trace('topic.read');\n rawRequirement = await fs.readFile(path.resolve(opts.topicFile!), 'utf8');\n if (!rawRequirement.trim()) {\n await runtimeLog(io, 'error', M.compile.topicEmptyExit);\n await audit.end({ status: 'aborted', reason: 'empty topic file' });\n throw new CompileExitError(1, M.compile.topicEmptyExit);\n }\n await audit.userInput(M.compile.auditTopicInput, rawRequirement);\n await runtimeLog(io, 'success', M.compile.topicLoaded(path.resolve(opts.topicFile!)));\n } else {\n trace('intake.start');\n rawRequirement = await intake(opts.inputFile, io);\n trace(`intake.done len=${rawRequirement.length}`);\n if (!rawRequirement.trim()) {\n await runtimeLog(io, 'error', M.compile.requirementEmptyExit);\n await audit.end({ status: 'aborted', reason: 'empty requirement' });\n throw new CompileExitError(1, M.compile.requirementEmptyExit);\n }\n trace('audit.userInput.intake');\n await audit.userInput(M.compile.auditOriginalRequirement, rawRequirement);\n trace('audit.userInput.intake.done');\n }\n\n // 2. Clarify — topic 模式跳过(topic.md 已经是冻结后的选题书)\n trace('clarify.section.enter');\n const clarifications: Array<{\n question: string;\n answer: string;\n category?: ClarificationCategory;\n why?: string;\n options?: ClarifyOption[];\n }> = [];\n let clarificationQuestions: ClarifyQuestion[] = [];\n trace(`clarify.section.flag yes=${opts.yes} topicMode=${topicMode}`);\n if (!opts.yes && !topicMode) {\n trace('ora.clarify.start');\n const spin = io.progress(M.compile.spinClarify, { animate: false });\n trace('ora.clarify.started');\n try {\n trace('planner.clarify.call');\n clarificationQuestions = await planner.clarify(rawRequirement, {\n intent,\n hasBaseline: !!baseline.summary,\n });\n trace(`planner.clarify.return n=${clarificationQuestions.length}`);\n spin.succeed(M.compile.clarifySucceed(clarificationQuestions.length));\n } catch (err) {\n spin.fail(M.compile.clarifyFail);\n throw err;\n }\n const interaction = requireRuntimeInteraction(io, 'clarification questions');\n for (const q of clarificationQuestions) {\n const rawAnswer = await interaction.input({ message: formatClarificationQuestion(q) });\n const ans = resolveClarificationAnswer(q, rawAnswer);\n clarifications.push({ question: q.question, answer: ans, category: q.category, why: q.why, options: q.options });\n await audit.userInput(M.compile.auditClarifyAnswer(q.id, q.question), ans);\n }\n }\n\n // 2.5 用户自定义补充需求(预留位,可为空)— topic 模式下也跳过(topic.md 应已自含全部上下文)\n let userAddenda = '';\n if (!opts.yes && !topicMode) {\n const interaction = requireRuntimeInteraction(io, 'user addenda');\n const want = await interaction.confirm({\n message: M.compile.addendaConfirm,\n default: false,\n });\n if (want) {\n userAddenda = (\n await interaction.editor({\n message: M.compile.addendaEditorMsg,\n default: '',\n postfix: '.md',\n })\n ).trim();\n if (userAddenda) {\n await audit.userInput(M.compile.auditUserAddenda, userAddenda);\n }\n }\n }\n const clarifyContext = {\n rawRequirement,\n questions: clarificationQuestions,\n clarifications,\n userAddenda,\n };\n await pluginHost.emit('compile.afterClarify', clarifyContext);\n rawRequirement = clarifyContext.rawRequirement;\n clarificationQuestions = clarifyContext.questions;\n userAddenda = clarifyContext.userAddenda;\n\n // 3. Draft topic.md + 确认门 1\n // topic.md 是“需求澄清后的项目选题书”,作为后续 V 模型拆解的唯一输入。\n // topic 模式下:rawRequirement 就是用户传入的 topic.md 全文,直接落盘,不再 render/Gate 1。\n const draftDir = 'docs/.draft';\n const draftTopic = `${draftDir}/topic.md`;\n trace('ws.ensure.draftDir');\n await ws.ensure(draftDir);\n let topicMd: string;\n if (topicMode) {\n topicMd = rawRequirement;\n await ws.writeFile(draftTopic, topicMd);\n } else {\n trace('renderTopicDraft');\n topicMd = renderTopicDraft(rawRequirement, clarifications, userAddenda);\n trace('ws.writeFile.draftTopic');\n await ws.writeFile(draftTopic, topicMd);\n trace('ws.writeFile.draftTopic.done');\n\n if (!opts.yes) {\n await runtimeLog(io, 'accent', `\\n${M.compile.topicPreviewHeader}`);\n await runtimeLog(io, 'raw', topicMd);\n await runtimeLog(io, 'accent', M.compile.topicPreviewFooter);\n const interaction = requireRuntimeInteraction(io, 'topic confirmation gate');\n const decision = await interaction.select({\n message: M.compile.gate1Confirm,\n choices: [\n { name: M.compile.gate1ChoiceConfirm, value: 'confirm' },\n { name: M.compile.gate1ChoiceEdit, value: 'edit' },\n { name: M.compile.gate1ChoiceCancel, value: 'cancel' },\n ],\n });\n await audit.userDecision(M.compile.gate1AuditLabel, decision);\n if (decision === 'cancel') {\n await ws.remove(draftDir);\n await runtimeLog(io, 'warning', M.compile.gate1Cancelled);\n await audit.end({ status: 'cancelled', gate: 1 });\n await runtimeResult(io, 'build', 'cancelled', { gate: 1 });\n return {};\n }\n if (decision === 'edit') {\n const edited = await interaction.editor({ message: M.compile.editTopicMsg, default: topicMd, postfix: '.md' });\n await ws.writeFile(draftTopic, edited);\n await audit.userInput(M.compile.auditEditedTopic, edited);\n }\n }\n }\n\n // 3.5 立即把 topic.md 写到最终位置(docs/topic.md),不再等到第 7 步。\n // 这样即使后续 decompose / lint 失败,已澄清的 topic 仍然落盘,\n // 下次可用 `xcompiler build --topic docs/topic.md` 直接重跑而不必再澄清一次。\n trace('ws.readFile.finalTopic');\n const finalTopicMd = await ws.readFile(draftTopic);\n await archiveIfExists(ws, DOC_NAMES.topic, audit);\n await ws.writeFile(DOC_NAMES.topic, finalTopicMd);\n await audit.event('topic.persist', M.compile.auditTopicPersisted(ws.abs(DOC_NAMES.topic)), {\n messageId: 'compile.topic_persisted',\n topicPath: ws.abs(DOC_NAMES.topic),\n mode: topicMode ? 'topic-input' : 'clarified',\n });\n await runtimeLog(io, 'success', M.compile.topicWritten(ws.abs(DOC_NAMES.topic)));\n\n // 4. Decompose — with topic.md as the V-model input\n trace('ora.spin2.start');\n const spin2 = io.progress(M.compile.spinDecompose, { animate: false });\n trace('ora.spin2.started');\n let draft;\n try {\n const plannerInput: PlannerInput = {\n rawRequirement: finalTopicMd,\n clarifications,\n userAddenda,\n baselineContext: baseline.summary,\n intent,\n };\n const decomposeContext = { input: plannerInput };\n await pluginHost.emit('compile.beforeDecompose', decomposeContext);\n draft = await planner.decompose(decomposeContext.input);\n } catch (err) {\n spin2.fail(M.compile.decomposeFail);\n const msg = (err as Error).message ?? String(err);\n await runtimeLog(io, 'error', `${M.compile.plannerInvalidPlan} ${msg}`);\n await runtimeLog(io, 'dim', M.compile.plannerInvalidPlanHint1);\n await runtimeLog(io, 'dim', M.compile.plannerInvalidPlanHint2);\n await audit.event('llm.error', M.compile.auditDecomposeFailed, {\n messageId: 'compile.decompose_failed', stage: 'decompose', error: msg,\n });\n await audit.end({ status: 'error', stage: 'decompose', error: msg });\n throw new CompileExitError(4, msg);\n }\n spin2.succeed(M.compile.decomposeSucceed(draft.steps.length));\n\n // 5. 构建并校验 plan\n let plan = buildPlan(draft, {\n userAddenda,\n language,\n intent,\n baselineSummary: baseline.summary,\n });\n const planContext = { plan };\n await pluginHost.emit('compile.afterPlan', planContext);\n plan = planContext.plan;\n const parsed = PlanSchema.safeParse(plan);\n if (!parsed.success) {\n await runtimeLog(io, 'error', M.compile.schemaFail);\n await runtimeLog(io, 'raw', JSON.stringify(parsed.error.format(), null, 2));\n await ws.writeFile(`${draftDir}/plan.invalid.json`, JSON.stringify(plan, null, 2));\n await runtimeLog(io, 'dim', M.compile.schemaInvalidSavedAt(ws.abs(`${draftDir}/plan.invalid.json`)));\n throw new CompileExitError(2, M.compile.schemaFail);\n }\n const issues = lintPlan(parsed.data).filter((i) => i.level === 'error');\n if (issues.length > 0) {\n await runtimeLog(io, 'error', M.compile.lintFail(issues.length));\n for (const i of issues) await runtimeLog(io, 'raw', M.compile.lintIssue(i.stepId ?? '*', i.message));\n // 落到 draft 便于排查\n await ws.writeFile(`${draftDir}/plan.invalid.json`, JSON.stringify(plan, null, 2));\n throw new CompileExitError(3, M.compile.lintFail(issues.length));\n }\n\n const planMd = renderPlanMarkdown(parsed.data);\n await ws.writeFile(`${draftDir}/plan.md`, planMd);\n\n // 6. 确认门 2\n if (!opts.yes) {\n await runtimeLog(io, 'accent', `\\n${M.compile.planPreviewHeader}`);\n await runtimeLog(io, 'raw', planMd.split('\\n').slice(0, 60).join('\\n'));\n if (planMd.split('\\n').length > 60) await runtimeLog(io, 'dim', M.compile.planPreviewTruncated);\n await runtimeLog(io, 'accent', M.compile.planPreviewFooter);\n const interaction = requireRuntimeInteraction(io, 'plan confirmation gate');\n const ok = await interaction.confirm({\n message: M.compile.gate2Confirm,\n default: false,\n });\n await audit.userDecision(M.compile.gate2AuditLabel, ok ? 'confirm' : 'reject');\n if (!ok) {\n await ws.remove(draftDir);\n await runtimeLog(io, 'warning', M.compile.gate2Rejected);\n await audit.end({ status: 'rejected', gate: 2 });\n await runtimeResult(io, 'build', 'rejected', { gate: 2 });\n return {};\n }\n }\n\n // 7. Persist\n const planPath = opts.outputFile\n ? path.resolve(opts.outputFile)\n : ws.abs('plan.json');\n await savePlan(planPath, parsed.data);\n // 归档上一版本(如有),再写入新版本。topic.md 已在第 3.5 步落盘,这里只处理 plan.\n await archiveIfExists(ws, DOC_NAMES.plan, audit);\n await ws.writeFile(DOC_NAMES.plan, planMd);\n await refreshProjectMemory(ws, {\n planPath,\n language: parsed.data.language,\n intent: parsed.data.intent,\n });\n await ws.remove(draftDir);\n await audit.event('plan.persist', M.compile.auditPlanPersisted(planPath), {\n messageId: 'compile.plan_persisted',\n planPath,\n steps: parsed.data.steps.length,\n });\n const projectFile = await updateProjectFile({\n workspace: ws.root,\n planPath,\n configPath: cfgPath,\n projectFilePath: opts.projectFilePath,\n command: opts.projectCommand ?? 'build',\n intent,\n plan: parsed.data,\n requirementFile: opts.inputFile,\n topicFile: opts.topicFile,\n recordHistory: true,\n });\n\n await runtimeLog(io, 'success', M.compile.planWritten(planPath));\n await runtimeLog(io, 'success', M.compile.projectFileWritten(projectFile));\n await runtimeLog(io, 'info', M.compile.nextCommand(`xcompiler run ${path.relative(process.cwd(), planPath)}`));\n await pluginHost.emit('compile.finish', { plan: parsed.data, planPath });\n await audit.end({ status: 'ok', planPath, steps: parsed.data.steps.length });\n await runtimeResult(io, 'build', 'ok', { planPath, steps: parsed.data.steps.length });\n return { planPath };\n } finally {\n try { await scoreStore?.flush(); } catch { /* never block release */ }\n await lock.release();\n }\n}\n\nasync function intake(inputFile: string | undefined, io: RuntimeIO): Promise<string> {\n if (inputFile) {\n return fs.readFile(path.resolve(inputFile), 'utf8');\n }\n return requireRuntimeInteraction(io, 'requirement intake').readMultiline({\n message: t().compile.requirementInputHint,\n });\n}\n\nfunction renderTopicDraft(\n raw: string,\n qa: Array<{\n question: string;\n answer: string;\n category?: ClarificationCategory;\n why?: string;\n options?: ClarifyOption[];\n }>,\n addenda: string = '',\n): string {\n const M = t().compile;\n const lines: string[] = [];\n lines.push(M.topicTitle);\n lines.push('');\n lines.push(M.topicPreamble);\n lines.push('');\n lines.push(M.topicSecRequirement);\n lines.push('');\n lines.push(raw.trim());\n lines.push('');\n if (qa.length > 0) {\n lines.push(M.topicSecClarify);\n lines.push('');\n for (const [i, c] of qa.entries()) {\n lines.push(`- **Q${i + 1}${c.category ? ` · ${c.category}` : ''}** ${c.question}`);\n if (c.why) lines.push(` - **Why** ${c.why}`);\n if (c.options && c.options.length > 0) {\n lines.push(' - **Options**');\n for (const option of c.options) {\n lines.push(` - ${option.label}. ${option.answer}`);\n }\n }\n lines.push(` - **A** ${c.answer}`);\n }\n lines.push('');\n }\n const trimmed = addenda.trim();\n if (trimmed) {\n lines.push(M.topicSecAddenda);\n lines.push('');\n lines.push(trimmed);\n lines.push('');\n }\n return lines.join('\\n');\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport { z } from 'zod';\nimport 'dotenv/config';\nimport { t } from '../i18n/index.js';\nimport { xcEnv } from './env.js';\n\nconst ProviderStringScalarSchema = z.union([z.string(), z.number(), z.boolean()]);\nconst OptionalProviderStringSchema = ProviderStringScalarSchema.nullish().transform((v) =>\n v == null ? '' : String(v),\n);\nconst RequiredProviderStringSchema = ProviderStringScalarSchema.transform((v) => String(v)).pipe(\n z.string().min(1),\n);\n\nconst ProviderSchema = z.object({\n api_key: OptionalProviderStringSchema,\n base_url: OptionalProviderStringSchema,\n model: RequiredProviderStringSchema,\n /** 请求 wall-clock 总超时(毫秒)。默认 10 分钟。0 = 不限制。 */\n request_timeout_ms: z.number().int().nonnegative().optional(),\n /** 流式空闲超时(毫秒)。默认 60s。0 = 不限制。 */\n stream_idle_timeout_ms: z.number().int().nonnegative().optional(),\n /** 流式输出字符上限。默认 200000。0 = 不限制。 */\n max_output_chars: z.number().int().nonnegative().optional(),\n /** Ollama thinking 模型是否启用长思考;弱服务器上的结构化任务可设为 false。 */\n think: z.boolean().optional(),\n});\n\nconst LocaleSchema = z.enum(['en', 'zh']);\n\nconst ConfigSchema = z.object({\n /** CLI / prompt locale. Accepts 'en' (default) or 'zh'. */\n locale: LocaleSchema.optional(),\n /** @deprecated use `locale` instead. Kept as a backwards-compatible alias. */\n ui_language: LocaleSchema.optional(),\n llm: z.object({\n default: z.string(),\n providers: z.record(z.string(), ProviderSchema),\n /**\n * 角色 → provider 数组的映射。\n * 兼容旧格式:单字符串 `Coder: ollama_code` 自动归一化为 `[ollama_code]`。\n * 数组形式 `Coder: [ollama_code, openai]` 表示该角色的候选 LLM 池;\n * 实际选择顺序由 `llm.scores` 评分降序决定,评分=0 的 provider 直接跳过。\n */\n roles: z\n .record(z.string(), z.union([z.string(), z.array(z.string())]))\n .default({})\n .transform((obj) => {\n const out: Record<string, string[]> = {};\n for (const [k, v] of Object.entries(obj)) {\n out[k] = Array.isArray(v) ? [...v] : [v];\n }\n return out;\n }),\n /** 全局 fallback 链:当主 provider 调用报错时依次尝试 */\n fallbacks: z.array(z.string()).default([]),\n /** 可选:按角色指定 fallback 链(覆盖全局) */\n role_fallbacks: z.record(z.string(), z.array(z.string())).default({}),\n /**\n * Provider 评分快照(启动时从 sidecar 文件加载,运行时由 ScoreStore 维护并自动落盘)。\n * 配置文件里也可以手工设置初始值;不存在的 provider 默认评分 = 1。\n * 评分 = 0 表示禁用(preflight 检测到模型不在 ollama 服务器时也会置 0)。\n */\n scores: z.record(z.string(), z.number().min(0)).default({}),\n }),\n agent: z.object({\n language: z.enum(['python', 'typescript']).default('python'),\n max_steps: z.number().int().positive().default(50),\n max_debug_retries: z.number().int().positive().default(3),\n /** Debugger 滑动窗口的硬上限(默认 = max(max_debug_retries*4, 10))。 */\n max_debug_retries_cap: z.number().int().positive().optional(),\n max_rounds_per_step: z.number().int().positive().default(6),\n max_debug_rounds_per_step: z.number().int().positive().optional(),\n max_edit_lines_per_step: z.union([z.literal('auto'), z.number().int().positive()]).default('auto'),\n max_write_chunk_bytes: z.union([z.literal('auto'), z.number().int().positive()]).default('auto'),\n sandbox: z.enum(['subprocess', 'docker', 'firejail']).default('subprocess'),\n sandbox_limits: z\n .object({\n cpu: z.number().positive().default(1),\n memory_mb: z.number().int().positive().default(1024),\n wall_seconds: z.number().int().positive().default(60),\n /**\n * Sandbox network policy.\n * - `off` — no network at all (`docker --network none`).\n * - `download-only` — outbound traffic allowed, no inbound port publishing\n * (default; lets python pip-install / fetch web pages).\n * - `pypi-only` — legacy value; rejected at sandbox creation rather than silently\n * allowing unrestricted outbound traffic.\n * - `full` — outbound + every port in `expose_ports` is published\n * to `127.0.0.1` so host-side tests can reach the app.\n */\n network: z\n .enum(['off', 'pypi-only', 'download-only', 'full'])\n .default('download-only'),\n /** Container ports to publish to 127.0.0.1 when `network=full`. */\n expose_ports: z.array(z.number().int().min(1).max(65535)).default([]),\n })\n .default({\n cpu: 1,\n memory_mb: 1024,\n wall_seconds: 60,\n network: 'download-only',\n expose_ports: [],\n }),\n sandbox_docker: z\n .object({\n image: z.string().default('python:3.11-slim'),\n workdir: z.string().default('/workspace'),\n pull: z.boolean().default(false),\n docker_bin: z.string().default('docker'),\n extra_run_args: z.array(z.string()).default([]),\n })\n .default({\n image: 'python:3.11-slim',\n workdir: '/workspace',\n pull: false,\n docker_bin: 'docker',\n extra_run_args: [],\n }),\n }),\n}).transform(({ locale, ui_language, ...rest }) => ({\n locale: locale ?? ui_language ?? 'en',\n ...rest,\n}));\n\nexport type XCompilerConfig = z.infer<typeof ConfigSchema>;\n\n/**\n * 配置文件查找顺序(优先级从高到低):\n * 1. 显式 --config / explicitPath\n * 2. 当前目录 ./config.yaml\n * 3. $XC_PATH/config.yaml (安装/全局配置目录,默认 ~/.xc)\n * 4. 当前目录 ./config.example.yaml (仓库 fallback)\n * 5. $XC_PATH/config.example.yaml\n */\nexport function getXCompilerPath(): string {\n const env = xcEnv('PATH');\n if (env && env.trim()) return path.resolve(env.trim());\n const home = process.env.HOME ?? process.env.USERPROFILE ?? '/root';\n return path.join(home, '.xc');\n}\n\nfunction defaultSearchPaths(): string[] {\n const xcompilerPath = getXCompilerPath();\n return [\n path.resolve('config.yaml'),\n path.join(xcompilerPath, 'config.yaml'),\n path.resolve('config.example.yaml'),\n path.join(xcompilerPath, 'config.example.yaml'),\n ];\n}\n\nexport async function loadConfig(explicitPath?: string): Promise<XCompilerConfig> {\n const r = await loadConfigWithPath(explicitPath);\n return r.config;\n}\n\nexport interface LoadedConfig {\n config: XCompilerConfig;\n /** 实际命中的 config 文件绝对路径(供 ScoreStore 在同目录下落盘 sidecar 评分文件)。 */\n path: string;\n}\n\nexport async function loadConfigWithPath(explicitPath?: string): Promise<LoadedConfig> {\n const tried: string[] = [];\n const candidates = explicitPath ? [path.resolve(explicitPath)] : defaultSearchPaths();\n for (const abs of candidates) {\n tried.push(abs);\n try {\n const raw = await fs.readFile(abs, 'utf8');\n const expanded = expandEnv(raw);\n const data = YAML.parse(expanded);\n return { config: ConfigSchema.parse(data), path: abs };\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') continue;\n throw err;\n }\n }\n throw new Error(\n `No config file found. Tried (in order):\\n ${tried.join('\\n ')}\\n` +\n `\\nHint: set XC_PATH to point at a directory containing config.yaml, ` +\n `or run from a directory that contains config.yaml.`,\n );\n}\n\nfunction expandEnv(s: string): string {\n const missing = new Set<string>();\n const out = s.replace(/\\$\\{([A-Z0-9_]+)\\}/g, (_, name) => {\n const v = process.env[name];\n if (v === undefined || v === '') {\n missing.add(name);\n return '';\n }\n return v;\n });\n if (missing.size > 0) {\n // 不抛错(OPENAI_* 在不使用 openai provider 时确实可缺),但给出明显提示。\n // 若关键 provider 因此变成空 base_url,createClient 会兜底到 localhost。\n console.warn(t().system.configEnvMissing([...missing].join(', ')));\n }\n return out;\n}\n","export function xcEnv(name: string): string | undefined {\n return firstEnv(`XC_${name}`, `XCOMPILER_${name}`);\n}\n\nexport function hasXcEnv(name: string): boolean {\n return xcEnv(name) !== undefined;\n}\n\nfunction firstEnv(...names: string[]): string | undefined {\n for (const name of names) {\n const value = process.env[name];\n if (value !== undefined && value !== '') return value;\n }\n return undefined;\n}\n","import * as http from 'node:http';\nimport * as https from 'node:https';\nimport { URL } from 'node:url';\nimport type { ChatMessage, ChatOptions, LLMClient } from './types.js';\nimport { detectCyclicTokenLoop, RepeatTokenDetector } from './stream_watchdog.js';\n\nexport interface OllamaConfig {\n baseUrl: string;\n model: string;\n /** 请求 wall-clock 总超时,毫秒。默认 10 分钟,0 表示无超时。 */\n requestTimeoutMs?: number;\n /** 流式模式下,连续多久没有新 token 即视为卡死并中断;默认 60s。 */\n streamIdleTimeoutMs?: number;\n /** 流式模式下输出字符上限,超过即中断(防 token-loop 撑爆内存);默认 200_000。 */\n maxOutputChars?: number;\n /** 是否启用 Ollama thinking;不设置时遵循模型默认值。 */\n think?: boolean;\n}\n\ninterface OllamaChatResponse {\n message?: { role: string; content: string };\n error?: string;\n done?: boolean;\n}\n\nexport class OllamaClient implements LLMClient {\n readonly name: string;\n constructor(private readonly cfg: OllamaConfig) {\n this.name = `ollama:${cfg.model}`;\n }\n\n async chat(messages: ChatMessage[], options?: ChatOptions): Promise<string> {\n const url = new URL('/api/chat', this.cfg.baseUrl);\n const stream = !!options?.onToken;\n const body = {\n model: this.cfg.model,\n messages,\n stream,\n format: options?.responseFormat === 'json' ? 'json' : undefined,\n think: this.cfg.think,\n options: {\n temperature: options?.temperature ?? 0.2,\n num_predict: options?.maxTokens,\n },\n };\n const timeoutMs = this.cfg.requestTimeoutMs ?? 10 * 60 * 1000;\n const idleTimeoutMs = this.cfg.streamIdleTimeoutMs ?? 60 * 1000;\n const maxOutputChars = this.cfg.maxOutputChars ?? 200_000;\n if (stream) {\n return streamPostNdjson(\n url,\n body,\n { timeoutMs, idleTimeoutMs, maxOutputChars },\n (line) => {\n try {\n const obj = JSON.parse(line) as OllamaChatResponse;\n const piece = obj.message?.content;\n if (piece) options!.onToken!(piece);\n } catch {\n /* ignore non-JSON keep-alive */\n }\n },\n (aggregate) => {\n try {\n if (options?.streamStopWhen?.(aggregate)) return true;\n } catch {\n /* ignore stop predicate errors during partial streams */\n }\n if (!options?.validate) return false;\n try {\n options.validate(aggregate);\n return true;\n } catch {\n return false;\n }\n },\n );\n }\n const text = await postJson(url, body, timeoutMs);\n let json: OllamaChatResponse;\n try {\n json = JSON.parse(text) as OllamaChatResponse;\n } catch (err) {\n throw new Error(`Ollama: non-JSON response: ${(err as Error).message}\\n${text.slice(0, 500)}`, {\n cause: err,\n });\n }\n if (json.error) throw new Error(`Ollama error: ${json.error}`);\n return json.message?.content ?? '';\n }\n}\n\nexport interface StreamWatchdog {\n /** 整体 wall-clock 超时(>0 启用)。 */\n timeoutMs: number;\n /** 连续多久没有新 token 即视为卡死。0 关闭。 */\n idleTimeoutMs: number;\n /** 输出字符上限。0 关闭。 */\n maxOutputChars: number;\n}\n\n/**\n * 与 postJson 相同的连接策略,但消费 NDJSON 流:\n * - 每收到一行就调用 onLine(line);\n * - 同时把流中所有 message.content 拼起来作为最终返回;\n * - watchdog: 整体超时 / 空闲超时 / 输出上限 / token-loop 触发即 destroy(req) 并 reject。\n */\nexport function streamPostNdjson(\n url: URL,\n body: unknown,\n watchdog: StreamWatchdog,\n onLine: (line: string) => void,\n shouldStopWhen?: (aggregate: string) => boolean,\n): Promise<string> {\n const lib = url.protocol === 'https:' ? https : http;\n const payload = JSON.stringify(body);\n return new Promise((resolve, reject) => {\n let settled = false;\n let response: http.IncomingMessage | null = null;\n let idleTimer: NodeJS.Timeout | null = null;\n let wallTimer: NodeJS.Timeout | null = null;\n\n const cleanup = () => {\n if (idleTimer) clearTimeout(idleTimer);\n if (wallTimer) clearTimeout(wallTimer);\n idleTimer = null;\n wallTimer = null;\n };\n const finish = (value: string) => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(value);\n response?.destroy();\n req.destroy();\n };\n const fail = (err: Error) => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(err);\n response?.destroy();\n req.destroy();\n };\n const armIdle = () => {\n if (watchdog.idleTimeoutMs <= 0 || settled) return;\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => {\n fail(new Error(`stream idle for ${watchdog.idleTimeoutMs}ms; aborting`));\n }, watchdog.idleTimeoutMs);\n };\n\n // 两个 watchdog 都必须覆盖 DNS / TCP connect / 等待响应头阶段。\n // 旧实现把它们建在 response 回调里:服务端若接受连接后不回响应头,\n // callback 永远不执行,请求也就永远没有任何超时保护。\n const req: http.ClientRequest = lib.request(\n {\n method: 'POST',\n protocol: url.protocol,\n hostname: url.hostname,\n port: url.port || (url.protocol === 'https:' ? 443 : 80),\n path: url.pathname + url.search,\n headers: {\n 'content-type': 'application/json',\n 'content-length': Buffer.byteLength(payload),\n accept: 'application/x-ndjson',\n },\n },\n (res) => {\n response = res;\n let aggregate = '';\n let buf = '';\n let errBody = '';\n const repeatDetector = new RepeatTokenDetector();\n const isError = !res.statusCode || res.statusCode >= 400;\n armIdle();\n res.setEncoding('utf8');\n res.on('data', (chunk: string) => {\n if (settled) return;\n if (isError) {\n errBody += chunk;\n return;\n }\n armIdle();\n buf += chunk;\n let idx;\n while ((idx = buf.indexOf('\\n')) >= 0) {\n const line = buf.slice(0, idx).trim();\n buf = buf.slice(idx + 1);\n if (!line) continue;\n let obj: OllamaChatResponse | null = null;\n try {\n obj = JSON.parse(line) as OllamaChatResponse;\n const piece = obj.message?.content;\n if (piece) {\n aggregate += piece;\n if (repeatDetector.feed(piece)) {\n fail(\n new Error('detected token loop in stream (repeated identical token); aborting'),\n );\n return;\n }\n if (detectCyclicTokenLoop(aggregate)) {\n fail(\n new Error('detected cyclic token loop in stream (periodic tail); aborting'),\n );\n return;\n }\n }\n if (obj.error) {\n fail(new Error(`Ollama error: ${obj.error}`));\n return;\n }\n } catch {\n /* skip */\n }\n try {\n onLine(line);\n } catch (err) {\n fail(err instanceof Error ? err : new Error(String(err)));\n return;\n }\n if (obj?.done === true) {\n finish(aggregate);\n return;\n }\n try {\n if (shouldStopWhen?.(aggregate)) {\n finish(aggregate);\n return;\n }\n } catch {\n /* ignore partial-output stop predicate failures */\n }\n // watchdog: 输出上限\n if (watchdog.maxOutputChars > 0 && aggregate.length > watchdog.maxOutputChars) {\n fail(\n new Error(\n `stream output exceeded ${watchdog.maxOutputChars} chars (likely token loop); aborting`,\n ),\n );\n return;\n }\n // watchdog: token loop\n if (detectCyclicTokenLoop(aggregate)) {\n fail(new Error('detected token loop in stream; aborting'));\n return;\n }\n }\n });\n res.on('end', () => {\n if (settled) return;\n if (isError) {\n fail(new Error(`HTTP ${res.statusCode}: ${errBody.slice(0, 500)}`));\n } else {\n finish(aggregate);\n }\n });\n res.on('error', (e) => {\n fail(e);\n });\n res.on('aborted', () => {\n fail(new Error('stream response aborted before completion'));\n });\n },\n );\n req.on('error', (err) => {\n fail(err);\n });\n if (watchdog.timeoutMs > 0) {\n wallTimer = setTimeout(() => {\n fail(new Error(`stream wall-clock ${watchdog.timeoutMs}ms exceeded; aborting`));\n }, watchdog.timeoutMs);\n }\n armIdle();\n req.write(payload);\n req.end();\n });\n}\n\n/** 通用 POST JSON helper:使用 node:http(s),不设 socket 默认超时,可选 wall-clock 超时。 */\nexport function postJson(url: URL, body: unknown, timeoutMs: number): Promise<string> {\n const lib = url.protocol === 'https:' ? https : http;\n const payload = JSON.stringify(body);\n return new Promise((resolve, reject) => {\n const req = lib.request(\n {\n method: 'POST',\n protocol: url.protocol,\n hostname: url.hostname,\n port: url.port || (url.protocol === 'https:' ? 443 : 80),\n path: url.pathname + url.search,\n headers: {\n 'content-type': 'application/json',\n 'content-length': Buffer.byteLength(payload),\n accept: 'application/json',\n },\n },\n (res) => {\n const chunks: Buffer[] = [];\n res.on('data', (c) => chunks.push(c));\n res.on('end', () => {\n const text = Buffer.concat(chunks).toString('utf8');\n if (!res.statusCode || res.statusCode >= 400) {\n reject(new Error(`HTTP ${res.statusCode}: ${text.slice(0, 500)}`));\n } else {\n resolve(text);\n }\n });\n res.on('error', reject);\n },\n );\n req.on('error', reject);\n if (timeoutMs > 0) {\n const t = setTimeout(() => {\n req.destroy(new Error(`request timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n req.on('close', () => clearTimeout(t));\n }\n req.write(payload);\n req.end();\n });\n}\n\n/** 通用 GET JSON helper(preflight 探活 ollama /api/tags 用)。失败抛 Error。 */\nexport function getJson(url: URL, timeoutMs: number): Promise<string> {\n const lib = url.protocol === 'https:' ? https : http;\n return new Promise((resolve, reject) => {\n const req = lib.request(\n {\n method: 'GET',\n protocol: url.protocol,\n hostname: url.hostname,\n port: url.port || (url.protocol === 'https:' ? 443 : 80),\n path: url.pathname + url.search,\n headers: { accept: 'application/json' },\n },\n (res) => {\n const chunks: Buffer[] = [];\n res.on('data', (c) => chunks.push(c));\n res.on('end', () => {\n const text = Buffer.concat(chunks).toString('utf8');\n if (!res.statusCode || res.statusCode >= 400) {\n reject(new Error(`HTTP ${res.statusCode}: ${text.slice(0, 500)}`));\n } else {\n resolve(text);\n }\n });\n res.on('error', reject);\n },\n );\n req.on('error', reject);\n if (timeoutMs > 0) {\n const t = setTimeout(() => {\n req.destroy(new Error(`request timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n req.on('close', () => clearTimeout(t));\n }\n req.end();\n });\n}\n","const LOOP_REPEATS = 12;\nconst LOOP_MIN_LEN = 1_500;\nconst LOOP_MIN_WINDOW = 96;\nconst LOOP_MAX_PERIOD = 256;\n\n/**\n * Detects a model stuck in a periodic tail, such as `0000...` or a short phrase\n * repeated indefinitely. The minimum length keeps normal short tables/code away\n * from the detector.\n */\nexport function detectCyclicTokenLoop(aggregate: string): boolean {\n if (aggregate.length < LOOP_MIN_LEN) return false;\n const maxPeriod = Math.min(LOOP_MAX_PERIOD, Math.floor(aggregate.length / LOOP_REPEATS));\n for (let period = 1; period <= maxPeriod; period++) {\n const repeats = Math.max(LOOP_REPEATS, Math.ceil(LOOP_MIN_WINDOW / period));\n const need = period * repeats;\n if (need > aggregate.length) continue;\n const tail = aggregate.slice(-need);\n const ref = tail.slice(0, period);\n if (/^\\s+$/.test(ref)) continue;\n let ok = true;\n for (let i = 1; i < repeats; i++) {\n if (tail.slice(i * period, (i + 1) * period) !== ref) {\n ok = false;\n break;\n }\n }\n if (ok) return true;\n }\n return false;\n}\n\nexport class RepeatTokenDetector {\n private last: string | null = null;\n private streak = 0;\n\n constructor(private readonly threshold = 40) {}\n\n feed(piece: string): boolean {\n if (!piece) return false;\n if (piece === this.last) {\n this.streak++;\n return this.streak >= this.threshold;\n }\n this.last = piece;\n this.streak = 1;\n return false;\n }\n}\n","import type { ChatMessage, ChatOptions, LLMClient } from './types.js';\nimport { detectCyclicTokenLoop, RepeatTokenDetector } from './stream_watchdog.js';\n\nexport interface OpenAIConfig {\n apiKey: string;\n baseUrl: string;\n model: string;\n /** 请求 wall-clock 总超时,毫秒。默认 10 分钟,0 表示无超时。 */\n requestTimeoutMs?: number;\n /** 流式模式下,连续多久没有新 token 即视为卡死并中断;默认 60s,0 关闭。 */\n streamIdleTimeoutMs?: number;\n /** 流式模式下输出字符上限,超过即中断(防 token-loop 撑爆内存);默认 200_000,0 关闭。 */\n maxOutputChars?: number;\n}\n\ninterface OpenAIChatResponse {\n choices?: Array<{ message?: { content?: string } }>;\n error?: { message: string };\n}\n\ninterface OpenAIStreamChunk {\n choices?: Array<{\n delta?: { content?: string };\n message?: { content?: string };\n finish_reason?: string | null;\n }>;\n error?: { message?: string };\n done?: boolean;\n}\n\nexport class OpenAIClient implements LLMClient {\n readonly name: string;\n constructor(private readonly cfg: OpenAIConfig) {\n this.name = `openai:${cfg.model}`;\n }\n\n async chat(messages: ChatMessage[], options?: ChatOptions): Promise<string> {\n const url = `${this.cfg.baseUrl.replace(/\\/$/, '')}/chat/completions`;\n const body: Record<string, unknown> = {\n model: this.cfg.model,\n messages,\n temperature: options?.temperature ?? 0.2,\n max_tokens: options?.maxTokens,\n stream: !!options?.onToken,\n };\n if (options?.responseFormat === 'json') {\n body.response_format = { type: 'json_object' };\n }\n if (options?.onToken) return this.streamChat(url, body, options);\n const ctrl = new AbortController();\n const timeoutMs = this.cfg.requestTimeoutMs ?? 10 * 60 * 1000;\n const timer = timeoutMs > 0 ? setTimeout(() => ctrl.abort(new Error(`request timed out after ${timeoutMs}ms`)), timeoutMs) : null;\n const headers: Record<string, string> = { 'content-type': 'application/json' };\n if (this.cfg.apiKey) headers.authorization = `Bearer ${this.cfg.apiKey}`;\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: ctrl.signal,\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`OpenAI HTTP ${res.status}: ${text}`);\n }\n const json = (await res.json()) as OpenAIChatResponse;\n if (json.error) throw new Error(`OpenAI error: ${json.error.message}`);\n return json.choices?.[0]?.message?.content ?? '';\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n\n private async streamChat(url: string, body: Record<string, unknown>, options: ChatOptions): Promise<string> {\n const ctrl = new AbortController();\n const timeoutMs = this.cfg.requestTimeoutMs ?? 10 * 60 * 1000;\n const idleTimeoutMs = this.cfg.streamIdleTimeoutMs ?? 60 * 1000;\n const maxOutputChars = this.cfg.maxOutputChars ?? 200_000;\n\n // 把 watchdog 触发的中断原因记下来,因为底层 reader 在 abort 时\n // 抛出的是泛型 AbortError,会丢失我们的人类可读信息。\n let abortReason: Error | null = null;\n const abort = (err: Error) => {\n if (!abortReason) abortReason = err;\n ctrl.abort(err);\n };\n\n const wallTimer =\n timeoutMs > 0\n ? setTimeout(\n () => abort(new Error(`OpenAI stream wall-clock ${timeoutMs}ms exceeded; aborting`)),\n timeoutMs,\n )\n : null;\n let idleTimer: NodeJS.Timeout | null = null;\n const armIdle = () => {\n if (idleTimeoutMs <= 0) return;\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(\n () => abort(new Error(`OpenAI stream idle for ${idleTimeoutMs}ms; aborting`)),\n idleTimeoutMs,\n );\n };\n const cleanup = () => {\n if (wallTimer) clearTimeout(wallTimer);\n if (idleTimer) clearTimeout(idleTimer);\n };\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n accept: 'text/event-stream',\n };\n if (this.cfg.apiKey) headers.authorization = `Bearer ${this.cfg.apiKey}`;\n try {\n armIdle();\n const res = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: ctrl.signal,\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`OpenAI HTTP ${res.status}: ${text}`);\n }\n if (!res.body) throw new Error('OpenAI stream response has no body');\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buf = '';\n let aggregate = '';\n let done = false;\n let cancelled = false;\n const repeatDetector = new RepeatTokenDetector();\n const cancelReader = () => {\n if (cancelled) return;\n cancelled = true;\n ctrl.abort();\n void reader.cancel().catch(() => {});\n };\n const shouldStopByContent = () => {\n try {\n if (options.streamStopWhen?.(aggregate)) return true;\n } catch {\n /* ignore stop predicate errors during partial streams */\n }\n if (!options.validate) return false;\n try {\n options.validate(aggregate);\n return true;\n } catch {\n return false;\n }\n };\n const onData = (data: string) => {\n if (data === '[DONE]') {\n done = true;\n return;\n }\n let chunk: OpenAIStreamChunk;\n try {\n chunk = JSON.parse(data) as OpenAIStreamChunk;\n } catch {\n return;\n }\n if (chunk.error) throw new Error(`OpenAI error: ${chunk.error.message ?? JSON.stringify(chunk.error)}`);\n if (chunk.done === true) {\n done = true;\n }\n let terminalChoice = false;\n for (const choice of chunk.choices ?? []) {\n if (choice.finish_reason && choice.finish_reason !== 'tool_calls') {\n terminalChoice = true;\n }\n const piece = choice.delta?.content ?? choice.message?.content ?? '';\n if (!piece) continue;\n aggregate += piece;\n options.onToken?.(piece);\n if (repeatDetector.feed(piece)) {\n throw new Error('detected token loop in OpenAI stream (repeated identical token); aborting');\n }\n if (detectCyclicTokenLoop(aggregate)) {\n throw new Error('detected cyclic token loop in OpenAI stream (periodic tail); aborting');\n }\n if (maxOutputChars > 0 && aggregate.length > maxOutputChars) {\n throw new Error(\n `OpenAI stream output exceeded ${maxOutputChars} chars (likely token loop); aborting`,\n );\n }\n if (shouldStopByContent()) {\n done = true;\n return;\n }\n }\n if (terminalChoice || shouldStopByContent()) done = true;\n };\n\n try {\n while (!done) {\n const { value, done: readerDone } = await reader.read();\n if (readerDone) break;\n armIdle();\n buf += decoder.decode(value, { stream: true });\n let sep = findSseSeparator(buf);\n while (sep) {\n const event = buf.slice(0, sep.index);\n buf = buf.slice(sep.index + sep.length);\n for (const line of event.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed.startsWith('data:')) continue;\n onData(trimmed.slice(5).trim());\n if (done) break;\n }\n if (done) break;\n sep = findSseSeparator(buf);\n }\n }\n if (done && !cancelled) {\n cancelReader();\n } else {\n buf += decoder.decode();\n for (const line of buf.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed.startsWith('data:')) continue;\n onData(trimmed.slice(5).trim());\n }\n }\n } catch (err) {\n // 确保连接被释放;优先抛出 watchdog 的可读原因。\n ctrl.abort();\n throw abortReason ?? (err as Error);\n }\n return aggregate;\n } finally {\n cleanup();\n }\n }\n}\n\nfunction findSseSeparator(buf: string): { index: number; length: number } | null {\n const lf = buf.indexOf('\\n\\n');\n const crlf = buf.indexOf('\\r\\n\\r\\n');\n if (lf < 0) return crlf < 0 ? null : { index: crlf, length: 4 };\n if (crlf < 0 || lf < crlf) return { index: lf, length: 2 };\n return { index: crlf, length: 4 };\n}\n","import type { XCompilerConfig } from '../config/config.js';\nimport type { Role } from '../core/plan.js';\nimport type { AuditLogger } from '../audit/audit.js';\nimport { OllamaClient } from './ollama.js';\nimport { OpenAIClient } from './openai.js';\nimport type { ScoreStore } from './scores.js';\nimport type { ChatMessage, ChatOptions, LLMClient } from './types.js';\nimport { t } from '../i18n/index.js';\nimport type { PluginHost } from '../plugins/host.js';\n\nexport class LLMRouter {\n private readonly clients = new Map<string, LLMClient>();\n\n constructor(\n private readonly cfg: XCompilerConfig,\n private readonly audit?: AuditLogger,\n private readonly scores?: ScoreStore,\n private readonly unavailable: ReadonlySet<string> = new Set(),\n private readonly plugins?: PluginHost,\n ) {\n for (const [name, p] of Object.entries(cfg.llm.providers)) {\n const client = createClient(name, p);\n if (client) this.clients.set(name, client);\n }\n }\n\n /**\n * 返回某角色的 LLM 客户端:自动包含按评分排序的候选链。\n *\n * 候选集合:roles[role] (数组) ∪ role_fallbacks[role] ∪ default ∪ fallbacks,去重。\n * 排序:按 ScoreStore 的评分降序;评分 = 0 的 provider 直接剔除。\n * 链中第一个调用成功即返回;失败 → 自动降评分并尝试下一个。\n */\n for(role: Role | 'default' = 'default'): LLMClient {\n const candidates = this.resolveChain(role);\n if (candidates.length === 0) {\n throw new Error(`LLM provider not configured for role: ${role}`);\n }\n const ranked = this.rankByScore(candidates);\n if (ranked.length === 0) {\n throw new Error(\n `No usable LLM provider for role ${role}: candidates [${candidates.join(', ')}] ` +\n `are disabled or unreachable in this run. Run preflight or restore at least one provider in config.`,\n );\n }\n const clients = ranked\n .map((name) => ({ name, client: this.clients.get(name) }))\n .filter((x): x is { name: string; client: LLMClient } => !!x.client);\n if (clients.length === 0) {\n throw new Error(`No usable LLM provider in chain for role ${role}: [${ranked.join(', ')}]`);\n }\n const composite = new FallbackClient(\n clients.map((c) => ({ name: c.name, client: c.client })),\n this.audit,\n String(role),\n this.scores,\n );\n const observable = this.audit\n ? wrapWithAudit(composite, String(role), this.audit)\n : composite;\n return this.plugins && this.plugins.size > 0\n ? this.plugins.wrapLLM(observable, String(role))\n : observable;\n }\n\n /** 返回某角色按当前评分/可用性解析后的首选 provider 与模型,供启动诊断使用。 */\n primarySelection(role: Role | 'default'): { provider: string; model: string } | undefined {\n const ranked = this.rankByScore(this.resolveChain(role));\n for (const provider of ranked) {\n const config = this.cfg.llm.providers[provider];\n if (config && this.clients.has(provider)) return { provider, model: config.model };\n }\n return undefined;\n }\n\n private resolveChain(role: Role | 'default'): string[] {\n const out: string[] = [];\n const push = (n: string | undefined) => {\n if (n && !out.includes(n)) out.push(n);\n };\n if (role !== 'default') {\n const explicit = this.cfg.llm.role_fallbacks?.[role];\n if (explicit && explicit.length > 0) {\n for (const n of explicit) push(n);\n return out;\n }\n // roles[role] 现已是数组形式(schema transform 强制)\n for (const n of this.cfg.llm.roles?.[role] ?? []) push(n);\n }\n push(this.cfg.llm.default);\n for (const f of this.cfg.llm.fallbacks ?? []) push(f);\n return out;\n }\n\n /** 按评分降序排序;评分 = 0 的剔除;并列保持声明顺序(稳定排序)。 */\n private rankByScore(names: string[]): string[] {\n if (!this.scores) return names.filter((name) => !this.unavailable.has(name));\n const scored = names.map((n, i) => ({ n, i, s: this.scores!.get(n) }));\n return scored\n .filter((x) => x.s > 0 && !this.unavailable.has(x.n))\n .sort((a, b) => (b.s - a.s) || (a.i - b.i))\n .map((x) => x.n);\n }\n}\n\n/** 顺序尝试 provider,第一个成功即返回;全部失败则抛最后一个错。 */\nclass FallbackClient implements LLMClient {\n readonly name: string;\n constructor(\n private readonly chain: { name: string; client: LLMClient }[],\n private readonly audit: AuditLogger | undefined,\n private readonly role: string,\n private readonly scores?: ScoreStore,\n ) {\n this.name = chain.length === 1\n ? chain[0]!.client.name\n : `chain[${chain.map((c) => c.client.name).join('>')}]`;\n }\n\n async chat(messages: ChatMessage[], options?: ChatOptions): Promise<string> {\n let lastErr: unknown;\n for (let i = 0; i < this.chain.length; i++) {\n const c = this.chain[i]!;\n try {\n try { options?.onProviderStart?.(c.name, c.client.name); } catch { /* display only */ }\n const out = await c.client.chat(messages, options);\n if (options?.validate) {\n try {\n options.validate(out);\n } catch (vErr) {\n await this.audit?.event(\n 'llm.error',\n t().llm.providerValidationFailed(this.role, c.client.name),\n {\n messageId: 'llm.provider_validation_failed',\n provider: c.name,\n attempt: i + 1,\n remaining: this.chain.length - i - 1,\n error: (vErr as Error).message,\n output_preview: out.slice(0, 400),\n },\n );\n this.scores?.decay(c.name, `validate failed in role ${this.role}`);\n lastErr = vErr;\n continue;\n }\n }\n this.scores?.boost(c.name, `success in role ${this.role}`);\n try { options?.onProvider?.(c.name); } catch { /* observability must not fail the call */ }\n return out;\n } catch (err) {\n lastErr = err;\n this.scores?.decay(c.name, `chat threw in role ${this.role}: ${(err as Error).message.slice(0, 120)}`);\n await this.audit?.event(\n 'llm.error',\n t().llm.providerCallFailed(this.role, c.client.name),\n {\n messageId: 'llm.provider_call_failed',\n provider: c.name,\n attempt: i + 1,\n remaining: this.chain.length - i - 1,\n error: (err as Error).message,\n },\n );\n }\n }\n throw lastErr instanceof Error ? lastErr : new Error('all LLM providers failed');\n }\n}\n\nfunction wrapWithAudit(inner: LLMClient, role: string, audit: AuditLogger): LLMClient {\n return {\n name: inner.name,\n async chat(messages: ChatMessage[], options?: ChatOptions): Promise<string> {\n await audit.llmRequest(role, inner.name, messages, options);\n try {\n const out = await inner.chat(messages, options);\n await audit.llmResponse(role, inner.name, out);\n return out;\n } catch (err) {\n await audit.llmError(role, inner.name, err);\n throw err;\n }\n },\n };\n}\n\nfunction createClient(\n name: string,\n p: {\n api_key?: string;\n base_url?: string;\n model: string;\n request_timeout_ms?: number;\n stream_idle_timeout_ms?: number;\n max_output_chars?: number;\n think?: boolean;\n },\n): LLMClient | null {\n if (isOllamaProvider(name)) {\n return new OllamaClient({\n baseUrl: normalizeBaseUrl(p.base_url, 'http://localhost:11434'),\n model: p.model,\n requestTimeoutMs: p.request_timeout_ms,\n streamIdleTimeoutMs: p.stream_idle_timeout_ms,\n maxOutputChars: p.max_output_chars,\n think: p.think,\n });\n }\n if (isOpenAICompatibleProvider(name)) {\n return new OpenAIClient({\n apiKey: p.api_key ?? '',\n baseUrl: normalizeBaseUrl(p.base_url, 'https://api.openai.com/v1'),\n model: p.model,\n requestTimeoutMs: p.request_timeout_ms,\n streamIdleTimeoutMs: p.stream_idle_timeout_ms,\n maxOutputChars: p.max_output_chars,\n });\n }\n return null;\n}\n\n/** Provider names backed by Ollama's native /api/chat protocol. */\nexport function isOllamaProvider(name: string): boolean {\n return name === 'ollama' || name.startsWith('ollama_');\n}\n\n/** Provider names backed by OpenAI-compatible /v1/chat/completions APIs. */\nexport function isOpenAICompatibleProvider(name: string): boolean {\n return (\n name === 'openai' ||\n name.startsWith('openai_') ||\n name === 'openapi' ||\n name.startsWith('openapi_') ||\n name === 'mlx' ||\n name.startsWith('mlx_')\n );\n}\n\n/**\n * 规整 LLM provider base_url:\n * - 空 / 仅空白 → fallback;\n * - 去首尾空白和尾部 '/';\n * - 缺少 scheme 时自动补 `http://`;\n * - 不能解析为合法 URL → fallback(并 console.warn)。\n */\nexport function normalizeBaseUrl(raw: string | undefined, fallback: string): string {\n const trimmed = (raw ?? '').trim().replace(/\\/+$/, '');\n if (trimmed.length === 0) return fallback;\n const withScheme = /^https?:\\/\\//i.test(trimmed) ? trimmed : `http://${trimmed}`;\n try {\n // 验证可解析\n new URL(withScheme);\n return withScheme;\n } catch {\n console.warn(t().llm.invalidBaseUrl(JSON.stringify(raw), fallback));\n return fallback;\n }\n}\n","import chalk from 'chalk';\nimport type { AuditLogger } from '../audit/audit.js';\nimport { t } from '../i18n/index.js';\nimport type { LLMRouter } from './router.js';\n\nexport interface RoleModelAdvice {\n coder: { provider: string; model: string };\n debugger: { provider: string; model: string };\n}\n\nexport function findSharedCoderDebuggerModel(router: LLMRouter): RoleModelAdvice | undefined {\n const coder = router.primarySelection('Coder');\n const debuggerSelection = router.primarySelection('Debugger');\n if (!coder || !debuggerSelection) return undefined;\n if (coder.model.trim().toLowerCase() !== debuggerSelection.model.trim().toLowerCase()) return undefined;\n return { coder, debugger: debuggerSelection };\n}\n\n/** 启动期建议,不阻断执行;同时写入带 messageId 的审计事件。 */\nexport async function reportRoleModelAdvice(\n router: LLMRouter,\n audit?: AuditLogger,\n reporter: (message: string) => void | Promise<void> = (message) => {\n console.log(chalk.yellow('!'), message);\n },\n): Promise<RoleModelAdvice | undefined> {\n const advice = findSharedCoderDebuggerModel(router);\n if (!advice) return undefined;\n const text = t().llm.coderDebuggerSameModel(\n advice.coder.model,\n advice.coder.provider,\n advice.debugger.provider,\n );\n await reporter(text);\n await audit?.event('note', text, {\n messageId: 'llm.coder_debugger_same_model',\n coder: advice.coder,\n debugger: advice.debugger,\n });\n return advice;\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport type { AuditLogger } from '../audit/audit.js';\nimport { t } from '../i18n/index.js';\n\n/**\n * 每个 LLM provider 的运行时评分(默认 1.0)。\n *\n * 设计动机:\n * - 配置允许给一个角色挂多个 provider;运行时按评分降序选择当前\"最可信\"的。\n * - 评分会随成功/失败动态调整:失败 -0.5 直到 0(=禁用);成功 +0.1 直到 cap=10。\n * - preflight 检测到 ollama 服务器上**模型不存在**会直接把评分置 0。\n * - 持久化到 config 同目录的 sidecar 文件 `llm_scores.yaml`,避免改写用户的 config.yaml\n * (会丢注释)。配置里 `llm.scores` 段作为 sidecar 缺失时的初值。\n */\nexport class ScoreStore {\n static readonly DEFAULT = 1.0;\n static readonly MIN = 0;\n static readonly MAX = 10;\n static readonly DECAY = 0.5;\n static readonly BOOST = 0.1;\n\n private readonly scores = new Map<string, number>();\n private dirty = false;\n private writeQueue: Promise<void> = Promise.resolve();\n private readonly sidecarPath: string;\n\n constructor(\n configPath: string,\n initial: Record<string, number> = {},\n private readonly audit?: AuditLogger,\n ) {\n this.sidecarPath = path.join(path.dirname(configPath), 'llm_scores.yaml');\n for (const [k, v] of Object.entries(initial)) {\n this.scores.set(k, clamp(v));\n }\n }\n\n /** 异步加载 sidecar 文件;失败/不存在不抛错,使用 ctor 提供的初值。 */\n async load(): Promise<void> {\n try {\n const raw = await fs.readFile(this.sidecarPath, 'utf8');\n const parsed = YAML.parse(raw) as Record<string, number> | null;\n if (parsed && typeof parsed === 'object') {\n for (const [k, v] of Object.entries(parsed)) {\n if (typeof v === 'number' && Number.isFinite(v)) {\n this.scores.set(k, clamp(v));\n }\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n // 文件存在但解析失败:保留 ctor 初值,记一笔 audit 但不阻断启动。\n await this.audit?.event('llm.error', t().llm.scoreReadFailed(this.sidecarPath, (err as Error).message), {\n messageId: 'llm.score_read_failed',\n sidecarPath: this.sidecarPath,\n });\n }\n }\n }\n\n get(name: string): number {\n return this.scores.has(name) ? this.scores.get(name)! : ScoreStore.DEFAULT;\n }\n\n /** 主动设置评分(如 preflight 把不存在的模型置 0)。 */\n set(name: string, value: number, reason?: string): void {\n const v = clamp(value);\n const prev = this.scores.get(name);\n if (prev === v) return;\n this.scores.set(name, v);\n this.dirty = true;\n void this.audit?.event('llm.score', t().llm.scoreChanged(name, v.toFixed(2), (prev ?? ScoreStore.DEFAULT).toFixed(2)), {\n messageId: 'llm.score_changed', provider: name, score: v, previous: prev ?? ScoreStore.DEFAULT, reason: reason ?? 'set',\n });\n this.scheduleSave();\n }\n\n decay(name: string, reason: string): void {\n this.set(name, this.get(name) - ScoreStore.DECAY, reason);\n }\n\n boost(name: string, reason: string): void {\n const cur = this.get(name);\n if (cur >= ScoreStore.MAX) return;\n this.set(name, cur + ScoreStore.BOOST, reason);\n }\n\n /** 全量快照(用于测试与 audit 输出)。 */\n snapshot(): Record<string, number> {\n const out: Record<string, number> = {};\n for (const [k, v] of this.scores) out[k] = v;\n return out;\n }\n\n /** 等待待写入完成(CLI 退出前调用,确保评分已落盘)。 */\n async flush(): Promise<void> {\n await this.writeQueue;\n }\n\n private scheduleSave(): void {\n if (!this.dirty) return;\n this.dirty = false;\n this.writeQueue = this.writeQueue.then(() => this.persist()).catch(async (err) => {\n await this.audit?.event('llm.error', t().llm.scorePersistFailed((err as Error).message), {\n messageId: 'llm.score_persist_failed',\n sidecarPath: this.sidecarPath,\n });\n });\n }\n\n private async persist(): Promise<void> {\n const data = this.snapshot();\n const yaml =\n `${t().llm.scoreFileHeader}\\n` +\n `${t().llm.scoreFileSemantics}\\n` +\n YAML.stringify(data);\n const tmp = `${this.sidecarPath}.tmp`;\n await fs.writeFile(tmp, yaml, 'utf8');\n await fs.rename(tmp, this.sidecarPath);\n }\n}\n\nfunction clamp(v: number): number {\n if (!Number.isFinite(v)) return ScoreStore.DEFAULT;\n if (v < ScoreStore.MIN) return ScoreStore.MIN;\n if (v > ScoreStore.MAX) return ScoreStore.MAX;\n return v;\n}\n","import type { XCompilerConfig } from '../config/config.js';\nimport type { AuditLogger } from '../audit/audit.js';\nimport { t } from '../i18n/index.js';\nimport { getJson } from './ollama.js';\nimport { normalizeBaseUrl } from './router.js';\nimport type { ScoreStore } from './scores.js';\n\n/** ollama 的 /api/tags 响应签名(仅取 model 字段)。 */\ninterface OllamaTagsResponse {\n models?: Array<{ name?: string; model?: string }>;\n}\n\nexport interface PreflightOptions {\n /** 探活超时(毫秒),默认 3000。 */\n probeTimeoutMs?: number;\n /** 注入器(测试用):覆盖默认的 HTTP getJson。返回模型名字符串数组。 */\n fetchTags?: (baseUrl: string, timeoutMs: number) => Promise<string[]>;\n}\n\nexport interface PreflightResult {\n /** 探活后被置 0 评分的 provider(模型不在 ollama 服务器上)。 */\n zeroed: string[];\n /** 本次探活不可达的 provider;只影响当前运行,不持久化为 score=0。 */\n unreachable: string[];\n /** 自动加入的合成 provider(key=合成名, value=模型名)。 */\n autoAdded: Record<string, string>;\n /** 每个 ollama base_url 的可达模型清单(探活成功才有)。 */\n tags: Record<string, string[]>;\n}\n\n/**\n * 启动期 LLM 自检:\n * 1. 对每个 ollama provider,GET `${base_url}/api/tags`,比对配置的 model 是否存在。\n * 2. 不存在 → ScoreStore.set(name, 0, 'preflight: model not on server')。\n * 存在但当前评分=0 → 恢复为 max(1, 当前),让用户手工拉模型后无需再编辑评分。\n * 3. 全部 ollama provider 都被置 0 时(任何角色都没活着的候选),从可达 ollama 服务器扫描\n * 全量 tags,把每个模型注册为合成 provider `auto_<sanitized>`,加入到所有现存角色的\n * 候选数组里。完成后再次校验:若仍有角色为空,抛错让 CLI 退出(exit code 7)。\n *\n * 该函数会**就地修改** cfg.llm.providers 与 cfg.llm.roles(保留旧字段不动)。\n */\nexport async function preflightProviders(\n cfg: XCompilerConfig,\n scores: ScoreStore,\n audit?: AuditLogger,\n options: PreflightOptions = {},\n): Promise<PreflightResult> {\n const probeTimeoutMs = options.probeTimeoutMs ?? 3000;\n const fetchTags = options.fetchTags ?? defaultFetchTags;\n const result: PreflightResult = { zeroed: [], unreachable: [], autoAdded: {}, tags: {} };\n\n // 1) 收集所有 ollama provider 及其 base_url\n const ollamaProviders: Array<{ name: string; baseUrl: string; model: string }> = [];\n for (const [name, p] of Object.entries(cfg.llm.providers)) {\n if (name === 'ollama' || name.startsWith('ollama_')) {\n ollamaProviders.push({\n name,\n baseUrl: normalizeBaseUrl(p.base_url, 'http://localhost:11434'),\n model: p.model,\n });\n }\n }\n\n // 2) 按 baseUrl 聚合并探活,缓存 tags\n const baseUrls = [...new Set(ollamaProviders.map((p) => p.baseUrl))];\n for (const baseUrl of baseUrls) {\n try {\n const tags = await fetchTags(baseUrl, probeTimeoutMs);\n result.tags[baseUrl] = tags;\n await audit?.event('llm.score', t().llm.preflightOllamaReachable(baseUrl, tags.length), {\n messageId: 'llm.preflight_ollama_reachable',\n baseUrl, tagsCount: tags.length, tags,\n });\n } catch (err) {\n for (const provider of ollamaProviders) {\n if (provider.baseUrl === baseUrl && !result.unreachable.includes(provider.name)) {\n result.unreachable.push(provider.name);\n }\n }\n await audit?.event('llm.error', t().llm.preflightOllamaUnreachable(baseUrl, (err as Error).message), {\n messageId: 'llm.preflight_ollama_unreachable',\n baseUrl, error: (err as Error).message,\n });\n }\n }\n\n // 3) 对每个 ollama provider 校验模型是否存在\n for (const p of ollamaProviders) {\n const tags = result.tags[p.baseUrl];\n if (!tags) {\n // 服务器不可达,沿用现有评分(不强制置 0,避免临时网络故障一次性废掉所有 provider)\n continue;\n }\n if (!tags.includes(p.model)) {\n scores.set(p.name, 0, `preflight: model \"${p.model}\" not on ${p.baseUrl}`);\n result.zeroed.push(p.name);\n } else if (scores.get(p.name) === 0) {\n // 之前被置 0 过,现在模型回来了 → 恢复为 1\n scores.set(p.name, 1, `preflight: model \"${p.model}\" returned to ${p.baseUrl}`);\n }\n }\n\n // 4) 检查每个角色是否还有活着的候选;若没有,触发 auto-import\n const unavailable = new Set(result.unreachable);\n const rolesNeedingRescue = listRolesWithoutLiveProvider(cfg, scores, unavailable);\n if (rolesNeedingRescue.length > 0) {\n const reachable = baseUrls.filter((u) => result.tags[u] && result.tags[u]!.length > 0);\n if (reachable.length === 0) {\n throw new Error(\n `LLM preflight failed: 角色 [${rolesNeedingRescue.join(', ')}] 没有可用的 provider,` +\n `且没有任何 ollama 服务器可达。请检查 config.yaml 的 base_url / 启动 ollama 服务后重试。`,\n );\n }\n // 4a) 在第一个可达的 server 上把所有模型注册为合成 provider\n const sourceUrl = reachable[0]!;\n const tags = result.tags[sourceUrl]!;\n for (const model of tags) {\n const synthName = `auto_${model.replace(/[^a-zA-Z0-9]+/g, '_').toLowerCase()}`;\n if (cfg.llm.providers[synthName]) continue; // 已经加过了\n cfg.llm.providers[synthName] = {\n api_key: '',\n base_url: sourceUrl,\n model,\n };\n result.autoAdded[synthName] = model;\n // 默认评分 1\n scores.set(synthName, 1, `preflight: auto-imported from ${sourceUrl}`);\n }\n // 4b) 把合成 provider 追加到所有需要救援的角色\n for (const role of rolesNeedingRescue) {\n const cur = cfg.llm.roles[role] ?? [];\n const merged = [...cur];\n for (const synthName of Object.keys(result.autoAdded)) {\n if (!merged.includes(synthName)) merged.push(synthName);\n }\n cfg.llm.roles[role] = merged;\n }\n await audit?.event('llm.score', t().llm.preflightAutoAdded(Object.keys(result.autoAdded).length, rolesNeedingRescue.join(', ')), {\n messageId: 'llm.preflight_auto_added',\n sourceUrl, autoAdded: result.autoAdded, rescuedRoles: rolesNeedingRescue,\n });\n\n // 4c) 再次校验:仍为空就退出\n const stillEmpty = listRolesWithoutLiveProvider(cfg, scores, unavailable);\n if (stillEmpty.length > 0) {\n throw new Error(\n `LLM preflight failed: ollama server ${sourceUrl} 已加载,但角色 [${stillEmpty.join(', ')}] ` +\n `仍无可用 provider(自动导入后评分仍全为 0)。`,\n );\n }\n }\n\n return result;\n}\n\n/** 角色 → 候选 provider 数组(roles[role] 为空则用 default + fallbacks)。 */\nfunction candidatesForRole(cfg: XCompilerConfig, role: string): string[] {\n const explicit = cfg.llm.role_fallbacks?.[role];\n if (explicit && explicit.length > 0) return explicit;\n const fromRoles = cfg.llm.roles?.[role] ?? [];\n if (fromRoles.length > 0) return [...fromRoles, ...(cfg.llm.fallbacks ?? [])];\n return [cfg.llm.default, ...(cfg.llm.fallbacks ?? [])];\n}\n\nfunction listRolesWithoutLiveProvider(\n cfg: XCompilerConfig,\n scores: ScoreStore,\n unavailable: ReadonlySet<string> = new Set(),\n): string[] {\n // 检查所有显式声明过的角色\n const rolesToCheck = new Set<string>([\n ...Object.keys(cfg.llm.roles ?? {}),\n ...Object.keys(cfg.llm.role_fallbacks ?? {}),\n ]);\n if (rolesToCheck.size === 0) rolesToCheck.add('default');\n const out: string[] = [];\n for (const r of rolesToCheck) {\n const cands = candidatesForRole(cfg, r);\n const live = cands.filter(\n (n) => !unavailable.has(n) && scores.get(n) > 0 && cfg.llm.providers[n],\n );\n if (live.length === 0) out.push(r);\n }\n return out;\n}\n\nasync function defaultFetchTags(baseUrl: string, timeoutMs: number): Promise<string[]> {\n const url = new URL('/api/tags', baseUrl);\n const text = await getJson(url, timeoutMs);\n const parsed = JSON.parse(text) as OllamaTagsResponse;\n const items = parsed.models ?? [];\n return items\n .map((m) => (typeof m.name === 'string' ? m.name : m.model))\n .filter((s): s is string => !!s);\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nexport class Workspace {\n constructor(public readonly root: string) {}\n\n abs(...p: string[]): string {\n return path.resolve(this.root, ...p);\n }\n\n async ensure(dir: string): Promise<void> {\n await fs.mkdir(this.abs(dir), { recursive: true });\n }\n\n async writeFile(rel: string, content: string): Promise<void> {\n const full = this.abs(rel);\n await fs.mkdir(path.dirname(full), { recursive: true });\n await fs.writeFile(full, content, 'utf8');\n }\n\n async readFile(rel: string): Promise<string> {\n return fs.readFile(this.abs(rel), 'utf8');\n }\n\n async exists(rel: string): Promise<boolean> {\n try {\n await fs.stat(this.abs(rel));\n return true;\n } catch {\n return false;\n }\n }\n\n async remove(rel: string): Promise<void> {\n await fs.rm(this.abs(rel), { recursive: true, force: true });\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { Workspace } from './workspace.js';\nimport type { AuditLogger } from '../audit/audit.js';\nimport { t } from '../i18n/index.js';\n\n/**\n * 文档历史归档:写入阶段产物前,把上一版本平移到 docs/history/ 下,\n * 文件名形如 `<base>-<YYYYMMDD-HHMMSS>.<ext>`。\n *\n * - 仅当目标文件已存在时归档;\n * - 仅在产物落在 `docs/` 子树时归档(其它位置不动);\n * - 失败仅记录审计,不抛错(避免阻断主流程)。\n *\n * @returns 归档后的相对路径,若未归档返回 null\n */\nexport async function archiveIfExists(\n ws: Workspace,\n rel: string,\n audit?: AuditLogger,\n): Promise<string | null> {\n const norm = rel.replaceAll('\\\\', '/');\n if (!norm.startsWith('docs/')) return null;\n if (norm.startsWith('docs/history/')) return null;\n if (!(await ws.exists(norm))) return null;\n\n const ext = path.extname(norm);\n const base = path.basename(norm, ext);\n const ts = formatStamp(new Date());\n const target = `docs/history/${base}-${ts}${ext}`;\n try {\n await ws.ensure('docs/history');\n await fs.rename(ws.abs(norm), ws.abs(target));\n await audit?.event('plan.persist', t().audit.documentArchived(norm, target), {\n messageId: 'audit.document_archived',\n from: norm,\n to: target,\n });\n return target;\n } catch (err) {\n const message = (err as Error).message;\n await audit?.event('plan.persist', t().audit.documentArchiveFailed(norm, message), {\n messageId: 'audit.document_archive_failed',\n from: norm,\n error: message,\n });\n return null;\n }\n}\n\nfunction formatStamp(d: Date): string {\n const pad = (n: number) => n.toString().padStart(2, '0');\n return (\n d.getFullYear().toString() +\n pad(d.getMonth() + 1) +\n pad(d.getDate()) +\n '-' +\n pad(d.getHours()) +\n pad(d.getMinutes()) +\n pad(d.getSeconds())\n );\n}\n","/**\n * 生成一个 LLM 流式回调:宽屏时左右对齐刷新,窄屏时用两行状态块刷新。\n * 左侧/首行显示模型与命令,右侧/次行显示状态、计时、字符数和预览。\n * 不污染 stdout(stdout 仍由 commander/inquirer/process_log 控制)。\n *\n * 完成后调用返回的 `done()` 把整个状态块收尾,避免覆盖后续交互提示。\n */\nimport { t } from '../i18n/index.js';\n\nexport function makeStreamReporter(label: string, initialModel = t().stream.resolvingModel): {\n onToken: (chunk: string) => void;\n setModel: (model: string) => void;\n done: (status?: 'done' | 'failed') => void;\n} {\n const isTTY = !!(process.stderr as { isTTY?: boolean }).isTTY;\n const startedAt = Date.now();\n let count = 0;\n let tail = '';\n let model = initialModel;\n let lastFlush = 0;\n let finished = false;\n let renderedLines = 0;\n const elapsed = () => formatElapsed(Date.now() - startedAt);\n const flush = (force = false, status?: 'done' | 'failed') => {\n const now = Date.now();\n // 非 TTY 日志不能按 token 刷屏,只在开始、模型切换、心跳和结束时输出。\n if (!isTTY && !force) return;\n // 4 FPS 足够展示流式进度,也避免弱服务器连续小分块造成终端高频闪烁。\n if (!force && now - lastFlush < 250) return;\n lastFlush = now;\n const preview = tail.replace(/\\s+/g, ' ').slice(-40);\n const state = status\n ? (status === 'done' ? t().stream.done : t().stream.failed)\n : (count > 0 ? t().stream.streaming : t().stream.waiting);\n const left = ` [${model}] $ ${label}`;\n // 窄屏时状态放在第二行开头,优先保住 waiting/streaming/done 与计时信息;\n // 模型名过长只会截断第一行,不会把关键状态挤掉。\n const right = `${state} · ${elapsed()}${count > 0 ? ` · ${t().stream.chars(count)}${preview ? ` · ${preview}` : ''}` : ''}`;\n if (!isTTY) {\n process.stderr.write(`${left} · ${right}\\n`);\n return;\n }\n const columns = terminalColumns();\n const lines = layoutStatus(left, right, columns);\n process.stderr.write(replaceTerminalBlock(lines, renderedLines));\n renderedLines = lines.length;\n };\n const timer = setInterval(() => flush(!isTTY), isTTY ? 1_000 : 10_000);\n timer.unref?.();\n flush(true);\n return {\n onToken: (chunk: string) => {\n if (finished) return;\n count += chunk.length;\n tail = (tail + chunk).slice(-200);\n flush();\n },\n setModel: (next: string) => {\n if (finished || !next.trim()) return;\n model = next.trim();\n flush(true);\n },\n done: (status = 'done') => {\n if (finished) return;\n finished = true;\n clearInterval(timer);\n flush(true, status);\n if (isTTY) {\n process.stderr.write('\\n');\n renderedLines = 0;\n }\n },\n };\n}\n\n/** 宽屏左右对齐;放不下时切成两行,且每行都严格限制在终端宽度内。 */\nfunction layoutStatus(left: string, right: string, columns: number): string[] {\n const width = Math.max(20, columns - 1); // 留一列,避免终端在最右侧自动折行。\n const gap = 3;\n const leftWidth = displayWidth(left);\n const rightWidth = displayWidth(right);\n if (leftWidth + gap + rightWidth <= width) {\n return [left + ' '.repeat(Math.max(gap, width - leftWidth - rightWidth)) + right];\n }\n return [truncateColumns(left, width), truncateColumns(` ↳ ${right}`, width)];\n}\n\n/** 清除上一次占用的一行或两行,再从块首写入新内容。 */\nfunction replaceTerminalBlock(lines: string[], previousLines: number): string {\n let control = '';\n if (previousLines > 0) {\n control += '\\r\\x1b[2K';\n for (let i = 1; i < previousLines; i++) control += '\\x1b[1A\\r\\x1b[2K';\n }\n return control + lines.join('\\n');\n}\n\nfunction terminalColumns(): number {\n const columns = (process.stderr as { columns?: number }).columns ?? process.stdout.columns;\n return Number.isFinite(columns) && (columns ?? 0) >= 20 ? columns! : 120;\n}\n\nfunction truncateColumns(text: string, width: number): string {\n if (displayWidth(text) <= width) return text;\n let out = '';\n let used = 0;\n for (const char of text) {\n const charWidth = displayWidth(char);\n if (used + charWidth > width - 1) break;\n out += char;\n used += charWidth;\n }\n return `${out}…`;\n}\n\nfunction displayWidth(text: string): number {\n let width = 0;\n for (const char of text) {\n if (/\\p{Mark}/u.test(char)) continue;\n width += /\\p{Extended_Pictographic}|[\\u1100-\\u115f\\u2e80-\\ua4cf\\uac00-\\ud7a3\\uf900-\\ufaff\\ufe10-\\ufe6f\\uff00-\\uff60\\uffe0-\\uffe6]/u.test(char) ? 2 : 1;\n }\n return width;\n}\n\nfunction formatElapsed(ms: number): string {\n const totalSeconds = Math.max(0, Math.floor(ms / 1_000));\n const hours = Math.floor(totalSeconds / 3_600);\n const minutes = Math.floor((totalSeconds % 3_600) / 60);\n const seconds = totalSeconds % 60;\n const mm = String(minutes).padStart(2, '0');\n const ss = String(seconds).padStart(2, '0');\n return hours > 0 ? `${String(hours).padStart(2, '0')}:${mm}:${ss}` : `${mm}:${ss}`;\n}\n","import {\n PHASES,\n V_MODEL_SOURCE_TO_TEST_PHASE,\n type ArchitectureModule,\n type Language,\n type ProjectType,\n type Step,\n type StepSubtask,\n} from '../core/plan.js';\nimport {\n DOC_NAMES,\n PHASE_DOC,\n deliveryDocsForIteration,\n phaseDocForIteration,\n testPlanDocForIteration,\n} from '../core/docs.js';\nimport { pathCoveredByOutputs } from '../core/architecture.js';\n\n/**\n * 统一的 LLM 输出校准层(\"calibration\")。\n *\n * 设计目标:把所有\"LLM 经常写歪、必须在落盘前修正\"的清洗逻辑集中到本文件,\n * 便于扩展、测试与审计;上层 agents(Planner/Architect/...)只负责调用,\n * 不再各自维护正则与映射表。\n *\n * 当前覆盖:\n * - calibratePythonRequirements: 幻觉 PyPI 包名重写 / bullet 清洗 / 强制依赖\n * - calibrateDocPaths: V 模型阶段验收文档路径规范化 / 自动补齐 / 禁止项剔除\n * - calibrateStepIds: Step id → S### 形式(同步 dependsOn)\n * - calibrateStepShape: 补齐 schema 必填项(role/acceptance/systemPrompt/title/description)\n * - calibrateArchitectureStepMappings:\n * 将 architectureModules 映射到 CODE / MODULE_TEST 宏 Step 的 subTasks\n */\n\n// =============================================================================\n// 1. Python pip 依赖\n// =============================================================================\n\n/**\n * 已知 LLM 幻觉包名 → 真实 PyPI 包映射。\n * - CAN .dbc 解析的事实标准是 `cantools`,但 LLM 经常臆造 `pydbc` / `pydbcparser` / `python-dbc` 等\n * - CAN 总线 IO 用 `python-can`,LLM 偶尔写成 `pycan`\n * - JSON Schema:`jsonschema` 而不是 `json-schema` / `pyjsonschema`\n * - YAML:`PyYAML`,LLM 常写 `pyyaml`(pip 大小写不敏感,故无需重写,仅作示例不列入)\n * - HTTP:`requests` 是规范名,`python-requests` / `pyrequests` 不存在\n * - sklearn 真实包名是 `scikit-learn`\n * - cv2 真实包名是 `opencv-python`\n * - PIL 真实包名是 `pillow`\n * - serial 真实包名是 `pyserial`\n * - bs4 真实包名是 `beautifulsoup4`\n */\nexport const HALLUCINATED_PACKAGE_MAP: Record<string, string> = {\n // CAN / 汽车总线\n pydbc: 'cantools',\n pydbcparser: 'cantools',\n 'python-dbc': 'cantools',\n 'python-can-tools': 'cantools',\n pycan: 'python-can',\n\n // 常见错误别名 → import 名 vs PyPI 名错配\n sklearn: 'scikit-learn',\n cv2: 'opencv-python',\n pil: 'pillow',\n serial: 'pyserial',\n bs4: 'beautifulsoup4',\n yaml: 'PyYAML',\n\n // 网络\n 'python-requests': 'requests',\n pyrequests: 'requests',\n\n // JSON Schema\n 'json-schema': 'jsonschema',\n pyjsonschema: 'jsonschema',\n\n // 加密\n pycrypto: 'pycryptodome', // pycrypto 已废弃 / 不安全\n};\n\n/** 强制保证存在的依赖(按出现顺序追加,不会覆盖已有版本约束)。 */\nconst REQUIRED_PACKAGES = ['pytest'];\n\n/**\n * 清洗 plan.pythonRequirements:\n * - 去掉 markdown 列表前缀 / 引号 / 空行 / 注释行;\n * - 把 LLM 常见幻觉包名重写为真实 pip 包;\n * - **剥离所有版本约束**:LLM 经常臆造不存在的版本号(如 `cantools==4.3.*` 实际只到 41.x,\n * `pandas==1.5.*` 在某些时间窗失效等),导致 `pip install` 直接 ERROR。\n * 生成型项目对版本可重现性需求弱,统一不锁版本,让 pip 解析到任意可用版本即可;\n * 需要锁版本时由用户手动编辑 `requirements.txt`。\n * - 去重(保持出现顺序);\n * - 强制保证 REQUIRED_PACKAGES 在列。\n */\nexport function calibratePythonRequirements(reqs: string[] | undefined | null): string[] {\n const cleaned = (reqs ?? [])\n .map((s) => String(s ?? '').replace(/^\\s*[-*]\\s+/, '').replace(/^[\"']|[\"']$/g, '').trim())\n .filter((s) => s.length > 0 && !s.startsWith('#'));\n const remapped = cleaned.map((line) => {\n const m = line.match(/^([A-Za-z0-9._-]+)(.*)$/);\n if (!m) return line;\n const name = m[1]!.toLowerCase();\n const real = HALLUCINATED_PACKAGE_MAP[name] ?? m[1]!;\n // 丢弃 ==/>=/<=/~=/!=/</> 等所有 PEP 440 版本约束\n return real;\n });\n const seen = new Set<string>();\n const out: string[] = [];\n for (const r of remapped) {\n const key = packageKey(r);\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(r);\n }\n for (const required of REQUIRED_PACKAGES) {\n const key = required.toLowerCase();\n if (!seen.has(key)) {\n out.push(required);\n seen.add(key);\n }\n }\n return out;\n}\n\n/** 取包名(不含版本约束)作为去重键。 */\nfunction packageKey(line: string): string {\n const m = line.match(/^([A-Za-z0-9._-]+)/);\n return (m ? m[1]! : line).toLowerCase();\n}\n\n// =============================================================================\n// 2. V 模型阶段文档路径\n// =============================================================================\n\n/** LLM 常用的旧文档名 → 规范化命名。 */\nexport const DOC_PATH_ALIASES: Record<string, string> = {\n 'docs/01-requirement.md': DOC_NAMES.requirementAnalysis,\n 'docs/requirements.md': DOC_NAMES.requirementAnalysis,\n 'docs/requirement.md': DOC_NAMES.requirementAnalysis,\n 'docs/srs.md': DOC_NAMES.requirementAnalysis,\n 'docs/02-architecture.md': DOC_NAMES.highLevelDesign,\n 'docs/architecture.md': DOC_NAMES.highLevelDesign,\n 'docs/arch.md': DOC_NAMES.highLevelDesign,\n 'docs/03-tasks.md': DOC_NAMES.detailedDesign,\n 'docs/tasks.md': DOC_NAMES.detailedDesign,\n 'docs/task.md': DOC_NAMES.detailedDesign,\n 'docs/design.md': DOC_NAMES.detailedDesign,\n 'docs/04-refactor.md': DOC_NAMES.functionalTest,\n 'docs/refactor.md': DOC_NAMES.functionalTest,\n 'docs/05-delivery.md': DOC_NAMES.functionalTest,\n 'docs/delivery.md': DOC_NAMES.functionalTest,\n 'docs/deliverables.md': DOC_NAMES.functionalTest,\n 'docs/unit-test.md': DOC_NAMES.unitTest,\n 'docs/integration-test.md': DOC_NAMES.integrationTest,\n 'docs/module-test.md': DOC_NAMES.moduleTest,\n 'docs/functional-test.md': DOC_NAMES.functionalTest,\n 'docs/quick-start.md': DOC_NAMES.quickstart,\n 'docs/quick_start.md': DOC_NAMES.quickstart,\n 'docs/quickstart.md': DOC_NAMES.quickstart,\n 'docs/api.md': DOC_NAMES.apiGuide,\n 'docs/api_guide.md': DOC_NAMES.apiGuide,\n 'docs/api-guide.md': DOC_NAMES.apiGuide,\n};\n\n/**\n * 把 LLM 容易写歪的常见旧文档名规整为 V 模型规范化命名。同时:\n * - 各阶段若 outputs 缺失对应规范文档,自动追加;\n * - V 模型左侧阶段同步补齐对应测试计划文档;\n * - 若有 Step 把 docs/topic.md 列为 outputs,则移除(topic.md 仅由 xcompiler build 写入)。\n */\nexport function calibrateDocPaths(steps: Step[], projectType: ProjectType = 'application'): Step[] {\n const remap = (p: string): string => DOC_PATH_ALIASES[p] ?? p;\n const dropTopic = (p: string): boolean => p !== DOC_NAMES.topic;\n return steps.map((s) => {\n const iterationId = s.iterationId ?? 'P1';\n const inputs = (s.inputs ?? []).map((p) => iterationScopedInput(remap(p), s.phase, iterationId));\n let outputs = (s.outputs ?? []).map((p) => iterationScopedDoc(remap(p), s.phase, iterationId)).filter(dropTopic);\n const expected = phaseDocForIteration(s.phase, iterationId);\n if (expected && !outputs.includes(expected)) {\n // 仅在该阶段允许有\"主验收文档\"时自动补齐(CODE/DEBUG 不在表内)。\n outputs = [expected, ...outputs];\n }\n const pairedTestPhase = V_MODEL_SOURCE_TO_TEST_PHASE[s.phase as keyof typeof V_MODEL_SOURCE_TO_TEST_PHASE];\n const testPlanDoc = pairedTestPhase ? testPlanDocForIteration(pairedTestPhase, iterationId) : undefined;\n if (testPlanDoc && !outputs.includes(testPlanDoc)) {\n outputs = [...outputs, testPlanDoc];\n }\n if (s.phase === 'FUNCTIONAL_TEST') {\n const requiredDocs = [...deliveryDocsForIteration(projectType, iterationId)];\n outputs = [...requiredDocs, ...outputs.filter((out) => !requiredDocs.includes(out))];\n }\n return { ...s, inputs, outputs };\n });\n}\n\nfunction iterationScopedDoc(path: string, phase: Step['phase'], iterationId: string): string {\n if (iterationId === 'P1') return path;\n if (path === DOC_NAMES.readme && phase === 'FUNCTIONAL_TEST') {\n return `docs/iterations/${iterationId}/README.md`;\n }\n if (path === DOC_NAMES.quickstart && phase === 'FUNCTIONAL_TEST') {\n return `docs/iterations/${iterationId}/quickstart.md`;\n }\n if (path === DOC_NAMES.apiGuide && phase === 'FUNCTIONAL_TEST') {\n return `docs/iterations/${iterationId}/api-guide.md`;\n }\n for (const [docPhase, canonical] of Object.entries(PHASE_DOC)) {\n if (path === canonical) {\n return phaseDocForIteration(docPhase as Step['phase'], iterationId) ?? path;\n }\n }\n return path;\n}\n\nfunction iterationScopedInput(path: string, phase: Step['phase'], iterationId: string): string {\n if (iterationId === 'P1' || phase === 'REQUIREMENT_ANALYSIS') return path;\n return iterationScopedDoc(path, phase, iterationId);\n}\n\n// =============================================================================\n// 3. Step id 规范化\n// =============================================================================\n\n/**\n * 把 LLM 偶尔写歪的 Step id 规整成 schema 要求的 S### 形式(至少 3 位数字)。\n * 同时同步更新所有 dependsOn 引用。\n * - \"id_S009\" -> \"S009\"\n * - \"S9\" -> \"S009\"\n * - \"step-12\" -> \"S012\"\n * - 完全无数字时按出现顺序兜底 S00N(保留原序)。\n */\nexport function calibrateStepIds(steps: Step[]): Step[] {\n const map = new Map<string, string>();\n let fallback = 0;\n for (const s of steps) {\n fallback += 1;\n const raw = String(s.id ?? '').trim();\n let normalized: string;\n if (/^S\\d{3,}$/.test(raw)) {\n normalized = raw;\n } else {\n const m = raw.match(/(\\d+)/);\n const num = m ? parseInt(m[1]!, 10) : fallback;\n normalized = 'S' + String(num).padStart(3, '0');\n }\n map.set(raw, normalized);\n }\n return steps.map((s) => ({\n ...s,\n id: map.get(String(s.id ?? '').trim()) ?? s.id,\n dependsOn: Array.isArray(s.dependsOn)\n ? s.dependsOn.map((d) => map.get(String(d).trim()) ?? d)\n : s.dependsOn,\n }));\n}\n\n// =============================================================================\n// 4. Step 形状补齐(兜底 schema 必填项)\n// =============================================================================\n\n/** 阶段 → 默认 role 兜底。 */\nconst PHASE_DEFAULT_ROLE: Record<string, string> = {\n REQUIREMENT_ANALYSIS: 'Planner',\n HIGH_LEVEL_DESIGN: 'Architect',\n DETAILED_DESIGN: 'Architect',\n CODE: 'Coder',\n UNIT_TEST: 'Tester',\n INTEGRATION_TEST: 'Tester',\n MODULE_TEST: 'Tester',\n FUNCTIONAL_TEST: 'Tester',\n DEBUG: 'Debugger',\n};\n\n/** 把 LLM 偶尔写错的 role 别名规范到合法白名单。 */\nconst ROLE_ALIASES: Record<string, string> = {\n developer: 'Coder',\n programmer: 'Coder',\n engineer: 'Coder',\n tester: 'Tester',\n qa: 'Tester',\n debugger: 'Debugger',\n architect: 'Architect',\n designer: 'Architect',\n planner: 'Planner',\n pm: 'Planner',\n};\n\nconst VALID_ROLES = new Set(['Planner', 'Architect', 'Coder', 'Tester', 'Debugger']);\n\nconst VALID_PHASES = new Set<string>(PHASES);\n\n/** LLM 偶尔写错的 phase 别名 / 同义词 → 规范名。键已 lower-case。 */\nconst PHASE_ALIASES: Record<string, string> = {\n requirement: 'REQUIREMENT_ANALYSIS', requirements: 'REQUIREMENT_ANALYSIS', req: 'REQUIREMENT_ANALYSIS', spec: 'REQUIREMENT_ANALYSIS',\n requirement_analysis: 'REQUIREMENT_ANALYSIS', 'requirement-analysis': 'REQUIREMENT_ANALYSIS', analysis: 'REQUIREMENT_ANALYSIS',\n arch: 'HIGH_LEVEL_DESIGN', architecture: 'HIGH_LEVEL_DESIGN', high_level_design: 'HIGH_LEVEL_DESIGN', 'high-level-design': 'HIGH_LEVEL_DESIGN',\n overview_design: 'HIGH_LEVEL_DESIGN', system_design: 'HIGH_LEVEL_DESIGN', outline_design: 'HIGH_LEVEL_DESIGN', 概要设计: 'HIGH_LEVEL_DESIGN',\n task: 'DETAILED_DESIGN', tasks: 'DETAILED_DESIGN', planning: 'DETAILED_DESIGN', breakdown: 'DETAILED_DESIGN',\n design: 'DETAILED_DESIGN', detailed_design: 'DETAILED_DESIGN', 'detailed-design': 'DETAILED_DESIGN', 详细设计: 'DETAILED_DESIGN',\n code: 'CODE', coding: 'CODE', implement: 'CODE', implementation: 'CODE', dev: 'CODE', develop: 'CODE',\n test: 'UNIT_TEST', testing: 'UNIT_TEST', tests: 'UNIT_TEST', qa: 'UNIT_TEST', unit: 'UNIT_TEST', unit_test: 'UNIT_TEST', 'unit-test': 'UNIT_TEST',\n integration: 'INTEGRATION_TEST', integration_test: 'INTEGRATION_TEST', 'integration-test': 'INTEGRATION_TEST',\n module: 'MODULE_TEST', module_test: 'MODULE_TEST', 'module-test': 'MODULE_TEST',\n functional: 'FUNCTIONAL_TEST', functional_test: 'FUNCTIONAL_TEST', 'functional-test': 'FUNCTIONAL_TEST',\n verify: 'FUNCTIONAL_TEST', verification: 'FUNCTIONAL_TEST',\n debug: 'DEBUG', debugging: 'DEBUG', fix: 'DEBUG', bugfix: 'DEBUG',\n refactor: 'CODE', refactoring: 'CODE', cleanup: 'CODE',\n delivery: 'FUNCTIONAL_TEST', deliver: 'FUNCTIONAL_TEST', release: 'FUNCTIONAL_TEST', package: 'FUNCTIONAL_TEST', packaging: 'FUNCTIONAL_TEST', deploy: 'FUNCTIONAL_TEST',\n};\n\n/** outputs 路径 → 阶段强证据(命中即覆盖 role 推断)。 */\nconst PHASE_BY_OUTPUT_DOC: Array<[RegExp, string]> = [\n [/(^|\\/)docs\\/01-(?:requirement|requirement-analysis)\\.md$/i, 'REQUIREMENT_ANALYSIS'],\n [/(^|\\/)docs\\/02-(?:architecture|high-level-design)\\.md$/i, 'HIGH_LEVEL_DESIGN'],\n [/(^|\\/)docs\\/03-(?:tasks|detailed-design)\\.md$/i, 'DETAILED_DESIGN'],\n [/(^|\\/)docs\\/05-unit-test\\.md$/i, 'UNIT_TEST'],\n [/(^|\\/)docs\\/06-integration-test\\.md$/i, 'INTEGRATION_TEST'],\n [/(^|\\/)docs\\/07-module-test\\.md$/i, 'MODULE_TEST'],\n [/(^|\\/)docs\\/(?:04-refactor|05-delivery|08-functional-test)\\.md$/i, 'FUNCTIONAL_TEST'],\n];\n\n/** 由 role 反推阶段(弱证据,仅在路径线索与别名都不可用时使用)。 */\nconst PHASE_BY_ROLE: Record<string, string> = {\n Planner: 'REQUIREMENT_ANALYSIS',\n Architect: 'HIGH_LEVEL_DESIGN',\n Coder: 'CODE',\n Tester: 'UNIT_TEST',\n Debugger: 'DEBUG',\n};\n\nconst WRITE_CAPABLE_TOOL_REFS = new Set([\n 'write_file',\n 'append_file',\n 'apply_patch',\n 'replace_in_file',\n 'skill:author',\n 'skill:patcher',\n 'skill:tester',\n 'skill:debugger',\n 'skill:refactorer',\n]);\n\nconst PHASE_DEFAULT_TOOLS: Record<string, string[]> = {\n REQUIREMENT_ANALYSIS: ['skill:author'],\n HIGH_LEVEL_DESIGN: ['skill:author'],\n DETAILED_DESIGN: ['skill:author'],\n CODE: ['skill:author'],\n UNIT_TEST: ['skill:tester'],\n INTEGRATION_TEST: ['skill:tester'],\n MODULE_TEST: ['skill:tester'],\n FUNCTIONAL_TEST: ['skill:tester'],\n DEBUG: ['skill:debugger'],\n};\n\nexport function ensureEssentialToolRefs(step: Pick<Step, 'phase' | 'tools' | 'outputs'>): string[] {\n const tools = Array.isArray(step.tools) ? [...step.tools] : [];\n const outputs = Array.isArray(step.outputs) ? step.outputs : [];\n const needsWritableOutputs = outputs.some((out) => typeof out === 'string' && !out.endsWith('/'));\n const hasWriteCapability = tools.some((tool) => WRITE_CAPABLE_TOOL_REFS.has(tool));\n if (!needsWritableOutputs || hasWriteCapability) return dedup(tools);\n return dedup([...tools, ...(PHASE_DEFAULT_TOOLS[step.phase] ?? ['write_file'])]);\n}\n\n/**\n * 推断 Step 的阶段。优先级:\n * 1. 原值是合法阶段 → 原样返回\n * 2. PHASE_ALIASES 命中(小写 / 同义词)\n * 3. outputs 中含强路径证据(docs/0N-*.md)\n * 4. outputs 含 src 下源文件 → CODE;含 tests 下测试文件 → 对应测试阶段\n * 5. 由 role 兜底(Planner→REQUIREMENT_ANALYSIS 等)\n * 6. 仍无法识别 → 'CODE'(最常见阶段,避免连锁失败)\n */\nfunction inferPhase(rawPhase: unknown, role: string, outputs: string[]): string {\n const raw = typeof rawPhase === 'string' ? rawPhase.trim() : '';\n if (VALID_PHASES.has(raw)) return raw;\n if (raw) {\n const alias = PHASE_ALIASES[raw.toLowerCase()];\n if (alias) return alias;\n }\n for (const out of outputs) {\n for (const [re, phase] of PHASE_BY_OUTPUT_DOC) {\n if (re.test(out)) return phase;\n }\n }\n if (outputs.some((o) => /(^|\\/)tests\\/functional\\//i.test(o))) return 'FUNCTIONAL_TEST';\n if (outputs.some((o) => /(^|\\/)tests\\/integration\\//i.test(o))) return 'INTEGRATION_TEST';\n if (outputs.some((o) => /(^|\\/)tests\\/modules?\\//i.test(o))) return 'MODULE_TEST';\n if (outputs.some((o) => /(^|\\/)tests\\/.*\\.(?:py|ts|tsx)$/i.test(o))) return 'UNIT_TEST';\n if (outputs.some((o) => /(^|\\/)src\\/.*\\.(?:py|ts|tsx)$/i.test(o))) return 'CODE';\n if (role && PHASE_BY_ROLE[role]) return PHASE_BY_ROLE[role]!;\n return 'CODE';\n}\n\n/**\n * 补齐 Step schema 必填项,避免因 LLM 漏字段导致 Plan 整盘失败:\n * - role 缺失 / 非法 → 用 PHASE_DEFAULT_ROLE 兜底;ROLE_ALIASES 做大小写&同义词修正\n * - acceptance 缺失 / 空 → 用 description 截断或固定模板兜底\n * - systemPrompt 长度不足 → 补齐到至少 20 字符\n * - title / description 缺失 → 用阶段名兜底,避免空字符串\n * - tools / inputs / outputs / dependsOn 缺失 → 默认空数组\n * - maxRetries 非正整数 → 重置为 3\n */\nexport function calibrateStepShape(steps: Step[]): Step[] {\n return steps.map((raw) => {\n const s = raw as unknown as Record<string, unknown>;\n const outputs = Array.isArray(s.outputs) ? (s.outputs as string[]) : [];\n\n // role 先粗算一遍(用于 phase 推断兜底)\n let role = typeof s.role === 'string' ? s.role.trim() : '';\n if (!VALID_ROLES.has(role)) {\n const alias = ROLE_ALIASES[role.toLowerCase()];\n if (alias && VALID_ROLES.has(alias)) role = alias;\n }\n\n // phase 兜底:LLM 偶尔写 \"---\" / \"design\" / 漏字段,从别名 / outputs / role 推断\n const phase = inferPhase(s.phase, role, outputs);\n const title = (typeof s.title === 'string' && s.title.trim()) || `${phase} Step`;\n const description = (typeof s.description === 'string' && s.description.trim()) || title;\n\n // role 最终兜底:仍非法则按 phase 默认\n if (!VALID_ROLES.has(role)) {\n role = PHASE_DEFAULT_ROLE[phase] ?? 'Coder';\n }\n\n // acceptance 兜底\n let acceptance = typeof s.acceptance === 'string' ? s.acceptance.trim() : '';\n if (!acceptance) {\n acceptance = `${title} 完成,所有声明的 outputs 文件存在且内容非空。`;\n }\n\n // systemPrompt 兜底(schema 仅要求 min(1),但 xcompiler_run 期望真实有效的提示词)\n let systemPrompt = typeof s.systemPrompt === 'string' ? s.systemPrompt.trim() : '';\n if (systemPrompt.length < 20) {\n systemPrompt =\n `${phase} 阶段任务:${title}。${description}` +\n `\\n范围:仅完成本 Step 声明的 outputs。` +\n `\\n验收:${acceptance}`;\n }\n\n return {\n id: String(s.id ?? ''),\n iterationId: (typeof s.iterationId === 'string' && s.iterationId.trim()) ? s.iterationId.trim() : 'P1',\n phase: phase as Step['phase'],\n title,\n description,\n systemPrompt,\n role: role as Step['role'],\n tools: ensureEssentialToolRefs({\n phase: phase as Step['phase'],\n tools: Array.isArray(s.tools) ? (s.tools as string[]) : [],\n outputs,\n }),\n inputs: Array.isArray(s.inputs) ? (s.inputs as string[]) : [],\n outputs,\n subTasks: calibrateSubTasks(s.subTasks),\n dependsOn: Array.isArray(s.dependsOn) ? (s.dependsOn as string[]) : [],\n acceptance,\n status: (typeof s.status === 'string' ? s.status : 'PENDING') as Step['status'],\n retries: typeof s.retries === 'number' && s.retries >= 0 ? s.retries : 0,\n maxRetries:\n typeof s.maxRetries === 'number' && Number.isInteger(s.maxRetries) && s.maxRetries > 0\n ? s.maxRetries\n : 3,\n } as Step;\n });\n}\n\nfunction calibrateSubTasks(raw: unknown): StepSubtask[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const tasks = raw\n .map((item, index): StepSubtask | null => {\n if (!item || typeof item !== 'object') return null;\n const record = item as Record<string, unknown>;\n const title =\n (typeof record.title === 'string' && record.title.trim()) ||\n (typeof record.id === 'string' && record.id.trim()) ||\n `Subtask ${index + 1}`;\n const description =\n (typeof record.description === 'string' && record.description.trim()) ||\n title;\n const subTask: StepSubtask = {\n id: (typeof record.id === 'string' && record.id.trim()) || `T${index + 1}`,\n title,\n description,\n };\n if (typeof record.acceptance === 'string' && record.acceptance.trim()) {\n subTask.acceptance = record.acceptance.trim();\n }\n if (Array.isArray(record.outputs)) {\n subTask.outputs = record.outputs.filter((value): value is string => typeof value === 'string' && value.trim().length > 0);\n }\n const children = calibrateSubTasks(record.subTasks);\n if (children && children.length > 0) subTask.subTasks = children;\n return subTask;\n })\n .filter((task): task is StepSubtask => task !== null);\n return tasks.length > 0 ? tasks : undefined;\n}\n\nfunction dedup<T>(arr: T[]): T[] {\n return [...new Set(arr)];\n}\n\n// =============================================================================\n// 4a. HIGH_LEVEL_DESIGN 模块 ↔ CODE/MODULE_TEST Step 映射校准\n// =============================================================================\n\n/**\n * LLM 经常能正确列出 architectureModules,却在 steps 里把多个模块塞进同一个 CODE / MODULE_TEST Step。\n * 新版计划模型保留“大 Step”执行语义,不再把这些 Step 机械拆碎;模块级细分写入 subTasks。\n * 这样执行器仍按大 Step 运行,但 Step 内有可审计的二级任务清单。\n */\nexport function calibrateArchitectureStepMappings(\n steps: Step[],\n modules: ArchitectureModule[] | undefined | null,\n): Step[] {\n if (!modules || modules.length === 0) return steps;\n\n const ownerByModule = new Map<string, string>();\n for (const step of steps.filter((item) => item.phase === 'CODE')) {\n const ownedModules = modules.filter((module) =>\n module.sourcePaths.every((sourcePath) => pathCoveredByOutputs(sourcePath, step.outputs)),\n );\n for (const module of ownedModules) ownerByModule.set(module.id, step.id);\n }\n\n return steps.map((step) => {\n let dependsOn = step.dependsOn;\n if (step.phase === 'CODE') {\n const ownedModules = modules.filter((module) =>\n module.sourcePaths.every((sourcePath) => pathCoveredByOutputs(sourcePath, step.outputs)),\n );\n const moduleDependencyOwners = ownedModules\n .flatMap((module) => module.dependencies)\n .map((moduleId) => ownerByModule.get(moduleId))\n .filter((owner): owner is string => Boolean(owner) && owner !== step.id);\n dependsOn = dedup([...dependsOn, ...moduleDependencyOwners]);\n return withModuleSubTasks({ ...step, dependsOn }, ownedModules, 'CODE');\n }\n\n if (step.phase === 'MODULE_TEST') {\n const testedModules = modules.filter((module) =>\n module.testPaths.some((testPath) => pathCoveredByOutputs(testPath, step.outputs)),\n );\n const testedOwners = testedModules\n .map((module) => ownerByModule.get(module.id))\n .filter((owner): owner is string => Boolean(owner));\n dependsOn = dedup([...dependsOn, ...testedOwners]);\n return withModuleSubTasks({ ...step, dependsOn }, testedModules, 'MODULE_TEST');\n }\n\n return { ...step, dependsOn };\n });\n}\n\nfunction withModuleSubTasks(\n step: Step,\n modules: ArchitectureModule[],\n kind: 'CODE' | 'MODULE_TEST',\n): Step {\n if (modules.length === 0) return step;\n const existing = step.subTasks ?? [];\n const existingKeys = new Set(flattenSubTaskTexts(existing));\n const generated = modules\n .filter((module) => !existingKeys.has(module.id))\n .map((module): StepSubtask => ({\n id: module.id,\n title: `${kind} ${module.name}`,\n description:\n kind === 'CODE'\n ? `${module.responsibility} Source paths: ${module.sourcePaths.join(', ')}.`\n : `${module.responsibility} Test paths: ${module.testPaths.join(', ')}.`,\n acceptance:\n kind === 'CODE'\n ? `All source paths for ${module.id} are implemented and importable.`\n : `Tests for ${module.id} cover the declared module behaviour and pass.`,\n outputs: kind === 'CODE' ? [...module.sourcePaths] : [...module.testPaths],\n }));\n if (generated.length === 0) return step;\n return { ...step, subTasks: [...existing, ...generated] };\n}\n\nfunction flattenSubTaskTexts(tasks: StepSubtask[]): string[] {\n return tasks.flatMap((task) => [\n task.id,\n task.title,\n task.description,\n task.acceptance ?? '',\n ...(task.outputs ?? []),\n ...flattenSubTaskTexts(task.subTasks ?? []),\n ]);\n}\n\n// =============================================================================\n// 4b. Plan 覆盖率补齐(自动注入缺失的 UNIT_TEST Step)\n// =============================================================================\n\n/**\n * 兜底自动补 UNIT_TEST 覆盖:lint 规则要求每个 CODE Step 必须有至少一个 UNIT_TEST Step\n * (直接或传递地)依赖它。LLM 经常忘记产出 UNIT_TEST 阶段,或只对最末尾的 CODE 写 UNIT_TEST,\n * 导致前面的 CODE Step 无人覆盖。本函数:\n * - 找出所有未被覆盖的 CODE Step(排除仅产出 __init__.py 的);\n * - 若有,则追加一个 UNIT_TEST Step(id = 末位+1),dependsOn 列出全部未覆盖 CODE Step\n * 的 id;title/description/systemPrompt 由模板生成,让 Tester 自决具体测试文件命名。\n * - 不修改已有 Step;不影响已有 UNIT_TEST 覆盖的 CODE Step(避免重复)。\n *\n * 这是一个**幂等的安全网**:对已有合规 plan(每个 CODE 都被覆盖)调用此函数等价于 no-op;\n * 真正的目标是让 LLM 输出残缺时 buildPlan 不会一开始就 lint 失败导致整盘重跑。\n */\nexport function calibratePlanCoverage(steps: Step[], language: Language = 'python'): Step[] {\n const stepById = new Map(steps.map((s) => [s.id, s] as const));\n const isInitOnly = (s: Step): boolean =>\n s.outputs.length > 0 && s.outputs.every((o) => o === '__init__.py' || o.endsWith('/__init__.py'));\n const iterationIdOf = (s: Step): string => s.iterationId ?? 'P1';\n\n // 谁能传递地依赖到 codeId?\n const transitivelyDepends = (test: Step, codeId: string): boolean => {\n const seen = new Set<string>();\n const stack = [...test.dependsOn];\n while (stack.length > 0) {\n const id = stack.pop()!;\n if (seen.has(id)) continue;\n seen.add(id);\n if (id === codeId) return true;\n const dep = stepById.get(id);\n if (dep) stack.push(...dep.dependsOn);\n }\n return false;\n };\n\n const codeSteps = steps.filter((s) => s.phase === 'CODE' && !isInitOnly(s));\n const testSteps = steps.filter((s) => s.phase === 'UNIT_TEST');\n const uncoveredByIteration = new Map<string, Step[]>();\n for (const codeStep of codeSteps) {\n const iterationId = iterationIdOf(codeStep);\n const covered = testSteps.some((testStep) =>\n iterationIdOf(testStep) === iterationId && transitivelyDepends(testStep, codeStep.id),\n );\n if (!covered) {\n const bucket = uncoveredByIteration.get(iterationId) ?? [];\n bucket.push(codeStep);\n uncoveredByIteration.set(iterationId, bucket);\n }\n }\n if (uncoveredByIteration.size === 0) return steps;\n\n // 取末位编号 + 1 作为新 UNIT_TEST id(保留 S### 三位前导零)\n let maxNum = steps.reduce((m, s) => {\n const mm = String(s.id).match(/^S(\\d{3,})$/);\n return mm ? Math.max(m, parseInt(mm[1]!, 10)) : m;\n }, 0);\n const tsMode = language === 'typescript';\n const syntheticSteps: Step[] = [];\n const uncoveredIds = new Set<string>();\n for (const [iterationId, uncovered] of uncoveredByIteration) {\n for (const codeStep of uncovered) uncoveredIds.add(codeStep.id);\n maxNum += 1;\n const newId = 'S' + String(maxNum).padStart(3, '0');\n const unitTestDoc = phaseDocForIteration('UNIT_TEST', iterationId);\n const testOutput = language === 'typescript'\n ? `tests/auto_${newId.toLowerCase()}.test.ts`\n : `tests/test_auto_${newId.toLowerCase()}.py`;\n\n const targetTitles = uncovered.map((c) => `${c.id} (${c.title})`).join('、');\n syntheticSteps.push({\n id: newId,\n iterationId,\n phase: 'UNIT_TEST',\n title: `自动补齐单元测试:覆盖 ${uncovered.map((c) => c.id).join(' / ')}`,\n description:\n `Planner 未为 ${targetTitles} 显式生成 UNIT_TEST Step,由 calibration 自动追加。` +\n (tsMode\n ? `Tester 应为每个目标 CODE Step 在 tests/ 下创建至少一个 Vitest 测试文件(*.test.ts),覆盖正常路径与典型错误路径。`\n : `Tester 应为每个目标 CODE Step 在 tests/ 下创建至少一个 pytest 测试文件,覆盖正常路径与典型错误路径。`),\n systemPrompt:\n `本 Step 是 calibration 自动追加的 UNIT_TEST 兜底,覆盖以下 CODE Step:${targetTitles}。\\n` +\n (tsMode\n ? `范围:仅写 / 调试 ${testOutput},不得修改 src/ 实现。\\n`\n : `范围:仅写 / 调试 ${testOutput},不得修改 src/ 实现。\\n`) +\n `输入:上述 CODE Step 产出的 src/ 文件 + docs/。\\n` +\n (tsMode\n ? `产出:${testOutput}(覆盖每一个目标 CODE Step 的核心 API),运行期 UNIT_TEST gate 会用 npm test / Vitest 自动验证。\\n`\n : `产出:${testOutput}(覆盖每一个目标 CODE Step 的核心 API),运行期 UNIT_TEST gate 会用 pytest 自动验证。\\n`) +\n (tsMode\n ? `验收:所有新增测试在 npm test / Vitest 下通过;任一目标 CODE 的核心 API 至少有一条断言。`\n : `验收:所有新增测试 pytest 通过;任一目标 CODE 的核心 API 至少有一条断言。`),\n role: 'Tester',\n tools: ['skill:tester'],\n inputs: uncovered.flatMap((c) => c.outputs),\n outputs: unitTestDoc ? [unitTestDoc, testOutput] : [testOutput],\n dependsOn: uncovered.map((c) => c.id),\n acceptance: tsMode\n ? `npm test / Vitest 在 tests/ 下能找到至少 ${uncovered.length} 个新测试文件并全部通过,覆盖 ${uncovered.map((c) => c.id).join(' / ')} 的主要 API。`\n : `pytest 在 tests/ 下能找到至少 ${uncovered.length} 个新测试文件并全部通过,覆盖 ${uncovered.map((c) => c.id).join(' / ')} 的主要 API。`,\n status: 'PENDING',\n retries: 0,\n maxRetries: 3,\n });\n }\n const syntheticByIteration = new Map(syntheticSteps.map((step) => [iterationIdOf(step), step]));\n const rewired = steps.map((step) => {\n if (!(['INTEGRATION_TEST', 'MODULE_TEST', 'FUNCTIONAL_TEST'] as Step['phase'][]).includes(step.phase)) return step;\n const alreadyDependsOnTest = step.dependsOn.some((depId) => stepById.get(depId)?.phase === 'UNIT_TEST');\n if (alreadyDependsOnTest) return step;\n const touchesUncoveredCode = step.dependsOn.some((depId) => uncoveredIds.has(depId));\n if (!touchesUncoveredCode) return step;\n const synthetic = syntheticByIteration.get(iterationIdOf(step));\n if (!synthetic) return step;\n return {\n ...step,\n dependsOn: dedup([...step.dependsOn, synthetic.id]),\n };\n });\n\n return [...rewired, ...syntheticSteps];\n}\n\n// =============================================================================\n// 5. Debugger 失败日志 → 可执行修复建议\n// =============================================================================\n\n/**\n * 一条修复建议。`severity` 仅用于排序展示,hint 必须是\"立即可执行\"的指令型表达,\n * 避免空话;推荐工具调用名一律用反引号包裹,便于 Debugger LLM 直接复制使用。\n */\nexport interface DebugSuggestion {\n /** 模式标识,便于审计/统计;不会展示给 LLM。 */\n code: string;\n /** 1=高优先 2=中 3=兜底 */\n severity: 1 | 2 | 3;\n /** 给 Debugger 看的 actionable 文本(一行)。 */\n hint: string;\n /** 命中的关键证据片段(截断),便于排错。 */\n evidence?: string;\n}\n\ninterface SuggestionRule {\n code: string;\n severity: 1 | 2 | 3;\n /** 用 RegExp 数组匹配 failureLog;任一命中即触发。 */\n patterns: RegExp[];\n /** 由匹配组生成 hint;m 为第一条命中正则的 RegExpExecArray。 */\n build: (m: RegExpExecArray) => string;\n}\n\n/**\n * 常见 Python 错误模式 → 可执行建议。\n * 顺序意义:上面的规则优先级更高(severity=1 也排在前),重复 code 只保留首条。\n *\n * 维护原则:\n * - 只针对\"LLM 实际反复踩坑\"的错误加规则;不要堆砌教科书式提示。\n * - hint 必须给\"下一步具体动作\",不是\"原因解释\"。\n * - 工具名(read_file/code_search/write_file/...)用反引号包裹,让 LLM 直接复制。\n */\nconst PYTHON_ERROR_RULES: SuggestionRule[] = [\n // —— 模块/路径类(用户最常见痛点) ————————————————————\n {\n code: 'ModuleNotFoundError-direct-script',\n severity: 1,\n // 命中:错误来自 tests/ 下的脚本,且缺失模块名是无点的\"裸名\"——典型的\n // \"python tests/test_X.py 直接执行 → src/ 不在 sys.path\" 场景。\n patterns: [\n /File\\s+[\"'][^\"']*\\/tests\\/[^\"']+\\.py[\"'][^]*?ModuleNotFoundError:\\s*No module named ['\"]([A-Za-z_][A-Za-z0-9_]*)['\"]/,\n ],\n build: (m) => {\n const mod = m[1] ?? '<module>';\n return (\n `[直接 python 脚本执行测试导致 ModuleNotFoundError: ${mod}] ` +\n `**首选**改用 \\`run_tests\\`(pytest)执行——XCompiler 已自动写入 tests/conftest.py 注入 src/ 到 sys.path,pytest 模式下能直接解析。` +\n `如确需保留 \\`python tests/test_X.py\\` 直接运行,则用 \\`read_file\\` 打开测试文件,` +\n `在 import 之前插入:\\`import sys, os; sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'src'))\\`,` +\n `再 \\`replace_in_file\\` 提交修改。**严禁**把 import 改成 \"from src.${mod} import ...\" 形式。`\n );\n },\n },\n {\n code: 'ModuleNotFoundError',\n severity: 1,\n patterns: [\n /ModuleNotFoundError:\\s*No module named ['\"]([^'\"]+)['\"]/,\n /ImportError:\\s*No module named ['\"]?([A-Za-z0-9_.]+)['\"]?/,\n ],\n build: (m) => {\n const mod = m[1] ?? '<module>';\n const top = mod.split('.')[0]!;\n return (\n `[ModuleNotFoundError: ${mod}] 先用 \\`list_dir\\` 查看 src/ 实际目录结构,` +\n `再用 \\`code_search\\` 搜索 \"${top}\" 看真实文件名/路径。` +\n `若是项目内模块缺失:用 \\`read_file\\` 确认 outputs 是否真的写入了 ${mod.replace(/\\./g, '/')}.py,` +\n `否则用 \\`write_file\\` 创建。` +\n `若是第三方包:用 \\`add_dependency\\` 把真实 PyPI 包名(不是 import 名!例如 cv2→opencv-python, sklearn→scikit-learn, PIL→pillow)写进 requirements.txt。` +\n `**绝不要**用 \\`replace_in_file\\` 提交 find===replace 的\"假修复\"。`\n );\n },\n },\n {\n code: 'ImportError-name',\n severity: 1,\n patterns: [\n /ImportError:\\s*cannot import name ['\"]([^'\"]+)['\"]\\s*from\\s*['\"]?([A-Za-z0-9_.]+)['\"]?/,\n ],\n build: (m) => {\n const name = m[1] ?? '<name>';\n const mod = m[2] ?? '<module>';\n return (\n `[ImportError: cannot import name '${name}' from '${mod}'] ` +\n `先 \\`read_file\\` 打开 ${mod.replace(/\\./g, '/')}.py 确认实际定义的符号;` +\n `若拼写错误就 \\`replace_in_file\\` 修正 import;若符号未实现就回到对应模块用 \\`write_file\\`/\\`apply_patch\\` 补出来。`\n );\n },\n },\n {\n code: 'pytest-collection',\n severity: 1,\n patterns: [\n /ERROR\\s+collecting/,\n /pytest exit=2\\b/,\n /errors during collection/,\n ],\n build: () =>\n `[pytest collection error (exit=2)] 通常是 import 失败或测试文件语法错。` +\n `**第一步**用 \\`run_tests\\` 拿到完整 traceback(不要只看 exit code);` +\n `**第二步**用 \\`read_file\\` 打开报错的测试文件 + 它 import 的模块文件,比对真实符号;` +\n `**第三步**针对真实差异做最小修改。禁止盲目 replace_in_file。`,\n },\n {\n code: 'src-prefix-import',\n severity: 1,\n patterns: [/from\\s+src\\.[A-Za-z0-9_]+\\s+import/],\n build: (m) =>\n `[检测到 \"from src.X import\" 形式] XCompiler 约定 src/ 内模块互相 import 必须用 \\`from <module> import\\`(不带 src. 前缀);` +\n `tests/ 也一样。请 \\`read_file\\` 确认 import 行,再 \\`replace_in_file\\` 把 \"from src.\" 改为 \"from \"。证据: ${m[0]}`,\n },\n {\n code: 'network-api-failure',\n severity: 1,\n patterns: [\n /Network API failure detected/i,\n /\\b(?:api|http|request|fetch|network|connection|timeout|timed out)\\b[^\\n]{0,120}\\b(?:failed|error|timeout|unreachable|unavailable|404|429|5\\d\\d)\\b/i,\n /(?:网络|接口|API|HTTP|请求|连接|超时|限流|不可用)[^\\n]{0,120}(?:失败|错误|异常|超时|拒绝|不可达|不可用|限流)/,\n ],\n build: () =>\n `[网络 API 调用失败] 本任务必须判定失败,禁止用静态假数据、吞异常或仅展示“降级成功”来过关。` +\n `请先定位失败的 API URL 与响应/异常;若接口不可达、格式不符、限流或返回错误状态,必须更换为当前可用且适合需求的 API,` +\n `并补充测试覆盖成功路径与失败路径。最多连续做 2 次 \\`http_fetch\\` 探测;一旦确认候选接口可用且 body 非空/格式可解析,` +\n `必须立刻 \\`read_file\\` 定位源码并用 \\`apply_patch\\` / \\`replace_in_file\\` 修改真实集成,随后 \\`run_program\\` 验证入口不再输出 API 失败。`,\n },\n {\n code: 'network-api-probe-loop',\n severity: 1,\n patterns: [\n /tool calls:[\\s\\S]*(?:http_fetch).*(?:http_fetch)/i,\n /http_fetch[\\s\\S]{0,400}(?:FAIL|失败)[\\s\\S]{0,400}http_fetch/i,\n /http_fetch[\\s\\S]{0,400}(?:200|OK|成功)[\\s\\S]{0,200}(?:0B|0 字节|body 为空)/i,\n ],\n build: () =>\n `[网络 API 探测循环] 已经出现多次 \\`http_fetch\\`,下一轮必须停止继续枚举接口。` +\n `先 \\`read_file\\` / \\`code_search\\` 找到失败 URL 所在源码;选择最近一次非空、格式可解析且适合需求的候选 API,` +\n `或换一个明确有文档的无 Key API;然后 patch 源码并用 \\`run_program\\` 运行入口验证。` +\n `HTTP 200 但 0B/空 body 不是可用 API,不能据此 done=true。`,\n },\n\n // —— 名称/属性 ——————————————————————————————\n {\n code: 'NameError',\n severity: 2,\n patterns: [/NameError:\\s*name ['\"]([^'\"]+)['\"] is not defined/],\n build: (m) =>\n `[NameError: ${m[1]}] 先 \\`code_search\\` 这个名字看是否漏 import 或拼写错;` +\n `再 \\`read_file\\` 当前文件检查作用域。修复手段:补 import 或改名。`,\n },\n {\n code: 'AttributeError',\n severity: 2,\n patterns: [/AttributeError:\\s*['\"]?([^'\"\\s]+)['\"]?\\s*object has no attribute ['\"]([^'\"]+)['\"]/],\n build: (m) =>\n `[AttributeError: ${m[1]} 无属性 ${m[2]}] 先 \\`code_search\\` 这个属性的真实名字(常见 typo / 大小写 / 单复数);` +\n `若是第三方库 API 变更,\\`read_file\\` 该模块文档或换等价 API。`,\n },\n {\n code: 'TypeError-args',\n severity: 2,\n patterns: [\n /TypeError:\\s*([A-Za-z_][A-Za-z0-9_]*)\\(\\)\\s*(?:missing|takes|got|requires)[^\\n]+/,\n ],\n build: (m) =>\n `[TypeError 函数签名不匹配: ${m[1]}] \\`read_file\\` 看 ${m[1]} 的真实参数列表,再修正调用点;` +\n `不要随手改函数签名(会破坏其它调用)。`,\n },\n\n // —— 语法/缩进 ——————————————————————————————\n {\n code: 'SyntaxError',\n severity: 1,\n patterns: [/SyntaxError:[^\\n]+/, /IndentationError:[^\\n]+/, /TabError:[^\\n]+/],\n build: (m) =>\n `[${m[0].split(':')[0]}] 用 \\`read_file\\` 把整段函数读出来核对缩进/括号配对;` +\n `若是分块 \\`append_file\\` 拆断了函数体,优先用 \\`apply_patch\\` / \\`replace_in_file\\` 修复;` +\n `需要整文件重写时必须低于当前运行时 chunk limit,或按函数/类边界重新分块。`,\n },\n\n // —— 文件 IO ——————————————————————————————\n {\n code: 'FileNotFoundError-test-fixture',\n severity: 1,\n // 命中:traceback 含 tests/ 路径且缺失文件是相对裸名(典型测试 fixture,如 'test.dbc')。\n // 同时支持 Python 标准 traceback `File \"tests/x.py\"` 与 pytest 短格式 `tests/x.py:NN:`。\n patterns: [\n /(?:File\\s+[\"']|^|\\s)[^\"'\\s]*tests\\/[^\"'\\s]+\\.py(?:[\"']|:)[^]*?FileNotFoundError:[^\\n]*['\"]([^'\"/\\\\:]+\\.[A-Za-z0-9]+)['\"]/,\n ],\n build: (m) => {\n const f = m[1] ?? '<fixture>';\n return (\n `[测试用 fixture 文件未生成: ${f}] 测试代码引用了真实磁盘文件但没人创建它。可选修复(按推荐顺序):` +\n `(1) **首选**用 pytest 的 \\`tmp_path\\` / \\`tmpdir\\` fixture 在测试里临时构造该文件,` +\n `例如把 ${f} 内容用 Python 写入 tmp_path 后传入被测函数,避免污染仓库;` +\n `(2) 若该文件是被测模块的\"标准样例\",应当作为产物落到 tests/fixtures/${f},` +\n `用 \\`write_file\\` 创建该 fixture(**测试/DEBUG 阶段 tests/fixtures/ 已默认放开写权限**,` +\n `子目录会自动 mkdir -p,无需提前在 outputs 登记);` +\n `(3) 若被测函数允许 mock,用 \\`unittest.mock.mock_open\\` 或猴补 \\`builtins.open\\` 绕过真实 IO。` +\n `**严禁**单纯把硬编码路径改成另一个不存在的路径敷衍过去。`\n );\n },\n },\n {\n code: 'FileNotFoundError',\n severity: 2,\n patterns: [/FileNotFoundError:[^\\n]*['\"]([^'\"]+)['\"]/],\n build: (m) =>\n `[FileNotFoundError: ${m[1]}] 先 \\`list_dir\\` 确认路径是否真的存在;` +\n `若测试期望的资源未生成,回 CODE 输出该文件;若路径硬编码错误,\\`replace_in_file\\` 修正路径。`,\n },\n\n // —— Fixture 内容格式错误 ——————————————————————————————\n // 测试已运行,但被测函数在解析 fixture 时报\"Invalid syntax / Parse error / Malformed\"。\n // LLM 反应模式常常是\"反复重跑测试\"——其实根因是 fixture 文件本身写错了(DBC/CSV/JSON 不合法)。\n {\n code: 'fixture-content-malformed',\n severity: 1,\n patterns: [\n /Invalid syntax at line\\s+(\\d+)(?:,\\s*column\\s+\\d+)?/i,\n /(?:Parse(?:r)?Error|MalformedError|DecodeError(?!-Unicode))[:\\s][^\\n]+/,\n /(?:failed to parse|unable to parse|cannot parse|invalid format)\\b[^\\n]+/i,\n ],\n build: (m) => {\n const where = m[1] ? `(line ${m[1]})` : '';\n return (\n `[Fixture 内容格式错误${where}] 测试已经能跑起来,但被测函数在解析输入文件时拒绝了内容——` +\n `这通常意味着**fixture 文件本身写错了**(不是被测代码的 bug,也不是测试逻辑的 bug)。修复路径:` +\n `(1) 用 \\`read_file\\` 打开 tests/fixtures/<file> 看看你之前 write_file 落进去的内容;` +\n `(2) 对照该格式的最小合法样例(DBC: BO_/SG_ 行;CSV: 列头+逗号;JSON: 严格双引号)` +\n `用 \\`write_file\\` **整文件重写**为合法内容,不要逐字符 \\`replace_in_file\\` 修补;` +\n `(3) 重写后再 \\`run_tests\\` 验证。**严禁**因为这条错误就去改被测模块或测试断言——` +\n `先确认 fixture 是合法的,再质疑实现。`\n );\n },\n },\n\n // —— 依赖安装 ——————————————————————————————\n {\n code: 'pip-resolver',\n severity: 2,\n patterns: [\n /Could not find a version that satisfies the requirement\\s+([A-Za-z0-9._-]+)/,\n /ERROR: No matching distribution found for\\s+([A-Za-z0-9._-]+)/,\n ],\n build: (m) =>\n `[pip 解析失败: ${m[1]}] 该包名/版本不存在。\\`add_dependency\\` 重写为真实 PyPI 包名并去掉版本约束;` +\n `常见映射:sklearn→scikit-learn, cv2→opencv-python, PIL→pillow, yaml→PyYAML, bs4→beautifulsoup4, serial→pyserial。`,\n },\n\n // —— 编码/路径 ——————————————————————————————\n {\n code: 'UnicodeDecodeError',\n severity: 3,\n patterns: [/UnicodeDecodeError:[^\\n]+/],\n build: () =>\n `[UnicodeDecodeError] 打开二进制文件用 \\`open(..., \"rb\")\\`;文本读 UTF-8 显式 \\`encoding=\"utf-8\"\\`,` +\n `必要时加 \\`errors=\"replace\"\\`。`,\n },\n\n // —— Executor 工具反馈 ——————————————————————————————\n {\n code: 'replace-no-op',\n severity: 1,\n patterns: [/no-op edit refused: find === replace/],\n build: () =>\n `[replace_in_file 被拒:find===replace] 你提交了无意义的相同字符串替换。` +\n `请先 \\`read_file\\` 看清原文,再给出**真正不同**的 replace;如只是想确认内容用 \\`read_file\\`,不要走 \\`replace_in_file\\`。`,\n },\n {\n code: 'replace-not-found',\n severity: 2,\n patterns: [/expected \\d+ occurrences of find, found 0 in/],\n build: () =>\n `[replace_in_file: find 未命中] 文件实际内容与你假设不一致。` +\n `立即 \\`read_file\\` 完整读出该文件,按真实字节构造 find;连续 2 次仍失败请改用 \\`write_file\\` 整文件重写。`,\n },\n];\n\n/**\n * 把 Debugger 的失败日志(含 reason / pytest tail / tool calls)解析为一组建议。\n * 调用方应把结果拼到下一轮 Debugger 的 system / user prompt 中,引导其走出循环。\n *\n * - 同一 code 只保留首条命中\n * - 按 severity 升序、原命中顺序输出\n * - 最多返回 6 条,避免淹没真正的 traceback\n */\nexport function calibrateDebugSuggestions(\n failureLog: string,\n reason?: string,\n): DebugSuggestion[] {\n const text = `${reason ?? ''}\\n${failureLog ?? ''}`;\n if (!text.trim()) return [];\n const out: DebugSuggestion[] = [];\n const seen = new Set<string>();\n for (const rule of PYTHON_ERROR_RULES) {\n if (seen.has(rule.code)) continue;\n for (const re of rule.patterns) {\n const m = re.exec(text);\n if (m) {\n seen.add(rule.code);\n out.push({\n code: rule.code,\n severity: rule.severity,\n hint: rule.build(m),\n evidence: m[0].slice(0, 200),\n });\n break;\n }\n }\n }\n out.sort((a, b) => a.severity - b.severity);\n return out.slice(0, 6);\n}\n\n/** 把建议数组渲染成可直接拼入 prompt 的 markdown 段(含编号 + 证据)。 */\nexport function renderDebugSuggestions(sugs: DebugSuggestion[]): string {\n if (sugs.length === 0) return '';\n const lines: string[] = ['## 修复建议(按优先级,必须遵循)'];\n sugs.forEach((s, i) => {\n lines.push(`${i + 1}. ${s.hint}`);\n if (s.evidence) lines.push(` - 证据: \\`${s.evidence.replace(/`/g, \"'\")}\\``);\n });\n return lines.join('\\n');\n}\n","import {\n ArchitectureModuleSchema,\n ComplexityAssessmentSchema,\n ImplementationPhaseSchema,\n PHASES,\n REQUIRED_V_MODEL_PHASES,\n type ArchitectureModule,\n type ComplexityAssessment,\n type ImplementationPhase,\n type Plan,\n type Step,\n type Language,\n type PlanIntent,\n type ProjectType,\n} from '../core/plan.js';\nimport { getLanguageProfile } from '../core/language.js';\nimport {\n analyzeArchitectureDemand,\n pathCoveredByOutputs,\n validateArchitectureContract,\n} from '../core/architecture.js';\nimport type { LLMClient } from '../llm/types.js';\nimport type { AuditLogger } from '../audit/audit.js';\nimport { makeStreamReporter } from '../llm/stream.js';\nimport { t } from '../i18n/index.js';\nimport {\n calibrateDocPaths,\n calibratePythonRequirements,\n calibrateArchitectureStepMappings,\n calibrateStepIds,\n calibrateStepShape,\n calibratePlanCoverage,\n} from './calibration.js';\n\n/** @deprecated kept for back-compat; use `calibratePythonRequirements`. */\nexport const normalizePythonRequirements = calibratePythonRequirements;\n\n// NOTE: SYSTEM_PROMPT, clarify, and decompose user-prompt strings now live in\n// src/i18n/{en,zh}.ts and are pulled at call time via t().prompts.*.\n// They are intentionally lazy so the global --lang flag (parsed by Commander\n// preAction) can switch language before the Planner is constructed/used.\n\n\nexport const CLARIFICATION_CATEGORIES = [\n 'functionality',\n 'data',\n 'acceptance',\n 'boundary',\n 'quality',\n 'extensibility',\n] as const;\nexport type ClarificationCategory = (typeof CLARIFICATION_CATEGORIES)[number];\n\nexport const CLARIFICATION_OPTION_LABELS = ['A', 'B', 'C', 'D', 'E'] as const;\nexport type ClarificationOptionLabel = (typeof CLARIFICATION_OPTION_LABELS)[number];\n\nexport interface ClarifyOption {\n label: ClarificationOptionLabel;\n answer: string;\n}\n\nexport interface ClarifyQuestion {\n id: string;\n category: ClarificationCategory;\n question: string;\n why: string;\n options: ClarifyOption[];\n}\n\nexport interface PlannerInput {\n rawRequirement: string;\n clarifications: Array<{\n question: string;\n answer: string;\n category?: ClarificationCategory;\n why?: string;\n options?: ClarifyOption[];\n }>;\n /** 用户在澄清问答后补充的自定义需求(可为空)。 */\n userAddenda?: string;\n /** 增量开发时,现有工程基线摘要(文档 / 计划 / 源码树)。 */\n baselineContext?: string;\n /** 计划意图:greenfield / feature / refactor / self。 */\n intent?: PlanIntent;\n}\n\nexport interface DraftPlan {\n requirementDigest: string;\n globalPrompt: string;\n projectType?: ProjectType;\n complexityAssessment?: ComplexityAssessment;\n implementationPhases?: ImplementationPhase[];\n dependencies: string[];\n architectureModules?: ArchitectureModule[];\n steps: Step[];\n}\n\nexport class Planner {\n constructor(\n private readonly llm: LLMClient,\n private readonly audit?: AuditLogger,\n private readonly language: Language = 'python',\n ) {}\n\n async clarify(\n rawRequirement: string,\n opts: { intent?: PlanIntent; hasBaseline?: boolean } = {},\n ): Promise<ClarifyQuestion[]> {\n const demand = analyzeArchitectureDemand(\n { requirementDigest: rawRequirement, intent: opts.intent ?? 'greenfield' },\n this.language,\n );\n const projectShapeAmbiguous = isProjectShapeAmbiguous(rawRequirement);\n const prompt = t().prompts.plannerClarify(rawRequirement, {\n intent: opts.intent ?? 'greenfield',\n hasBaseline: !!opts.hasBaseline,\n complex: demand.nonTrivial,\n projectShapeAmbiguous,\n });\n const rep = makeStreamReporter('Planner.clarify', this.llm.name);\n let provider: string | undefined;\n let text: string;\n try {\n text = await this.llm.chat(\n [\n { role: 'system', content: t().prompts.plannerClarifySystem },\n { role: 'user', content: prompt },\n ],\n {\n responseFormat: 'json',\n temperature: 0.2,\n onToken: rep.onToken,\n onProvider: (n) => { provider = n; },\n onProviderStart: (name, model) => { rep.setModel(`${name}/${model}`); },\n // 在 provider fallback 层校验问题集质量,避免“只有两三个泛泛问题”直接进入 Gate 1。\n validate: (t) => validateClarifyJson(t, demand.nonTrivial, projectShapeAmbiguous),\n },\n );\n rep.done();\n } catch (err) {\n rep.done('failed');\n throw err;\n }\n await this.audit?.plannerThought('clarify', text, { rawRequirement, provider });\n return parseClarifyJson(text);\n }\n\n async decompose(input: PlannerInput): Promise<DraftPlan> {\n const qa = input.clarifications\n .map((c, i) => {\n const optionBlock = c.options && c.options.length > 0\n ? `\\n候选设定:\\n${c.options.map((option) => `- ${option.label}. ${option.answer}`).join('\\n')}`\n : '';\n return `Q${i + 1}${c.category ? ` [${c.category}]` : ''}: ${c.question}` +\n `${c.why ? `\\n澄清目的: ${c.why}` : ''}${optionBlock}\\nA${i + 1}: ${c.answer}`;\n })\n .join('\\n\\n');\n const addenda = (input.userAddenda ?? '').trim();\n const parseContext = {\n language: this.language,\n rawRequirement: input.rawRequirement,\n userAddenda: addenda,\n baselineSummary: input.baselineContext ?? '',\n intent: input.intent ?? 'greenfield' as PlanIntent,\n };\n const intent = input.intent ?? 'greenfield';\n const prompt = t().prompts.plannerDecompose(input.rawRequirement, qa, addenda, {\n intent,\n baseline: input.baselineContext ?? '',\n });\n const rep = makeStreamReporter('Planner.decompose', this.llm.name);\n let provider: string | undefined;\n let text: string;\n try {\n text = await this.llm.chat(\n [\n {\n role: 'system',\n content:\n t().prompts.plannerSystem(getLanguageProfile(this.language)) +\n (intent === 'self' ? `\\n\\n${t().prompts.plannerSelfMode}` : ''),\n },\n { role: 'user', content: prompt },\n ],\n {\n responseFormat: 'json',\n temperature: 0.1,\n onToken: rep.onToken,\n onProvider: (n) => { provider = n; },\n onProviderStart: (name, model) => { rep.setModel(`${name}/${model}`); },\n // 在 chain 层验证:如果 LLM 输出不能解析为含 steps 的 JSON(\n // 例如 token loop / 截断),FallbackClient 会自动切换到下一个 provider。\n validate: (t) => parseDraftPlanJson(t, parseContext),\n },\n );\n rep.done();\n } catch (err) {\n rep.done('failed');\n throw err;\n }\n await this.audit?.plannerThought('decompose', text, { qaCount: input.clarifications.length, provider });\n return parseDraftPlanJson(text, parseContext);\n }\n}\n\nexport function buildPlan(\n draft: DraftPlan,\n opts: { userAddenda?: string; language?: Language; intent?: PlanIntent; baselineSummary?: string } = {},\n): Plan {\n const language = opts.language ?? 'python';\n const projectType = draft.projectType ?? inferProjectType([\n draft.requirementDigest,\n draft.globalPrompt,\n opts.userAddenda ?? '',\n opts.baselineSummary ?? '',\n ].join('\\n'));\n const complexityAssessment =\n draft.complexityAssessment ??\n inferComplexityAssessment({\n requirementDigest: draft.requirementDigest,\n globalPrompt: draft.globalPrompt,\n userAddenda: opts.userAddenda ?? '',\n baselineSummary: opts.baselineSummary ?? '',\n intent: opts.intent ?? 'greenfield',\n language,\n });\n const implementationPhases = normalizeImplementationPhases(\n draft.implementationPhases,\n complexityAssessment,\n draft.requirementDigest,\n );\n const iterated = normalizeStepIterations(draft.steps, implementationPhases);\n const shaped = calibrateDocPaths(calibrateStepShape(calibrateStepIds(iterated)), projectType);\n const mapped = calibrateArchitectureStepMappings(shaped, draft.architectureModules ?? []);\n const contracted = injectArchitectureContractPrompts(mapped, draft.architectureModules ?? []);\n // 兜底:若 LLM 漏写了 UNIT_TEST 阶段或部分 CODE 没人覆盖,由 calibrationPlanCoverage 自动追加。\n const steps = calibratePlanCoverage(contracted, language);\n // Python 依赖需要校准(剥离版本锁 / 重写幻觉 PyPI 包名);其他语言仅做去重清洗。\n const dependencies =\n language === 'python'\n ? calibratePythonRequirements(draft.dependencies)\n : [...new Set((draft.dependencies ?? []).map((d) => d.trim()).filter(Boolean))];\n return {\n version: '1',\n language,\n intent: opts.intent ?? 'greenfield',\n projectType,\n requirementDigest: draft.requirementDigest,\n complexityAssessment,\n implementationPhases,\n architectureModules: draft.architectureModules,\n globalPrompt: draft.globalPrompt,\n baselineSummary: opts.baselineSummary ?? '',\n dependencies,\n userAddenda: (opts.userAddenda ?? '').trim(),\n createdAt: new Date().toISOString(),\n steps,\n };\n}\n\nfunction injectArchitectureContractPrompts(\n steps: Step[],\n modules: ArchitectureModule[],\n): Step[] {\n if (modules.length === 0) return steps;\n const inventory = modules\n .map((module) =>\n `${module.id} ${module.name}: sources=[${module.sourcePaths.join(', ')}], tests=[${module.testPaths.join(', ')}], deps=[${module.dependencies.join(', ') || 'none'}]`,\n )\n .join('\\n');\n\n return steps.map((step) => {\n let contractBlock = '';\n if (step.phase === 'HIGH_LEVEL_DESIGN') {\n contractBlock =\n `\\n\\nHIGH_LEVEL_DESIGN 契约(强制):docs/02-high-level-design.md 必须逐项写明本开发模块在整体系统中的定位、系统级对外接口、外部 API、第三方库选型、依赖确认,以及以下模块的职责、源码路径、测试路径和依赖,不得合并或省略:\\n${inventory}`;\n } else if (step.phase === 'DETAILED_DESIGN') {\n contractBlock =\n `\\n\\nDETAILED_DESIGN 契约(强制):docs/03-detailed-design.md 必须定义模块内部具体功能实现、内部架构、数据结构/控制流,并为以下每个模块保留独立 CODE/MODULE_TEST 任务及验收映射:\\n${inventory}`;\n } else if (step.phase === 'CODE') {\n const owned = modules.filter((module) =>\n module.sourcePaths.every((sourcePath) => pathCoveredByOutputs(sourcePath, step.outputs)),\n );\n if (owned.length > 0) {\n contractBlock =\n `\\n\\n本 CODE Step 仅实现架构模块:\\n${owned.map((module) => `${module.id} ${module.name} — ${module.responsibility}; sourcePaths=${module.sourcePaths.join(', ')}`).join('\\n')}`;\n }\n } else if (step.phase === 'MODULE_TEST') {\n const covered = modules.filter((module) =>\n module.testPaths.some((testPath) => pathCoveredByOutputs(testPath, step.outputs)),\n );\n if (covered.length > 0) {\n contractBlock =\n `\\n\\n本 MODULE_TEST Step 验证架构模块:\\n${covered.map((module) => `${module.id} ${module.name}; testPaths=${module.testPaths.join(', ')}`).join('\\n')}`;\n }\n }\n return contractBlock ? { ...step, systemPrompt: `${step.systemPrompt}${contractBlock}` } : step;\n });\n}\n\nfunction parseClarifyJson(text: string): ClarifyQuestion[] {\n const data = safeJson(text);\n const arr = coerceClarifyArray(data);\n const seenQuestions = new Set<string>();\n const seenIds = new Set<string>();\n const questions: ClarifyQuestion[] = [];\n for (const [index, raw] of arr.entries()) {\n const question = typeof raw?.question === 'string' ? raw.question.trim() : '';\n if (!question) continue;\n const dedupKey = question.toLowerCase().replace(/[\\s??。.!!,,;;::]+/gu, '');\n if (seenQuestions.has(dedupKey)) continue;\n seenQuestions.add(dedupKey);\n const candidateId = typeof raw?.id === 'string' && /^Q\\d+$/iu.test(raw.id.trim())\n ? raw.id.trim().toUpperCase()\n : `Q${index + 1}`;\n let id = candidateId;\n let fallbackNumber = index + 1;\n while (seenIds.has(id)) {\n fallbackNumber += 1;\n id = `Q${fallbackNumber}`;\n }\n seenIds.add(id);\n questions.push({\n id,\n category: normalizeClarificationCategory(raw?.category),\n question,\n why: typeof raw?.why === 'string' ? raw.why.trim() : '',\n options: parseClarifyOptions(raw?.options),\n });\n }\n return questions;\n}\n\n/**\n * 宽容处理 LLM 可能的几种返回形式:\n * - 数组:[{id,question}, ...]\n * - 单个对象:{id,question} -> 包成长度 1 的数组\n * - 包装对象:{questions:[...]} 或 {items:[...]} -> 取其中的数组\n * - 其他:返回空数组(表示“无需澄清”)\n */\ninterface RawClarifyQuestion {\n id?: unknown;\n category?: unknown;\n question?: unknown;\n why?: unknown;\n options?: unknown;\n}\n\nfunction coerceClarifyArray(data: unknown): RawClarifyQuestion[] {\n if (Array.isArray(data)) return data as RawClarifyQuestion[];\n if (data && typeof data === 'object') {\n const obj = data as Record<string, unknown>;\n if (Array.isArray(obj.questions)) return obj.questions as RawClarifyQuestion[];\n if (Array.isArray(obj.items)) return obj.items as RawClarifyQuestion[];\n if (typeof obj.question === 'string') return [obj as RawClarifyQuestion];\n }\n return [];\n}\n\nconst CLARIFICATION_CATEGORY_ALIASES: Record<string, ClarificationCategory> = {\n functionality: 'functionality', functional: 'functionality', function: 'functionality', feature: 'functionality',\n data: 'data', input: 'data', output: 'data', 'input-output': 'data',\n acceptance: 'acceptance', correctness: 'acceptance', verification: 'acceptance',\n boundary: 'boundary', scope: 'boundary', edge: 'boundary',\n quality: 'quality', performance: 'quality', reliability: 'quality', security: 'quality',\n extensibility: 'extensibility', scalability: 'extensibility', evolution: 'extensibility', extension: 'extensibility',\n};\n\nfunction parseClarificationCategory(value: unknown): ClarificationCategory | undefined {\n const normalized = typeof value === 'string' ? value.trim().toLowerCase() : '';\n return CLARIFICATION_CATEGORY_ALIASES[normalized];\n}\n\nfunction normalizeClarificationCategory(value: unknown): ClarificationCategory {\n return parseClarificationCategory(value) ?? 'functionality';\n}\n\nfunction parseClarifyOptions(value: unknown): ClarifyOption[] {\n if (!Array.isArray(value)) return [];\n const seen = new Set<string>();\n const options: ClarifyOption[] = [];\n for (const item of value) {\n const rawAnswer = extractClarifyOptionAnswer(item);\n const answer = stripOptionLabel(rawAnswer).trim();\n if (!answer) continue;\n const dedupKey = answer.toLowerCase().replace(/[\\s??。.!!,,;;::]+/gu, '');\n if (seen.has(dedupKey)) continue;\n seen.add(dedupKey);\n const label = CLARIFICATION_OPTION_LABELS[options.length];\n if (!label) break;\n options.push({ label, answer });\n }\n return options;\n}\n\nfunction extractClarifyOptionAnswer(item: unknown): string {\n if (typeof item === 'string') return item;\n if (!item || typeof item !== 'object') return '';\n const obj = item as Record<string, unknown>;\n for (const key of ['answer', 'text', 'value', 'setting', 'title', 'label']) {\n const value = obj[key];\n if (typeof value === 'string' && value.trim()) return value;\n }\n return '';\n}\n\nfunction stripOptionLabel(value: string): string {\n return value.replace(/^\\s*[A-Ea-e]\\s*[).\\]、::-]\\s*/u, '');\n}\n\nfunction validateClarifyJson(\n text: string,\n complex: boolean,\n projectShapeAmbiguous = false,\n): ClarifyQuestion[] {\n const data = safeJson(text);\n const raw = coerceClarifyArray(data);\n if (raw.length === 0) {\n throw new Error('clarify returned no questions; interactive intake requires a multi-dimensional question set');\n }\n for (const [index, question] of raw.entries()) {\n if (typeof question.question !== 'string' || question.question.trim().length < 6) {\n throw new Error(`clarify question ${index + 1} is missing or too short`);\n }\n if (!parseClarificationCategory(question.category)) {\n throw new Error(`clarify question ${index + 1} is missing a valid category`);\n }\n if (typeof question.why !== 'string' || question.why.trim().length < 4) {\n throw new Error(`clarify question ${index + 1} is missing a concise why field`);\n }\n const rawOptions = Array.isArray(question.options) ? question.options : [];\n const options = parseClarifyOptions(question.options);\n if (rawOptions.length < 2 || rawOptions.length > 5 || options.length !== rawOptions.length) {\n throw new Error(`clarify question ${index + 1} must include 2-5 prioritized answer options`);\n }\n }\n\n const parsed = parseClarifyJson(text);\n if (parsed.length !== raw.length) {\n throw new Error(`clarify contains duplicate or empty questions (${raw.length} raw, ${parsed.length} unique)`);\n }\n const minQuestions = complex ? 8 : 7;\n if (parsed.length < minQuestions || parsed.length > 10) {\n throw new Error(`clarify expected ${minQuestions}-10 unique questions, got ${parsed.length}`);\n }\n const count = (category: ClarificationCategory): number =>\n parsed.filter((question) => question.category === category).length;\n const functionalCount = count('functionality') + count('data') + count('acceptance');\n const minFunctional = complex ? 5 : 4;\n if (functionalCount < minFunctional) {\n throw new Error(`clarify requires at least ${minFunctional} function-focused questions, got ${functionalCount}`);\n }\n for (const required of ['boundary', 'quality', 'extensibility'] as const) {\n if (count(required) === 0) {\n throw new Error(`clarify missing required ${required} question`);\n }\n }\n if (projectShapeAmbiguous && !parsed.some(isProjectShapeClarification)) {\n throw new Error(\n 'clarify missing required project shape question: ask whether this should be an API library, runnable application, or mixed deliverable',\n );\n }\n return parsed;\n}\n\ninterface DraftParseContext {\n language: Language;\n rawRequirement: string;\n userAddenda: string;\n baselineSummary: string;\n intent: PlanIntent;\n}\n\nfunction parseDraftPlanJson(text: string, context?: DraftParseContext): DraftPlan {\n const data = safeJson(text);\n if (!data || typeof data !== 'object') {\n throw new Error('Planner did not return a JSON object.');\n }\n const obj = data as Record<string, unknown>;\n const digest = obj.requirementDigest;\n const steps = obj.steps;\n if (typeof digest !== 'string' || !Array.isArray(steps)) {\n throw new Error('Planner JSON missing requirementDigest or steps.');\n }\n const globalPrompt = typeof obj.globalPrompt === 'string' ? obj.globalPrompt : '';\n const parsedProjectType = parseProjectType(obj.projectType);\n if (context && !parsedProjectType) {\n throw new Error(\n 'Planner JSON missing valid projectType; project shape must be classified by the LLM after clarification.',\n );\n }\n const projectType = parsedProjectType ?? inferProjectType([\n typeof digest === 'string' ? digest : '',\n globalPrompt,\n context?.rawRequirement ?? '',\n context?.userAddenda ?? '',\n context?.baselineSummary ?? '',\n ].join('\\n'));\n const rawDeps = Array.isArray(obj.dependencies)\n ? obj.dependencies\n : Array.isArray(obj.pythonRequirements)\n ? obj.pythonRequirements\n : [];\n const dependencies = (rawDeps as unknown[]).filter((s): s is string => typeof s === 'string');\n if (context) {\n const validPhaseNames = new Set<string>(PHASES);\n const nonCanonical = (steps as unknown[])\n .map((rawStep, index) => {\n const step = rawStep && typeof rawStep === 'object' ? rawStep as Record<string, unknown> : {};\n return {\n id: typeof step.id === 'string' ? step.id : `#${index + 1}`,\n phase: typeof step.phase === 'string' ? step.phase : '',\n };\n })\n .filter((step) => !validPhaseNames.has(step.phase));\n if (nonCanonical.length > 0) {\n throw new Error(\n `Planner draft uses non-canonical phase(s): ` +\n `${nonCanonical.map((step) => `${step.id}:${step.phase || '(missing)'}`).join(', ')}. ` +\n `V-model phases must be exactly ${REQUIRED_V_MODEL_PHASES.join(' -> ')} ` +\n `with DEBUG only for explicit rollback/repair; do not emit legacy REQUIREMENT, ARCH, TASK, TEST, REFACTOR, or DELIVERY.`,\n );\n }\n }\n const normalizedDraftStepsForValidation = calibrateStepShape(calibrateStepIds(steps as Step[]));\n // 强制 V 模型骨架完整性:必须覆盖核心阶段。LLM 在 token loop / 截断时常见症状\n // 是只输出前 1-2 个 Step(如用户回放:仅 REQUIREMENT_ANALYSIS+HIGH_LEVEL_DESIGN 两步),这种残缺 plan\n // 后续重试也救不回,应在 validate 层直接拒绝,让 FallbackClient 切换 provider\n // 重新生成完整 plan。\n const phases = new Set<string>();\n for (const s of normalizedDraftStepsForValidation) {\n const p = typeof s?.phase === 'string' ? s.phase : '';\n if (p) phases.add(p);\n }\n const required = [...REQUIRED_V_MODEL_PHASES];\n const missing = required.filter((p) => !phases.has(p));\n if (steps.length < required.length || missing.length > 0) {\n throw new Error(\n `Planner draft incomplete (likely token-loop / truncation): ` +\n `got ${steps.length} step(s), phases=[${[...phases].join(',') || '(none)'}], ` +\n `missing=[${missing.join(',') || '(none)'}]. V-model requires core phases: ${required.join('/')}.`,\n );\n }\n const architectureResult = ArchitectureModuleSchema.array().safeParse(obj.architectureModules ?? []);\n if (!architectureResult.success) {\n throw new Error(`Planner architectureModules invalid: ${architectureResult.error.issues.map((i) => i.message).join('; ')}`);\n }\n const architectureModules = architectureResult.data;\n const parsedComplexityAssessment = parseComplexityAssessment(obj.complexityAssessment);\n if (context && !parsedComplexityAssessment) {\n throw new Error('Planner JSON missing valid complexityAssessment; complexity must be assessed during plan decomposition.');\n }\n const complexityAssessment =\n parsedComplexityAssessment ??\n inferComplexityAssessment({\n requirementDigest: digest,\n globalPrompt,\n rawRequirement: context?.rawRequirement ?? '',\n userAddenda: context?.userAddenda ?? '',\n baselineSummary: context?.baselineSummary ?? '',\n intent: context?.intent ?? 'greenfield',\n language: context?.language ?? 'python',\n });\n const parsedImplementationPhases = parseImplementationPhases(obj.implementationPhases);\n if (context && (!parsedImplementationPhases || parsedImplementationPhases.length === 0)) {\n throw new Error('Planner JSON missing valid implementationPhases; P1 current phase must be explicit.');\n }\n const phaseIssue = parsedImplementationPhases\n ? validateImplementationPhaseDraft(parsedImplementationPhases, complexityAssessment)\n : undefined;\n if (context && phaseIssue) {\n throw new Error(`Planner implementationPhases invalid: ${phaseIssue}`);\n }\n const implementationPhases = normalizeImplementationPhases(\n parsedImplementationPhases,\n complexityAssessment,\n digest,\n );\n const stepsWithIterations = normalizeStepIterations(normalizedDraftStepsForValidation, implementationPhases);\n const iterationIssue = validateIterationVModelDraft(stepsWithIterations, implementationPhases);\n if (context && iterationIssue) {\n throw new Error(`Planner iteration V-model invalid: ${iterationIssue}`);\n }\n if (context) {\n const demand = analyzeArchitectureDemand(\n {\n requirementDigest: digest,\n rawRequirement: context.rawRequirement,\n userAddenda: context.userAddenda,\n globalPrompt,\n baselineSummary: context.baselineSummary,\n intent: context.intent,\n },\n context.language,\n );\n const forcedPhaseSplit = hasForcedPhaseSplit([\n digest,\n context.rawRequirement,\n context.userAddenda,\n ].join('\\n'));\n if (demand.nonTrivial && !complexityAssessment.splitRecommended) {\n throw new Error(\n `Planner complexityAssessment underestimates a non-trivial request (${demand.reasonLabel}); ` +\n 'splitRecommended must be true and additional executable iterations must be planned.',\n );\n }\n if (forcedPhaseSplit && !complexityAssessment.userForcedPhaseSplit) {\n throw new Error('Planner complexityAssessment missed the user-forced phase split request.');\n }\n if (demand.nonTrivial && architectureModules.length === 0) {\n throw new Error(\n `Planner omitted architectureModules for a non-trivial request (${demand.reasonLabel}); ` +\n `expected at least ${demand.minModules} modules with CODE/MODULE_TEST traceability.`,\n );\n }\n if (architectureModules.length > 0) {\n const normalizedSteps = calibrateArchitectureStepMappings(\n calibrateDocPaths(calibrateStepShape(calibrateStepIds(stepsWithIterations)), projectType),\n architectureModules,\n );\n const contractIssues = validateArchitectureContract(\n architectureModules,\n normalizedSteps,\n context.language,\n demand,\n );\n if (contractIssues.length > 0) {\n throw new Error(\n `Planner architecture contract incomplete: ${contractIssues.map((issue) => issue.message).join(' | ')}`,\n );\n }\n }\n }\n // Step shape will be validated by zod / lint downstream.\n return {\n requirementDigest: digest,\n globalPrompt,\n projectType,\n complexityAssessment,\n implementationPhases,\n dependencies,\n architectureModules,\n steps: stepsWithIterations,\n };\n}\n\nfunction parseComplexityAssessment(value: unknown): ComplexityAssessment | undefined {\n const result = ComplexityAssessmentSchema.safeParse(value);\n return result.success ? result.data : undefined;\n}\n\nfunction parseImplementationPhases(value: unknown): ImplementationPhase[] | undefined {\n const result = ImplementationPhaseSchema.array().safeParse(value);\n return result.success ? result.data : undefined;\n}\n\nfunction validateImplementationPhaseDraft(\n phases: ImplementationPhase[],\n assessment: ComplexityAssessment,\n): string | undefined {\n const requiredCount = requiredImplementationPhaseCount(assessment);\n const executable = phases.filter((phase) => phase.status !== 'deferred');\n if (executable.length < requiredCount) {\n return `complexityAssessment.level=${assessment.level} requires at least ${requiredCount} executable implementation iteration(s)`;\n }\n if (\n assessment.level === 'simple' &&\n !assessment.splitRecommended &&\n !assessment.userForcedPhaseSplit &&\n executable.length !== 1\n ) {\n return 'simple complexity without splitRecommended must use exactly one executable implementation iteration';\n }\n const current = phases.filter((phase) => phase.status === 'current');\n if (current.length !== 1 || current[0]?.id !== 'P1') {\n return 'exactly one current phase is required and it must be P1';\n }\n if (phases[0]?.id !== 'P1') {\n return 'P1 must be the first implementation phase';\n }\n for (const phase of phases.filter((item) => item.id !== 'P1')) {\n if (phase.status === 'current') {\n return `${phase.id} must not be current; later iterations must be planned or explicitly deferred`;\n }\n }\n if (assessment.userForcedPhaseSplit && !assessment.splitRecommended) {\n return 'userForcedPhaseSplit=true requires splitRecommended=true';\n }\n if (assessment.level !== 'simple' && !assessment.splitRecommended) {\n return 'moderate/complex complexity requires splitRecommended=true';\n }\n if (assessment.splitRecommended && executable.filter((phase) => phase.id !== 'P1').length === 0) {\n return 'splitRecommended=true requires at least one planned executable iteration after P1';\n }\n return undefined;\n}\n\nfunction validateIterationVModelDraft(\n steps: Step[],\n phases: ImplementationPhase[],\n): string | undefined {\n const executable = phases.filter((phase) => phase.status !== 'deferred');\n const executableIds = new Set(executable.map((phase) => phase.id));\n for (const step of steps) {\n const iterationId = step.iterationId ?? 'P1';\n if (!executableIds.has(iterationId)) {\n return `${step.id} references non-executable iteration ${iterationId}`;\n }\n }\n for (const iteration of executable) {\n const iterationSteps = steps.filter((step) => (step.iterationId ?? 'P1') === iteration.id);\n const phaseSet = new Set(iterationSteps.map((step) => step.phase));\n for (const required of REQUIRED_V_MODEL_PHASES) {\n if (!phaseSet.has(required)) {\n return `${iteration.id} is missing ${required}; every iteration must be a complete V-model cycle`;\n }\n }\n }\n return undefined;\n}\n\nfunction parseProjectType(value: unknown): ProjectType | undefined {\n return value === 'application' || value === 'library' || value === 'mixed'\n ? value\n : undefined;\n}\n\nfunction isProjectShapeAmbiguous(text: string): boolean {\n const signals = projectShapeSignals(text);\n if (signals.genericApi && !signals.libraryLike && !signals.appLike) return true;\n return !signals.libraryLike && !signals.appLike;\n}\n\nfunction isProjectShapeClarification(question: ClarifyQuestion): boolean {\n const text = `${question.question}\\n${question.why}`.toLowerCase();\n return (\n /api[- ]?library|public api|reusable api|client library|sdk|package|library|runnable app|application|cli|service|mixed/u.test(text) ||\n /api\\s*(库|客户端|能力)|公共\\s*api|可复用接口|库项目|软件包|开发包|可运行|应用|命令行|服务|混合/u.test(question.question)\n );\n}\n\nfunction projectShapeSignals(text: string): { libraryLike: boolean; appLike: boolean; genericApi: boolean } {\n const lower = text.toLowerCase();\n const libraryLike =\n /\\b(api[- ]?library|library|sdk|package|npm package|pypi package|client library|api client|reusable module|public api)\\b/u.test(lower) ||\n /api\\s*(库|客户端)|公共\\s*api|可复用接口|公共库|库项目|软件包|客户端库|开发包/u.test(text);\n const appLike =\n /\\b(cli|command|command line|web app|server|service|dashboard|script|tool|terminal|application|app|api[- ]?server|api[- ]?service|rest api|http api|web api|api endpoint)\\b/u.test(lower) ||\n /命令行|服务|应用|脚本|工具|控制台|后台|仪表盘/u.test(text);\n const explicitApiSurface =\n /\\b(api[- ]?server|api[- ]?service|rest api|http api|web api|api endpoint|api client|api[- ]?library)\\b/u.test(lower) ||\n /api\\s*(服务|网关|端点|客户端|库)/u.test(text);\n const genericApi = (/\\bapi\\b/u.test(lower) || /接口/u.test(text)) && !explicitApiSurface;\n return { libraryLike, appLike, genericApi };\n}\n\nfunction inferComplexityAssessment(input: {\n requirementDigest: string;\n rawRequirement?: string;\n globalPrompt?: string;\n userAddenda?: string;\n baselineSummary?: string;\n intent: PlanIntent;\n language: Language;\n}): ComplexityAssessment {\n const text = [\n input.requirementDigest,\n input.rawRequirement ?? '',\n input.userAddenda ?? '',\n input.baselineSummary ?? '',\n ].join('\\n');\n const demand = analyzeArchitectureDemand(input, input.language);\n const forced = hasForcedPhaseSplit(text);\n const level: ComplexityAssessment['level'] =\n demand.nonTrivial || forced\n ? 'complex'\n : demand.surfaces.length > 0 || demand.baselineModules > 0\n ? 'moderate'\n : 'simple';\n return {\n level,\n rationale: demand.reasonLabel,\n splitRecommended: forced || level !== 'simple',\n userForcedPhaseSplit: forced,\n };\n}\n\nfunction normalizeImplementationPhases(\n phases: ImplementationPhase[] | undefined,\n assessment: ComplexityAssessment,\n requirementDigest: string,\n): ImplementationPhase[] {\n const requiredCount = requiredImplementationPhaseCount(assessment);\n const sanitized: ImplementationPhase[] = (phases ?? [])\n .filter((phase) => phase.id && phase.title && phase.objective)\n .map((phase, index) => ({\n ...phase,\n id: phase.id || `P${index + 1}`,\n status: index === 0 ? 'current' as const : phase.status === 'deferred' ? 'deferred' as const : 'planned' as const,\n dependsOn: index === 0 ? [] : phase.dependsOn.length > 0 ? phase.dependsOn : [`P${index}`],\n verificationGate: phase.verificationGate ?? defaultVerificationGate(phase.id || `P${index + 1}`),\n }));\n if (sanitized.length > 0) {\n while (sanitized.filter((phase) => phase.status !== 'deferred').length < requiredCount) {\n sanitized.push(plannedIterationPhase(requirementDigest, sanitized.length + 1));\n }\n return sanitized;\n }\n const p1: ImplementationPhase = {\n id: 'P1',\n title: 'Core functionality',\n objective: `Deliver the smallest complete core slice for: ${requirementDigest}`,\n status: 'current',\n scope: ['Core domain behaviour', 'Runnable entrypoint', 'Primary tests', 'Functional validation documentation'],\n deliverables: ['Complete V-model iteration for the highest-priority core slice.'],\n dependsOn: [],\n verificationGate: defaultVerificationGate('P1'),\n };\n const out = [p1];\n while (out.length < requiredCount) {\n out.push(plannedIterationPhase(requirementDigest, out.length + 1));\n }\n return out;\n}\n\nfunction requiredImplementationPhaseCount(assessment: ComplexityAssessment): number {\n if (assessment.level !== 'simple' || assessment.splitRecommended || assessment.userForcedPhaseSplit) return 2;\n return 1;\n}\n\nfunction plannedIterationPhase(requirementDigest: string, index: number): ImplementationPhase {\n return {\n id: `P${index}`,\n title: `Iteration ${index} enhancements`,\n objective: `Deliver the next highest-priority iteration after P${index - 1}: ${requirementDigest}`,\n status: 'planned',\n scope: ['Next prioritized workflows', 'Extended integrations', 'Quality hardening', 'Functional validation update'],\n deliverables: ['Complete V-model iteration with requirement analysis, high-level design, detailed design, code, unit test, integration test, module test, and functional test steps.'],\n dependsOn: [`P${Math.max(1, index - 1)}`],\n verificationGate: defaultVerificationGate(`P${index}`),\n };\n}\n\nfunction defaultVerificationGate(iterationId: string) {\n return {\n summary: `${iterationId} iteration gate: documentation, automated tests, runnable entrypoint, and language quality checks must pass.`,\n checks: [\n 'Declared functional validation documentation exists for this iteration.',\n 'Automated test suite passes with no detected network API failure.',\n 'Runnable entrypoint or public API probe succeeds.',\n 'Language-specific build/lint checks pass when configured.',\n ],\n failurePolicy:\n 'If any check fails, feed the full gate failure log into Debugger and repair the same iteration through the paired V-model rollback phase before rerunning subsequent phases.',\n };\n}\n\nfunction normalizeStepIterations(steps: Step[], _phases: ImplementationPhase[]): Step[] {\n return steps.map((step) => {\n const iterationId = step.iterationId ?? 'P1';\n return {\n ...step,\n iterationId,\n };\n });\n}\n\nfunction hasForcedPhaseSplit(text: string): boolean {\n return /\\b(?:phase\\s*\\d+|multi[- ]phase|phase split|staged rollout)\\b|分阶段|多阶段|分期|阶段拆分|一期|二期|第一阶段|第二阶段|后续阶段/iu.test(text);\n}\n\nfunction inferProjectType(text: string): ProjectType {\n const { libraryLike, appLike } = projectShapeSignals(text);\n if (libraryLike && appLike) return 'mixed';\n if (libraryLike) return 'library';\n return 'application';\n}\n\nfunction safeJson(text: string): unknown {\n // Strip ```json fences if present.\n const cleaned = text.trim().replace(/^```(?:json)?\\s*/i, '').replace(/```$/, '').trim();\n try {\n return JSON.parse(cleaned);\n } catch {\n // attempt to find first JSON-looking substring\n const start = cleaned.indexOf('{');\n const lastObj = cleaned.lastIndexOf('}');\n const startArr = cleaned.indexOf('[');\n const lastArr = cleaned.lastIndexOf(']');\n const candidates: string[] = [];\n if (start >= 0 && lastObj > start) candidates.push(cleaned.slice(start, lastObj + 1));\n if (startArr >= 0 && lastArr > startArr) candidates.push(cleaned.slice(startArr, lastArr + 1));\n for (const c of candidates) {\n try {\n return JSON.parse(c);\n } catch {\n /* keep trying */\n }\n }\n throw new Error(`Planner returned non-JSON content:\\n${text.slice(0, 500)}`);\n }\n}\n","import { promises as fs } from 'node:fs';\nimport type { Dirent } from 'node:fs';\nimport path from 'node:path';\nimport type { Workspace } from '../workspace/workspace.js';\nimport { PlanSchema, type Language, type PlanIntent } from './plan.js';\nimport { PROJECT_MEMORY_PATH, refreshProjectMemory } from './project_memory.js';\n\nexport interface IncrementalBaseline {\n summary: string;\n sources: string[];\n language?: Language;\n languageSource?: string;\n}\n\n/**\n * 增量开发基线汇总:把现有 workspace 中的 topic / 计划 / 关键文档 / 代码树\n * 收敛成一段可直接拼进 Planner prompt 的文本,供 feature/refactor 计划使用。\n */\nexport async function loadIncrementalBaseline(\n ws: Workspace,\n opts: { planPath?: string; maxChars?: number } = {},\n): Promise<IncrementalBaseline> {\n const sections: string[] = [];\n const sources: string[] = [];\n const maxChars = opts.maxChars ?? 14_000;\n let language: Language | undefined;\n let languageSource: string | undefined;\n\n const relPlan = relInsideWorkspace(ws.root, opts.planPath);\n const planSource = opts.planPath ? path.resolve(opts.planPath) : path.join(ws.root, 'plan.json');\n const planLabel = relPlan ?? path.relative(ws.root, planSource).replace(/\\\\/g, '/');\n const plan = await loadPlanSummary(ws, planSource, planLabel || 'plan.json');\n if (plan) {\n sections.push(plan.text);\n sources.push(planLabel || 'plan.json');\n language = plan.language;\n languageSource = plan.language ? planLabel || 'plan.json' : undefined;\n }\n\n const memory = await refreshProjectMemory(ws, {\n planPath: planSource,\n language,\n intent: plan?.intent,\n maxChars: Math.min(maxChars, 11_000),\n });\n if (memory.summary) {\n sections.push(`## Existing project memory\\n${memory.summary}`);\n sources.push(...memory.keyFiles.map((file) => file.path));\n sources.push(PROJECT_MEMORY_PATH);\n if (!language && memory.language) {\n language = memory.language;\n languageSource = PROJECT_MEMORY_PATH;\n }\n }\n\n const manifestSummary = await loadManifestSummary(ws);\n if (!language && manifestSummary?.language) {\n language = manifestSummary.language;\n languageSource = manifestSummary.sources[0];\n }\n\n const tree = await listProjectFiles(ws.root);\n if (tree.length > 0) {\n sections.push(`## Current source/test tree\\n${tree.map((p) => `- ${p}`).join('\\n')}`);\n sources.push('src/**', 'tests/**');\n }\n if (!language) {\n language = inferLanguageFromTree(tree);\n languageSource = language ? 'src/**, tests/**' : undefined;\n }\n\n const summary = joinCappedSections(sections, maxChars);\n return { summary, sources: dedup(sources), language, languageSource };\n}\n\nfunction joinCappedSections(sections: string[], maxChars: number): string {\n let out = '';\n for (const sec of sections) {\n const next = out ? `${out}\\n\\n${sec}` : sec;\n if (next.length <= maxChars) {\n out = next;\n continue;\n }\n const remain = maxChars - out.length - (out ? 2 : 0);\n if (remain > 64) {\n out = out ? `${out}\\n\\n${sec.slice(0, remain)}\\n... [truncated]` : `${sec.slice(0, remain)}\\n... [truncated]`;\n }\n break;\n }\n return out.trim();\n}\n\nasync function loadPlanSummary(\n _ws: Workspace,\n planPath: string,\n label: string,\n): Promise<{ text: string; language?: Language; intent?: PlanIntent } | null> {\n try {\n const raw = await fs.readFile(planPath, 'utf8');\n const parsed = PlanSchema.safeParse(JSON.parse(raw));\n if (!parsed.success) {\n return {\n text: `## Existing plan summary\\n- path: ${label}\\n- status: unreadable by current schema`,\n };\n }\n const plan = parsed.data;\n return {\n text: [\n '## Existing plan summary',\n `- path: ${label}`,\n `- language: ${plan.language}`,\n `- intent: ${plan.intent}`,\n `- steps: ${plan.steps.length}`,\n `- requirementDigest: ${plan.requirementDigest}`,\n `- generatedAt: ${plan.createdAt}`,\n ].join('\\n'),\n language: plan.language,\n intent: plan.intent,\n };\n } catch {\n return null;\n }\n}\n\nasync function loadManifestSummary(\n ws: Workspace,\n): Promise<{ text: string; sources: string[]; language?: Language } | null> {\n if (await ws.exists('package.json')) {\n try {\n const pkg = JSON.parse(await ws.readFile('package.json')) as Record<string, unknown>;\n const scripts =\n pkg.scripts && typeof pkg.scripts === 'object' && !Array.isArray(pkg.scripts)\n ? Object.entries(pkg.scripts as Record<string, string>)\n .slice(0, 8)\n .map(([k, v]) => ` - ${k}: ${v}`)\n : [];\n const deps = [\n ...Object.keys((pkg.dependencies as Record<string, unknown>) ?? {}),\n ...Object.keys((pkg.devDependencies as Record<string, unknown>) ?? {}).map((d) => `${d} (dev)`),\n ].slice(0, 24);\n return {\n text: [\n '## Existing manifest: package.json',\n `- name: ${String(pkg.name ?? '(unknown)')}`,\n `- type: ${String(pkg.type ?? '(unset)')}`,\n deps.length > 0 ? `- dependencies: ${deps.join(', ')}` : '- dependencies: (none)',\n scripts.length > 0 ? '- scripts:' : '- scripts: (none)',\n ...scripts,\n ].join('\\n'),\n sources: ['package.json'],\n language: 'typescript',\n };\n } catch {\n /* ignore */\n }\n }\n if (await ws.exists('requirements.txt')) {\n const text = await readTruncatedWorkspaceFile(ws, 'requirements.txt', 1200);\n if (text) {\n return {\n text: `## Existing manifest: requirements.txt\\n${text}`,\n sources: ['requirements.txt'],\n language: 'python',\n };\n }\n }\n return null;\n}\n\nasync function readTruncatedWorkspaceFile(ws: Workspace, rel: string, maxChars: number): Promise<string> {\n try {\n const raw = await ws.readFile(rel);\n return raw.length > maxChars ? `${raw.slice(0, maxChars)}\\n... [truncated]` : raw;\n } catch {\n return '';\n }\n}\n\nasync function listProjectFiles(root: string): Promise<string[]> {\n const out: string[] = [];\n for (const base of ['src', 'tests']) {\n const abs = path.join(root, base);\n await walk(abs, base, out, 0);\n }\n return out.slice(0, 120);\n}\n\nasync function walk(abs: string, rel: string, out: string[], depth: number): Promise<void> {\n if (depth > 6 || out.length >= 120) return;\n let entries: Dirent[];\n try {\n entries = await fs.readdir(abs, { withFileTypes: true });\n } catch {\n return;\n }\n entries.sort((a, b) => a.name.localeCompare(b.name));\n for (const entry of entries) {\n if (out.length >= 120) break;\n if (entry.name.startsWith('.')) continue;\n const childRel = `${rel}/${entry.name}`;\n const childAbs = path.join(abs, entry.name);\n if (entry.isDirectory()) {\n await walk(childAbs, childRel, out, depth + 1);\n } else {\n out.push(childRel);\n }\n }\n}\n\nfunction relInsideWorkspace(root: string, maybeAbs?: string): string | null {\n if (!maybeAbs) return null;\n const full = path.resolve(maybeAbs);\n const rel = path.relative(root, full).replace(/\\\\/g, '/');\n return rel.startsWith('..') ? null : rel || path.basename(full);\n}\n\nfunction dedup(values: string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction inferLanguageFromTree(tree: string[]): Language | undefined {\n let python = 0;\n let typescript = 0;\n for (const entry of tree) {\n if (entry.endsWith('.py')) python++;\n if (entry.endsWith('.ts') || entry.endsWith('.tsx')) typescript++;\n }\n if (typescript > 0 && python === 0) return 'typescript';\n if (python > 0 && typescript === 0) return 'python';\n return undefined;\n}\n\nexport function isIncrementalIntent(intent: PlanIntent): boolean {\n return intent !== 'greenfield';\n}\n","import { promises as fs } from 'node:fs';\nimport type { Dirent } from 'node:fs';\nimport path from 'node:path';\nimport type { Workspace } from '../workspace/workspace.js';\nimport { DOC_NAMES } from './docs.js';\nimport { PlanSchema, type Language, type PlanIntent, type Step } from './plan.js';\n\nexport const PROJECT_MEMORY_PATH = '.xcompiler/project_memory.json';\n\nexport interface ProjectMemoryFile {\n path: string;\n kind: 'source' | 'test' | 'doc' | 'manifest';\n excerpt: string;\n}\n\nexport interface ProjectMemoryModule {\n path: string;\n kind: 'source' | 'test';\n symbols: string[];\n relatedPaths: string[];\n summary: string;\n}\n\nexport interface ProjectMemoryContract {\n kind: 'api' | 'invariant' | 'extension-point' | 'limitation' | 'integration';\n subject: string;\n detail: string;\n path?: string;\n}\n\nexport interface ProjectMemory {\n version: '1';\n updatedAt: string;\n language?: Language;\n intent?: PlanIntent;\n planPath?: string;\n summary: string;\n keyFiles: ProjectMemoryFile[];\n modules: ProjectMemoryModule[];\n contracts: ProjectMemoryContract[];\n}\n\nexport async function refreshProjectMemory(\n ws: Workspace,\n opts: { planPath?: string; language?: Language; intent?: PlanIntent; maxChars?: number } = {},\n): Promise<ProjectMemory> {\n const memory = await buildProjectMemory(ws, opts);\n await ws.writeFile(PROJECT_MEMORY_PATH, JSON.stringify(memory, null, 2) + '\\n');\n return memory;\n}\n\nexport async function loadProjectMemory(ws: Workspace): Promise<ProjectMemory | null> {\n try {\n const raw = await ws.readFile(PROJECT_MEMORY_PATH);\n const parsed = JSON.parse(raw) as ProjectMemory;\n if (!parsed || parsed.version !== '1' || typeof parsed.summary !== 'string' || !Array.isArray(parsed.keyFiles)) {\n return null;\n }\n if (!Array.isArray(parsed.modules)) parsed.modules = [];\n if (!Array.isArray(parsed.contracts)) parsed.contracts = [];\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport async function buildProjectMemory(\n ws: Workspace,\n opts: { planPath?: string; language?: Language; intent?: PlanIntent; maxChars?: number } = {},\n): Promise<ProjectMemory> {\n const sections: string[] = [];\n const keyFiles: ProjectMemoryFile[] = [];\n const maxChars = opts.maxChars ?? 18_000;\n\n const planSummary = await readPlanMetadata(ws, opts.planPath);\n let language = opts.language ?? planSummary?.language;\n const intent = opts.intent ?? planSummary?.intent;\n\n sections.push('## Project memory');\n sections.push(`- language: ${language ?? '(unknown)'}`);\n sections.push(`- intent: ${intent ?? '(unknown)'}`);\n if (opts.planPath) sections.push(`- planPath: ${path.resolve(opts.planPath)}`);\n sections.push('');\n\n const projectDocs = [\n DOC_NAMES.topic,\n DOC_NAMES.requirementAnalysis,\n DOC_NAMES.highLevelDesign,\n DOC_NAMES.detailedDesign,\n DOC_NAMES.functionalTestPlan,\n DOC_NAMES.integrationTestPlan,\n DOC_NAMES.moduleTestPlan,\n DOC_NAMES.unitTestPlan,\n DOC_NAMES.unitTest,\n DOC_NAMES.integrationTest,\n DOC_NAMES.moduleTest,\n DOC_NAMES.functionalTest,\n DOC_NAMES.delivery,\n ...(intent === 'self'\n ? [\n 'docs/XCompiler_design.md',\n 'docs/self_bootstrap.md',\n 'docs/implementation_plan.md',\n 'docs/plugin_api.md',\n ]\n : []),\n ];\n for (const rel of projectDocs) {\n const doc = await readWorkspaceText(ws, rel, 1600);\n if (!doc) continue;\n keyFiles.push({ path: rel, kind: 'doc', excerpt: doc });\n sections.push(`## ${rel}`);\n sections.push(doc);\n sections.push('');\n }\n\n const manifest = await buildManifestMemory(ws);\n if (manifest) {\n if (!language) {\n language = manifest.path === 'package.json' ? 'typescript' : 'python';\n }\n keyFiles.push(manifest);\n sections.push(`## ${manifest.path}`);\n sections.push(manifest.excerpt);\n sections.push('');\n }\n\n const implementationFiles = await selectKeyImplementationFiles(ws.root, 10);\n const modules = await buildModuleFacts(ws.root, implementationFiles);\n const contracts = await buildContractFacts(ws, modules);\n if (modules.length > 0) {\n sections.push('## Module map');\n for (const module of modules.slice(0, 10)) {\n sections.push(`- ${module.path}: ${module.summary}`);\n }\n sections.push('');\n }\n if (contracts.length > 0) {\n sections.push('## Contracts');\n for (const contract of contracts.slice(0, 14)) {\n sections.push(`- [${contract.kind}] ${contract.subject}: ${contract.detail}`);\n }\n sections.push('');\n }\n if (implementationFiles.length > 0) {\n sections.push('## Key implementation snippets');\n sections.push('');\n }\n for (const file of implementationFiles) {\n const excerpt = await readAbsoluteText(path.join(ws.root, file), 1200);\n if (!excerpt) continue;\n keyFiles.push({\n path: file,\n kind: file.startsWith('tests/') ? 'test' : 'source',\n excerpt,\n });\n sections.push(`### ${file}`);\n sections.push('```text');\n sections.push(excerpt);\n sections.push('```');\n sections.push('');\n }\n\n return {\n version: '1',\n updatedAt: new Date().toISOString(),\n language,\n intent,\n planPath: opts.planPath ? path.resolve(opts.planPath) : undefined,\n summary: joinCappedSections(sections, maxChars),\n keyFiles: dedupFiles(keyFiles).slice(0, 18),\n modules,\n contracts,\n };\n}\n\nexport function selectMemorySnippetsForStep(\n memory: ProjectMemory | null,\n step: Step,\n maxSnippets: number = 4,\n): Array<{ path: string; content: string }> {\n if (!memory || memory.keyFiles.length === 0) return [];\n const query = `${step.title}\\n${step.description}\\n${step.acceptance}\\n${step.inputs.join('\\n')}\\n${step.outputs.join('\\n')}`;\n const tokens = tokenize(query);\n const modules = new Map(memory.modules.map((module) => [module.path, module]));\n const ranked = memory.keyFiles\n .map((file) => ({ file, score: scoreMemoryFile(file, tokens, step, modules.get(file.path)) }))\n .filter((item) => item.score > 0)\n .sort((a, b) => b.score - a.score || a.file.path.localeCompare(b.file.path))\n .slice(0, maxSnippets)\n .map((item) => ({ path: item.file.path, content: item.file.excerpt }));\n return ranked;\n}\n\nexport function selectMemoryContractsForStep(\n memory: ProjectMemory | null,\n step: Step,\n maxContracts: number = 6,\n): ProjectMemoryContract[] {\n if (!memory || memory.contracts.length === 0) return [];\n const query = `${step.title}\\n${step.description}\\n${step.acceptance}\\n${step.inputs.join('\\n')}\\n${step.outputs.join('\\n')}`;\n const tokens = tokenize(query);\n return memory.contracts\n .map((contract) => ({ contract, score: scoreContract(contract, tokens, step) }))\n .filter((item) => item.score > 0)\n .sort((a, b) => b.score - a.score || a.contract.subject.localeCompare(b.contract.subject))\n .slice(0, maxContracts)\n .map((item) => item.contract);\n}\n\nasync function readPlanMetadata(\n ws: Workspace,\n planPath?: string,\n): Promise<{ language?: Language; intent?: PlanIntent } | null> {\n const full = planPath ? path.resolve(planPath) : ws.abs('plan.json');\n try {\n const raw = await fs.readFile(full, 'utf8');\n const parsed = PlanSchema.safeParse(JSON.parse(raw));\n if (!parsed.success) return null;\n return { language: parsed.data.language, intent: parsed.data.intent };\n } catch {\n return null;\n }\n}\n\nasync function buildManifestMemory(ws: Workspace): Promise<ProjectMemoryFile | null> {\n if (await ws.exists('package.json')) {\n const text = await readWorkspaceText(ws, 'package.json', 1600);\n if (text) return { path: 'package.json', kind: 'manifest', excerpt: text };\n }\n if (await ws.exists('requirements.txt')) {\n const text = await readWorkspaceText(ws, 'requirements.txt', 1200);\n if (text) return { path: 'requirements.txt', kind: 'manifest', excerpt: text };\n }\n return null;\n}\n\nasync function readWorkspaceText(ws: Workspace, rel: string, maxChars: number): Promise<string> {\n try {\n const raw = await ws.readFile(rel);\n const text = rel === DOC_NAMES.topic ? stripGeneratedBaselineSection(raw) : raw;\n return truncate(text, maxChars);\n } catch {\n return '';\n }\n}\n\nasync function readAbsoluteText(fullPath: string, maxChars: number): Promise<string> {\n try {\n const raw = await fs.readFile(fullPath, 'utf8');\n return truncate(raw, maxChars);\n } catch {\n return '';\n }\n}\n\nasync function selectKeyImplementationFiles(root: string, maxFiles: number): Promise<string[]> {\n const all = await listProjectFiles(root);\n const ranked = all\n .filter((file) => /\\.(py|ts|tsx)$/u.test(file))\n .map((file) => ({ file, score: scoreProjectFile(file) }))\n .sort((a, b) => b.score - a.score || a.file.localeCompare(b.file))\n .slice(0, maxFiles)\n .map((item) => item.file);\n return ranked;\n}\n\nasync function listProjectFiles(root: string): Promise<string[]> {\n const out: string[] = [];\n for (const base of ['src', 'tests']) {\n await walk(path.join(root, base), base, out, 0);\n }\n return out;\n}\n\nasync function walk(abs: string, rel: string, out: string[], depth: number): Promise<void> {\n if (depth > 6 || out.length >= 160) return;\n let entries: Dirent[];\n try {\n entries = await fs.readdir(abs, { withFileTypes: true });\n } catch {\n return;\n }\n entries.sort((a, b) => a.name.localeCompare(b.name));\n for (const entry of entries) {\n if (out.length >= 160) break;\n if (entry.name.startsWith('.')) continue;\n const childRel = `${rel}/${entry.name}`;\n const childAbs = path.join(abs, entry.name);\n if (entry.isDirectory()) {\n await walk(childAbs, childRel, out, depth + 1);\n } else {\n out.push(childRel);\n }\n }\n}\n\nfunction scoreProjectFile(file: string): number {\n const depth = file.split('/').length;\n let score = file.startsWith('src/') ? 80 : 50;\n score += Math.max(0, 20 - depth * 3);\n if (/main|index|app|server|api|cli|router|controller|service|model|parser|schema|types|core|engine/i.test(file)) score += 25;\n if (/test|spec/i.test(file)) score += 10;\n return score;\n}\n\nfunction scoreMemoryFile(\n file: ProjectMemoryFile,\n tokens: Set<string>,\n step: Step,\n module?: ProjectMemoryModule,\n): number {\n const haystack = [\n file.path,\n file.excerpt,\n module?.summary ?? '',\n ...(module?.symbols ?? []),\n ...(module?.relatedPaths ?? []),\n ].join('\\n').toLowerCase();\n let score = 0;\n for (const token of tokens) {\n if (haystack.includes(token)) score += 4;\n }\n if (file.kind === 'manifest') score += step.phase === 'HIGH_LEVEL_DESIGN' ? 20 : 4;\n if (file.kind === 'doc') score += ['REQUIREMENT_ANALYSIS', 'HIGH_LEVEL_DESIGN', 'DETAILED_DESIGN', 'FUNCTIONAL_TEST'].includes(step.phase) ? 16 : 6;\n if (file.kind === 'source') score += ['CODE', 'DEBUG', 'UNIT_TEST', 'INTEGRATION_TEST', 'MODULE_TEST', 'FUNCTIONAL_TEST'].includes(step.phase) ? 14 : 2;\n if (file.kind === 'test') score += ['UNIT_TEST', 'INTEGRATION_TEST', 'MODULE_TEST', 'FUNCTIONAL_TEST', 'DEBUG'].includes(step.phase) ? 14 : 2;\n if (step.inputs.includes(file.path)) score += 24;\n if (step.outputs.includes(file.path)) score += 20;\n if (module) {\n score += Math.min(18, module.symbols.length * 3);\n if (module.relatedPaths.some((rel) => step.inputs.includes(rel) || step.outputs.includes(rel))) score += 16;\n }\n return score;\n}\n\nfunction scoreContract(\n contract: ProjectMemoryContract,\n tokens: Set<string>,\n step: Step,\n): number {\n const haystack = `${contract.subject}\\n${contract.detail}\\n${contract.path ?? ''}`.toLowerCase();\n let score = 0;\n for (const token of tokens) {\n if (haystack.includes(token)) score += 4;\n }\n if (contract.kind === 'api') score += ['CODE', 'UNIT_TEST', 'INTEGRATION_TEST', 'MODULE_TEST', 'FUNCTIONAL_TEST', 'DEBUG'].includes(step.phase) ? 12 : 4;\n if (contract.kind === 'invariant') score += ['DEBUG', 'UNIT_TEST', 'INTEGRATION_TEST', 'MODULE_TEST', 'FUNCTIONAL_TEST'].includes(step.phase) ? 12 : 6;\n if (contract.kind === 'extension-point') score += ['HIGH_LEVEL_DESIGN', 'DETAILED_DESIGN', 'CODE'].includes(step.phase) ? 10 : 4;\n if (contract.kind === 'limitation') score += ['FUNCTIONAL_TEST', 'DEBUG'].includes(step.phase) ? 10 : 3;\n if (contract.kind === 'integration') score += ['HIGH_LEVEL_DESIGN', 'CODE', 'INTEGRATION_TEST', 'FUNCTIONAL_TEST'].includes(step.phase) ? 10 : 4;\n if (contract.path && (step.inputs.includes(contract.path) || step.outputs.includes(contract.path))) score += 16;\n return score;\n}\n\nfunction tokenize(text: string): Set<string> {\n return new Set(\n text\n .toLowerCase()\n .split(/[^a-z0-9_]+/u)\n .map((token) => token.trim())\n .filter((token) => token.length >= 3),\n );\n}\n\nfunction truncate(text: string, maxChars: number): string {\n const normalized = text.trim();\n return normalized.length > maxChars ? `${normalized.slice(0, maxChars)}\\n... [truncated]` : normalized;\n}\n\nfunction stripGeneratedBaselineSection(text: string): string {\n const idx = text.search(/^##\\s+(Existing project baseline|现有工程基线)\\s*$/m);\n if (idx < 0) return text;\n return text.slice(0, idx).trimEnd();\n}\n\nfunction joinCappedSections(sections: string[], maxChars: number): string {\n let out = '';\n for (const sec of sections.filter(Boolean)) {\n const next = out ? `${out}\\n\\n${sec}` : sec;\n if (next.length <= maxChars) {\n out = next;\n continue;\n }\n const remain = maxChars - out.length - (out ? 2 : 0);\n if (remain > 64) {\n out = out ? `${out}\\n\\n${sec.slice(0, remain)}\\n... [truncated]` : `${sec.slice(0, remain)}\\n... [truncated]`;\n }\n break;\n }\n return out.trim();\n}\n\nfunction dedupFiles(files: ProjectMemoryFile[]): ProjectMemoryFile[] {\n const seen = new Set<string>();\n const out: ProjectMemoryFile[] = [];\n for (const file of files) {\n if (seen.has(file.path)) continue;\n seen.add(file.path);\n out.push(file);\n }\n return out;\n}\n\nasync function buildModuleFacts(root: string, files: string[]): Promise<ProjectMemoryModule[]> {\n const modules: ProjectMemoryModule[] = [];\n for (const file of files) {\n const text = await readAbsoluteText(path.join(root, file), 4000);\n if (!text) continue;\n const symbols = extractSymbols(text, file);\n const relatedPaths = inferRelatedPaths(file, files, text);\n modules.push({\n path: file,\n kind: file.startsWith('tests/') ? 'test' : 'source',\n symbols,\n relatedPaths,\n summary: summarizeModule(file, symbols, relatedPaths),\n });\n }\n return modules;\n}\n\nasync function buildContractFacts(\n ws: Workspace,\n modules: ProjectMemoryModule[],\n): Promise<ProjectMemoryContract[]> {\n const contracts: ProjectMemoryContract[] = [];\n for (const module of modules) {\n if (module.kind === 'source' && module.symbols.length > 0) {\n contracts.push({\n kind: 'api',\n subject: module.path,\n path: module.path,\n detail: `Exports / public surface: ${module.symbols.slice(0, 8).join(', ')}`,\n });\n }\n if (module.relatedPaths.length > 0) {\n contracts.push({\n kind: 'integration',\n subject: module.path,\n path: module.path,\n detail: `Coordinates with: ${module.relatedPaths.slice(0, 5).join(', ')}`,\n });\n }\n }\n for (const rel of [\n DOC_NAMES.highLevelDesign,\n DOC_NAMES.detailedDesign,\n DOC_NAMES.integrationTestPlan,\n DOC_NAMES.moduleTestPlan,\n DOC_NAMES.functionalTest,\n ]) {\n const text = await readWorkspaceText(ws, rel, 2200);\n if (!text) continue;\n contracts.push(...extractContractsFromDoc(rel, text));\n }\n return dedupContracts(contracts).slice(0, 32);\n}\n\nfunction summarizeModule(file: string, symbols: string[], relatedPaths: string[]): string {\n const parts: string[] = [];\n parts.push(file.startsWith('tests/') ? 'test module' : 'source module');\n parts.push(symbols.length > 0 ? `symbols: ${symbols.slice(0, 6).join(', ')}` : 'symbols: (none detected)');\n if (relatedPaths.length > 0) parts.push(`related: ${relatedPaths.slice(0, 4).join(', ')}`);\n return parts.join('; ');\n}\n\nfunction extractSymbols(text: string, file: string): string[] {\n const symbols = new Set<string>();\n const patterns = file.endsWith('.py')\n ? [\n /^\\s*(?:async\\s+)?def\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*\\(/gmu,\n /^\\s*class\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*(?:\\(|:)/gmu,\n ]\n : [\n /^\\s*export\\s+(?:default\\s+)?(?:async\\s+)?function\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*\\(/gmu,\n /^\\s*export\\s+(?:abstract\\s+)?class\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*/gmu,\n /^\\s*export\\s+(?:const|let|var|type|interface|enum)\\s+([A-Za-z_][A-Za-z0-9_]*)\\b/gmu,\n ];\n for (const pattern of patterns) {\n for (const match of text.matchAll(pattern)) {\n if (match[1]) symbols.add(match[1]);\n }\n }\n return [...symbols].slice(0, 12);\n}\n\nfunction inferRelatedPaths(file: string, files: string[], text: string): string[] {\n const related = new Set<string>();\n const stem = canonicalStem(file);\n for (const candidate of files) {\n if (candidate === file) continue;\n if (canonicalStem(candidate) === stem) related.add(candidate);\n }\n for (const imported of extractImportedStems(text)) {\n for (const candidate of files) {\n if (candidate === file) continue;\n if (canonicalStem(candidate).endsWith(imported) || canonicalStem(candidate) === imported) {\n related.add(candidate);\n }\n }\n }\n return [...related].slice(0, 6);\n}\n\nfunction canonicalStem(file: string): string {\n return file\n .replace(/^src\\//u, '')\n .replace(/^tests\\//u, '')\n .replace(/\\.(test|spec)\\./u, '.')\n .replace(/\\.(py|ts|tsx)$/u, '');\n}\n\nfunction extractImportedStems(text: string): string[] {\n const stems = new Set<string>();\n const tsPatterns = [\n /from\\s+['\"](\\.[^'\"]+)['\"]/gmu,\n /import\\s+['\"](\\.[^'\"]+)['\"]/gmu,\n ];\n for (const pattern of tsPatterns) {\n for (const match of text.matchAll(pattern)) {\n const stem = normalizeImportStem(match[1] ?? '');\n if (stem) stems.add(stem);\n }\n }\n for (const match of text.matchAll(/^\\s*from\\s+([A-Za-z0-9_.]+)\\s+import\\s+/gmu)) {\n const stem = (match[1] ?? '').replace(/^src\\./u, '').replace(/\\./g, '/');\n if (stem) stems.add(stem);\n }\n return [...stems];\n}\n\nfunction normalizeImportStem(value: string): string {\n return value\n .replace(/^\\.\\//u, '')\n .replace(/^\\.\\.\\//u, '')\n .replace(/\\.(js|ts|tsx|py)$/u, '')\n .replace(/\\/index$/u, '')\n .trim();\n}\n\nfunction extractContractsFromDoc(path: string, text: string): ProjectMemoryContract[] {\n const contracts: ProjectMemoryContract[] = [];\n for (const rawLine of text.split('\\n')) {\n const line = rawLine.replace(/^[-*#\\d.\\s]+/u, '').trim();\n if (line.length < 18) continue;\n const lower = line.toLowerCase();\n if (INVARIANT_RE.test(lower)) {\n contracts.push({ kind: 'invariant', subject: path, path, detail: trimContractLine(line) });\n } else if (LIMITATION_RE.test(lower)) {\n contracts.push({ kind: 'limitation', subject: path, path, detail: trimContractLine(line) });\n } else if (EXTENSION_RE.test(lower)) {\n contracts.push({ kind: 'extension-point', subject: path, path, detail: trimContractLine(line) });\n } else if (INTEGRATION_RE.test(lower)) {\n contracts.push({ kind: 'integration', subject: path, path, detail: trimContractLine(line) });\n }\n }\n return contracts;\n}\n\nfunction trimContractLine(line: string): string {\n return line.length > 220 ? `${line.slice(0, 220)}...` : line;\n}\n\nconst INVARIANT_RE = /\\b(must|must not|preserve|should|required|forbid|forbidden|禁止|必须|不得|保持|兼容|不可)\\b/u;\nconst LIMITATION_RE = /\\b(limit|limitation|known issue|known limitation|todo|unsupported|not support|暂不|未支持|限制|已知)\\b/u;\nconst EXTENSION_RE = /\\b(extension|extend|hook|plugin|future|later|follow-up|扩展|插件|后续|预留)\\b/u;\nconst INTEGRATION_RE = /\\b(api|http|cli|database|storage|queue|webhook|github|slack|router|service|集成|接口|命令|数据库)\\b/u;\n\nfunction dedupContracts(contracts: ProjectMemoryContract[]): ProjectMemoryContract[] {\n const seen = new Set<string>();\n const out: ProjectMemoryContract[] = [];\n for (const contract of contracts) {\n const key = `${contract.kind}::${contract.subject}::${contract.detail}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(contract);\n }\n return out;\n}\n","import type { Plan } from './plan.js';\nimport { getLanguageProfile } from './language.js';\nimport { t } from '../i18n/index.js';\n\nexport function renderPlanMarkdown(plan: Plan): string {\n const lines: string[] = [];\n lines.push(`# Plan (language: ${plan.language})`);\n lines.push('');\n lines.push(`- Intent: ${plan.intent}`);\n lines.push(`- Project type: ${plan.projectType ?? 'application'}`);\n lines.push(`- Created: ${plan.createdAt}`);\n lines.push(`- Steps: ${plan.steps.length}`);\n lines.push('');\n lines.push('## Requirement digest');\n lines.push('');\n lines.push(plan.requirementDigest);\n lines.push('');\n if (plan.globalPrompt && plan.globalPrompt.trim()) {\n lines.push(t().render.sectionGlobalPrompt);\n lines.push('');\n lines.push('```text');\n lines.push(plan.globalPrompt.trim());\n lines.push('```');\n lines.push('');\n }\n if (plan.complexityAssessment) {\n lines.push('## Complexity assessment');\n lines.push('');\n lines.push(`- Level: ${plan.complexityAssessment.level}`);\n lines.push(`- Split recommended: ${plan.complexityAssessment.splitRecommended ? 'yes' : 'no'}`);\n lines.push(`- User forced phase split: ${plan.complexityAssessment.userForcedPhaseSplit ? 'yes' : 'no'}`);\n lines.push(`- Rationale: ${plan.complexityAssessment.rationale}`);\n lines.push('');\n }\n if ((plan.implementationPhases?.length ?? 0) > 0) {\n lines.push('## Implementation phases');\n lines.push('');\n lines.push('| Phase | Status | Objective | Verification gate | Scope | Deliverables | Depends on |');\n lines.push('| --- | --- | --- | --- | --- | --- | --- |');\n for (const phase of plan.implementationPhases ?? []) {\n lines.push(\n `| ${phase.id} ${escapePipe(phase.title)} | ${phase.status} | ${escapePipe(phase.objective)} | ` +\n `${escapePipe(phase.verificationGate?.summary ?? '—')} | ` +\n `${phase.scope.join(', ') || '—'} | ${phase.deliverables.join(', ') || '—'} | ${phase.dependsOn.join(', ') || '—'} |`,\n );\n }\n lines.push('');\n }\n if (plan.dependencies && plan.dependencies.length > 0) {\n lines.push(t().render.sectionDependencies(getLanguageProfile(plan.language).manifestFile));\n lines.push('');\n for (const r of plan.dependencies) lines.push(`- ${r}`);\n lines.push('');\n }\n if (plan.baselineSummary && plan.baselineSummary.trim()) {\n lines.push(t().render.sectionBaselineSummary);\n lines.push('');\n lines.push('```text');\n lines.push(plan.baselineSummary.trim());\n lines.push('```');\n lines.push('');\n }\n if ((plan.architectureModules?.length ?? 0) > 0) {\n lines.push('## Architecture contract');\n lines.push('');\n lines.push('| Module | Responsibility | Source paths | Test paths | Depends on |');\n lines.push('| --- | --- | --- | --- | --- |');\n for (const module of plan.architectureModules ?? []) {\n lines.push(\n `| ${module.id} ${escapePipe(module.name)} | ${escapePipe(module.responsibility)} | ` +\n `${module.sourcePaths.join(', ')} | ${module.testPaths.join(', ')} | ${module.dependencies.join(', ') || '—'} |`,\n );\n }\n lines.push('');\n }\n lines.push('## V-model macro workflow');\n lines.push('');\n for (const item of renderMacroWorkflow(plan)) lines.push(item);\n lines.push('');\n lines.push('## Steps');\n lines.push('');\n lines.push('| ID | Iteration | Phase | Role | Title | Outputs | Depends |');\n lines.push('| --- | --- | --- | --- | --- | --- | --- |');\n for (const s of plan.steps) {\n lines.push(\n `| ${s.id} | ${s.iterationId ?? 'P1'} | ${s.phase} | ${s.role} | ${escapePipe(s.title)} | ${s.outputs.join(', ')} | ${\n s.dependsOn.join(', ') || '—'\n } |`,\n );\n }\n lines.push('');\n lines.push('## Detail');\n lines.push('');\n for (const s of plan.steps) {\n lines.push(`### ${s.id} — ${s.title} (${s.iterationId ?? 'P1'} / ${s.phase} / ${s.role})`);\n lines.push('');\n lines.push(s.description);\n lines.push('');\n lines.push(`- Inputs: ${s.inputs.join(', ') || '—'}`);\n lines.push(`- Outputs: ${s.outputs.join(', ')}`);\n lines.push(`- Tools: ${s.tools.join(', ') || '—'}`);\n lines.push(`- Acceptance: ${s.acceptance}`);\n if ((s.subTasks?.length ?? 0) > 0) {\n lines.push('- Subtasks:');\n for (const item of renderSubTasks(s.subTasks ?? [], 1)) lines.push(item);\n }\n lines.push('');\n lines.push(t().render.labelSystemPrompt);\n lines.push('');\n lines.push('```text');\n lines.push(s.systemPrompt.trim());\n lines.push('```');\n lines.push('');\n }\n return lines.join('\\n');\n}\n\nfunction escapePipe(s: string): string {\n return s.replace(/\\|/g, '\\\\|');\n}\n\nfunction renderMacroWorkflow(plan: Plan): string[] {\n const lines: string[] = [];\n for (const step of plan.steps) {\n lines.push(`- ${step.id} ${step.iterationId ?? 'P1'} ${step.phase}: ${step.title} (${step.role})`);\n if (step.subTasks && step.subTasks.length > 0) {\n lines.push(...renderSubTasks(step.subTasks, 1));\n }\n }\n return lines;\n}\n\nfunction renderSubTasks(tasks: NonNullable<Plan['steps'][number]['subTasks']>, depth: number): string[] {\n const lines: string[] = [];\n const indent = ' '.repeat(depth);\n for (const task of tasks) {\n const outputs = task.outputs && task.outputs.length > 0 ? ` [${task.outputs.join(', ')}]` : '';\n lines.push(`${indent}- ${task.id}: ${task.title}${outputs}`);\n lines.push(`${indent} ${task.description}`);\n if (task.acceptance) lines.push(`${indent} Acceptance: ${task.acceptance}`);\n if (task.subTasks && task.subTasks.length > 0) {\n lines.push(...renderSubTasks(task.subTasks, depth + 1));\n }\n }\n return lines;\n}\n","import { promises as fs, appendFileSync, mkdirSync, existsSync, writeFileSync } from 'node:fs';\nimport { createHash } from 'node:crypto';\nimport path from 'node:path';\nimport { t } from '../i18n/index.js';\nimport { xcEnv } from '../config/env.js';\n\n/**\n * AuditLogger 把开发流水线中的所有交互/执行动作记录到两份产物:\n *\n * - `docs/process_log.md` —— 人类可读的过程记录,用于交付时汇总。\n * - `.xcompiler/audit.jsonl` —— 机器可读的逐行 JSON,便于后续分析与回放。\n *\n * 设计原则:\n * - 追加写入,永不删除。\n * - 失败时不影响主流程(写盘异常仅打印 warning)。\n * - 每条事件都带 ts / kind / payload。\n */\nexport type AuditKind =\n | 'session.start'\n | 'session.end'\n | 'user.input'\n | 'user.decision'\n | 'llm.request'\n | 'llm.response'\n | 'llm.error'\n | 'llm.score'\n | 'fs.write'\n | 'plan.persist'\n | 'topic.persist'\n | 'phase.start'\n | 'phase.end'\n | 'tool.call'\n | 'tool.result'\n | 'sandbox.exec'\n | 'executor.turn'\n | 'planner.thought'\n | 'conftest.autogen'\n | 'issue.record'\n | 'issue.route'\n | 'issue.resolve'\n | 'note';\n\nexport interface AuditEvent {\n ts: string;\n kind: AuditKind;\n message: string;\n messageId?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface AuditLoggerOptions {\n /** workspace 根目录(绝对路径) */\n root: string;\n /** 命令名,例如 `xcompiler_build` / `xcompiler_run` */\n command: string;\n /** markdown 文件相对路径,默认 docs/process_log.md */\n mdRelPath?: string;\n /** jsonl 文件相对路径,默认 .xcompiler/audit.jsonl */\n jsonlRelPath?: string;\n /** full=完整内容;redacted=保留内容但遮蔽凭据(默认);metadata=仅保留长度与摘要。 */\n contentMode?: AuditContentMode;\n}\n\nexport type AuditContentMode = 'full' | 'redacted' | 'metadata';\n\nexport class AuditLogger {\n private readonly mdAbs: string;\n private readonly jsonlAbs: string;\n private readonly command: string;\n private readonly contentMode: AuditContentMode;\n private startTs = '';\n /** 串行化 markdown 追加,防止并发 appendFile 交错。 */\n private mdQueue: Promise<void> = Promise.resolve();\n\n constructor(opts: AuditLoggerOptions) {\n this.command = opts.command;\n this.contentMode = resolveContentMode(\n opts.contentMode ?? xcEnv('AUDIT_CONTENT_MODE'),\n );\n this.mdAbs = path.resolve(opts.root, opts.mdRelPath ?? 'docs/process_log.md');\n this.jsonlAbs = path.resolve(opts.root, opts.jsonlRelPath ?? '.xcompiler/audit.jsonl');\n }\n\n async start(meta: Record<string, unknown> = {}): Promise<void> {\n this.startTs = new Date().toISOString();\n await this.ensureFiles();\n await this.appendMd(\n [\n '',\n t().audit.sessionStart(this.startTs, this.command),\n '',\n '```yaml',\n ...Object.entries(meta).map(([k, v]) => `${k}: ${stringify(v)}`),\n '```',\n '',\n ].join('\\n'),\n );\n await this.event('session.start', t().audit.eventSessionStart(this.command), {\n messageId: 'audit.session_start',\n ...meta,\n });\n }\n\n async end(summary: Record<string, unknown> = {}): Promise<void> {\n await this.event('session.end', t().audit.eventSessionEnd(this.command), {\n messageId: 'audit.session_end',\n ...summary,\n });\n await this.appendMd(\n [\n '',\n t().audit.sessionEnd(new Date().toISOString()),\n '',\n '```yaml',\n ...Object.entries(summary).map(([k, v]) => `${k}: ${stringify(v)}`),\n '```',\n '',\n '---',\n '',\n ].join('\\n'),\n );\n }\n\n /** 通用事件,jsonl + 简短 markdown 一行。 */\n async event(kind: AuditKind, message: string, data?: Record<string, unknown>): Promise<void> {\n await this.ensureFiles();\n const ev: AuditEvent = { ts: new Date().toISOString(), kind, message };\n if (data) {\n const { messageId, ...payload } = data;\n if (typeof messageId === 'string') ev.messageId = messageId;\n if (Object.keys(payload).length > 0) ev.data = payload;\n }\n await this.appendJsonl(ev);\n await this.appendMd(`- \\`${ev.ts}\\` **${kind}** — ${escapeMd(message)}\\n`);\n }\n\n /** 用户输入 / 决策。会把内容以引用块写入 markdown。 */\n async userInput(label: string, content: string): Promise<void> {\n const storedContent = protectAuditContent(content, this.contentMode);\n await this.appendJsonl({\n ts: new Date().toISOString(),\n kind: 'user.input',\n message: label,\n messageId: 'audit.user_input',\n data: { content: storedContent, contentMode: this.contentMode },\n });\n await this.appendMd(\n [\n '',\n t().audit.userInput(escapeMd(label)),\n '',\n '```text',\n renderAuditContent(storedContent),\n '```',\n '',\n ].join('\\n'),\n );\n }\n\n async userDecision(label: string, value: string): Promise<void> {\n await this.event('user.decision', t().audit.userDecision(label, value), {\n messageId: 'audit.user_decision', label, value,\n });\n }\n\n /** LLM 请求/响应:完整 prompt 与回包写入 markdown 折叠块。 */\n async llmRequest(role: string, model: string, messages: unknown, options?: unknown): Promise<void> {\n const storedMessages = protectAuditContent(messages, this.contentMode);\n const storedOptions = protectAuditContent(options, this.contentMode);\n await this.appendJsonl({\n ts: new Date().toISOString(),\n kind: 'llm.request',\n message: t().audit.eventLlmRequest(role, model),\n messageId: 'audit.llm_request',\n data: { role, model, messages: storedMessages, options: storedOptions, contentMode: this.contentMode },\n });\n await this.appendMd(\n [\n '',\n `<details><summary>${t().audit.llmRequest(escapeMd(role), escapeMd(model))}</summary>`,\n '',\n '```json',\n safeStringify({ messages: storedMessages, options: storedOptions }),\n '```',\n '',\n '</details>',\n '',\n ].join('\\n'),\n );\n }\n\n async llmResponse(role: string, model: string, content: string, meta?: Record<string, unknown>): Promise<void> {\n const storedContent = protectAuditContent(content, this.contentMode);\n await this.appendJsonl({\n ts: new Date().toISOString(),\n kind: 'llm.response',\n message: t().audit.eventLlmResponse(role, model),\n messageId: 'audit.llm_response',\n data: { role, model, content: storedContent, contentMode: this.contentMode, ...redactValue(meta) as Record<string, unknown> },\n });\n await this.appendMd(\n [\n '',\n `<details><summary>${t().audit.llmResponse(escapeMd(role), escapeMd(model))}</summary>`,\n '',\n '```text',\n renderAuditContent(storedContent),\n '```',\n '',\n '</details>',\n '',\n ].join('\\n'),\n );\n }\n\n async llmError(role: string, model: string, err: unknown): Promise<void> {\n const msg = err instanceof Error ? err.message : String(err);\n await this.event('llm.error', t().audit.eventLlmError(role, model, msg), {\n messageId: 'audit.llm_error', role, model,\n });\n }\n\n /**\n * 记录一轮 Executor 思考:thoughts 文本、计划调用的 actions、是否完成。\n * 写入 jsonl + markdown 折叠块,交付时可作为\"AI 思考过程完整记录\"。\n */\n async executorTurn(\n stepId: string,\n role: string,\n round: number,\n payload: { thoughts?: string; actions?: unknown[]; done?: boolean; raw?: string; provider?: string },\n ): Promise<void> {\n const storedPayload = protectAuditContent(payload, this.contentMode) as Record<string, unknown>;\n await this.appendJsonl({\n ts: new Date().toISOString(),\n kind: 'executor.turn',\n message: t().audit.eventExecutorTurn(stepId, round, role, payload.provider ?? ''),\n messageId: 'audit.executor_turn',\n data: { ...storedPayload, contentMode: this.contentMode },\n });\n const summary = (payload.thoughts ?? '').trim().slice(0, 200) || t().audit.noThoughts;\n const actCount = Array.isArray(payload.actions) ? payload.actions.length : 0;\n await this.appendMd(\n [\n '',\n `<details><summary>${t().audit.executorTurn(escapeMd(stepId), round, escapeMd(role), escapeMd(payload.provider ?? ''), actCount, payload.done === true)}</summary>`,\n '',\n t().audit.thoughtsLabel,\n '',\n '> ' + escapeMd(summary).replace(/\\n/g, '\\n> '),\n '',\n ...(actCount > 0\n ? [t().audit.actionsLabel, '', '```json', safeStringify(protectAuditContent(payload.actions, this.contentMode)), '```', '']\n : []),\n '</details>',\n '',\n ].join('\\n'),\n );\n }\n\n /** 记录 Planner 的思考阶段,比如 clarify / decompose 原始输出。 */\n async plannerThought(\n stage: string,\n content: string,\n meta?: Record<string, unknown> & { provider?: string },\n ): Promise<void> {\n const provider = meta?.provider;\n const storedContent = protectAuditContent(content, this.contentMode);\n await this.appendJsonl({\n ts: new Date().toISOString(),\n kind: 'planner.thought',\n message: t().audit.eventPlannerThought(stage, provider ?? ''),\n messageId: 'audit.planner_thought',\n data: { stage, content: storedContent, contentMode: this.contentMode, ...redactValue(meta) as Record<string, unknown> },\n });\n await this.appendMd(\n [\n '',\n `<details><summary>${t().audit.plannerThought(escapeMd(stage), escapeMd(provider ?? ''))}</summary>`,\n '',\n '```text',\n renderAuditContent(storedContent),\n '```',\n '',\n '</details>',\n '',\n ].join('\\n'),\n );\n }\n\n // ---------- 内部 ----------\n private async ensureFiles(): Promise<void> {\n // 同步建目录 + 初始化 md 头:保证 appendFileSync 可用,且不与并发 ensureFiles 竞争。\n const mdDir = path.dirname(this.mdAbs);\n const jlDir = path.dirname(this.jsonlAbs);\n if (!existsSync(mdDir)) mkdirSync(mdDir, { recursive: true });\n if (!existsSync(jlDir)) mkdirSync(jlDir, { recursive: true });\n if (!existsSync(this.mdAbs)) {\n writeFileSync(\n this.mdAbs,\n `${t().audit.processLogTitle}\\n\\n${t().audit.processLogPreamble}\\n`,\n 'utf8',\n );\n }\n }\n\n private async appendMd(text: string): Promise<void> {\n // 通过 promise 队列串行化,避免并发 appendFile 交错;失败仅 warn。\n this.mdQueue = this.mdQueue.then(\n () => fs.appendFile(this.mdAbs, text, 'utf8'),\n () => fs.appendFile(this.mdAbs, text, 'utf8'),\n ).catch((err) => {\n console.warn(t().audit.markdownAppendFailed((err as Error).message));\n });\n return this.mdQueue;\n }\n\n private async appendJsonl(ev: AuditEvent): Promise<void> {\n // 同步追加:jsonl 是关键审计流,必须保证进程异常/退出时也已落盘。\n // 即使在事件循环被长 LLM 调用占用、或 await 链被 unhandled rejection 截断时,\n // 同步 IO 也能保证字节落到磁盘,杜绝 \"S007 整段事件丢失\" 类问题。\n try {\n appendFileSync(this.jsonlAbs, JSON.stringify(ev) + '\\n', 'utf8');\n } catch (err) {\n console.warn(t().audit.jsonlAppendFailed((err as Error).message));\n }\n // 可选 stderr 镜像(XC_AUDIT_TRACE=1):如果文件被外部覆盖丢失,\n // 还能从终端输出交叉验证实际发生了哪些事件。\n if (xcEnv('AUDIT_TRACE') === '1') {\n try {\n process.stderr.write(t().audit.traceLine(ev.kind, ev.message) + '\\n');\n } catch {\n /* ignore */\n }\n }\n }\n}\n\nfunction escapeMd(s: string): string {\n return s.replace(/\\|/g, '\\\\|').replace(/\\n/g, ' ');\n}\n\nfunction stringify(v: unknown): string {\n if (typeof v === 'string') return v;\n return JSON.stringify(v);\n}\n\nfunction safeStringify(v: unknown): string {\n try {\n return JSON.stringify(v, null, 2);\n } catch {\n return String(v);\n }\n}\n\nfunction resolveContentMode(value: string | undefined): AuditContentMode {\n return value === 'full' || value === 'metadata' || value === 'redacted' ? value : 'redacted';\n}\n\nfunction protectAuditContent(value: unknown, mode: AuditContentMode): unknown {\n if (mode === 'full') return value;\n if (mode === 'redacted') return redactValue(value);\n const serialized = safeStringify(value);\n return {\n omitted: true,\n bytes: Buffer.byteLength(serialized, 'utf8'),\n sha256: createHash('sha256').update(serialized).digest('hex'),\n };\n}\n\nfunction renderAuditContent(value: unknown): string {\n return typeof value === 'string' ? value : safeStringify(value);\n}\n\nfunction redactValue(value: unknown, seen = new WeakSet<object>()): unknown {\n if (typeof value === 'string') return redactText(value);\n if (!value || typeof value !== 'object') return value;\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n if (Array.isArray(value)) return value.map((item) => redactValue(item, seen));\n const output: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n output[key] = isSensitiveKey(key)\n ? '[REDACTED]'\n : redactValue(item, seen);\n }\n return output;\n}\n\nconst SENSITIVE_KEYS = new Set([\n 'apikey', 'authorization', 'password', 'passwd', 'secret',\n 'accesstoken', 'refreshtoken', 'authtoken', 'cookie',\n]);\n\nfunction isSensitiveKey(key: string): boolean {\n const normalized = key.replace(/[-_]/gu, '').toLowerCase();\n return SENSITIVE_KEYS.has(normalized);\n}\n\nfunction redactText(value: string): string {\n return value\n .replace(/\\bBearer\\s+[A-Za-z0-9._~+/-]+=*/giu, 'Bearer [REDACTED]')\n .replace(/\\bsk-[A-Za-z0-9_-]{8,}\\b/gu, 'sk-[REDACTED]')\n .replace(/((?:api[-_]?key|password|passwd|secret|token)\\s*[:=]\\s*)[^\\s,;]+/giu, '$1[REDACTED]');\n}\n","import { promises as fs, unlinkSync } from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\n/**\n * 工程级文件锁,防止多个 XCompiler 进程并发改同一个 workspace。\n * 锁文件:<workspace>/.xcompiler/.lock,内容为 JSON:{pid, host, command, startedAt}。\n *\n * 语义:\n * - 优先 O_EXCL 创建,成功即获锁;\n * - 若已存在但记录的 PID 在本机不存活(`process.kill(pid, 0)` 抛 ESRCH),视为陈旧锁,强制接管;\n * - 跨主机的锁一律拒绝(无法证伪)。\n */\n\nexport interface LockInfo {\n pid: number;\n host: string;\n command: string;\n startedAt: string;\n}\n\nexport class LockError extends Error {\n constructor(message: string, public readonly info?: LockInfo) {\n super(message);\n this.name = 'LockError';\n }\n}\n\nconst LOCK_REL = '.xcompiler/.lock';\n\nfunction lockPath(workspace: string): string {\n return path.join(workspace, LOCK_REL);\n}\n\nfunction isAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ESRCH') return false;\n // EPERM 表示进程存在但无权限发信号 → 视为存活\n return true;\n }\n}\n\nasync function readLock(file: string): Promise<LockInfo | null> {\n try {\n const raw = await fs.readFile(file, 'utf8');\n return JSON.parse(raw) as LockInfo;\n } catch {\n return null;\n }\n}\n\nexport interface AcquiredLock {\n release(): Promise<void>;\n}\n\nexport async function acquireLock(\n workspace: string,\n command: string,\n options: { force?: boolean } = {},\n): Promise<AcquiredLock> {\n const file = lockPath(workspace);\n await fs.mkdir(path.dirname(file), { recursive: true });\n const info: LockInfo = {\n pid: process.pid,\n host: os.hostname(),\n command,\n startedAt: new Date().toISOString(),\n };\n const payload = JSON.stringify(info, null, 2);\n\n const tryCreate = async (): Promise<boolean> => {\n try {\n const fh = await fs.open(file, 'wx');\n await fh.writeFile(payload, 'utf8');\n await fh.close();\n return true;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'EEXIST') return false;\n throw err;\n }\n };\n\n if (await tryCreate()) {\n return makeReleaser(file);\n }\n\n if (options.force) {\n // 强制接管:覆写现有锁文件。仅在用户明确传入 --force 时生效。\n await fs.writeFile(file, payload, 'utf8');\n return makeReleaser(file);\n }\n\n const existing = await readLock(file);\n if (existing) {\n const sameHost = existing.host === info.host;\n if (sameHost && !isAlive(existing.pid)) {\n // 陈旧锁:直接覆写\n await fs.writeFile(file, payload, 'utf8');\n return makeReleaser(file);\n }\n throw new LockError(\n `workspace 已被其它 XCompiler 进程占用 (pid=${existing.pid}, host=${existing.host}, cmd=${existing.command}, since=${existing.startedAt}).\\n` +\n `如确信该进程已退出,请删除 ${file} 后重试。`,\n existing,\n );\n }\n // 文件存在但读不出(损坏) → 接管\n await fs.writeFile(file, payload, 'utf8');\n return makeReleaser(file);\n}\n\nfunction makeReleaser(file: string): AcquiredLock {\n let released = false;\n const release = async () => {\n if (released) return;\n released = true;\n try {\n await fs.unlink(file);\n } catch {\n /* ignore */\n }\n };\n // 进程异常退出时也尽力清理(同步删除)\n const sync = () => {\n if (released) return;\n released = true;\n try {\n unlinkSync(file);\n } catch {\n /* ignore */\n }\n };\n process.once('exit', sync);\n process.once('SIGINT', () => {\n sync();\n process.exit(130);\n });\n process.once('SIGTERM', () => {\n sync();\n process.exit(143);\n });\n return { release };\n}\n","import { t } from '../i18n/index.js';\nimport { XCOMPILER_PLUGIN_API_VERSION, XCOMPILER_VERSION } from '../version.js';\nimport type {\n PluginCompatibilityCode,\n PluginCompatibilityReport,\n XCompilerPluginManifest,\n} from './types.js';\n\nexport interface PluginRuntimeVersion {\n xcompilerVersion?: string;\n pluginApiVersion?: number;\n}\n\n/** 在加载插件代码前可独立调用的 manifest 兼容性检查。 */\nexport function checkPluginCompatibility(\n manifest: XCompilerPluginManifest,\n runtime: PluginRuntimeVersion = {},\n): PluginCompatibilityReport {\n const candidate = manifest && typeof manifest === 'object'\n ? manifest\n : {} as XCompilerPluginManifest;\n const xcompilerVersion = runtime.xcompilerVersion ?? XCOMPILER_VERSION;\n const pluginApiVersion = runtime.pluginApiVersion ?? XCOMPILER_PLUGIN_API_VERSION;\n const pluginId = typeof candidate.id === 'string' ? candidate.id.trim() : '';\n const pluginVersion = typeof candidate.version === 'string' ? candidate.version : '';\n const base = { pluginId, pluginVersion, xcompilerVersion, pluginApiVersion };\n const reject = (code: Exclude<PluginCompatibilityCode, 'compatible'>, message: string) => ({\n ...base,\n compatible: false,\n code,\n message,\n } as const);\n\n const current = parseSemVer(xcompilerVersion);\n if (!current) {\n return reject('invalid-runtime-version', t().plugins.invalidCoreVersion(xcompilerVersion));\n }\n if (!/^[a-z0-9][a-z0-9._-]*$/u.test(pluginId)) {\n return reject('invalid-id', t().plugins.invalidId(pluginId));\n }\n if (!parseSemVer(pluginVersion)) {\n return reject('invalid-plugin-version', t().plugins.invalidVersion(pluginId, pluginVersion));\n }\n if (!Number.isInteger(candidate.apiVersion) || candidate.apiVersion !== pluginApiVersion) {\n return reject(\n 'api-version-mismatch',\n t().plugins.apiVersionMismatch(pluginId, candidate.apiVersion, pluginApiVersion),\n );\n }\n const minimum = parseSemVer(candidate.minXCompilerVersion);\n if (!minimum) {\n return reject(\n 'invalid-min-xcompiler-version',\n t().plugins.invalidMinimumVersion(pluginId, String(candidate.minXCompilerVersion ?? '')),\n );\n }\n if (compareSemVer(current, minimum) < 0) {\n return reject(\n 'xcompiler-version-too-old',\n t().plugins.coreVersionTooOld(pluginId, candidate.minXCompilerVersion, xcompilerVersion),\n );\n }\n return { ...base, compatible: true, code: 'compatible' };\n}\n\ninterface ParsedSemVer {\n major: number;\n minor: number;\n patch: number;\n prerelease: Array<number | string>;\n}\n\nfunction parseSemVer(value: string): ParsedSemVer | undefined {\n const match = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/.exec(value);\n if (!match) return undefined;\n const prereleaseParts = match[4]?.split('.') ?? [];\n // SemVer 2.0.0 forbids leading zeroes in numeric prerelease identifiers.\n if (prereleaseParts.some((part) => /^0\\d+$/u.test(part))) return undefined;\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease: prereleaseParts.map((part) => /^\\d+$/.test(part) ? Number(part) : part),\n };\n}\n\nfunction compareSemVer(a: ParsedSemVer, b: ParsedSemVer): number {\n for (const key of ['major', 'minor', 'patch'] as const) {\n if (a[key] !== b[key]) return a[key] - b[key];\n }\n if (a.prerelease.length === 0 || b.prerelease.length === 0) {\n return a.prerelease.length === b.prerelease.length ? 0 : a.prerelease.length === 0 ? 1 : -1;\n }\n const length = Math.max(a.prerelease.length, b.prerelease.length);\n for (let index = 0; index < length; index++) {\n const left = a.prerelease[index];\n const right = b.prerelease[index];\n if (left === undefined || right === undefined) return left === undefined ? -1 : 1;\n if (left === right) continue;\n if (typeof left === 'number' && typeof right === 'number') return left - right;\n if (typeof left === 'number') return -1;\n if (typeof right === 'number') return 1;\n return left.localeCompare(right);\n }\n return 0;\n}\n","import type { AuditLogger } from '../audit/audit.js';\nimport { t } from '../i18n/index.js';\nimport type { LLMClient } from '../llm/types.js';\nimport type { Tool } from '../tools/types.js';\nimport { XCOMPILER_PLUGIN_API_VERSION, XCOMPILER_VERSION } from '../version.js';\nimport { checkPluginCompatibility } from './compatibility.js';\nimport type {\n HookContextMap,\n HookHandler,\n HookName,\n HookRegistrationOptions,\n PluginApi,\n PluginExtensionTarget,\n PluginHostOptions,\n XCompilerPlugin,\n XCompilerPluginManifest,\n} from './types.js';\n\ninterface RegisteredHook {\n hook: HookName;\n plugin: XCompilerPlugin;\n handler: (context: unknown) => void | Promise<void>;\n priority: number;\n order: number;\n}\n\n/** 插件注册、扩展能力合并与生命周期 Hook 调度中心。 */\nexport class PluginHost {\n private readonly plugins: XCompilerPlugin[];\n private readonly strict: boolean;\n private readonly xcompilerVersion: string;\n private readonly pluginApiVersion: number;\n private readonly hooks = new Map<HookName, RegisteredHook[]>();\n private readonly contributedTools: Array<{ plugin: XCompilerPlugin; tool: Tool }> = [];\n private readonly contributedSkills: Array<{ plugin: XCompilerPlugin; skill: Parameters<PluginApi['registerSkill']>[0] }> = [];\n private audit?: AuditLogger;\n private initialized = false;\n private registrationOrder = 0;\n\n constructor(options: PluginHostOptions = {}) {\n this.plugins = (options.plugins ?? []).map(snapshotPlugin);\n this.strict = options.strict ?? false;\n this.xcompilerVersion = options.xcompilerVersion ?? XCOMPILER_VERSION;\n this.pluginApiVersion = options.pluginApiVersion ?? XCOMPILER_PLUGIN_API_VERSION;\n this.audit = options.audit;\n assertPluginMetadata(this.plugins, this.xcompilerVersion, this.pluginApiVersion);\n }\n\n get size(): number {\n return this.plugins.length;\n }\n\n /** 返回只读清单快照,供诊断、插件目录和未来 registry 使用。 */\n get manifests(): readonly XCompilerPluginManifest[] {\n return this.plugins.map((plugin) => snapshotManifest(plugin.manifest));\n }\n\n setAudit(audit: AuditLogger): void {\n this.audit = audit;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n // 先置位,避免 setup 中的间接调用导致递归初始化。\n this.initialized = true;\n for (const plugin of this.plugins) {\n try {\n await plugin.setup(this.createApi(plugin));\n await this.audit?.event(\n 'note',\n t().plugins.loaded(plugin.manifest.id, plugin.manifest.version),\n {\n messageId: 'plugins.loaded',\n pluginId: plugin.manifest.id,\n pluginVersion: plugin.manifest.version,\n minXCompilerVersion: plugin.manifest.minXCompilerVersion,\n apiVersion: plugin.manifest.apiVersion,\n },\n );\n } catch (error) {\n await this.handleFailure(plugin, 'setup', error);\n }\n }\n }\n\n /** 把插件贡献的 Tool / Skill 合并到 Engine 的默认注册表;禁止静默覆盖核心能力。 */\n applyExtensions(target: PluginExtensionTarget): void {\n for (const { plugin, tool } of this.contributedTools) {\n if (target.tools.get(tool.name)) {\n throw new Error(t().plugins.extensionConflict(plugin.manifest.id, 'tool', tool.name));\n }\n target.tools.register(tool);\n }\n for (const { plugin, skill } of this.contributedSkills) {\n if (target.skills.get(skill.name)) {\n throw new Error(t().plugins.extensionConflict(plugin.manifest.id, 'skill', skill.name));\n }\n target.skills.register(skill);\n }\n }\n\n async emit<K extends HookName>(hook: K, context: HookContextMap[K]): Promise<void> {\n await this.initialize();\n const handlers = [...(this.hooks.get(hook) ?? [])]\n .sort((a, b) => (b.priority - a.priority) || (a.order - b.order));\n for (const registration of handlers) {\n try {\n await registration.handler(context);\n } catch (error) {\n await this.handleFailure(registration.plugin, hook, error);\n }\n }\n }\n\n /** 在不绕过原 Tool / EditGuard 的前提下增加 before / after / error Hook。 */\n wrapTool<A, R>(tool: Tool<A, R>): Tool<A, R> {\n return {\n name: tool.name,\n description: tool.description,\n argsSchema: tool.argsSchema,\n run: async (args, context) => {\n const before: HookContextMap['tool.before'] = {\n stepId: context.stepId,\n tool: tool.name,\n args,\n context,\n };\n await this.emit('tool.before', before);\n try {\n const result = await tool.run(before.args as A, context);\n const after: HookContextMap['tool.after'] = {\n ...before,\n result,\n };\n await this.emit('tool.after', after);\n return after.result as Awaited<ReturnType<Tool<A, R>['run']>>;\n } catch (error) {\n await this.emit('tool.error', { ...before, error });\n throw error;\n }\n },\n };\n }\n\n /** 包装完整 LLM 调用;response 可由 after Hook 做结构化后处理。 */\n wrapLLM(client: LLMClient, role: string): LLMClient {\n return {\n name: client.name,\n chat: async (messages, options) => {\n const before: HookContextMap['llm.before'] = {\n role,\n model: client.name,\n messages: [...messages],\n options: options ? { ...options } : undefined,\n };\n await this.emit('llm.before', before);\n const startedAt = Date.now();\n try {\n const response = await client.chat(before.messages, before.options);\n const after: HookContextMap['llm.after'] = {\n role,\n model: client.name,\n messages: before.messages,\n response,\n durationMs: Date.now() - startedAt,\n };\n await this.emit('llm.after', after);\n return after.response;\n } catch (error) {\n await this.emit('llm.error', {\n role,\n model: client.name,\n messages: before.messages,\n error,\n durationMs: Date.now() - startedAt,\n });\n throw error;\n }\n },\n };\n }\n\n private createApi(plugin: XCompilerPlugin): PluginApi {\n return {\n xcompilerVersion: this.xcompilerVersion,\n pluginApiVersion: this.pluginApiVersion,\n on: <K extends HookName>(\n hook: K,\n handler: HookHandler<K>,\n options: HookRegistrationOptions = {},\n ) => {\n const registration: RegisteredHook = {\n hook,\n plugin,\n handler: (context) => handler(context as HookContextMap[K]),\n priority: options.priority ?? 0,\n order: this.registrationOrder++,\n };\n const list = this.hooks.get(hook) ?? [];\n list.push(registration);\n this.hooks.set(hook, list);\n return () => {\n const current = this.hooks.get(hook);\n if (!current) return;\n const index = current.indexOf(registration);\n if (index >= 0) current.splice(index, 1);\n };\n },\n registerTool: (tool) => this.contributedTools.push({ plugin, tool }),\n registerSkill: (skill) => this.contributedSkills.push({ plugin, skill }),\n };\n }\n\n private async handleFailure(plugin: XCompilerPlugin, stage: string, error: unknown): Promise<void> {\n const message = error instanceof Error ? error.message : String(error);\n const rendered = t().plugins.hookFailed(plugin.manifest.id, stage, message);\n await this.audit?.event('note', rendered, {\n messageId: 'plugins.hook_failed',\n plugin: plugin.manifest.id,\n stage,\n error: message,\n });\n if (this.strict || plugin.failureMode === 'fail') throw error;\n console.warn(rendered);\n }\n}\n\nfunction assertPluginMetadata(\n plugins: XCompilerPlugin[],\n xcompilerVersion: string,\n pluginApiVersion: number,\n): void {\n const seen = new Set<string>();\n for (const plugin of plugins) {\n const report = checkPluginCompatibility(plugin.manifest, { xcompilerVersion, pluginApiVersion });\n if (!report.compatible) throw new Error(report.message);\n if (seen.has(report.pluginId)) throw new Error(t().plugins.duplicateId(report.pluginId));\n seen.add(report.pluginId);\n }\n}\n\nfunction snapshotPlugin(plugin: XCompilerPlugin): XCompilerPlugin {\n return { ...plugin, manifest: snapshotManifest(plugin.manifest) };\n}\n\nfunction snapshotManifest(manifest: XCompilerPluginManifest | undefined): XCompilerPluginManifest {\n if (!manifest) return {} as XCompilerPluginManifest;\n return {\n ...manifest,\n keywords: manifest.keywords ? [...manifest.keywords] : undefined,\n };\n}\n","export type RuntimeLogLevel =\n | 'success'\n | 'warning'\n | 'error'\n | 'info'\n | 'dim'\n | 'accent'\n | 'raw';\n\nimport type {\n ToolExecutionEvent,\n ToolPermissionRequester,\n ToolPermissionRequest,\n} from '../tools/types.js';\n\nexport interface RuntimeLogEvent {\n type: 'log';\n level: RuntimeLogLevel;\n message: string;\n}\n\nexport interface RuntimeResultEvent {\n type: 'result';\n command: 'build' | 'run';\n status: string;\n data?: Record<string, unknown>;\n}\n\nexport interface RuntimeProgressEvent {\n type: 'progress';\n status: 'start' | 'succeed' | 'fail';\n message: string;\n}\n\nexport interface RuntimeToolCallEvent {\n type: 'tool_call';\n status: ToolExecutionEvent['status'];\n stepId: string;\n tool: string;\n target?: string;\n ok?: boolean;\n summary?: string;\n error?: string;\n}\n\nexport interface RuntimeFileChangedEvent {\n type: 'file_changed';\n stepId: string;\n tool: string;\n path: string;\n}\n\nexport interface RuntimePatchProposedEvent {\n type: 'patch_proposed';\n stepId: string;\n tool: string;\n patch: string;\n}\n\nexport interface RuntimePermissionEvent {\n type: 'permission';\n status: 'requested' | 'approved' | 'denied';\n request: ToolPermissionRequest;\n}\n\nexport type RuntimeEvent =\n | RuntimeLogEvent\n | RuntimeProgressEvent\n | RuntimeResultEvent\n | RuntimeToolCallEvent\n | RuntimeFileChangedEvent\n | RuntimePatchProposedEvent\n | RuntimePermissionEvent;\n\nexport interface RuntimeProgress {\n succeed(message: string): void | Promise<void>;\n fail(message: string): void | Promise<void>;\n stop?(): void | Promise<void>;\n}\n\nexport interface RuntimeSelectChoice<T extends string = string> {\n name: string;\n value: T;\n}\n\nexport interface RuntimeInteraction {\n input(args: { message: string }): Promise<string>;\n confirm(args: { message: string; default?: boolean }): Promise<boolean>;\n editor(args: { message: string; default?: string; postfix?: string }): Promise<string>;\n select<T extends string>(args: { message: string; choices: RuntimeSelectChoice<T>[] }): Promise<T>;\n readMultiline(args: { message: string }): Promise<string>;\n pauseStdin?(): void;\n}\n\nexport interface RuntimeIO {\n emit(event: RuntimeEvent): void | Promise<void>;\n progress(message: string, opts?: { animate?: boolean }): RuntimeProgress;\n interaction?: RuntimeInteraction;\n requestPermission?: ToolPermissionRequester;\n}\n\nconst noopProgress: RuntimeProgress = {\n succeed: () => undefined,\n fail: () => undefined,\n stop: () => undefined,\n};\n\nexport const silentRuntimeIO: RuntimeIO = {\n emit: () => undefined,\n progress: () => noopProgress,\n};\n\nexport function runtimeLog(io: RuntimeIO, level: RuntimeLogLevel, message: string): Promise<void> {\n return Promise.resolve(io.emit({ type: 'log', level, message }));\n}\n\nexport function runtimeResult(\n io: RuntimeIO,\n command: 'build' | 'run',\n status: string,\n data?: Record<string, unknown>,\n): Promise<void> {\n return Promise.resolve(io.emit({ type: 'result', command, status, data }));\n}\n\nexport function requireRuntimeInteraction(io: RuntimeIO, operation: string): RuntimeInteraction {\n if (!io.interaction) {\n throw new Error(`Runtime interaction required for ${operation}; provide RuntimeIO.interaction or run non-interactively.`);\n }\n return io.interaction;\n}\n","import path from 'node:path';\nimport { loadPlan, savePlan } from '../core/storage.js';\nimport { topoSort } from '../core/lint.js';\nimport { AuditLogger } from '../audit/audit.js';\nimport { Workspace } from '../workspace/workspace.js';\nimport { GitService } from '../workspace/git.js';\nimport { loadConfigWithPath } from '../config/config.js';\nimport { LLMRouter } from '../llm/router.js';\nimport { reportRoleModelAdvice } from '../llm/role_advice.js';\nimport { ScoreStore } from '../llm/scores.js';\nimport { preflightProviders } from '../llm/preflight.js';\nimport { createSandbox } from '../sandbox/factory.js';\nimport { PhaseEngine } from '../core/engine.js';\nimport { acquireLock, LockError } from '../core/lock.js';\nimport { normalizePythonRequirements } from '../agents/planner.js';\nimport { getLanguageProfile } from '../core/language.js';\nimport { runProjectAudit, shouldRunProjectAudit } from '../core/project_audit.js';\nimport { refreshProjectMemory } from '../core/project_memory.js';\nimport { updateProjectFile } from '../core/project_file.js';\nimport type { Language, PlanIntent } from '../core/plan.js';\nimport { setLocale, t } from '../i18n/index.js';\nimport { PluginHost } from '../plugins/host.js';\nimport type { XCompilerPlugin } from '../plugins/types.js';\nimport { hasXcEnv } from '../config/env.js';\nimport type { EngineResult } from '../core/engine.js';\nimport type { ProjectAuditResult } from '../core/project_audit.js';\nimport type { ToolExecutionEvent, ToolPermissionRequest } from '../tools/types.js';\nimport {\n runtimeLog,\n runtimeResult,\n silentRuntimeIO,\n type RuntimeIO,\n} from './io.js';\n\nexport interface ExecuteOptions {\n planPath: string;\n workspace: string;\n configPath?: string;\n dryRun?: boolean;\n fromStepId?: string;\n onlyPhase?: string;\n resetStatus?: boolean;\n force?: boolean;\n /** Optional XXX.xc project file to keep in sync with execution progress. */\n projectFilePath?: string;\n /** Project-file history command label; defaults to run. */\n projectCommand?: string;\n /** Whether to append a history row when execution starts; defaults to true. */\n recordProjectHistory?: boolean;\n /** @deprecated Runtime never mutates the host process. CLI adapters translate ExecuteResult to exit codes. */\n setProcessExitCode?: boolean;\n /** 程序化插件入口;CLI 文件加载器后续基于该入口实现。 */\n plugins?: XCompilerPlugin[];\n pluginStrict?: boolean;\n /** Runtime event and interaction adapter. CLI supplies terminal rendering; SDKs may stay silent. */\n io?: RuntimeIO;\n /** Allow human terminal progress from lower-level engines. Defaults to true for CLI compatibility. */\n terminalOutput?: boolean;\n}\n\nexport interface ExecuteResult {\n status: 'ok' | 'failed' | 'error' | 'dry-run';\n engine?: EngineResult;\n audit?: ProjectAuditResult;\n message?: string;\n exitCode?: number;\n}\n\nexport async function runExecute(opts: ExecuteOptions): Promise<ExecuteResult> {\n const io = opts.io ?? silentRuntimeIO;\n // 非交互式守则:xcompiler_run 不读任何 stdin。\n try {\n io.interaction?.pauseStdin?.();\n } catch {\n /* ignore */\n }\n const ws = new Workspace(path.resolve(opts.workspace));\n const { config: cfg, path: cfgPath } = await loadConfigWithPath(opts.configPath);\n // AuditLogger 会立即创建过程日志,因此必须先应用配置语言。\n if (!hasXcEnv('LANG')) setLocale(cfg.locale);\n let lock;\n try {\n lock = await acquireLock(ws.root, 'xcompiler_run', { force: !!opts.force });\n } catch (err) {\n if (err instanceof LockError) {\n await runtimeLog(io, 'error', t().system.unhandledError(err.message));\n await runtimeResult(io, 'run', 'error', { message: err.message, exitCode: 6 });\n return { status: 'error', message: err.message, exitCode: 6 };\n }\n throw err;\n }\n const audit = new AuditLogger({ root: ws.root, command: 'xcompiler_run' });\n await audit.start({\n workspace: ws.root,\n plan: opts.planPath,\n dryRun: !!opts.dryRun,\n fromStepId: opts.fromStepId ?? '',\n onlyPhase: opts.onlyPhase ?? '',\n });\n const pluginHost = new PluginHost({\n plugins: opts.plugins,\n strict: opts.pluginStrict,\n audit,\n });\n await pluginHost.initialize();\n\n const planAbs = path.resolve(opts.planPath);\n const plan = await loadPlan(planAbs);\n const projectCommand = opts.projectCommand ?? 'run';\n\n // --force 隐含重置所有 Step 状态、覆写锁,让整个 Plan 从头执行。\n if (opts.force) {\n await runtimeLog(io, 'warning', t().execute.forceReset);\n opts.resetStatus = true;\n }\n\n if (opts.resetStatus) {\n for (const s of plan.steps) {\n s.status = 'PENDING';\n s.retries = 0;\n }\n await savePlan(planAbs, plan);\n }\n let projectFilePath = await updateProjectFile({\n workspace: ws.root,\n planPath: planAbs,\n configPath: cfgPath,\n projectFilePath: opts.projectFilePath,\n command: projectCommand,\n intent: plan.intent,\n plan,\n recordHistory: opts.recordProjectHistory ?? true,\n });\n\n // 将 xcompiler build 沉淀的依赖预写入依赖清单(仅当语言 profile 要求 runtime seeding 时,如 Python)。\n // Python 需要 calibration(剥离版本锁 / 重写幻觉包名)后再与现有内容对比:\n // - 不存在 → 写入。\n // - 已存在但内容与校准后不一致(例如 老运行遗留了 `cantools==4.3.*`)→ 重写为校准后版本。\n // 这能防止升级 XCompiler 后旧 sandbox 仍卡在幻觉依赖上。\n // TypeScript 等语言的 package.json 由 HIGH_LEVEL_DESIGN 步骤撰写,不在此 seeding。\n const profile = getLanguageProfile(plan.language);\n if (profile.seedManifestFromDeps && plan.dependencies && plan.dependencies.length > 0) {\n const reqRel = profile.manifestFile;\n const desired = [...normalizePythonRequirements(plan.dependencies)].sort().join('\\n') + '\\n';\n let existing = '';\n if (await ws.exists(reqRel)) {\n existing = await ws.readFile(reqRel);\n }\n if (existing !== desired) {\n await ws.writeFile(reqRel, desired);\n await audit.event(\n 'plan.persist',\n existing ? t().execute.manifestRecalibrated(reqRel) : t().execute.manifestSeeded(reqRel),\n {\n messageId: existing ? 'execute.manifest_recalibrated' : 'execute.manifest_seeded',\n previousLines: existing.split('\\n').length - 1,\n newLines: desired.split('\\n').length - 1,\n },\n );\n }\n }\n\n const order = topoSort(plan.steps);\n await audit.event('plan.persist', t().execute.auditPlanLoaded(planAbs), {\n messageId: 'execute.plan_loaded',\n steps: plan.steps.length,\n order: order.map((s) => s.id),\n });\n\n await runtimeLog(io, 'success', t().execute.planLoaded(planAbs));\n await runtimeLog(io, 'dim', t().execute.planSummary(plan.language, plan.steps.length));\n await runtimeLog(io, 'raw', '');\n\n if (opts.dryRun) {\n for (const s of order) {\n await runtimeLog(io, 'raw', ` ${s.id.padEnd(5)} ${s.phase.padEnd(17)} ${s.title}`);\n }\n await audit.end({ status: 'ok', mode: 'dry-run' });\n await runtimeResult(io, 'run', 'dry-run', { totalSteps: order.length });\n return { status: 'dry-run' };\n }\n\n const scoreStore = new ScoreStore(cfgPath, cfg.llm.scores, audit);\n await scoreStore.load();\n let unavailableProviders: Set<string>;\n try {\n const pf = await preflightProviders(cfg, scoreStore, audit);\n unavailableProviders = new Set(pf.unreachable);\n if (pf.zeroed.length > 0) {\n await runtimeLog(io, 'warning', t().execute.preflightModelMissing(pf.zeroed.join(', ')));\n }\n if (Object.keys(pf.autoAdded).length > 0) {\n await runtimeLog(io, 'warning', t().execute.preflightAutoAdded(Object.keys(pf.autoAdded).length));\n }\n } catch (err) {\n await runtimeLog(io, 'error', t().system.unhandledError((err as Error).message));\n await audit.end({ status: 'error', message: (err as Error).message, stage: 'llm-preflight' });\n await scoreStore.flush();\n await lock.release();\n await runtimeResult(io, 'run', 'error', { message: (err as Error).message, exitCode: 7 });\n return { status: 'error', message: (err as Error).message, exitCode: 7 };\n }\n const router = new LLMRouter(cfg, audit, scoreStore, unavailableProviders, pluginHost);\n await reportRoleModelAdvice(router, audit, (message) => runtimeLog(io, 'warning', message));\n const git = new GitService(ws);\n const sandbox = createSandbox(cfg, ws, audit, plan.language);\n\n const engine = new PhaseEngine({\n ws,\n git,\n sandbox,\n router,\n audit,\n plugins: pluginHost,\n planPath: planAbs,\n fromStepId: opts.fromStepId,\n onlyPhase: opts.onlyPhase,\n maxRoundsPerStep: cfg.agent.max_rounds_per_step,\n maxDebugRoundsPerStep: cfg.agent.max_debug_rounds_per_step,\n maxDebugRetries: cfg.agent.max_debug_retries,\n maxDebugRetriesCap: cfg.agent.max_debug_retries_cap,\n maxEditLinesPerStep: cfg.agent.max_edit_lines_per_step,\n maxWriteChunkBytes: cfg.agent.max_write_chunk_bytes,\n terminalOutput: opts.terminalOutput ?? true,\n requestPermission: io.requestPermission\n ? async (request: ToolPermissionRequest) => {\n await io.emit({ type: 'permission', status: 'requested', request });\n const decision = await io.requestPermission!(request);\n await io.emit({ type: 'permission', status: decision.approved ? 'approved' : 'denied', request });\n return decision;\n }\n : undefined,\n onToolEvent: async (event: ToolExecutionEvent) => {\n if (event.patch) {\n await io.emit({\n type: 'patch_proposed',\n stepId: event.stepId,\n tool: event.tool,\n patch: event.patch,\n });\n return;\n }\n await io.emit({\n type: 'tool_call',\n status: event.status,\n stepId: event.stepId,\n tool: event.tool,\n target: event.target,\n ok: event.ok,\n summary: event.summary,\n error: event.error,\n });\n if (event.status === 'completed' && event.ok && event.changedFiles) {\n for (const changed of event.changedFiles) {\n await io.emit({\n type: 'file_changed',\n stepId: event.stepId,\n tool: event.tool,\n path: changed,\n });\n }\n }\n },\n onPlanProgress: async (progressPlan) => {\n projectFilePath = await updateProjectFile({\n workspace: ws.root,\n planPath: planAbs,\n configPath: cfgPath,\n projectFilePath,\n command: projectCommand,\n intent: progressPlan.intent,\n plan: progressPlan,\n });\n },\n });\n\n try {\n let r = await engine.run(plan);\n await persistProjectMemory(ws, audit, planAbs, plan.language, plan.intent);\n if (r.failedStepId) {\n await runtimeLog(io, 'error', t().execute.runInterrupted(r.failedStepId, r.executedSteps, r.totalSteps));\n if (r.failureReason) {\n await runtimeLog(io, 'error', `${t().execute.runReasonLabel}${r.failureReason}`);\n }\n if (r.failureLog) {\n const tail = r.failureLog.split('\\n').slice(-40).join('\\n');\n await runtimeLog(io, 'dim', t().execute.runFailureLogHeader);\n await runtimeLog(io, 'raw', tail);\n }\n await audit.end({\n status: 'failed',\n executedSteps: r.executedSteps,\n totalSteps: r.totalSteps,\n failedStepId: r.failedStepId,\n failureReason: r.failureReason,\n });\n await runtimeResult(io, 'run', 'failed', { failedStepId: r.failedStepId, exitCode: 4 });\n return { status: 'failed', engine: r, message: r.failureReason, exitCode: 4 };\n }\n let auditWarnings = 0;\n if (shouldRunProjectAudit(plan, { onlyPhase: opts.onlyPhase })) {\n if (io.requestPermission) {\n const request: ToolPermissionRequest = {\n operationType: 'test_command',\n target: 'project audit gate',\n reason: 'Run the final project audit before returning the task result.',\n risk: 'The project audit may execute tests or entrypoint commands in the configured sandbox.',\n scope: 'current workspace sandbox',\n skippable: true,\n denyBehavior: 'Skip the project audit and fail the run as unverified.',\n };\n await io.emit({ type: 'permission', status: 'requested', request });\n const decision = await io.requestPermission(request);\n await io.emit({ type: 'permission', status: decision.approved ? 'approved' : 'denied', request });\n if (!decision.approved) {\n const message = `project audit permission denied${decision.reason ? `: ${decision.reason}` : ''}`;\n await runtimeLog(io, 'error', message);\n await runtimeResult(io, 'run', 'failed', { projectAuditSkipped: true, exitCode: 4 });\n return { status: 'failed', message, exitCode: 4 };\n }\n }\n let auditResult = await runProjectAudit({ ws, sandbox, plan, profile });\n await emitProjectAudit(io, auditResult);\n await audit.event('note', t().execute.projectAuditSummary(auditResult.errors, auditResult.warnings), {\n messageId: 'execute.project_audit_summary',\n checks: auditResult.checks,\n });\n if (!auditResult.ok) {\n await runtimeLog(io, 'warning', 'project audit failed; entering Debugger repair before final verdict');\n await audit.event('note', 'project audit failed; entering Debugger repair', {\n messageId: 'execute.project_audit_repair_start',\n checks: auditResult.checks,\n });\n const repair = await engine.repairProjectAuditFailure(plan, auditResult);\n await persistProjectMemory(ws, audit, planAbs, plan.language, plan.intent);\n if (repair.failedStepId) {\n await runtimeLog(\n io,\n 'error',\n t().execute.runInterrupted(repair.failedStepId, r.executedSteps + repair.executedSteps, r.totalSteps),\n );\n if (repair.failureReason) {\n await runtimeLog(io, 'error', `${t().execute.runReasonLabel}${repair.failureReason}`);\n }\n if (repair.failureLog) {\n const tail = repair.failureLog.split('\\n').slice(-40).join('\\n');\n await runtimeLog(io, 'dim', t().execute.runFailureLogHeader);\n await runtimeLog(io, 'raw', tail);\n }\n await audit.end({\n status: 'failed',\n executedSteps: r.executedSteps + repair.executedSteps,\n totalSteps: r.totalSteps,\n failedStepId: repair.failedStepId,\n failureReason: repair.failureReason,\n qualityAuditErrors: auditResult.errors,\n qualityAuditWarnings: auditResult.warnings,\n });\n await updateProjectFile({\n workspace: ws.root,\n planPath: planAbs,\n configPath: cfgPath,\n projectFilePath,\n command: projectCommand,\n intent: plan.intent,\n plan,\n });\n await runtimeResult(io, 'run', 'failed', { failedStepId: repair.failedStepId, exitCode: 4 });\n return { status: 'failed', engine: repair, audit: auditResult, message: repair.failureReason, exitCode: 4 };\n }\n r = {\n totalSteps: r.totalSteps,\n executedSteps: r.executedSteps + repair.executedSteps,\n };\n auditResult = await runProjectAudit({ ws, sandbox, plan, profile });\n await emitProjectAudit(io, auditResult);\n await audit.event('note', t().execute.projectAuditSummary(auditResult.errors, auditResult.warnings), {\n messageId: 'execute.project_audit_summary',\n checks: auditResult.checks,\n afterRepair: true,\n });\n }\n if (!auditResult.ok) {\n await audit.end({\n status: 'failed',\n executedSteps: r.executedSteps,\n totalSteps: r.totalSteps,\n qualityAuditErrors: auditResult.errors,\n qualityAuditWarnings: auditResult.warnings,\n });\n await updateProjectFile({\n workspace: ws.root,\n planPath: planAbs,\n configPath: cfgPath,\n projectFilePath,\n command: projectCommand,\n intent: plan.intent,\n plan,\n });\n await runtimeResult(io, 'run', 'failed', { qualityAuditErrors: auditResult.errors, exitCode: 4 });\n return { status: 'failed', engine: r, audit: auditResult, exitCode: 4 };\n }\n auditWarnings = auditResult.warnings;\n }\n await runtimeLog(io, 'success', t().execute.runAllDone(r.executedSteps, r.totalSteps));\n await audit.end({\n status: auditWarnings > 0 ? 'warn' : 'ok',\n executedSteps: r.executedSteps,\n totalSteps: r.totalSteps,\n qualityAuditWarnings: auditWarnings,\n });\n await updateProjectFile({\n workspace: ws.root,\n planPath: planAbs,\n configPath: cfgPath,\n projectFilePath,\n command: projectCommand,\n intent: plan.intent,\n plan,\n });\n await runtimeResult(io, 'run', 'ok', { executedSteps: r.executedSteps, totalSteps: r.totalSteps });\n return { status: 'ok', engine: r };\n } catch (err) {\n const msg = (err as Error).message;\n const stack = (err as Error).stack;\n await runtimeLog(io, 'error', t().system.unhandledError(msg));\n if (stack && stack !== msg) {\n await runtimeLog(io, 'dim', stack);\n }\n await persistProjectMemory(ws, audit, planAbs, plan.language, plan.intent);\n await audit.end({ status: 'error', message: msg, stack });\n await updateProjectFile({\n workspace: ws.root,\n planPath: planAbs,\n configPath: cfgPath,\n projectFilePath,\n command: projectCommand,\n intent: plan.intent,\n plan,\n });\n await runtimeResult(io, 'run', 'error', { message: msg, exitCode: 5 });\n return { status: 'error', message: msg, exitCode: 5 };\n } finally {\n await scoreStore.flush();\n await lock.release();\n }\n}\n\nasync function persistProjectMemory(\n ws: Workspace,\n audit: AuditLogger,\n planPath: string,\n language: Language,\n intent: PlanIntent,\n): Promise<void> {\n try {\n await refreshProjectMemory(ws, { planPath, language, intent });\n } catch (err) {\n await audit.event('note', t().execute.projectMemoryRefreshFailed((err as Error).message), {\n messageId: 'execute.project_memory_refresh_failed',\n planPath,\n });\n }\n}\n\nasync function emitProjectAudit(\n io: RuntimeIO,\n result: Awaited<ReturnType<typeof runProjectAudit>>,\n): Promise<void> {\n const failing = result.checks.filter((check) => !check.ok);\n if (failing.length === 0) return;\n for (const check of failing) {\n await runtimeLog(\n io,\n check.severity === 'error' ? 'error' : 'warning',\n t().execute.projectAuditCheck(check.name, check.summary),\n );\n if (check.detail) await runtimeLog(io, 'dim', check.detail);\n }\n}\n","import path from 'node:path';\nimport { simpleGit, type SimpleGit } from 'simple-git';\nimport type { Workspace } from './workspace.js';\n\n/**\n * GitService 基于 simple-git 提供 XCompiler 运行时所需的最小集:init / snapshot / revert / log。\n * 所有操作都局限在 workspace.root 内,提交带 [xcompiler] 前缀便于审计。\n */\nexport class GitService {\n private readonly git: SimpleGit;\n\n constructor(private readonly ws: Workspace) {\n this.git = simpleGit({ baseDir: ws.root });\n }\n\n /** 若仓库不存在则 git init + 首次空提交。幂等。 */\n async ensureRepo(): Promise<void> {\n const isRepo = await this.git.checkIsRepo().catch(() => false);\n if (isRepo) return;\n await this.git.init();\n // 配置最小 user 以便能 commit;仅在缺省时设置\n const local = await this.git.listConfig('local').catch(() => null);\n const has = (k: string) => !!local?.all?.[k];\n if (!has('user.email')) await this.git.addConfig('user.email', 'xcompiler@local');\n if (!has('user.name')) await this.git.addConfig('user.name', 'XCompiler');\n // 创建一个 .gitkeep 让初次 commit 不为空\n await this.ws.writeFile('.xcompiler/.gitkeep', '');\n await this.git.add(['.']);\n await this.git.commit('[xcompiler] init workspace');\n }\n\n /** 在某个 Step 的某次重试前打快照;返回 commit sha。 */\n async snapshot(stepId: string, retry: number, message?: string): Promise<string> {\n await this.ensureRepo();\n await this.git.add(['.']);\n const status = await this.git.status();\n const tag = `[xcompiler] ${stepId}#${retry}${message ? ` ${message}` : ''}`;\n if (status.files.length === 0) {\n // 没有变化也产生一个空 commit,便于精准 revert\n const r = await this.git.commit(tag, undefined, { '--allow-empty': null });\n return r.commit;\n }\n const r = await this.git.commit(tag);\n return r.commit;\n }\n\n /** 硬重置到指定 ref;用于 DEBUG 失败回滚。 */\n async revertTo(ref: string): Promise<void> {\n await this.git.reset(['--hard', ref]);\n }\n\n /** 返回最近 N 条 [xcompiler] 提交。 */\n async recentXCompilerCommits(n = 20): Promise<Array<{ sha: string; message: string; date: string }>> {\n const log = await this.git.log({ n });\n return log.all\n .filter((c) => c.message.startsWith('[xcompiler]'))\n .map((c) => ({ sha: c.hash, message: c.message, date: c.date }));\n }\n\n /** 暴露底层 git,仅供高级用法。 */\n raw(): SimpleGit {\n return this.git;\n }\n\n /** 返回相对 workspace 的路径,用于审计。 */\n rel(p: string): string {\n return path.relative(this.ws.root, path.resolve(this.ws.root, p));\n }\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport type { Workspace } from '../workspace/workspace.js';\nimport type { AuditLogger } from '../audit/audit.js';\nimport type { XCompilerConfig } from '../config/config.js';\nimport type { Language } from '../core/plan.js';\nimport { getLanguageProfile } from '../core/language.js';\nimport type { Sandbox } from './types.js';\nimport { SubprocessSandbox } from './subprocess.js';\nimport { DockerSandbox } from './docker.js';\nimport { t } from '../i18n/index.js';\nimport { xcEnv } from '../config/env.js';\n\n/**\n * 检测当前进程是否跑在容器里。依据(任一命中即认为在容器内):\n * - 环境变量 XC_IN_CONTAINER=1(显式覆盖 / Dockerfile 中设置)\n * - /.dockerenv 文件存在(docker 默认创建)\n * - /run/.containerenv 存在(podman 默认创建)\n * - /proc/1/cgroup 包含 'docker' / 'kubepods' / 'containerd'\n *\n * 显式设 XC_IN_CONTAINER=0 强制按\"宿主\"对待(仅在你确认 DooD 路径语义无误时使用)。\n */\nexport function isRunningInContainer(): boolean {\n const env = xcEnv('IN_CONTAINER');\n if (env === '1') return true;\n if (env === '0') return false;\n if (existsSync('/.dockerenv') || existsSync('/run/.containerenv')) return true;\n try {\n const cg = readFileSync('/proc/1/cgroup', 'utf8');\n if (/\\b(docker|kubepods|containerd|podman)\\b/.test(cg)) return true;\n } catch {\n /* not linux or unreadable */\n }\n return false;\n}\n\n/**\n * 工厂:按 config.agent.sandbox 选择实现。\n *\n * 约束:当 XCompiler 本身运行在容器内时,**不支持** sandbox=docker(DooD 在多数\n * 部署中会造成 bind-mount 路径语义不一致、docker.sock GID 错位等问题)。给\n * 出明确错误信息,引导用户改用 sandbox=subprocess 或在宿主上运行 XCompiler。\n */\nexport function createSandbox(\n cfg: XCompilerConfig,\n ws: Workspace,\n audit?: AuditLogger,\n language: Language = cfg.agent.language,\n): Sandbox {\n const profile = getLanguageProfile(language);\n // 默认镜像按实际执行语言推导。若当前 plan 语言与 config.agent.language 不同,\n // 说明我们在执行/恢复另一种语言的历史 plan,此时不能沿用配置里为默认语言定制的镜像。\n const configuredImage = cfg.agent.sandbox_docker.image;\n const image =\n language === cfg.agent.language\n ? configuredImage\n : profile.defaultDockerImage;\n const kind = cfg.agent.sandbox;\n if (cfg.agent.sandbox_limits.network === 'pypi-only') {\n throw new Error(t().system.unsupportedPypiOnlyNetwork);\n }\n if (kind === 'docker') {\n if (isRunningInContainer()) {\n throw new Error(t().system.dockerInsideContainerUnsupported);\n }\n return new DockerSandbox({\n ws,\n limits: cfg.agent.sandbox_limits,\n audit,\n language,\n image,\n workdir: cfg.agent.sandbox_docker.workdir,\n pull: cfg.agent.sandbox_docker.pull,\n dockerBin: cfg.agent.sandbox_docker.docker_bin,\n extraRunArgs: cfg.agent.sandbox_docker.extra_run_args,\n });\n }\n if (kind === 'firejail') {\n throw new Error(t().system.firejailUnsupported);\n }\n // 在容器内默认提示(但不抦截):subprocess 是唯一推荐选项\n return new SubprocessSandbox({ ws, limits: cfg.agent.sandbox_limits, audit, language });\n}\n","import { spawn } from 'node:child_process';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport type { Workspace } from '../workspace/workspace.js';\nimport type { AuditLogger } from '../audit/audit.js';\nimport { t } from '../i18n/index.js';\nimport type { Language } from '../core/plan.js';\nimport type { Sandbox, SandboxLimits, ExecResult, ExecExtra } from './types.js';\n\nexport type { SandboxLimits, ExecResult } from './types.js';\n\nexport interface SubprocessSandboxOptions {\n ws: Workspace;\n limits: SandboxLimits;\n audit?: AuditLogger;\n /** 目标语言,决定运行时(venv/pip/pytest vs node_modules/npm/vitest)。默认 python。 */\n language?: Language;\n /** 沙盒根目录相对 workspace,默认 `.sandbox` */\n sandboxDir?: string;\n /** Python 解释器。默认从 PATH 找 python3 / python。 */\n pythonBin?: string;\n /** 是否继承宿主进程环境。默认 true;验证不可信候选时应设为 false。 */\n inheritEnv?: boolean;\n}\n\n/**\n * SubprocessSandbox:\n * - 在 workspace/.sandbox/venv 内创建 Python 虚拟环境\n * - `requirements.txt` 哈希作为缓存键,未变更跳过 pip install\n * - exec(): 强制 wall-clock 超时(subprocess 模式下 cpu/memory 仅做软限制)\n *\n * 注意:subprocess 模式不做强网络隔离;`network` 配置在该模式下仅作记录。\n * 真正的网络/资源隔离由 M4 的 DockerSandbox 提供。\n */\nexport class SubprocessSandbox implements Sandbox {\n readonly kind = 'subprocess' as const;\n private readonly language: Language;\n private readonly sandboxAbs: string;\n private readonly venvAbs: string;\n private readonly cacheFile: string;\n private pyBin: string | null = null;\n\n constructor(private readonly opts: SubprocessSandboxOptions) {\n this.language = opts.language ?? 'python';\n const dir = opts.sandboxDir ?? '.sandbox';\n this.sandboxAbs = opts.ws.abs(dir);\n // venv 目录名 = 项目名(workspace 目录的 basename,做安全清洗),方便 `source` 后\n // shell prompt 显示 `(<projectName>)`,多项目时一眼可辨。\n const projectName = sanitizeVenvName(path.basename(opts.ws.root));\n this.venvAbs = path.join(this.sandboxAbs, projectName);\n this.cacheFile = path.join(\n this.sandboxAbs,\n this.language === 'typescript' ? 'package.sha256' : 'requirements.sha256',\n );\n }\n\n get root(): string {\n return this.sandboxAbs;\n }\n\n get pythonInVenv(): string {\n return path.join(this.venvAbs, 'bin', 'python');\n }\n\n get pipInVenv(): string {\n return path.join(this.venvAbs, 'bin', 'pip');\n }\n\n /** 解析当前可用的 system python。未找到则抛错。 */\n async resolvePython(): Promise<string> {\n if (this.pyBin) return this.pyBin;\n if (this.opts.pythonBin) {\n this.pyBin = this.opts.pythonBin;\n return this.pyBin;\n }\n for (const cand of ['python3', 'python']) {\n try {\n const r = await execRaw(cand, ['--version'], { timeoutMs: 3000 });\n if (r.exitCode === 0) {\n this.pyBin = cand;\n return cand;\n }\n } catch {\n /* try next */\n }\n }\n throw new Error('no python interpreter found in PATH (need python3 or python)');\n }\n\n /**\n * 构建/复用沙盒。manifestFile 为依赖清单在 workspace 内的相对路径;不存在则跳过安装。\n * Python → requirements.txt (venv + pip);TypeScript → package.json (npm install)。\n */\n async build(manifestFile?: string): Promise<{ rebuilt: boolean; reason: string }> {\n await fs.mkdir(this.sandboxAbs, { recursive: true });\n if (this.opts.inheritEnv === false) {\n await Promise.all([\n fs.mkdir(path.join(this.sandboxAbs, 'home'), { recursive: true }),\n fs.mkdir(path.join(this.sandboxAbs, 'tmp'), { recursive: true }),\n fs.mkdir(path.join(this.sandboxAbs, 'npm-cache'), { recursive: true }),\n ]);\n }\n if (this.language === 'typescript') {\n return this.buildNode(manifestFile ?? 'package.json');\n }\n return this.buildPython(manifestFile ?? 'requirements.txt');\n }\n\n private async buildPython(requirementsTxt: string): Promise<{ rebuilt: boolean; reason: string }> {\n const reqAbs = this.opts.ws.abs(requirementsTxt);\n const reqContent = await fs.readFile(reqAbs, 'utf8').catch(() => '');\n const sig = crypto.createHash('sha256').update(reqContent).digest('hex');\n const cached = await fs.readFile(this.cacheFile, 'utf8').catch(() => '');\n const venvExists = await fs\n .stat(this.pythonInVenv)\n .then(() => true)\n .catch(() => false);\n\n if (venvExists && cached === sig) {\n return { rebuilt: false, reason: 'cache hit' };\n }\n\n const py = await this.resolvePython();\n if (!venvExists) {\n // 优先尝试带 pip 的 venv;某些发行版(如 Debian/Ubuntu 默认 python3 不含 ensurepip)\n // 会失败,再退回 --without-pip + 手动 ensurepip。\n const r = await execRaw(py, ['-m', 'venv', this.venvAbs], { timeoutMs: 60_000 });\n if (r.exitCode !== 0) {\n const r2 = await execRaw(py, ['-m', 'venv', '--without-pip', this.venvAbs], { timeoutMs: 60_000 });\n if (r2.exitCode !== 0) {\n throw new Error(`venv creation failed: ${r.stderr || r.stdout}\\n\\n--without-pip retry: ${r2.stderr || r2.stdout}`);\n }\n }\n }\n // 确保 venv 内有可用 pip:bin/pip 文件可能根本不存在(python3-venv 缺包 / --without-pip)。\n // 统一通过 python -m pip 调用,并在缺失时自动 ensurepip。\n const pyVenv = this.pythonInVenv;\n const pyVenvExists = await fs.stat(pyVenv).then(() => true).catch(() => false);\n if (!pyVenvExists) {\n throw new Error(`venv python missing after creation: ${pyVenv} (install system package python3-venv / python3-virtualenv)`);\n }\n const pipCheck = await execRaw(pyVenv, ['-m', 'pip', '--version'], { timeoutMs: 30_000 });\n if (pipCheck.exitCode !== 0) {\n const ep = await execRaw(pyVenv, ['-m', 'ensurepip', '--upgrade', '--default-pip'], { timeoutMs: 60_000 });\n if (ep.exitCode !== 0) {\n throw new Error(\n `venv pip unavailable and ensurepip failed (venv=${this.venvAbs}):\\n${ep.stderr || ep.stdout}\\n\\n` +\n 'Install on the host: apt-get install python3-venv python3-pip or yum install python3-pip',\n );\n }\n }\n if (reqContent.trim().length > 0) {\n const r = await execRaw(pyVenv, ['-m', 'pip', 'install', '-r', reqAbs, '--quiet', '--disable-pip-version-check'], {\n timeoutMs: this.opts.limits.wall_seconds * 1000 * 5,\n });\n if (r.exitCode !== 0) {\n throw new Error(\n `pip install failed (venv=${this.venvAbs}, requirements=${reqAbs}):\\n${\n r.stderr || r.stdout\n }`,\n );\n }\n }\n await fs.writeFile(this.cacheFile, sig, 'utf8');\n await this.opts.audit?.event('sandbox.exec', t().sandboxLog.subprocessBuilt(!!reqContent), {\n messageId: 'sandbox.subprocess_built',\n });\n return { rebuilt: true, reason: venvExists ? 'requirements changed' : 'venv created' };\n }\n\n private async buildNode(manifestFile: string): Promise<{ rebuilt: boolean; reason: string }> {\n const pkgAbs = this.opts.ws.abs(manifestFile);\n const pkgContent = await fs.readFile(pkgAbs, 'utf8').catch(() => '');\n if (!pkgContent) {\n // package.json 尚未生成(HIGH_LEVEL_DESIGN 之前)→ 跳过 npm install。\n return { rebuilt: false, reason: 'no package.json yet' };\n }\n const lockAbs = this.opts.ws.abs('package-lock.json');\n const lockContent = await fs.readFile(lockAbs, 'utf8').catch(() => '');\n const sig = crypto.createHash('sha256').update(pkgContent + '\\n' + lockContent).digest('hex');\n const cached = await fs.readFile(this.cacheFile, 'utf8').catch(() => '');\n const modulesExist = await fs\n .stat(this.opts.ws.abs('node_modules'))\n .then(() => true)\n .catch(() => false);\n if (modulesExist && cached === sig) {\n return { rebuilt: false, reason: 'cache hit' };\n }\n const installArgs = lockContent.trim()\n ? ['ci', '--ignore-scripts', '--no-audit', '--no-fund']\n : ['install', '--ignore-scripts', '--no-audit', '--no-fund'];\n const r = await execRaw('npm', installArgs, {\n cwd: this.opts.ws.root,\n env: this.baseEnvironment(),\n timeoutMs: this.opts.limits.wall_seconds * 1000 * 10,\n });\n if (r.exitCode !== 0) {\n throw new Error(`npm dependency install failed (cwd=${this.opts.ws.root}):\\n${r.stderr || r.stdout}`);\n }\n await fs.writeFile(this.cacheFile, sig, 'utf8');\n await this.opts.audit?.event('sandbox.exec', t().sandboxLog.subprocessNodeBuilt, {\n messageId: 'sandbox.subprocess_node_built',\n });\n return { rebuilt: true, reason: modulesExist ? 'package.json changed' : 'node_modules created' };\n }\n\n /** 执行任意命令(默认 cwd = workspace.root)。 */\n async exec(\n cmd: string,\n argv: string[],\n extra?: ExecExtra,\n ): Promise<ExecResult> {\n const cwd = extra?.cwd ?? this.opts.ws.root;\n const timeoutMs = extra?.timeoutMs ?? this.opts.limits.wall_seconds * 1000;\n const baseEnv = this.baseEnvironment();\n const env =\n this.language === 'typescript'\n ? {\n ...baseEnv,\n PATH: `${this.opts.ws.abs('node_modules/.bin')}:${baseEnv.PATH ?? ''}`,\n ...(extra?.env ?? {}),\n }\n : {\n ...baseEnv,\n PATH: `${path.join(this.venvAbs, 'bin')}:${baseEnv.PATH ?? ''}`,\n VIRTUAL_ENV: this.venvAbs,\n ...(extra?.env ?? {}),\n };\n await this.opts.audit?.event('sandbox.exec', t().sandboxLog.command('subprocess', `${cmd} ${argv.join(' ')}`), {\n messageId: 'sandbox.command',\n cwd,\n timeoutMs,\n });\n const r = await execRaw(cmd, argv, { cwd, env, timeoutMs });\n return r;\n }\n\n private baseEnvironment(): NodeJS.ProcessEnv {\n if (this.opts.inheritEnv !== false) return { ...process.env };\n return {\n PATH: process.env.PATH ?? '',\n HOME: path.join(this.sandboxAbs, 'home'),\n TMPDIR: path.join(this.sandboxAbs, 'tmp'),\n CI: '1',\n NO_COLOR: '1',\n NPM_CONFIG_CACHE: path.join(this.sandboxAbs, 'npm-cache'),\n NPM_CONFIG_UPDATE_NOTIFIER: 'false',\n };\n }\n\n /** 运行工程入口程序。Python → venv python;TypeScript → npx tsx。 */\n async runProgram(args: string[], extra?: ExecExtra): Promise<ExecResult> {\n if (this.language === 'typescript') {\n return this.exec('npx', ['tsx', ...args], extra);\n }\n return this.exec(this.pythonInVenv, args, extra);\n }\n\n /** 运行测试。Python → pytest;TypeScript → npm test(Vitest)。 */\n async runTests(args: string[] = [], extra?: ExecExtra): Promise<ExecResult> {\n if (this.language === 'typescript') {\n const argv = args.length > 0 ? ['test', '--silent', '--', ...args] : ['test', '--silent'];\n return this.exec('npm', argv, extra);\n }\n return this.exec(this.pythonInVenv, ['-m', 'pytest', ...args], extra);\n }\n\n /** 安装额外依赖(不会写入依赖清单,需要由调用方自行回写)。 */\n async installDeps(packages: string[]): Promise<ExecResult> {\n if (this.language === 'typescript') {\n return this.exec('npm', ['install', '--no-audit', '--no-fund', ...packages]);\n }\n return this.exec(this.pythonInVenv, ['-m', 'pip', 'install', ...packages, '--quiet', '--disable-pip-version-check']);\n }\n}\n\n/** 把任意 workspace 目录名规整为 venv 安全名(保留 [A-Za-z0-9._-],回退到 'venv')。 */\nexport function sanitizeVenvName(name: string): string {\n const cleaned = name.replace(/[^A-Za-z0-9._-]+/g, '-').replace(/^-+|-+$/g, '');\n return cleaned.length > 0 ? cleaned : 'venv';\n}\n\n/** 不依赖沙盒的底层 spawn 封装。 */\nexport async function execRaw(\n cmd: string,\n argv: string[],\n opts: { cwd?: string; env?: NodeJS.ProcessEnv; timeoutMs?: number } = {},\n): Promise<ExecResult> {\n const start = Date.now();\n return new Promise((resolve) => {\n const child = spawn(cmd, argv, {\n cwd: opts.cwd,\n env: opts.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n const t = opts.timeoutMs\n ? setTimeout(() => {\n timedOut = true;\n child.kill('SIGKILL');\n }, opts.timeoutMs)\n : null;\n child.stdout.on('data', (b) => {\n stdout += b.toString();\n });\n child.stderr.on('data', (b) => {\n stderr += b.toString();\n });\n child.on('error', (err) => {\n if (t) clearTimeout(t);\n resolve({\n exitCode: -1,\n stdout,\n stderr: stderr + `\\n[spawn error] ${err.message}`,\n timedOut,\n durationMs: Date.now() - start,\n });\n });\n child.on('close', (code) => {\n if (t) clearTimeout(t);\n resolve({\n exitCode: code ?? -1,\n stdout,\n stderr,\n timedOut,\n durationMs: Date.now() - start,\n });\n });\n });\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport type { Workspace } from '../workspace/workspace.js';\nimport type { AuditLogger } from '../audit/audit.js';\nimport { t } from '../i18n/index.js';\nimport type { Language } from '../core/plan.js';\nimport type { Sandbox, SandboxLimits, ExecResult, ExecExtra } from './types.js';\nimport { execRaw, sanitizeVenvName } from './subprocess.js';\n\nexport interface DockerSandboxOptions {\n ws: Workspace;\n limits: SandboxLimits;\n audit?: AuditLogger;\n /** 目标语言,决定运行时与默认镜像。默认 python。 */\n language?: Language;\n /** 镜像名,默认按语言推导(python:3.11-slim / node:20-slim) */\n image?: string;\n /** 容器内挂载点,默认 /workspace */\n workdir?: string;\n /** 沙盒目录相对 workspace,venv 等放这里;默认 .sandbox */\n sandboxDir?: string;\n /** docker 可执行路径,默认 PATH 中的 docker */\n dockerBin?: string;\n /** 是否在 build 时强制 docker pull(拉取最新镜像) */\n pull?: boolean;\n /** 额外 docker run 参数(高级用户) */\n extraRunArgs?: string[];\n}\n\n/**\n * DockerSandbox:使用系统 docker daemon,将工程目录 bind-mount 到容器内运行。\n *\n * - 不构建自定义镜像。直接以 `python:3.11-slim`(或 cfg.image)为基底,\n * 在 bind-mount 的工程目录下创建 `.sandbox/venv` 并 `pip install -r requirements.txt`,\n * 把\"环境构建产物\"全部落在挂载卷里 → 重启容器后立即复用,无 docker volume 黏性。\n * - exec/runPython/runPytest:每次起一个临时容器(--rm),cgroup 限制由 --cpus / --memory 提供,\n * wall-clock 超时由 host 端 spawn 控制。\n * - \"debug 时直接修改工程代码\":因为是 bind mount,XCompiler 工具在宿主机上的写入会瞬时反映到容器;\n * 下一次 exec 直接看到新代码,无需重新构建镜像。\n *\n * 网络策略:\n * - `off` → `--network none`\n * - `pypi-only` → 拒绝启动;Docker 本身无法可靠提供域名级白名单,禁止静默降级\n * - `full` → 默认网络\n * build 阶段必须能联网拉取依赖;exec 阶段若设 `off` 则完全断网。\n */\nexport class DockerSandbox implements Sandbox {\n readonly kind = 'docker' as const;\n\n private readonly language: Language;\n private readonly image: string;\n private readonly workdir: string;\n private readonly sandboxRel: string;\n private readonly cacheRel: string;\n private readonly dockerBin: string;\n private readonly extraRunArgs: string[];\n private readonly pull: boolean;\n private readonly venvName: string;\n\n constructor(private readonly opts: DockerSandboxOptions) {\n if (opts.limits.network === 'pypi-only') {\n throw new Error(t().system.unsupportedPypiOnlyNetwork);\n }\n this.language = opts.language ?? 'python';\n this.image = opts.image ?? (this.language === 'typescript' ? 'node:20-slim' : 'python:3.11-slim');\n this.workdir = opts.workdir ?? '/workspace';\n this.sandboxRel = (opts.sandboxDir ?? '.sandbox').replaceAll('\\\\', '/');\n this.cacheRel = `${this.sandboxRel}/${this.language === 'typescript' ? 'package.sha256' : 'requirements.sha256'}`;\n this.dockerBin = opts.dockerBin ?? 'docker';\n this.extraRunArgs = opts.extraRunArgs ?? [];\n this.pull = !!opts.pull;\n // venv 目录名 = 项目名(与 SubprocessSandbox 保持一致)\n this.venvName = sanitizeVenvName(path.basename(opts.ws.root));\n }\n\n /** 容器内 venv 路径 */\n private get venvInContainer(): string {\n return `${this.workdir}/${this.sandboxRel}/${this.venvName}`;\n }\n\n private get pythonInContainer(): string {\n return `${this.venvInContainer}/bin/python`;\n }\n\n private get pipInContainer(): string {\n return `${this.venvInContainer}/bin/pip`;\n }\n\n /** 检查 docker 是否可用 */\n async assertDocker(): Promise<void> {\n const r = await execRaw(this.dockerBin, ['version', '--format', '{{.Server.Version}}'], {\n timeoutMs: 5000,\n });\n if (r.exitCode !== 0) {\n throw new Error(\n `docker daemon not reachable via ${this.dockerBin}: ${r.stderr || r.stdout || 'unknown error'}`,\n );\n }\n }\n\n /**\n * 构建/复用环境:\n * 1. 哈希依赖清单 → 命中缓存(venv/node_modules 存在 + sha 一致)则直接返回;\n * 2. 否则起一次性容器,在 bind-mount 的工程目录内安装依赖。\n */\n async build(manifestFile?: string): Promise<{ rebuilt: boolean; reason: string }> {\n await this.assertDocker();\n const sandboxAbs = this.opts.ws.abs(this.sandboxRel);\n await fs.mkdir(sandboxAbs, { recursive: true });\n if (this.language === 'typescript') {\n return this.buildNode(manifestFile ?? 'package.json');\n }\n return this.buildPython(manifestFile ?? 'requirements.txt');\n }\n\n private async buildPython(requirementsTxt: string): Promise<{ rebuilt: boolean; reason: string }> {\n const sandboxAbs = this.opts.ws.abs(this.sandboxRel);\n const reqAbs = this.opts.ws.abs(requirementsTxt);\n const reqContent = await fs.readFile(reqAbs, 'utf8').catch(() => '');\n const sig = crypto.createHash('sha256').update(this.image + '\\n' + reqContent).digest('hex');\n const cacheAbs = this.opts.ws.abs(this.cacheRel);\n const cached = await fs.readFile(cacheAbs, 'utf8').catch(() => '');\n const venvExists = await fs\n .stat(path.join(sandboxAbs, this.venvName, 'bin', 'python'))\n .then(() => true)\n .catch(() => false);\n\n if (venvExists && cached === sig) {\n return { rebuilt: false, reason: 'cache hit' };\n }\n\n if (this.pull) {\n const r = await execRaw(this.dockerBin, ['pull', this.image], { timeoutMs: 300_000 });\n if (r.exitCode !== 0) {\n throw new Error(`docker pull ${this.image} failed: ${r.stderr || r.stdout}`);\n }\n }\n\n const reqInContainer = `${this.workdir}/${requirementsTxt}`;\n const installCmd =\n reqContent.trim().length > 0\n ? `python -m venv ${this.venvInContainer} && ${this.pipInContainer} install --quiet -r ${reqInContainer}`\n : `python -m venv ${this.venvInContainer}`;\n\n const r = await execRaw(\n this.dockerBin,\n [\n 'run',\n '--rm',\n '-v',\n `${this.opts.ws.root}:${this.workdir}`,\n '-w',\n this.workdir,\n ...this.extraRunArgs,\n this.image,\n 'bash',\n '-lc',\n installCmd,\n ],\n { timeoutMs: this.opts.limits.wall_seconds * 1000 * 10 },\n );\n if (r.exitCode !== 0) {\n throw new Error(\n `docker sandbox build failed (exit=${r.exitCode}):\\n${r.stderr || r.stdout}`,\n );\n }\n await fs.writeFile(cacheAbs, sig, 'utf8');\n await this.opts.audit?.event('sandbox.exec', t().sandboxLog.dockerBuilt(!!reqContent), {\n messageId: 'sandbox.docker_built',\n image: this.image,\n });\n return { rebuilt: true, reason: venvExists ? 'requirements changed' : 'venv created' };\n }\n\n private async buildNode(manifestFile: string): Promise<{ rebuilt: boolean; reason: string }> {\n const pkgAbs = this.opts.ws.abs(manifestFile);\n const pkgContent = await fs.readFile(pkgAbs, 'utf8').catch(() => '');\n if (!pkgContent) {\n return { rebuilt: false, reason: 'no package.json yet' };\n }\n const lockContent = await fs.readFile(this.opts.ws.abs('package-lock.json'), 'utf8').catch(() => '');\n const sig = crypto.createHash('sha256').update(this.image + '\\n' + pkgContent + '\\n' + lockContent).digest('hex');\n const cacheAbs = this.opts.ws.abs(this.cacheRel);\n const cached = await fs.readFile(cacheAbs, 'utf8').catch(() => '');\n const modulesExist = await fs\n .stat(this.opts.ws.abs('node_modules'))\n .then(() => true)\n .catch(() => false);\n if (modulesExist && cached === sig) {\n return { rebuilt: false, reason: 'cache hit' };\n }\n\n if (this.pull) {\n const r = await execRaw(this.dockerBin, ['pull', this.image], { timeoutMs: 300_000 });\n if (r.exitCode !== 0) {\n throw new Error(`docker pull ${this.image} failed: ${r.stderr || r.stdout}`);\n }\n }\n\n const installCommand = lockContent.trim()\n ? 'npm ci --ignore-scripts --no-audit --no-fund'\n : 'npm install --ignore-scripts --no-audit --no-fund';\n const r = await execRaw(\n this.dockerBin,\n [\n 'run',\n '--rm',\n '-v',\n `${this.opts.ws.root}:${this.workdir}`,\n '-w',\n this.workdir,\n ...this.extraRunArgs,\n this.image,\n 'bash',\n '-lc',\n installCommand,\n ],\n { timeoutMs: this.opts.limits.wall_seconds * 1000 * 10 },\n );\n if (r.exitCode !== 0) {\n throw new Error(`docker sandbox build failed (exit=${r.exitCode}):\\n${r.stderr || r.stdout}`);\n }\n await fs.writeFile(cacheAbs, sig, 'utf8');\n await this.opts.audit?.event('sandbox.exec', t().sandboxLog.dockerNodeBuilt, {\n messageId: 'sandbox.docker_node_built', image: this.image,\n });\n return { rebuilt: true, reason: modulesExist ? 'package.json changed' : 'node_modules created' };\n }\n\n /** 在容器内执行任意命令。cwd 视为 workspace 内相对路径或绝对宿主路径(后者会被映射回容器)。 */\n async exec(cmd: string, argv: string[], extra?: ExecExtra): Promise<ExecResult> {\n const containerCwd = this.toContainerPath(extra?.cwd) ?? this.workdir;\n const timeoutMs = extra?.timeoutMs ?? this.opts.limits.wall_seconds * 1000;\n\n const dockerArgs: string[] = [\n 'run',\n '--rm',\n '-v',\n `${this.opts.ws.root}:${this.workdir}`,\n '-w',\n containerCwd,\n `--cpus=${this.opts.limits.cpu}`,\n `--memory=${this.opts.limits.memory_mb}m`,\n '--pids-limit',\n '256',\n ];\n if (this.language === 'typescript') {\n dockerArgs.push(\n '-e',\n `PATH=${this.workdir}/node_modules/.bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin`,\n );\n } else {\n dockerArgs.push(\n '-e',\n `VIRTUAL_ENV=${this.venvInContainer}`,\n '-e',\n `PATH=${this.venvInContainer}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin`,\n );\n }\n for (const [k, v] of Object.entries(extra?.env ?? {})) {\n dockerArgs.push('-e', `${k}=${v}`);\n }\n if (this.opts.limits.network === 'off') dockerArgs.push('--network', 'none');\n // bidirectional: publish requested ports on 127.0.0.1 so host-side tests can reach the app.\n if (this.opts.limits.network === 'full' && this.opts.limits.expose_ports?.length) {\n for (const port of this.opts.limits.expose_ports) {\n dockerArgs.push('-p', `127.0.0.1:${port}:${port}`);\n }\n }\n dockerArgs.push(...this.extraRunArgs, this.image, cmd, ...argv);\n\n await this.opts.audit?.event('sandbox.exec', t().sandboxLog.command('docker', `${cmd} ${argv.join(' ')}`), {\n messageId: 'sandbox.command',\n cwd: containerCwd,\n timeoutMs,\n image: this.image,\n network: this.opts.limits.network,\n });\n return execRaw(this.dockerBin, dockerArgs, { timeoutMs });\n }\n\n async runProgram(args: string[], extra?: ExecExtra): Promise<ExecResult> {\n if (this.language === 'typescript') {\n return this.exec('npx', ['tsx', ...args], extra);\n }\n return this.exec(this.pythonInContainer, args, extra);\n }\n\n async runTests(args: string[] = [], extra?: ExecExtra): Promise<ExecResult> {\n if (this.language === 'typescript') {\n const argv = args.length > 0 ? ['test', '--silent', '--', ...args] : ['test', '--silent'];\n return this.exec('npm', argv, extra);\n }\n return this.exec(this.pythonInContainer, ['-m', 'pytest', ...args], extra);\n }\n\n async installDeps(packages: string[]): Promise<ExecResult> {\n if (this.language === 'typescript') {\n return this.exec('npm', ['install', '--no-audit', '--no-fund', ...packages]);\n }\n return this.exec(this.pipInContainer, ['install', '--quiet', ...packages]);\n }\n\n /** 将宿主机绝对路径映射回容器路径;相对路径或 undefined 原样返回(相对则拼到 workdir)。 */\n private toContainerPath(p?: string): string | null {\n if (!p) return null;\n if (path.isAbsolute(p)) {\n const root = path.resolve(this.opts.ws.root);\n const norm = path.resolve(p);\n if (norm === root) return this.workdir;\n if (norm.startsWith(root + path.sep)) {\n return this.workdir + '/' + norm.slice(root.length + 1).replaceAll(path.sep, '/');\n }\n // 不在 workspace 内的绝对路径不可见 — fallback 至 workdir\n return this.workdir;\n }\n return `${this.workdir}/${p.replaceAll('\\\\', '/')}`;\n }\n}\n","import path from 'node:path';\nimport chalk from 'chalk';\nimport { spinner as ora } from '../util/spinner.js';\nimport {\n PHASE_ORDER,\n V_MODEL_TEST_PHASES,\n V_MODEL_TEST_TO_SOURCE_PHASE,\n type Plan,\n type Step,\n} from './plan.js';\nimport { topoSort } from './lint.js';\nimport { savePlan } from './storage.js';\nimport type { LLMRouter } from '../llm/router.js';\nimport type { Workspace } from '../workspace/workspace.js';\nimport type { GitService } from '../workspace/git.js';\nimport type { Sandbox } from '../sandbox/types.js';\nimport type { AuditLogger } from '../audit/audit.js';\nimport {\n buildDefaultRegistry,\n EditGuard,\n resolveWriteChunkBytes,\n type WriteChunkBytes,\n type ToolRegistry,\n type ToolContext,\n type Tool,\n type ToolExecutionReporter,\n type ToolPermissionRequest,\n type ToolPermissionRequester,\n} from '../tools/index.js';\nimport { StepExecutor, verifyOutputs } from '../agents/executor.js';\nimport type { ExecutorRunMetrics } from '../agents/executor.js';\nimport {\n calibrateDebugSuggestions,\n ensureEssentialToolRefs,\n renderDebugSuggestions,\n} from '../agents/calibration.js';\nimport { t } from '../i18n/index.js';\nimport { buildDefaultSkills, SkillRegistry } from '../skills/skill.js';\nimport { archiveIfExists } from '../workspace/doc_archive.js';\nimport { DebugCache } from './debug_cache.js';\nimport { getLanguageProfile, type LanguageProfile } from './language.js';\nimport { missingArchitectureDocumentTokens } from './architecture.js';\nimport { DOC_NAMES } from './docs.js';\nimport {\n renderProjectAuditFailureLog,\n runIterationGate,\n type ProjectAuditResult,\n} from './project_audit.js';\nimport {\n loadProjectMemory,\n PROJECT_MEMORY_PATH,\n refreshProjectMemory,\n selectMemoryContractsForStep,\n selectMemorySnippetsForStep,\n type ProjectMemory,\n} from './project_memory.js';\nimport { PluginHost } from '../plugins/host.js';\n\nexport interface EngineOptions {\n ws: Workspace;\n git: GitService;\n sandbox: Sandbox;\n router: LLMRouter;\n audit: AuditLogger;\n planPath: string;\n registry?: ToolRegistry;\n skills?: SkillRegistry;\n /** 程序化插件入口;CLI 动态加载器后续只需向该 Host 注入插件。 */\n plugins?: PluginHost;\n /** 从指定 stepId 开始(之前的 Step 标记为 SKIPPED 并不执行)。 */\n fromStepId?: string;\n /** 仅执行指定 phase。 */\n onlyPhase?: string;\n /** 仅打印拓扑顺序,不执行。 */\n dryRun?: boolean;\n /** 单 Step 的 LLM 对话最大轮数。 */\n maxRoundsPerStep?: number;\n /** DEBUG 重试时的对话最大轮数(默认 = maxRoundsPerStep * 2,至少 8)。 */\n maxDebugRoundsPerStep?: number;\n /** Step 失败后最多自动调用 Debugger 重试的次数(基础窗口大小)。 */\n maxDebugRetries?: number;\n /** Debugger 重试的硬上限(滑动窗口最大值)。默认 = max(maxDebugRetries*4, 10)。 */\n maxDebugRetriesCap?: number;\n /** EditGuard 单 Step 累计行数上限;auto 按 Step 上下文动态估算。 */\n maxEditLinesPerStep?: number | 'auto';\n /** write_file / append_file 单次 content 字节预算;auto 按 Step 上下文动态估算。 */\n maxWriteChunkBytes?: WriteChunkBytes;\n /** Called whenever the engine persists Step progress to plan.json. */\n onPlanProgress?: (plan: Plan) => Promise<void>;\n /** Optional protocol/UI permission hook for sensitive tool operations. */\n requestPermission?: ToolPermissionRequester;\n /** Optional protocol/UI event hook for tool calls and changed files. */\n onToolEvent?: ToolExecutionReporter;\n /** Whether PhaseEngine may write human terminal progress directly. Defaults to true for CLI compatibility. */\n terminalOutput?: boolean;\n}\n\nexport interface EngineResult {\n totalSteps: number;\n executedSteps: number;\n failedStepId?: string;\n /** 失败 Step 的最终详细日志(reason + tool calls + 健康度)。 */\n failureLog?: string;\n failureReason?: string;\n}\n\ntype DebugAttemptContext = {\n asDebugger: true;\n failureLog: string;\n reason: string;\n priorAttemptsPrompt?: string;\n contextPaths?: string[];\n contextMode?: 'audit-repair' | 'iteration-gate' | 'test-rollback';\n issueId?: string;\n completedBeforeDebug?: boolean;\n};\n\ntype AttemptOutcome = {\n ok: boolean;\n failureLog: string;\n reason?: string;\n metrics?: ExecutorRunMetrics;\n rollbackToPairedSource?: boolean;\n issueKind?: EngineIssueKind;\n evidence?: Record<string, unknown>;\n};\n\ntype EngineIssueKind =\n | 'phase'\n | 'architecture-gate'\n | 'test-gate'\n | 'functional-gate'\n | 'iteration-gate'\n | 'project-audit'\n | 'exception';\n\ntype EngineIssueStatus = 'recorded' | 'routed' | 'repairing' | 'resolved' | 'unresolved';\n\ninterface EngineIssue {\n id: string;\n createdAt: string;\n updatedAt: string;\n status: EngineIssueStatus;\n kind: EngineIssueKind;\n severity: 'error';\n language: Plan['language'];\n intent: Plan['intent'];\n requirementDigest: string;\n iterationId?: string;\n stepId?: string;\n phase?: Step['phase'];\n role?: Step['role'];\n title?: string;\n reason: string;\n failureLog: string;\n metrics?: ExecutorRunMetrics;\n evidence?: Record<string, unknown>;\n targetStepId?: string;\n targetPhase?: Step['phase'];\n routedAt?: string;\n resolvedAt?: string;\n repair?: {\n repairedStepId: string;\n repairedPhase: Step['phase'];\n completedBeforeDebug: boolean;\n mode: 'patch' | 'rewrite' | 'patch-or-rewrite';\n patchPath?: string;\n summaryPath?: string;\n };\n}\n\n/** Phase Engine:拓扑顺序执行 Plan 的每个 Step;失败时自动调用 Debugger 重试。 */\nexport class PhaseEngine {\n private readonly registry: ToolRegistry;\n private readonly skills: SkillRegistry;\n private readonly plugins: PluginHost;\n private pluginExtensionsApplied = false;\n /** 跨 xcompiler run 持久化的 debug 历史(`<workspace>/.xcompiler/debug_cache.json`)。 */\n private readonly debugCache: DebugCache;\n /** 当前 Plan 的语言 profile(在 run() 起始处按 plan.language 解析)。 */\n private profile: LanguageProfile = getLanguageProfile('python');\n /** 当前 workspace 的项目记忆,用于给执行阶段注入更稳定的跨轮上下文。 */\n private projectMemory: ProjectMemory | null = null;\n /** 最近一次 Step 终态失败时的详细日志(供 run() 汇总到 EngineResult)。 */\n private lastFailure?: { reason: string; failureLog: string };\n /** 当前 run 内记录的结构化 issue,持久化到 `.xcompiler/issues/`。 */\n private readonly issues: EngineIssue[] = [];\n private issueSeq = 0;\n private lastIssue?: EngineIssue;\n\n constructor(private readonly opts: EngineOptions) {\n this.registry = opts.registry ?? buildDefaultRegistry();\n this.skills = opts.skills ?? buildDefaultSkills();\n this.plugins = opts.plugins ?? new PluginHost();\n this.debugCache = new DebugCache(opts.ws.abs('.xcompiler/debug_cache.json'));\n }\n\n private get terminalOutput(): boolean {\n return this.opts.terminalOutput ?? true;\n }\n\n private log(...args: unknown[]): void {\n if (this.terminalOutput) console.log(...args);\n }\n\n private spin(text: string, options?: { animate?: boolean }) {\n return this.terminalOutput ? ora(text, options).start() : null;\n }\n\n private async requestEnginePermission(\n request: ToolPermissionRequest,\n ): Promise<{ approved: boolean; reason?: string }> {\n if (!this.opts.requestPermission) return { approved: true };\n const decision = await this.opts.requestPermission(request);\n await this.opts.audit.event(\n 'note',\n `${request.operationType} ${decision.approved ? 'approved' : 'denied'}: ${request.target}`,\n {\n messageId: 'engine.permission_decision',\n operationType: request.operationType,\n target: request.target,\n approved: decision.approved,\n reason: decision.reason,\n },\n );\n return decision;\n }\n\n private async requireEnginePermission(request: ToolPermissionRequest): Promise<void> {\n const decision = await this.requestEnginePermission(request);\n if (!decision.approved) {\n throw new Error(`permission denied for ${request.operationType}: ${request.target}`);\n }\n }\n\n async run(plan: Plan): Promise<EngineResult> {\n await this.plugins.initialize();\n if (!this.pluginExtensionsApplied) {\n this.plugins.applyExtensions({ tools: this.registry, skills: this.skills });\n this.pluginExtensionsApplied = true;\n }\n await this.plugins.emit('run.before', { plan });\n try {\n const result = await this.runCore(plan);\n await this.plugins.emit('run.after', { plan, result });\n return result;\n } catch (error) {\n await this.plugins.emit('run.error', { plan, error });\n throw error;\n }\n }\n\n async repairProjectAuditFailure(\n plan: Plan,\n auditResult: ProjectAuditResult,\n opts: { iterationId?: string; contextMode?: 'audit-repair' | 'iteration-gate' } = {},\n ): Promise<EngineResult> {\n const order = topoSort(plan.steps);\n const step = this.selectAuditRepairStep(order, auditResult, opts.iterationId);\n const failureLog = renderProjectAuditFailureLog(auditResult);\n const reason = opts.iterationId\n ? `iteration ${opts.iterationId} gate failed (${auditResult.errors} error(s), ${auditResult.warnings} warning(s))`\n : `project audit failed (${auditResult.errors} error(s), ${auditResult.warnings} warning(s))`;\n if (!step) {\n this.lastFailure = { reason, failureLog };\n await this.recordIssue(plan, undefined, {\n kind: opts.contextMode === 'iteration-gate' ? 'iteration-gate' : 'project-audit',\n reason,\n failureLog,\n evidence: { checks: auditResult.checks, iterationId: opts.iterationId },\n status: 'unresolved',\n });\n return {\n totalSteps: order.length,\n executedSteps: 0,\n failedStepId: 'PROJECT_AUDIT',\n failureReason: reason,\n failureLog,\n };\n }\n\n const issue = await this.recordIssue(plan, step, {\n kind: opts.contextMode === 'iteration-gate' ? 'iteration-gate' : 'project-audit',\n reason,\n failureLog,\n evidence: { checks: auditResult.checks, iterationId: opts.iterationId },\n });\n await this.routeIssueToStep(issue, step, 'audit gate selected this completed phase for repair');\n\n await this.plugins.emit('step.before', { plan, step });\n let ok: boolean;\n try {\n ok = await this.executeStepWithDebug(plan, step, {\n initialDebug: {\n reason,\n failureLog,\n contextPaths: this.auditRepairContextPaths(plan, step, auditResult),\n contextMode: opts.contextMode ?? (opts.iterationId ? 'iteration-gate' : 'audit-repair'),\n issueId: issue.id,\n completedBeforeDebug: step.status === 'DONE',\n },\n skipOutputArchive: true,\n });\n } catch (error) {\n await this.plugins.emit('step.error', { plan, step, error });\n throw error;\n }\n await this.plugins.emit('step.after', { plan, step, ok });\n await this.persistPlan(plan);\n\n if (ok) {\n return { totalSteps: order.length, executedSteps: 1 };\n }\n return {\n totalSteps: order.length,\n executedSteps: 1,\n failedStepId: step.id,\n failureLog: this.lastFailure?.failureLog,\n failureReason: this.lastFailure?.reason,\n };\n }\n\n private async runCore(plan: Plan): Promise<EngineResult> {\n this.profile = getLanguageProfile(plan.language);\n await this.refreshCurrentProjectMemory(plan);\n const order = topoSort(plan.steps);\n if (this.opts.dryRun) {\n for (const s of order) {\n this.log(` ${chalk.cyan(s.id.padEnd(5))} ${chalk.yellow(s.phase.padEnd(11))} ${s.title}`);\n }\n return { totalSteps: order.length, executedSteps: 0 };\n }\n\n await this.requireEnginePermission({\n operationType: 'git_operation',\n target: 'git init/snapshot/revert for XCompiler run rollback',\n reason: 'XCompiler uses git snapshots to make each V-model step reversible.',\n risk: 'This may initialize or update git metadata in the current workspace.',\n scope: 'current workspace',\n skippable: false,\n denyBehavior: 'Terminate the run because safe rollback cannot be guaranteed.',\n });\n await this.opts.git.ensureRepo();\n if (await this.opts.ws.exists(this.profile.manifestFile)) {\n await this.requireEnginePermission({\n operationType: 'build_command',\n target: `sandbox build ${this.profile.manifestFile}`,\n reason: 'Prepare the project sandbox before running code-generation steps.',\n risk: 'This may execute package manager or environment setup commands in the sandbox.',\n scope: 'current workspace sandbox',\n skippable: false,\n denyBehavior: 'Terminate the run because the sandbox is not ready.',\n });\n const spin = this.spin(t().engine.spinSandboxBuild(this.profile));\n try {\n const r = await this.opts.sandbox.build(this.profile.manifestFile);\n spin?.succeed(t().engine.sandboxReady(r.reason));\n } catch (err) {\n spin?.fail((err as Error).message);\n throw err;\n }\n }\n\n let started = !this.opts.fromStepId;\n let executed = 0;\n for (let index = 0; index < order.length; index += 1) {\n const step = order[index]!;\n if (!started && step.id !== this.opts.fromStepId) {\n if (step.status !== 'DONE') step.status = 'SKIPPED';\n continue;\n }\n started = true;\n if (this.opts.onlyPhase && step.phase !== this.opts.onlyPhase) continue;\n if (step.status === 'DONE') {\n this.log(chalk.gray(t().engine.stepSkipDone(step.id, step.phase)));\n continue;\n }\n\n await this.plugins.emit('step.before', { plan, step });\n let ok: boolean;\n try {\n ok = await this.executeStepWithDebug(plan, step);\n } catch (error) {\n await this.plugins.emit('step.error', { plan, step, error });\n throw error;\n }\n await this.plugins.emit('step.after', { plan, step, ok });\n executed++;\n await this.persistPlan(plan);\n if (!ok) {\n if (!this.opts.onlyPhase && this.isVModelTestPhase(step.phase)) {\n const rollback = await this.rollbackFailedTestPhase(plan, order, step, this.lastIssue);\n executed += rollback.executedSteps;\n await this.persistPlan(plan);\n if (rollback.ok && rollback.restartIndex !== undefined) {\n index = rollback.restartIndex;\n continue;\n }\n return {\n totalSteps: order.length,\n executedSteps: executed,\n failedStepId: rollback.failedStepId ?? step.id,\n failureLog: rollback.failureLog ?? this.lastFailure?.failureLog,\n failureReason: rollback.failureReason ?? this.lastFailure?.reason,\n };\n }\n return {\n totalSteps: order.length,\n executedSteps: executed,\n failedStepId: step.id,\n failureLog: this.lastFailure?.failureLog,\n failureReason: this.lastFailure?.reason,\n };\n }\n\n if (step.phase === 'HIGH_LEVEL_DESIGN' && step.outputs.includes(this.profile.manifestFile)) {\n await this.requireEnginePermission({\n operationType: 'build_command',\n target: `sandbox rebuild ${this.profile.manifestFile}`,\n reason: 'Dependencies or project manifest changed after high-level design.',\n risk: 'This may execute package manager or environment setup commands in the sandbox.',\n scope: 'current workspace sandbox',\n skippable: false,\n denyBehavior: 'Terminate the run because dependent steps cannot be validated safely.',\n });\n const spin = this.spin(t().engine.spinSandboxRebuild(step.id, this.profile));\n try {\n const r = await this.opts.sandbox.build(this.profile.manifestFile);\n spin?.succeed(t().engine.sandboxStatus(r.reason));\n } catch (err) {\n spin?.fail((err as Error).message);\n throw err;\n }\n }\n\n if (this.shouldRunIterationGate(plan, step)) {\n const gate = await this.runIterationGateWithRepair(plan, step);\n executed += gate.executedSteps;\n await this.persistPlan(plan);\n if (gate.failedStepId) {\n return {\n totalSteps: order.length,\n executedSteps: executed,\n failedStepId: gate.failedStepId,\n failureLog: gate.failureLog,\n failureReason: gate.failureReason,\n };\n }\n }\n }\n return { totalSteps: order.length, executedSteps: executed };\n }\n\n private async recordIssue(\n plan: Plan,\n step: Step | undefined,\n input: {\n kind: EngineIssueKind;\n reason: string;\n failureLog: string;\n metrics?: ExecutorRunMetrics;\n evidence?: Record<string, unknown>;\n status?: EngineIssueStatus;\n },\n ): Promise<EngineIssue> {\n const now = new Date().toISOString();\n this.issueSeq += 1;\n const id = `ISSUE-${now.replace(/[-:.TZ]/g, '').slice(0, 14)}-${String(this.issueSeq).padStart(3, '0')}`;\n const issue: EngineIssue = {\n id,\n createdAt: now,\n updatedAt: now,\n status: input.status ?? 'recorded',\n kind: input.kind,\n severity: 'error',\n language: plan.language,\n intent: plan.intent,\n requirementDigest: plan.requirementDigest,\n iterationId: step?.iterationId ?? 'P1',\n stepId: step?.id,\n phase: step?.phase,\n role: step?.role,\n title: step?.title,\n reason: input.reason,\n failureLog: input.failureLog,\n metrics: input.metrics,\n evidence: input.evidence,\n };\n this.issues.push(issue);\n this.lastIssue = issue;\n await this.persistIssue(issue, 'recorded');\n await this.opts.audit.event('issue.record', `${issue.id} ${issue.kind}: ${issue.reason}`, {\n messageId: 'engine.issue_recorded',\n issue,\n });\n return issue;\n }\n\n private async routeIssueToStep(issue: EngineIssue | undefined, target: Step, reason: string): Promise<void> {\n if (!issue) return;\n issue.status = 'routed';\n issue.targetStepId = target.id;\n issue.targetPhase = target.phase;\n issue.routedAt = new Date().toISOString();\n issue.updatedAt = issue.routedAt;\n await this.persistIssue(issue, 'routed', { routingReason: reason });\n await this.opts.audit.event('issue.route', `${issue.id} -> ${target.id} ${target.phase}`, {\n messageId: 'engine.issue_routed',\n issueId: issue.id,\n targetStepId: target.id,\n targetPhase: target.phase,\n reason,\n });\n }\n\n private async markIssueUnresolved(issueId: string | undefined, reason: string): Promise<void> {\n const issue = issueId ? this.findIssue(issueId) : undefined;\n if (!issue) return;\n issue.status = 'unresolved';\n issue.updatedAt = new Date().toISOString();\n await this.persistIssue(issue, 'unresolved', { reason });\n }\n\n private async markIssueResolved(\n issueId: string | undefined,\n step: Step,\n repair?: EngineIssue['repair'],\n ): Promise<void> {\n const issue = issueId ? this.findIssue(issueId) : undefined;\n if (!issue) return;\n issue.status = 'resolved';\n issue.resolvedAt = new Date().toISOString();\n issue.updatedAt = issue.resolvedAt;\n if (repair) issue.repair = repair;\n await this.persistIssue(issue, 'resolved');\n await this.opts.audit.event('issue.resolve', `${issue.id} resolved by ${step.id} ${step.phase}`, {\n messageId: 'engine.issue_resolved',\n issueId: issue.id,\n repairedStepId: step.id,\n repairedPhase: step.phase,\n repair,\n });\n }\n\n private findIssue(issueId: string): EngineIssue | undefined {\n return this.issues.find((issue) => issue.id === issueId);\n }\n\n private async persistIssue(\n issue: EngineIssue,\n event: string,\n extra: Record<string, unknown> = {},\n ): Promise<void> {\n await this.opts.ws.writeFile(`.xcompiler/issues/${issue.id}.json`, `${JSON.stringify(issue, null, 2)}\\n`);\n const eventPath = '.xcompiler/issues/issues.jsonl';\n const existing = await this.opts.ws.readFile(eventPath).catch(() => '');\n const line = JSON.stringify({\n event,\n at: new Date().toISOString(),\n issueId: issue.id,\n status: issue.status,\n kind: issue.kind,\n stepId: issue.stepId,\n phase: issue.phase,\n targetStepId: issue.targetStepId,\n targetPhase: issue.targetPhase,\n reason: issue.reason,\n ...extra,\n });\n await this.opts.ws.writeFile(eventPath, `${existing}${line}\\n`);\n }\n\n private classifyIssueKind(step: Step, outcome: AttemptOutcome): EngineIssueKind {\n if (outcome.issueKind) return outcome.issueKind;\n if (this.isVModelTestPhase(step.phase) && outcome.rollbackToPairedSource) {\n return step.phase === 'FUNCTIONAL_TEST' ? 'functional-gate' : 'test-gate';\n }\n return 'phase';\n }\n\n private async createCompletedPhaseRepairArtifact(\n issueId: string,\n step: Step,\n beforeRef: string,\n completedBeforeDebug: boolean,\n toolCalls: Array<{ tool: string; ok: boolean; summary?: string; error?: string }>,\n ): Promise<EngineIssue['repair'] | undefined> {\n if (!completedBeforeDebug) return undefined;\n const patchPath = `.xcompiler/issues/${issueId}/repair.patch`;\n const summaryPath = `.xcompiler/issues/${issueId}/repair.md`;\n const diff = await this.opts.git.raw().diff([beforeRef, '--']).catch((err) => `# git diff failed: ${(err as Error).message}\\n`);\n const mode = inferRepairMode(toolCalls);\n await this.opts.ws.writeFile(patchPath, diff || '# No textual diff captured.\\n');\n await this.opts.ws.writeFile(\n summaryPath,\n [\n `# Repair ${issueId}`,\n '',\n `- repairedStep: ${step.id}`,\n `- repairedPhase: ${step.phase}`,\n `- mode: ${mode}`,\n `- completedBeforeDebug: ${completedBeforeDebug}`,\n '',\n '## Tool Calls',\n ...toolCalls.map((call) => `- ${call.tool}: ${call.ok ? 'OK' : 'FAIL'} ${call.summary ?? call.error ?? ''}`),\n '',\n `Patch: ${patchPath}`,\n ].join('\\n') + '\\n',\n );\n return {\n repairedStepId: step.id,\n repairedPhase: step.phase,\n completedBeforeDebug,\n mode,\n patchPath,\n summaryPath,\n };\n }\n\n private shouldRunIterationGate(plan: Plan, step: Step): boolean {\n if (this.opts.onlyPhase || this.opts.dryRun) return false;\n if (step.phase !== 'FUNCTIONAL_TEST') return false;\n const iterationId = step.iterationId ?? 'P1';\n const executablePhase = plan.implementationPhases\n ?.find((phase) => phase.id === iterationId && phase.status !== 'deferred');\n if (!executablePhase) return false;\n return plan.steps\n .filter((candidate) => (candidate.iterationId ?? 'P1') === iterationId)\n .every((candidate) => candidate.status === 'DONE');\n }\n\n private async runIterationGateWithRepair(plan: Plan, finalStep: Step): Promise<EngineResult> {\n const iterationId = finalStep.iterationId ?? 'P1';\n const gatePermission = await this.requestEnginePermission({\n operationType: 'test_command',\n target: `iteration gate ${iterationId}`,\n reason: 'Validate the completed iteration before moving on.',\n risk: 'The iteration gate may execute project tests or entrypoint commands in the sandbox.',\n scope: 'current workspace sandbox',\n skippable: true,\n denyBehavior: 'Mark the iteration gate as failed and report verification as incomplete.',\n });\n if (!gatePermission.approved) {\n const reason = `permission denied for iteration gate ${iterationId}`;\n const failureLog = `${reason}\\n${gatePermission.reason ?? ''}`.trim();\n this.lastFailure = { reason, failureLog };\n return {\n totalSteps: plan.steps.length,\n executedSteps: 0,\n failedStepId: `ITERATION_GATE_${iterationId}`,\n failureReason: reason,\n failureLog,\n };\n }\n const spin = this.spin(`running iteration gate ${iterationId}`, { animate: false });\n let auditResult = await runIterationGate({\n ws: this.opts.ws,\n sandbox: this.opts.sandbox,\n plan,\n profile: this.profile,\n iterationId,\n });\n await this.opts.audit.event('note', `iteration gate ${iterationId}: ${auditResult.errors} error(s), ${auditResult.warnings} warning(s)`, {\n messageId: 'engine.iteration_gate_summary',\n iterationId,\n checks: auditResult.checks,\n });\n if (auditResult.ok) {\n spin?.succeed(`iteration gate ${iterationId} passed`);\n return { totalSteps: plan.steps.length, executedSteps: 0 };\n }\n\n spin?.fail(`iteration gate ${iterationId} failed; entering Debugger repair`);\n await this.opts.audit.event('note', `iteration gate ${iterationId} failed; entering Debugger repair`, {\n messageId: 'engine.iteration_gate_repair_start',\n iterationId,\n checks: auditResult.checks,\n });\n\n const repair = await this.repairProjectAuditFailure(plan, auditResult, {\n iterationId,\n contextMode: 'iteration-gate',\n });\n if (repair.failedStepId) return repair;\n\n auditResult = await runIterationGate({\n ws: this.opts.ws,\n sandbox: this.opts.sandbox,\n plan,\n profile: this.profile,\n iterationId,\n });\n await this.opts.audit.event('note', `iteration gate ${iterationId} after repair: ${auditResult.errors} error(s), ${auditResult.warnings} warning(s)`, {\n messageId: 'engine.iteration_gate_summary',\n iterationId,\n checks: auditResult.checks,\n afterRepair: true,\n });\n if (auditResult.ok) {\n return { totalSteps: plan.steps.length, executedSteps: repair.executedSteps };\n }\n const failureLog = renderProjectAuditFailureLog(auditResult);\n this.lastFailure = {\n reason: `iteration ${iterationId} gate still failed after Debugger repair`,\n failureLog,\n };\n return {\n totalSteps: plan.steps.length,\n executedSteps: repair.executedSteps,\n failedStepId: `ITERATION_GATE_${iterationId}`,\n failureReason: this.lastFailure.reason,\n failureLog,\n };\n }\n\n private isVModelTestPhase(phase: Step['phase']): phase is (typeof V_MODEL_TEST_PHASES)[number] {\n return (V_MODEL_TEST_PHASES as readonly string[]).includes(phase);\n }\n\n private async rollbackFailedTestPhase(\n plan: Plan,\n order: Step[],\n failedTest: Step,\n issue?: EngineIssue,\n ): Promise<EngineResult & { ok: boolean; restartIndex?: number }> {\n const sourcePhase =\n V_MODEL_TEST_TO_SOURCE_PHASE[failedTest.phase as keyof typeof V_MODEL_TEST_TO_SOURCE_PHASE];\n const iterationId = failedTest.iterationId ?? 'P1';\n const stepById = new Map(order.map((step) => [step.id, step] as const));\n const sourceCandidates = order.filter(\n (step) => (step.iterationId ?? 'P1') === iterationId && step.phase === sourcePhase,\n );\n const sourceStep =\n [...sourceCandidates].reverse().find((step) => stepTransitivelyDependsOn(failedTest, step.id, stepById)) ??\n sourceCandidates.at(-1);\n const failureLog = this.lastFailure?.failureLog ?? `${failedTest.phase} failed.`;\n const reason =\n `${failedTest.phase} failed; rolling back to paired ${sourcePhase} phase for Debugger repair, ` +\n `then rerunning subsequent V-model phases.`;\n\n if (!sourceStep) {\n this.lastFailure = {\n reason: `${failedTest.phase} failed but no paired ${sourcePhase} step exists in ${iterationId}.`,\n failureLog,\n };\n await this.markIssueUnresolved(issue?.id, this.lastFailure.reason);\n return {\n ok: false,\n totalSteps: order.length,\n executedSteps: 0,\n failedStepId: failedTest.id,\n failureReason: this.lastFailure.reason,\n failureLog,\n };\n }\n\n await this.routeIssueToStep(issue, sourceStep, reason);\n\n await this.opts.audit.event('note', reason, {\n messageId: 'engine.test_phase_rollback',\n iterationId,\n failedStepId: failedTest.id,\n failedPhase: failedTest.phase,\n sourceStepId: sourceStep.id,\n sourcePhase,\n });\n\n for (const step of order) {\n if ((step.iterationId ?? 'P1') !== iterationId) continue;\n if (PHASE_ORDER[step.phase] <= PHASE_ORDER[sourcePhase]) continue;\n if (step.status === 'PENDING') continue;\n step.status = 'PENDING';\n step.retries = 0;\n }\n await this.persistPlan(plan);\n\n await this.plugins.emit('step.before', { plan, step: sourceStep });\n let ok: boolean;\n try {\n ok = await this.executeStepWithDebug(plan, sourceStep, {\n initialDebug: {\n reason,\n failureLog,\n contextPaths: dedup([\n ...sourceStep.inputs,\n ...sourceStep.outputs,\n ...failedTest.inputs,\n ...failedTest.outputs,\n ]),\n contextMode: 'test-rollback',\n issueId: issue?.id,\n completedBeforeDebug: sourceStep.status === 'DONE',\n },\n skipOutputArchive: true,\n });\n } catch (error) {\n await this.plugins.emit('step.error', { plan, step: sourceStep, error });\n throw error;\n }\n await this.plugins.emit('step.after', { plan, step: sourceStep, ok });\n await this.persistPlan(plan);\n\n if (!ok) {\n return {\n ok: false,\n totalSteps: order.length,\n executedSteps: 1,\n failedStepId: sourceStep.id,\n failureLog: this.lastFailure?.failureLog,\n failureReason: this.lastFailure?.reason,\n };\n }\n\n await this.debugCache.markDone(failedTest.id);\n const restartIndex = Math.max(0, order.findIndex((step) => step.id === sourceStep.id));\n return {\n ok: true,\n totalSteps: order.length,\n executedSteps: 1,\n restartIndex,\n };\n }\n\n /** 主入口:先正常执行;若失败则进入 Debugger 重试循环(滑动窗口式自适应)。\n * 跨 xcompiler run 记忆:若 .xcompiler/debug_cache.json 里该 step 上次以 FAILED 结束,本次\n * 首轮直接进入 Debugger 模式并把历史 attempts 挑明告诉 LLM,避免重走弯路。 */\n private async executeStepWithDebug(\n plan: Plan,\n step: Step,\n opts: {\n initialDebug?: Omit<DebugAttemptContext, 'asDebugger'>;\n skipOutputArchive?: boolean;\n } = {},\n ): Promise<boolean> {\n await this.debugCache.load();\n const completedBeforeDebug = opts.initialDebug?.completedBeforeDebug ?? step.status === 'DONE';\n let activeIssueId = opts.initialDebug?.issueId;\n // 阶段产物归档:在首次尝试前,将本 Step outputs 中已存在的 docs/* 文件移至 docs/history/\n if (!opts.skipOutputArchive) {\n for (const out of step.outputs) {\n await archiveIfExists(this.opts.ws, out, this.opts.audit);\n }\n }\n // 测试 / DEBUG 阶段:语言相关的测试前置(Python 写 tests/conftest.py 注入 sys.path;\n // TypeScript 无需)。解决 LLM 反复生成无法被测试框架解析的 import 问题。\n if (this.isVModelTestPhase(step.phase) || step.phase === 'DEBUG') {\n await this.profile.ensureTestBootstrap?.(this.opts.ws, this.opts.audit);\n }\n // 在测试 / 功能验收阶段进入前,顺手修复入口 import 路径这类通用低级错误\n // (Python 的 `from src.xxx` sys.path 问题;其他语言可为 no-op),避免反复进 DEBUG。\n if (this.isVModelTestPhase(step.phase) || step.phase === 'DEBUG') {\n const fixed = (await this.profile.autoFixImports?.(this.opts.ws, this.opts.audit)) ?? [];\n if (fixed.length > 0) {\n this.log(\n chalk.yellow(t().engine.autoFixedSrcImports(fixed.length, fixed.join(', '))),\n );\n }\n }\n // 每轮新 xcompiler run 都重置本 Step 的 retries 计数,避免历史失败累计后显示成 \"retry 31/3\" 这种误导。\n step.retries = 0;\n\n // 跨会话记忆:上次以 FAILED 结束 → 首轮直接用 Debugger 模式,告诉它历史尝试\n const hadUnresolved = this.debugCache.hasUnresolvedFailure(step.id);\n let priorPrompt = this.debugCache.renderPriorAttemptsForPrompt(step.id);\n let initial: Awaited<ReturnType<PhaseEngine['runOneAttempt']>>;\n try {\n if (opts.initialDebug) {\n initial = await this.runOneAttempt(plan, step, {\n asDebugger: true,\n failureLog: opts.initialDebug.failureLog,\n reason: opts.initialDebug.reason,\n priorAttemptsPrompt: priorPrompt,\n contextPaths: opts.initialDebug.contextPaths,\n contextMode: opts.initialDebug.contextMode,\n issueId: activeIssueId,\n completedBeforeDebug,\n });\n } else if (hadUnresolved) {\n const last = this.debugCache.attempts(step.id).slice(-1)[0]!;\n this.log(\n chalk.yellow(\n t().engine.debugResumeNotice(step.id, this.debugCache.attempts(step.id).length),\n ),\n );\n initial = await this.runOneAttempt(plan, step, {\n asDebugger: true,\n failureLog: last.failureLogTail,\n reason: last.reason,\n priorAttemptsPrompt: priorPrompt,\n issueId: activeIssueId,\n completedBeforeDebug,\n });\n } else {\n initial = await this.runOneAttempt(plan, step);\n }\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n initial = {\n ok: false,\n failureLog: err instanceof Error ? (err.stack ?? reason) : reason,\n reason,\n issueKind: 'exception',\n evidence: {\n stage: opts.initialDebug || hadUnresolved ? 'initial-debug-attempt' : 'initial-attempt',\n role: opts.initialDebug || hadUnresolved ? 'Debugger' : step.role,\n },\n };\n }\n if (initial.ok) {\n await this.debugCache.markDone(step.id);\n return true;\n }\n if (!activeIssueId) {\n const issue = await this.recordIssue(plan, step, {\n kind: this.classifyIssueKind(step, initial),\n reason: initial.reason ?? 'failed',\n failureLog: initial.failureLog,\n metrics: initial.metrics,\n evidence: initial.evidence,\n });\n activeIssueId = issue.id;\n if (!(initial.rollbackToPairedSource && this.isVModelTestPhase(step.phase))) {\n await this.routeIssueToStep(issue, step, 'same phase Debugger repair');\n }\n }\n // 记录首轮失败\n await this.debugCache.recordAttempt(step.id, {\n attempt: 0,\n reason: initial.reason ?? 'failed',\n failureLogTail: initial.failureLog,\n suggestions: calibrateDebugSuggestions(initial.failureLog, initial.reason ?? '').map(\n (s) => `[${s.code}] ${s.hint}`,\n ),\n metrics: initial.metrics\n ? {\n healthScore: initial.metrics.healthScore,\n parseFailures: initial.metrics.parseFailures,\n repeatedTurns: initial.metrics.repeatedTurns,\n progressRatio: initial.metrics.progressRatio,\n rounds: initial.metrics.rounds,\n }\n : undefined,\n });\n if (initial.rollbackToPairedSource && this.isVModelTestPhase(step.phase)) {\n step.status = 'FAILED';\n this.lastFailure = {\n reason: initial.reason ?? 'test phase failed',\n failureLog: initial.failureLog,\n };\n await this.debugCache.markFailed(step.id, this.lastFailure.reason);\n return false;\n }\n priorPrompt = this.debugCache.renderPriorAttemptsForPrompt(step.id);\n\n const baseMax = this.opts.maxDebugRetries ?? step.maxRetries ?? 3;\n const absoluteCap = Math.max(this.opts.maxDebugRetriesCap ?? Math.max(baseMax * 4, 10), baseMax);\n // 滑动窗口:budget 从 baseMax 起步,可在 [attempt+1, absoluteCap] 区间动态伸缩。\n let budget = baseMax;\n let consecutiveBad = 0;\n let lastReason = initial.reason ?? 'failed';\n let lastFailureLog = initial.failureLog;\n let lastResult: { reason?: string; failureLog: string; metrics?: ExecutorRunMetrics } = {\n reason: initial.reason,\n failureLog: initial.failureLog,\n };\n let attempt = 0;\n let earlyAbort = false;\n while (attempt < budget) {\n attempt++;\n step.retries = attempt;\n await this.persistPlan(plan);\n const spin = this.spin(\n t().engine.spinDebugRetry(step.id, attempt, budget, absoluteCap, lastReason),\n { animate: false },\n );\n let r: Awaited<ReturnType<PhaseEngine['runOneAttempt']>>;\n try {\n r = await this.runOneAttempt(plan, step, {\n asDebugger: true,\n failureLog: lastFailureLog,\n reason: lastReason,\n priorAttemptsPrompt: priorPrompt,\n issueId: activeIssueId,\n completedBeforeDebug,\n });\n } catch (err) {\n const msg = (err as Error).message;\n spin?.fail(t().engine.retryException(attempt, budget, msg));\n await this.markIssueUnresolved(activeIssueId, msg);\n consecutiveBad++;\n // 异常视为最严重的不健康信号:立即半窗,连续 2 次直接终止。\n budget = Math.max(attempt + 1, Math.ceil(budget / 2));\n lastReason = msg;\n lastFailureLog = msg;\n lastResult = { reason: msg, failureLog: msg };\n if (consecutiveBad >= 2) {\n earlyAbort = true;\n break;\n }\n continue;\n }\n if (r.ok) {\n spin?.succeed(t().engine.fixSucceeded(step.id, attempt));\n await this.debugCache.markDone(step.id);\n return true;\n }\n const m = r.metrics;\n const healthy =\n !!m && m.parseFailures === 0 && m.repeatedTurns <= 1 && m.healthScore >= 0.6;\n const bad =\n !!m &&\n (m.healthScore < 0.3 ||\n m.parseFailures + m.repeatedTurns >= Math.max(2, Math.ceil(m.rounds / 2)));\n const tag = m\n ? `health=${m.healthScore.toFixed(2)} parseFail=${m.parseFailures} repeat=${m.repeatedTurns} progress=${m.progressRatio.toFixed(2)}`\n : '';\n if (healthy) {\n const before = budget;\n budget = Math.min(absoluteCap, budget + 2);\n consecutiveBad = 0;\n spin?.fail(\n t().engine.retryHealthyButFailed(attempt, before, budget, tag, r.reason ?? ''),\n );\n } else if (bad) {\n consecutiveBad++;\n const before = budget;\n budget = Math.max(attempt + 1, Math.ceil(budget / 2));\n spin?.fail(\n t().engine.retryLowQuality(attempt, before, budget, tag, r.reason ?? ''),\n );\n if (consecutiveBad >= 2) {\n this.log(\n chalk.yellow(\n t().engine.earlyAbortLowQuality(step.id, consecutiveBad),\n ),\n );\n lastReason = r.reason ?? lastReason;\n lastFailureLog = r.failureLog;\n lastResult = { reason: r.reason, failureLog: r.failureLog, metrics: m };\n earlyAbort = true;\n break;\n }\n } else {\n consecutiveBad = 0;\n spin?.fail(t().engine.retryStillFailed(attempt, budget, tag, r.reason ?? ''));\n }\n lastReason = r.reason ?? lastReason;\n lastFailureLog = r.failureLog;\n lastResult = { reason: r.reason, failureLog: r.failureLog, metrics: m };\n // 记录本轮 retry 到跨会话缓存,并刷新 priorPrompt 以供下一轮 LLM 看到\n await this.debugCache.recordAttempt(step.id, {\n attempt,\n reason: r.reason ?? lastReason,\n failureLogTail: r.failureLog,\n suggestions: calibrateDebugSuggestions(r.failureLog, r.reason ?? '').map(\n (s) => `[${s.code}] ${s.hint}`,\n ),\n metrics: m\n ? {\n healthScore: m.healthScore,\n parseFailures: m.parseFailures,\n repeatedTurns: m.repeatedTurns,\n progressRatio: m.progressRatio,\n rounds: m.rounds,\n }\n : undefined,\n });\n priorPrompt = this.debugCache.renderPriorAttemptsForPrompt(step.id);\n }\n step.status = 'FAILED';\n this.lastFailure = {\n reason: lastResult.reason ?? lastReason,\n failureLog: lastResult.failureLog ?? lastFailureLog,\n };\n await this.debugCache.markFailed(step.id, this.lastFailure.reason);\n await this.markIssueUnresolved(activeIssueId, this.lastFailure.reason);\n this.printStepFailure(step, {\n attempts: attempt,\n budget,\n cap: absoluteCap,\n earlyAbort,\n reason: this.lastFailure.reason,\n failureLog: this.lastFailure.failureLog,\n metrics: lastResult.metrics,\n });\n return false;\n }\n\n /** 终态失败:把详细错误日志(reason / metrics / 失败日志尾部)打印到终端。 */\n private printStepFailure(\n step: Step,\n info: {\n attempts: number;\n budget: number;\n cap: number;\n earlyAbort: boolean;\n reason: string;\n failureLog: string;\n metrics?: ExecutorRunMetrics;\n },\n ): void {\n if (!this.terminalOutput) return;\n const bar = chalk.red('─'.repeat(60));\n this.log(bar);\n this.log(\n chalk.red.bold(t().engine.stepFinalFailed(step.id, step.phase, step.role)),\n );\n this.log(\n chalk.gray(\n t().engine.finalAttemptsLine(info.attempts, info.budget, info.cap, info.earlyAbort),\n ),\n );\n if (info.metrics) {\n const m = info.metrics;\n this.log(\n chalk.gray(\n t().engine.finalMetricsLine(\n m.healthScore.toFixed(2),\n m.parseFailures,\n m.repeatedTurns,\n m.toolFailRatio.toFixed(2),\n m.progressRatio.toFixed(2),\n ),\n ),\n );\n }\n this.log(chalk.red(t().engine.reasonLabel) + info.reason);\n const tail = info.failureLog\n ? info.failureLog.split('\\n').slice(-80).join('\\n')\n : t().engine.noFailureLog;\n this.log(chalk.gray(t().engine.failureLogHeader));\n this.log(tail);\n const sugs = calibrateDebugSuggestions(info.failureLog, info.reason);\n if (sugs.length > 0) {\n this.log(chalk.yellow(t().engine.fixSuggestionsHeader));\n sugs.forEach((s, i) => {\n this.log(chalk.yellow(t().engine.suggestionLine(i + 1, s.code, s.hint)));\n });\n }\n this.log(chalk.gray(t().engine.auditHint(step.id)));\n this.log(bar);\n }\n\n private selectAuditRepairStep(\n order: Step[],\n auditResult: ProjectAuditResult,\n iterationId?: string,\n ): Step | undefined {\n const failedNames = new Set(\n auditResult.checks\n .filter((check) => !check.ok && check.severity === 'error')\n .map((check) => check.name),\n );\n const scopedOrder = iterationId\n ? order.filter((step) => (step.iterationId ?? 'P1') === iterationId)\n : order;\n const done = scopedOrder.filter((step) => step.status === 'DONE');\n const latest = (phases: Step['phase'][]): Step | undefined =>\n [...done].reverse().find((step) => phases.includes(step.phase));\n\n if ([...failedNames].some((name) => name === 'entrypoint' || name.startsWith('doc:') || name.endsWith('-doc') || name === 'readme' || name === 'quickstart' || name === 'api-guide')) {\n return latest(['FUNCTIONAL_TEST', 'MODULE_TEST', 'INTEGRATION_TEST', 'UNIT_TEST', 'CODE']);\n }\n if (failedNames.has('tests') || failedNames.has('test-files')) {\n return latest(['UNIT_TEST', 'CODE', 'DETAILED_DESIGN']);\n }\n if (failedNames.has('build') || failedNames.has('lint') || failedNames.has('package-json')) {\n return latest(['CODE', 'HIGH_LEVEL_DESIGN']);\n }\n return latest(['FUNCTIONAL_TEST', 'MODULE_TEST', 'INTEGRATION_TEST', 'UNIT_TEST', 'CODE', 'DEBUG']) ??\n (iterationId ? this.selectAuditRepairStep(order, auditResult) : undefined);\n }\n\n private auditRepairContextPaths(\n plan: Plan,\n step: Step,\n auditResult: ProjectAuditResult,\n ): string[] {\n const failedNames = new Set(\n auditResult.checks\n .filter((check) => !check.ok)\n .map((check) => check.name),\n );\n const writable = this.computeDebugAllowedWrites(plan, step);\n const codeAndTests = writable.filter((rel) =>\n rel.startsWith('src/') ||\n rel.startsWith('tests/') ||\n rel === this.profile.manifestFile ||\n rel === 'package.json',\n );\n const iterationId = step.iterationId ?? 'P1';\n const iterationPrefix = iterationId === 'P1' ? undefined : `docs/iterations/${iterationId}`;\n const docs = [\n 'docs/topic.md',\n 'docs/01-requirement-analysis.md',\n 'docs/02-high-level-design.md',\n 'docs/03-detailed-design.md',\n 'docs/tests/functional-test-plan.md',\n 'docs/tests/integration-test-plan.md',\n 'docs/tests/module-test-plan.md',\n 'docs/tests/unit-test-plan.md',\n ...(iterationPrefix\n ? [\n `${iterationPrefix}/01-requirement-analysis.md`,\n `${iterationPrefix}/02-high-level-design.md`,\n `${iterationPrefix}/03-detailed-design.md`,\n `${iterationPrefix}/05-unit-test.md`,\n `${iterationPrefix}/06-integration-test.md`,\n `${iterationPrefix}/07-module-test.md`,\n `${iterationPrefix}/08-functional-test.md`,\n `${iterationPrefix}/quickstart.md`,\n `${iterationPrefix}/api-guide.md`,\n ]\n : []),\n ];\n if (failedNames.has('entrypoint')) return dedup([...codeAndTests, ...docs]);\n if (failedNames.has('tests') || failedNames.has('test-files')) return dedup([...codeAndTests, ...docs]);\n return dedup([...codeAndTests, ...step.inputs, ...docs]);\n }\n\n /** 一次执行尝试:可选 debug 模式(使用 Debugger 角色 + 注入失败日志)。 */\n private async runOneAttempt(\n plan: Plan,\n step: Step,\n debug?: DebugAttemptContext,\n ): Promise<AttemptOutcome> {\n const role = debug ? 'Debugger' : step.role;\n await this.plugins.emit('step.attempt.before', {\n plan,\n step,\n role,\n debug: !!debug,\n retry: step.retries,\n });\n try {\n const outcome = await this.runOneAttemptCore(plan, step, debug);\n await this.plugins.emit('step.attempt.after', {\n plan,\n step,\n role,\n debug: !!debug,\n retry: step.retries,\n outcome,\n });\n return outcome;\n } catch (error) {\n const outcome = {\n ok: false,\n failureLog: error instanceof Error ? (error.stack ?? error.message) : String(error),\n reason: error instanceof Error ? error.message : String(error),\n };\n await this.plugins.emit('step.attempt.after', {\n plan,\n step,\n role,\n debug: !!debug,\n retry: step.retries,\n outcome,\n });\n throw error;\n }\n }\n\n private async runOneAttemptCore(\n plan: Plan,\n step: Step,\n debug?: DebugAttemptContext,\n ): Promise<AttemptOutcome> {\n const role = debug ? 'Debugger' : step.role;\n // 解析 step.tools 中的 skill: 引用为底层工具名\n const effectiveToolRefs = ensureEssentialToolRefs(step);\n const { resolvedToolNames, hints } = this.skills.resolve(effectiveToolRefs);\n // 在 debug 模式下追加 debugger skill 默认工具集\n let extraNames: string[] = [];\n if (debug) {\n const dbg = this.skills.get('debugger');\n if (dbg) {\n extraNames = dbg.tools;\n hints.push(`[debugger] ${dbg.prompt}`);\n }\n }\n const allNames = dedup([...resolvedToolNames, ...extraNames]);\n const baseTools: Tool[] = this.registry.pick(allNames);\n\n const allowedWrites = debug\n ? this.computeDebugAllowedWrites(plan, step)\n : this.computeStepAllowedWrites(plan, step);\n // 测试 / DEBUG 阶段始终额外放开 tests/fixtures/ —— 测试 fixture 不必逐文件登记到 outputs,\n // 否则 LLM 想 write_file 创建 sample.dbc 之类样例只能死循环。\n const augmentedWrites = this.isVModelTestPhase(step.phase) || step.phase === 'DEBUG' || debug\n ? dedup([...allowedWrites, 'tests/fixtures'])\n : allowedWrites;\n\n // EditGuard 包裹写工具\n const budgetContext = {\n phase: step.phase,\n role,\n debug: !!debug,\n tools: allNames,\n outputs: step.outputs,\n allowedWrites: augmentedWrites,\n contextChars: this.stepContextChars(plan, step),\n };\n const guard = new EditGuard({\n ws: this.opts.ws,\n stepId: step.id,\n maxLines: this.opts.maxEditLinesPerStep ?? 'auto',\n budgetContext,\n });\n const writeChunkBytes = resolveWriteChunkBytes(this.opts.maxWriteChunkBytes ?? 'auto', budgetContext);\n const guardedTools = baseTools.map((tool) => {\n const guarded = guard.wrap(tool);\n return this.plugins.size > 0 ? this.plugins.wrapTool(guarded) : guarded;\n });\n\n const ctx: ToolContext = {\n ws: this.opts.ws,\n sandbox: this.opts.sandbox,\n audit: this.opts.audit,\n allowedWrites: augmentedWrites,\n stepId: step.id,\n language: plan.language,\n writeChunkBytes,\n requestPermission: this.opts.requestPermission,\n onToolEvent: this.opts.onToolEvent,\n };\n\n const llm = this.opts.router.for(role);\n const baseRounds = this.opts.maxRoundsPerStep ?? 6;\n // DEBUG 默认 max(16, base*3);测试阶段修复依赖调用链上源码,需更多轮次。\n const debugRounds =\n this.opts.maxDebugRoundsPerStep ??\n Math.max(this.isVModelTestPhase(step.phase) ? 20 : 16, baseRounds * 3);\n const rounds = debug ? debugRounds : baseRounds;\n // 不能复用 cached executor:不同轮数需要独立实例。\n const executor = new StepExecutor({ llm, maxRounds: rounds });\n\n // 加载 inputs + outputs 已存在文件 作为上下文(debug 时尤其重要)\n const ctxSnippets = await this.buildContextSnippets(plan, step, debug);\n\n step.status = 'RUNNING';\n await this.persistPlan(plan);\n const sha = await this.opts.git.snapshot(step.id, step.retries, debug ? 'debug retry' : 'before');\n await this.opts.audit.event('phase.start', t().engine.phaseStart(step.id, debug ? 'DEBUG' : step.phase, step.title), {\n messageId: 'engine.phase_start',\n role,\n tools: allNames,\n snapshot: sha,\n retry: step.retries,\n });\n\n const spin = debug\n ? null\n : this.spin(\n t().engine.spinStepRunning(step.id, step.phase, chalk.bold(step.title)),\n { animate: false },\n );\n try {\n const r = await executor.run({\n step,\n tools: guardedTools,\n ctx,\n contextSnippets: ctxSnippets,\n skillHints: hints,\n debugContext: debug\n ? {\n reason: debug.reason,\n failureLog: debug.failureLog,\n suggestions:\n renderDebugSuggestions(\n calibrateDebugSuggestions(debug.failureLog, debug.reason),\n ) +\n (debug.priorAttemptsPrompt ? `\\n\\n${debug.priorAttemptsPrompt}` : ''),\n }\n : undefined,\n globalPrompt: plan.globalPrompt,\n languageProfile: this.profile,\n });\n const verify = await verifyOutputs({ step, tools: guardedTools, ctx });\n if (r.success && verify.ok) {\n // HIGH_LEVEL_DESIGN 阶段强制验收门:概要设计文档必须逐项覆盖 Plan 的结构化模块契约。\n if (step.phase === 'HIGH_LEVEL_DESIGN' && (plan.architectureModules?.length ?? 0) > 0) {\n const architecture = await this.opts.ws.readFile(DOC_NAMES.highLevelDesign);\n const missingTokens = missingArchitectureDocumentTokens(\n architecture,\n plan.architectureModules ?? [],\n );\n if (missingTokens.length > 0) {\n const reason = t().engine.archGateReason(missingTokens.length);\n const failureLog = [\n t().engine.reasonLine(reason),\n t().engine.roundsLine(r.rounds),\n t().engine.archGateMissing(missingTokens.join(', ')),\n t().engine.archGateInstruction(DOC_NAMES.highLevelDesign),\n ].join('\\n');\n spin?.fail(t().engine.phaseFailed(step.id, !!debug, reason));\n await this.opts.audit.event('phase.end', t().engine.phaseFailed(step.id, !!debug, reason), {\n messageId: 'engine.phase_failed',\n rounds: r.rounds,\n reason,\n retry: step.retries,\n });\n await this.opts.git.revertTo(sha);\n return {\n ok: false,\n failureLog,\n reason,\n metrics: r.metrics,\n issueKind: 'architecture-gate',\n evidence: { missingTokens },\n };\n }\n }\n\n // 测试阶段强制验收门:必须测试退出码 0,否则按 V 模型映射回退到对应左侧阶段。\n if (this.isVModelTestPhase(step.phase)) {\n const permission = await this.requestEnginePermission({\n operationType: 'test_command',\n target: `${this.profile.id} test gate for ${step.id}`,\n reason: 'Validate the test phase before marking the V-model step complete.',\n risk: 'Project test commands execute code in the configured sandbox.',\n scope: 'current workspace sandbox',\n skippable: true,\n denyBehavior: 'Fail this test gate and route the issue through normal V-model debug handling.',\n stepId: step.id,\n });\n if (!permission.approved) {\n const reason = `permission denied for test gate ${step.id}`;\n const failureLog = [\n t().engine.reasonLine(reason),\n permission.reason ?? '',\n ].filter(Boolean).join('\\n');\n spin?.fail(t().engine.phaseFailed(step.id, !!debug, reason));\n await this.opts.git.revertTo(sha);\n return {\n ok: false,\n failureLog,\n reason,\n metrics: r.metrics,\n rollbackToPairedSource: true,\n issueKind: step.phase === 'FUNCTIONAL_TEST' ? 'functional-gate' : 'test-gate',\n evidence: { permissionDenied: true },\n };\n }\n const pt = await this.opts.sandbox.runTests([], {});\n if (pt.exitCode !== 0 || pt.timedOut) {\n const tail = (s: string) => s.split('\\n').slice(-30).join('\\n');\n const reason = t().engine.testGateReason(pt.exitCode, !!pt.timedOut);\n const failureLog = [\n t().engine.reasonLine(reason),\n t().engine.roundsLine(r.rounds),\n t().engine.testStdoutTailHeader,\n tail(pt.stdout),\n t().engine.testStderrTailHeader,\n tail(pt.stderr),\n ].join('\\n');\n spin?.fail(t().engine.phaseFailed(step.id, !!debug, reason));\n await this.opts.audit.event('phase.end', t().engine.phaseFailed(step.id, !!debug, reason), {\n messageId: 'engine.phase_failed',\n rounds: r.rounds,\n reason,\n retry: step.retries,\n });\n await this.opts.git.revertTo(sha);\n return {\n ok: false,\n failureLog,\n reason,\n metrics: r.metrics,\n rollbackToPairedSource: true,\n issueKind: step.phase === 'FUNCTIONAL_TEST' ? 'functional-gate' : 'test-gate',\n evidence: {\n exitCode: pt.exitCode,\n timedOut: pt.timedOut,\n stdout: pt.stdout,\n stderr: pt.stderr,\n },\n };\n }\n }\n\n // FUNCTIONAL_TEST 阶段强制验收门:必须能运行入口 `--help` 退出码 0。\n // 配合 autoFixImports 已经把常见 import 错误自动修掉,这里只兜底真实业务错误。\n if (step.phase === 'FUNCTIONAL_TEST') {\n // gate 前再跑一次 auto-fix(FUNCTIONAL_TEST Step 自身可能新建/改写了入口)\n await this.profile.autoFixImports?.(this.opts.ws, this.opts.audit);\n const permission = await this.requestEnginePermission({\n operationType: 'shell_command',\n target: `${this.profile.id} functional entry probe`,\n reason: 'Validate the generated project entrypoint before final delivery.',\n risk: 'This executes project code in the configured sandbox.',\n scope: 'current workspace sandbox',\n skippable: true,\n denyBehavior: 'Fail the functional gate and route the issue through normal V-model debug handling.',\n stepId: step.id,\n });\n if (!permission.approved) {\n const reason = `permission denied for functional probe ${step.id}`;\n const failureLog = [\n t().engine.reasonLine(reason),\n permission.reason ?? '',\n ].filter(Boolean).join('\\n');\n spin?.fail(t().engine.phaseFailed(step.id, !!debug, reason));\n await this.opts.git.revertTo(sha);\n return {\n ok: false,\n failureLog,\n reason,\n metrics: r.metrics,\n rollbackToPairedSource: true,\n issueKind: 'functional-gate',\n evidence: { permissionDenied: true },\n };\n }\n const probe = await this.profile.probeEntry(this.opts.ws, this.opts.sandbox);\n if (!probe.ok) {\n const reason = t().engine.deliveryGateReason(probe.command, probe.exitCode, !!probe.timedOut);\n const fixHints = t().engine.deliveryFixHints(this.profile.id);\n const failureLog = [\n t().engine.reasonLine(reason),\n t().engine.roundsLine(r.rounds),\n t().engine.commandLine(probe.command),\n t().engine.stdoutTailHeader,\n probe.stdoutTail,\n t().engine.stderrTailHeader,\n probe.stderrTail,\n '',\n ...fixHints,\n ].join('\\n');\n spin?.fail(t().engine.phaseFailed(step.id, !!debug, reason));\n await this.opts.audit.event('phase.end', t().engine.phaseFailed(step.id, !!debug, reason), {\n messageId: 'engine.phase_failed',\n rounds: r.rounds,\n reason,\n retry: step.retries,\n });\n await this.opts.git.revertTo(sha);\n return {\n ok: false,\n failureLog,\n reason,\n metrics: r.metrics,\n rollbackToPairedSource: true,\n issueKind: 'functional-gate',\n evidence: {\n command: probe.command,\n exitCode: probe.exitCode,\n timedOut: probe.timedOut,\n stdoutTail: probe.stdoutTail,\n stderrTail: probe.stderrTail,\n },\n };\n }\n }\n step.status = 'DONE';\n await this.refreshCurrentProjectMemory(plan);\n const repair = debug?.issueId\n ? await this.createCompletedPhaseRepairArtifact(\n debug.issueId,\n step,\n sha,\n !!debug.completedBeforeDebug,\n r.toolCalls,\n )\n : undefined;\n if (debug?.issueId) {\n await this.markIssueResolved(debug.issueId, step, repair);\n }\n await this.opts.git.snapshot(step.id, step.retries, debug ? 'debug done' : 'done');\n spin?.succeed(t().engine.phaseDone(step.id, r.rounds));\n await this.opts.audit.event('phase.end', t().engine.phaseDone(step.id, r.rounds), {\n messageId: 'engine.phase_done', rounds: r.rounds, retry: step.retries,\n });\n // 不在这里调 markDone:executeStepWithDebug 中统一处理(避免 retry-loop 里双写)。\n return { ok: true, failureLog: '' };\n }\n const reason = r.error ?? t().engine.outputsMissing(verify.missing.join(', '));\n const m = r.metrics;\n const metricsLine = m\n ? t().engine.metricsLine(m.healthScore.toFixed(2), m.parseFailures, m.repeatedTurns, m.toolFailRatio.toFixed(2), m.progressRatio.toFixed(2))\n : t().engine.metricsUnavailable;\n const failureLog =\n [\n t().engine.reasonLine(reason),\n t().engine.roundsLine(r.rounds),\n metricsLine,\n t().engine.toolCallsHeader,\n ...r.toolCalls.map((c) => t().engine.toolCallLine(c.tool, c.ok, c.summary ?? c.error ?? '')),\n ].join('\\n');\n spin?.fail(t().engine.phaseFailed(step.id, !!debug, reason));\n await this.opts.audit.event('phase.end', t().engine.phaseFailed(step.id, !!debug, reason), {\n messageId: 'engine.phase_failed',\n rounds: r.rounds,\n reason,\n retry: step.retries,\n metrics: m,\n });\n // 回退到本次尝试起点\n await this.opts.git.revertTo(sha);\n return { ok: false, failureLog, reason, metrics: m, issueKind: 'phase' };\n } catch (err) {\n const msg = (err as Error).message;\n const stack = (err as Error).stack ?? msg;\n spin?.fail(t().engine.phaseException(step.id, msg));\n await this.opts.audit.event('phase.end', t().engine.phaseException(step.id, msg), {\n messageId: 'engine.phase_exception', error: msg, stack,\n });\n await this.opts.git.revertTo(sha).catch(() => {});\n return { ok: false, failureLog: stack, reason: msg, issueKind: 'exception' };\n } finally {\n void path;\n }\n }\n\n private async buildContextSnippets(\n plan: Plan,\n step: Step,\n debug?: DebugAttemptContext,\n ): Promise<Array<{ path: string; content: string }>> {\n const out = new Map<string, string>();\n if ((plan.architectureModules?.length ?? 0) > 0) {\n out.set(\n '.xcompiler/architecture-contract.json',\n JSON.stringify({ architectureModules: plan.architectureModules }, null, 2),\n );\n }\n const interesting = debug?.contextPaths ?? (debug ? [...step.inputs, ...step.outputs] : step.inputs);\n for (const p of interesting) {\n await this.pushWorkspaceSnippet(out, p);\n }\n\n const sharedDocs = [\n 'docs/topic.md',\n 'docs/01-requirement-analysis.md',\n 'docs/02-high-level-design.md',\n 'docs/03-detailed-design.md',\n 'docs/tests/functional-test-plan.md',\n 'docs/tests/integration-test-plan.md',\n 'docs/tests/module-test-plan.md',\n 'docs/tests/unit-test-plan.md',\n ];\n for (const rel of sharedDocs) {\n await this.pushWorkspaceSnippet(out, rel);\n }\n\n if (this.projectMemory?.summary && debug?.contextMode !== 'audit-repair') {\n out.set(`${PROJECT_MEMORY_PATH}#summary`, this.projectMemory.summary);\n for (const snippet of selectMemorySnippetsForStep(this.projectMemory, step, debug ? 6 : 4)) {\n if (!out.has(snippet.path)) out.set(snippet.path, snippet.content);\n }\n const contracts = selectMemoryContractsForStep(this.projectMemory, step, debug ? 8 : 5);\n if (contracts.length > 0) {\n out.set(\n `${PROJECT_MEMORY_PATH}#contracts`,\n [\n 'Relevant project contracts:',\n ...contracts.map((contract) =>\n `- [${contract.kind}] ${contract.subject}${contract.path ? ` (${contract.path})` : ''}: ${contract.detail}`,\n ),\n ].join('\\n'),\n );\n }\n }\n\n const downstream = this.buildDownstreamContextSnippet(plan, step);\n if (downstream) {\n out.set(`.xcompiler/downstream/${step.id}.md`, downstream);\n }\n return [...out.entries()].map(([path, content]) => ({ path, content }));\n }\n\n private async persistPlan(plan: Plan): Promise<void> {\n await savePlan(this.opts.planPath, plan);\n await this.opts.onPlanProgress?.(plan);\n }\n\n private async pushWorkspaceSnippet(target: Map<string, string>, rel: string): Promise<void> {\n if (!rel || rel.endsWith('/') || target.has(rel)) return;\n try {\n target.set(rel, await this.opts.ws.readFile(rel));\n } catch {\n /* ignore */\n }\n }\n\n private async refreshCurrentProjectMemory(plan: Plan): Promise<void> {\n try {\n this.projectMemory = await refreshProjectMemory(this.opts.ws, {\n planPath: this.opts.planPath,\n language: plan.language,\n intent: plan.intent,\n });\n } catch (err) {\n this.projectMemory = await loadProjectMemory(this.opts.ws);\n await this.opts.audit.event('note', t().engine.projectMemoryRefreshFailed((err as Error).message), {\n messageId: 'engine.project_memory_refresh_failed',\n planPath: this.opts.planPath,\n });\n }\n }\n\n private buildDownstreamContextSnippet(plan: Plan, step: Step): string {\n const byId = new Map(plan.steps.map((candidate) => [candidate.id, candidate]));\n const consumers = plan.steps\n .filter((candidate) => candidate.id !== step.id)\n .filter(\n (candidate) =>\n stepTransitivelyDependsOn(candidate, step.id, byId) ||\n candidate.inputs.some((input) => step.outputs.includes(input)),\n )\n .sort((a, b) => {\n const phaseDelta = PHASE_ORDER[a.phase] - PHASE_ORDER[b.phase];\n return phaseDelta !== 0 ? phaseDelta : a.id.localeCompare(b.id);\n });\n if (consumers.length === 0) return '';\n return [\n `# Downstream consumers of ${step.id}`,\n 'Design the current step so these later steps can consume its outputs directly.',\n '',\n ...consumers.slice(0, 8).flatMap((consumer) => [\n `## ${consumer.id} ${consumer.phase} — ${consumer.title}`,\n `- description: ${consumer.description}`,\n `- acceptance: ${consumer.acceptance}`,\n `- inputs: ${consumer.inputs.join(', ') || '—'}`,\n `- outputs: ${consumer.outputs.join(', ') || '—'}`,\n `- dependsOn: ${consumer.dependsOn.join(', ') || '—'}`,\n '',\n ]),\n ].join('\\n').trim();\n }\n\n /**\n * DEBUG 模式下扩展 allowedWrites:\n * - 当前 Step 的 outputs(永远可写)\n * - 依赖链(dependsOn 闭包)上 CODE / 测试 / DEBUG 步骤的 outputs\n * 不放开依赖清单(renderer/HIGH_LEVEL_DESIGN 拥有)以外的非源码产物。\n */\n private computeDebugAllowedWrites(plan: Plan, step: Step): string[] {\n const byId = new Map(plan.steps.map((s) => [s.id, s]));\n const seen = new Set<string>();\n const stack = [...step.dependsOn];\n while (stack.length > 0) {\n const id = stack.pop()!;\n if (seen.has(id)) continue;\n seen.add(id);\n const s = byId.get(id);\n if (s) stack.push(...s.dependsOn);\n }\n const out = new Set<string>(step.outputs);\n for (const id of seen) {\n const s = byId.get(id);\n if (!s) continue;\n if (s.phase !== 'CODE' && s.phase !== 'DEBUG' && !this.isVModelTestPhase(s.phase)) continue;\n for (const o of s.outputs) {\n if (o === this.profile.manifestFile) continue;\n out.add(o);\n }\n }\n return [...out];\n }\n\n /**\n * Normal Step write scope.\n *\n * Normal Step write scope: each phase may only write declared outputs. Broader\n * repair writes are handled by computeDebugAllowedWrites().\n */\n private computeStepAllowedWrites(plan: Plan, step: Step): string[] {\n const out = new Set<string>(step.outputs);\n void plan;\n return [...out];\n }\n\n private isRefactorWritablePath(rel: string): boolean {\n const normalized = rel.replace(/\\\\/g, '/');\n if (!this.profile.codeExtensions.some((ext) => normalized.endsWith(ext))) return false;\n return normalized.startsWith('src/') || normalized.startsWith('tests/');\n }\n\n private stepContextChars(plan: Plan, step: Step): number {\n return [\n plan.requirementDigest,\n plan.globalPrompt,\n plan.baselineSummary,\n plan.userAddenda,\n step.title,\n step.description,\n step.systemPrompt,\n step.acceptance,\n step.inputs.join('\\n'),\n step.outputs.join('\\n'),\n ].join('\\n').length;\n }\n}\n\nfunction dedup<T>(arr: T[]): T[] {\n return [...new Set(arr)];\n}\n\nfunction stepTransitivelyDependsOn(\n step: Step,\n targetId: string,\n byId: Map<string, Step>,\n): boolean {\n const seen = new Set<string>();\n const stack = [...step.dependsOn];\n while (stack.length > 0) {\n const current = stack.pop()!;\n if (current === targetId) return true;\n if (seen.has(current)) continue;\n seen.add(current);\n const dep = byId.get(current);\n if (dep) stack.push(...dep.dependsOn);\n }\n return false;\n}\n\nfunction inferRepairMode(\n toolCalls: Array<{ tool: string; ok: boolean; summary?: string; error?: string }>,\n): 'patch' | 'rewrite' | 'patch-or-rewrite' {\n const successful = toolCalls.filter((call) => call.ok).map((call) => call.tool);\n const usedPatch = successful.some((tool) => tool === 'apply_patch' || tool === 'replace_in_file');\n const usedRewrite = successful.some((tool) => tool === 'write_file' || tool === 'append_file');\n if (usedPatch && usedRewrite) return 'patch-or-rewrite';\n if (usedPatch) return 'patch';\n return 'rewrite';\n}\n","// Spinner wrapper:在 pkg 打包后的二进制中,ora(包括 hideCursor:false 模式)\n// 仍会在 V8 snapshot context 与 TTY 原生句柄交互时触发 SIGSEGV——疑似 ora 内部\n// is-interactive / signal-exit / restore-cursor 链路对原生 stdout 句柄做了不兼容\n// snapshot 的探测。最稳妥的方案是 pkg 运行时使用一个只依赖 setInterval +\n// process.stderr.write 的最小动画 spinner,零原生依赖。\nimport oraReal, { type Ora } from 'ora';\n\nconst isPkg = typeof (process as unknown as { pkg?: unknown }).pkg !== 'undefined';\ninterface SimpleSpinner {\n start(text?: string): SimpleSpinner;\n succeed(text?: string): SimpleSpinner;\n fail(text?: string): SimpleSpinner;\n stop(): SimpleSpinner;\n text: string;\n}\n\nclass PlainSpinner implements SimpleSpinner {\n text: string;\n constructor(text: string) {\n this.text = text;\n }\n start(text?: string): this {\n if (text) this.text = text;\n process.stderr.write(`… ${this.text}\\n`);\n return this;\n }\n succeed(text?: string): this {\n process.stderr.write(`✔ ${text ?? this.text}\\n`);\n return this;\n }\n fail(text?: string): this {\n process.stderr.write(`✖ ${text ?? this.text}\\n`);\n return this;\n }\n stop(): this {\n return this;\n }\n}\n\n/** pkg 二进制下用:纯 setInterval + stderr 写控制字符的 mini spinner,无原生依赖。 */\nclass TtyMiniSpinner implements SimpleSpinner {\n text: string;\n private frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n private idx = 0;\n private timer: NodeJS.Timeout | null = null;\n constructor(text: string) {\n this.text = text;\n }\n private render(): void {\n const frame = this.frames[this.idx++ % this.frames.length];\n // \\r 回车 + 清行;只写 stderr 不污染 stdout 管道。\n process.stderr.write(`\\r\\x1b[2K${frame} ${this.text}`);\n }\n start(text?: string): this {\n if (text) this.text = text;\n this.render();\n this.timer = setInterval(() => this.render(), 100);\n if (typeof this.timer.unref === 'function') this.timer.unref();\n return this;\n }\n private end(symbol: string, text?: string): this {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n process.stderr.write(`\\r\\x1b[2K${symbol} ${text ?? this.text}\\n`);\n return this;\n }\n succeed(text?: string): this {\n return this.end('✔', text);\n }\n fail(text?: string): this {\n return this.end('✖', text);\n }\n stop(): this {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n process.stderr.write('\\r\\x1b[2K');\n }\n return this;\n }\n}\n\nexport function spinner(text: string, options: { animate?: boolean } = {}): Ora | SimpleSpinner {\n // LLM 调用自身已有模型/计时流式状态行;外层只打印静态起止,避免两个动画争抢光标。\n if (options.animate === false || !process.stdout.isTTY) return new PlainSpinner(text);\n if (isPkg) return new TtyMiniSpinner(text);\n return oraReal(text);\n}\n","import { ToolRegistry } from './types.js';\nimport { readFileTool, writeFileTool, appendFileTool, listDirTool } from './fs.js';\nimport { applyPatchTool } from './patch.js';\nimport {\n runProgramTool,\n runPythonTool,\n runTestsTool,\n installDepsTool,\n pipInstallTool,\n} from './sandbox.js';\nimport { replaceInFileTool, codeSearchTool, analyzeErrorTool } from './edit.js';\nimport { addDependencyTool } from './deps.js';\nimport { httpFetchTool } from './net.js';\n\nexport { ToolRegistry, isAllowedWrite } from './types.js';\nexport type {\n Tool,\n ToolContext,\n ToolExecutionEvent,\n ToolExecutionReporter,\n ToolPermissionDecision,\n ToolPermissionOperation,\n ToolPermissionRequest,\n ToolPermissionRequester,\n ToolResult,\n} from './types.js';\nexport { EditGuard } from './guard.js';\nexport type { EditRecord } from './guard.js';\nexport { resolveWriteChunkBytes, DEFAULT_WRITE_CHUNK_BYTES } from './fs.js';\nexport type { WriteChunkBytes, WriteChunkBudgetContext } from './fs.js';\n\nexport function buildDefaultRegistry(): ToolRegistry {\n const reg = new ToolRegistry();\n // 读\n reg.register(readFileTool);\n reg.register(listDirTool);\n reg.register(codeSearchTool);\n // 写\n reg.register(writeFileTool);\n reg.register(appendFileTool);\n reg.register(applyPatchTool);\n reg.register(replaceInFileTool);\n reg.register(addDependencyTool);\n // 运行(语言中立名 + 兼容旧名)\n reg.register(runProgramTool);\n reg.register(runPythonTool);\n reg.register(runTestsTool);\n reg.register(installDepsTool);\n reg.register(pipInstallTool);\n // 网络\n reg.register(httpFetchTool);\n // 分析\n reg.register(analyzeErrorTool);\n return reg;\n}\n","import path from 'node:path';\nimport { promises as fs } from 'node:fs';\nimport { isAllowedWrite, type Tool } from './types.js';\n\nexport const readFileTool: Tool<{ path: string; maxBytes?: number }, { content: string }> = {\n name: 'read_file',\n description: '读取 workspace 内的文本文件。',\n argsSchema: { path: 'string', maxBytes: 'number?' },\n async run(args, ctx) {\n try {\n const abs = ctx.ws.abs(args.path);\n const stat = await fs.stat(abs);\n if (!stat.isFile()) return { ok: false, error: 'not a file' };\n const buf = await fs.readFile(abs);\n const limit = args.maxBytes ?? 200_000;\n const content =\n buf.byteLength > limit\n ? buf.subarray(0, limit).toString('utf8') + `\\n... [truncated ${buf.byteLength - limit} bytes]`\n : buf.toString('utf8');\n return { ok: true, data: { content }, summary: `read ${args.path} (${buf.byteLength}B)` };\n } catch (err) {\n return { ok: false, error: (err as Error).message };\n }\n },\n};\n\nexport type WriteChunkBytes = number | 'auto';\n\nexport interface WriteChunkBudgetContext {\n phase?: string;\n role?: string;\n debug?: boolean;\n tools?: string[];\n outputs?: string[];\n allowedWrites?: string[];\n contextChars?: number;\n}\n\n/** 单次写入默认字节预算:保护 JSON 工具调用稳定性;大工程应靠模块/函数边界增量写入。 */\nexport const DEFAULT_WRITE_CHUNK_BYTES = 6000;\nconst AUTO_WRITE_CHUNK_HARD_CAP_BYTES = 18_000;\n\nexport function resolveWriteChunkBytes(\n configured: WriteChunkBytes | undefined,\n ctx: WriteChunkBudgetContext = {},\n): number {\n if (typeof configured === 'number') return configured;\n\n const phaseBonus: Record<string, number> = {\n REQUIREMENT_ANALYSIS: 500,\n HIGH_LEVEL_DESIGN: 1500,\n DETAILED_DESIGN: 1500,\n CODE: 2500,\n UNIT_TEST: 2000,\n INTEGRATION_TEST: 2000,\n MODULE_TEST: 2200,\n FUNCTIONAL_TEST: 1800,\n DEBUG: 2500,\n };\n const tools = new Set(ctx.tools ?? []);\n const outputBonus = Math.min((ctx.outputs?.length ?? 0) * 500, 3000);\n const contextBonus = Math.min(Math.ceil((ctx.contextChars ?? 0) / 6000) * 1000, 4000);\n const appendBonus = tools.has('append_file') ? 1500 : 0;\n const debugBonus = ctx.debug ? 1500 : 0;\n\n const dynamic =\n DEFAULT_WRITE_CHUNK_BYTES +\n (phaseBonus[ctx.phase ?? ''] ?? 0) +\n outputBonus +\n contextBonus +\n appendBonus +\n debugBonus;\n\n return Math.min(dynamic, AUTO_WRITE_CHUNK_HARD_CAP_BYTES);\n}\n\nexport const writeFileTool: Tool<{ path: string; content: string }, { bytes: number }> = {\n name: 'write_file',\n description:\n '在当前 Step writable allowlist 内创建或覆盖文件(单次 content 受运行时 chunk limit 限制;大文件按模块/函数/类边界用 write_file 首段 + append_file 续写)。注意:runtime 管理的依赖清单请用 add_dependency 维护。',\n argsSchema: { path: 'string', content: 'string' },\n async run(args, ctx) {\n if (args.path === 'requirements.txt' || args.path.endsWith('/requirements.txt')) {\n return {\n ok: false,\n error:\n 'write denied: requirements.txt 由 plan.dependencies 在 xcompiler run 启动时种入并由 add_dependency 工具维护;请改用 add_dependency 工具新增依赖(一行一包,不要再 write_file 直接覆盖)。',\n };\n }\n if (!isAllowedWrite(args.path, ctx.allowedWrites)) {\n return { ok: false, error: `write denied: ${args.path} not in step writable allowlist` };\n }\n const size = Buffer.byteLength(args.content);\n const limit = resolveWriteChunkBytes(ctx.writeChunkBytes);\n if (size > limit) {\n return {\n ok: false,\n error:\n `write_file 单次内容 ${size}B 超过本 Step chunk limit ${limit}B。请将大文件拆分写入:` +\n `第 1 个 action 用 write_file 写头部(≤${limit}B,覆盖现有文件),` +\n `后续 action 用 append_file 按模块/函数/类边界逐段追加(每段 ≤${limit}B)。同一轮可放多个 actions。`,\n };\n }\n try {\n const abs = ctx.ws.abs(args.path);\n await fs.mkdir(path.dirname(abs), { recursive: true });\n await fs.writeFile(abs, args.content, 'utf8');\n return {\n ok: true,\n data: { bytes: size },\n summary: `wrote ${args.path} (${size}B)`,\n };\n } catch (err) {\n return { ok: false, error: (err as Error).message };\n }\n },\n};\n\n/**\n * append_file:把一段内容追加到当前 Step writable allowlist 内的文件末尾。\n * - 单次同样受运行时 chunk limit 限制,鼓励按逻辑段(一个函数 / 一个类)切分。\n * - 文件不存在时自动创建(等价于 write_file 写第一段,便于鲁棒续写)。\n * - 注意:append_file 不会自动添加换行;若调用者忘了在 content 末尾收尾换行,下一段会拼接在同一行。\n */\nexport const appendFileTool: Tool<{ path: string; content: string }, { bytes: number; total: number }> = {\n name: 'append_file',\n description:\n '把一段内容追加到当前 Step writable allowlist 内文件末尾(单次 content 受运行时 chunk limit 限制,用于配合 write_file 分块写出大文件)。',\n argsSchema: { path: 'string', content: 'string' },\n async run(args, ctx) {\n if (args.path === 'requirements.txt' || args.path.endsWith('/requirements.txt')) {\n return { ok: false, error: 'append denied: requirements.txt 由 add_dependency 维护。' };\n }\n if (!isAllowedWrite(args.path, ctx.allowedWrites)) {\n return { ok: false, error: `append denied: ${args.path} not in step writable allowlist` };\n }\n const size = Buffer.byteLength(args.content);\n const limit = resolveWriteChunkBytes(ctx.writeChunkBytes);\n if (size > limit) {\n return {\n ok: false,\n error: `append_file 单次内容 ${size}B 超过本 Step chunk limit ${limit}B;请按模块/函数/类边界进一步拆分。`,\n };\n }\n try {\n const abs = ctx.ws.abs(args.path);\n await fs.mkdir(path.dirname(abs), { recursive: true });\n await fs.appendFile(abs, args.content, 'utf8');\n let total = size;\n try {\n total = (await fs.stat(abs)).size;\n } catch {\n /* ignore */\n }\n return {\n ok: true,\n data: { bytes: size, total },\n summary: `appended ${size}B to ${args.path} (now ${total}B)`,\n };\n } catch (err) {\n return { ok: false, error: (err as Error).message };\n }\n },\n};\n\nexport const listDirTool: Tool<{ path?: string }, { entries: string[] }> = {\n name: 'list_dir',\n description: '列出指定目录下的条目(仅文件名)。',\n argsSchema: { path: 'string?' },\n async run(args, ctx) {\n try {\n const abs = ctx.ws.abs(args.path ?? '.');\n const entries = await fs.readdir(abs, { withFileTypes: true });\n return {\n ok: true,\n data: { entries: entries.map((e) => (e.isDirectory() ? e.name + '/' : e.name)) },\n summary: `list ${args.path ?? '.'}: ${entries.length} entries`,\n };\n } catch (err) {\n return { ok: false, error: (err as Error).message };\n }\n },\n};\n","import path from 'node:path';\nimport { promises as fs } from 'node:fs';\nimport { isAllowedWrite, type Tool } from './types.js';\n\n/**\n * 极简的 unified-diff patcher。仅支持:\n * - 单文件 patch 中的多个 hunk\n * - 文件头形如 `--- a/path` `+++ b/path`,或 `--- path` `+++ path`\n * - 行级 +/-/\" \"(空格上下文)\n * - 不支持二进制 / 重命名 / 模式变更\n *\n * 设计目标:覆盖 LLM 在 CODE/DEBUG 阶段最常产生的差异格式;不为了通用 git apply 兼容性而过度复杂化。\n */\nexport const applyPatchTool: Tool<{ patch: string }, { changedFiles: string[] }> = {\n name: 'apply_patch',\n description: '应用 unified diff 补丁;目标文件必须在当前 Step writable allowlist 内。',\n argsSchema: { patch: 'string' },\n async run(args, ctx) {\n const fileDiffs = parseUnifiedDiff(args.patch);\n if (fileDiffs.length === 0) return { ok: false, error: 'no file diff parsed' };\n const changed: string[] = [];\n for (const fd of fileDiffs) {\n if (!isAllowedWrite(fd.target, ctx.allowedWrites)) {\n return { ok: false, error: `write denied: ${fd.target} not in step writable allowlist` };\n }\n const abs = ctx.ws.abs(fd.target);\n let original = '';\n try {\n original = await fs.readFile(abs, 'utf8');\n } catch {\n if (!fd.isNewFile) return { ok: false, error: `target file missing: ${fd.target}` };\n }\n const next = applyHunks(original, fd.hunks);\n if (next.error) return { ok: false, error: `${fd.target}: ${next.error}` };\n await fs.mkdir(path.dirname(abs), { recursive: true });\n await fs.writeFile(abs, next.content, 'utf8');\n changed.push(fd.target);\n }\n return { ok: true, data: { changedFiles: changed }, summary: `patched ${changed.join(', ')}` };\n },\n};\n\ninterface Hunk {\n oldStart: number;\n oldLines: number;\n newStart: number;\n newLines: number;\n lines: string[]; // 包含行首的 ' ' / '+' / '-' 字符\n}\ninterface FileDiff {\n source: string;\n target: string;\n isNewFile: boolean;\n hunks: Hunk[];\n}\n\nfunction stripPrefix(p: string): string {\n if (p === '/dev/null') return '/dev/null';\n return p.replace(/^[ab]\\//, '');\n}\n\nexport function parseUnifiedDiff(patch: string): FileDiff[] {\n const lines = patch.split(/\\r?\\n/);\n const out: FileDiff[] = [];\n let i = 0;\n while (i < lines.length) {\n const line = lines[i] ?? '';\n if (line.startsWith('--- ')) {\n const src = stripPrefix(line.slice(4).trim().split('\\t')[0] ?? '');\n const nextRaw = lines[i + 1] ?? '';\n if (!nextRaw.startsWith('+++ ')) {\n i++;\n continue;\n }\n const tgt = stripPrefix(nextRaw.slice(4).trim().split('\\t')[0] ?? '');\n const isNew = src === '/dev/null';\n const target = tgt === '/dev/null' ? src : tgt;\n i += 2;\n const hunks: Hunk[] = [];\n while (i < lines.length && (lines[i] ?? '').startsWith('@@')) {\n const header = lines[i] ?? '';\n const m = /^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/.exec(header);\n if (!m) return out; // 解析失败,放弃\n const oldStart = Number(m[1] ?? '0');\n const oldLines = m[2] ? Number(m[2]) : 1;\n const newStart = Number(m[3] ?? '0');\n const newLines = m[4] ? Number(m[4]) : 1;\n i++;\n const body: string[] = [];\n while (i < lines.length) {\n const l = lines[i] ?? '';\n if (l.startsWith('@@') || l.startsWith('--- ')) break;\n if (l.startsWith('+') || l.startsWith('-') || l.startsWith(' ')) {\n body.push(l);\n i++;\n } else if (l === '') {\n // 允许 patch 末尾空行:仅在没有更多内容时退出\n if (i === lines.length - 1) {\n i++;\n break;\n }\n // 否则把它当作上下文中的空行\n body.push(' ');\n i++;\n } else if (l.startsWith('\\\')) {\n i++;\n } else {\n break;\n }\n }\n hunks.push({ oldStart, oldLines, newStart, newLines, lines: body });\n }\n out.push({ source: src, target, isNewFile: isNew, hunks });\n } else {\n i++;\n }\n }\n return out;\n}\n\nfunction applyHunks(original: string, hunks: Hunk[]): { content: string; error?: string } {\n const src = original.length === 0 ? [] : original.split('\\n');\n // 处理末尾换行:按 split 行末若文件以 \\n 结尾,会有一个空字符串\n const trailingNL = original.endsWith('\\n');\n const body = trailingNL ? src.slice(0, -1) : src;\n\n const out: string[] = [];\n let cursor = 0; // 0-based index into body\n for (const h of hunks) {\n const hunkStart = h.oldStart === 0 ? 0 : h.oldStart - 1;\n if (hunkStart < cursor) {\n return { content: '', error: `hunk overlap at line ${h.oldStart}` };\n }\n // 复制中间未变化的行\n out.push(...body.slice(cursor, hunkStart));\n cursor = hunkStart;\n for (const ln of h.lines) {\n const tag = ln[0];\n const text = ln.slice(1);\n if (tag === ' ') {\n if (body[cursor] !== text) {\n return {\n content: '',\n error: `context mismatch at old line ${cursor + 1}: expected ${JSON.stringify(text)}, got ${JSON.stringify(body[cursor])}`,\n };\n }\n out.push(text);\n cursor++;\n } else if (tag === '-') {\n if (body[cursor] !== text) {\n return {\n content: '',\n error: `delete mismatch at old line ${cursor + 1}: expected ${JSON.stringify(text)}, got ${JSON.stringify(body[cursor])}`,\n };\n }\n cursor++;\n } else if (tag === '+') {\n out.push(text);\n }\n }\n }\n out.push(...body.slice(cursor));\n return { content: out.join('\\n') + (trailingNL || out.length > 0 ? '\\n' : '') };\n}\n","import type { Tool } from './types.js';\nimport { detectNetworkApiFailureInExec } from '../core/network_api_gate.js';\n\n/** 截取多行文本最后 N 行,用于在 ToolResult.summary 里给 LLM 直接看的失败上下文。\n * 仅在失败时调用——成功路径上 stdout 通常很长且无价值,没必要塞回 prompt。 */\nfunction tailLines(text: string, n: number): string {\n if (!text) return '';\n const lines = text.replace(/\\r\\n?/g, '\\n').split('\\n');\n return lines.slice(-n).join('\\n');\n}\n\n/** 为 run_python / run_tests 失败结果构造可见的 summary:基础行 + stderr/stdout 最后 N 行。\n * 把硬截断写成单字节计数避免极端 case 把 prompt 撑爆(默认 4KB)。 */\nfunction buildRunSummary(\n base: string,\n r: { stdout: string; stderr: string },\n opts: { tailLines?: number; maxBytes?: number } = {},\n): string {\n const N = opts.tailLines ?? 60;\n const MAX = opts.maxBytes ?? 4000;\n const errTail = tailLines(r.stderr ?? '', N).trim();\n const outTail = tailLines(r.stdout ?? '', N).trim();\n const parts = [base];\n if (errTail) parts.push('--- stderr (last lines) ---', errTail);\n if (outTail) parts.push('--- stdout (last lines) ---', outTail);\n let s = parts.join('\\n');\n if (s.length > MAX) {\n s = s.slice(0, MAX) + `\\n... [truncated, total ${s.length}B]`;\n }\n return s;\n}\n\nexport const runProgramTool: Tool<\n { args: string[]; cwd?: string; timeoutMs?: number },\n { exitCode: number; stdout: string; stderr: string; timedOut: boolean }\n> = {\n name: 'run_program',\n description:\n '在沙盒内运行工程入口程序,args 传给运行时(Python: python <args>;TypeScript: npx tsx <args>)。',\n argsSchema: { args: 'string[]', cwd: 'string?', timeoutMs: 'number?' },\n async run(args, ctx) {\n const r = await ctx.sandbox.runProgram(args.args, { cwd: args.cwd, timeoutMs: args.timeoutMs });\n const networkFailure = detectNetworkApiFailureInExec(r);\n const ok = r.exitCode === 0 && !r.timedOut && !networkFailure;\n const cmd = ctx.language === 'typescript' ? 'npx tsx' : 'python';\n const base = `${cmd} ${args.args.join(' ')} exit=${r.exitCode} ${r.timedOut ? '(timeout)' : ''}`.trim();\n return {\n ok,\n data: { exitCode: r.exitCode, stdout: r.stdout, stderr: r.stderr, timedOut: r.timedOut },\n summary: ok\n ? base\n : buildRunSummary(networkFailure ? `${base}\\n${networkFailure.message}\\nEvidence: ${networkFailure.evidence}` : base, r),\n };\n },\n};\n\n/** @deprecated 旧工具名 run_python;等价于 run_program,保留以兼容历史 plan。 */\nexport const runPythonTool: Tool<\n { args: string[]; cwd?: string; timeoutMs?: number },\n { exitCode: number; stdout: string; stderr: string; timedOut: boolean }\n> = { ...runProgramTool, name: 'run_python' };\n\nexport const runTestsTool: Tool<\n { args?: string[]; cwd?: string; timeoutMs?: number },\n { exitCode: number; stdout: string; stderr: string; timedOut: boolean; passed: boolean }\n> = {\n name: 'run_tests',\n description:\n '在沙盒内运行测试套件(Python: pytest;TypeScript: npm test / Vitest),可指定额外参数。' +\n '失败时 summary 自动附带 stderr/stdout 末尾若干行,调用方可直接据此修复。',\n argsSchema: { args: 'string[]?', cwd: 'string?', timeoutMs: 'number?' },\n async run(args, ctx) {\n const r = await ctx.sandbox.runTests(args.args ?? [], { cwd: args.cwd, timeoutMs: args.timeoutMs });\n const networkFailure = detectNetworkApiFailureInExec(r);\n const passed = r.exitCode === 0 && !r.timedOut && !networkFailure;\n const cmd = ctx.language === 'typescript' ? 'npm test' : 'pytest';\n const base = `${cmd} exit=${r.exitCode} ${r.timedOut ? '(timeout)' : ''}`.trim();\n return {\n ok: passed,\n data: {\n exitCode: r.exitCode,\n stdout: r.stdout,\n stderr: r.stderr,\n timedOut: r.timedOut,\n passed,\n },\n summary: passed\n ? base\n : buildRunSummary(networkFailure ? `${base}\\n${networkFailure.message}\\nEvidence: ${networkFailure.evidence}` : base, r),\n };\n },\n};\n\nexport const installDepsTool: Tool<{ packages: string[] }, { exitCode: number; stdout: string; stderr: string }> = {\n name: 'install_deps',\n description:\n '在沙盒内安装一组额外依赖(Python: pip install;TypeScript: npm install)。不会自动写回依赖清单。',\n argsSchema: { packages: 'string[]' },\n async run(args, ctx) {\n const r = await ctx.sandbox.installDeps(args.packages);\n const ok = r.exitCode === 0;\n const cmd = ctx.language === 'typescript' ? 'npm install' : 'pip install';\n const base = `${cmd} ${args.packages.join(' ')} exit=${r.exitCode}`;\n return {\n ok,\n data: { exitCode: r.exitCode, stdout: r.stdout, stderr: r.stderr },\n summary: ok ? base : buildRunSummary(base, r),\n };\n },\n};\n\n/** @deprecated 旧工具名 pip_install;等价于 install_deps,保留以兼容历史 plan。 */\nexport const pipInstallTool: Tool<{ packages: string[] }, { exitCode: number; stdout: string; stderr: string }> = {\n ...installDepsTool,\n name: 'pip_install',\n};\n","import path from 'node:path';\nimport { promises as fs } from 'node:fs';\nimport { isAllowedWrite, type Tool } from './types.js';\n\n/**\n * 字符串替换工具:在已有文件内查找 `find` 并替换为 `replace`。\n * - 默认要求精确出现 1 次;可通过 `expectedCount` 改为指定次数。\n * - 与 apply_patch 互补:对小修改更稳,不依赖上下文行号。\n */\nexport const replaceInFileTool: Tool<\n { path: string; find: string; replace: string; expectedCount?: number },\n { occurrences: number }\n> = {\n name: 'replace_in_file',\n description: '把当前 Step writable allowlist 内目标文件的 find 字符串精确替换为 replace(默认要求出现 1 次)。',\n argsSchema: { path: 'string', find: 'string', replace: 'string', expectedCount: 'number?' },\n async run(args, ctx) {\n if (!isAllowedWrite(args.path, ctx.allowedWrites)) {\n return { ok: false, error: `write denied: ${args.path}` };\n }\n if (!args.find) return { ok: false, error: 'find must be non-empty' };\n if (args.find === args.replace) {\n return {\n ok: false,\n error:\n 'no-op edit refused: find === replace(替换前后字符串完全相同)。请确认你真正要修改的差异;如只想读取文件请改用 read_file,如要整文件重写请用 write_file。',\n };\n }\n const abs = ctx.ws.abs(args.path);\n let original: string;\n try {\n original = await fs.readFile(abs, 'utf8');\n } catch {\n return { ok: false, error: `file not found: ${args.path}` };\n }\n const expected = args.expectedCount ?? 1;\n const parts = original.split(args.find);\n const occurrences = parts.length - 1;\n if (occurrences !== expected) {\n // 帮 LLM 下一轮修正:返回一个提示块。含(1)文件总长度,\n // (2)按 find 的首行在原文中模糊定位的周边上下文(3 行)。\n // 这样模型下一轮能看到「文件中实际是什么样」,避免反复提交同样的错误 find。\n const firstFindLine = (args.find.split('\\n')[0] ?? '').trim();\n const hint: string[] = [];\n hint.push(`expected ${expected} occurrences of find, found ${occurrences} in ${args.path} (file size=${Buffer.byteLength(original)}B)`);\n if (firstFindLine.length >= 4) {\n // 掏出含 firstFindLine 前 8个词符的行作为「似是该区域」\n const probe = firstFindLine.slice(0, Math.min(20, firstFindLine.length));\n const lines = original.split('\\n');\n const matches = lines\n .map((l, i) => ({ i, l }))\n .filter((x) => x.l.includes(probe))\n .slice(0, 3);\n if (matches.length > 0) {\n hint.push('提示:以下是原文中似是你要改的区域(请以下面的字节为准重新起 find):');\n for (const m of matches) {\n const start = Math.max(0, m.i - 1);\n const end = Math.min(lines.length, m.i + 2);\n for (let k = start; k < end; k++) {\n hint.push(` ${k + 1}: ${JSON.stringify(lines[k])}`);\n }\n hint.push(' ---');\n }\n } else {\n hint.push('提示:未在原文中找到 find 的首行片段。考虑改用 read_file 读出原文,再用 apply_patch 精确修改;若要整文件重写,必须低于当前运行时 chunk limit。');\n }\n }\n return { ok: false, error: hint.join('\\n') };\n }\n const next = parts.join(args.replace);\n await fs.mkdir(path.dirname(abs), { recursive: true });\n await fs.writeFile(abs, next, 'utf8');\n return {\n ok: true,\n data: { occurrences },\n summary: `replaced ${occurrences}× in ${args.path}`,\n };\n },\n};\n\n/**\n * 简易代码搜索:在指定子目录内做大小写敏感的子串匹配(行级)。\n * 返回最多 N 条匹配,每条含 path / line / text。\n */\nexport const codeSearchTool: Tool<\n { query: string; root?: string; maxResults?: number; ext?: string[] },\n { matches: Array<{ path: string; line: number; text: string }> }\n> = {\n name: 'code_search',\n description: '在 workspace 内按子串搜索代码(行级匹配)。',\n argsSchema: { query: 'string', root: 'string?', maxResults: 'number?', ext: 'string[]?' },\n async run(args, ctx) {\n if (!args.query) return { ok: false, error: 'query empty' };\n const root = ctx.ws.abs(args.root ?? '.');\n const max = args.maxResults ?? 50;\n const exts = args.ext && args.ext.length > 0 ? new Set(args.ext.map((e) => (e.startsWith('.') ? e : '.' + e))) : null;\n const matches: Array<{ path: string; line: number; text: string }> = [];\n await walk(root, async (abs) => {\n if (exts && !exts.has(path.extname(abs))) return;\n // 跳过常见非源码目录\n if (/(?:^|\\/)(node_modules|\\.git|\\.sandbox|\\.xcompiler|dist|__pycache__)\\//.test(abs)) return;\n let content: string;\n try {\n const stat = await fs.stat(abs);\n if (stat.size > 512_000) return;\n content = await fs.readFile(abs, 'utf8');\n } catch {\n return;\n }\n const rel = path.relative(ctx.ws.root, abs);\n const lines = content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n if ((lines[i] ?? '').includes(args.query)) {\n matches.push({ path: rel, line: i + 1, text: (lines[i] ?? '').slice(0, 240) });\n if (matches.length >= max) return;\n }\n }\n });\n return {\n ok: true,\n data: { matches },\n summary: `code_search \"${args.query}\" → ${matches.length} hits`,\n };\n },\n};\n\nasync function walk(dir: string, onFile: (abs: string) => Promise<void>): Promise<void> {\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries) {\n const abs = path.join(dir, e.name);\n if (e.isDirectory()) await walk(abs, onFile);\n else if (e.isFile()) await onFile(abs);\n }\n}\n\n/**\n * analyze_error:把一段 stderr/stdout 文本解析成结构化要点,便于 LLM 修复。\n * 仅做正则启发式:抓 Python traceback 最末一帧、pytest FAILED 行、ImportError/ModuleNotFoundError。\n */\nexport const analyzeErrorTool: Tool<\n { text: string },\n {\n kind: string;\n summary: string;\n file?: string;\n line?: number;\n missingModule?: string;\n failedTests: string[];\n }\n> = {\n name: 'analyze_error',\n description: '解析 Python 错误/测试输出,给出结构化摘要。',\n argsSchema: { text: 'string' },\n async run(args) {\n const t = args.text ?? '';\n const out: {\n kind: string;\n summary: string;\n file?: string;\n line?: number;\n missingModule?: string;\n failedTests: string[];\n } = { kind: 'unknown', summary: '', failedTests: [] };\n\n const mn = /ModuleNotFoundError: No module named ['\"]([^'\"]+)['\"]/.exec(t);\n if (mn) {\n out.kind = 'ModuleNotFoundError';\n out.missingModule = mn[1];\n out.summary = `缺失模块 ${mn[1]},需要 pip 安装并写回 requirements.txt`;\n }\n\n const ie = /ImportError: ([^\\n]+)/.exec(t);\n if (!mn && ie) {\n out.kind = 'ImportError';\n out.summary = ie[1] ?? '';\n }\n\n // 抓最末一帧 File \"...\", line N\n const frames = [...t.matchAll(/File \"([^\"]+)\", line (\\d+)/g)];\n const last = frames[frames.length - 1];\n if (last) {\n out.file = last[1];\n out.line = Number(last[2]);\n }\n\n // pytest FAILED 行\n const failed = [...t.matchAll(/^FAILED\\s+([^\\s]+)/gm)].map((m) => m[1] ?? '');\n out.failedTests = failed.filter((s): s is string => !!s);\n if (out.failedTests.length > 0 && out.kind === 'unknown') {\n out.kind = 'TestFailure';\n out.summary = `${out.failedTests.length} 个测试失败`;\n }\n\n // 普通异常摘要(最后一行非空)\n if (out.kind === 'unknown') {\n const lastLine = t\n .split('\\n')\n .map((s) => s.trim())\n .filter(Boolean)\n .at(-1);\n if (lastLine) {\n out.kind = lastLine.split(':')[0] ?? 'Error';\n out.summary = lastLine;\n } else {\n out.summary = '(no output)';\n }\n }\n return { ok: true, data: out, summary: `${out.kind}: ${out.summary}` };\n },\n};\n","import { promises as fs } from 'node:fs';\nimport type { Tool } from './types.js';\n\n/**\n * add_dependency:把一组依赖追加到语言对应的依赖清单并重建沙盒。\n * - Python → requirements.txt(去重 + 排序)\n * - TypeScript → package.json.dependencies(去重 + 排序,版本占位为 \"*\")\n *\n * 这是受控文件:无需也不应该要求它出现在 Step.outputs 里。\n */\nexport const addDependencyTool: Tool<\n { packages: string[] },\n { added: string[]; finalLines: string[] }\n> = {\n name: 'add_dependency',\n description: '向依赖清单追加依赖(python: requirements.txt;typescript: package.json)并重建沙盒。',\n argsSchema: { packages: 'string[]' },\n async run(args, ctx) {\n const manifestPath = ctx.language === 'typescript' ? 'package.json' : 'requirements.txt';\n const abs = ctx.ws.abs(manifestPath);\n const normalized = [...new Set(args.packages.map((p) => p.trim()).filter(Boolean))];\n const added: string[] = [];\n let final: string[];\n\n if (ctx.language === 'typescript') {\n const pkg = await fs\n .readFile(abs, 'utf8')\n .then((text) => JSON.parse(text) as Record<string, unknown>)\n .catch(() => ({} as Record<string, unknown>));\n const existingDeps =\n pkg.dependencies && typeof pkg.dependencies === 'object' && !Array.isArray(pkg.dependencies)\n ? { ...(pkg.dependencies as Record<string, string>) }\n : {};\n const before = new Set(Object.keys(existingDeps));\n for (const name of normalized) {\n if (!before.has(name)) added.push(name);\n existingDeps[name] = existingDeps[name] || '*';\n }\n final = Object.keys(existingDeps).sort();\n pkg.dependencies = Object.fromEntries(final.map((name) => [name, existingDeps[name] ?? '*']));\n await fs.writeFile(abs, JSON.stringify(pkg, null, 2) + '\\n', 'utf8');\n } else {\n let existing = '';\n try {\n existing = await fs.readFile(abs, 'utf8');\n } catch {\n /* new file */\n }\n const set = new Set<string>();\n for (const line of existing.split('\\n')) {\n const t = line.trim();\n if (t && !t.startsWith('#')) set.add(t);\n }\n const before = new Set(set);\n for (const p of normalized) {\n if (!before.has(p)) added.push(p);\n set.add(p);\n }\n final = [...set].sort();\n await fs.writeFile(abs, final.join('\\n') + '\\n', 'utf8');\n }\n try {\n await ctx.sandbox.build(manifestPath);\n } catch (err) {\n return {\n ok: false,\n error: `${manifestPath} 已写入,但沙盒重建失败:${(err as Error).message}`,\n };\n }\n return {\n ok: true,\n data: { added, finalLines: final },\n summary: `add_dependency ${manifestPath} +${added.length} (${added.join(', ') || 'none new'})`,\n };\n },\n};\n","import type { Tool } from './types.js';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { t } from '../i18n/index.js';\n\n/**\n * Network access tools.\n *\n * `http_fetch` is performed from the **XCompiler host** (Node side), so it works\n * regardless of the sandbox's network policy — useful when:\n * - the LLM needs to look up a web page / JSON API while planning or coding;\n * - python tests inside a `network=off` sandbox still need a small piece of\n * external data (the LLM fetches it once and writes it as a fixture).\n *\n * For Python code that itself needs to talk to the network, configure\n * `agent.sandbox_limits.network` in `config.yaml`:\n * - `download-only` (default) — outbound HTTP/HTTPS allowed, no inbound.\n * - `full` + `expose_ports: [8000]` — also publish container ports to\n * 127.0.0.1 on the host so host-side tests can reach the running app.\n */\n\ninterface HttpFetchArgs {\n url: string;\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD';\n headers?: Record<string, string>;\n body?: string;\n /** Total wall-clock timeout in ms. Default 15s. */\n timeoutMs?: number;\n /** Maximum body bytes to read. Default 256 KiB. */\n maxBytes?: number;\n /** Save the response body to this workspace-relative path instead of returning it. */\n saveAs?: string;\n}\n\ninterface HttpFetchData {\n status: number;\n ok: boolean;\n url: string;\n headers: Record<string, string>;\n contentType: string;\n bodyText?: string;\n truncated?: boolean;\n totalBytes?: number;\n savedTo?: string;\n}\n\nconst DEFAULT_TIMEOUT_MS = 15_000;\nconst DEFAULT_MAX_BYTES = 256 * 1024;\n\nexport const httpFetchTool: Tool<HttpFetchArgs, HttpFetchData> = {\n name: 'http_fetch',\n description:\n 'Fetch a URL from the XCompiler host (HTTP/HTTPS only). Returns status, headers and body text. ' +\n 'Use this to look up web pages, REST/JSON APIs, or to download a small fixture. ' +\n 'For binary or larger downloads, pass `saveAs: \"<rel-path>\"` to stream the body to a workspace file ' +\n '(must be inside the current step\\'s allowedWrites).',\n argsSchema: {\n url: 'string (http:// or https://)',\n method: 'string? (GET|POST|PUT|DELETE|HEAD, default GET)',\n headers: 'Record<string,string>?',\n body: 'string?',\n timeoutMs: 'number?',\n maxBytes: 'number?',\n saveAs: 'string? (workspace-relative path)',\n },\n async run(args, ctx) {\n if (typeof args.url !== 'string' || !/^https?:\\/\\//i.test(args.url)) {\n return { ok: false, error: 'http_fetch: url must start with http:// or https://' };\n }\n const method = (args.method ?? 'GET').toUpperCase();\n const timeoutMs = args.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const maxBytes = args.maxBytes ?? DEFAULT_MAX_BYTES;\n\n // Enforce allowedWrites for saveAs (same guard as fs tools).\n if (args.saveAs) {\n const { isAllowedWrite } = await import('./types.js');\n if (!isAllowedWrite(args.saveAs, ctx.allowedWrites)) {\n return {\n ok: false,\n error: `http_fetch: saveAs \"${args.saveAs}\" is not in allowedWrites=[${ctx.allowedWrites.join(', ')}]`,\n };\n }\n }\n\n const controller = new AbortController();\n const timer = timeoutMs > 0 ? setTimeout(() => controller.abort(), timeoutMs) : null;\n let res: Response;\n try {\n res = await fetch(args.url, {\n method,\n headers: args.headers,\n body: args.body,\n signal: controller.signal,\n redirect: 'follow',\n });\n } catch (err) {\n if (timer) clearTimeout(timer);\n const msg = (err as Error).message || String(err);\n return { ok: false, error: `http_fetch: request failed: ${msg}` };\n }\n\n const headers: Record<string, string> = {};\n res.headers.forEach((v, k) => {\n headers[k] = v;\n });\n const contentType = headers['content-type'] ?? '';\n\n if (args.saveAs) {\n // Stream-to-disk path — let the workspace handle the bytes; cap at maxBytes.\n const buf = Buffer.from(await res.arrayBuffer());\n if (timer) clearTimeout(timer);\n const trimmed = buf.length > maxBytes ? buf.subarray(0, maxBytes) : buf;\n const abs = ctx.ws.abs(args.saveAs);\n await fs.mkdir(path.dirname(abs), { recursive: true });\n await fs.writeFile(abs, trimmed);\n await ctx.audit?.event('tool.call', t().audit.httpFetchSaved(method, args.url, args.saveAs, trimmed.length), {\n messageId: 'audit.http_fetch_saved',\n stepId: ctx.stepId,\n status: res.status,\n });\n return {\n ok: res.ok,\n data: {\n status: res.status,\n ok: res.ok,\n url: res.url,\n headers,\n contentType,\n savedTo: args.saveAs,\n truncated: buf.length > maxBytes,\n totalBytes: buf.length,\n },\n summary: `http_fetch ${method} ${args.url} → ${res.status} (saved ${trimmed.length}B to ${args.saveAs})`,\n };\n }\n\n // Inline body — cap at maxBytes so a runaway server doesn't blow up the prompt.\n const arr = new Uint8Array(await res.arrayBuffer());\n if (timer) clearTimeout(timer);\n const truncated = arr.length > maxBytes;\n const slice = truncated ? arr.subarray(0, maxBytes) : arr;\n let bodyText: string;\n try {\n bodyText = new TextDecoder('utf-8', { fatal: false }).decode(slice);\n } catch {\n bodyText = `[binary response, ${arr.length} bytes; use saveAs to download]`;\n }\n await ctx.audit?.event('tool.call', t().audit.httpFetchResponse(method, args.url, res.status, arr.length), {\n messageId: 'audit.http_fetch_response',\n stepId: ctx.stepId,\n status: res.status,\n truncated,\n });\n return {\n ok: res.ok,\n data: {\n status: res.status,\n ok: res.ok,\n url: res.url,\n headers,\n contentType,\n bodyText,\n truncated,\n totalBytes: arr.length,\n },\n summary: `http_fetch ${method} ${args.url} → ${res.status} (${arr.length}B${truncated ? `, truncated to ${maxBytes}B` : ''})`,\n };\n },\n};\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { Workspace } from '../workspace/workspace.js';\nimport type { Tool, ToolContext, ToolResult } from './types.js';\n\n/**\n * EditGuard 给写类工具加一层守门:\n * - 累计行数上限(保护免被失控大改写)\n * - 写操作落审计日志:`logs/edits-<stepId>.jsonl`\n *\n * 接口与 Tool 一致,可通过 wrap() 包裹任意工具。\n */\n\nexport interface EditRecord {\n ts: string;\n stepId: string;\n tool: string;\n args: unknown;\n ok: boolean;\n summary?: string;\n error?: string;\n approxLines?: number;\n}\n\nexport interface EditGuardOptions {\n ws: Workspace;\n stepId: string;\n /**\n * 单 Step 内累计写入/修改行数上限,超过则后续写操作直接拒绝。\n * 传入数字时按固定值执行;传入/省略 auto 时按当前 Step 上下文估算。\n */\n maxLines?: number | 'auto';\n /** 用于 auto 行数预算的 Step/工具上下文。 */\n budgetContext?: EditGuardBudgetContext;\n /** edits 日志相对 workspace 的路径,默认 logs/edits-<stepId>.jsonl */\n logRelPath?: string;\n}\n\nconst WRITE_TOOLS = new Set(['write_file', 'append_file', 'apply_patch', 'replace_in_file', 'add_dependency']);\nconst DEFAULT_EDIT_LINES_PER_STEP = 400;\nconst AUTO_EDIT_LINES_HARD_CAP = 2400;\n\nexport interface EditGuardBudgetContext {\n phase?: string;\n role?: string;\n debug?: boolean;\n tools?: readonly string[];\n outputs?: readonly string[];\n allowedWrites?: readonly string[];\n contextChars?: number;\n}\n\nexport function resolveEditGuardMaxLines(\n maxLines: number | 'auto' | undefined,\n ctx: EditGuardBudgetContext = {},\n): number {\n if (typeof maxLines === 'number') return maxLines;\n\n const tools = new Set(ctx.tools ?? []);\n const writeToolBonus =\n (tools.has('write_file') ? 160 : 0) +\n (tools.has('append_file') ? 120 : 0) +\n (tools.has('apply_patch') ? 120 : 0) +\n (tools.has('replace_in_file') ? 80 : 0) +\n (tools.has('add_dependency') ? 20 : 0);\n\n const phaseBonus: Record<string, number> = {\n REQUIREMENT_ANALYSIS: 100,\n HIGH_LEVEL_DESIGN: 220,\n DETAILED_DESIGN: 180,\n CODE: 300,\n UNIT_TEST: 420,\n INTEGRATION_TEST: 420,\n MODULE_TEST: 420,\n FUNCTIONAL_TEST: 360,\n DEBUG: 560,\n };\n\n const writeTargets = [...(ctx.outputs ?? []), ...(ctx.allowedWrites ?? [])];\n const uniqueTargets = new Set(writeTargets.map((x) => x.replace(/\\\\/g, '/').replace(/\\/+$/, '')));\n let targetBonus = 0;\n for (const target of uniqueTargets) {\n if (!target) continue;\n const looksLikeFile = /\\.[A-Za-z0-9]+$/.test(target);\n targetBonus += looksLikeFile ? 120 : 70;\n if (target.startsWith('tests/') || target.includes('/tests/')) targetBonus += 80;\n if (target.startsWith('src/') || target.includes('/src/')) targetBonus += 60;\n }\n targetBonus = Math.min(targetBonus, 640);\n\n const contextBonus = Math.min(Math.ceil((ctx.contextChars ?? 0) / 1200) * 40, 480);\n const debugBonus = ctx.debug || ctx.role === 'Debugger' ? 260 : 0;\n const dynamic =\n DEFAULT_EDIT_LINES_PER_STEP +\n (phaseBonus[ctx.phase ?? ''] ?? 160) +\n writeToolBonus +\n targetBonus +\n contextBonus +\n debugBonus;\n\n return Math.min(Math.max(dynamic, DEFAULT_EDIT_LINES_PER_STEP), AUTO_EDIT_LINES_HARD_CAP);\n}\n\nexport class EditGuard {\n private accumulatedLines = 0;\n private readonly logAbs: string;\n private readonly maxLines: number;\n\n constructor(private readonly opts: EditGuardOptions) {\n this.maxLines = resolveEditGuardMaxLines(opts.maxLines, opts.budgetContext);\n this.logAbs = opts.ws.abs(opts.logRelPath ?? `logs/edits-${opts.stepId}.jsonl`);\n }\n\n get totalLines(): number {\n return this.accumulatedLines;\n }\n\n /** 用 EditGuard 包装一个 Tool;非写类工具透传,仅写类工具走 guard 路径。 */\n wrap<A, R>(t: Tool<A, R>): Tool<A, R> {\n if (!WRITE_TOOLS.has(t.name)) return t;\n return {\n name: t.name,\n description: t.description,\n argsSchema: t.argsSchema,\n run: async (args: A, ctx: ToolContext): Promise<ToolResult<R>> => {\n if (this.accumulatedLines > this.maxLines) {\n const r: ToolResult<R> = {\n ok: false,\n error: `EditGuard: max ${this.maxLines} lines per step exceeded (now ${this.accumulatedLines})`,\n };\n await this.record({ tool: t.name, args, ok: false, error: r.error });\n return r;\n }\n const approx = approxLineDelta(t.name, args);\n const r = await t.run(args, ctx);\n if (r.ok) this.accumulatedLines += approx;\n await this.record({\n tool: t.name,\n args,\n ok: r.ok,\n summary: r.summary,\n error: r.error,\n approxLines: approx,\n });\n return r;\n },\n };\n }\n\n private async record(partial: Omit<EditRecord, 'ts' | 'stepId'>): Promise<void> {\n const rec: EditRecord = { ts: new Date().toISOString(), stepId: this.opts.stepId, ...partial };\n try {\n await fs.mkdir(path.dirname(this.logAbs), { recursive: true });\n await fs.appendFile(this.logAbs, JSON.stringify(rec) + '\\n', 'utf8');\n } catch {\n /* swallow */\n }\n }\n}\n\n/** 粗略估计本次写操作影响的行数。 */\nfunction approxLineDelta(tool: string, args: unknown): number {\n const a = args as Record<string, unknown>;\n if ((tool === 'write_file' || tool === 'append_file') && typeof a?.content === 'string') {\n return countLines(a.content as string);\n }\n if (tool === 'replace_in_file') {\n const find = typeof a?.find === 'string' ? countLines(a.find as string) : 1;\n const repl = typeof a?.replace === 'string' ? countLines(a.replace as string) : 1;\n return Math.max(find, repl);\n }\n if (tool === 'apply_patch' && typeof a?.patch === 'string') {\n let c = 0;\n for (const ln of (a.patch as string).split('\\n')) {\n if (ln.startsWith('+') && !ln.startsWith('+++')) c++;\n else if (ln.startsWith('-') && !ln.startsWith('---')) c++;\n }\n return c;\n }\n if (tool === 'add_dependency') {\n return Array.isArray(a?.packages) ? (a.packages as unknown[]).length : 1;\n }\n return 1;\n}\n\nfunction countLines(s: string): number {\n if (!s) return 0;\n return s.split('\\n').length;\n}\n","import path from 'node:path';\nimport { promises as fs } from 'node:fs';\nimport { jsonrepair } from 'jsonrepair';\nimport type { LLMClient } from '../llm/types.js';\nimport type { Step } from '../core/plan.js';\nimport { getLanguageProfile, type LanguageProfile } from '../core/language.js';\nimport type {\n Tool,\n ToolContext,\n ToolPermissionRequest,\n ToolResult,\n} from '../tools/types.js';\nimport { makeStreamReporter } from '../llm/stream.js';\nimport { t } from '../i18n/index.js';\n\n/**\n * Executor 把一个 Step 交给对应角色的 LLM,要求其用一组 tool calls 完成产出。\n *\n * 协议:LLM 必须严格返回 JSON:\n * { \"thoughts\": \"短说明\", \"actions\": [ { \"tool\": \"name\", \"args\": {...} }, ... ], \"done\": true|false }\n *\n * 主循环:\n * while not done and rounds < maxRounds:\n * ask LLM (with previous tool results)\n * for each action: lookup tool in step.tools whitelist, run, collect summary\n *\n * 最终通过 verifyOutputs() 校验 step.outputs 是否全部生成。\n */\n\nexport interface ExecutorOptions {\n llm: LLMClient;\n /** 同一 Step 内最多对话轮数,避免无限循环。 */\n maxRounds?: number;\n}\n\nexport interface ExecutorRunInput {\n step: Step;\n /** 仅暴露给 LLM 的工具子集(已按 step.tools 过滤)。 */\n tools: Tool[];\n ctx: ToolContext;\n /** 注入到 user prompt 的额外上下文(如已有 inputs 内容)。 */\n contextSnippets?: Array<{ path: string; content: string }>;\n /** 来自 Skill 的提示词,拼接到 system prompt 后。 */\n skillHints?: string[];\n /** debug 模式下传入上一轮失败记录(错误文本 / 失败测试 / 上下文)。 */\n debugContext?: { reason: string; failureLog: string; suggestions?: string };\n /** Plan 级别的全局 system prompt(xcompiler build 沉淀)。 */\n globalPrompt?: string;\n /** 目标语言 profile(决定 executor system prompt 的语言专属覆盖块)。默认 python。 */\n languageProfile?: LanguageProfile;\n}\n\nexport interface ExecutorRunResult {\n success: boolean;\n rounds: number;\n toolCalls: Array<{ tool: string; ok: boolean; summary?: string; error?: string }>;\n finalThought?: string;\n error?: string;\n /** 健康度统计:用于调用方做\"滑动窗口\"自适应重试决策。 */\n metrics: ExecutorRunMetrics;\n}\n\nexport interface ExecutorRunMetrics {\n /** 实际跑过的轮数(与 rounds 相同,便于消费方独立解读)。 */\n rounds: number;\n /** JSON 解析失败的轮数(LLM 返回空 / 不可解析)。 */\n parseFailures: number;\n /** 与上一轮 actions 完全相同的轮数(疑似 loop / 卡死)。 */\n repeatedTurns: number;\n /** 工具调用失败比例(0..1)。无调用时为 0。 */\n toolFailRatio: number;\n /** 进度比例:1 - 当前缺失输出 / 起始缺失输出(0..1)。无初始缺失时为 1。 */\n progressRatio: number;\n /** [0..1] 健康度得分;越高越值得继续重试。 */\n healthScore: number;\n}\n\ninterface LLMAction {\n tool: string;\n args: Record<string, unknown>;\n}\ninterface LLMTurn {\n thoughts?: string;\n actions?: LLMAction[];\n done?: boolean;\n}\n\ninterface TurnFeedbackContext {\n declaredDone: boolean;\n actionCount: number;\n unresolvedFailures?: string[];\n}\n\nexport class StepExecutor {\n constructor(private readonly opts: ExecutorOptions) {}\n\n async run(inp: ExecutorRunInput): Promise<ExecutorRunResult> {\n const maxRounds = this.opts.maxRounds ?? 6;\n const toolMap = new Map(inp.tools.map((t) => [t.name, t]));\n const toolDocs = inp.tools\n .map((t) => `- ${t.name}: ${describeToolForStep(t, inp.ctx)} args=${JSON.stringify(t.argsSchema)}`)\n .join('\\n');\n const skillBlock =\n inp.skillHints && inp.skillHints.length > 0\n ? '\\n\\n可用 Skill 提示:\\n' + inp.skillHints.map((h) => '- ' + h).join('\\n')\n : '';\n const debugBlock = inp.debugContext\n ? t().prompts.executorDebugBlock(inp.debugContext.reason, inp.debugContext.suggestions)\n : '';\n const globalBlock =\n inp.globalPrompt && inp.globalPrompt.trim()\n ? t().prompts.executorGlobalBlock(inp.globalPrompt.trim())\n : '';\n const stepBlock = t().prompts.executorStepBlock(inp.step.systemPrompt.trim());\n const userPrompt = renderUserPrompt(inp, toolDocs);\n const profile = inp.languageProfile ?? getLanguageProfile('python');\n\n const messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }> = [\n { role: 'system', content: t().prompts.executorSystem(profile) + globalBlock + stepBlock + skillBlock + debugBlock },\n { role: 'user', content: userPrompt },\n ];\n const calls: ExecutorRunResult['toolCalls'] = [];\n let finalThought: string | undefined;\n\n // 健康度信号采集\n const initialMissing = (await verifyOutputs(inp)).missing.length;\n let parseFailures = 0;\n let repeatedTurns = 0;\n let lastActionsKey: string | null = null;\n /** 每个 (tool+args) 指纹被尝试过的累计次数;用于检测\"换汤不换药\"。 */\n const actionFingerprints = new Map<string, number>();\n const unresolvedToolFailures = new Map<string, string>();\n let actualRounds = 0;\n\n for (let round = 1; round <= maxRounds; round++) {\n const rep = makeStreamReporter(\n `${inp.step.id} ${inp.step.role} round ${round}`,\n this.opts.llm.name,\n );\n // 另起一份本轮完整原始输出的拼接,以便 llm.chat 报错/超时/loop 被 abort 时仔细存证。\n // 上限 256KB,略大于 ollama 默认 maxOutputChars,只作为内存保护。\n const RAW_CAP = 256 * 1024;\n let rawAggregate = '';\n let provider: string | undefined;\n let text: string;\n try {\n text = await this.opts.llm.chat(messages, {\n responseFormat: 'json',\n temperature: 0.1,\n onProvider: (name) => { provider = name; },\n onProviderStart: (name, model) => { rep.setModel(`${name}/${model}`); },\n streamStopWhen: isCompleteTurnJson,\n onToken: (chunk) => {\n if (rawAggregate.length < RAW_CAP) {\n rawAggregate = (rawAggregate + chunk).slice(0, RAW_CAP);\n }\n rep.onToken(chunk);\n },\n });\n } catch (err) {\n rep.done('failed');\n const errMsg = (err as Error).message;\n // 把部分流落盘到 .xcompiler/llm-stream/<step>-<role>-r<n>.txt\n const dumpRel = `.xcompiler/llm-stream/${inp.step.id}-${inp.step.role}-r${round}.txt`;\n try {\n const dumpAbs = inp.ctx.ws.abs(dumpRel);\n await fs.mkdir(path.dirname(dumpAbs), { recursive: true });\n await fs.writeFile(\n dumpAbs,\n `${t().audit.partialFailureHeader(errMsg)}\\n${t().audit.streamLength(rawAggregate.length)}\\n\\n${rawAggregate}`,\n 'utf8',\n );\n } catch {\n /* best-effort */\n }\n await inp.ctx.audit?.executorTurn(inp.step.id, inp.step.role, round, {\n thoughts: t().audit.llmChatFailedThought(errMsg),\n actions: [],\n done: false,\n raw: rawAggregate,\n provider,\n });\n await inp.ctx.audit?.event(\n 'llm.error',\n t().audit.llmChatAborted(inp.step.id, round, rawAggregate.length, errMsg),\n {\n messageId: 'audit.llm_chat_aborted',\n stepId: inp.step.id,\n role: inp.step.role,\n round,\n partialDump: dumpRel,\n partialBytes: rawAggregate.length,\n },\n );\n throw err;\n }\n rep.done();\n const turn = parseTurn(text);\n finalThought = turn.thoughts;\n const actions = turn.actions ?? [];\n actualRounds = round;\n // 解析失败 / 空响应:关键的\"不健康\"信号。\n if (!turn || (turn.thoughts === undefined && actions.length === 0 && turn.done === undefined)) {\n parseFailures++;\n }\n // 重复检测:与上一轮 actions 完全相同(且非空)→ 卡死信号。\n const actionsKey = JSON.stringify(actions);\n if (actions.length > 0 && lastActionsKey === actionsKey) {\n repeatedTurns++;\n }\n lastActionsKey = actionsKey;\n // 单 action 级重复:即使整体不一样,只要本轮包含已经尝试过的指纹,\n // 也视作\"卡在同一坑\"。LLM 常见模式:把同一无效 replace 拼到不同 action 列里。\n let perActionRepeats = 0;\n for (const a of actions) {\n const fp = JSON.stringify({ t: a.tool, a: a.args });\n const prev = actionFingerprints.get(fp) ?? 0;\n if (prev > 0) perActionRepeats++;\n actionFingerprints.set(fp, prev + 1);\n }\n // 一轮里有 ≥ 2 个 action 是旧指纹的重复 → 强信号;只 1 个不计入避免误伤。\n if (perActionRepeats >= 2) repeatedTurns++;\n // 把 LLM 本轮的\"思考过程 + 计划行动\"写入审计,作为交付时的可追溯材料\n await inp.ctx.audit?.executorTurn(inp.step.id, inp.step.role, round, {\n thoughts: turn.thoughts,\n actions,\n done: turn.done === true,\n raw: text,\n provider,\n });\n const turnResults: Array<ToolResult & { tool: string }> = [];\n for (const a of actions) {\n const selectedTool = toolMap.get(a.tool);\n if (!selectedTool) {\n const r = { ok: false, error: `tool not allowed for this step: ${a.tool}` };\n updateUnresolvedToolFailures(unresolvedToolFailures, a, r);\n calls.push({ tool: a.tool, ok: false, error: r.error });\n turnResults.push({ ...r, tool: a.tool });\n await inp.ctx.audit?.event('tool.call', t().audit.toolDenied(a.tool), {\n messageId: 'audit.tool_denied', stepId: inp.step.id, tool: a.tool,\n });\n continue;\n }\n const permission = buildPermissionRequest(a.tool, a.args, inp.step.id, inp.ctx.language);\n if (a.tool === 'apply_patch' && typeof a.args.patch === 'string') {\n await inp.ctx.onToolEvent?.({\n status: 'started',\n stepId: inp.step.id,\n tool: a.tool,\n target: actionTargetPaths(a.tool, a.args).join(', '),\n args: a.args,\n patch: a.args.patch,\n });\n }\n if (permission && inp.ctx.requestPermission) {\n const decision = await inp.ctx.requestPermission(permission);\n if (!decision.approved) {\n const r = {\n ok: false,\n error: `permission denied for ${permission.operationType}: ${permission.target}` +\n (decision.reason ? ` (${decision.reason})` : ''),\n };\n updateUnresolvedToolFailures(unresolvedToolFailures, a, r);\n await inp.ctx.audit?.event('tool.result', t().audit.toolResult(a.tool, false, r.error), {\n messageId: 'audit.tool_result',\n stepId: inp.step.id,\n tool: a.tool,\n ok: false,\n permissionDenied: true,\n });\n calls.push({ tool: a.tool, ok: false, error: r.error });\n turnResults.push({ ...r, tool: a.tool });\n await inp.ctx.onToolEvent?.({\n status: 'completed',\n stepId: inp.step.id,\n tool: a.tool,\n target: permission.target,\n ok: false,\n error: r.error,\n });\n continue;\n }\n }\n await inp.ctx.audit?.event('tool.call', t().audit.toolCalled(a.tool), {\n messageId: 'audit.tool_called', stepId: inp.step.id, tool: a.tool, args: a.args,\n });\n await inp.ctx.onToolEvent?.({\n status: 'started',\n stepId: inp.step.id,\n tool: a.tool,\n target: actionTargetPaths(a.tool, a.args).join(', ') || undefined,\n args: a.args,\n });\n const toolReporter = makeStreamReporter(\n t().stream.toolExecution(inp.step.id, a.tool),\n t().stream.toolRunner,\n );\n const r = await safeRunTool(selectedTool, a.args, inp.ctx);\n toolReporter.done(r.ok ? 'done' : 'failed');\n updateUnresolvedToolFailures(unresolvedToolFailures, a, r);\n await inp.ctx.audit?.event('tool.result', t().audit.toolResult(a.tool, r.ok, r.summary ?? r.error ?? ''), {\n messageId: 'audit.tool_result',\n stepId: inp.step.id,\n tool: a.tool,\n ok: r.ok,\n });\n await inp.ctx.onToolEvent?.({\n status: 'completed',\n stepId: inp.step.id,\n tool: a.tool,\n target: actionTargetPaths(a.tool, a.args).join(', ') || undefined,\n ok: r.ok,\n summary: r.summary,\n error: r.error,\n changedFiles: r.ok ? changedFilesForAction(a.tool, a.args, r) : undefined,\n });\n calls.push({ tool: a.tool, ok: r.ok, summary: r.summary, error: r.error });\n turnResults.push({ ...r, tool: a.tool });\n }\n const verify = await verifyOutputs(inp);\n if (turn.done && verify.ok && unresolvedToolFailures.size === 0) {\n const metrics = computeMetrics({\n rounds: actualRounds,\n parseFailures,\n repeatedTurns,\n calls,\n initialMissing,\n currentMissing: verify.missing.length,\n });\n return { success: true, rounds: round, toolCalls: calls, finalThought, metrics };\n }\n messages.push({ role: 'assistant', content: text });\n messages.push({\n role: 'user',\n content: renderFeedback(turnResults, verify, {\n declaredDone: turn.done === true,\n actionCount: actions.length,\n unresolvedFailures: [...unresolvedToolFailures.values()],\n }),\n });\n }\n\n const finalVerify = await verifyOutputs(inp);\n const metrics = computeMetrics({\n rounds: actualRounds || maxRounds,\n parseFailures,\n repeatedTurns,\n calls,\n initialMissing,\n currentMissing: finalVerify.missing.length,\n });\n return {\n success: false,\n rounds: maxRounds,\n toolCalls: calls,\n finalThought,\n error:\n finalVerify.ok && unresolvedToolFailures.size > 0\n ? `unresolved tool failures remain: ${[...unresolvedToolFailures.values()].join('; ')}`\n : 'max rounds exceeded without satisfying outputs',\n metrics,\n };\n }\n}\n\nfunction updateUnresolvedToolFailures(\n unresolved: Map<string, string>,\n action: LLMAction,\n result: ToolResult,\n): void {\n const keys = actionResolutionKeys(action);\n if (result.ok) {\n for (const key of keys) unresolved.delete(key);\n return;\n }\n const detail = `${action.tool} FAIL ${result.error ?? result.summary ?? 'unknown error'}`;\n for (const key of keys) unresolved.set(key, detail);\n}\n\nfunction actionResolutionKeys(action: LLMAction): string[] {\n const targets = actionTargetPaths(action.tool, action.args);\n if (targets.length > 0) return targets.map((target) => `path:${target}`);\n return [`tool:${action.tool}`];\n}\n\nfunction actionTargetPaths(tool: string, args: Record<string, unknown>): string[] {\n if (tool === 'write_file' || tool === 'append_file' || tool === 'replace_in_file') {\n return typeof args.path === 'string' ? [normalizeRelPath(args.path)] : [];\n }\n if (tool === 'apply_patch' && typeof args.patch === 'string') {\n return extractPatchTargets(args.patch).map(normalizeRelPath);\n }\n if (tool === 'add_dependency') return ['requirements.txt'];\n if (tool === 'http_fetch' && typeof args.saveAs === 'string') {\n return [normalizeRelPath(args.saveAs)];\n }\n return [];\n}\n\nfunction extractPatchTargets(patch: string): string[] {\n const out = new Set<string>();\n for (const line of patch.split('\\n')) {\n const m =\n line.match(/^\\*\\*\\* (?:Update File|Add File|Delete File):\\s+(.+)$/) ??\n line.match(/^\\+\\+\\+\\s+b\\/(.+)$/) ??\n line.match(/^---\\s+a\\/(.+)$/);\n if (m?.[1] && m[1] !== '/dev/null') out.add(m[1].trim());\n }\n return [...out];\n}\n\nfunction normalizeRelPath(p: string): string {\n return p.replace(/\\\\/g, '/').replace(/^\\.\\/+/, '').replace(/\\/+$/, '');\n}\n\nfunction buildPermissionRequest(\n tool: string,\n args: Record<string, unknown>,\n stepId: string,\n language: ToolContext['language'],\n): ToolPermissionRequest | undefined {\n const target = actionTargetPaths(tool, args).join(', ');\n const runtime = language === 'typescript' ? 'npm' : 'python';\n if (tool === 'write_file' || tool === 'append_file' || tool === 'replace_in_file' || tool === 'apply_patch') {\n return {\n operationType: 'file_write',\n target: target || '(workspace file)',\n reason: `Step ${stepId} requested ${tool} to update project files.`,\n risk: 'This operation modifies files in the current workspace.',\n scope: 'current workspace',\n skippable: true,\n denyBehavior: 'The tool call is skipped and the agent must continue with an alternative or fail the step.',\n stepId,\n tool,\n metadata: { args: redactLargeArgs(args) },\n };\n }\n if (tool === 'add_dependency') {\n return {\n operationType: 'config_change',\n target: language === 'typescript' ? 'package.json' : 'requirements.txt',\n reason: `Step ${stepId} requested dependency manifest changes.`,\n risk: 'This can alter project dependencies and may trigger sandbox rebuilds.',\n scope: 'current workspace dependency manifest',\n skippable: true,\n denyBehavior: 'The dependency change is skipped; later build or test steps may fail and report the missing dependency.',\n stepId,\n tool,\n metadata: { args },\n };\n }\n if (tool === 'install_deps' || tool === 'pip_install') {\n return {\n operationType: 'install_dependency',\n target: Array.isArray(args.packages) ? args.packages.join(', ') : '(packages)',\n reason: `Step ${stepId} requested dependency installation.`,\n risk: 'This may execute package manager scripts and download code from registries.',\n scope: 'current workspace sandbox',\n skippable: true,\n denyBehavior: 'Dependency installation is skipped and the task continues with the missing dependency reported.',\n stepId,\n tool,\n metadata: { args },\n };\n }\n if (tool === 'run_tests') {\n return {\n operationType: 'test_command',\n target: runtime === 'npm' ? 'npm test' : 'pytest',\n reason: `Step ${stepId} requested test execution to validate changes.`,\n risk: 'Project test scripts may execute arbitrary local project code.',\n scope: 'current workspace sandbox',\n skippable: true,\n denyBehavior: 'Tests are skipped and the final result must mark verification as incomplete.',\n stepId,\n tool,\n metadata: { args },\n };\n }\n if (tool === 'run_program' || tool === 'run_python') {\n return {\n operationType: 'shell_command',\n target: `${runtime} ${Array.isArray(args.args) ? args.args.join(' ') : ''}`.trim(),\n reason: `Step ${stepId} requested program execution.`,\n risk: 'This executes project code in the configured sandbox.',\n scope: 'current workspace sandbox',\n skippable: true,\n denyBehavior: 'The command is skipped and the agent must use another validation strategy or fail the step.',\n stepId,\n tool,\n metadata: { args },\n };\n }\n if (tool === 'http_fetch') {\n return {\n operationType: 'network_access',\n target: typeof args.url === 'string' ? args.url : '(url)',\n reason: `Step ${stepId} requested network access.`,\n risk: 'This contacts an external HTTP endpoint from the host process.',\n scope: 'network',\n skippable: true,\n denyBehavior: 'The network call is skipped; the agent must use local context or report the missing data.',\n stepId,\n tool,\n metadata: { args: redactLargeArgs(args) },\n };\n }\n return undefined;\n}\n\nfunction redactLargeArgs(args: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(args)) {\n if (typeof value === 'string' && value.length > 500) {\n out[key] = `${value.slice(0, 500)}... [truncated ${value.length - 500} chars]`;\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n\nfunction changedFilesForAction(tool: string, args: Record<string, unknown>, result: ToolResult): string[] {\n if (tool === 'apply_patch' && result.data && typeof result.data === 'object') {\n const changed = (result.data as { changedFiles?: unknown }).changedFiles;\n if (Array.isArray(changed)) return changed.filter((x): x is string => typeof x === 'string');\n }\n return actionTargetPaths(tool, args);\n}\n\nfunction describeToolForStep(tool: Tool, ctx: ToolContext): string {\n if ((tool.name === 'write_file' || tool.name === 'append_file') && ctx.writeChunkBytes) {\n return `${tool.description} 当前 Step content chunk limit: ${ctx.writeChunkBytes}B.`;\n }\n return tool.description;\n}\n\nasync function safeRunTool(t: Tool, args: unknown, ctx: ToolContext): Promise<ToolResult> {\n try {\n return await t.run(args as never, ctx);\n } catch (err) {\n return { ok: false, error: (err as Error).message };\n }\n}\n\nfunction computeMetrics(p: {\n rounds: number;\n parseFailures: number;\n repeatedTurns: number;\n calls: ExecutorRunResult['toolCalls'];\n initialMissing: number;\n currentMissing: number;\n}): ExecutorRunMetrics {\n const rounds = Math.max(1, p.rounds);\n const totalCalls = p.calls.length;\n const failedCalls = p.calls.filter((c) => !c.ok).length;\n const toolFailRatio = totalCalls > 0 ? failedCalls / totalCalls : 0;\n const progressRatio =\n p.initialMissing > 0\n ? Math.max(0, Math.min(1, 1 - p.currentMissing / p.initialMissing))\n : 1;\n // 健康度:解析失败 / 重复 / 工具失败率 / 反向进度都是扣分项。\n const badRoundsRatio = Math.min(1, (p.parseFailures + p.repeatedTurns) / rounds);\n let score = 1 - badRoundsRatio * 0.6 - toolFailRatio * 0.2 - (1 - progressRatio) * 0.2;\n score = Math.max(0, Math.min(1, score));\n return {\n rounds,\n parseFailures: p.parseFailures,\n repeatedTurns: p.repeatedTurns,\n toolFailRatio,\n progressRatio,\n healthScore: score,\n };\n}\n\nexport async function verifyOutputs(inp: ExecutorRunInput): Promise<{ ok: boolean; missing: string[] }> {\n const missing: string[] = [];\n for (const out of inp.step.outputs) {\n if (out.endsWith('/')) continue; // 目录约束跳过显式文件检查\n const exists = await inp.ctx.ws.exists(out);\n if (!exists) missing.push(out);\n }\n return { ok: missing.length === 0, missing };\n}\n\nfunction renderUserPrompt(inp: ExecutorRunInput, toolDocs: string): string {\n const ctxBlock = (inp.contextSnippets ?? [])\n .map((s) =>\n `### ${s.path}\\n\\`\\`\\`\\n${truncate(s.content, s.path === '.xcompiler/architecture-contract.json' ? 8000 : 2200)}\\n\\`\\`\\``,\n )\n .join('\\n\\n');\n const dbg = inp.debugContext\n ? `## debug failure log\\n\\`\\`\\`\\n${truncate(inp.debugContext.failureLog, 4000)}\\n\\`\\`\\`\\n` +\n (inp.debugContext.suggestions ? `\\n${inp.debugContext.suggestions}\\n` : '')\n : '';\n return [\n `# Step ${inp.step.id} — ${inp.step.title}`,\n `phase: ${inp.step.phase}`,\n `role: ${inp.step.role}`,\n `acceptance: ${inp.step.acceptance}`,\n '',\n '## description',\n inp.step.description,\n '',\n '## required outputs',\n inp.step.outputs.map((o) => `- ${o}`).join('\\n'),\n '',\n '## writable paths (tool allowlist)',\n inp.ctx.allowedWrites.map((o) => `- ${o}`).join('\\n'),\n '',\n inp.step.subTasks && inp.step.subTasks.length > 0\n ? `## step subtasks (execute inside this macro Step)\\n${renderStepSubTasks(inp.step.subTasks, 0)}\\n`\n : '',\n '## available tools',\n toolDocs || '(none)',\n '',\n inp.step.inputs.length > 0\n ? `## inputs (already produced):\\n${inp.step.inputs.map((i) => `- ${i}`).join('\\n')}\\n`\n : '',\n ctxBlock ? `## context\\nTreat these existing files as the current project truth. Extend or refactor them in place; do not replace the project with a tiny parallel implementation.\\n\\n${ctxBlock}\\n` : '',\n dbg,\n t().prompts.executorUserPromptOutro,\n ]\n .filter(Boolean)\n .join('\\n');\n}\n\nfunction renderStepSubTasks(tasks: NonNullable<Step['subTasks']>, depth: number): string {\n const indent = ' '.repeat(depth);\n return tasks\n .flatMap((task) => {\n const outputs = task.outputs && task.outputs.length > 0 ? ` outputs=[${task.outputs.join(', ')}]` : '';\n const lines = [\n `${indent}- ${task.id}: ${task.title}${outputs}`,\n `${indent} ${task.description}`,\n ];\n if (task.acceptance) lines.push(`${indent} acceptance: ${task.acceptance}`);\n if (task.subTasks && task.subTasks.length > 0) lines.push(renderStepSubTasks(task.subTasks, depth + 1));\n return lines;\n })\n .join('\\n');\n}\n\nfunction renderFeedback(\n results: Array<ToolResult & { tool: string }>,\n verify: { ok: boolean; missing: string[] },\n turn: TurnFeedbackContext,\n): string {\n const M = t().prompts;\n const lines: string[] = [M.executorFeedbackHeader];\n for (const r of results) {\n lines.push(`- ${r.tool}: ${r.ok ? 'OK' : 'FAIL'} — ${r.summary ?? r.error ?? ''}`);\n }\n if (verify.ok) {\n lines.push(M.executorFeedbackVerifyOk);\n } else {\n lines.push(M.executorFeedbackVerifyMissing(verify.missing.join(', ')));\n if (turn.declaredDone && turn.actionCount === 0) {\n lines.push(\n `Invalid completion: required outputs are still missing. ` +\n `Next response must include concrete write actions that create: ${verify.missing.join(', ')}. ` +\n `Do not return done=true with actions=[] until those files exist.`,\n );\n }\n }\n if (turn.unresolvedFailures && turn.unresolvedFailures.length > 0) {\n lines.push(`Unresolved tool failures remain: ${turn.unresolvedFailures.join('; ')}`);\n if (turn.declaredDone) {\n lines.push(\n `Invalid completion: do not return done=true until each failed tool call is corrected ` +\n `or superseded by a successful tool call on the same target.`,\n );\n }\n }\n return lines.join('\\n');\n}\n\nfunction parseTurn(text: string): LLMTurn {\n const cleaned = stripFence(text).trim();\n // 1) 直接解析最常见的\"单一 JSON 对象\"输出\n const direct = tryParseTurnCandidate(cleaned);\n if (direct) return direct;\n // 2) 扫描首个完整的平衡花括号对象(兼容 LLM 返回多段 ```json``` 拼接、\n // 或 JSON 前后带散文 / 多个对象)。逐字符按 {/} 计数,跳过字符串与转义。\n const first = extractFirstJsonObject(cleaned);\n if (first) {\n const parsed = tryParseTurnCandidate(first);\n if (parsed) return parsed;\n }\n // 3) 终极兜底:原来的 first-{ to last-} 切片\n const a = cleaned.indexOf('{');\n const b = cleaned.lastIndexOf('}');\n if (a >= 0 && b > a) {\n const parsed = tryParseTurnCandidate(cleaned.slice(a, b + 1));\n if (parsed) return parsed;\n }\n return {};\n}\n\nfunction isCompleteTurnJson(text: string): boolean {\n const cleaned = stripFence(text).trim();\n if (!/\"done\"\\s*:/.test(cleaned)) return false;\n const last = cleaned.at(-1);\n if (last !== '}' && last !== ']') return false;\n const start = cleaned.indexOf('{');\n const end = cleaned.lastIndexOf('}');\n if (start < 0 || end <= start) return false;\n const candidate = cleaned.slice(start, end + 1);\n const turn = tryParseTurnCandidate(candidate);\n return !!turn && typeof turn.done === 'boolean' && Array.isArray(turn.actions);\n}\n\n/** 返回 s 中第一个语法上完整的 `{...}` 子串(按字符串/转义正确计数花括号)。 */\nfunction extractFirstJsonObject(s: string): string | null {\n const start = s.indexOf('{');\n if (start < 0) return null;\n let depth = 0;\n let inStr = false;\n let escape = false;\n for (let i = start; i < s.length; i++) {\n const ch = s[i]!;\n if (inStr) {\n if (escape) escape = false;\n else if (ch === '\\\\') escape = true;\n else if (ch === '\"') inStr = false;\n continue;\n }\n if (ch === '\"') {\n inStr = true;\n } else if (ch === '{') {\n depth++;\n } else if (ch === '}') {\n depth--;\n if (depth === 0) return s.slice(start, i + 1);\n }\n }\n return null;\n}\n\nfunction stripFence(s: string): string {\n return s.replace(/^```(?:json)?\\s*\\n?/i, '').replace(/\\n?```\\s*$/i, '');\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length > n ? s.slice(0, n) + `\\n... [truncated ${s.length - n} chars]` : s;\n}\n\nfunction tryParseTurnCandidate(candidate: string): LLMTurn | null {\n const exact = isTurnObject(tryParseJson(candidate));\n if (exact) return exact;\n const repaired = repairJsonCandidate(candidate);\n if (repaired !== candidate) {\n const parsed = isTurnObject(tryParseJson(repaired));\n if (parsed) return parsed;\n }\n return null;\n}\n\nfunction tryParseJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n}\n\nfunction repairJsonCandidate(text: string): string {\n const normalized = normalizeJsonLikeStrings(text).trim();\n try {\n return jsonrepair(normalized).trim();\n } catch {\n return normalized;\n }\n}\n\nfunction isTurnObject(value: unknown): LLMTurn | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return null;\n return value as LLMTurn;\n}\n\nfunction normalizeJsonLikeStrings(text: string): string {\n let out = '';\n let inStr = false;\n let escape = false;\n for (let i = 0; i < text.length; i++) {\n const ch = text[i]!;\n if (!inStr) {\n out += ch;\n if (ch === '\"') inStr = true;\n continue;\n }\n if (escape) {\n out += ch;\n escape = false;\n continue;\n }\n if (ch === '\\\\') {\n out += ch;\n escape = true;\n continue;\n }\n if (ch === '\\r') continue;\n if (ch === '\\n') {\n out += '\\\\n';\n continue;\n }\n if (ch === '\"') {\n const next = nextNonWhitespaceChar(text, i + 1);\n if (next === ':' || next === ',' || next === '}' || next === ']' || next === '') {\n out += ch;\n inStr = false;\n } else {\n out += '\\\\\"';\n }\n continue;\n }\n out += ch;\n }\n return out;\n}\n\nfunction nextNonWhitespaceChar(text: string, start: number): string {\n for (let i = start; i < text.length; i++) {\n const ch = text[i]!;\n if (!/\\s/.test(ch)) return ch;\n }\n return '';\n}\n","import type { Tool } from '../tools/types.js';\nimport { t } from '../i18n/index.js';\n\n/**\n * Skill:把一组原子工具组合为面向 LLM 的\"高阶能力\"。\n *\n * 在 M3 阶段 Skill 是一层\"语义包装\"——执行器仍然按 step.tools 中的工具名调用具体 Tool,\n * 但 Step 可以声明 `tools: [\"skill:patcher\"]`,Skill Registry 会展开为底层工具集合,\n * 并把 Skill 的 `prompt` 注入 system prompt,提示 LLM 该如何组合这些工具。\n */\nexport interface Skill {\n /** 形如 `patcher` / `tester` / `dep_resolver`。 */\n readonly name: string;\n /** 注入到 system prompt 的简短指引(中文一句话)。 */\n readonly prompt: string;\n /** 该 Skill 暴露给 LLM 的底层工具名集合。 */\n readonly tools: string[];\n}\n\nexport class SkillRegistry {\n private readonly skills = new Map<string, Skill>();\n\n register(s: Skill): void {\n this.skills.set(s.name, s);\n }\n\n get(name: string): Skill | undefined {\n return this.skills.get(name);\n }\n\n /**\n * 把 `step.tools` 中的 `skill:xxx` 项展开为底层工具名(去重,保持顺序)。\n * 非 skill 项原样保留,便于与裸工具混用。\n * 返回 { resolvedToolNames, hints }。\n */\n resolve(toolRefs: string[]): { resolvedToolNames: string[]; hints: string[] } {\n const out: string[] = [];\n const hints: string[] = [];\n const seen = new Set<string>();\n for (const ref of toolRefs) {\n if (ref.startsWith('skill:')) {\n const sk = this.skills.get(ref.slice('skill:'.length));\n if (!sk) continue;\n hints.push(`[${sk.name}] ${sk.prompt}`);\n for (const t of sk.tools) if (!seen.has(t)) {\n seen.add(t);\n out.push(t);\n }\n } else {\n if (!seen.has(ref)) {\n seen.add(ref);\n out.push(ref);\n }\n }\n }\n return { resolvedToolNames: out, hints };\n }\n\n list(): Skill[] {\n return [...this.skills.values()];\n }\n}\n\n/** Default skill set; see implementation_plan §M3.1. */\nexport function buildDefaultSkills(): SkillRegistry {\n const reg = new SkillRegistry();\n const SK = t().skills;\n reg.register({\n name: 'patcher',\n prompt: SK.patcher,\n tools: ['read_file', 'code_search', 'apply_patch', 'replace_in_file'],\n });\n reg.register({\n name: 'author',\n prompt: SK.author,\n tools: ['read_file', 'list_dir', 'write_file', 'append_file'],\n });\n reg.register({\n name: 'tester',\n prompt: SK.tester,\n tools: ['read_file', 'list_dir', 'write_file', 'append_file', 'run_tests', 'analyze_error', 'http_fetch'],\n });\n reg.register({\n name: 'dep_resolver',\n prompt: SK.dep_resolver,\n tools: ['analyze_error', 'add_dependency', 'install_deps'],\n });\n reg.register({\n name: 'debugger',\n prompt: SK.debugger,\n tools: [\n 'read_file',\n 'code_search',\n 'run_tests',\n 'run_program',\n 'analyze_error',\n 'apply_patch',\n 'replace_in_file',\n 'write_file',\n 'append_file',\n 'add_dependency',\n 'http_fetch',\n ],\n });\n reg.register({\n name: 'refactorer',\n prompt: SK.refactorer,\n tools: ['read_file', 'code_search', 'apply_patch', 'replace_in_file', 'write_file', 'append_file', 'run_tests'],\n });\n return reg;\n}\n\n/** 便利函数:把 skill / tool refs 解析为可注入 prompt 的提示串。 */\nexport function renderSkillHints(hints: string[]): string {\n if (hints.length === 0) return '';\n return ['## skill hints', ...hints.map((h) => `- ${h}`)].join('\\n');\n}\n\n/** 把工具元信息渲染为 prompt 段。 */\nexport function renderToolDocs(tools: Tool[]): string {\n return tools\n .map((t) => `- ${t.name}: ${t.description} args=${JSON.stringify(t.argsSchema)}`)\n .join('\\n');\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\n/**\n * 单步 debug 尝试历史条目。所有字段都做了截断,避免缓存文件无限膨胀。\n */\nexport interface DebugAttemptEntry {\n /** 第几次 retry(1-based)。0 表示初始尝试。 */\n attempt: number;\n /** ISO8601 时间戳。 */\n ts: string;\n /** 失败原因(一行摘要)。 */\n reason: string;\n /** 失败日志尾部(已按 maxFailureLogLines 截断)。 */\n failureLogTail: string;\n /** Calibrator 给出的修复建议(一行一条)。 */\n suggestions?: string[];\n /** 该次尝试前 git snapshot SHA,便于人工 checkout 复盘。 */\n snapshotSha?: string;\n /** ExecutorRunMetrics 关键字段;保留 healthScore / parseFailures / repeatedTurns / progressRatio。 */\n metrics?: {\n healthScore: number;\n parseFailures: number;\n repeatedTurns: number;\n progressRatio: number;\n rounds: number;\n };\n}\n\ninterface StepEntry {\n lastUpdated: string;\n lastStatus: 'RUNNING' | 'FAILED' | 'DONE';\n lastReason?: string;\n attempts: DebugAttemptEntry[];\n}\n\ninterface CacheShape {\n version: 1;\n steps: Record<string, StepEntry>;\n}\n\nconst EMPTY: CacheShape = { version: 1, steps: {} };\n\n/**\n * 跨 `xcompiler run` 的 debug 历史持久化。\n *\n * 落盘位置:`<workspace>/.xcompiler/debug_cache.json`。\n *\n * 设计原则:\n * 1. 只在 workspace 内,**不污染 plan.json**——plan.json 是用户/Planner 的契约,不应混入运行期日志。\n * 2. 一次 `xcompiler run` 内的多次 retry → append;单步 DONE → clear;单步 FAILED → 保留,下一次 `xcompiler run`\n * 可读到这些尝试,作为 Debugger 的 prior context,让模型不要再走死路。\n * 3. 单步保留 attempts 数量上限 `maxAttemptsPerStep`(默认 12),超出按 FIFO 丢弃;每条 failureLog 按\n * `maxFailureLogLines`(默认 80)截断尾部。\n */\nexport class DebugCache {\n private data: CacheShape = { version: 1, steps: {} };\n private loaded = false;\n\n constructor(\n private readonly file: string,\n private readonly opts: { maxAttemptsPerStep?: number; maxFailureLogLines?: number } = {},\n ) {}\n\n private get maxAttempts(): number {\n return this.opts.maxAttemptsPerStep ?? 12;\n }\n private get maxLogLines(): number {\n return this.opts.maxFailureLogLines ?? 80;\n }\n\n async load(): Promise<void> {\n if (this.loaded) return;\n this.loaded = true;\n try {\n const raw = await fs.readFile(this.file, 'utf8');\n const parsed = JSON.parse(raw) as Partial<CacheShape>;\n if (parsed && parsed.version === 1 && parsed.steps && typeof parsed.steps === 'object') {\n this.data = { version: 1, steps: parsed.steps };\n return;\n }\n } catch {\n /* 文件不存在 / 损坏 → 空缓存 */\n }\n this.data = { ...EMPTY, steps: {} };\n }\n\n /** 取某 step 的历史尝试(可能为空数组)。 */\n attempts(stepId: string): DebugAttemptEntry[] {\n return this.data.steps[stepId]?.attempts ?? [];\n }\n\n /** 该 step 在上一次会话中是否以 FAILED 结束。 */\n hasUnresolvedFailure(stepId: string): boolean {\n const e = this.data.steps[stepId];\n return !!e && e.lastStatus === 'FAILED' && e.attempts.length > 0;\n }\n\n /** 追加一次尝试记录(在每次 retry 末尾调用)。failureLog 会自动截断到尾部 N 行。 */\n async recordAttempt(stepId: string, entry: Omit<DebugAttemptEntry, 'ts'> & { ts?: string }): Promise<void> {\n const tail = (s: string): string => {\n const lines = (s ?? '').split('\\n');\n return lines.length <= this.maxLogLines ? s : lines.slice(-this.maxLogLines).join('\\n');\n };\n const e: DebugAttemptEntry = {\n attempt: entry.attempt,\n ts: entry.ts ?? new Date().toISOString(),\n reason: (entry.reason ?? '').slice(0, 500),\n failureLogTail: tail(entry.failureLogTail ?? ''),\n suggestions: entry.suggestions,\n snapshotSha: entry.snapshotSha,\n metrics: entry.metrics,\n };\n const cur: StepEntry = this.data.steps[stepId] ?? {\n lastUpdated: e.ts,\n lastStatus: 'RUNNING',\n attempts: [],\n };\n cur.attempts.push(e);\n if (cur.attempts.length > this.maxAttempts) {\n cur.attempts.splice(0, cur.attempts.length - this.maxAttempts);\n }\n cur.lastUpdated = e.ts;\n cur.lastStatus = 'RUNNING';\n cur.lastReason = e.reason;\n this.data.steps[stepId] = cur;\n await this.save();\n }\n\n /** 该 step 修复成功 → 清理它的历史,避免下次 run 误以为还有未解决的失败。 */\n async markDone(stepId: string): Promise<void> {\n if (this.data.steps[stepId]) {\n delete this.data.steps[stepId];\n await this.save();\n }\n }\n\n /** 该 step 终态失败 → 保留 attempts,更新 lastStatus,便于下一次 run 直接用 Debugger 模式复用上下文。 */\n async markFailed(stepId: string, reason: string): Promise<void> {\n const cur = this.data.steps[stepId];\n if (!cur) {\n this.data.steps[stepId] = {\n lastUpdated: new Date().toISOString(),\n lastStatus: 'FAILED',\n lastReason: reason.slice(0, 500),\n attempts: [],\n };\n } else {\n cur.lastStatus = 'FAILED';\n cur.lastReason = reason.slice(0, 500);\n cur.lastUpdated = new Date().toISOString();\n }\n await this.save();\n }\n\n /**\n * 把历史 attempts 渲染成一段供 Debugger system prompt 使用的中文摘要,\n * 强调\"上一次会话已经试过的修复方向,请勿重复\"。\n */\n renderPriorAttemptsForPrompt(stepId: string, maxItems = 6): string {\n const list = this.attempts(stepId);\n if (list.length === 0) return '';\n const tail = list.slice(-maxItems);\n const lines = tail.map((e) => {\n const m = e.metrics\n ? ` [health=${e.metrics.healthScore.toFixed(2)} parseFail=${e.metrics.parseFailures} repeat=${e.metrics.repeatedTurns}]`\n : '';\n const sugg = e.suggestions && e.suggestions.length > 0\n ? `\\n suggestions: ${e.suggestions.join(' | ')}`\n : '';\n return `- attempt #${e.attempt} @ ${e.ts}${m}\\n reason: ${e.reason}${sugg}`;\n });\n return [\n '## 历史 DEBUG 尝试(来自上一次/本次 xcompiler run,请勿重复同样的修复思路)',\n ...lines,\n '请基于以上历史,提出**新的诊断假设**与**新的修改方向**;优先 read_file 看真实代码,再做最小修改。',\n ].join('\\n');\n }\n\n private async save(): Promise<void> {\n await fs.mkdir(path.dirname(this.file), { recursive: true });\n await fs.writeFile(this.file, JSON.stringify(this.data, null, 2), 'utf8');\n }\n}\n","import { promises as fs } from 'node:fs';\nimport type { Dirent } from 'node:fs';\nimport path from 'node:path';\nimport type { Workspace } from '../workspace/workspace.js';\nimport type { Sandbox, ExecResult } from '../sandbox/types.js';\nimport type { Plan, ProjectType } from './plan.js';\nimport type { LanguageProfile } from './language.js';\nimport { deliveryDocsForIteration, deliveryDocsForProjectType } from './docs.js';\nimport { t } from '../i18n/index.js';\nimport { detectNetworkApiFailureInExec } from './network_api_gate.js';\n\nexport interface ProjectAuditCheck {\n name: string;\n severity: 'error' | 'warn' | 'info';\n ok: boolean;\n summary: string;\n detail?: string;\n}\n\nexport interface ProjectAuditResult {\n ok: boolean;\n warnings: number;\n errors: number;\n checks: ProjectAuditCheck[];\n scope?: 'project' | 'iteration';\n iterationId?: string;\n}\n\nexport function renderProjectAuditFailureLog(result: ProjectAuditResult): string {\n const failed = result.checks.filter((check) => !check.ok);\n const interesting = failed.length > 0 ? failed : result.checks;\n const scope = result.scope === 'iteration' && result.iterationId\n ? `Iteration gate ${result.iterationId}`\n : 'Project audit';\n return [\n `${scope} failed: ${result.errors} error(s), ${result.warnings} warning(s).`,\n ...interesting.map((check) =>\n [\n `[${check.severity}] ${check.name}: ${check.summary}`,\n check.detail ? `detail:\\n${check.detail}` : '',\n ].filter(Boolean).join('\\n'),\n ),\n ].join('\\n\\n');\n}\n\nexport function shouldRunProjectAudit(\n plan: Plan,\n opts: { onlyPhase?: string },\n): boolean {\n if (opts.onlyPhase) return false;\n return plan.steps.every((step) => step.status === 'DONE');\n}\n\nexport async function runProjectAudit(opts: {\n ws: Workspace;\n sandbox: Sandbox;\n plan: Plan;\n profile: LanguageProfile;\n}): Promise<ProjectAuditResult> {\n return runQualityAudit({ ...opts, scope: 'project' });\n}\n\nexport async function runIterationGate(opts: {\n ws: Workspace;\n sandbox: Sandbox;\n plan: Plan;\n profile: LanguageProfile;\n iterationId: string;\n}): Promise<ProjectAuditResult> {\n return runQualityAudit({ ...opts, scope: 'iteration', iterationId: opts.iterationId });\n}\n\nasync function runQualityAudit(opts: {\n ws: Workspace;\n sandbox: Sandbox;\n plan: Plan;\n profile: LanguageProfile;\n scope: 'project' | 'iteration';\n iterationId?: string;\n}): Promise<ProjectAuditResult> {\n const checks: ProjectAuditCheck[] = [];\n\n checks.push(\n ...await checkDocumentationBundle(\n opts.ws,\n opts.plan.projectType ?? 'application',\n opts.scope === 'iteration' ? opts.iterationId : undefined,\n ),\n );\n checks.push(await checkTestFiles(opts.ws));\n checks.push(await runTestAudit(opts.sandbox));\n\n checks.push(await runEntryAudit(opts.ws, opts.sandbox, opts.profile));\n\n if (opts.plan.language === 'typescript') {\n checks.push(...await runTypeScriptAudit(opts.ws, opts.sandbox));\n }\n\n const warnings = checks.filter((check) => check.severity === 'warn' && !check.ok).length;\n const errors = checks.filter((check) => check.severity === 'error' && !check.ok).length;\n return { ok: errors === 0, warnings, errors, checks, scope: opts.scope, iterationId: opts.iterationId };\n}\n\nasync function checkDocumentationBundle(\n ws: Workspace,\n projectType: ProjectType,\n iterationId?: string,\n): Promise<ProjectAuditCheck[]> {\n const docs = iterationId\n ? deliveryDocsForIteration(projectType, iterationId)\n : deliveryDocsForProjectType(projectType);\n const checks: ProjectAuditCheck[] = [];\n for (const doc of docs) {\n const exists = await ws.exists(doc);\n checks.push({\n name: docCheckName(doc),\n severity: exists ? 'info' : 'error',\n ok: exists,\n summary: exists ? t().execute.auditDocPresent(doc) : t().execute.auditDocMissing(doc),\n });\n }\n return checks;\n}\n\nfunction docCheckName(pathName: string): string {\n if (pathName === 'README.md') return 'readme';\n if (pathName === 'docs/quickstart.md') return 'quickstart';\n if (pathName === 'docs/api-guide.md') return 'api-guide';\n if (pathName === 'docs/08-functional-test.md') return 'functional-test-doc';\n return `doc:${pathName}`;\n}\n\nasync function checkTestFiles(ws: Workspace): Promise<ProjectAuditCheck> {\n const files = await listFiles(ws, 'tests');\n const concreteTests = files.filter((file) =>\n /(?:\\.(?:test|spec)\\.ts|\\/(?:test_[^/]+|test)\\.py)$/u.test(file),\n );\n if (concreteTests.length > 0) {\n return {\n name: 'test-files',\n severity: 'info',\n ok: true,\n summary: t().execute.auditTestFilesFound(concreteTests.length),\n };\n }\n return {\n name: 'test-files',\n severity: 'warn',\n ok: false,\n summary: t().execute.auditTestFilesMissing,\n };\n}\n\nasync function runTestAudit(sandbox: Sandbox): Promise<ProjectAuditCheck> {\n const result = await sandbox.runTests([], { timeoutMs: 120_000 });\n return toExecCheck('tests', result, 'error');\n}\n\nasync function runEntryAudit(\n ws: Workspace,\n sandbox: Sandbox,\n profile: LanguageProfile,\n): Promise<ProjectAuditCheck> {\n const probe = await profile.probeEntry(ws, sandbox);\n if (probe.ok) {\n return {\n name: 'entrypoint',\n severity: 'info',\n ok: true,\n summary: t().execute.auditEntrypointOk(probe.command),\n };\n }\n return {\n name: 'entrypoint',\n severity: 'error',\n ok: false,\n summary: t().execute.auditEntrypointFailed(probe.command),\n detail: tailText(probe.stderrTail || probe.stdoutTail),\n };\n}\n\nasync function runTypeScriptAudit(ws: Workspace, sandbox: Sandbox): Promise<ProjectAuditCheck[]> {\n const pkg = await readPackageJson(ws);\n if (!pkg) {\n return [{ name: 'package-json', severity: 'error', ok: false, summary: t().execute.auditPackageJsonMissing }];\n }\n const scripts =\n pkg.scripts && typeof pkg.scripts === 'object' && !Array.isArray(pkg.scripts)\n ? (pkg.scripts as Record<string, unknown>)\n : {};\n const checks: ProjectAuditCheck[] = [];\n if (typeof scripts.build === 'string' && scripts.build.trim()) {\n const result = await sandbox.exec('npm', ['run', '--silent', 'build'], { timeoutMs: 120_000 });\n checks.push(toExecCheck('build', result, 'error'));\n } else {\n checks.push({\n name: 'build-script',\n severity: 'warn',\n ok: false,\n summary: t().execute.auditScriptMissing('build'),\n });\n }\n if (typeof scripts.lint === 'string' && scripts.lint.trim()) {\n const result = await sandbox.exec('npm', ['run', '--silent', 'lint'], { timeoutMs: 120_000 });\n checks.push(toExecCheck('lint', result, 'warn'));\n } else {\n checks.push({\n name: 'lint-script',\n severity: 'warn',\n ok: false,\n summary: t().execute.auditScriptMissing('lint'),\n });\n }\n return checks;\n}\n\nfunction toExecCheck(\n name: string,\n result: ExecResult,\n severity: 'error' | 'warn',\n): ProjectAuditCheck {\n const networkFailure = detectNetworkApiFailureInExec(result);\n if (result.exitCode === 0 && !result.timedOut && !networkFailure) {\n return {\n name,\n severity: 'info',\n ok: true,\n summary: t().execute.auditCommandOk(name),\n };\n }\n return {\n name,\n severity,\n ok: false,\n summary: networkFailure\n ? `${name} failed: ${networkFailure.message}`\n : t().execute.auditCommandFailed(name, result.exitCode, result.timedOut),\n detail: networkFailure\n ? tailText(`${networkFailure.evidence}\\n${result.stderr}\\n${result.stdout}`)\n : tailText(result.stderr || result.stdout),\n };\n}\n\nasync function readPackageJson(ws: Workspace): Promise<Record<string, unknown> | null> {\n try {\n return JSON.parse(await ws.readFile('package.json')) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nasync function listFiles(ws: Workspace, dir: string): Promise<string[]> {\n const root = ws.abs(dir);\n const out: string[] = [];\n await walk(root, dir, out);\n return out;\n}\n\nasync function walk(abs: string, rel: string, out: string[]): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await fs.readdir(abs, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (entry.name.startsWith('.')) continue;\n const childRel = `${rel}/${entry.name}`;\n const childAbs = path.join(abs, entry.name);\n if (entry.isDirectory()) {\n await walk(childAbs, childRel, out);\n } else {\n out.push(childRel);\n }\n }\n}\n\nfunction tailText(text: string): string {\n return text.split('\\n').slice(-20).join('\\n').trim();\n}\n","import path from 'node:path';\nimport { promises as fs } from 'node:fs';\n\nexport interface WorkspaceOptions {\n output?: string;\n workspace?: string;\n baseDir?: string;\n name?: string;\n}\n\nexport function defaultProjectName(now: Date = new Date()): string {\n const pad = (n: number) => n.toString().padStart(2, '0');\n return `xcompiler-${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;\n}\n\nexport async function resolveCompileWorkspace(opts: WorkspaceOptions): Promise<string> {\n const explicit = opts.output ?? opts.workspace;\n if (explicit) {\n const ws = path.resolve(explicit);\n await fs.mkdir(ws, { recursive: true });\n return ws;\n }\n const base = opts.baseDir ? path.resolve(opts.baseDir) : '/tmp';\n const name = opts.name ?? defaultProjectName();\n const ws = path.join(base, name);\n await fs.mkdir(ws, { recursive: true });\n return ws;\n}\n\nexport async function resolveEvolveWorkspace(\n opts: WorkspaceOptions,\n cwd: string = process.cwd(),\n): Promise<string> {\n const explicit = opts.output ?? opts.workspace;\n if (explicit) {\n const ws = path.resolve(explicit);\n await fs.mkdir(ws, { recursive: true });\n return ws;\n }\n const ws = path.resolve(cwd);\n await fs.mkdir(ws, { recursive: true });\n return ws;\n}\n","export type JsonRpcId = string | number | null;\n\nexport interface JsonRpcRequest {\n jsonrpc: '2.0';\n id: JsonRpcId;\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcNotification {\n jsonrpc: '2.0';\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcSuccess {\n jsonrpc: '2.0';\n id: JsonRpcId;\n result: unknown;\n}\n\nexport interface JsonRpcFailure {\n jsonrpc: '2.0';\n id: JsonRpcId;\n error: JsonRpcErrorObject;\n}\n\nexport interface JsonRpcErrorObject {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport type JsonRpcMessage =\n | JsonRpcRequest\n | JsonRpcNotification\n | JsonRpcSuccess\n | JsonRpcFailure;\n\nexport const JsonRpcErrorCode = {\n ParseError: -32700,\n InvalidRequest: -32600,\n MethodNotFound: -32601,\n InvalidParams: -32602,\n InternalError: -32603,\n SessionNotFound: -32001,\n TaskNotFound: -32002,\n PendingRequestNotFound: -32003,\n RuntimeError: -32010,\n CancellationUnsupported: -32020,\n} as const;\n\nexport const AcpMethod = {\n Initialize: 'initialize',\n Shutdown: 'shutdown',\n SessionNew: 'session/new',\n SessionPrompt: 'session/prompt',\n SessionCancel: 'session/cancel',\n SessionClose: 'session/close',\n SessionSetMode: 'session/set_mode',\n SessionUpdate: 'session/update',\n SessionRequestPermission: 'session/request_permission',\n LegacySessionCreate: 'xcompiler/session/create',\n LegacySessionClose: 'xcompiler/session/close',\n LegacyTaskStart: 'xcompiler/task/start',\n LegacyTaskCancel: 'xcompiler/task/cancel',\n LegacyConfirmationRespond: 'xcompiler/confirmation/respond',\n LegacyPermissionRespond: 'xcompiler/permission/respond',\n LegacyEvent: 'xcompiler/event',\n} as const;\n\nexport function request(id: JsonRpcId, method: string, params?: unknown): JsonRpcRequest {\n return { jsonrpc: '2.0', id, method, params };\n}\n\nexport function success(id: JsonRpcId, result: unknown): JsonRpcSuccess {\n return { jsonrpc: '2.0', id, result };\n}\n\nexport function failure(id: JsonRpcId, code: number, message: string, data?: unknown): JsonRpcFailure {\n return { jsonrpc: '2.0', id, error: { code, message, data } };\n}\n\nexport function notification(method: string, params?: unknown): JsonRpcNotification {\n return { jsonrpc: '2.0', method, params };\n}\n\nexport function isJsonRpcRequest(value: unknown): value is JsonRpcRequest {\n const msg = value as Partial<JsonRpcRequest>;\n return msg?.jsonrpc === '2.0' && typeof msg.method === 'string' && 'id' in msg;\n}\n\nexport function isJsonRpcNotification(value: unknown): value is JsonRpcNotification {\n const msg = value as Partial<JsonRpcNotification>;\n return msg?.jsonrpc === '2.0' && typeof msg.method === 'string' && !('id' in msg);\n}\n\nexport function isJsonRpcSuccess(value: unknown): value is JsonRpcSuccess {\n const msg = value as Partial<JsonRpcSuccess>;\n return msg?.jsonrpc === '2.0' && 'id' in msg && 'result' in msg && !('method' in msg);\n}\n\nexport function isJsonRpcFailure(value: unknown): value is JsonRpcFailure {\n const msg = value as Partial<JsonRpcFailure>;\n return msg?.jsonrpc === '2.0' && 'id' in msg && !!msg.error && !('method' in msg);\n}\n\nexport function isJsonRpcResponse(value: unknown): value is JsonRpcSuccess | JsonRpcFailure {\n return isJsonRpcSuccess(value) || isJsonRpcFailure(value);\n}\n","import { JsonRpcErrorCode } from './protocol.js';\n\nexport class AcpError extends Error {\n constructor(\n public readonly code: number,\n message: string,\n public readonly data?: unknown,\n ) {\n super(message);\n this.name = 'AcpError';\n }\n}\n\nexport function invalidParams(message: string, data?: unknown): AcpError {\n return new AcpError(JsonRpcErrorCode.InvalidParams, message, data);\n}\n\nexport function sessionNotFound(sessionId: string): AcpError {\n return new AcpError(JsonRpcErrorCode.SessionNotFound, `ACP session not found: ${sessionId}`);\n}\n\nexport function taskNotFound(taskId: string): AcpError {\n return new AcpError(JsonRpcErrorCode.TaskNotFound, `ACP task not found: ${taskId}`);\n}\n\nexport function pendingRequestNotFound(requestId: string): AcpError {\n return new AcpError(JsonRpcErrorCode.PendingRequestNotFound, `pending ACP request not found: ${requestId}`);\n}\n","import type { RuntimeEvent } from '../runtime/io.js';\nimport type { AcpSessionUpdate } from './types.js';\n\nexport interface AcpMappedUpdate {\n update: AcpSessionUpdate;\n legacyType: string;\n path?: string;\n}\n\nexport function mapRuntimeEventToAcpUpdates(\n event: RuntimeEvent,\n ctx: { taskId: string; phase: 'build' | 'run' },\n): AcpMappedUpdate[] {\n const meta = (legacyType: string, extra: Record<string, unknown> = {}) => ({\n xcompiler: { eventType: legacyType, taskId: ctx.taskId, phase: ctx.phase, ...extra },\n });\n\n if (event.type === 'log') {\n const legacyType = event.level === 'warning'\n ? 'warning'\n : event.level === 'error'\n ? 'error'\n : ctx.phase === 'build' ? 'build_progress' : 'run_progress';\n return [{\n legacyType,\n update: agentText(event.message, meta(legacyType, { level: event.level })),\n }];\n }\n\n if (event.type === 'progress') {\n const legacyType = ctx.phase === 'build' ? 'build_progress' : 'run_progress';\n return [{\n legacyType,\n update: agentText(event.message, meta(legacyType, { status: event.status })),\n }];\n }\n\n if (event.type === 'result') {\n const legacyType = event.command === 'build' ? 'build_completed' : 'run_completed';\n return [{\n legacyType,\n update: agentText(\n `${event.command} ${event.status}`,\n meta(legacyType, { status: event.status, data: event.data }),\n ),\n }];\n }\n\n if (event.type === 'tool_call') {\n const legacyType =\n event.tool === 'run_tests'\n ? event.status === 'started' ? 'test_started' : 'test_completed'\n : event.status === 'started' ? 'tool_call_started' : 'run_progress';\n const toolCallId = toolCallIdFor(event.stepId, event.tool);\n if (event.status === 'started') {\n return [{\n legacyType,\n update: {\n sessionUpdate: 'tool_call',\n toolCallId,\n title: event.target ? `${event.tool}: ${event.target}` : event.tool,\n kind: event.tool === 'run_tests' ? 'execute' : 'other',\n status: 'pending',\n rawInput: {\n stepId: event.stepId,\n tool: event.tool,\n target: event.target,\n },\n _meta: meta(legacyType, { stepId: event.stepId, tool: event.tool }),\n },\n }];\n }\n return [{\n legacyType,\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: event.ok === false ? 'failed' : 'completed',\n rawOutput: {\n ok: event.ok,\n summary: event.summary,\n error: event.error,\n },\n content: [{\n type: 'content',\n content: {\n type: 'text',\n text: event.summary ?? event.error ?? `${event.tool} completed`,\n },\n }],\n _meta: meta(legacyType, { stepId: event.stepId, tool: event.tool }),\n },\n }];\n }\n\n if (event.type === 'file_changed') {\n const legacyType = 'file_changed';\n return [{\n legacyType,\n path: event.path,\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId: toolCallIdFor(event.stepId, event.tool),\n status: 'completed',\n locations: [{ path: event.path }],\n content: [{\n type: 'content',\n content: { type: 'text', text: `Changed ${event.path}` },\n }],\n _meta: meta(legacyType, {\n stepId: event.stepId,\n tool: event.tool,\n path: event.path,\n }),\n },\n }];\n }\n\n if (event.type === 'patch_proposed') {\n const legacyType = 'patch_proposed';\n return [{\n legacyType,\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId: toolCallIdFor(event.stepId, event.tool),\n status: 'completed',\n content: [{\n type: 'content',\n content: { type: 'text', text: `Patch proposed:\\n\\n${event.patch}` },\n }],\n rawOutput: { patch: event.patch },\n _meta: meta(legacyType, {\n stepId: event.stepId,\n tool: event.tool,\n patch: event.patch,\n }),\n },\n }];\n }\n\n if (event.type === 'permission') {\n const legacyType = event.status === 'requested' ? 'permission_required' : `permission_${event.status}`;\n return [{\n legacyType,\n update: agentText(legacyType, meta(legacyType, { request: event.request })),\n }];\n }\n\n return [];\n}\n\nexport function agentText(text: string, meta?: Record<string, unknown>): AcpSessionUpdate {\n return {\n sessionUpdate: 'agent_message_chunk',\n content: { type: 'text', text },\n ...(meta ? { _meta: meta } : {}),\n };\n}\n\nexport function taskUpdate(\n type: string,\n taskId: string,\n message: string,\n extra: Record<string, unknown> = {},\n): AcpSessionUpdate {\n return agentText(message, { xcompiler: { eventType: type, taskId, ...extra } });\n}\n\nfunction toolCallIdFor(stepId: string | undefined, tool: string | undefined): string {\n return [stepId || 'runtime', tool || 'tool'].join(':');\n}\n","import type { ToolPermissionRequest } from '../tools/types.js';\n\nexport interface AcpPermissionChoice {\n approved: boolean;\n reason?: string;\n value?: unknown;\n}\n\nexport function toAcpPermissionRequestParams(\n sessionId: string,\n requestId: string,\n taskId: string,\n request: ToolPermissionRequest,\n): Record<string, unknown> {\n return {\n sessionId,\n toolCall: {\n toolCallId: requestId,\n title: `${request.operationType}: ${request.target}`,\n kind: permissionKind(request.operationType),\n status: 'pending',\n rawInput: {\n operationType: request.operationType,\n target: request.target,\n reason: request.reason,\n risk: request.risk,\n scope: request.scope,\n skippable: request.skippable,\n denyBehavior: request.denyBehavior,\n stepId: request.stepId,\n tool: request.tool,\n metadata: request.metadata,\n },\n content: [{\n type: 'content',\n content: {\n type: 'text',\n text: [\n `Operation: ${request.operationType}`,\n `Target: ${request.target}`,\n `Reason: ${request.reason}`,\n `Risk: ${request.risk}`,\n `Scope: ${request.scope}`,\n `Deny behavior: ${request.denyBehavior}`,\n ].join('\\n'),\n },\n }],\n _meta: {\n xcompiler: {\n eventType: 'permission_required',\n taskId,\n requestId,\n operationType: request.operationType,\n target: request.target,\n },\n },\n },\n options: [\n {\n optionId: 'allow_once',\n name: 'Allow once',\n kind: 'allow_once',\n },\n {\n optionId: 'reject_once',\n name: request.skippable ? 'Skip' : 'Reject',\n kind: 'reject_once',\n },\n ],\n };\n}\n\nexport function toAcpInteractionPermissionParams(input: {\n sessionId: string;\n requestId: string;\n taskId: string;\n kind: string;\n message: string;\n choices?: Array<{ name: string; value: string }>;\n defaultValue?: unknown;\n}): Record<string, unknown> {\n const choices = input.choices?.length\n ? input.choices.map((choice) => ({\n optionId: choice.value,\n name: choice.name,\n kind: 'allow_once',\n }))\n : [\n { optionId: 'allow_once', name: 'Allow', kind: 'allow_once' },\n { optionId: 'reject_once', name: 'Reject', kind: 'reject_once' },\n ];\n return {\n sessionId: input.sessionId,\n toolCall: {\n toolCallId: input.requestId,\n title: input.message,\n kind: 'think',\n status: 'pending',\n rawInput: {\n interactionKind: input.kind,\n message: input.message,\n choices: input.choices,\n default: input.defaultValue,\n },\n content: [{\n type: 'content',\n content: { type: 'text', text: input.message },\n }],\n _meta: {\n xcompiler: {\n eventType: 'build_confirmation_required',\n taskId: input.taskId,\n requestId: input.requestId,\n interactionKind: input.kind,\n },\n },\n },\n options: choices,\n };\n}\n\nexport function parsePermissionChoice(result: unknown): AcpPermissionChoice {\n const record = asRecord(result);\n const outcome = asRecord(record.outcome ?? record);\n const optionId = typeof outcome.optionId === 'string'\n ? outcome.optionId\n : typeof record.optionId === 'string'\n ? record.optionId\n : undefined;\n const cancelled = outcome.outcome === 'cancelled' || record.cancelled === true;\n if (cancelled) return { approved: false, reason: 'cancelled' };\n if (!optionId) return { approved: false, reason: 'permission response did not include optionId' };\n return {\n approved: optionId.startsWith('allow') || optionId === 'approve' || optionId === 'approved',\n value: optionId,\n };\n}\n\nfunction permissionKind(operationType: ToolPermissionRequest['operationType']): string {\n if (operationType.includes('file') || operationType.includes('write') || operationType.includes('delete')) return 'edit';\n if (operationType.includes('shell') || operationType.includes('command') || operationType.includes('test')) return 'execute';\n return 'other';\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {};\n}\n","import { randomUUID } from 'node:crypto';\nimport { pendingRequestNotFound, sessionNotFound, taskNotFound } from './errors.js';\nimport type { AcpSession, AcpTask, PendingInteraction, PendingPermission } from './types.js';\n\nexport class AcpSessionStore {\n private readonly sessions = new Map<string, AcpSession>();\n\n create(workspace?: string): AcpSession {\n const session: AcpSession = {\n id: randomUUID(),\n workspace,\n createdAt: new Date().toISOString(),\n tasks: new Map(),\n pendingInteractions: new Map(),\n pendingPermissions: new Map(),\n };\n this.sessions.set(session.id, session);\n return session;\n }\n\n get(sessionId: string): AcpSession {\n const session = this.sessions.get(sessionId);\n if (!session) throw sessionNotFound(sessionId);\n return session;\n }\n\n close(sessionId: string): void {\n const session = this.get(sessionId);\n for (const pending of session.pendingInteractions.values()) {\n pending.reject(new Error('ACP session closed'));\n }\n for (const pending of session.pendingPermissions.values()) {\n pending.reject(new Error('ACP session closed'));\n }\n this.sessions.delete(session.id);\n }\n\n closeAll(): void {\n for (const id of [...this.sessions.keys()]) this.close(id);\n }\n\n createTask(session: AcpSession, input: { workspace: string; userTask: string; protocol: 'acp' | 'legacy' }): AcpTask {\n const task: AcpTask = {\n id: randomUUID(),\n sessionId: session.id,\n status: 'running',\n workspace: input.workspace,\n userTask: input.userTask,\n protocol: input.protocol,\n phase: 'build',\n changedFiles: [],\n startedAt: new Date().toISOString(),\n };\n session.tasks.set(task.id, task);\n return task;\n }\n\n getTask(sessionId: string, taskId: string): AcpTask {\n const session = this.get(sessionId);\n const task = session.tasks.get(taskId);\n if (!task) throw taskNotFound(taskId);\n return task;\n }\n\n addInteraction(session: AcpSession, pending: PendingInteraction): void {\n session.pendingInteractions.set(pending.id, pending);\n const task = session.tasks.get(pending.taskId);\n if (task) task.status = 'waiting_for_confirmation';\n }\n\n resolveInteraction(sessionId: string, requestId: string, value: unknown): void {\n const session = this.get(sessionId);\n const pending = session.pendingInteractions.get(requestId);\n if (!pending) throw pendingRequestNotFound(requestId);\n session.pendingInteractions.delete(requestId);\n const task = session.tasks.get(pending.taskId);\n if (task && task.status === 'waiting_for_confirmation') task.status = 'running';\n pending.resolve(value);\n }\n\n addPermission(session: AcpSession, pending: PendingPermission): void {\n session.pendingPermissions.set(pending.id, pending);\n const task = session.tasks.get(pending.taskId);\n if (task) task.status = 'waiting_for_permission';\n }\n\n resolvePermission(sessionId: string, requestId: string, approved: boolean, reason?: string): void {\n const session = this.get(sessionId);\n const pending = session.pendingPermissions.get(requestId);\n if (!pending) throw pendingRequestNotFound(requestId);\n session.pendingPermissions.delete(requestId);\n const task = session.tasks.get(pending.taskId);\n if (task && task.status === 'waiting_for_permission') task.status = 'running';\n pending.resolve(approved, reason);\n }\n}\n","import type {\n RuntimeBuildCommandOptions,\n RuntimeBuildCommandResult,\n RuntimeRunCommandOptions,\n} from '../runtime/commands.js';\nimport type { ExecuteResult } from '../runtime/run.js';\n\nexport const ACP_PROTOCOL_VERSION = 1;\n\nexport type AcpPromptStopReason = 'end_turn' | 'cancelled';\n\nexport interface AcpInitializeResult {\n protocolVersion: number;\n agentInfo: {\n name: 'xcompiler';\n title: string;\n version: string;\n };\n agentCapabilities: {\n loadSession: boolean;\n promptCapabilities: {\n image: boolean;\n audio: boolean;\n embeddedContext: boolean;\n };\n mcpCapabilities: {\n http: boolean;\n sse: boolean;\n };\n sessionCapabilities: {\n close: Record<string, never>;\n };\n auth: Record<string, never>;\n };\n authMethods: unknown[];\n}\n\nexport interface AcpPromptResponse {\n stopReason: AcpPromptStopReason;\n}\n\nexport interface AcpSessionUpdate {\n sessionUpdate: string;\n [key: string]: unknown;\n}\n\nexport interface AcpSession {\n id: string;\n workspace?: string;\n createdAt: string;\n tasks: Map<string, AcpTask>;\n pendingInteractions: Map<string, PendingInteraction>;\n pendingPermissions: Map<string, PendingPermission>;\n}\n\nexport type AcpTaskStatus =\n | 'running'\n | 'waiting_for_confirmation'\n | 'waiting_for_permission'\n | 'completed'\n | 'failed'\n | 'cancel_requested'\n | 'cancelled';\n\nexport interface AcpTask {\n id: string;\n sessionId: string;\n status: AcpTaskStatus;\n workspace: string;\n userTask: string;\n protocol: 'acp' | 'legacy';\n phase: 'build' | 'run' | 'complete';\n planPath?: string;\n changedFiles: string[];\n startedAt: string;\n completedAt?: string;\n cancellationRequested?: boolean;\n}\n\nexport interface PendingInteraction {\n id: string;\n taskId: string;\n sessionId: string;\n phase: 'build' | 'run';\n kind: 'input' | 'confirm' | 'select' | 'editor' | 'multiline';\n message: string;\n choices?: Array<{ name: string; value: string }>;\n resolve: (value: unknown) => void;\n reject: (reason: Error) => void;\n}\n\nexport interface PendingPermission {\n id: string;\n taskId: string;\n sessionId: string;\n request: unknown;\n resolve: (approved: boolean, reason?: string) => void;\n reject: (reason: Error) => void;\n}\n\nexport interface AcpCodeTaskParams {\n sessionId: string;\n workspace: string;\n task: string;\n configPath?: string;\n intent?: RuntimeBuildCommandOptions['intent'];\n requirePlanConfirmation?: boolean;\n autoRunAfterBuild?: boolean;\n force?: boolean;\n}\n\nexport interface AcpRuntimeFacade {\n build(opts: RuntimeBuildCommandOptions): Promise<RuntimeBuildCommandResult>;\n run(opts: RuntimeRunCommandOptions): Promise<ExecuteResult>;\n}\n\nexport interface AcpServerLogger {\n info(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n}\n\nexport interface AcpServerOptions {\n runtime?: AcpRuntimeFacade;\n logger?: AcpServerLogger;\n}\n","import readline from 'node:readline';\nimport type { Readable, Writable } from 'node:stream';\nimport {\n failure,\n JsonRpcErrorCode,\n type JsonRpcMessage,\n} from './protocol.js';\n\nexport interface AcpTransport {\n send(message: JsonRpcMessage): void;\n onMessage(handler: (message: unknown) => void | Promise<void>): void;\n onClose(handler: () => void | Promise<void>): void;\n start(): Promise<void>;\n close(): void;\n}\n\nexport class StdioTransport implements AcpTransport {\n private messageHandler: ((message: unknown) => void | Promise<void>) | undefined;\n private closeHandler: (() => void | Promise<void>) | undefined;\n private closed = false;\n private rl?: readline.Interface;\n\n constructor(\n private readonly input: Readable = process.stdin,\n private readonly output: Writable = process.stdout,\n ) {}\n\n send(message: JsonRpcMessage): void {\n if (this.closed) return;\n this.output.write(JSON.stringify(message) + '\\n');\n }\n\n onMessage(handler: (message: unknown) => void | Promise<void>): void {\n this.messageHandler = handler;\n }\n\n onClose(handler: () => void | Promise<void>): void {\n this.closeHandler = handler;\n }\n\n async start(): Promise<void> {\n this.rl = readline.createInterface({\n input: this.input,\n crlfDelay: Infinity,\n terminal: false,\n });\n for await (const line of this.rl) {\n if (this.closed) break;\n const trimmed = line.trim();\n if (!trimmed) continue;\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch (err) {\n this.send(failure(null, JsonRpcErrorCode.ParseError, (err as Error).message));\n continue;\n }\n void Promise.resolve(this.messageHandler?.(parsed)).catch((err: unknown) => {\n this.send(failure(null, JsonRpcErrorCode.InternalError, (err as Error).message ?? String(err)));\n });\n }\n this.closed = true;\n await this.closeHandler?.();\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.rl?.close();\n }\n}\n","import { AcpServer } from './server.js';\nimport { StdioTransport } from './transport.js';\n\nexport { AcpServer } from './server.js';\nexport { StdioTransport, type AcpTransport } from './transport.js';\nexport { AcpMethod, JsonRpcErrorCode } from './protocol.js';\nexport type {\n JsonRpcFailure,\n JsonRpcId,\n JsonRpcMessage,\n JsonRpcNotification,\n JsonRpcRequest,\n JsonRpcSuccess,\n} from './protocol.js';\nexport type {\n AcpCodeTaskParams,\n AcpInitializeResult,\n AcpRuntimeFacade,\n AcpServerLogger,\n AcpServerOptions,\n AcpSession,\n AcpTask,\n} from './types.js';\n\nexport async function runAcpStdioServer(): Promise<void> {\n const server = new AcpServer();\n await server.start(new StdioTransport());\n}\n"],"mappings":"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","names":["t","path","randomUUID","path","fs","path","z","path","path","PYTHON_PLANNER_SYSTEM","PYTHON_EXECUTOR_SYSTEM","TYPESCRIPT_PLANNER_SYSTEM","TYPESCRIPT_EXECUTOR_SYSTEM","buildPlannerSystem","buildExecutorSystem","messages","path","fs","path","current","transitivelyDependsOn","t","codeSteps","current","path","z","path","fs","path","fs","path","fs","fs","path","z","z","path","path","fs","URL","messages","URL","t","messages","messages","fs","path","YAML","path","fs","YAML","fs","path","fs","path","path","fs","path","dedup","t","requiredImplementationPhaseCount","current","fs","path","fs","path","path","fs","path","listProjectFiles","joinCappedSections","dedup","fs","walk","fs","path","path","messages","fs","fs","path","current","messages","current","path","fs","path","path","r","existsSync","fs","path","path","fs","t","fs","path","crypto","path","fs","crypto","r","existsSync","path","chalk","path","fs","path","fs","path","fs","walk","t","fs","t","fs","path","isAllowedWrite","fs","path","fs","path","t","r","path","fs","t","messages","fs","path","r","metrics","truncate","t","fs","path","fs","path","walk","fs","path","request","chalk","failureLog","dedup","reason","path","current","path","request","path","fs","ws","path","request","response","path","asRecord","request","randomUUID"]}