magpie-agent-console 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -2
- package/app/app.css +1 -1
- package/app/app.js +90 -89
- package/daemon/dist/main.js +1224 -150
- package/daemon/dist/main.js.map +1 -1
- package/index.mjs +4 -0
- package/package.json +3 -2
package/daemon/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/log.ts","../src/util/i18n.ts","../src/util/paths.ts","../src/util/queue.ts","../src/agents/diff.ts","../src/providers/slash.ts","../src/providers/mock.ts","../../lib/pathscan.mjs","../src/util/bin.ts","../src/agents/kinds.ts","../src/providers/claude/map.ts","../src/util/attachmentRefs.ts","../src/util/attachmentKinds.ts","../src/providers/claude/content.ts","../src/providers/launch.ts","../src/providers/claude/cli.ts","../src/providers/claude/session.ts","../src/providers/claude/models.ts","../src/history/import.ts","../src/providers/claude/provider.ts","../src/history/codex.ts","../src/providers/codex/rpc.ts","../src/providers/codex/input.ts","../src/providers/codex/map.ts","../src/providers/codex/commands.ts","../src/providers/codex/session.ts","../src/providers/types.ts","../src/providers/codex/provider.ts","../src/providers/catalog.ts","../src/providers/acp/spawn.ts","../src/providers/acp/clientHandlers.ts","../src/providers/acp/mapUpdate.ts","../src/providers/acp/promptCaps.ts","../src/providers/acp/sessionCaps.ts","../src/providers/acp/prompt.ts","../src/providers/acp/session.ts","../src/providers/acp/provider.ts","../src/providers/acp/dsh.ts","../src/providers/acp/probe.ts","../src/providers/acp/specs.ts","../src/providers/registry.ts","../src/providers/enabled.ts","../src/util/pickFolderWin.ts","../src/util/pickFolder.ts","../src/providers/magpieGateway.ts","../src/providers/infoCache.ts","../src/providers/modes.ts","../src/ws/methods.ts","../src/util/atomic.ts","../src/store/settings.ts","../src/util/jsonl.ts","../src/migrate/legacy.ts","../src/providers/warm.ts","../src/main.ts","../src/config.ts","../src/util/buildStamp.ts","../src/http.ts","../src/security.ts","../src/store/attachments.ts","../src/store/projects.ts","../src/store/threads.ts","../src/ws/gateway.ts","../src/agents/manager.ts","../src/timeline/coalescer.ts","../src/git/service.ts","../src/files/service.ts","../src/terminal/service.ts","../src/util/proc.ts"],"sourcesContent":["// Simple logging: writes dataDir/logs/daemon-YYYY-MM-DD.log (kept 7 days) and to the console.\nimport { appendFileSync, mkdirSync, readdirSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nlet logDir = \"\";\nlet today = \"\";\nlet logFile = \"\";\n\nfunction fileName(d: Date): string {\n const p = (n: number) => String(n).padStart(2, \"0\");\n return `daemon-${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}.log`;\n}\n\nexport function initLog(dataDir: string): void {\n logDir = join(dataDir, \"logs\");\n mkdirSync(logDir, { recursive: true });\n // Keep 7 days\n try {\n const keep = new Set<string>();\n const now = new Date();\n for (let i = 0; i < 7; i++) {\n keep.add(fileName(new Date(now.getTime() - i * 86400000)));\n }\n for (const f of readdirSync(logDir)) {\n if (/^daemon-\\d{4}-\\d{2}-\\d{2}\\.log$/.test(f) && !keep.has(f)) {\n rmSync(join(logDir, f), { force: true });\n }\n }\n } catch {}\n}\n\n// The console is a pipe to the plugin host. When the host is killed hard, the reader is gone and a write fails with EPIPE\n// (asynchronously, as an 'error' event on the stream): without a listener that becomes an uncaughtException. Once that happens\n// the console is dropped and only the log file is written.\nlet consoleGone = false;\nlet guarded = false;\nfunction guardConsole(): void {\n if (guarded) return;\n guarded = true;\n for (const stream of [process.stdout, process.stderr]) {\n // EPIPE, EIO, ERR_STREAM_DESTROYED…: any write error means the reader is gone; logging must never take the daemon down\n stream?.on?.(\"error\", () => { consoleGone = true; });\n }\n}\nexport function consoleClosed(): boolean {\n return consoleGone;\n}\n\nexport function log(level: \"info\" | \"warn\" | \"error\", msg: string, extra?: unknown): void {\n const line = `[${new Date().toISOString()}] [${level}] ${msg}${extra !== undefined ? \" \" + safeJson(extra) : \"\"}`;\n try {\n const d = new Date();\n const name = fileName(d);\n if (name !== today && logDir) {\n today = name;\n logFile = join(logDir, name);\n }\n if (logFile) appendFileSync(logFile, line + \"\\n\", \"utf8\");\n } catch {}\n guardConsole();\n if (consoleGone) return;\n const stream = level === \"info\" ? process.stdout : process.stderr;\n if (stream?.destroyed || stream?.writableEnded) { consoleGone = true; return; }\n const fn = level === \"error\" ? console.error : level === \"warn\" ? console.warn : console.log;\n try {\n fn(`[agent-console] ${msg}`, extra !== undefined ? extra : \"\");\n } catch {\n consoleGone = true;\n }\n}\n\nfunction safeJson(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n","/** Same as the frontend's normalizeLang */\nexport type AppLocale = \"zh\" | \"en\";\n\nlet locale: AppLocale = \"zh\";\n\nexport function normalizeLang(raw: string | null | undefined): AppLocale {\n const s = String(raw ?? \"\").trim().toLowerCase();\n if (!s) return \"zh\";\n if (s === \"zh\" || s.startsWith(\"zh-\")) return \"zh\";\n return \"en\";\n}\n\nexport function setAppLocale(lang: string | undefined): void {\n locale = normalizeLang(lang);\n}\n\nexport function getAppLocale(): AppLocale {\n return locale;\n}\n\nexport function intlLocale(): string {\n return locale === \"zh\" ? \"zh-CN\" : \"en-US\";\n}\n\nconst dict: Record<AppLocale, Record<string, string>> = {\n zh: {\n \"thread.defaultTitle\": \"新对话\",\n \"notice.daemonRestart\": \"后台已重启,本轮已中断\",\n \"notice.sessionStartFailed\": \"会话启动失败:{detail}\",\n \"notice.sendFailed\": \"发送失败:{detail}\",\n \"notice.effortNextTurn\": \"思考强度已保存,将在下一轮生效\",\n \"notice.effortResetOnModel\": \"当前模型不支持该思考强度,已恢复为 Default\",\n \"turn.agentExit\": \"Agent 进程意外退出\",\n \"attachment.missing\": \"附件不存在或已失效({ref}),请重新上传\",\n \"notice.acpImageByPath\": \"{agent} 不能直接看图片(它的 ACP 初始化未声明支持图片输入),已改为发送图片的文件路径:{paths}\",\n \"notice.acpImageByPathSwitched\": \"{agent} 是在另一个模型上启动的,只对那个模型接收图片,这次改为发送图片的文件路径(当前模型能看图时它会用 read_image 打开):{paths}\",\n \"notice.acpSessionNotRestored\": \"{agent} 不能恢复上一轮对话(它的 ACP 既不支持 session/load 也不支持 session/resume),已新开一轮;先前的上下文不会带回。\",\n \"notice.attachmentIssue\": \"附件问题:{detail}\",\n \"claude.notFound\": \"找不到 claude({detail})。本插件不附带 Claude Code,请先安装:{hint}\",\n \"claude.startFailed\": \"无法启动 claude:{detail}\",\n \"claude.exited\": \"claude 进程意外退出({code})\",\n \"claude.notRunning\": \"claude 没有在运行,消息未发出\",\n \"claude.closed\": \"会话已关闭\",\n \"export.defaultModel\": \"默认\",\n \"bin.notOnPath\": \"PATH 里找不到 {name}\",\n \"bin.or\": \" 或 \",\n \"launch.notFound\": \"找不到自定义的可执行文件:{cmd}(请填写绝对路径,或 PATH 里能找到的命令名)\",\n \"codex.notFound\": \"找不到 codex({detail})。请先安装:{hint}\",\n \"provider.disabled\": \"已在设置中禁用\",\n \"provider.planned\": \"尚未接入\",\n \"provider.disabledNamed\": \"{name} 已在设置中禁用\",\n \"provider.plannedNamed\": \"{name} 尚未接入,暂不能新建对话\",\n \"provider.unavailable\": \"{name} 未安装或不可用\",\n \"provider.unknown\": \"未知 Agent:{id}\",\n \"provider.timeout\": \"检测超时\",\n \"err.projectMissing\": \"项目不存在\",\n \"err.threadMissing\": \"对话不存在\",\n \"err.dirMissing\": \"目录不存在或不是文件夹\",\n \"err.projectDirGone\": \"项目目录已不存在\",\n \"err.terminalMissing\": \"终端不存在\",\n \"err.noManager\": \"会话管理器未启动\",\n \"err.badParams\": \"参数不对:{detail}\",\n \"export.me\": \"我\",\n \"export.steered\": \"(插话)\",\n \"export.reasoning\": \"思考\",\n \"export.plan\": \"计划\",\n \"export.todo\": \"待办\",\n \"err.requestGone\": \"授权/提问不存在或已回应\",\n \"err.badOption\": \"optionId 非法:{id}\",\n \"err.cursorOnly\": \"仅 Cursor 对话支持该选项\",\n \"err.busySwitch\": \"对话运行中,不能更换 Agent\",\n \"err.hasMessages\": \"已有消息,不能更换 Agent\",\n \"tool.read\": \"读取 {x}\",\n \"tool.edit\": \"编辑 {x}\",\n \"tool.multiEdit\": \"编辑 {x}({n} 处)\",\n \"tool.overwrite\": \"覆盖 {x}\",\n \"tool.create\": \"新建 {x}\",\n \"tool.notebook\": \"编辑笔记本 {x}\",\n \"tool.run\": \"运行 {x}\",\n \"tool.output\": \"查看输出 {x}\",\n \"tool.kill\": \"结束进程 {x}\",\n \"tool.grep\": \"搜索 \\\"{x}\\\"\",\n \"tool.glob\": \"查找 {x}\",\n \"tool.fetch\": \"打开 {x}\",\n \"tool.webSearch\": \"搜索网页 \\\"{x}\\\"\",\n \"tool.todo\": \"更新待办({done}/{n})\",\n \"tool.task\": \"子任务:{x}\",\n \"tool.generic\": \"工具\",\n \"tool.editFiles\": \"修改 {n} 个文件\",\n \"tool.needsApproval\": \"需要授权\",\n \"perm.editFiles\": \"修改文件\",\n \"perm.allow\": \"允许\",\n \"perm.allowSession\": \"本对话都允许\",\n \"perm.deny\": \"拒绝\",\n \"perm.plan\": \"Agent 提交了计划\",\n \"perm.implement\": \"实施\",\n \"http.internal\": \"服务内部错误\",\n \"http.badOrigin\": \"来源不允许\",\n \"http.badPreflight\": \"预检不允许\",\n \"http.badToken\": \"令牌无效\",\n \"http.noAttachment\": \"附件不存在\",\n \"http.method\": \"方法不允许\",\n \"http.noApp\": \"app 还没构建(缺 app/index.html)\",\n \"http.badPath\": \"路径不合法\",\n \"http.pathDenied\": \"路径不允许\",\n \"http.noFile\": \"文件不存在\",\n \"http.badType\": \"不支持的文件类型\",\n \"http.tooLarge\": \"文件太大(上限 50MB)\",\n \"http.noRoute\": \"接口不存在\",\n \"codex.error\": \"Codex 错误\",\n \"codex.closed\": \"会话已关闭\",\n \"codex.noTurnSteer\": \"当前轮次还没开始,无法插话\",\n \"acp.exited\": \"{name} 进程退出 ({code})\",\n \"notice.apiRetry\": \"API 重试中(第 {n} 次)\",\n \"notice.compacted\": \"上下文已压缩\",\n \"term.max\": \"每个项目最多 {n} 个终端\",\n \"term.title\": \"终端 {n}\",\n \"stub.planned\": \"该 Agent 尚未在 Agent Console 接入,敬请期待\",\n \"stub.unverified\": \"已检测到 CLI,会话驱动尚未完全验证\",\n \"stub.notFound\": \"未找到 {bin}\",\n \"history.untitled\": \"(无标题)\",\n \"history.toolCall\": \"(历史)调用 {name}\",\n \"fs.pathDenied\": \"路径不允许\",\n \"fs.dirMissing\": \"目录不存在\",\n \"fs.dirUnreadable\": \"无法读取目录\",\n \"fs.fileMissing\": \"文件不存在\",\n \"fs.notFile\": \"不是文件\",\n \"fs.unreadable\": \"无法读取\",\n \"git.missing\": \"找不到 git(请先安装 git 并加入 PATH)\",\n \"git.binary\": \"二进制或无法读取\",\n },\n en: {\n \"thread.defaultTitle\": \"New chat\",\n \"notice.daemonRestart\": \"Daemon restarted — this turn was interrupted\",\n \"notice.sessionStartFailed\": \"Session start failed: {detail}\",\n \"notice.sendFailed\": \"Send failed: {detail}\",\n \"notice.effortNextTurn\": \"Reasoning effort saved — takes effect on the next turn\",\n \"notice.effortResetOnModel\": \"This model does not support that effort level; reset to Default\",\n \"turn.agentExit\": \"Agent process exited unexpectedly\",\n \"attachment.missing\": \"Attachment missing or expired ({ref}) — upload again\",\n \"notice.acpImageByPath\": \"{agent} can't see images directly (its ACP initialize doesn't advertise image input); sent the image file path instead: {paths}\",\n \"notice.acpImageByPathSwitched\": \"{agent} was started on another model and takes image blocks only for that one, so the image went as its file path (it opens it with read_image when this model sees images): {paths}\",\n \"notice.acpSessionNotRestored\": \"{agent} can't restore the previous conversation (its ACP advertises neither session/load nor session/resume); started a new one — prior context won't come back.\",\n \"notice.attachmentIssue\": \"Attachment issue: {detail}\",\n \"claude.notFound\": \"claude was not found ({detail}). Claude Code is not bundled with this plugin; install it first: {hint}\",\n \"claude.startFailed\": \"Could not start claude: {detail}\",\n \"claude.exited\": \"claude exited unexpectedly ({code})\",\n \"claude.notRunning\": \"claude is not running; the message was not sent\",\n \"claude.closed\": \"The session is closed\",\n \"export.defaultModel\": \"Default\",\n \"bin.notOnPath\": \"{name} was not found on PATH\",\n \"bin.or\": \" or \",\n \"launch.notFound\": \"Custom executable not found: {cmd} (use an absolute path or a command name on PATH)\",\n \"codex.notFound\": \"codex was not found ({detail}). Install it first: {hint}\",\n \"provider.disabled\": \"Disabled in Settings\",\n \"provider.planned\": \"Not supported yet\",\n \"provider.disabledNamed\": \"{name} is disabled in Settings\",\n \"provider.plannedNamed\": \"{name} is not supported yet; it can't start new conversations\",\n \"provider.unavailable\": \"{name} is not installed or not available\",\n \"provider.unknown\": \"Unknown agent: {id}\",\n \"provider.timeout\": \"Detection timed out\",\n \"err.projectMissing\": \"Project not found\",\n \"err.threadMissing\": \"Conversation not found\",\n \"err.dirMissing\": \"The folder does not exist or is not a folder\",\n \"err.projectDirGone\": \"The project folder no longer exists\",\n \"err.terminalMissing\": \"Terminal not found\",\n \"err.noManager\": \"The session manager is not running\",\n \"err.badParams\": \"Invalid parameters: {detail}\",\n \"export.me\": \"Me\",\n \"export.steered\": \" (steer)\",\n \"export.reasoning\": \"Reasoning\",\n \"export.plan\": \"Plan\",\n \"export.todo\": \"Todos\",\n \"err.requestGone\": \"That approval or question no longer exists or was already answered\",\n \"err.badOption\": \"Invalid optionId: {id}\",\n \"err.cursorOnly\": \"Only Cursor conversations support this option\",\n \"err.busySwitch\": \"The conversation is running; the agent can't be changed\",\n \"err.hasMessages\": \"The conversation already has messages; the agent can't be changed\",\n \"tool.read\": \"Read {x}\",\n \"tool.edit\": \"Edit {x}\",\n \"tool.multiEdit\": \"Edit {x} ({n} edits)\",\n \"tool.overwrite\": \"Overwrite {x}\",\n \"tool.create\": \"Create {x}\",\n \"tool.notebook\": \"Edit notebook {x}\",\n \"tool.run\": \"Run {x}\",\n \"tool.output\": \"Read output {x}\",\n \"tool.kill\": \"Stop process {x}\",\n \"tool.grep\": \"Search \\\"{x}\\\"\",\n \"tool.glob\": \"Find {x}\",\n \"tool.fetch\": \"Open {x}\",\n \"tool.webSearch\": \"Web search \\\"{x}\\\"\",\n \"tool.todo\": \"Update todos ({done}/{n})\",\n \"tool.task\": \"Subtask: {x}\",\n \"tool.generic\": \"Tool\",\n \"tool.editFiles\": \"Edit {n} file(s)\",\n \"tool.needsApproval\": \"Needs approval\",\n \"perm.editFiles\": \"Edit files\",\n \"perm.allow\": \"Allow\",\n \"perm.allowSession\": \"Allow for this chat\",\n \"perm.deny\": \"Deny\",\n \"perm.plan\": \"The agent proposed a plan\",\n \"perm.implement\": \"Implement\",\n \"http.internal\": \"Internal error\",\n \"http.badOrigin\": \"Origin not allowed\",\n \"http.badPreflight\": \"Preflight not allowed\",\n \"http.badToken\": \"Invalid token\",\n \"http.noAttachment\": \"Attachment not found\",\n \"http.method\": \"Method not allowed\",\n \"http.noApp\": \"The app is not built (app/index.html is missing)\",\n \"http.badPath\": \"Invalid path\",\n \"http.pathDenied\": \"Path not allowed\",\n \"http.noFile\": \"File not found\",\n \"http.badType\": \"Unsupported file type\",\n \"http.tooLarge\": \"File too large (50 MB max)\",\n \"http.noRoute\": \"No such endpoint\",\n \"codex.error\": \"Codex error\",\n \"codex.closed\": \"The session is closed\",\n \"codex.noTurnSteer\": \"The turn hasn't started yet; can't steer\",\n \"acp.exited\": \"{name} exited ({code})\",\n \"notice.apiRetry\": \"Retrying the API (attempt {n})\",\n \"notice.compacted\": \"Context compacted\",\n \"term.max\": \"At most {n} terminals per project\",\n \"term.title\": \"Terminal {n}\",\n \"stub.planned\": \"This agent isn't supported in Agent Console yet\",\n \"stub.unverified\": \"CLI found; its session driver isn't fully verified yet\",\n \"stub.notFound\": \"{bin} was not found\",\n \"history.untitled\": \"(untitled)\",\n \"history.toolCall\": \"(history) called {name}\",\n \"fs.pathDenied\": \"Path not allowed\",\n \"fs.dirMissing\": \"Folder not found\",\n \"fs.dirUnreadable\": \"Can't read the folder\",\n \"fs.fileMissing\": \"File not found\",\n \"fs.notFile\": \"Not a file\",\n \"fs.unreadable\": \"Can't read the file\",\n \"git.missing\": \"git was not found (install git and add it to PATH)\",\n \"git.binary\": \"Binary or unreadable\",\n },\n};\n\nexport function tr(key: string, params?: Record<string, string | number>): string {\n let s = dict[locale][key] ?? dict.en[key] ?? key;\n if (params) {\n for (const [k, v] of Object.entries(params)) s = s.replaceAll(`{${k}}`, String(v));\n }\n return s;\n}\n","// Path utilities: normalization, samePath, isInside (decided after resolving realpath).\nimport { realpathSync, existsSync } from \"node:fs\";\nimport { posix, sep, win32 } from \"node:path\";\n\n// Normalization: realpath (when it exists) + unified separators + case-insensitive on Windows/macOS (NTFS and APFS are case-insensitive by default).\n// Only for comparison/dedupe, never for display or storage.\nexport function normPath(p: string, platform: NodeJS.Platform = process.platform): string {\n // Resolve with the target platform's rules: normalizing a macOS/Linux path on Windows must not prepend the host drive (D:\\…)\n let r = (platform === \"win32\" ? win32 : posix).resolve(p);\n try {\n // native restores 8.3 short names (C:\\PROGRA~1), subst drives and letter case to what's on disk; fall back to the JS implementation on failure\n r = realpathSync.native(r);\n } catch {\n try {\n r = realpathSync(r);\n } catch {}\n }\n if (platform === \"win32\") {\n // Strip the \\\\?\\ long-path prefix; UNC stays \\\\server\\share\n r = r.replace(/\\//g, \"\\\\\").replace(/^\\\\\\\\\\?\\\\(?!UNC\\\\)/i, \"\").replace(/^\\\\\\\\\\?\\\\UNC\\\\/i, \"\\\\\\\\\").toLowerCase();\n } else {\n r = r.replace(/\\\\/g, \"/\");\n if (platform === \"darwin\") r = r.normalize(\"NFC\").toLowerCase();\n }\n // Strip trailing separators (except for the root)\n while (r.length > 3 && (r.endsWith(\"/\") || r.endsWith(\"\\\\\"))) r = r.slice(0, -1);\n return r;\n}\n\nexport function samePath(a: string, b: string): boolean {\n return normPath(a) === normPath(b);\n}\n\n// Whether child is inside the parent directory (including equal).\nexport function isInside(child: string, parent: string): boolean {\n const c = normPath(child);\n const p = normPath(parent);\n if (c === p) return true;\n return c.startsWith(p + sep) || c.startsWith(p + \"/\") || c.startsWith(p + \"\\\\\");\n}\n\n// id check: only safe characters, prevents path traversal.\nconst ID_RE = /^[\\w-]{1,80}$/;\nexport function validId(id: unknown): id is string {\n return typeof id === \"string\" && ID_RE.test(id);\n}\n\nexport function pathExists(p: string): boolean {\n return existsSync(p);\n}\n","// AsyncQueue: push/close/[Symbol.asyncIterator], the prompt input stream for the Claude SDK.\nexport class AsyncQueue<T> implements AsyncIterable<T> {\n private buf: T[] = [];\n private waiters: ((v: IteratorResult<T>) => void)[] = [];\n private closed = false;\n private err: unknown = null;\n\n push(item: T): void {\n if (this.closed) return;\n const w = this.waiters.shift();\n if (w) w({ value: item, done: false });\n else this.buf.push(item);\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n while (this.waiters.length) {\n const w = this.waiters.shift()!;\n w({ value: undefined as never, done: true });\n }\n }\n\n fail(err: unknown): void {\n if (this.closed) return;\n this.err = err;\n this.closed = true;\n while (this.waiters.length) {\n const w = this.waiters.shift()!;\n // Make waiters throw\n w({ value: undefined as never, done: true });\n }\n }\n\n get isClosed(): boolean {\n return this.closed;\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: (): Promise<IteratorResult<T>> => {\n if (this.buf.length) return Promise.resolve({ value: this.buf.shift()!, done: false });\n if (this.closed) {\n if (this.err) return Promise.reject(this.err);\n return Promise.resolve({ value: undefined as never, done: true });\n }\n if (this.err) return Promise.reject(this.err);\n return new Promise<IteratorResult<T>>((res, rej) => {\n this.waiters.push((r) => {\n if (this.err) {\n rej(this.err);\n return;\n }\n res(r);\n });\n });\n },\n };\n }\n}\n","// Line-level diff (ported from lib/diff.mjs): oldStr/newStr → { hunks, added, removed }\n// hunk: { oldStart, newStart, lines: [{ t: \" \"|\"+\"|\"-\", s }] }\n// LCS minimal edit script; keep context lines between changes and merge nearby small blocks into one hunk.\n\nconst CONTEXT = 3;\nconst MERGE_GAP = 6;\nconst MAX_LINES = 400;\n\nexport type DiffLine = { t: \" \" | \"+\" | \"-\"; s: string };\nexport type Hunk = { oldStart: number; newStart: number; lines: DiffLine[] };\nexport type DiffResult = { hunks: Hunk[]; added: number; removed: number; truncated?: boolean };\n\nexport function diffLines(oldStr = \"\", newStr = \"\", { context = CONTEXT } = {}): DiffResult {\n const a = splitLines(oldStr);\n const b = splitLines(newStr);\n if (a.length > MAX_LINES || b.length > MAX_LINES) return coarseDiff(a, b);\n const ops = lcsOps(a, b);\n return buildHunks(ops, context);\n}\n\nfunction splitLines(s: string): string[] {\n s = String(s);\n if (!s) return [];\n return s.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\").split(\"\\n\");\n}\n\ntype Op = { t: \" \" | \"+\" | \"-\"; s: string };\n\nfunction lcsOps(a: string[], b: string[]): Op[] {\n const n = a.length;\n const m = b.length;\n const dp = new Uint32Array((n + 1) * (m + 1));\n for (let i = n - 1; i >= 0; i--)\n for (let j = m - 1; j >= 0; j--)\n dp[i * (m + 1) + j] = a[i] === b[j]\n ? dp[(i + 1) * (m + 1) + j + 1] + 1\n : Math.max(dp[(i + 1) * (m + 1) + j], dp[i * (m + 1) + j + 1]);\n const ops: Op[] = [];\n let i = 0;\n let j = 0;\n while (i < n && j < m) {\n if (a[i] === b[j]) {\n ops.push({ t: \" \", s: a[i] });\n i++; j++;\n } else if (dp[(i + 1) * (m + 1) + j] >= dp[i * (m + 1) + j + 1]) {\n ops.push({ t: \"-\", s: a[i] });\n i++;\n } else {\n ops.push({ t: \"+\", s: b[j] });\n j++;\n }\n }\n while (i < n) ops.push({ t: \"-\", s: a[i++] });\n while (j < m) ops.push({ t: \"+\", s: b[j++] });\n return ops;\n}\n\nfunction buildHunks(ops: Op[], context: number): DiffResult {\n const changed: number[] = [];\n ops.forEach((op, i) => {\n if (op.t !== \" \") changed.push(i);\n });\n if (!changed.length) return { hunks: [], added: 0, removed: 0 };\n\n let added = 0;\n let removed = 0;\n for (const op of ops) {\n if (op.t === \"+\") added++;\n else if (op.t === \"-\") removed++;\n }\n\n const ranges: { s: number; e: number }[] = [];\n for (const idx of changed) {\n const s = Math.max(0, idx - context);\n const e = Math.min(ops.length, idx + context + 1);\n const last = ranges[ranges.length - 1];\n if (last && s <= last.e + MERGE_GAP) last.e = Math.max(last.e, e);\n else ranges.push({ s, e });\n }\n\n const hunks: Hunk[] = [];\n let oldLn = 1;\n let newLn = 1;\n const oldNos: number[] = [];\n const newNos: number[] = [];\n for (const op of ops) {\n oldNos.push(oldLn);\n newNos.push(newLn);\n if (op.t !== \"+\") oldLn++;\n if (op.t !== \"-\") newLn++;\n }\n for (const r of ranges) {\n hunks.push({\n oldStart: oldNos[r.s],\n newStart: newNos[r.s],\n lines: ops.slice(r.s, r.e).map((op) => ({ t: op.t, s: op.s })),\n });\n }\n return { hunks, added, removed };\n}\n\nfunction coarseDiff(a: string[], b: string[]): DiffResult {\n return {\n hunks: [\n {\n oldStart: 1,\n newStart: 1,\n lines: [...a.map((s) => ({ t: \"-\" as const, s })), ...b.map((s) => ({ t: \"+\" as const, s }))].slice(0, 2000),\n },\n ],\n added: b.length,\n removed: a.length,\n truncated: true,\n };\n}\n\n// Build the detail for Edit/MultiEdit: compute hunks from old/new or edits[]\nexport function editDetail(detail: Record<string, unknown> = {}) {\n if (Array.isArray(detail.edits) && detail.edits.length) {\n const hunks: Hunk[] = [];\n let added = 0;\n let removed = 0;\n for (const e of detail.edits as { old_string?: string; old?: string; new_string?: string; new?: string }[]) {\n const d = diffLines(e.old_string ?? e.old ?? \"\", e.new_string ?? e.new ?? \"\");\n for (const h of d.hunks) hunks.push(h);\n added += d.added;\n removed += d.removed;\n }\n return { path: detail.path, hunks, added, removed };\n }\n if (detail.old !== undefined || detail.new !== undefined) {\n const d = diffLines(String(detail.old ?? \"\"), String(detail.new ?? \"\"));\n return { path: detail.path, hunks: d.hunks, added: d.added, removed: d.removed };\n }\n return detail;\n}\n","export type SlashCommandKind = \"command\" | \"skill\";\n\nexport type SlashCommand = {\n name: string;\n description: string;\n argumentHint?: string;\n kind: SlashCommandKind;\n};\n\nconst CLAUDE_BUILTIN_COMMANDS = new Set([\"clear\", \"compact\", \"context\", \"usage\", \"init\", \"debug\"]);\n\nexport function classifyClaudeSlashCommand(name: string): SlashCommandKind {\n return CLAUDE_BUILTIN_COMMANDS.has(name) ? \"command\" : \"skill\";\n}\n\n/** Parse \"/name args\" (must start with /) */\nexport function parseSlashInput(text: string): { name: string; args: string; raw: string } | null {\n const t = text.trim();\n if (!t.startsWith(\"/\")) return null;\n const body = t.slice(1).trim();\n if (!body) return null;\n const sp = body.indexOf(\" \");\n if (sp === -1) return { name: body, args: \"\", raw: t };\n return { name: body.slice(0, sp), args: body.slice(sp + 1).trim(), raw: t };\n}\n\nexport function mapAcpAvailableCommands(\n cmds: { name: string; description: string; input?: { hint?: string } | null }[],\n): SlashCommand[] {\n return cmds.map((c) => ({\n name: c.name,\n description: c.description,\n argumentHint: c.input?.hint,\n kind: \"skill\" as const,\n }));\n}\n\nexport function sortSlashCommands(list: SlashCommand[]): SlashCommand[] {\n return [...list].sort((a, b) => {\n if (a.kind !== b.kind) return a.kind === \"command\" ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n}\n","// MockProvider: registered only with AGENT_CONSOLE_MOCK=1. Persistent session, interruptible, with permissions and steering.\n// Scripts by message prefix: default /perm /plan /ask /slow /error /long /exit; supports steer/interrupt/resume.\nimport { tr } from \"../util/i18n.js\";\nimport type { Provider, ProviderSession, DetectResult, ModelInfo,\n Mode, SendInput, RespondAnswer, SlashCommand,\n} from \"./types.js\";\nimport type { ProviderEvent } from \"../timeline/types.js\";\nimport { AsyncQueue } from \"../util/queue.js\";\nimport { editDetail } from \"../agents/diff.js\";\nimport { sortSlashCommands } from \"./slash.js\";\n\nexport const mockCapabilities = {\n resume: true,\n interrupt: true,\n steer: true,\n images: true,\n plan: true,\n questions: true,\n cost: true,\n effort: [\"low\", \"medium\", \"high\"],\n modes: [\"plan\", \"default\", \"acceptEdits\", \"bypassPermissions\"] as Mode[],\n};\n\nconst rid = () => Math.random().toString(36).slice(2, 10);\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nclass MockCrash extends Error {\n constructor() {\n super(\"__mock_crash__\");\n }\n}\n\ntype Ctx = {\n emit: (ev: ProviderEvent) => void;\n waitFor: (requestId: string) => Promise<RespondAnswer>;\n interrupted: () => boolean;\n steerText: () => string;\n replyPrefix: () => string;\n input: SendInput;\n};\n\nexport class MockSession implements ProviderSession {\n events: AsyncIterable<ProviderEvent>;\n private q = new AsyncQueue<ProviderEvent>();\n private sessionId: string;\n private turnId: string | null = null;\n private turnNum = 0;\n private interruptFlag = false;\n private closed = false;\n private pendingReq = new Map<string, (a: RespondAnswer) => void>();\n private steered: string[] = [];\n private resumed = false;\n\n constructor(private o: {\n threadId: string;\n cwd: string;\n model: string | null;\n mode: Mode;\n effort: string | null;\n resumeId: string | null;\n }) {\n this.sessionId = o.resumeId ?? \"mock-\" + rid();\n this.resumed = o.resumeId !== null;\n this.events = this.q;\n this.q.push({ type: \"provider_session_id\", id: this.sessionId });\n }\n\n private emit(ev: ProviderEvent): void {\n (ev as { turnId?: string }).turnId ??= this.turnId ?? undefined;\n this.q.push(ev);\n }\n\n async send(input: SendInput): Promise<void> {\n if (this.closed) throw new Error(\"mock session closed\");\n this.turnNum++;\n this.turnId = \"u_\" + Date.now().toString(36) + \"_\" + this.turnNum;\n this.interruptFlag = false;\n this.steered = [];\n this.emit({\n type: \"turn_started\",\n turnId: this.turnId,\n model: this.o.model ?? \"demo-fast\",\n mode: this.o.mode,\n effort: this.o.effort,\n });\n void this.runTurn(input);\n }\n\n private async runTurn(input: SendInput): Promise<void> {\n // itemIds are globally unique (a real provider creates new itemIds each time); sessionId can't be used:\n // a resumed session keeps the same providerSessionId and would collide with the old session's itemIds.\n // Same ids would merge the new turn's events into old entries, and the new reply would \"fly\" into an old bubble mid-timeline.\n const p = \"i\" + rid() + \"_\";\n const ctx: Ctx = {\n emit: (ev) => {\n const e = ev as { itemId?: string };\n if (e.itemId) e.itemId = p + e.itemId;\n this.emit(ev);\n },\n waitFor: (id) => this.waitFor(id),\n interrupted: () => this.interruptFlag || this.closed,\n steerText: () => this.steered.join(\";\"),\n replyPrefix: () => this.resumePrefix(),\n input,\n };\n try {\n const script = pickScript(input.text);\n await script(ctx);\n if (this.interruptFlag || this.closed) {\n this.emit({ type: \"turn_ended\", turnId: this.turnId!, status: \"interrupted\", durationMs: 0 });\n } else {\n this.emit({ type: \"usage\", inputTokens: 1200, outputTokens: 340, cacheReadTokens: 800, costUsd: 0.0123 });\n this.emit({ type: \"turn_ended\", turnId: this.turnId!, status: \"completed\", durationMs: 6000, filesChanged: 1 });\n }\n } catch (e) {\n if (e instanceof MockCrash) {\n this.q.close(); // Crash: no turn_ended; the manager appends failed\n return;\n }\n if (this.interruptFlag || this.closed) {\n this.emit({ type: \"turn_ended\", turnId: this.turnId!, status: \"interrupted\", durationMs: 0 });\n } else {\n this.emit({ type: \"turn_ended\", turnId: this.turnId!, status: \"failed\", error: String((e as Error)?.message ?? e) });\n }\n }\n }\n\n respond(requestId: string, answer: RespondAnswer): void {\n const resolve = this.pendingReq.get(requestId);\n if (resolve) {\n this.pendingReq.delete(requestId);\n resolve(answer);\n }\n }\n\n private waitFor(requestId: string): Promise<RespondAnswer> {\n return new Promise((resolve) => {\n this.pendingReq.set(requestId, resolve);\n });\n }\n\n async interrupt(): Promise<void> {\n this.interruptFlag = true;\n // Pending permissions/questions are cancelled directly\n for (const [id, resolve] of this.pendingReq) {\n resolve({ cancelled: true });\n this.pendingReq.delete(id);\n }\n await sleep(120); // Guarantees interrupted within <1s\n }\n\n async steer(input: SendInput): Promise<void> {\n this.steered.push(input.text);\n }\n\n async setModel(model: string | null): Promise<void> {\n this.o.model = model;\n }\n async setMode(mode: Mode): Promise<void> {\n this.o.mode = mode;\n }\n async setEffort(effort: string | null): Promise<void> {\n this.o.effort = effort;\n }\n\n async listCommands(): Promise<SlashCommand[]> {\n return sortSlashCommands([\n { name: \"perm\", description: \"演示授权弹窗\", kind: \"command\" },\n { name: \"plan\", description: \"演示计划审批\", kind: \"command\" },\n { name: \"ask\", description: \"演示提问\", kind: \"command\" },\n { name: \"slow\", description: \"慢速多步工具\", kind: \"skill\" },\n { name: \"error\", description: \"模拟失败\", kind: \"skill\" },\n ]);\n }\n\n async close(): Promise<void> {\n this.closed = true;\n for (const [, resolve] of this.pendingReq) resolve({ cancelled: true });\n this.pendingReq.clear();\n this.q.close();\n }\n\n // With resumeId the first reply gets a \"(已续接)\" prefix\n private resumePrefix(): string {\n if (this.resumed && this.turnNum === 1) return \"(已续接)\";\n return \"\";\n }\n}\n\n// ---------- scripts ----------\n\nasync function scriptDefault(ctx: Ctx): Promise<void> {\n const { emit } = ctx;\n const sleepA = (ms: number) => sleepAbortable(ms, ctx);\n\n emit({ type: \"reasoning_delta\", itemId: \"r1\", text: \"让我看看项目结构…\" });\n await sleepA(500);\n emit({ type: \"reasoning\", itemId: \"r1\", text: \"让我看看项目结构…需要先读几个文件。\" });\n\n const tools = [\n { id: \"t1\", name: \"Read\", input: { file_path: ctx.input.text.includes(\"abs\") ? \"D:/x/a.ts\" : \"src/index.ts\" } },\n { id: \"t2\", name: \"Read\", input: { file_path: \"package.json\" } },\n ];\n for (const t of tools) {\n emit({ type: \"tool_call\", itemId: t.id, kind: \"read\", title: `读取 ${t.input.file_path}`, status: \"running\", input: t.input });\n if (await sleepA(300)) return;\n emit({ type: \"tool_call\", itemId: t.id, kind: \"read\", title: `读取 ${t.input.file_path}`, status: \"ok\", output: \"…文件内容…\", durationMs: 300 });\n }\n\n emit({ type: \"tool_call\", itemId: \"t3\", kind: \"search\", title: '搜索 \"TODO\"', status: \"running\", input: { pattern: \"TODO\" } });\n await sleepA(200);\n emit({ type: \"tool_call\", itemId: \"t3\", kind: \"search\", title: '搜索 \"TODO\"', status: \"ok\", output: \"3 处匹配\" });\n\n const oldStr = \"const x = 1;\\nconst y = 2;\\nreturn x + y;\";\n const newStr = \"const x = 1;\\nconst y = 2;\\nconst z = 3;\\nreturn x + y + z;\";\n emit({\n type: \"tool_call\", itemId: \"t4\", kind: \"edit\", title: \"编辑 src/index.ts\", status: \"running\",\n input: { file_path: \"src/index.ts\", old_string: oldStr, new_string: newStr },\n detail: editDetail({ path: \"src/index.ts\", old: oldStr, new: newStr }),\n });\n if (await sleepA(400)) return;\n emit({\n type: \"tool_call\", itemId: \"t4\", kind: \"edit\", title: \"编辑 src/index.ts\", status: \"ok\",\n detail: editDetail({ path: \"src/index.ts\", old: oldStr, new: newStr }), durationMs: 400,\n });\n\n emit({ type: \"tool_call\", itemId: \"t5\", kind: \"bash\", title: \"运行 npm test\", status: \"running\", input: { command: \"npm test\" } });\n for (let i = 1; i <= 20; i++) {\n if (await sleepA(60)) return;\n emit({ type: \"tool_output_delta\", itemId: \"t5\", text: `第 ${i} 行输出\\n` });\n }\n emit({ type: \"tool_call\", itemId: \"t5\", kind: \"bash\", title: \"运行 npm test\", status: \"ok\", output: \"✓ 全部通过\", exitCode: 0, durationMs: 1200 });\n\n emit({\n type: \"todo\",\n items: [\n { text: \"分析需求\", status: \"done\" },\n { text: \"修改代码\", status: \"done\" },\n { text: \"跑测试\", status: \"done\" },\n { text: \"写文档\", status: \"in_progress\" },\n ],\n });\n await sleepA(300);\n\n const reply = ctx.replyPrefix() + mockReply(ctx);\n for (const ch of chunkText(reply, 40)) {\n if (await sleepA(30)) return;\n emit({ type: \"assistant_delta\", itemId: \"m1\", text: ch });\n }\n emit({ type: \"assistant_message\", itemId: \"m1\", text: reply });\n}\n\nasync function scriptPerm(ctx: Ctx): Promise<void> {\n const { emit } = ctx;\n const requestId = \"perm-\" + rid();\n emit({\n type: \"permission_request\",\n requestId,\n title: \"运行 npm test\",\n kind: \"tool\",\n detail: { command: \"npm test\", cwd: \".\", toolName: \"Bash\" },\n options: [\n { id: \"accept\", label: tr(\"perm.allow\"), kind: \"allow_once\" },\n { id: \"acceptForSession\", label: tr(\"perm.allowSession\"), kind: \"allow_always\" },\n { id: \"decline\", label: tr(\"perm.deny\"), kind: \"reject_once\" },\n ],\n });\n const ans = await ctx.waitFor(requestId);\n if (ans.cancelled || ans.optionId === \"decline\") {\n emit({ type: \"tool_call\", itemId: \"p1\", kind: \"bash\", title: \"运行 npm test\", status: \"failed\", output: \"已被用户拒绝\", exitCode: 1 });\n emit({ type: \"assistant_message\", itemId: \"pm\", text: \"已按你的要求跳过该操作。\" });\n return;\n }\n emit({ type: \"tool_call\", itemId: \"p1\", kind: \"bash\", title: \"运行 npm test\", status: \"running\", input: { command: \"npm test\" } });\n if (await sleepAbortable(500, ctx)) return;\n emit({ type: \"tool_call\", itemId: \"p1\", kind: \"bash\", title: \"运行 npm test\", status: \"ok\", output: \"✓ 12 个测试通过\", exitCode: 0, durationMs: 500 });\n emit({ type: \"assistant_message\", itemId: \"pm\", text: \"测试通过了。\" });\n}\n\nasync function scriptPlan(ctx: Ctx): Promise<void> {\n const { emit } = ctx;\n emit({\n type: \"plan\",\n itemId: \"plan1\",\n markdown: \"## 实施计划\\n\\n1. 改 `src/index.ts` 入口\\n2. 更新测试\\n3. 跑一遍 e2e\",\n entries: [\n { step: \"改 src/index.ts 入口\", status: \"pending\" },\n { step: \"更新测试\", status: \"pending\" },\n { step: \"跑一遍 e2e\", status: \"pending\" },\n ],\n });\n const requestId = \"perm-\" + rid();\n emit({\n type: \"permission_request\",\n requestId,\n title: \"实施这个计划?\",\n kind: \"plan\",\n detail: { markdown: \"见上方计划\" },\n options: [\n { id: \"implement\", label: \"开始实施\", kind: \"allow_once\" },\n { id: \"reject\", label: tr(\"perm.deny\"), kind: \"reject_once\" },\n ],\n });\n const ans = await ctx.waitFor(requestId);\n if (ans.cancelled || ans.optionId === \"reject\") {\n emit({ type: \"assistant_message\", itemId: \"pm\", text: \"好的,请告诉我怎么改。\" });\n return;\n }\n emit({ type: \"tool_call\", itemId: \"pl1\", kind: \"edit\", title: \"编辑 src/index.ts\", status: \"ok\" });\n await sleepAbortable(400, ctx);\n emit({ type: \"assistant_message\", itemId: \"pm\", text: \"已按计划改完入口和测试。\" });\n}\n\nasync function scriptAsk(ctx: Ctx): Promise<void> {\n const { emit } = ctx;\n const requestId = \"q-\" + rid();\n emit({\n type: \"question\",\n requestId,\n questions: [\n {\n id: \"q1\",\n header: \"部署目标\",\n question: \"要部署到哪个环境?\",\n options: [\n { id: \"staging\", label: \"Staging\" },\n { id: \"prod\", label: \"生产环境\" },\n ],\n },\n {\n id: \"q2\",\n header: \"备注\",\n question: \"还有什么要补充的?\",\n freeText: true,\n },\n ],\n });\n const ans = await ctx.waitFor(requestId);\n const env = ans.answers?.q1 ?? \"(未选)\";\n const note = ans.answers?.q2 ?? \"\";\n emit({ type: \"assistant_message\", itemId: \"am\", text: `收到:部署到 ${env}${note ? `,备注「${note}」` : \"\"}。` });\n}\n\nasync function scriptSlow(ctx: Ctx): Promise<void> {\n const { emit } = ctx;\n for (let i = 1; i <= 6; i++) {\n const id = \"s\" + i;\n emit({ type: \"tool_call\", itemId: id, kind: \"bash\", title: `步骤 ${i}/6`, status: \"running\", input: { command: `step ${i}` } });\n if (await sleepAbortable(2000, ctx)) return;\n emit({ type: \"tool_call\", itemId: id, kind: \"bash\", title: `步骤 ${i}/6`, status: \"ok\", output: `步骤 ${i} 完成`, durationMs: 2000 });\n }\n emit({ type: \"assistant_message\", itemId: \"sm\", text: \"6 个步骤全部跑完。\" });\n}\n\nasync function scriptError(ctx: Ctx): Promise<void> {\n const { emit } = ctx;\n emit({ type: \"tool_call\", itemId: \"e1\", kind: \"bash\", title: \"运行 ./build.sh\", status: \"running\", input: { command: \"./build.sh\" } });\n await sleepAbortable(800, ctx);\n throw new Error(\"构建失败:找不到模块 foo(模拟错误)\");\n}\n\nasync function scriptLong(ctx: Ctx): Promise<void> {\n const { emit } = ctx;\n emit({ type: \"assistant_delta\", itemId: \"L1\", text: \"\" });\n for (let i = 0; i < 5000; i++) {\n if (i % 100 === 0 && ctx.interrupted()) return;\n emit({ type: \"assistant_delta\", itemId: \"L1\", text: `块${i} ` });\n if (i % 200 === 0) await sleep(0);\n }\n emit({ type: \"assistant_message\", itemId: \"L1\", text: \"(5000 个增量合并后的长文)\" });\n}\n\nasync function scriptExit(_ctx: Ctx): Promise<void> {\n await sleep(300);\n throw new MockCrash();\n}\n\nfunction pickScript(text: string): (ctx: Ctx) => Promise<void> {\n const t = text.trim();\n if (t.startsWith(\"/perm\")) return scriptPerm;\n if (t.startsWith(\"/plan\")) return scriptPlan;\n if (t.startsWith(\"/ask\")) return scriptAsk;\n if (t.startsWith(\"/slow\")) return scriptSlow;\n if (t.startsWith(\"/error\")) return scriptError;\n if (t.startsWith(\"/long\")) return scriptLong;\n if (t.startsWith(\"/exit\")) return scriptExit;\n return scriptDefault;\n}\n\nasync function sleepAbortable(ms: number, ctx: Ctx): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < ms) {\n if (ctx.interrupted()) return true;\n await sleep(Math.min(20, Math.max(1, ms - (Date.now() - start))));\n }\n return ctx.interrupted();\n}\n\nfunction chunkText(s: string, n: number): string[] {\n const out: string[] = [];\n for (let i = 0; i < s.length; i += n) out.push(s.slice(i, i + n));\n return out;\n}\n\nfunction mockReply(ctx: Ctx): string {\n const base = [\n \"好的,我已经按你的要求改好了。\",\n \"\",\n \"## 改动\",\n \"- `src/index.ts`:把返回逻辑补成三变量求和\",\n \"- 新增一行常量 `z`\",\n \"\",\n \"```ts\",\n \"const z = 3;\",\n \"return x + y + z;\",\n \"```\",\n \"\",\n \"| 文件 | 变更 |\",\n \"|---|---|\",\n \"| src/index.ts | +2/-1 |\",\n \"\",\n \"测试全部通过。\",\n ].join(\"\\n\");\n return ctx.steerText() ? base + `\\n\\n> 插话:${ctx.steerText()}` : base;\n}\n\n// ---------- Provider ----------\n\n/** For tests: counts createSession calls */\nexport const mockProviderMetrics = { createSessionCalls: 0 };\n\nexport function createMockProvider(): Provider {\n return {\n id: \"mock\",\n name: \"Mock(演示)\",\n capabilities: mockCapabilities,\n async detect(): Promise<DetectResult> {\n return { available: true, bin: \"mock\", version: \"demo\" };\n },\n async listModels(): Promise<ModelInfo[]> {\n return [\n { id: \"demo-fast\", name: \"演示·快\", isDefault: true, efforts: [\"low\", \"medium\", \"high\"] },\n { id: \"demo-pro\", name: \"演示·强\", efforts: [\"low\", \"medium\", \"high\"] },\n ];\n },\n async createSession(o) {\n mockProviderMetrics.createSessionCalls++;\n return new MockSession(o);\n },\n };\n}\n","// Cross-platform executable lookup in PATH (shared by the plugin host index.mjs and the daemon; esbuild bundles it into dist for the daemon).\n//\n// which / where.exe are no longer used:\n// - some minimal Linux systems have no which;\n// - where.exe writes in the console code page (CP936 on Chinese Windows), so a Chinese user name or path is garbled when decoded as UTF-8,\n// existsSync fails and the CLI \"can't be found\".\n// Windows searches in PATHEXT order (.COM;.EXE;.BAT;.CMD), with .ps1 last; extensionless npm sh shims are never returned.\n// Besides PATH, add a set of common install directories: GUI apps launched from the macOS Dock/Finder only get launchd's minimal PATH\n// (Magpie adds the login shell's PATH itself; this is the fallback): Homebrew, npm global, Volta, Claude's native install, etc.\nimport { accessSync, constants, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\n\nfunction defaultExists(file, platform) {\n try {\n if (!statSync(file).isFile()) return false;\n if (platform !== \"win32\") accessSync(file, constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction envGet(env, name) {\n if (env[name] !== undefined) return env[name];\n // Windows environment variable names are case-insensitive (Path / PATH)\n const lower = name.toLowerCase();\n for (const key of Object.keys(env)) if (key.toLowerCase() === lower) return env[key];\n return undefined;\n}\n\n/** Common install directories that aren't necessarily in a GUI process's PATH (candidates only; callers check whether they exist). */\nexport function extraBinDirs({ platform = process.platform, env = process.env, home = homedir() } = {}) {\n const p = platform === \"win32\" ? path.win32 : path.posix;\n const dirs = [];\n if (platform === \"win32\") {\n const appData = envGet(env, \"APPDATA\");\n const localAppData = envGet(env, \"LOCALAPPDATA\");\n const programFiles = envGet(env, \"ProgramFiles\") || \"C:\\\\Program Files\";\n const nvmSymlink = envGet(env, \"NVM_SYMLINK\");\n if (home) dirs.push(p.join(home, \".local\", \"bin\"));\n if (appData) dirs.push(p.join(appData, \"npm\"));\n if (nvmSymlink) dirs.push(nvmSymlink);\n dirs.push(p.join(programFiles, \"nodejs\"));\n if (localAppData) dirs.push(p.join(localAppData, \"Programs\", \"nodejs\"));\n if (home) {\n dirs.push(p.join(home, \".volta\", \"bin\"));\n dirs.push(p.join(home, \".bun\", \"bin\"));\n }\n return dirs;\n }\n if (home) {\n dirs.push(p.join(home, \".local\", \"bin\"));\n dirs.push(p.join(home, \".npm-global\", \"bin\"));\n dirs.push(p.join(home, \".volta\", \"bin\"));\n dirs.push(p.join(home, \".bun\", \"bin\"));\n dirs.push(p.join(home, \".claude\", \"local\"));\n }\n if (platform === \"darwin\") dirs.push(\"/opt/homebrew/bin\");\n dirs.push(\"/usr/local/bin\", \"/usr/bin\", \"/bin\");\n return dirs;\n}\n\n/** PATH's directories followed by extraBinDirs; deduped (case-insensitive on Windows). */\nexport function searchDirs({ platform = process.platform, env = process.env, home = homedir(), extra = true } = {}) {\n const sep = platform === \"win32\" ? \";\" : \":\";\n const raw = String(envGet(env, \"PATH\") ?? \"\")\n .split(sep)\n .map((d) => d.trim().replace(/^\"(.*)\"$/, \"$1\"))\n .filter(Boolean);\n const all = extra ? [...raw, ...extraBinDirs({ platform, env, home })] : raw;\n const seen = new Set();\n const out = [];\n for (const d of all) {\n const key = platform === \"win32\" ? d.toLowerCase().replace(/[\\\\/]+$/, \"\") : d.replace(/\\/+$/, \"\");\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(d);\n }\n return out;\n}\n\nfunction windowsExts(env) {\n const list = String(envGet(env, \"PATHEXT\") || \".COM;.EXE;.BAT;.CMD\")\n .split(\";\")\n .map((e) => e.trim().toLowerCase())\n .filter((e) => e.startsWith(\".\"));\n if (!list.includes(\".ps1\")) list.push(\".ps1\");\n return list;\n}\n\n/**\n * Return the full paths of every hit, in order (PATH first, then extraBinDirs).\n * @param {string} name command name (may include an extension on Windows)\n */\nexport function findOnPath(\n name,\n { platform = process.platform, env = process.env, home = homedir(), extra = true, exists } = {},\n) {\n if (!name) return [];\n const p = platform === \"win32\" ? path.win32 : path.posix;\n const check = exists ?? ((file) => defaultExists(file, platform));\n // Already a path: check it directly\n if (name.includes(\"/\") || (platform === \"win32\" && name.includes(\"\\\\\"))) {\n return check(name) ? [name] : [];\n }\n let names = [name];\n if (platform === \"win32\") {\n const exts = windowsExts(env);\n const ext = p.extname(name).toLowerCase();\n names = ext && exts.includes(ext) ? [name] : exts.map((e) => name + e);\n }\n const hits = [];\n for (const dir of searchDirs({ platform, env, home, extra })) {\n for (const n of names) {\n const file = p.join(dir, n);\n if (check(file) && !hits.includes(file)) hits.push(file);\n }\n }\n return hits;\n}\n\n/** The resolved node executable, or null if not found (the plugin host is Bun, so process.execPath can't serve as node). */\nexport function findNode(opts = {}) {\n return findOnPath(\"node\", opts).find((file) => isNodeExecutable(file)) ?? null;\n}\n\n/** Whether process.execPath itself is node (rather than Bun / Electron etc.). */\nexport function isNodeExecutable(file) {\n return /^node(\\.exe)?$/i.test(String(file || \"\").split(/[\\\\/]/).pop() ?? \"\");\n}\n\nexport const NODE_MISSING_MESSAGE =\n \"找不到 Node.js(需要 20 或更高版本)。请安装 Node.js(https://nodejs.org)后完全退出并重新打开 Magpie。\" +\n \" / Node.js 20+ was not found on PATH. Install it, then quit and reopen Magpie.\";\nexport const NODE_TOO_OLD_MESSAGE =\n \"Node.js 版本太旧,需要 20 或更高版本。升级后完全退出并重新打开 Magpie。\" +\n \" / Node.js 20+ is required. Upgrade it, then quit and reopen Magpie.\";\n\n/**\n * For the plugin host: return the real node path (the host itself is Bun). If none is found, throw an error with a userMessage,\n * which the gate's 503 page displays; the daemon is no longer silently run on Bun.\n */\nexport function requireNode({ execPath = process.execPath, find = findNode } = {}) {\n if (isNodeExecutable(execPath)) return execPath;\n const hit = find();\n if (hit) return hit;\n const error = new Error(\"node not found on PATH\");\n error.code = \"ENODE\";\n error.userMessage = NODE_MISSING_MESSAGE;\n throw error;\n}\n","// Cross-platform executable resolution + process tree termination (ported from lib/bin.mjs).\n// Goal: start .cmd-shim CLIs like claude/codex without shell:true.\n\nimport { execFileSync, spawn, type ChildProcess, type SpawnOptions } from \"node:child_process\";\nimport { findOnPath, findNode as findNodeOnPath, isNodeExecutable } from \"../../../lib/pathscan.mjs\";\nimport { readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { tr } from \"./i18n.js\";\n\nconst IS_WIN = process.platform === \"win32\";\nconst cache = new Map<string, { out: ResolveResult; at: number }>();\nconst CACHE_MS = 60 * 1000;\n\nexport type ResolveResult =\n | {\n ok: true;\n cmd: string;\n prefixArgs: string[];\n display: string;\n via: string;\n /** via === \"cmd-shim\": a .cmd/.bat that must be started through cmd.exe (spawnBin / argvFor handle escaping) */\n shim?: string;\n }\n | { ok: false; reason: string };\n\n// PATH lookup lives in lib/pathscan.mjs: which / where.exe are no longer used (where's output uses the console code page, which garbles Chinese paths).\nfunction which(name: string): string[] {\n return findOnPath(name);\n}\n\n// ---- Windows: escaping when starting a .cmd/.bat through cmd.exe (same rules as cross-spawn) ----\nconst CMD_META = /([()\\][%!^\"`<>&|;, *?])/g;\n\nexport function escapeCmdCommand(cmd: string): string {\n return cmd.replace(CMD_META, \"^$1\");\n}\n\nexport function escapeCmdArgument(arg: string, doubleEscape: boolean): string {\n let a = String(arg);\n // First quote per CommandLineToArgvW rules (backslashes + quotes)\n a = a.replace(/(\\\\*)\"/g, '$1$1\\\\\"');\n a = a.replace(/(\\\\*)$/, \"$1$1\");\n a = `\"${a}\"`;\n // Then escape cmd metacharacters; batch files parse arguments again, so escape twice\n a = a.replace(CMD_META, \"^$1\");\n if (doubleEscape) a = a.replace(CMD_META, \"^$1\");\n return a;\n}\n\nexport type Argv = { cmd: string; args: string[]; windowsVerbatimArguments?: boolean };\n\n/** Resolution result + arguments → the command line actually given to spawn. */\nexport function argvFor(r: ResolveResult & { ok: true }, args: string[]): Argv {\n if (r.via === \"cmd-shim\" && r.shim) {\n const line = [escapeCmdCommand(r.shim), ...args.map((a) => escapeCmdArgument(a, true))].join(\" \");\n return { cmd: r.cmd, args: [\"/d\", \"/s\", \"/c\", `\"${line}\"`], windowsVerbatimArguments: true };\n }\n return { cmd: r.cmd, args: [...r.prefixArgs, ...args] };\n}\n\n// ---- Safety net: end Agent process trees still alive when the daemon exits ----\nconst liveTrees = new Set<number>();\nlet exitHookInstalled = false;\n\nfunction reapOnExit(): void {\n for (const pid of liveTrees) {\n try {\n if (IS_WIN) execFileSync(\"taskkill\", [\"/pid\", String(pid), \"/T\", \"/F\"], { stdio: \"ignore\", windowsHide: true, timeout: 3000 });\n else process.kill(-pid, \"SIGKILL\");\n } catch {}\n }\n liveTrees.clear();\n}\n\n/** Register a process to clean up when the daemon exits (on non-Windows it must lead a detached process group). */\nexport function trackTree(child: ChildProcess): void {\n if (child.pid == null) return;\n const pid = child.pid;\n liveTrees.add(pid);\n child.once(\"exit\", () => liveTrees.delete(pid));\n if (!exitHookInstalled) {\n exitHookInstalled = true;\n process.once(\"exit\", reapOnExit);\n }\n}\n\n/** Start a CLI from a resolution result. On non-Windows it gets its own process group (detached) so killTree can also end grandchildren. */\nexport function spawnBin(\n r: ResolveResult & { ok: true },\n args: string[],\n opts: SpawnOptions & { group?: boolean } = {},\n): ChildProcess {\n const a = argvFor(r, args);\n const { group, ...rest } = opts;\n const child = spawn(a.cmd, a.args, {\n windowsHide: true,\n ...rest,\n ...(a.windowsVerbatimArguments ? { windowsVerbatimArguments: true } : {}),\n ...(group && !IS_WIN ? { detached: true } : {}),\n });\n if (group) trackTree(child);\n return child;\n}\n\n// Find the script/program path a .cmd calls from its text.\nexport function shimTarget(\n cmdText: string,\n cmdDir: string | null,\n deps: { exists?: (p: string) => boolean; win?: boolean } = {},\n): string | null {\n const exists = deps.exists ?? existsSync;\n const P = (deps.win ?? IS_WIN) ? path.win32 : path;\n const cands: string[] = [];\n const re = /\"([^\"]+?\\.(?:js|mjs|cjs|exe|cmd|bat))\"/gi;\n let m: RegExpExecArray | null;\n while ((m = re.exec(cmdText))) cands.push(m[1]);\n const re2 = /(?:%~?dp0%?)?[A-Za-z]:?[\\\\/\\w.@-]*?\\.(?:js|mjs|cjs|exe)\\b/gi;\n while ((m = re2.exec(cmdText))) cands.push(m[0]);\n const found: string[] = [];\n for (const raw of cands) {\n let p = raw.replace(/%~?dp0%?/gi, \"\");\n p = p.replace(/%[A-Z_]+%/gi, \"\");\n p = p.trim().replace(/^[\\\\/]+/, \"\");\n if (!p || /%\\w+%/.test(p) || !/\\.(js|mjs|cjs|exe)$/i.test(p)) continue;\n if (!P.isAbsolute(p)) {\n if (!cmdDir) continue;\n p = P.join(cmdDir, p);\n }\n if (exists(p)) found.push(P.resolve(p));\n }\n // npm shims first write IF EXIST \"%dp0%\\node.exe\" (it really exists when the global dir is the node install dir, e.g. nvm-windows),\n // and only then the real cli.js: the script wins, node.exe itself is not the target\n return (\n found.find((f) => /\\.(js|mjs|cjs)$/i.test(f)) ??\n found.find((f) => /\\.exe$/i.test(f) && !isNodeExecutable(P.basename(f))) ??\n null\n );\n}\n\n// Which node to use when the shim points at a .js: the daemon itself runs on node, so prefer that one; otherwise node from PATH\nfunction findNode(): string {\n if (isNodeExecutable(process.execPath)) return process.execPath;\n return findNodeOnPath() ?? \"node\";\n}\n\nexport async function resolveBin(name: string): Promise<ResolveResult> {\n const hit = cache.get(name);\n if (hit && Date.now() - hit.at < CACHE_MS) return hit.out;\n const out = await resolveBinUncached(name);\n cache.set(name, { out, at: Date.now() });\n return out;\n}\n\nexport type ResolvedBin = ResolveResult & { ok: true; binName: string };\n\n/** Try several executable names from the catalog in order and return the first hit. */\nexport async function resolveFirstBin(names: string[]): Promise<ResolvedBin | ResolveResult> {\n const uniq = [...new Set(names.filter(Boolean))];\n for (const binName of uniq) {\n const r = await resolveBin(binName);\n if (r.ok) return { ...r, binName };\n }\n const label = uniq[0] ?? \"cli\";\n return { ok: false, reason: tr(\"bin.notOnPath\", { name: uniq.length > 1 ? uniq.join(tr(\"bin.or\")) : label }) };\n}\n\nexport function clearBinCache(name?: string): void {\n if (name) cache.delete(name);\n else cache.clear();\n}\n\nexport type ResolveDeps = {\n platform?: NodeJS.Platform;\n find?: (name: string) => string[];\n readText?: (file: string) => Promise<string>;\n exists?: (file: string) => boolean;\n node?: () => string;\n comspec?: string;\n};\n\nfunction resolveBinUncached(name: string): Promise<ResolveResult> {\n return resolveBinWith(name);\n}\n\n/** Implementation of resolveBin with injectable dependencies (tests simulate a Windows PATH / shims). */\nexport async function resolveBinWith(name: string, deps: ResolveDeps = {}): Promise<ResolveResult> {\n const platform = deps.platform ?? process.platform;\n const win = platform === \"win32\";\n const P = win ? path.win32 : path.posix;\n const exists = deps.exists ?? existsSync;\n const hits = (deps.find ?? which)(name);\n if (!hits.length) return { ok: false, reason: tr(\"bin.notOnPath\", { name }) };\n // Take the first hit in PATH order (same as typing the command in a terminal; within one directory on Windows, PATHEXT order)\n const first = hits[0];\n if (!win) return { ok: true, cmd: first, prefixArgs: [], display: first, via: \"path\" };\n\n const ext = P.extname(first).toLowerCase();\n if (ext === \".exe\" || ext === \".com\") return { ok: true, cmd: first, prefixArgs: [], display: first, via: \"exe\" };\n if (ext === \".ps1\") {\n return {\n ok: true,\n cmd: \"powershell.exe\",\n prefixArgs: [\"-NoProfile\", \"-NonInteractive\", \"-ExecutionPolicy\", \"Bypass\", \"-File\", first],\n display: first,\n via: \"ps1\",\n };\n }\n // .cmd / .bat\n const dir = P.dirname(first);\n if (name.toLowerCase() === \"npx\") {\n const node = P.join(dir, \"node.exe\");\n const cli = P.join(dir, \"node_modules\", \"npm\", \"bin\", \"npx-cli.js\");\n if (exists(node) && exists(cli))\n return { ok: true, cmd: node, prefixArgs: [cli], display: `${node} ${cli}`, via: \"npx-shim\" };\n }\n const text = await (deps.readText ?? ((f: string) => readFile(f, \"utf8\")))(first).catch(() => \"\");\n const target = shimTarget(text, dir, { exists, win: true });\n if (target && /\\.(js|mjs|cjs)$/i.test(target)) {\n const node = (deps.node ?? findNode)();\n return { ok: true, cmd: node, prefixArgs: [target], display: `${node} ${target}`, via: \"shim-js\" };\n }\n if (target && /\\.exe$/i.test(target)) {\n return { ok: true, cmd: target, prefixArgs: [], display: target, via: \"shim-exe\" };\n }\n // PowerShell / other .cmd wrappers: start through cmd.exe (e.g. cursor-agent); escaping happens in argvFor\n const comspec = deps.comspec ?? (process.env.ComSpec || \"cmd.exe\");\n return { ok: true, cmd: comspec, prefixArgs: [], display: first, via: \"cmd-shim\", shim: first };\n}\n\n// Windows: taskkill /T kills the whole tree; elsewhere: detached process group, kill(-pid).\nexport function killTree(child: ChildProcess | null | undefined, { graceMs = 3000 } = {}): Promise<void> {\n if (!child || child.pid == null) return Promise.resolve();\n const pid = child.pid;\n if (IS_WIN) {\n return new Promise((resolvePromise) => {\n const tk = spawn(\"taskkill\", [\"/pid\", String(pid), \"/T\", \"/F\"], { windowsHide: true });\n tk.on(\"error\", () => {\n try {\n child.kill();\n } catch {}\n resolvePromise();\n });\n tk.on(\"close\", () => resolvePromise());\n setTimeout(resolvePromise, graceMs + 2000);\n });\n }\n return new Promise((resolvePromise) => {\n let done = false;\n const finish = () => {\n if (!done) {\n done = true;\n resolvePromise();\n }\n };\n try {\n process.kill(-pid, \"SIGTERM\");\n } catch {\n try {\n child.kill(\"SIGTERM\");\n } catch {}\n }\n // A child that has already exited won't emit close again: no need to wait out graceMs\n if (child.exitCode !== null || child.signalCode !== null) {\n finish();\n return;\n }\n const t = setTimeout(() => {\n try {\n process.kill(-pid, \"SIGKILL\");\n } catch {\n try {\n child.kill(\"SIGKILL\");\n } catch {}\n }\n finish();\n }, graceMs);\n t.unref?.();\n child.on(\"close\", () => {\n clearTimeout(t);\n finish();\n });\n });\n}\n","// Tool name → kind / title / detail mapping (ported from lib/agents/kinds.mjs).\n// Adapters call callInfo(name, input, cwd) to get {kind, title, detail}; the frontend renders by kind.\nimport type { ToolKind } from \"../timeline/types.js\";\nimport { tr } from \"../util/i18n.js\";\n\nconst MAX_CMD = 80;\nconst trunc = (s: string, n = MAX_CMD): string => (s.length > n ? s.slice(0, n - 1) + \"…\" : s);\n\nexport function relPath(p: string, cwd: string): string {\n if (!p) return \"\";\n const s = String(p);\n if (!cwd) return s;\n const norm = (x: string) => x.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n const a = norm(s);\n const b = norm(cwd);\n if (a.toLowerCase().startsWith(b.toLowerCase() + \"/\")) return a.slice(b.length + 1);\n if (a.toLowerCase() === b.toLowerCase()) return \".\";\n return s;\n}\n\nexport type CallInfo = { kind: ToolKind; title: string; detail: Record<string, unknown> };\n\ntype ToolInput = Record<string, unknown> & { _exists?: boolean };\n\nexport function callInfo(name: string, input: ToolInput = {}, cwd = \"\"): CallInfo {\n const t = String(name || \"\");\n const f = (kind: ToolKind, title: string, detail: Record<string, unknown>): CallInfo => ({ kind, title, detail });\n const file = String(input.file_path ?? input.path ?? input.notebook_path ?? \"\");\n\n switch (t) {\n case \"Read\":\n return f(\"read\", tr(\"tool.read\", { x: relPath(file, cwd) }), { path: file, offset: input.offset, limit: input.limit });\n case \"Edit\":\n return f(\"edit\", tr(\"tool.edit\", { x: relPath(file, cwd) }), { path: file, old: input.old_string, new: input.new_string });\n case \"MultiEdit\":\n return f(\"edit\", tr(\"tool.multiEdit\", { x: relPath(file, cwd), n: ((input.edits as unknown[]) || []).length }), { path: file, edits: input.edits ?? [] });\n case \"Write\":\n return f(\"write\", tr(input._exists ? \"tool.overwrite\" : \"tool.create\", { x: relPath(file, cwd) }), { path: file, content: input.content });\n case \"NotebookEdit\":\n return f(\"edit\", tr(\"tool.notebook\", { x: relPath(String(input.notebook_path || file), cwd) }), { path: input.notebook_path ?? file });\n case \"Bash\":\n return f(\"bash\", tr(\"tool.run\", { x: trunc(String(input.command ?? \"\")) }), { command: input.command, description: input.description });\n case \"BashOutput\":\n return f(\"bash\", tr(\"tool.output\", { x: String(input.bash_id ?? \"\") }), { bashId: input.bash_id });\n case \"KillShell\":\n return f(\"bash\", tr(\"tool.kill\", { x: String(input.shell_id ?? \"\") }), { shellId: input.shell_id });\n case \"Grep\":\n return f(\"search\", tr(\"tool.grep\", { x: trunc(String(input.pattern ?? \"\"), 40) }), { pattern: input.pattern, path: input.path, glob: input.glob });\n case \"Glob\":\n case \"LS\":\n return f(\"glob\", tr(\"tool.glob\", { x: trunc(String(input.pattern ?? input.path ?? \"\"), 40) }), { pattern: input.pattern, path: input.path });\n case \"WebFetch\":\n return f(\"web\", tr(\"tool.fetch\", { x: hostOf(String(input.url ?? \"\")) }), { url: input.url });\n case \"WebSearch\":\n return f(\"web\", tr(\"tool.webSearch\", { x: trunc(String(input.query ?? \"\"), 40) }), { query: input.query });\n case \"TodoWrite\": {\n const items = todoItems((input.todos as { content?: string; text?: string; status?: string }[]) ?? []);\n const done = items.filter((x) => x.status === \"done\").length;\n return f(\"todo\", tr(\"tool.todo\", { done, n: items.length }), { items });\n }\n case \"Task\":\n case \"Agent\":\n return f(\"task\", tr(\"tool.task\", { x: trunc(String(input.description ?? input.prompt ?? \"\"), 40) }), { description: input.description });\n default:\n break;\n }\n const m = /^mcp__([^_]+)__(.+)$/.exec(t);\n if (m) return f(\"mcp\", `${m[1]} · ${m[2]}`, { server: m[1], tool: m[2] });\n return f(\"other\", t || tr(\"tool.generic\"), {});\n}\n\nfunction hostOf(url: string): string {\n try {\n return new URL(url).host;\n } catch {\n return String(url || \"\").slice(0, 40);\n }\n}\n\nexport function todoItems(todos: { content?: string; text?: string; status?: string }[] = []): { text: string; status: string }[] {\n return todos.map((x) => ({\n text: x.content || x.text || \"\",\n status: x.status === \"completed\" ? \"done\" : x.status === \"in_progress\" ? \"in_progress\" : \"pending\",\n }));\n}\n","// claude stream-json messages (and ~/.claude/projects jsonl lines) → ProviderEvent (§7.2.3). Ported from normalize in lib/agents/claude.mjs.\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { callInfo, todoItems } from \"../../agents/kinds.js\";\nimport { editDetail } from \"../../agents/diff.js\";\nimport { tr } from \"../../util/i18n.js\";\n\nconst MAX_OUTPUT = 20 * 1024;\nconst ANSI_RE = /\\x1b\\[[0-9;]*[a-zA-Z]|\\x1b\\][^\\x07]*\\x07/g;\nconst clean = (s: string): string => String(s ?? \"\").replace(ANSI_RE, \"\");\n\nexport type MapState = {\n blocks: Map<number, string>; // content_block_start index → block type\n msgId: string; // Current streaming message.id\n // Streaming block index → unified itemId (msgId:type:ordinal within type).\n // claude's content_block index interleaves thinking/text, while the content array of the assistant event\n // may be renumbered (when thinking is split into another message, text goes back to 0) — a bare index would make\n // the delta and complete event itemIds diverge and the frontend render two duplicate replies. Align both sides by type + ordinal within type.\n itemIdByBlock: Map<number, string>;\n typeSeq: Map<string, number>; // Count of each block type in the current message (delta side)\n sawInterrupt: boolean; // After interrupt() the next result counts as interrupted\n};\n\nexport function newMapState(): MapState {\n return { blocks: new Map(), msgId: \"\", itemIdByBlock: new Map(), typeSeq: new Map(), sawInterrupt: false };\n}\n\n// Block type → short code and channel for itemIds; thinking/reasoning are one kind, text another; tool_use uses the tool id and doesn't go through here\nconst blockKind = (t: string): string =>\n t === \"thinking\" || t === \"redacted_thinking\" ? \"k\" : t === \"text\" ? \"t\" : \"x\";\n\nfunction itemIdFor(st: MapState, blockIdx: number, blkType: string): string {\n const k = blockKind(blkType);\n const n = st.typeSeq.get(k) ?? 0;\n st.typeSeq.set(k, n + 1);\n const id = `${st.msgId}:${k}${n}`;\n st.itemIdByBlock.set(blockIdx, id);\n return id;\n}\n\ntype Rec = Record<string, unknown>;\nconst rec = (v: unknown): Rec => (v && typeof v === \"object\" ? (v as Rec) : {});\nconst str = (v: unknown): string | undefined => (typeof v === \"string\" ? v : undefined);\n\n// One stream-json message → 0..n unified events\n/** total_cost_usd is Claude Code's estimate at Anthropic's prices. For another vendor's model behind a gateway (DeepSeek through\n * magpie, say) it is meaningless, so it is only kept when every model the turn used is a Claude model (B14). */\nexport function costIsReal(modelUsage: unknown): boolean {\n if (!modelUsage || typeof modelUsage !== \"object\") return true;\n const names = Object.keys(modelUsage as Record<string, unknown>);\n return names.every((n) => /claude|opus|sonnet|haiku/i.test(n));\n}\n\nexport function mapSdkMessage(m: unknown, st: MapState, cwd: string): ProviderEvent[] {\n const out: ProviderEvent[] = [];\n if (!m || typeof m !== \"object\") return out;\n const r = m as unknown as Rec;\n\n if (r.type === \"system\") {\n if (r.subtype === \"init\") {\n const sid = str(r.session_id) ?? \"\";\n if (sid) out.push({ type: \"provider_session_id\", id: sid });\n }\n // compact_boundary / status / api_retry etc. → lightweight notices\n if (r.subtype === \"api_retry\") {\n out.push({ type: \"notice\", level: \"warn\", message: tr(\"notice.apiRetry\", { n: String(r.attempt ?? \"?\") }) });\n }\n if (r.subtype === \"compact_boundary\") {\n out.push({ type: \"notice\", level: \"info\", message: tr(\"notice.compacted\") });\n }\n return out;\n }\n\n if (r.type === \"stream_event\") {\n const e = rec(r.event);\n if (e.type === \"message_start\") {\n const mid = str(rec(e.message).id);\n if (mid) st.msgId = mid;\n st.blocks.clear();\n st.itemIdByBlock.clear();\n st.typeSeq.clear();\n return out;\n }\n if (e.type === \"content_block_start\") {\n const idx = typeof e.index === \"number\" ? e.index : 0;\n const bt = str(rec(e.content_block).type) ?? \"\";\n st.blocks.set(idx, bt);\n itemIdFor(st, idx, bt); // Register index → unified itemId\n return out;\n }\n if (e.type === \"content_block_delta\") {\n const idx = typeof e.index === \"number\" ? e.index : 0;\n const d = rec(e.delta);\n // Fallback when a delta arrives before its start: infer and register from the delta type\n const itemId = st.itemIdByBlock.get(idx) ?? itemIdFor(st, idx, d.type === \"thinking_delta\" ? \"thinking\" : \"text\");\n if (d.type === \"text_delta\" && typeof d.text === \"string\" && d.text) {\n out.push({ type: \"assistant_delta\", itemId, text: d.text });\n } else if (d.type === \"thinking_delta\") {\n const t = str(d.thinking) ?? str(d.text);\n if (t) out.push({ type: \"reasoning_delta\", itemId, text: t });\n }\n // Ignore input_json_delta: wait for the complete tool_use in the assistant message\n }\n return out;\n }\n\n if (r.type === \"assistant\") {\n const mid = str(rec(r.message).id) ?? st.msgId ?? \"\";\n const content = rec(r.message).content;\n const parts = Array.isArray(content) ? content : [];\n // Same rule as the streaming side: build itemIds from type + ordinal within type so they overwrite the matching deltas\n const seqs = new Map<string, number>();\n parts.forEach((p) => {\n const blk = rec(p);\n const t = str(blk.type) ?? \"\";\n const k = blockKind(t);\n const n = seqs.get(k) ?? 0;\n seqs.set(k, n + 1);\n const itemId = `${mid}:${k}${n}`;\n if (blk.type === \"text\" && typeof blk.text === \"string\" && blk.text) {\n out.push({ type: \"assistant_message\", itemId, text: blk.text });\n } else if (blk.type === \"thinking\" || blk.type === \"redacted_thinking\") {\n const t2 = str(blk.thinking) ?? str(blk.text);\n if (t2) out.push({ type: \"reasoning\", itemId, text: t2 });\n } else if (blk.type === \"tool_use\") {\n out.push(...mapToolUse(blk, cwd));\n }\n });\n return out;\n }\n\n if (r.type === \"user\") {\n const content = rec(r.message).content;\n const parts = Array.isArray(content) ? content : [];\n for (const p of parts) {\n const blk = rec(p);\n if (blk.type === \"tool_result\") {\n const output = clean(contentText(blk.content));\n out.push({\n type: \"tool_call\",\n itemId: str(blk.tool_use_id) ?? \"\",\n kind: \"other\",\n title: \"\",\n status: blk.is_error ? \"failed\" : \"ok\",\n output: output.length > MAX_OUTPUT ? output.slice(0, MAX_OUTPUT) : output,\n });\n }\n }\n return out;\n }\n\n if (r.type === \"result\") {\n const usage = rec(r.usage);\n const num = (k: string): number => (typeof usage[k] === \"number\" ? (usage[k] as number) : 0);\n out.push({\n type: \"usage\",\n inputTokens: num(\"input_tokens\"),\n outputTokens: num(\"output_tokens\"),\n cacheReadTokens: num(\"cache_read_input_tokens\"),\n costUsd: typeof r.total_cost_usd === \"number\" && costIsReal(r.modelUsage) ? r.total_cost_usd : 0,\n });\n const subtype = str(r.subtype) ?? \"\";\n const interrupted = st.sawInterrupt || /interrupt/i.test(subtype);\n const isError = r.is_error === true;\n out.push({\n type: \"turn_ended\",\n turnId: \"\", // The session fills in the current turnId\n status: interrupted ? \"interrupted\" : isError ? \"failed\" : \"completed\",\n durationMs: typeof r.duration_ms === \"number\" ? r.duration_ms : undefined,\n error: isError && !interrupted ? str(r.result) ?? subtype : undefined,\n filesChanged: typeof r.num_turns === \"number\" ? undefined : undefined,\n });\n st.sawInterrupt = false;\n return out;\n }\n return out;\n}\n\nfunction mapToolUse(blk: Rec, cwd: string): ProviderEvent[] {\n const input = rec(blk.input);\n const name = str(blk.name) ?? \"tool\";\n const id = str(blk.id) ?? \"\";\n const info = callInfo(name, { ...input, _exists: true }, cwd);\n let detail: unknown = info.detail;\n if (info.kind === \"edit\" && (input.old_string !== undefined || Array.isArray(input.edits))) {\n detail = editDetail({ path: (info.detail as Rec).path as string, old: input.old_string, new: input.new_string, edits: input.edits });\n }\n if (info.kind === \"write\" && typeof input.content === \"string\") {\n const lines = input.content.split(\"\\n\");\n detail = { path: (info.detail as Rec).path, lines: lines.slice(0, 200), totalLines: lines.length };\n }\n const out: ProviderEvent[] = [\n {\n type: \"tool_call\",\n itemId: id,\n kind: info.kind,\n title: info.title,\n status: \"running\",\n input,\n detail,\n },\n ];\n if (name === \"TodoWrite\") {\n out.push({ type: \"todo\", items: todoItems((input.todos as { content?: string; status?: string }[]) ?? []) });\n }\n return out;\n}\n\nfunction contentText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) return content.map((p) => str(rec(p).text) ?? \"\").join(\"\");\n return \"\";\n}\n","import { existsSync } from \"node:fs\";\nimport type { AttachmentStore } from \"../store/attachments.js\";\nimport { validId } from \"./paths.js\";\nimport { tr } from \"./i18n.js\";\n\nlet globalAttachmentStore: AttachmentStore | null = null;\n\n/** Registered at main startup so Providers can resolve upload ids when reading images */\nexport function bindAttachmentStore(store: AttachmentStore): void {\n globalAttachmentStore = store;\n}\n\nasync function lookupAttachmentPath(ref: string): Promise<string | null> {\n const store = globalAttachmentStore;\n if (!store || !validId(ref)) return null;\n const att = await store.get(ref);\n return att?.path ?? null;\n}\n\nexport async function resolveAttachmentRefs(\n store: AttachmentStore,\n refs: { path: string; mime: string }[],\n): Promise<{ path: string; mime: string }[]> {\n const out: { path: string; mime: string }[] = [];\n for (const a of refs) {\n const att = validId(a.path) ? await store.get(a.path) : null;\n if (att) {\n out.push({ path: att.path, mime: att.mime || a.mime });\n continue;\n }\n const viaGlobal = await lookupAttachmentPath(a.path);\n if (viaGlobal) {\n out.push({ path: viaGlobal, mime: a.mime });\n continue;\n }\n if (existsSync(a.path)) {\n out.push(a);\n continue;\n }\n throw new Error(tr(\"attachment.missing\", { ref: a.path }));\n }\n return out;\n}\n\n/** One path: absolute path / upload id → the file under the attachments directory; throws on failure */\nexport async function resolveImagePath(ref: string): Promise<string> {\n if (existsSync(ref)) return ref;\n const p = await lookupAttachmentPath(ref);\n if (p) return p;\n throw new Error(tr(\"attachment.missing\", { ref: ref }));\n}\n","// What an attachment is, for deciding how each Agent gets it.\n// Only PNG, JPEG, GIF and WebP are images to the model APIs behind Claude Code, Codex and the ACP Agents\n// (Anthropic's Base64ImageSource.media_type is exactly these four); anything else is a file the Agent opens by path.\nexport const MODEL_IMAGE_MIMES = new Set([\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]);\n\nexport type AttachmentKind = \"image\" | \"text\" | \"other\";\n\n/** \"text/plain; charset=utf-8\" → \"text/plain\" */\nexport function baseMime(mime: string | undefined | null): string {\n return String(mime ?? \"\").split(\";\")[0].trim().toLowerCase();\n}\n\nconst TEXT_APP = new Set([\"application/json\", \"application/xml\", \"application/yaml\", \"application/x-yaml\", \"application/toml\", \"application/javascript\"]);\n\nexport function attachmentKind(mime: string | undefined | null): AttachmentKind {\n const m = baseMime(mime);\n if (MODEL_IMAGE_MIMES.has(m)) return \"image\";\n if (m.startsWith(\"text/\") || TEXT_APP.has(m)) return \"text\";\n return \"other\";\n}\n\n/** The line an Agent gets for an attachment sent by path */\nexport function pathNote(kind: AttachmentKind, file: string): string {\n return `${kind === \"image\" ? \"Attached image\" : \"Attached file\"}: ${file}`;\n}\n","// One user message → the content blocks of a claude stream-json user message (Anthropic Messages content).\n// - PNG / JPEG / GIF / WebP (Base64ImageSource's media types), up to 5 MB each: an image block\n// - text files up to 1 MB: a document block with a plain-text source (DocumentBlockParam + PlainTextSource)\n// - anything else, or too large: the file's absolute path in the text, which Claude Code can Read; with a warning\n// for files that aren't images or text, so the user knows\nimport { readFile, stat } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { resolveImagePath } from \"../../util/attachmentRefs.js\";\nimport { attachmentKind, baseMime, pathNote } from \"../../util/attachmentKinds.js\";\n\n/** Anthropic's per-image limit */\nexport const CLAUDE_MAX_IMAGE_BYTES = 5 * 1024 * 1024;\nexport const CLAUDE_MAX_TEXT_BYTES = 1024 * 1024;\n\ntype ImageMedia = \"image/png\" | \"image/jpeg\" | \"image/gif\" | \"image/webp\";\nexport type ClaudeBlock =\n | { type: \"text\"; text: string }\n | { type: \"image\"; source: { type: \"base64\"; media_type: ImageMedia; data: string } }\n | { type: \"document\"; source: { type: \"text\"; media_type: \"text/plain\"; data: string }; title?: string; context?: string };\n\nexport async function buildClaudeContent(\n text: string,\n attachments: { path: string; mime: string }[],\n): Promise<{ blocks: ClaudeBlock[]; warnings: string[] }> {\n const media: ClaudeBlock[] = [];\n const notes: string[] = [];\n const warnings: string[] = [];\n for (const a of attachments) {\n let file: string;\n let size: number;\n try {\n file = await resolveImagePath(a.path);\n size = (await stat(file)).size;\n } catch (e) {\n warnings.push(`${a.path}: ${String((e as Error)?.message ?? e)}`);\n continue;\n }\n const kind = attachmentKind(a.mime);\n try {\n if (kind === \"image\" && size <= CLAUDE_MAX_IMAGE_BYTES) {\n const data = (await readFile(file)).toString(\"base64\");\n media.push({ type: \"image\", source: { type: \"base64\", media_type: baseMime(a.mime) as ImageMedia, data } });\n continue;\n }\n if (kind === \"text\" && size <= CLAUDE_MAX_TEXT_BYTES) {\n const data = await readFile(file, \"utf8\");\n media.push({ type: \"document\", source: { type: \"text\", media_type: \"text/plain\", data }, title: basename(file), context: file });\n continue;\n }\n } catch (e) {\n warnings.push(`${basename(file)}: ${String((e as Error)?.message ?? e)}`);\n }\n notes.push(pathNote(kind, file));\n if (kind === \"other\") warnings.push(`${basename(file)} (${baseMime(a.mime) || \"unknown type\"}) is not an image or a text file; sent its path`);\n else if (kind === \"image\" && size > CLAUDE_MAX_IMAGE_BYTES) warnings.push(`${basename(file)}: ${(size / 1024 / 1024).toFixed(1)} MB, over Claude's 5 MB image limit; sent its path`);\n else if (kind === \"text\" && size > CLAUDE_MAX_TEXT_BYTES) warnings.push(`${basename(file)}: ${(size / 1024 / 1024).toFixed(1)} MB, too large to attach inline; sent its path`);\n }\n const fullText = [text, ...(notes.length ? [notes.join(\"\\n\")] : [])].filter(Boolean).join(\"\\n\\n\");\n // Media first, as before; the text block always comes last (claude needs at least one block)\n return { blocks: [...media, { type: \"text\", text: fullText }], warnings };\n}\n","// Settings › Launch command: a custom executable for an Agent plus extra arguments.\n// The arguments the user types are APPENDED after the built-in ones (e.g. `opencode acp --foo`, `codex app-server --foo`,\n// `claude <stream-json flags> --foo`). prefixArgs is internal (tests run `node fixture.mjs`) and goes before the built-ins.\nimport type { LaunchCommand } from \"./types.js\";\nimport type { Settings } from \"../store/settings.js\";\nimport { resolveBin, type ResolveResult } from \"../util/bin.js\";\nimport { tr } from \"../util/i18n.js\";\n\nexport function launchFromSettings(settings: Settings, providerId: string): LaunchCommand | undefined {\n const c = settings.providerCommand?.[providerId];\n const cmd = typeof c?.executable === \"string\" ? c.executable.trim() : \"\";\n if (!cmd) return undefined;\n const args = Array.isArray(c?.args) ? c!.args.filter((a): a is string => typeof a === \"string\") : [];\n return { cmd, args };\n}\n\n/** Built-in arguments wrapped with the launch command's internal prefix and the user's extra arguments. */\nexport function launchArgv(builtin: string[], launch?: LaunchCommand): string[] {\n return [...(launch?.prefixArgs ?? []), ...builtin, ...(launch?.args ?? [])];\n}\n\n/** Resolve a custom executable (absolute path or a name on PATH; Windows .cmd/.ps1 shims are handled by resolveBin). */\nexport async function resolveLaunch(launch: LaunchCommand): Promise<ResolveResult> {\n const r = await resolveBin(launch.cmd);\n if (r.ok) return r;\n return { ok: false, reason: tr(\"launch.notFound\", { cmd: launch.cmd }) };\n}\n\nexport function launchKey(launch?: LaunchCommand): string {\n return launch ? `${launch.cmd}\\0${(launch.prefixArgs ?? []).join(\"\\0\")}\\0\\0${(launch.args ?? []).join(\"\\0\")}` : \"\";\n}\n","// The user's own `claude` CLI driven over its stream-json protocol (no SDK):\n// claude -p --input-format stream-json --output-format stream-json --verbose --include-partial-messages\n// --permission-prompt-tool stdio [--model m] [--permission-mode p] [--effort e] [--resume id]\n// stdin and stdout carry one JSON object per line. Besides the conversation messages (user / assistant / system /\n// stream_event / result), both sides send control messages:\n// → {type:\"control_request\", request_id, request:{subtype:\"initialize\" | \"interrupt\" | \"set_model\" | \"set_permission_mode\", ...}}\n// ← {type:\"control_response\", response:{subtype:\"success\" | \"error\", request_id, response? | error?}}\n// ← {type:\"control_request\", request_id, request:{subtype:\"can_use_tool\", tool_name, input, tool_use_id, ...}}\n// → {type:\"control_response\", response:{subtype:\"success\", request_id, response:{behavior:\"allow\", updatedInput} | {behavior:\"deny\", message, interrupt?}}}\n// ← {type:\"control_cancel_request\", request_id} (the CLI no longer waits for that answer)\nimport type { LaunchCommand } from \"../types.js\";\nimport { launchArgv } from \"../launch.js\";\nimport type { ChildProcess } from \"node:child_process\";\nimport { killTree, spawnBin, type ResolveResult } from \"../../util/bin.js\";\nimport { AsyncQueue } from \"../../util/queue.js\";\n\nexport type ClaudeBin = ResolveResult & { ok: true };\nexport type Json = Record<string, unknown>;\n\nexport type ClaudeCliOpts = {\n bin: ClaudeBin;\n cwd: string;\n model: string | null;\n permissionMode: string;\n effort: string | null;\n resume: string | null;\n env?: NodeJS.ProcessEnv;\n /** Settings › Launch command: internal prefix before, user args after the built-in flags */\n launch?: LaunchCommand;\n};\n\nexport type PermissionDecision =\n | { behavior: \"allow\"; updatedInput: Json }\n | { behavior: \"deny\"; message: string; interrupt?: boolean };\n\nexport type ToolRequest = { toolName: string; input: Json; toolUseId?: string; signal: AbortSignal };\nexport type CanUseTool = (req: ToolRequest) => Promise<PermissionDecision>;\n\n/** Session ids and model / mode / effort names become argv: plain tokens only, so nothing can turn into another flag. */\nconst SAFE_ARG = /^[A-Za-z0-9][A-Za-z0-9._:\\[\\]\\/@+-]{0,199}$/;\n\nexport function claudeArgs(o: Pick<ClaudeCliOpts, \"model\" | \"permissionMode\" | \"effort\" | \"resume\">): string[] {\n const args = [\n \"-p\",\n \"--input-format\", \"stream-json\",\n \"--output-format\", \"stream-json\",\n \"--verbose\",\n \"--include-partial-messages\",\n \"--permission-prompt-tool\", \"stdio\",\n \"--setting-sources\", \"user,project,local\",\n ];\n const put = (flag: string, v: string | null | undefined) => {\n if (!v) return;\n if (!SAFE_ARG.test(v)) throw new Error(`Refusing to pass an unexpected value to claude ${flag}: ${JSON.stringify(v).slice(0, 80)}`);\n args.push(flag, v);\n };\n put(\"--permission-mode\", o.permissionMode);\n // claude only takes bypassPermissions when it is allowed at launch; it is not allowed otherwise (a later switch\n // into it restarts the CLI with --resume)\n if (o.permissionMode === \"bypassPermissions\") args.push(\"--allow-dangerously-skip-permissions\");\n put(\"--model\", o.model);\n put(\"--effort\", o.effort);\n put(\"--resume\", o.resume);\n return args;\n}\n\ntype Pending = { resolve: (v: Json) => void; reject: (e: Error) => void; timer?: NodeJS.Timeout };\n\nexport class ClaudeCli {\n /** Conversation messages (everything that is not a control message) */\n readonly messages = new AsyncQueue<Json>();\n readonly exited: Promise<{ code: number | null; signal: NodeJS.Signals | null }>;\n /** The answer to initialize (commands, models, account …), null when it failed */\n readonly initialized: Promise<Json | null>;\n private child: ChildProcess;\n private buf = \"\";\n private seq = 0;\n private pending = new Map<string, Pending>();\n private cancels = new Map<string, AbortController>();\n private stderrTail = \"\";\n private dead = false;\n private spawnError: Error | null = null;\n\n constructor(private o: ClaudeCliOpts, private canUseTool: CanUseTool) {\n const args = launchArgv(claudeArgs(o), o.launch);\n this.child = spawnBin(o.bin, args, {\n cwd: o.cwd,\n env: { ...(o.env ?? process.env), NO_COLOR: \"1\", FORCE_COLOR: \"0\" },\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n group: true,\n });\n this.child.stdout?.setEncoding(\"utf8\");\n this.child.stdout?.on(\"data\", (d: string) => this.onData(d));\n this.child.stderr?.on(\"data\", (d: Buffer) => {\n this.stderrTail = (this.stderrTail + d.toString()).slice(-4096);\n });\n this.child.stdin?.on(\"error\", () => {}); // EPIPE after the CLI exits: reported through exited\n this.exited = new Promise((resolve) => {\n this.child.on(\"error\", (e) => {\n this.spawnError = e;\n this.finish();\n resolve({ code: null, signal: null });\n });\n this.child.on(\"close\", (code, signal) => {\n this.finish();\n resolve({ code, signal });\n });\n });\n this.initialized = this.request({ subtype: \"initialize\" }, 60000).catch(() => null);\n }\n\n get stderr(): string {\n return this.stderrTail;\n }\n\n get failure(): Error | null {\n return this.spawnError;\n }\n\n get alive(): boolean {\n return !this.dead;\n }\n\n private finish(): void {\n if (this.dead) return;\n this.dead = true;\n for (const [, p] of this.pending) {\n if (p.timer) clearTimeout(p.timer);\n p.reject(new Error(\"claude exited\"));\n }\n this.pending.clear();\n for (const [, c] of this.cancels) c.abort();\n this.cancels.clear();\n this.messages.close();\n }\n\n private onData(d: string): void {\n this.buf += d;\n let i: number;\n while ((i = this.buf.indexOf(\"\\n\")) >= 0) {\n const line = this.buf.slice(0, i).trim();\n this.buf = this.buf.slice(i + 1);\n if (!line) continue;\n let m: Json;\n try {\n m = JSON.parse(line);\n } catch {\n continue; // a stray non-JSON line (warnings some versions print) is not part of the protocol\n }\n if (m && typeof m === \"object\") this.onMessage(m);\n }\n }\n\n private onMessage(m: Json): void {\n if (m.type === \"control_response\") {\n const r = (m.response ?? {}) as Json;\n const id = String(r.request_id ?? \"\");\n const p = this.pending.get(id);\n if (!p) return;\n this.pending.delete(id);\n if (p.timer) clearTimeout(p.timer);\n if (r.subtype === \"success\") p.resolve((r.response ?? {}) as Json);\n else p.reject(new Error(String(r.error ?? \"control request failed\")));\n return;\n }\n if (m.type === \"control_request\") {\n void this.onControlRequest(String(m.request_id ?? \"\"), (m.request ?? {}) as Json);\n return;\n }\n if (m.type === \"control_cancel_request\") {\n const id = String(m.request_id ?? \"\");\n this.cancels.get(id)?.abort();\n this.cancels.delete(id);\n return;\n }\n if (m.type === \"keep_alive\") return;\n this.messages.push(m);\n }\n\n private async onControlRequest(id: string, req: Json): Promise<void> {\n if (req.subtype !== \"can_use_tool\") {\n // hooks, in-process MCP servers, elicitation …: none are registered, so say so instead of leaving the CLI waiting\n this.write({ type: \"control_response\", response: { subtype: \"error\", request_id: id, error: `Unsupported control request: ${String(req.subtype)}` } });\n return;\n }\n const ac = new AbortController();\n this.cancels.set(id, ac);\n try {\n const decision = await this.canUseTool({\n toolName: String(req.tool_name ?? \"\"),\n input: (req.input && typeof req.input === \"object\" ? req.input : {}) as Json,\n toolUseId: typeof req.tool_use_id === \"string\" ? req.tool_use_id : undefined,\n signal: ac.signal,\n });\n if (ac.signal.aborted && !this.cancels.has(id)) return; // cancelled by the CLI: it no longer reads this answer\n this.write({ type: \"control_response\", response: { subtype: \"success\", request_id: id, response: decision } });\n } catch (e) {\n this.write({ type: \"control_response\", response: { subtype: \"error\", request_id: id, error: String((e as Error)?.message ?? e) } });\n } finally {\n this.cancels.delete(id);\n }\n }\n\n private write(o: Json): boolean {\n if (this.dead || !this.child.stdin || this.child.stdin.destroyed) return false;\n try {\n this.child.stdin.write(JSON.stringify(o) + \"\\n\");\n return true;\n } catch {\n return false;\n }\n }\n\n /** Send one control request and wait for its answer */\n request(request: Json, timeoutMs = 10000): Promise<Json> {\n if (this.dead) return Promise.reject(new Error(\"claude is not running\"));\n const id = `ac_${++this.seq}_${Math.random().toString(36).slice(2, 8)}`;\n return new Promise<Json>((resolve, reject) => {\n const p: Pending = { resolve, reject };\n p.timer = setTimeout(() => {\n if (this.pending.delete(id)) reject(new Error(`claude did not answer ${String(request.subtype)} in ${Math.round(timeoutMs / 1000)} s`));\n }, timeoutMs);\n this.pending.set(id, p);\n if (!this.write({ type: \"control_request\", request_id: id, request })) {\n this.pending.delete(id);\n clearTimeout(p.timer);\n reject(new Error(\"claude is not running\"));\n }\n });\n }\n\n /** One user message into the conversation */\n sendUser(content: unknown[], sessionId: string | null): boolean {\n return this.write({ type: \"user\", message: { role: \"user\", content }, parent_tool_use_id: null, session_id: sessionId ?? \"\" });\n }\n\n interrupt(): Promise<Json> {\n return this.request({ subtype: \"interrupt\" }, 5000);\n }\n\n setModel(model: string | null): Promise<Json> {\n return this.request(model ? { subtype: \"set_model\", model } : { subtype: \"set_model\" });\n }\n\n setPermissionMode(mode: string): Promise<Json> {\n return this.request({ subtype: \"set_permission_mode\", mode });\n }\n\n /** End stdin (the CLI finishes and exits), then end the process tree if it lingers */\n async close(graceMs = 2000): Promise<void> {\n try {\n this.child.stdin?.end();\n } catch {}\n const done = await Promise.race([this.exited.then(() => true), new Promise<boolean>((r) => setTimeout(() => r(false), graceMs))]);\n if (!done) await killTree(this.child, { graceMs: 500 });\n this.finish();\n }\n}\n","// Claude ProviderSession (§7.2.2/7.2.4/7.2.5/7.2.6): the user's own `claude` CLI over stream-json (./cli.ts),\n// one process per conversation, streaming, permissions, interrupt, hot switching. No SDK.\nimport type { LaunchCommand, ProviderSession, SendInput, RespondAnswer, Mode, SlashCommand } from \"../types.js\";\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { AsyncQueue } from \"../../util/queue.js\";\nimport { callInfo } from \"../../agents/kinds.js\";\nimport { editDetail } from \"../../agents/diff.js\";\nimport { mapSdkMessage, newMapState, type MapState } from \"./map.js\";\nimport { log } from \"../../log.js\";\nimport { buildClaudeContent } from \"./content.js\";\nimport { tr } from \"../../util/i18n.js\";\nimport { classifyClaudeSlashCommand, sortSlashCommands } from \"../slash.js\";\nimport { ClaudeCli, type ClaudeBin, type PermissionDecision, type ToolRequest } from \"./cli.js\";\n\nconst EFFORTS = [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"];\nconst MODES = [\"plan\", \"default\", \"acceptEdits\", \"bypassPermissions\"];\nconst rid = () => Math.random().toString(36).slice(2, 10);\n\ntype PendingReq = {\n kind: \"permission\" | \"question\";\n resolve: (r: RespondAnswer) => void;\n};\n\nexport type ClaudeSessionOpts = {\n threadId: string;\n cwd: string;\n model: string | null;\n mode: Mode;\n effort: string | null;\n resumeId: string | null;\n /** The user's claude, as resolveBin found it (a .cmd / .ps1 shim is started through cmd.exe / PowerShell by spawnBin) */\n bin: ClaudeBin;\n launch?: LaunchCommand;\n /** Environment for the CLI (tests point it at a stand-in); process.env when absent */\n env?: NodeJS.ProcessEnv;\n onModeChange?: (mode: Mode) => void; // Callback when a plan is approved → default (the manager updates meta)\n};\n\nexport class ClaudeSession implements ProviderSession {\n events: AsyncIterable<ProviderEvent>;\n private q = new AsyncQueue<ProviderEvent>();\n private cli: ClaudeCli | null = null;\n private sessionId: string | null;\n private turnId: string | null = null;\n private turnNum = 0;\n private st: MapState = newMapState();\n private pending = new Map<string, PendingReq>();\n private needsRestart = false;\n private restarting: Promise<void> | null = null;\n private closed = false;\n private stopping = new WeakSet<ClaudeCli>();\n private pumpDone: Promise<void> | null = null;\n /** Mode the running CLI was started with (bypassPermissions has to be allowed at launch) */\n private launchedMode: string | null = null;\n\n constructor(private o: ClaudeSessionOpts) {\n this.sessionId = o.resumeId;\n this.events = this.q;\n }\n\n // The CLI is only started before the first send (or a command list request)\n private ensureCli(): ClaudeCli {\n if (this.cli && !this.needsRestart) return this.cli;\n this.st = newMapState();\n const effort = this.o.effort && EFFORTS.includes(this.o.effort) ? this.o.effort : null;\n const cli = new ClaudeCli(\n {\n bin: this.o.bin,\n cwd: this.o.cwd,\n model: this.o.model,\n permissionMode: MODES.includes(this.o.mode) ? this.o.mode : \"default\",\n effort,\n resume: this.sessionId,\n env: this.o.env,\n launch: this.o.launch,\n },\n (req) => this.canUseTool(req),\n );\n this.cli = cli;\n this.launchedMode = this.o.mode;\n this.needsRestart = false;\n this.pumpDone = this.pump(cli);\n return cli;\n }\n\n private async pump(cli: ClaudeCli): Promise<void> {\n for await (const m of cli.messages) {\n for (const ev of mapSdkMessage(m, this.st, this.o.cwd)) this.emit(ev);\n }\n const exit = await cli.exited;\n // A CLI this session stopped on purpose (restart / close) is not a crash\n if (this.closed || this.stopping.has(cli)) return;\n const detail = cli.failure\n ? tr(\"claude.startFailed\", { detail: String(cli.failure.message) })\n : tr(\"claude.exited\", { code: String(exit.code ?? exit.signal ?? \"?\") });\n const tail = cli.stderr.trim().slice(-400);\n this.emit({ type: \"notice\", level: \"error\", message: tail ? `${detail} — stderr: ${tail}` : detail });\n if (this.turnId) this.emit({ type: \"turn_ended\", turnId: this.turnId, status: \"failed\", error: detail });\n this.turnId = null;\n // The event stream ended: an old CLI that restart() replaced must not close the event queue\n if (this.cli === cli) {\n this.needsRestart = true; // Rebuild with --resume on the next send\n this.q.close();\n }\n }\n\n private emit(ev: ProviderEvent): void {\n if (ev.type === \"turn_ended\" && !ev.turnId) ev.turnId = this.turnId ?? \"unknown\";\n if (ev.type === \"turn_ended\") this.turnId = null;\n if (ev.type === \"provider_session_id\" && ev.id) this.sessionId = ev.id;\n this.q.push(ev);\n }\n\n async send(input: SendInput): Promise<void> {\n if (this.closed) throw new Error(tr(\"claude.closed\"));\n if (this.needsRestart) await this.restart();\n const cli = this.ensureCli();\n this.turnNum++;\n this.turnId = \"u_\" + Date.now().toString(36) + \"_\" + this.turnNum;\n this.st.sawInterrupt = false; // A new turn clears the old interrupt flag\n this.emit({\n type: \"turn_started\",\n turnId: this.turnId,\n model: this.o.model,\n mode: this.o.mode,\n effort: this.o.effort,\n });\n const built = await buildClaudeContent(input.text, input.images ?? []);\n for (const w of built.warnings) this.emit({ type: \"notice\", level: \"warn\", message: tr(\"notice.attachmentIssue\", { detail: w }) });\n if (!cli.sendUser(built.blocks, this.sessionId)) throw new Error(tr(\"claude.notRunning\"));\n }\n\n private async restart(): Promise<void> {\n if (this.restarting) return this.restarting;\n this.restarting = (async () => {\n const old = this.cli;\n this.cli = null;\n if (old) {\n this.stopping.add(old);\n await old.close().catch(() => {});\n }\n if (this.pumpDone) await this.pumpDone.catch(() => {});\n try {\n this.ensureCli();\n } finally {\n this.restarting = null;\n }\n })();\n return this.restarting;\n }\n\n // ---- permissions (§7.2.4) ----\n private canUseTool(req: ToolRequest): Promise<PermissionDecision> {\n const { toolName, input, signal } = req;\n const requestId = \"perm_\" + rid();\n const opts = { toolUseID: req.toolUseId };\n\n if (toolName === \"ExitPlanMode\") {\n return this.handlePlanMode(requestId, input, signal, opts.toolUseID);\n }\n if (toolName === \"AskUserQuestion\" && Array.isArray(input.questions)) {\n return this.handleQuestion(requestId, input, signal);\n }\n\n const info = callInfo(toolName, { ...input, _exists: true }, this.o.cwd);\n let detail: Record<string, unknown> = { ...(info.detail as Record<string, unknown>), toolName };\n if (info.kind === \"edit\" && (input.old_string !== undefined || Array.isArray(input.edits))) {\n detail = { ...editDetail({ path: info.detail.path as string, old: input.old_string, new: input.new_string, edits: input.edits }), toolName };\n }\n this.emit({\n type: \"permission_request\",\n requestId,\n title: info.title,\n kind: \"tool\",\n detail,\n options: [\n { id: \"allow\", label: tr(\"perm.allow\"), kind: \"allow_once\" },\n { id: \"allow_always\", label: tr(\"perm.allowSession\"), kind: \"allow_always\" },\n { id: \"deny\", label: tr(\"perm.deny\"), kind: \"reject_once\" },\n ],\n });\n return new Promise<PermissionDecision>((resolve) => {\n this.pending.set(requestId, { kind: \"permission\", resolve: (a) => resolve(this.toPermissionDecision(a, input)) });\n signal.addEventListener(\"abort\", () => {\n if (this.pending.delete(requestId)) {\n this.emit({ type: \"permission_resolved\", requestId, cancelled: true });\n resolve({ behavior: \"deny\", message: \"Cancelled by the user\", interrupt: true });\n }\n }, { once: true });\n });\n }\n\n private toPermissionDecision(a: RespondAnswer, input: Record<string, unknown>): PermissionDecision {\n if (a.cancelled || a.optionId === \"deny\") {\n return { behavior: \"deny\", message: \"The user denied this action\", ...(a.cancelled ? { interrupt: true } : {}) };\n }\n return { behavior: \"allow\", updatedInput: input };\n }\n\n private async handlePlanMode(requestId: string, input: Record<string, unknown>, signal: AbortSignal, toolUseID?: string): Promise<PermissionDecision> {\n const planText = typeof input.plan === \"string\" ? input.plan : \"\";\n if (planText) {\n this.emit({ type: \"plan\", itemId: toolUseID ?? requestId, markdown: planText });\n }\n this.emit({\n type: \"permission_request\",\n requestId,\n title: tr(\"perm.plan\"),\n kind: \"plan\",\n detail: { plan: planText },\n options: [\n { id: \"implement\", label: tr(\"perm.implement\"), kind: \"allow_once\" },\n { id: \"reject\", label: tr(\"perm.deny\"), kind: \"reject_once\" },\n ],\n });\n const answer = await new Promise<RespondAnswer>((resolve) => {\n this.pending.set(requestId, { kind: \"permission\", resolve: (a) => resolve(a as RespondAnswer) });\n signal.addEventListener(\"abort\", () => {\n if (this.pending.delete(requestId)) {\n this.emit({ type: \"permission_resolved\", requestId, cancelled: true });\n resolve({ cancelled: true });\n }\n }, { once: true });\n });\n if (answer.cancelled || answer.optionId === \"reject\") {\n return { behavior: \"deny\", message: \"The user rejected the plan; revise it based on their feedback\", ...(answer.cancelled ? { interrupt: true } : {}) };\n }\n // implement: switch back to default mode\n try {\n await this.cli?.setPermissionMode(\"default\");\n this.o.mode = \"default\";\n this.o.onModeChange?.(\"default\");\n } catch (e) {\n log(\"warn\", \"setPermissionMode(default) 失败\", { err: String(e) });\n }\n return { behavior: \"allow\", updatedInput: input };\n }\n\n private async handleQuestion(requestId: string, input: Record<string, unknown>, signal: AbortSignal): Promise<PermissionDecision> {\n this.emit({ type: \"question\", requestId, questions: input.questions as unknown[] });\n const answer = await new Promise<RespondAnswer>((resolve) => {\n this.pending.set(requestId, { kind: \"question\", resolve: (a) => resolve(a as RespondAnswer) });\n signal.addEventListener(\"abort\", () => {\n if (this.pending.delete(requestId)) {\n this.emit({ type: \"permission_resolved\", requestId, cancelled: true });\n resolve({ cancelled: true });\n }\n }, { once: true });\n });\n if (answer.cancelled) {\n return { behavior: \"deny\", message: \"The user cancelled the question\", interrupt: true };\n }\n // answers are keyed by the question text (Claude's AskUserQuestion schema keys answers by question text)\n const questions = (input.questions as { question?: string; header?: string }[]) ?? [];\n const normalized: Record<string, string> = {};\n for (const ques of questions) {\n const text = ques.question;\n if (!text) continue;\n const v = answer.answers?.[text] ?? (ques.header ? answer.answers?.[ques.header] : undefined);\n if (v) normalized[text] = v;\n }\n return { behavior: \"allow\", updatedInput: { ...input, answers: normalized } };\n }\n\n respond(requestId: string, answer: RespondAnswer): void {\n const p = this.pending.get(requestId);\n if (p) {\n this.pending.delete(requestId);\n p.resolve(answer);\n }\n }\n\n async interrupt(): Promise<void> {\n this.st.sawInterrupt = true;\n // Cancel every pending permission/question\n for (const [id, p] of this.pending) {\n this.emit({ type: \"permission_resolved\", requestId: id, cancelled: true });\n p.resolve({ cancelled: true });\n }\n this.pending.clear();\n const cli = this.cli;\n if (!cli || !cli.alive) return;\n try {\n await cli.interrupt();\n } catch (e) {\n // No answer: stop this CLI; the next send starts it again with --resume\n log(\"warn\", \"claude interrupt failed\", { err: String(e) });\n this.stopping.add(cli);\n this.needsRestart = true;\n void cli.close(500);\n if (this.turnId) this.emit({ type: \"turn_ended\", turnId: this.turnId, status: \"interrupted\" });\n }\n }\n\n async setModel(model: string | null): Promise<void> {\n this.o.model = model;\n if (!this.cli?.alive) return;\n try {\n await this.cli.setModel(model);\n } catch (e) {\n log(\"warn\", \"claude set_model failed\", { err: String(e) });\n this.needsRestart = true;\n }\n }\n\n async setMode(mode: Mode): Promise<void> {\n this.o.mode = mode;\n if (!this.cli?.alive) return;\n // bypassPermissions is only accepted by a CLI started with it allowed: restart into it (--resume keeps the context)\n if (mode === \"bypassPermissions\" && this.launchedMode !== \"bypassPermissions\") {\n this.needsRestart = true;\n return;\n }\n try {\n await this.cli.setPermissionMode(mode);\n } catch (e) {\n log(\"warn\", \"claude set_permission_mode failed\", { err: String(e) });\n this.needsRestart = true;\n }\n }\n\n async setEffort(effort: string | null): Promise<void> {\n this.o.effort = effort;\n // --effort is a launch flag → restart (continued via --resume)\n this.needsRestart = true;\n }\n\n async listCommands(): Promise<SlashCommand[]> {\n try {\n const init = await this.ensureCli().initialized;\n const commands = Array.isArray(init?.commands) ? (init!.commands as { name?: string; description?: string; argumentHint?: string }[]) : [];\n const map = new Map<string, SlashCommand>();\n for (const cmd of commands) {\n if (cmd?.name && !map.has(cmd.name)) {\n map.set(cmd.name, {\n name: cmd.name,\n description: cmd.description ?? \"\",\n argumentHint: cmd.argumentHint,\n kind: classifyClaudeSlashCommand(cmd.name),\n });\n }\n }\n return sortSlashCommands([...map.values()]);\n } catch {\n return [];\n }\n }\n\n async close(): Promise<void> {\n this.closed = true;\n for (const [, p] of this.pending) p.resolve({ cancelled: true });\n this.pending.clear();\n const cli = this.cli;\n if (cli) {\n this.stopping.add(cli);\n await cli.close().catch(() => {});\n }\n if (this.pumpDone) {\n await Promise.race([this.pumpDone.catch(() => {}), new Promise((r) => setTimeout(r, 3000))]);\n }\n this.q.close();\n }\n}\n","// Model list (§7.2.7): Claude Code has no model query API.\n// Behind the magpie gateway, gateway models, the default model and thinking levels are filled in by providers/magpieGateway.ts;\n// without magpie only \"Default\" is offered (the frontend always shows it; no empty-id placeholder is added here anymore).\nimport type { ModelInfo } from \"../types.js\";\n\nexport async function listClaudeModels(): Promise<ModelInfo[]> {\n return [];\n}\n","// History import (§7.6): Claude sessions live in ~/.claude/projects/<encoded dir>/<sessionId>.jsonl.\n// Don't guess the encoding rule: list every directory, read the first record with a cwd from each jsonl, match the project with samePath.\n// Read-only throughout.\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { samePath } from \"../util/paths.js\";\nimport { tr } from \"../util/i18n.js\";\n\nconst CLAUDE_ROOT = join(homedir(), \".claude\", \"projects\");\n\ntype Rec = Record<string, unknown>;\nconst rec = (v: unknown): Rec => (v && typeof v === \"object\" ? (v as Rec) : {});\nconst str = (v: unknown): string | undefined => (typeof v === \"string\" ? v : undefined);\n\n// One jsonl line → {cwd?, title?, isUserText}\nfunction parseLine(line: string): { cwd?: string; userText?: string } | null {\n let r: Rec;\n try {\n r = rec(JSON.parse(line));\n } catch {\n return null;\n }\n const cwd = str(r.cwd);\n let userText: string | undefined;\n if (r.type === \"user\") {\n const content = rec(r.message).content;\n if (typeof content === \"string\") userText = content;\n else if (Array.isArray(content)) {\n const t = content.map((p) => (rec(p).type === \"text\" ? str(rec(p).text) : undefined)).find(Boolean);\n userText = t;\n }\n }\n return { cwd, userText };\n}\n\nasync function* linesOf(path: string): AsyncGenerator<string> {\n const text = await readFile(path, \"utf8\").catch(() => \"\");\n for (const line of text.split(\"\\n\")) {\n if (line.trim()) yield line;\n }\n}\n\n// Project cwd → that project's past sessions\nexport async function listClaudeHistory(cwd: string): Promise<{ sessionId: string; title: string; updatedAt: number; messageCount: number }[]> {\n const out: { sessionId: string; title: string; updatedAt: number; messageCount: number }[] = [];\n const dirs = await readdir(CLAUDE_ROOT).catch(() => [] as string[]);\n for (const d of dirs) {\n const dirPath = join(CLAUDE_ROOT, d);\n const files = (await readdir(dirPath).catch(() => [] as string[])).filter((f) => f.endsWith(\".jsonl\"));\n for (const f of files) {\n const path = join(dirPath, f);\n let match = false;\n let title = \"\";\n let count = 0;\n for await (const line of linesOf(path)) {\n const p = parseLine(line);\n if (!p) continue;\n if (!match) {\n if (!p.cwd) continue;\n match = samePath(p.cwd, cwd);\n if (!match) break;\n }\n if (p.userText && !title) title = p.userText.slice(0, 40);\n if (p.userText) count++;\n }\n if (!match) continue;\n const s = await stat(path).catch(() => null);\n out.push({\n sessionId: f.replace(/\\.jsonl$/, \"\"),\n title: title || tr(\"history.untitled\"),\n updatedAt: s ? Math.round(s.mtimeMs) : 0,\n messageCount: count,\n });\n }\n }\n out.sort((a, b) => b.updatedAt - a.updatedAt);\n return out;\n}\n\n// Read one session's jsonl → SDK message shape (so mapSdkMessage can be reused)\nexport async function readClaudeHistory(sessionId: string, cwd: string): Promise<Rec[]> {\n const dirs = await readdir(CLAUDE_ROOT).catch(() => [] as string[]);\n for (const d of dirs) {\n const path = join(CLAUDE_ROOT, d, `${sessionId}.jsonl`);\n if (!existsSync(path)) continue;\n // Confirm it belongs to this project (the first cwd record matches)\n const msgs: Rec[] = [];\n let matched = false;\n for await (const line of linesOf(path)) {\n const p = parseLine(line);\n if (!matched) {\n if (p?.cwd && samePath(p.cwd, cwd)) matched = true;\n else continue;\n }\n let r: Rec;\n try {\n r = rec(JSON.parse(line));\n } catch {\n continue;\n }\n // Keep only user/assistant/result — same shape as the SDK's streamed messages, so mapSdkMessage can digest them\n if (r.type === \"user\" || r.type === \"assistant\") msgs.push(r);\n }\n return msgs;\n }\n return [];\n}\n","// Claude Provider (§7.2): detection + createSession(ClaudeSession).\nimport type { Provider, ProviderSession, DetectResult, ModelInfo, HistoryItem, LaunchCommand } from \"../types.js\";\nimport { resolveBin, killTree, spawnBin, type ResolveResult } from \"../../util/bin.js\";\nimport { ClaudeSession } from \"./session.js\";\nimport { listClaudeModels } from \"./models.js\";\nimport { listClaudeHistory, readClaudeHistory } from \"../../history/import.js\";\nimport { mapSdkMessage, newMapState } from \"./map.js\";\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { tr } from \"../../util/i18n.js\";\nimport { resolveLaunch } from \"../launch.js\";\n\nconst INSTALL_HINT = \"npm i -g @anthropic-ai/claude-code\";\n\nexport const claudeCapabilities = {\n resume: true,\n interrupt: true,\n steer: false, // Claude doesn't support real steering — the manager queues instead (§7.2.2)\n images: true,\n plan: true,\n questions: true,\n cost: true,\n effort: [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n modes: [\"plan\", \"default\", \"acceptEdits\", \"bypassPermissions\"] as (\"plan\" | \"default\" | \"acceptEdits\" | \"bypassPermissions\")[],\n};\n\nfunction runVersion(r: ResolveResult & { ok: true }, args: string[], timeoutMs = 5000): Promise<string> {\n return new Promise((resolvePromise, reject) => {\n let out = \"\";\n const p = spawnBin(r, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"], env: { ...process.env, NO_COLOR: \"1\", FORCE_COLOR: \"0\" } });\n const t = setTimeout(() => {\n try {\n void killTree(p, { graceMs: 500 }); // On Windows a .cmd wrapper must be killed together with its child processes\n } catch {}\n reject(new Error(\"timeout\"));\n }, timeoutMs);\n p.stdout?.on(\"data\", (c: Buffer) => (out += c.toString()));\n p.stderr?.on(\"data\", (c: Buffer) => (out += c.toString()));\n p.on(\"error\", reject);\n p.on(\"close\", (code) => {\n clearTimeout(t);\n if (code === 0) resolvePromise(out);\n else reject(new Error(\"exit \" + code));\n });\n });\n}\n\nexport function createClaudeProvider(opts: { resolve?: (name: string) => Promise<ResolveResult> } = {}): Provider {\n const resolve = opts.resolve ?? resolveBin;\n const resolveCustom = opts.resolve ? (l: LaunchCommand) => opts.resolve!(l.cmd) : resolveLaunch;\n return {\n id: \"claude\",\n name: \"Claude Code\",\n capabilities: claudeCapabilities,\n async detect(launch?: LaunchCommand): Promise<DetectResult> {\n const bin = launch ? await resolveCustom(launch) : await resolve(\"claude\");\n if (!bin.ok) return { available: false, reason: bin.reason, installHint: INSTALL_HINT };\n try {\n const version = await runVersion(bin, [...(launch?.prefixArgs ?? []), \"--version\"]);\n return { available: true, bin: bin.display, version: version.trim().split(\"\\n\")[0] || \"\" };\n } catch {\n return { available: true, bin: bin.display, version: \"\" };\n }\n },\n async listModels(): Promise<ModelInfo[]> {\n return listClaudeModels();\n },\n async createSession(o): Promise<ProviderSession> {\n const bin = o.launch ? await resolveCustom(o.launch) : await resolve(\"claude\");\n if (!bin.ok) throw new Error(tr(\"claude.notFound\", { detail: bin.reason, hint: INSTALL_HINT }));\n return new ClaudeSession({\n threadId: o.threadId,\n cwd: o.cwd,\n model: o.model,\n mode: o.mode,\n effort: o.effort,\n resumeId: o.resumeId,\n bin,\n launch: o.launch,\n });\n },\n // §7.6: jsonl sessions under ~/.claude/projects matched by cwd\n async listHistory(cwd: string): Promise<HistoryItem[]> {\n const items = await listClaudeHistory(cwd);\n return items.map((i) => ({ provider: \"claude\", ...i, imported: false }));\n },\n async readHistory(sessionId: string, cwd: string): Promise<ProviderEvent[]> {\n const msgs = await readClaudeHistory(sessionId, cwd);\n const st = newMapState();\n const out: ProviderEvent[] = [];\n for (const m of msgs) {\n const r = m as { type?: string; message?: { content?: unknown } };\n // User text messages don't appear as events in claude's stream-json output (the manager writes user_message itself); emit them here\n if (r.type === \"user\") {\n const content = r.message?.content;\n const text = typeof content === \"string\"\n ? content\n : Array.isArray(content)\n ? (content as { type?: string; text?: string }[]).filter((b) => b.type === \"text\").map((b) => b.text ?? \"\").join(\"\")\n : \"\";\n if (text.trim()) out.push({ type: \"user_message\", text });\n else out.push(...mapSdkMessage(m as never, st, cwd)); // tool_result and the like still go through the mapping\n continue;\n }\n out.push(...mapSdkMessage(m as never, st, cwd));\n }\n // Finish: an imported session is closed\n out.push({ type: \"turn_ended\", turnId: \"\", status: \"completed\" });\n return out;\n },\n };\n}\n","// Codex history import (§7.6): ~/.codex/sessions/**/rollout-*.jsonl\n// Layout: session_meta (with cwd) → event_msg → response_item (message/function_call/...)\n// Import only user messages (minus environment_context and similar wrappers) + the assistant's final reply text; tool steps become notices. Read-only throughout.\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { samePath } from \"../util/paths.js\";\nimport { tr } from \"../util/i18n.js\";\n\nconst CODEX_ROOT = join(homedir(), \".codex\", \"sessions\");\n\ntype Rec = Record<string, unknown>;\nconst rec = (v: unknown): Rec => (v && typeof v === \"object\" ? (v as Rec) : {});\nconst str = (v: unknown): string | undefined => (typeof v === \"string\" ? v : undefined);\n\n// Environment wrappers in user messages: anything whose first line starts with <environment_context> or <user_instructions> isn't user input\nconst WRAPPERS = /^\\s*<(environment_context|user_instructions|skills_instructions|permissions instructions)>/i;\n\nfunction textOf(content: unknown, kind: string): string {\n if (!Array.isArray(content)) return \"\";\n return (content as Rec[])\n .filter((p) => p.type === kind || p.type === \"input_text\" || p.type === \"output_text\")\n .map((p) => str(p.text) ?? \"\")\n .join(\"\\n\")\n .trim();\n}\n\n// Find rollout-*.jsonl recursively\nasync function* walk(dir: string, depth = 0): AsyncGenerator<string> {\n if (depth > 6) return;\n for (const name of await readdir(dir).catch(() => [] as string[])) {\n const p = join(dir, name);\n const s = await stat(p).catch(() => null);\n if (!s) continue;\n if (s.isDirectory()) yield* walk(p, depth + 1);\n else if (/^rollout-.*\\.jsonl$/.test(name)) yield p;\n }\n}\n\nexport type CodexHistItem = { sessionId: string; title: string; updatedAt: number; messageCount: number };\n\nexport async function listCodexHistory(cwd: string): Promise<CodexHistItem[]> {\n const out: CodexHistItem[] = [];\n for await (const path of walk(CODEX_ROOT)) {\n const m = /rollout-.*-([0-9a-f-]{36})\\.jsonl$/i.exec(path);\n const sessionId = m?.[1];\n if (!sessionId) continue;\n const text = await readFile(path, \"utf8\").catch(() => \"\");\n let match = false;\n let title = \"\";\n let count = 0;\n for (const line of text.split(\"\\n\")) {\n if (!line.trim()) continue;\n let r: Rec;\n try {\n r = rec(JSON.parse(line));\n } catch {\n continue;\n }\n // session_meta records payload.cwd\n if (r.type === \"session_meta\") {\n const cwdInFile = str(rec(r.payload).cwd);\n if (cwdInFile && samePath(cwdInFile, cwd)) match = true;\n else break; // Not this project: stop reading\n continue;\n }\n if (!match) continue;\n if (r.type === \"response_item\") {\n const p = rec(r.payload);\n if (p.type === \"message\" && p.role === \"user\") {\n const t = textOf(p.content, \"input_text\");\n if (t && !WRAPPERS.test(t)) {\n count++;\n if (!title) title = t.slice(0, 40);\n }\n }\n }\n }\n if (!match) continue;\n const s = await stat(path).catch(() => null);\n out.push({ sessionId, title: title || tr(\"history.untitled\"), updatedAt: s ? Math.round(s.mtimeMs) : 0, messageCount: count });\n }\n out.sort((a, b) => b.updatedAt - a.updatedAt);\n return out;\n}\n\n// Read one rollout → simplified events (user_message / assistant_message / notice for tool steps / turn_ended)\ntype CodexEv = {\n type: string; text?: string; message?: string; itemId?: string; level?: string;\n turnId?: string; status?: string;\n};\nexport async function readCodexHistory(sessionId: string, cwd: string): Promise<CodexEv[]> {\n const out: CodexEv[] = [];\n let file: string | null = null;\n for await (const p of walk(CODEX_ROOT)) {\n if (p.endsWith(`${sessionId}.jsonl`)) { file = p; break; }\n }\n if (!file) return out;\n const text = await readFile(file, \"utf8\").catch(() => \"\");\n let matched = false;\n let aid = 0;\n // response_item.message and event_msg.item_completed duplicate each other → dedupe by text\n const seenText = new Set<string>();\n const pushText = (type: \"user_message\" | \"assistant_message\", t: string) => {\n const key = type + \":\" + t;\n if (!t || seenText.has(key)) return;\n seenText.add(key);\n out.push(type === \"user_message\" ? { type, text: t } : { type, itemId: `imp_a${aid++}`, text: t });\n };\n for (const line of text.split(\"\\n\")) {\n if (!line.trim()) continue;\n let r: Rec;\n try {\n r = rec(JSON.parse(line));\n } catch {\n continue;\n }\n if (r.type === \"session_meta\") {\n const c = str(rec(r.payload).cwd);\n if (c && samePath(c, cwd)) matched = true;\n continue;\n }\n if (!matched) continue;\n // response_item message\n if (r.type === \"response_item\") {\n const p = rec(r.payload);\n if (p.type === \"message\") {\n const role = str(p.role);\n const phase = str(p.phase);\n if (role === \"user\") {\n const t = textOf(p.content, \"input_text\");\n if (t && !WRAPPERS.test(t)) pushText(\"user_message\", t);\n } else if (role === \"assistant\" && phase !== \"commentary\") {\n const t = textOf(p.content, \"output_text\");\n if (t) pushText(\"assistant_message\", t);\n }\n } else if (p.type === \"function_call\" || p.type === \"custom_tool_call\") {\n const name = str(p.name) ?? \"tool\";\n out.push({ type: \"notice\", level: \"info\", message: tr(\"history.toolCall\", { name }) });\n }\n continue;\n }\n // event_msg.item_completed: AgentMessage (Text content blocks) and task_complete.last_agent_message\n if (r.type === \"event_msg\") {\n const p = rec(r.payload);\n if (p.type === \"item_completed\") {\n const it = rec(p.item);\n if (it.type === \"AgentMessage\" && it.phase !== \"commentary\") {\n const t = textOf(it.content, \"Text\");\n if (t) pushText(\"assistant_message\", t);\n } else if (it.type === \"UserMessage\") {\n const t = textOf(it.content, \"text\");\n if (t && !WRAPPERS.test(t)) pushText(\"user_message\", t);\n }\n } else if (p.type === \"task_complete\") {\n const last = str(p.last_agent_message);\n if (last) pushText(\"assistant_message\", last);\n }\n continue;\n }\n const p2 = rec(r.payload);\n if (p2.type === \"function_call\" || p2.type === \"custom_tool_call\") {\n // Tool steps collapse into a one-line notice (§7.6, Codex part)\n const name = str(p2.name) ?? \"tool\";\n out.push({ type: \"notice\", level: \"info\", message: tr(\"history.toolCall\", { name }) });\n }\n }\n out.push({ type: \"turn_ended\", turnId: \"import\", status: \"completed\" });\n return out;\n}\n","// JSON-RPC over stdio client for `codex app-server` (§7.3.2).\n// stdout is parsed line by line: {id,result|error} → response; {id,method} → server request; {method} → notification.\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { log } from \"../../log.js\";\nimport { killTree, trackTree, type Argv } from \"../../util/bin.js\";\n\nexport class CodexRpcError extends Error {\n code?: number;\n constructor(message: string, code?: number) {\n super(message);\n this.code = code;\n }\n}\n\nexport class CodexProcessExitedError extends CodexRpcError {\n constructor() {\n super(\"Codex 进程已退出\");\n }\n}\n\ntype ServerRequestHandler = (method: string, params: Record<string, unknown>) => Promise<unknown>;\ntype NotificationHandler = (method: string, params: Record<string, unknown>) => void;\n\nexport class CodexRpc {\n private proc: ChildProcess;\n private nextId = 1;\n private pending = new Map<number, { resolve: (v: unknown) => void; reject: (e: Error) => void }>();\n private buf = \"\";\n private exited = false;\n onServerRequest?: ServerRequestHandler;\n onNotification?: NotificationHandler;\n onExit?: (code: number | null) => void;\n\n constructor(\n argv: Argv,\n opts: { cwd?: string; env?: NodeJS.ProcessEnv } = {},\n ) {\n this.proc = spawn(argv.cmd, argv.args, {\n cwd: opts.cwd,\n env: opts.env ?? process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n windowsHide: true,\n ...(argv.windowsVerbatimArguments ? { windowsVerbatimArguments: true } : {}),\n // Non-Windows: its own process group, so after a close() timeout killTree also ends the commands codex started\n ...(process.platform !== \"win32\" ? { detached: true } : {}),\n });\n trackTree(this.proc);\n this.proc.stdout!.setEncoding(\"utf8\");\n this.proc.stdout!.on(\"data\", (chunk: string) => this.onData(chunk));\n this.proc.stderr!.setEncoding(\"utf8\");\n this.proc.stderr!.on(\"data\", (chunk: string) => {\n this.stderrTail = (this.stderrTail + chunk).slice(-4096);\n });\n this.proc.on(\"error\", () => this.failAll());\n this.proc.on(\"close\", (code) => {\n this.exited = true;\n this.failAll();\n this.onExit?.(code);\n });\n }\n\n private stderrTail = \"\";\n\n get stderr(): string {\n return this.stderrTail;\n }\n\n get isExited(): boolean {\n return this.exited;\n }\n\n private onData(chunk: string): void {\n this.buf += chunk;\n let i: number;\n while ((i = this.buf.indexOf(\"\\n\")) >= 0) {\n const line = this.buf.slice(0, i).trim();\n this.buf = this.buf.slice(i + 1);\n if (!line) continue;\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(line);\n } catch {\n log(\"warn\", \"codex rpc: 非 JSON 行\", { line: line.slice(0, 200) });\n continue;\n }\n void this.dispatch(msg);\n }\n }\n\n private async dispatch(msg: Record<string, unknown>): Promise<void> {\n const hasId = msg.id !== undefined && msg.id !== null;\n if (hasId && (\"result\" in msg || \"error\" in msg)) {\n const id = Number(msg.id);\n const p = this.pending.get(id);\n if (p) {\n this.pending.delete(id);\n if (msg.error) {\n const e = msg.error as { code?: number; message?: string };\n p.reject(new CodexRpcError(e.message ?? \"RPC error\", e.code));\n } else {\n p.resolve(msg.result);\n }\n }\n return;\n }\n if (hasId && msg.method) {\n // Server request → needs a response\n const id = Number(msg.id);\n try {\n const result = this.onServerRequest\n ? await this.onServerRequest(String(msg.method), (msg.params as Record<string, unknown>) ?? {})\n : undefined;\n this.send({ id, result: result ?? null });\n } catch (e) {\n this.send({ id, error: { code: -32603, message: String((e as Error)?.message ?? e) } });\n }\n return;\n }\n if (!hasId && msg.method) {\n try {\n this.onNotification?.(String(msg.method), (msg.params as Record<string, unknown>) ?? {});\n } catch (e) {\n log(\"warn\", \"codex rpc: 通知处理失败\", { method: msg.method, err: String(e) });\n }\n }\n }\n\n private send(obj: Record<string, unknown>): void {\n if (this.exited) return;\n try {\n this.proc.stdin!.write(JSON.stringify(obj) + \"\\n\");\n } catch {}\n }\n\n request<T = unknown>(method: string, params?: Record<string, unknown>, timeoutMs = 60000): Promise<T> {\n if (this.exited) return Promise.reject(new CodexProcessExitedError());\n const id = this.nextId++;\n return new Promise<T>((resolvePromise, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new CodexRpcError(`请求超时:${method}`));\n }, timeoutMs);\n this.pending.set(id, {\n resolve: (v) => {\n clearTimeout(timer);\n resolvePromise(v as T);\n },\n reject: (e) => {\n clearTimeout(timer);\n reject(e);\n },\n });\n this.send({ jsonrpc: \"2.0\", id, method, params: params ?? {} });\n });\n }\n\n notify(method: string, params?: Record<string, unknown>): void {\n this.send({ jsonrpc: \"2.0\", method, params: params ?? {} });\n }\n\n private failAll(): void {\n const err = new CodexProcessExitedError();\n for (const [, p] of this.pending) p.reject(err);\n this.pending.clear();\n }\n\n async close(): Promise<void> {\n try {\n this.proc.stdin?.end();\n } catch {}\n await new Promise<void>((resolvePromise) => {\n const t = setTimeout(() => {\n void killTree(this.proc, { graceMs: 1500 });\n resolvePromise();\n }, 3000);\n this.proc.on(\"close\", () => {\n clearTimeout(t);\n resolvePromise();\n });\n if (this.exited) {\n clearTimeout(t);\n resolvePromise();\n }\n });\n }\n}\n","// One user message → Codex app-server UserInput items.\n// Only PNG / JPEG / GIF / WebP go as localImage; every other attachment (text files included) is named by its\n// absolute path in the text, which Codex opens with its own tools. Files that aren't images or text get a warning.\nimport { basename } from \"node:path\";\nimport { resolveImagePath } from \"../../util/attachmentRefs.js\";\nimport { attachmentKind, baseMime, pathNote } from \"../../util/attachmentKinds.js\";\n\nexport async function buildCodexInput(\n text: string,\n attachments: { path: string; mime: string }[],\n): Promise<{ items: Record<string, unknown>[]; warnings: string[] }> {\n const images: Record<string, unknown>[] = [];\n const notes: string[] = [];\n const warnings: string[] = [];\n for (const a of attachments) {\n let file: string;\n try {\n file = await resolveImagePath(a.path);\n } catch (e) {\n warnings.push(`${a.path}: ${String((e as Error)?.message ?? e)}`);\n continue;\n }\n const kind = attachmentKind(a.mime);\n if (kind === \"image\") {\n images.push({ type: \"localImage\", path: file });\n continue;\n }\n notes.push(pathNote(kind, file));\n if (kind === \"other\") warnings.push(`${basename(file)} (${baseMime(a.mime) || \"unknown type\"}) is not an image or a text file; sent its path`);\n }\n const fullText = [text, ...(notes.length ? [notes.join(\"\\n\")] : [])].filter(Boolean).join(\"\\n\\n\");\n return { items: [{ type: \"text\", text: fullText }, ...images], warnings };\n}\n","// Codex app-server notifications → ProviderEvent (§7.3.4). Method and field names follow the generated schema.\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { tr } from \"../../util/i18n.js\";\n\nconst MAX_OUTPUT = 20 * 1024;\nconst trunc = (s: string, n = 80): string => (s.length > n ? s.slice(0, n - 1) + \"…\" : s);\n\ntype Rec = Record<string, unknown>;\nconst rec = (v: unknown): Rec => (v && typeof v === \"object\" ? (v as Rec) : {});\nconst str = (v: unknown): string | undefined => (typeof v === \"string\" ? v : undefined);\n\nexport type CodexMapState = {\n currentTurnId: string | null;\n filesChanged: number;\n diffText: string;\n fileChangesByItemId: Map<string, unknown[]>;\n /** Raw reasoning text streamed per item (DeepSeek and others send no summary): saved when the item completes (B15) */\n reasoningRaw: Map<string, string>;\n};\n\nexport function newCodexMapState(): CodexMapState {\n return { currentTurnId: null, filesChanged: 0, diffText: \"\", fileChangesByItemId: new Map(), reasoningRaw: new Map() };\n}\n\n// One server notification → 0..n unified events. Server requests (approvals) don't go through here.\nexport function mapNotification(method: string, params: Rec, st: CodexMapState): ProviderEvent[] {\n const out: ProviderEvent[] = [];\n const turnId = str(params.turnId);\n\n switch (method) {\n case \"turn/started\": {\n const turn = rec(params.turn);\n const tid = str(turn.id);\n if (tid) st.currentTurnId = tid;\n st.filesChanged = 0;\n st.diffText = \"\";\n st.fileChangesByItemId.clear();\n st.reasoningRaw.clear();\n break;\n }\n case \"item/agentMessage/delta\": {\n const itemId = str(params.itemId) ?? \"\";\n const delta = str(params.delta) ?? \"\";\n if (itemId && delta) out.push({ type: \"assistant_delta\", itemId, text: delta });\n break;\n }\n case \"item/plan/delta\": {\n // Incremental plan stream: wait for the plan item in item/completed to send the full plan\n break;\n }\n case \"item/reasoning/summaryTextDelta\":\n case \"item/reasoning/textDelta\": {\n const itemId = str(params.itemId) ?? \"\";\n const delta = str(params.delta) ?? \"\";\n if (itemId && delta) {\n if (method === \"item/reasoning/textDelta\") st.reasoningRaw.set(itemId, (st.reasoningRaw.get(itemId) ?? \"\") + delta);\n out.push({ type: \"reasoning_delta\", itemId, text: delta });\n }\n break;\n }\n case \"item/commandExecution/outputDelta\":\n case \"item/fileChange/outputDelta\":\n case \"command/exec/outputDelta\": {\n const itemId = str(params.itemId) ?? \"\";\n const delta = str(params.delta) ?? \"\";\n if (itemId && delta) out.push({ type: \"tool_output_delta\", itemId, text: delta });\n break;\n }\n case \"item/started\": {\n const item = rec(params.item);\n const type = str(item.type) ?? \"\";\n const itemId = str(item.id) ?? \"\";\n if (type === \"commandExecution\") {\n const cmd = str(item.command) ?? \"\";\n out.push({\n type: \"tool_call\", itemId, kind: \"bash\",\n title: tr(\"tool.run\", { x: trunc(cmd) }), status: \"running\",\n detail: { command: cmd, cwd: str(item.cwd) },\n });\n } else if (type === \"fileChange\") {\n const changes = Array.isArray(item.changes) ? item.changes : [];\n if (itemId) st.fileChangesByItemId.set(itemId, changes);\n out.push({\n type: \"tool_call\", itemId, kind: \"edit\",\n title: tr(\"tool.editFiles\", { n: changes.length }), status: \"running\",\n detail: { changes },\n });\n } else if (type === \"mcpToolCall\" || type === \"dynamicToolCall\") {\n const tool = str(item.tool) ?? str(item.name) ?? \"\";\n const server = str(item.server) ?? \"\";\n out.push({\n type: \"tool_call\", itemId, kind: \"mcp\",\n title: `${server || \"mcp\"} · ${tool}`, status: \"running\",\n });\n } else if (type === \"webSearch\") {\n out.push({\n type: \"tool_call\", itemId, kind: \"web\",\n title: tr(\"tool.webSearch\", { x: trunc(str(item.query) ?? \"\", 40) }), status: \"running\",\n });\n }\n // agentMessage/reasoning/userMessage/plan etc.: wait for a delta or completed\n break;\n }\n case \"item/completed\": {\n const item = rec(params.item);\n const type = str(item.type) ?? \"\";\n const itemId = str(item.id) ?? \"\";\n if (type === \"agentMessage\") {\n const text = str(item.text) ?? \"\";\n if (text) out.push({ type: \"assistant_message\", itemId, text });\n } else if (type === \"reasoning\") {\n const summary = Array.isArray(item.summary) ? item.summary : [];\n const content = Array.isArray(item.content) ? item.content : [];\n const strings = (a: unknown[]) => a.filter((s): s is string => typeof s === \"string\").join(\"\\n\");\n // The summary when there is one, else the raw reasoning (on the item, or as streamed)\n const text = strings(summary) || strings(content) || st.reasoningRaw.get(itemId) || \"\";\n st.reasoningRaw.delete(itemId);\n if (text) out.push({ type: \"reasoning\", itemId, text });\n } else if (type === \"commandExecution\") {\n const cmd = str(item.command) ?? \"\";\n const exitCode = typeof item.exitCode === \"number\" ? item.exitCode : undefined;\n const output = str(item.aggregatedOutput) ?? \"\";\n out.push({\n type: \"tool_call\", itemId, kind: \"bash\",\n title: tr(\"tool.run\", { x: trunc(cmd) }),\n status: exitCode === 0 ? \"ok\" : \"failed\",\n output: output.length > MAX_OUTPUT ? output.slice(0, MAX_OUTPUT) : output,\n exitCode,\n durationMs: typeof item.durationMs === \"number\" ? item.durationMs : undefined,\n });\n } else if (type === \"fileChange\") {\n const changes = Array.isArray(item.changes) ? item.changes : [];\n if (itemId) st.fileChangesByItemId.set(itemId, changes);\n const istatus = str(item.status);\n st.filesChanged += changes.length;\n out.push({\n type: \"tool_call\", itemId, kind: \"edit\",\n title: tr(\"tool.editFiles\", { n: changes.length }),\n status: istatus === \"failed\" ? \"failed\" : \"ok\",\n detail: { changes },\n });\n } else if (type === \"mcpToolCall\" || type === \"dynamicToolCall\") {\n const tool = str(item.tool) ?? str(item.name) ?? \"\";\n const server = str(item.server) ?? \"\";\n const istatus = str(item.status);\n const err = str(item.error);\n out.push({\n type: \"tool_call\", itemId, kind: \"mcp\",\n title: `${server || \"mcp\"} · ${tool}`,\n status: istatus === \"failed\" || err ? \"failed\" : \"ok\",\n output: err ?? undefined,\n });\n } else if (type === \"webSearch\") {\n out.push({\n type: \"tool_call\", itemId, kind: \"web\",\n title: tr(\"tool.webSearch\", { x: trunc(str(item.query) ?? \"\", 40) }), status: \"ok\",\n });\n } else if (type === \"plan\") {\n const text = str(item.text) ?? \"\";\n if (text) out.push({ type: \"plan\", itemId, markdown: text });\n }\n break;\n }\n case \"turn/plan/updated\": {\n const steps = Array.isArray(params.plan) ? params.plan : [];\n const items = steps.map((s) => {\n const step = rec(s);\n const status = str(step.status) ?? \"pending\";\n return {\n text: str(step.step) ?? \"\",\n status: status === \"completed\" ? \"done\" : status === \"inProgress\" || status === \"in_progress\" ? \"in_progress\" : \"pending\",\n };\n });\n if (items.length) out.push({ type: \"todo\", items });\n break;\n }\n case \"turn/diff/updated\": {\n const diff = str(params.diff) ?? \"\";\n if (diff) st.diffText = diff;\n break;\n }\n case \"thread/tokenUsage/updated\": {\n const usage = rec(params.tokenUsage);\n const last = rec(usage.last) || usage;\n const input = typeof last.inputTokens === \"number\" ? last.inputTokens : 0;\n const output = typeof last.outputTokens === \"number\" ? last.outputTokens : 0;\n const cached = typeof last.cachedInputTokens === \"number\" ? last.cachedInputTokens : 0;\n out.push({\n type: \"usage\",\n inputTokens: input,\n outputTokens: output,\n cacheReadTokens: cached,\n costUsd: 0,\n });\n break;\n }\n case \"turn/completed\": {\n const turn = rec(params.turn);\n const status = str(turn.status) ?? \"completed\";\n const error = rec(turn.error);\n out.push({\n type: \"turn_ended\",\n turnId: str(turn.id) ?? turnId ?? st.currentTurnId ?? \"\",\n status: status === \"completed\" ? \"completed\" : status === \"interrupted\" ? \"interrupted\" : \"failed\",\n durationMs: typeof turn.durationMs === \"number\" ? turn.durationMs : undefined,\n error: str(error.message),\n filesChanged: st.filesChanged || undefined,\n });\n break;\n }\n case \"error\": {\n const msg = str(params.message) ?? tr(\"codex.error\");\n out.push({ type: \"notice\", level: \"error\", message: msg });\n break;\n }\n default:\n break;\n }\n return out;\n}\n","import { readdir, readFile, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, join } from \"node:path\";\nimport type { SlashCommand } from \"../slash.js\";\nimport { parseSlashInput, sortSlashCommands } from \"../slash.js\";\n\nexport type CodexSlashEntry = SlashCommand & { body: string };\n\nfunction parseFrontMatter(raw: string): { meta: Record<string, string>; body: string } {\n if (!raw.startsWith(\"---\\n\")) return { meta: {}, body: raw };\n const end = raw.indexOf(\"\\n---\\n\", 4);\n if (end === -1) return { meta: {}, body: raw };\n const fm = raw.slice(4, end);\n const meta: Record<string, string> = {};\n for (const line of fm.split(/\\r?\\n/)) {\n const m = line.match(/^([a-zA-Z0-9_-]+):\\s*(.+)$/);\n if (m) meta[m[1]!] = m[2]!.trim().replace(/^[\"']|[\"']$/g, \"\");\n }\n return { meta, body: raw.slice(end + 5) };\n}\n\nfunction firstLine(body: string): string {\n for (const line of body.split(/\\r?\\n/)) {\n const t = line.trim();\n if (t && !t.startsWith(\"#\")) return t.replace(/^#+\\s*/, \"\").slice(0, 120);\n }\n return \"\";\n}\n\nasync function readPromptFiles(dir: string): Promise<CodexSlashEntry[]> {\n const out: CodexSlashEntry[] = [];\n let names: string[] = [];\n try {\n names = await readdir(dir);\n } catch {\n return out;\n }\n for (const f of names) {\n if (!f.endsWith(\".md\")) continue;\n const path = join(dir, f);\n try {\n const st = await stat(path);\n if (!st.isFile()) continue;\n const raw = await readFile(path, \"utf8\");\n const { meta, body } = parseFrontMatter(raw);\n const name = basename(f, \".md\");\n out.push({\n name,\n description: meta.description || firstLine(body) || name,\n argumentHint: meta.argumentHint || meta[\"argument-hint\"],\n kind: \"command\",\n body,\n });\n } catch {\n /* skip */\n }\n }\n return out;\n}\n\nasync function readSkillDirs(root: string): Promise<CodexSlashEntry[]> {\n const out: CodexSlashEntry[] = [];\n let dirs: string[] = [];\n try {\n dirs = await readdir(root);\n } catch {\n return out;\n }\n for (const d of dirs) {\n const skillPath = join(root, d, \"SKILL.md\");\n try {\n const st = await stat(skillPath);\n if (!st.isFile()) continue;\n const raw = await readFile(skillPath, \"utf8\");\n const { meta, body } = parseFrontMatter(raw);\n const name = meta.name || d;\n out.push({\n name,\n description: meta.description || firstLine(body) || name,\n argumentHint: meta.argumentHint,\n kind: \"skill\",\n body,\n });\n } catch {\n /* skip */\n }\n }\n return out;\n}\n\nexport async function loadCodexSlashEntries(cwd: string, opts?: { skipHome?: boolean }): Promise<CodexSlashEntry[]> {\n const home = homedir();\n const parts = await Promise.all([\n opts?.skipHome ? Promise.resolve([]) : readPromptFiles(join(home, \".codex\", \"prompts\")),\n readPromptFiles(join(cwd, \".codex\", \"prompts\")),\n opts?.skipHome ? Promise.resolve([]) : readSkillDirs(join(home, \".codex\", \"skills\")),\n readSkillDirs(join(cwd, \".codex\", \"skills\")),\n ]);\n const byName = new Map<string, CodexSlashEntry>();\n for (const list of parts) {\n for (const e of list) {\n if (!byName.has(e.name)) byName.set(e.name, e);\n }\n }\n return sortSlashCommands([...byName.values()]) as CodexSlashEntry[];\n}\n\nexport function expandCodexSlash(text: string, entries: CodexSlashEntry[]): string {\n const parsed = parseSlashInput(text);\n if (!parsed) return text;\n const hit = entries.find((e) => e.name === parsed.name);\n if (!hit) return text;\n return hit.body.replace(/\\$ARGUMENTS/g, parsed.args);\n}\n\nexport function codexSlashCommandsFromEntries(entries: CodexSlashEntry[]): SlashCommand[] {\n return entries.map(({ body: _b, ...rest }) => rest);\n}\n","// Codex ProviderSession (§7.3.3/7.3.5): codex app-server JSON-RPC session.\nimport type { LaunchCommand, ProviderSession, SendInput, RespondAnswer, Mode, SlashCommand } from \"../types.js\";\nimport { buildCodexInput } from \"./input.js\";\nimport { tr } from \"../../util/i18n.js\";\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { AsyncQueue } from \"../../util/queue.js\";\nimport { CodexRpc } from \"./rpc.js\";\nimport { argvFor } from \"../../util/bin.js\";\nimport { mapNotification, newCodexMapState, type CodexMapState } from \"./map.js\";\nimport {\n codexSlashCommandsFromEntries,\n expandCodexSlash,\n loadCodexSlashEntries,\n type CodexSlashEntry,\n} from \"./commands.js\";\nimport { log } from \"../../log.js\";\nimport { launchArgv } from \"../launch.js\";\n\nconst rid = () => Math.random().toString(36).slice(2, 10);\n\n// §7.3.3 permission presets (per the four modes). Note the two shapes differ:\n// `sandbox` in thread/start|resume is a kebab-case enum (\"read-only\"…);\n// `sandboxPolicy` in turn/start is an object ({type:\"readOnly\"}…).\nconst MODE_PRESETS: Record<Mode, { approvalPolicy: string; sandbox: string; sandboxPolicy: Record<string, unknown> }> = {\n plan: { approvalPolicy: \"on-request\", sandbox: \"read-only\", sandboxPolicy: { type: \"readOnly\" } },\n default: { approvalPolicy: \"on-request\", sandbox: \"read-only\", sandboxPolicy: { type: \"readOnly\" } },\n acceptEdits: { approvalPolicy: \"on-request\", sandbox: \"workspace-write\", sandboxPolicy: { type: \"workspaceWrite\" } },\n bypassPermissions: { approvalPolicy: \"never\", sandbox: \"danger-full-access\", sandboxPolicy: { type: \"dangerFullAccess\" } },\n ask: { approvalPolicy: \"on-request\", sandbox: \"read-only\", sandboxPolicy: { type: \"readOnly\" } },\n};\n\ntype PendingReq = {\n kind: \"permission\" | \"question\";\n resolve: (a: RespondAnswer) => void;\n};\n\nexport class CodexSession implements ProviderSession {\n events: AsyncIterable<ProviderEvent>;\n private q = new AsyncQueue<ProviderEvent>();\n private rpc: CodexRpc | null = null;\n private st: CodexMapState = newCodexMapState();\n private sessionThreadId: string | null = null;\n private pending = new Map<string, PendingReq>();\n private closed = false;\n private started: Promise<void> | null = null;\n private interruptWanted = false;\n private ourTurnId: string | null = null; // The current turn's turnId in the timeline (generated on send)\n private staleCodexTurns = new Set<string>();\n private codexSlash: CodexSlashEntry[] | null = null;\n\n constructor(\n private o: {\n threadId: string;\n cwd: string;\n model: string | null;\n mode: Mode;\n effort: string | null;\n resumeId: string | null;\n binCmd: string;\n binPrefixArgs: string[];\n binVia?: string;\n binShim?: string;\n version: string;\n launch?: LaunchCommand;\n },\n ) {\n this.events = this.q;\n }\n\n private emit(ev: ProviderEvent): void {\n if (ev.type === \"turn_ended\") {\n // A late completion for the previous turn (already ended by the interrupt fallback): drop it so it doesn't end the new turn\n if (ev.turnId && this.staleCodexTurns.delete(ev.turnId)) return;\n // turn_started uses our own turnId, so the end must use the same one,\n // otherwise the manager's per-turn dedupe breaks (interrupt fallback + late completion would end the next turn)\n if (this.ourTurnId) ev.turnId = this.ourTurnId;\n this.ourTurnId = null;\n this.st.currentTurnId = null;\n this.interruptWanted = false;\n }\n this.q.push(ev);\n }\n\n private async start(): Promise<void> {\n if (this.started) return this.started;\n const attempt = (async () => {\n const rpc = new CodexRpc(\n argvFor(\n { ok: true, cmd: this.o.binCmd, prefixArgs: this.o.binPrefixArgs, display: this.o.binCmd, via: this.o.binVia ?? \"path\", shim: this.o.binShim },\n launchArgv([\"app-server\"], this.o.launch),\n ),\n { cwd: this.o.cwd },\n );\n this.rpc = rpc;\n rpc.onNotification = (m, p) => {\n for (const ev of mapNotification(m, p, this.st)) this.emit(ev);\n if (this.interruptWanted && this.st.currentTurnId) void this.interrupt();\n };\n rpc.onServerRequest = (m, p) => this.onServerRequest(m, p);\n rpc.onExit = () => {\n for (const [, p] of this.pending) p.resolve({ cancelled: true });\n this.pending.clear();\n if (!this.closed) this.q.close();\n };\n await rpc.request(\"initialize\", {\n clientInfo: { name: \"agent-console\", title: \"Agent Console\", version: this.o.version },\n capabilities: { experimentalApi: true },\n });\n rpc.notify(\"initialized\", {});\n const preset = MODE_PRESETS[this.o.mode];\n let threadId: string;\n if (this.o.resumeId) {\n const res = (await rpc.request(\"thread/resume\", {\n threadId: this.o.resumeId,\n cwd: this.o.cwd,\n model: this.o.model,\n approvalPolicy: preset.approvalPolicy,\n sandbox: preset.sandbox,\n })) as { thread?: { id?: string } };\n threadId = res.thread?.id ?? this.o.resumeId;\n } else {\n const res = (await rpc.request(\"thread/start\", {\n cwd: this.o.cwd,\n model: this.o.model,\n approvalPolicy: preset.approvalPolicy,\n sandbox: preset.sandbox,\n })) as { thread?: { id?: string } };\n threadId = res.thread?.id ?? \"\";\n }\n if (threadId) {\n this.sessionThreadId = threadId;\n this.emit({ type: \"provider_session_id\", id: threadId });\n }\n })();\n // Don't cache a failed start: clear it so the next send starts app-server again\n this.started = attempt.catch((e) => {\n if (this.started === guarded) {\n this.started = null;\n const rpc = this.rpc;\n this.rpc = null;\n if (rpc) {\n rpc.onExit = () => {};\n void Promise.resolve(rpc.close()).catch(() => {});\n }\n }\n throw e;\n });\n const guarded = this.started;\n return this.started;\n }\n\n async send(input: SendInput): Promise<void> {\n if (this.closed) throw new Error(tr(\"codex.closed\"));\n await this.start();\n const rpc = this.rpc!;\n const preset = MODE_PRESETS[this.o.mode];\n const entries = this.codexSlash ?? (await loadCodexSlashEntries(this.o.cwd));\n this.codexSlash = entries;\n const wireText = expandCodexSlash(input.text, entries);\n const { items, warnings } = await buildCodexInput(wireText, input.images ?? []);\n this.interruptWanted = false;\n const turnId = \"u_\" + Date.now().toString(36) + \"_\" + rid();\n // A new turn started before the previous one completed (interrupt fallback) → remember its Codex turnId\n if (this.ourTurnId && this.st.currentTurnId) this.staleCodexTurns.add(this.st.currentTurnId);\n this.ourTurnId = turnId;\n this.st.currentTurnId = null; // Filled in by this turn's turn/started, so we never interrupt/steer with the previous turn's id\n this.emit({\n type: \"turn_started\",\n turnId,\n model: this.o.model,\n mode: this.o.mode,\n effort: this.o.effort,\n });\n for (const w of warnings) this.emit({ type: \"notice\", level: \"warn\", message: tr(\"notice.attachmentIssue\", { detail: w }) });\n try {\n await rpc.request(\"turn/start\", {\n threadId: this.sessionThreadId ?? undefined,\n input: items,\n model: this.o.model,\n effort: this.o.effort,\n approvalPolicy: preset.approvalPolicy,\n sandboxPolicy: preset.sandboxPolicy,\n });\n } catch (e) {\n this.emit({\n type: \"turn_ended\",\n turnId,\n status: \"failed\",\n error: String((e as Error)?.message ?? e),\n });\n }\n }\n\n async steer(input: SendInput): Promise<void> {\n // No Codex turnId yet (turn/started hasn't arrived) → throw; the manager queues instead so the message isn't lost\n if (!this.rpc || !this.st.currentTurnId) throw new Error(tr(\"codex.noTurnSteer\"));\n const { items, warnings } = await buildCodexInput(input.text, input.images ?? []);\n for (const w of warnings) this.emit({ type: \"notice\", level: \"warn\", message: tr(\"notice.attachmentIssue\", { detail: w }) });\n try {\n await this.rpc.request(\"turn/steer\", {\n threadId: this.threadId(),\n expectedTurnId: this.st.currentTurnId,\n input: items,\n });\n } catch (e) {\n log(\"warn\", \"codex steer 失败\", { err: String(e) });\n }\n }\n\n async interrupt(): Promise<void> {\n for (const [, p] of this.pending) p.resolve({ cancelled: true });\n this.pending.clear();\n if (!this.rpc) return;\n if (!this.st.currentTurnId) {\n // turn/started hasn't arrived yet: remember it and send the interrupt as soon as the turnId is known\n this.interruptWanted = true;\n return;\n }\n this.interruptWanted = false;\n try {\n await this.rpc.request(\n \"turn/interrupt\",\n { threadId: this.threadId(), turnId: this.st.currentTurnId },\n 5000,\n );\n } catch (e) {\n // \"Already idle\"-type errors count as success\n const msg = String((e as Error)?.message ?? e);\n if (!/idle|not running|no.*turn/i.test(msg)) {\n log(\"warn\", \"codex interrupt 失败\", { err: msg });\n }\n }\n }\n\n private threadId(): string | undefined {\n return this.sessionThreadId ?? undefined;\n }\n\n // ---- server requests (§7.3.5 approvals) ----\n private async onServerRequest(method: string, params: Record<string, unknown>): Promise<unknown> {\n switch (method) {\n case \"item/commandExecution/requestApproval\": {\n const command = String(params.command ?? \"\");\n const requestId = \"perm_\" + rid();\n this.emit({\n type: \"permission_request\",\n requestId,\n title: tr(\"tool.run\", { x: command.slice(0, 80) }),\n kind: \"tool\",\n detail: { command, cwd: params.cwd, reason: params.reason, approvalId: params.approvalId, itemId: params.itemId },\n options: [\n { id: \"accept\", label: tr(\"perm.allow\"), kind: \"allow_once\" },\n { id: \"acceptForSession\", label: tr(\"perm.allowSession\"), kind: \"allow_always\" },\n { id: \"decline\", label: tr(\"perm.deny\"), kind: \"reject_once\" },\n ],\n });\n const a = await this.waitFor(requestId);\n if (a.cancelled) return { decision: \"cancel\" };\n const opt = a.optionId === \"acceptForSession\" ? \"acceptForSession\" : a.optionId === \"decline\" ? \"decline\" : \"accept\";\n return { decision: opt };\n }\n case \"item/fileChange/requestApproval\": {\n const itemId = typeof params.itemId === \"string\" ? params.itemId : \"\";\n const changes = Array.isArray(params.changes) && params.changes.length\n ? params.changes\n : (itemId ? this.st.fileChangesByItemId.get(itemId) ?? [] : []);\n const requestId = \"perm_\" + rid();\n this.emit({\n type: \"permission_request\",\n requestId,\n title: tr(\"perm.editFiles\"),\n kind: \"tool\",\n detail: { changes, approvalId: params.approvalId, itemId: params.itemId, reason: params.reason },\n options: [\n { id: \"accept\", label: tr(\"perm.allow\"), kind: \"allow_once\" },\n { id: \"acceptForSession\", label: tr(\"perm.allowSession\"), kind: \"allow_always\" },\n { id: \"decline\", label: tr(\"perm.deny\"), kind: \"reject_once\" },\n ],\n });\n const a = await this.waitFor(requestId);\n if (a.cancelled) return { decision: \"cancel\" };\n const opt = a.optionId === \"acceptForSession\" ? \"acceptForSession\" : a.optionId === \"decline\" ? \"decline\" : \"accept\";\n return { decision: opt };\n }\n case \"item/tool/requestUserInput\": {\n const requestId = \"q_\" + rid();\n this.emit({\n type: \"question\",\n requestId,\n questions: (params.questions as unknown[]) ?? [],\n });\n const a = await this.waitFor(requestId);\n if (a.cancelled) return { answers: {} };\n // schema: { answers: { <questionId>: { answers: [..] } } }\n const raw = a.answers ?? {};\n const shaped: Record<string, { answers: string[] }> = {};\n for (const [k, v] of Object.entries(raw)) shaped[k] = { answers: [v] };\n return { answers: shaped };\n }\n default:\n throw new Error(`未识别的服务端请求 ${method}`);\n }\n }\n\n private waitFor(requestId: string): Promise<RespondAnswer> {\n return new Promise((resolve) => {\n this.pending.set(requestId, { kind: \"permission\", resolve });\n });\n }\n\n respond(requestId: string, answer: RespondAnswer): void {\n const p = this.pending.get(requestId);\n if (p) {\n this.pending.delete(requestId);\n p.resolve(answer);\n // Writing back resolved events is the manager's job (permission_resolved/question_answered)\n }\n }\n\n async setModel(model: string | null): Promise<void> {\n this.o.model = model; // Takes effect on the next turn/start\n }\n async setMode(mode: Mode): Promise<void> {\n this.o.mode = mode; // Takes effect on the next turn/start\n }\n async setEffort(effort: string | null): Promise<void> {\n this.o.effort = effort; // Takes effect on the next turn/start\n }\n\n async listCommands(): Promise<SlashCommand[]> {\n try {\n const entries = this.codexSlash ?? (await loadCodexSlashEntries(this.o.cwd));\n this.codexSlash = entries;\n return codexSlashCommandsFromEntries(entries);\n } catch {\n return [];\n }\n }\n\n async close(): Promise<void> {\n this.closed = true;\n for (const [, p] of this.pending) p.resolve({ cancelled: true });\n this.pending.clear();\n if (this.rpc) await this.rpc.close();\n this.q.close();\n }\n}\n","// Provider / ProviderSession interfaces (EXEC §7.1)\nimport type { ProviderEvent } from \"../timeline/types.js\";\nimport type { SlashCommand } from \"./slash.js\";\n\nexport type Mode = \"plan\" | \"default\" | \"acceptEdits\" | \"bypassPermissions\" | \"ask\";\n\nexport type Capabilities = {\n resume: boolean;\n interrupt: boolean;\n steer: boolean;\n /** The Agent takes images in a prompt (sees them itself). For ACP Agents: what initialize advertised, false until known */\n images: boolean;\n /** false while an ACP Agent's image support is not known yet (before its probe or first session); absent = known */\n imagesKnown?: boolean;\n plan: boolean;\n questions: boolean;\n cost: boolean;\n effort: string[];\n modes: Mode[];\n /** Each mode's name in this Agent (like Paseo, show the Agent's own naming); our default names are used when absent */\n modeLabels?: Partial<Record<Mode, string>>;\n /** The Agent only streams text deltas and never sends the complete message (ACP): the manager saves each text segment itself */\n deltasOnly?: boolean;\n};\n\nexport type ThinkingOption = { id: string; label: string };\n\nexport type ModelInfo = {\n id: string;\n name: string;\n /** @deprecated use thinkingOptions */\n efforts?: string[];\n thinkingOptions?: ThinkingOption[];\n defaultThinking?: string | null;\n isDefault?: boolean;\n /** Parameter name when the level is sent as a model parameter (Cursor: effort / reasoning_effort / reasoning) */\n thinkingParam?: string;\n};\nexport type DetectResult = { available: boolean; bin?: string; version?: string; reason?: string; installHint?: string };\n/** Custom launch (Settings › Launch command). args are appended after the built-in arguments; prefixArgs (internal) go before them. */\nexport type LaunchCommand = { cmd: string; prefixArgs?: string[]; args?: string[] };\nexport type HistoryItem = { provider: string; sessionId: string; title: string; updatedAt: number; messageCount: number; imported: boolean };\nexport type SendInput = { text: string; images: { path: string; mime: string }[] };\nexport type RespondAnswer = { optionId?: string; answers?: Record<string, string>; cancelled?: boolean };\n\nexport interface Provider {\n id: string;\n name: string;\n capabilities: Capabilities;\n detect(launch?: LaunchCommand): Promise<DetectResult>;\n listModels(launch?: LaunchCommand): Promise<ModelInfo[]>;\n createSession(o: {\n threadId: string;\n cwd: string;\n model: string | null;\n mode: Mode;\n effort: string | null;\n resumeId: string | null;\n cursorFast?: boolean;\n cursorAutoReview?: boolean;\n launch?: LaunchCommand;\n }): Promise<ProviderSession>;\n listHistory?(cwd: string): Promise<HistoryItem[]>;\n readHistory?(sessionId: string, cwd: string): Promise<ProviderEvent[]>;\n}\n\nexport interface ProviderSession {\n events: AsyncIterable<ProviderEvent>;\n send(input: SendInput): Promise<void>;\n steer?(input: SendInput): Promise<void>;\n interrupt(): Promise<void>;\n setModel(model: string | null): Promise<void>;\n setMode(mode: Mode): Promise<void>;\n setEffort(effort: string | null): Promise<void>;\n respond(requestId: string, answer: RespondAnswer): void;\n close(): Promise<void>;\n listCommands(): Promise<SlashCommand[]>;\n}\n\nexport type { SlashCommand, SlashCommandKind } from \"./slash.js\";\n\n/** Name of our own \"Default\" placeholder model row (id \"default\") */\nexport const PLACEHOLDER_MODEL_NAME = \"Default\";\n","// Codex Provider (§7.3): detect + listModels (temporary app-server → model/list, cached 10 minutes) + createSession.\nimport type { Provider, ProviderSession, DetectResult, ModelInfo, Capabilities, HistoryItem, LaunchCommand } from \"../types.js\";\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { listCodexHistory, readCodexHistory } from \"../../history/codex.js\";\nimport { argvFor, resolveBin, killTree, spawnBin, type ResolveResult } from \"../../util/bin.js\";\nimport { CodexRpc, CodexProcessExitedError } from \"./rpc.js\";\nimport { CodexSession } from \"./session.js\";\nimport { log } from \"../../log.js\";\nimport { tr } from \"../../util/i18n.js\";\nimport { launchArgv, resolveLaunch } from \"../launch.js\";\nimport { PLACEHOLDER_MODEL_NAME } from \"../types.js\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { readFile } from \"node:fs/promises\";\n\nconst INSTALL_HINT = \"npm i -g @openai/codex\";\n\nexport const codexCapabilities: Capabilities = {\n resume: true,\n interrupt: true,\n steer: true,\n images: true,\n plan: true,\n questions: true,\n cost: false, // tokenUsage yes, cost no\n effort: [], // effort values depend on the model — filled from model/list after detect\n // No \"plan\": app-server 0.16x has no plan/collaboration mode on turn/start, and a read-only \"plan\" was the same preset as default (B9)\n modes: [\"default\", \"acceptEdits\", \"bypassPermissions\"],\n modeLabels: { default: \"Read Only\", acceptEdits: \"Auto\", bypassPermissions: \"Full Access\" },\n};\n\nlet modelCache: { at: number; models: ModelInfo[] } | null = null;\nconst MODEL_CACHE_MS = 10 * 60 * 1000;\n\nfunction runVersion(r: ResolveResult & { ok: true }, args: string[], timeoutMs = 5000): Promise<string> {\n return new Promise((resolvePromise, reject) => {\n let out = \"\";\n const p = spawnBin(r, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n const t = setTimeout(() => {\n try {\n void killTree(p, { graceMs: 500 }); // On Windows a .cmd wrapper must be killed together with its child processes\n } catch {}\n reject(new Error(\"timeout\"));\n }, timeoutMs);\n p.stdout?.on(\"data\", (c: Buffer) => (out += c.toString()));\n p.stderr?.on(\"data\", (c: Buffer) => (out += c.toString()));\n p.on(\"error\", reject);\n p.on(\"close\", (code) => {\n clearTimeout(t);\n if (code === 0) resolvePromise(out);\n else reject(new Error(\"exit \" + code));\n });\n });\n}\n\n/** Normalize the level list to strings: accepts string[] and { reasoningEffort, description }[]; other shapes are dropped */\nexport function normalizeEfforts(raw: unknown[] | undefined): string[] {\n const out: string[] = [];\n for (const e of raw ?? []) {\n const v = typeof e === \"string\" ? e : (e as { reasoningEffort?: unknown } | null)?.reasoningEffort;\n if (typeof v === \"string\" && v && !out.includes(v)) out.push(v);\n }\n return out;\n}\n\nasync function fetchModels(r: ResolveResult & { ok: true }, cwd: string, launch?: LaunchCommand): Promise<ModelInfo[]> {\n const rpc = new CodexRpc(argvFor(r, launchArgv([\"app-server\"], launch)), { cwd });\n try {\n await rpc.request(\"initialize\", {\n clientInfo: { name: \"agent-console\", title: \"Agent Console\", version: \"0\" },\n capabilities: { experimentalApi: true },\n }, 15000);\n rpc.notify(\"initialized\", {});\n const res = (await rpc.request(\"model/list\", {}, 15000)) as {\n data?: {\n id?: string;\n displayName?: string;\n isDefault?: boolean;\n // Newer app-server returns { reasoningEffort, description }[], older ones string[]\n supportedReasoningEfforts?: unknown[];\n defaultReasoningEffort?: string;\n }[];\n };\n const rows = res.data ?? [];\n return rows\n .filter((m) => typeof m.id === \"string\" && m.id)\n .map((m) => {\n const efforts = normalizeEfforts(m.supportedReasoningEfforts);\n const thinkingOptions = efforts.map((e) => ({ id: e, label: e }));\n const defaultThinking = (typeof m.defaultReasoningEffort === \"string\" ? m.defaultReasoningEffort : null) ?? thinkingOptions[0]?.id ?? null;\n return {\n id: m.id!,\n name: m.displayName ?? m.id!,\n isDefault: m.isDefault,\n efforts,\n thinkingOptions,\n defaultThinking,\n };\n });\n } finally {\n await rpc.close();\n }\n}\n\nexport type CodexConfig = { modelProvider: string | null; model: string | null; providerModels: string[] };\n\nfunction tomlValue(raw: string): string | string[] | null {\n const v = raw.trim().replace(/\\s+#.*$/, \"\");\n const quoted = v.match(/^\"([\\s\\S]*)\"$/) ?? v.match(/^'([\\s\\S]*)'$/);\n if (quoted) return quoted[1];\n if (v.startsWith(\"[\") && v.endsWith(\"]\")) {\n return v.slice(1, -1).split(\",\").map((x) => tomlValue(x)).filter((x): x is string => typeof x === \"string\");\n }\n return null;\n}\n\nexport function parseCodexConfig(text: string): CodexConfig {\n let section = \"\";\n const values = new Map<string, string | string[]>();\n for (const line of text.split(/\\r?\\n/)) {\n const s = line.trim();\n if (!s || s.startsWith(\"#\")) continue;\n const header = s.match(/^\\[([^\\]]+)\\]$/);\n if (header) { section = header[1]; continue; }\n const m = s.match(/^([A-Za-z0-9_.-]+)\\s*=\\s*(.+)$/);\n if (!m) continue;\n const value = tomlValue(m[2]);\n if (typeof value === \"string\" || Array.isArray(value)) values.set(`${section}\\0${m[1]}`, value);\n }\n const top = (key: string) => values.get(`\\0${key}`);\n const profile = top(\"profile\");\n const profileName = typeof profile === \"string\" ? profile : null;\n const profileValue = (key: string) => profileName ? values.get(`profiles.${profileName}\\0${key}`) : undefined;\n const modelProvider = (profileValue(\"model_provider\") ?? top(\"model_provider\"));\n const model = (profileValue(\"model\") ?? top(\"model\"));\n const provider = typeof modelProvider === \"string\" ? modelProvider : null;\n const models = new Set<string>();\n if (typeof model === \"string\" && model) models.add(model);\n for (const [key, value] of values) {\n if (provider && key === `model_providers.${provider}\\0models` && Array.isArray(value)) {\n for (const m of value) models.add(m);\n }\n }\n return { modelProvider: provider, model: typeof model === \"string\" ? model : null, providerModels: [...models] };\n}\n\nasync function readCodexConfig(): Promise<CodexConfig> {\n const home = process.env.CODEX_HOME?.trim() || join(homedir(), \".codex\");\n const file = home.toLowerCase().endsWith(\".toml\") ? home : join(home, \"config.toml\");\n try { return parseCodexConfig(await readFile(file, \"utf8\")); } catch { return { modelProvider: null, model: null, providerModels: [] }; }\n}\n\nfunction isChatGptProvider(id: string | null): boolean {\n return !id || /^(openai|chatgpt)$/i.test(id);\n}\n\nexport function createCodexProvider(version: string): Provider {\n return {\n id: \"codex\",\n name: \"Codex\",\n capabilities: codexCapabilities,\n async detect(launch?: LaunchCommand): Promise<DetectResult> {\n const bin = launch ? await resolveLaunch(launch) : await resolveBin(\"codex\");\n if (!bin.ok) {\n return { available: false, reason: bin.reason, installHint: INSTALL_HINT };\n }\n try {\n const v = await runVersion(bin, [...(launch?.prefixArgs ?? []), \"--version\"]);\n return { available: true, bin: bin.display, version: v.trim().split(\"\\n\")[0] || \"\" };\n } catch (e) {\n return { available: true, bin: bin.display, version: \"\", reason: String(e) };\n }\n },\n async listModels(launch?: LaunchCommand): Promise<ModelInfo[]> {\n const config = await readCodexConfig();\n if (!isChatGptProvider(config.modelProvider)) {\n const rows = config.providerModels.map((id, i) => ({ id, name: id, isDefault: i === 0 }));\n return rows.length ? rows : [{ id: \"\", name: `${PLACEHOLDER_MODEL_NAME} (${config.modelProvider})`, isDefault: true }];\n }\n if (!launch && modelCache && Date.now() - modelCache.at < MODEL_CACHE_MS) return modelCache.models;\n const bin = launch ? await resolveLaunch(launch) : await resolveBin(\"codex\");\n if (!bin.ok) return [{ id: \"\", name: PLACEHOLDER_MODEL_NAME }];\n try {\n const models = await fetchModels(bin, process.cwd(), launch);\n modelCache = { at: Date.now(), models };\n return models;\n } catch (e) {\n // Gateway region errors etc. — the frontend shows a single \"Default\" entry (§7.3.6)\n log(\"warn\", \"codex model/list 失败\", { err: String(e) });\n return [{ id: \"\", name: PLACEHOLDER_MODEL_NAME }];\n }\n },\n async createSession(o): Promise<ProviderSession> {\n const bin = o.launch ? await resolveLaunch(o.launch) : await resolveBin(\"codex\");\n if (!bin.ok) throw new Error(tr(\"codex.notFound\", { detail: bin.reason, hint: INSTALL_HINT }));\n return new CodexSession({\n threadId: o.threadId,\n cwd: o.cwd,\n model: o.model,\n mode: o.mode,\n effort: o.effort,\n resumeId: o.resumeId,\n binCmd: bin.cmd,\n binPrefixArgs: bin.prefixArgs,\n binVia: bin.via,\n binShim: bin.shim,\n launch: o.launch,\n version,\n });\n },\n // §7.6: ~/.codex/sessions/**/rollout-*.jsonl matched by cwd\n async listHistory(cwd: string): Promise<HistoryItem[]> {\n const items = await listCodexHistory(cwd);\n return items.map((i) => ({ provider: \"codex\", ...i, imported: false }));\n },\n async readHistory(sessionId: string, cwd: string): Promise<ProviderEvent[]> {\n return (await readCodexHistory(sessionId, cwd)) as unknown as ProviderEvent[];\n },\n };\n}\n","import { tr } from \"../util/i18n.js\";\n/** Provider catalog (fixed, 8 entries).\n * status: verified=accepted on a real machine | experimental=usable but not guaranteed | planned=integration not confirmed\n * All 8 are currently verified; default toggle: verified ones are on by default (see enabled.ts). */\nexport type ProviderStatus = \"verified\" | \"experimental\" | \"planned\";\n\nexport type ProviderCatalogEntry = {\n id: string;\n name: string;\n bins: string[];\n installHint: string;\n status: ProviderStatus;\n};\n\nexport const PROVIDER_CATALOG: ProviderCatalogEntry[] = [\n { id: \"claude\", name: \"Claude Code\", bins: [\"claude\"], installHint: \"npm i -g @anthropic-ai/claude-code\", status: \"verified\" },\n { id: \"codex\", name: \"Codex\", bins: [\"codex\"], installHint: \"npm i -g @openai/codex\", status: \"verified\" },\n { id: \"cursor\", name: \"Cursor\", bins: [\"cursor-agent\", \"cursor\"], installHint: \"curl https://cursor.com/install -fsS | bash\", status: \"verified\" },\n { id: \"copilot\", name: \"Copilot\", bins: [\"copilot\"], installHint: \"npm i -g @github/copilot\", status: \"verified\" },\n { id: \"opencode\", name: \"OpenCode\", bins: [\"opencode\"], installHint: \"npm i -g opencode-ai\", status: \"verified\" },\n { id: \"pi\", name: \"Pi\", bins: [\"pi-acp\", \"pi\", \"pi-coding-agent\"], installHint: \"npm i -g pi-acp\", status: \"verified\" },\n { id: \"devin\", name: \"Devin CLI\", bins: [\"devin\"], installHint: \"https://docs.devin.ai/cli\", status: \"verified\" },\n { id: \"dsh\", name: \"dsh\", bins: [\"dsh\"], installHint: \"npm i -g @deepseek-ai/dsh\", status: \"verified\" },\n];\n\nexport function catalogById(id: string): ProviderCatalogEntry | undefined {\n return PROVIDER_CATALOG.find((p) => p.id === id);\n}\n\nexport function providerCreatable(status: ProviderStatus): boolean {\n return status !== \"planned\";\n}\n","import type { ChildProcess } from \"node:child_process\";\nimport { Readable, Writable } from \"node:stream\";\nimport { resolve as resolvePath } from \"node:path\";\nimport * as acp from \"@agentclientprotocol/sdk\";\nimport type { ResolveResult } from \"../../util/bin.js\";\nimport { killTree, spawnBin } from \"../../util/bin.js\";\n\nexport function spawnResolved(r: ResolveResult & { ok: true }, args: string[], o: { cwd?: string } = {}): ChildProcess {\n // group: on non-Windows it gets its own process group so killTree also ends the tool processes it started\n return spawnBin(r, args, {\n cwd: o.cwd,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env, NO_COLOR: \"1\", FORCE_COLOR: \"0\" },\n group: true,\n });\n}\n\nexport function acpStreamFromChild(child: ChildProcess): acp.Stream {\n if (!child.stdin || !child.stdout) throw new Error(\"ACP 子进程缺少 stdio 管道\");\n const output = Writable.toWeb(child.stdin) as WritableStream<Uint8Array>;\n const input = Readable.toWeb(child.stdout) as ReadableStream<Uint8Array>;\n return acp.ndJsonStream(output, input);\n}\n\nexport function absCwd(cwd: string): string {\n return resolvePath(cwd);\n}\n\nexport async function killAcpChild(child: ChildProcess | null): Promise<void> {\n await killTree(child);\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport type { ClientApp } from \"@agentclientprotocol/sdk\";\nimport { methods } from \"@agentclientprotocol/sdk\";\nimport type { RespondAnswer } from \"../types.js\";\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { tr } from \"../../util/i18n.js\";\n\nexport type PermBridge = {\n push(ev: ProviderEvent): void;\n waitFor(requestId: string): Promise<RespondAnswer>;\n /** Cursor Auto-review: no permission card, allow is chosen automatically */\n autoAcceptPermissions?: () => boolean;\n};\n\nexport function registerAcpClientHandlers(app: ClientApp, bridge: PermBridge): void {\n app.onRequest(methods.client.fs.readTextFile, async (ctx) => {\n const text = await readFile(ctx.params.path, \"utf8\");\n return { content: text };\n });\n app.onRequest(methods.client.fs.writeTextFile, async (ctx) => {\n await writeFile(ctx.params.path, ctx.params.content, \"utf8\");\n return {};\n });\n app.onRequest(methods.client.session.requestPermission, async (ctx) => {\n const tc = ctx.params.toolCall;\n const options = ctx.params.options.map((o) => ({\n id: o.optionId,\n label: o.name,\n kind: o.kind,\n }));\n if (bridge.autoAcceptPermissions?.()) {\n const allow =\n options.find((o) => o.kind === \"allow_once\" || o.kind === \"allow_always\") ?? options[0];\n if (allow) return { outcome: { outcome: \"selected\", optionId: allow.id } };\n }\n const requestId = \"p\" + Math.random().toString(36).slice(2, 10);\n bridge.push({\n type: \"permission_request\",\n requestId,\n title: tc.title ?? tc.name ?? tr(\"tool.needsApproval\"),\n kind: tc.kind ?? \"tool\",\n detail: tc.rawInput ?? undefined,\n options,\n });\n const answer = await bridge.waitFor(requestId);\n if (answer.cancelled) return { outcome: { outcome: \"cancelled\" } };\n const optionId = answer.optionId ?? options[0]?.id;\n if (!optionId) return { outcome: { outcome: \"cancelled\" } };\n return { outcome: { outcome: \"selected\", optionId } };\n });\n}\n","import type * as schema from \"@agentclientprotocol/sdk\";\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport type { ToolKind } from \"../../timeline/types.js\";\n\nconst rid = () => Math.random().toString(36).slice(2, 8);\n\nfunction mapToolKind(k: schema.ToolKind | null | undefined): ToolKind {\n switch (k) {\n case \"read\":\n case \"edit\":\n case \"search\":\n return k;\n case \"execute\":\n return \"bash\";\n case \"fetch\":\n return \"web\";\n default:\n return \"other\";\n }\n}\n\nfunction mapToolStatus(s: schema.ToolCallStatus | null | undefined): \"running\" | \"ok\" | \"failed\" {\n if (s === \"completed\") return \"ok\";\n if (s === \"failed\") return \"failed\";\n return \"running\";\n}\n\nfunction textFromContent(content: schema.ContentBlock): string {\n if (content.type === \"text\") return content.text;\n return \"\";\n}\n\n/** seg: text segment number, bumped when a tool call / plan comes between two runs of text, so the text before and\n * after a tool call are separate items (live and persisted alike: the manager saves each segment when the next item starts). */\nexport type MapCtx = { itemPrefix: string; messageIds: Map<string, string>; seg: number; lastWasText: boolean };\n\nexport function newMapCtx(): MapCtx {\n return { itemPrefix: \"a\" + rid() + \"_\", messageIds: new Map(), seg: 0, lastWasText: false };\n}\n\nfunction endTextSegment(ctx: MapCtx): void {\n if (ctx.lastWasText) {\n ctx.seg++;\n ctx.lastWasText = false;\n }\n}\n\nexport function mapSessionUpdate(update: schema.SessionUpdate, ctx: MapCtx): ProviderEvent[] {\n const out: ProviderEvent[] = [];\n const mid = \"messageId\" in update && update.messageId ? String(update.messageId) : null;\n\n switch (update.sessionUpdate) {\n case \"agent_message_chunk\": {\n const text = textFromContent(update.content);\n if (!text) break;\n const itemId = `${ctx.itemPrefix}${mid ?? \"msg\"}_${ctx.seg}`;\n if (mid) ctx.messageIds.set(mid, itemId);\n ctx.lastWasText = true;\n out.push({ type: \"assistant_delta\", itemId, text });\n break;\n }\n case \"agent_thought_chunk\": {\n const text = textFromContent(update.content);\n if (!text) break;\n const itemId = `${ctx.itemPrefix}t_${mid ?? \"think\"}_${ctx.seg}`;\n ctx.lastWasText = true;\n out.push({ type: \"reasoning_delta\", itemId, text });\n break;\n }\n case \"tool_call\":\n endTextSegment(ctx);\n out.push({\n type: \"tool_call\",\n itemId: ctx.itemPrefix + update.toolCallId,\n kind: mapToolKind(update.kind),\n title: update.title,\n status: mapToolStatus(update.status),\n input: update.rawInput,\n });\n break;\n case \"tool_call_update\":\n endTextSegment(ctx);\n out.push({\n type: \"tool_call\",\n itemId: ctx.itemPrefix + update.toolCallId,\n kind: mapToolKind(update.kind),\n title: update.title ?? update.name ?? \"\",\n status: mapToolStatus(update.status),\n input: update.rawInput,\n output: typeof update.rawOutput === \"string\" ? update.rawOutput : undefined,\n });\n break;\n case \"plan\":\n endTextSegment(ctx);\n out.push({\n type: \"plan\",\n itemId: ctx.itemPrefix + \"plan\",\n markdown: update.entries.map((e) => `- ${e.content}`).join(\"\\n\"),\n entries: update.entries.map((e) => ({ step: e.content, status: e.status ?? \"\" })),\n });\n break;\n case \"notice\":\n out.push({\n type: \"notice\",\n level: update.severity === \"error\" ? \"error\" : update.severity === \"warning\" ? \"warn\" : \"info\",\n message: update.description ? `${update.title}: ${update.description}` : update.title,\n });\n break;\n case \"usage_update\":\n out.push({\n type: \"usage\",\n inputTokens: update.used,\n outputTokens: 0,\n cacheReadTokens: 0,\n costUsd: typeof update.cost?.amount === \"number\" ? update.cost.amount : 0,\n contextWindow: update.size,\n });\n break;\n default:\n break;\n }\n return out;\n}\n\nexport function stopToTurnEnd(stopReason: schema.StopReason, turnId: string, err?: string): ProviderEvent {\n if (stopReason === \"cancelled\") {\n return { type: \"turn_ended\", turnId, status: \"interrupted\" };\n }\n if (stopReason === \"refusal\" || stopReason === \"max_tokens\") {\n return { type: \"turn_ended\", turnId, status: \"failed\", error: err ?? stopReason };\n }\n return { type: \"turn_ended\", turnId, status: \"completed\" };\n}\n","// What each ACP Agent says it accepts in a prompt: initialize → agentCapabilities.promptCapabilities.\n// ACP's baseline is text and resource_link; image / audio / embedded resources are opt-in per Agent.\n// Learned from the model probe (startup warm-up, providers.list) and from every session's initialize,\n// kept in memory per provider id, and read by the provider's capabilities (images) and by AcpSession.send.\nexport type AcpPromptCaps = { image: boolean; audio: boolean; embeddedContext: boolean };\n\nconst learned = new Map<string, AcpPromptCaps>();\n\n/** Normalize an initialize response (anything: Agents may leave fields out, which means false) */\nexport function promptCapsFromInitialize(res: unknown): AcpPromptCaps {\n const pc = (res as { agentCapabilities?: { promptCapabilities?: Record<string, unknown> | null } | null } | null)\n ?.agentCapabilities?.promptCapabilities;\n return {\n image: pc?.image === true,\n audio: pc?.audio === true,\n embeddedContext: pc?.embeddedContext === true,\n };\n}\n\nexport function rememberPromptCaps(providerId: string | undefined, caps: AcpPromptCaps): void {\n if (providerId) learned.set(providerId, caps);\n}\n\n/** undefined until the Agent has been probed or a session has initialized */\nexport function knownPromptCaps(providerId: string): AcpPromptCaps | undefined {\n return learned.get(providerId);\n}\n\nexport function forgetPromptCaps(providerId?: string): void {\n if (providerId) learned.delete(providerId);\n else learned.clear();\n}\n","// How an ACP Agent reopens an old conversation: initialize → agentCapabilities.\n// - loadSession (top-level): session/load — returns prior messages as session/update\n// - sessionCapabilities.resume: session/resume — reconnects without replaying history\n// Prefer load when both are advertised (OpenCode); resume when only resume (dsh);\n// neither → the caller starts a new session and tells the user prior context wasn't restored.\nexport type AcpSessionOpen = { load: boolean; resume: boolean };\nexport type AcpReconnect = \"load\" | \"resume\" | \"none\";\n\n/** Normalize an initialize response: missing/false/null means the Agent doesn't advertise that method */\nexport function sessionOpenFromInitialize(res: unknown): AcpSessionOpen {\n const caps = (res as { agentCapabilities?: {\n loadSession?: unknown;\n sessionCapabilities?: { resume?: unknown } | null;\n } | null } | null)?.agentCapabilities;\n // ACP: omitted or null = no; {} (any object) = yes\n const resume = caps?.sessionCapabilities?.resume != null && typeof caps.sessionCapabilities.resume === \"object\";\n return { load: caps?.loadSession === true, resume };\n}\n\nexport function pickReconnect(open: AcpSessionOpen): AcpReconnect {\n if (open.load) return \"load\";\n if (open.resume) return \"resume\";\n return \"none\";\n}\n","// Turn one user message (text + attachments) into an ACP prompt (ContentBlock[]) for what this Agent accepts.\n// - PNG/JPEG/GIF/WebP: an image block (base64 + mimeType) when the Agent advertises promptCapabilities.image;\n// otherwise the saved file's absolute path, as a resource_link (ACP baseline) and as a line of text,\n// so an Agent with file tools can still open it; the caller shows a notice that it can't see the image.\n// - audio/* : an audio block when promptCapabilities.audio, else the same path fallback.\n// - text : an embedded resource (its text) when promptCapabilities.embeddedContext and small enough, else a path.\n// Every attachment is either sent or named by path: nothing is dropped silently.\nimport type { ContentBlock } from \"@agentclientprotocol/sdk\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { resolveImagePath } from \"../../util/attachmentRefs.js\";\nimport type { AcpPromptCaps } from \"./promptCaps.js\";\nimport { attachmentKind } from \"../../util/attachmentKinds.js\";\n\n/** Largest image / audio sent inline as base64 (above it, the path is sent instead) */\nexport const MAX_INLINE_MEDIA_BYTES = 10 * 1024 * 1024;\n/** All inline media of one prompt together. Base64 adds a third, and an Agent built on the ACP SDK refuses an incoming\n * line over 32 MB (DEFAULT_MAX_MESSAGE_BYTES), so one prompt stays well under that; the rest goes by path. */\nexport const MAX_INLINE_TOTAL_BYTES = 16 * 1024 * 1024;\n/** Largest text file embedded as a resource */\nexport const MAX_EMBED_TEXT_BYTES = 1024 * 1024;\n\nexport type AcpPromptBuild = {\n blocks: ContentBlock[];\n /** Images that went by path because the Agent doesn't take image blocks */\n imagesByPath: string[];\n /** Other problems worth a notice (unreadable file, too large) */\n warnings: string[];\n};\n\nconst isText = (mime: string) => attachmentKind(mime) === \"text\";\n\nexport async function buildAcpPrompt(\n text: string,\n attachments: { path: string; mime: string }[],\n caps: AcpPromptCaps,\n): Promise<AcpPromptBuild> {\n const media: ContentBlock[] = [];\n const links: ContentBlock[] = [];\n const pathLines: string[] = [];\n const imagesByPath: string[] = [];\n const warnings: string[] = [];\n let inlineBytes = 0;\n\n const byPath = (file: string, mime: string, size: number | null, label: string) => {\n links.push({ type: \"resource_link\", uri: pathToFileURL(file).href, name: basename(file), mimeType: mime, ...(size !== null ? { size } : {}) });\n pathLines.push(`${label}: ${file}`);\n };\n\n for (const a of attachments) {\n const mime = a.mime || \"application/octet-stream\";\n let file: string;\n let size: number | null = null;\n try {\n file = await resolveImagePath(a.path);\n size = (await stat(file)).size;\n } catch (e) {\n warnings.push(`${a.path}: ${String((e as Error)?.message ?? e)}`);\n continue;\n }\n // Only the four image types model APIs take (svg, bmp… go by path like any other file)\n const image = attachmentKind(mime) === \"image\";\n const audio = mime.startsWith(\"audio/\");\n if ((image && caps.image) || (audio && caps.audio)) {\n if (size > MAX_INLINE_MEDIA_BYTES || inlineBytes + size > MAX_INLINE_TOTAL_BYTES) {\n const limit = size > MAX_INLINE_MEDIA_BYTES ? MAX_INLINE_MEDIA_BYTES : MAX_INLINE_TOTAL_BYTES;\n warnings.push(`${basename(file)}: ${(size / 1024 / 1024).toFixed(1)} MB, over the ${limit / 1024 / 1024} MB inline limit; sent as a file path`);\n byPath(file, mime, size, image ? \"Attached image\" : \"Attached audio\");\n if (image) imagesByPath.push(file);\n continue;\n }\n try {\n const data = (await readFile(file)).toString(\"base64\");\n media.push(image ? { type: \"image\", data, mimeType: mime } : { type: \"audio\", data, mimeType: mime });\n inlineBytes += size;\n } catch (e) {\n warnings.push(`${basename(file)}: ${String((e as Error)?.message ?? e)}`);\n byPath(file, mime, size, image ? \"Attached image\" : \"Attached audio\");\n if (image) imagesByPath.push(file);\n }\n continue;\n }\n if (image || audio) {\n byPath(file, mime, size, image ? \"Attached image\" : \"Attached audio\");\n if (image) imagesByPath.push(file);\n continue;\n }\n if (isText(mime) && caps.embeddedContext && size <= MAX_EMBED_TEXT_BYTES && inlineBytes + size <= MAX_INLINE_TOTAL_BYTES) {\n try {\n const body = await readFile(file, \"utf8\");\n media.push({ type: \"resource\", resource: { uri: pathToFileURL(file).href, mimeType: mime, text: body } });\n inlineBytes += size;\n continue;\n } catch {\n /* fall back to the path */\n }\n }\n byPath(file, mime, size, \"Attached file\");\n }\n\n const fullText = [text, ...(pathLines.length ? [pathLines.join(\"\\n\")] : [])].filter(Boolean).join(\"\\n\\n\");\n const blocks: ContentBlock[] = [];\n if (fullText) blocks.push({ type: \"text\", text: fullText });\n blocks.push(...media, ...links);\n return { blocks, imagesByPath, warnings };\n}\n","// Persistent ACP session: cursor-agent acp / devin acp and others.\nimport type { ActiveSession, ClientConnection, ClientContext } from \"@agentclientprotocol/sdk\";\nimport { client, methods, PROTOCOL_VERSION } from \"@agentclientprotocol/sdk\";\nimport type { ChildProcess } from \"node:child_process\";\nimport type { LaunchCommand, ProviderSession, SendInput, RespondAnswer, Mode, SlashCommand } from \"../types.js\";\nimport { mapAcpAvailableCommands, sortSlashCommands } from \"../slash.js\";\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { AsyncQueue } from \"../../util/queue.js\";\nimport { resolveFirstBin, type ResolveResult } from \"../../util/bin.js\";\nimport { launchArgv, resolveLaunch } from \"../launch.js\";\nimport { absCwd, acpStreamFromChild, killAcpChild, spawnResolved } from \"./spawn.js\";\nimport { registerAcpClientHandlers } from \"./clientHandlers.js\";\nimport { mapSessionUpdate, newMapCtx, stopToTurnEnd, type MapCtx } from \"./mapUpdate.js\";\nimport { promptCapsFromInitialize, rememberPromptCaps, type AcpPromptCaps } from \"./promptCaps.js\";\nimport { pickReconnect, sessionOpenFromInitialize } from \"./sessionCaps.js\";\nimport { buildAcpPrompt } from \"./prompt.js\";\nimport { tr } from \"../../util/i18n.js\";\n\ntype AcpSelectValue = { value?: string; name?: string; options?: AcpSelectValue[] };\ntype AcpConfigOption = { id: string; category?: string | null; type?: string; currentValue?: unknown; options?: AcpSelectValue[] };\nimport { log } from \"../../log.js\";\n\nconst rid = () => Math.random().toString(36).slice(2, 10);\n\ntype AttachableCtx = {\n attachSession(response: { sessionId: string; modes?: unknown; configOptions?: unknown }): ActiveSession;\n};\n\nexport type AcpSessionOpts = {\n threadId: string;\n /** Provider id and display name: the Agent's prompt capabilities are remembered under the id; notices name the Agent */\n providerId?: string;\n providerName?: string;\n cwd: string;\n model: string | null;\n mode: Mode;\n effort: string | null;\n resumeId: string | null;\n binName: string;\n binCandidates: string[];\n acpArgs: string[];\n /** initialize's image answer holds for the start model only (dsh): after a switch, images go by path */\n imagesFollowStartModel?: boolean;\n appVersion: string;\n flavor: \"cursor\" | \"generic\";\n modeMap?: Partial<Record<Mode, string>>;\n cursorFast?: boolean;\n cursorAutoReview?: boolean;\n launch?: LaunchCommand;\n};\n\nexport class AcpSession implements ProviderSession {\n events: AsyncIterable<ProviderEvent>;\n private q = new AsyncQueue<ProviderEvent>();\n private child: ChildProcess | null = null;\n private conn: ClientConnection | null = null;\n private ctx: ClientContext | null = null;\n private active: ActiveSession | null = null;\n private initErr: Error | null = null;\n private initPromise: Promise<void>;\n private closed = false;\n private turnId: string | null = null;\n private turnNum = 0;\n private running = false;\n private permPending = new Map<string, (a: RespondAnswer) => void>();\n private mapCtx: MapCtx = newMapCtx();\n private modelConfigId: string | null = null;\n private thoughtConfigId: string | null = null;\n private cursorFast = false;\n private cursorAutoReview = false;\n private slashCommands: SlashCommand[] = [];\n private activeTurnId: string | null = null;\n private configOptions: AcpConfigOption[] | null = null;\n // initialize → agentCapabilities.promptCapabilities (ACP baseline until initialize answers: text + resource_link)\n private promptCaps: AcpPromptCaps = { image: false, audio: false, embeddedContext: false };\n private initCaps: AcpPromptCaps = this.promptCaps;\n private startModel: string | null = null;\n private wakePump: (() => void) | null = null;\n // listCommands waits for the first batch of commands (or confirmation there are none), following Paseo's waitForInitialCommands\n private commandsReady!: Promise<void>;\n private settleCommands!: () => void;\n\n constructor(private o: AcpSessionOpts) {\n this.events = this.q;\n this.startModel = o.model; // the model the process is launched for (argsFor), before any setModel\n this.cursorFast = o.cursorFast ?? false;\n // The shield (auto-accept permission prompts) UI was removed: never auto-approve, so conversations that once turned it on don't keep approving with the toggle hidden\n this.cursorAutoReview = false;\n this.commandsReady = new Promise<void>((r) => (this.settleCommands = r));\n this.initPromise = this.boot();\n }\n\n private async boot(): Promise<void> {\n const bin = this.o.launch\n ? await resolveLaunch(this.o.launch).then((r) => r.ok ? ({ ...r, binName: \"custom\" } as ResolveResult & { ok: true; binName: string }) : r)\n : await resolveFirstBin(this.o.binCandidates?.length ? this.o.binCandidates : [this.o.binName]);\n if (!bin.ok) throw new Error(bin.reason);\n try {\n this.child = spawnResolved(bin, launchArgv(this.o.acpArgs, this.o.launch), { cwd: this.o.cwd });\n this.child.stderr?.on(\"data\", (d: Buffer) => {\n const t = d.toString().trim();\n if (t) log(\"info\", `[${this.o.binName} acp] ${t.slice(0, 500)}`);\n });\n this.child.on(\"error\", (e) => this.failInit(e));\n this.child.on(\"close\", (code) => {\n if (!this.closed && code !== 0) {\n this.q.push({ type: \"notice\", level: \"error\", message: tr(\"acp.exited\", { name: this.o.binName, code: String(code) }) });\n }\n });\n\n const app = client({ name: \"magpie-agent-console\" });\n registerAcpClientHandlers(app, {\n push: (ev) => this.q.push(ev),\n waitFor: (id) => this.waitPerm(id),\n autoAcceptPermissions: () => this.cursorAutoReview,\n });\n const stream = acpStreamFromChild(this.child);\n this.conn = app.connect(stream);\n this.ctx = this.conn.agent;\n const initRes = await this.ctx.request(methods.agent.initialize, {\n protocolVersion: PROTOCOL_VERSION,\n // Cursor: declare support for the parameterized model picker (as Paseo does); only then does it expose levels / Fast as separate config options\n clientCapabilities: this.o.flavor === \"cursor\" ? { _meta: { parameterizedModelPicker: true } } : {},\n clientInfo: { name: \"Agent Console\", version: this.o.appVersion },\n });\n this.promptCaps = promptCapsFromInitialize(initRes);\n this.initCaps = this.promptCaps;\n rememberPromptCaps(this.o.providerId, this.promptCaps);\n\n const cwd = absCwd(this.o.cwd);\n const ctx = this.ctx;\n if (!ctx) throw new Error(\"ACP 未连接\");\n if (this.o.resumeId) {\n // Prefer the method the Agent's initialize advertises: load (replays history) over resume (reconnects only); neither → new session + notice\n const how = pickReconnect(sessionOpenFromInitialize(initRes));\n if (how === \"load\" || how === \"resume\") {\n const method = how === \"load\" ? methods.agent.session.load : methods.agent.session.resume;\n const restored = (await ctx.request(method, {\n sessionId: this.o.resumeId,\n cwd,\n mcpServers: [],\n })) as { modes?: unknown; configOptions?: AcpConfigOption[] };\n this.active = (ctx as unknown as AttachableCtx).attachSession({\n sessionId: this.o.resumeId,\n modes: restored.modes,\n configOptions: restored.configOptions,\n });\n if (Array.isArray(restored.configOptions)) this.configOptions = restored.configOptions;\n } else {\n this.active = await ctx.buildSession(cwd).start();\n const agent = this.o.providerName ?? this.o.binName;\n this.q.push({ type: \"notice\", level: \"warn\", message: tr(\"notice.acpSessionNotRestored\", { agent }) });\n }\n } else {\n this.active = await ctx.buildSession(cwd).start();\n }\n this.syncModelConfigId();\n this.syncThoughtConfigId();\n await this.applySessionMode(this.o.mode);\n await this.applySessionModel(this.o.model); // Also applies the thinking level\n await this.applyCursorAutoReviewConfig(this.cursorAutoReview);\n this.q.push({ type: \"provider_session_id\", id: this.active.sessionId });\n const init = (this.active.newSessionResponse as { availableCommands?: { name: string; description: string; input?: { hint?: string } | null }[] })\n ?.availableCommands;\n if (init?.length) this.applyAvailableCommands(init);\n void this.pumpUpdates();\n } catch (e) {\n this.failInit(e);\n throw e;\n }\n }\n\n private failInit(e: unknown): void {\n this.initErr = e instanceof Error ? e : new Error(String(e));\n }\n\n private applyAvailableCommands(\n raw: { name: string; description: string; input?: { hint?: string } | null }[],\n ): void {\n this.slashCommands = sortSlashCommands(mapAcpAvailableCommands(raw));\n this.q.push({ type: \"slash_commands\", commands: this.slashCommands });\n this.settleCommands();\n }\n\n private async ready(): Promise<void> {\n await this.initPromise.catch(() => {});\n if (this.initErr) throw this.initErr;\n if (!this.active) throw new Error(\"ACP 会话未就绪\");\n }\n\n /** The config options currently in effect: each set_config_option response returns the latest set (levels change after switching models); otherwise use session/new's */\n private currentConfig(): AcpConfigOption[] {\n return (this.configOptions ?? this.active?.newSessionResponse.configOptions ?? []) as AcpConfigOption[];\n }\n\n private syncModelConfigId(): void {\n for (const o of this.currentConfig()) {\n if (o.type === \"select\" && (o.category === \"model\" || o.id === \"model\")) {\n this.modelConfigId = o.id;\n return;\n }\n }\n if (this.o.flavor === \"cursor\") this.modelConfigId = \"model\";\n }\n\n // Level options belong to the current model: recompute on every refresh (cleared when switching to a model without levels)\n private syncThoughtConfigId(): void {\n this.thoughtConfigId = null;\n const opts = this.currentConfig().filter((o) => o.type === \"select\");\n const hit =\n opts.find((o) => o.category === \"thought_level\") ??\n opts.find((o) => /thought|thinking|effort|reasoning/i.test(o.id ?? \"\"));\n if (hit) this.thoughtConfigId = hit.id;\n }\n\n /** set_config_option, then refresh local state from the latest config options it returns */\n private async setOption(configId: string, value: string): Promise<boolean> {\n if (!this.ctx || !this.active) return false;\n try {\n const res = (await this.ctx.request(methods.agent.session.setConfigOption, {\n sessionId: this.active.sessionId,\n configId,\n value,\n })) as { configOptions?: AcpConfigOption[] } | null;\n if (Array.isArray(res?.configOptions)) {\n this.configOptions = res.configOptions;\n this.syncThoughtConfigId();\n }\n return true;\n } catch (e) {\n log(\"info\", `ACP set_config_option(${configId}=${value}): ${String(e)}`);\n return false;\n }\n }\n\n private async applySessionThought(effort: string | null): Promise<void> {\n if (!effort || !this.thoughtConfigId) return;\n // Don't send a level the current model doesn't support (the level set changes after switching models)\n const opt = this.currentConfig().find((o) => o.id === this.thoughtConfigId);\n const values = (opt?.options ?? []).flatMap((x) => (x.options ? x.options : [x])).map((x) => x.value);\n if (values.length && !values.includes(effort)) return;\n await this.setOption(this.thoughtConfigId, effort);\n }\n\n /** Mode choices the Agent reports: prefer a category=mode select in configOptions, otherwise ACP modes.availableModes */\n private modeChoices(): { id: string; name: string; configId: string | null }[] {\n const opt = this.currentConfig().find(\n (o) => o.type === \"select\" && (o.category === \"mode\" || o.id === \"mode\"),\n ) as { id: string; options?: { value?: string; name?: string }[] } | undefined;\n if (opt?.options?.length) {\n return opt.options\n .filter((x) => typeof x.value === \"string\")\n .map((x) => ({ id: x.value!, name: x.name ?? x.value!, configId: opt.id }));\n }\n return (this.active?.modes?.availableModes ?? []).map((m) => ({ id: m.id, name: m.name, configId: null }));\n }\n\n private resolveAcpModeId(mode: Mode): string | null {\n if (this.o.modeMap) {\n // Find the Agent's real mode via the table; Copilot's mode ids are URLs (…/session-modes#agent), so match on the # suffix\n const want = this.o.modeMap[mode];\n if (!want) return null;\n const hit = this.modeChoices().find(\n (m) => m.id === want || m.id.endsWith(`#${want}`) || m.name.toLowerCase() === want,\n );\n return hit?.id ?? want;\n }\n if (this.o.flavor === \"cursor\") {\n const map: Partial<Record<Mode, string>> = { default: \"agent\", plan: \"plan\", ask: \"ask\" };\n const want = map[mode] ?? \"agent\";\n const avail = this.active?.modes?.availableModes ?? [];\n const hit = avail.find((m) => m.id === want || m.name.toLowerCase() === want);\n return hit?.id ?? want;\n }\n return mode === \"plan\" ? \"plan\" : \"default\";\n }\n\n private async applySessionMode(mode: Mode): Promise<void> {\n if (!this.ctx || !this.active) return;\n // Copilot \"Allow All\" (as Paseo does): use the agent mode, then turn the allow_all config on; turn it off for other modes\n const hasAllowAll = this.currentConfig().some((o) => o.id === \"allow_all\");\n if (this.o.modeMap?.[mode] === \"allow-all\") {\n const agentId = this.modeChoices().find((m) => m.id === \"agent\" || m.id.endsWith(\"#agent\"));\n if (agentId?.configId) await this.setOption(agentId.configId, agentId.id);\n if (hasAllowAll) await this.setOption(\"allow_all\", \"on\");\n return;\n }\n if (hasAllowAll && this.o.modeMap) await this.setOption(\"allow_all\", \"off\");\n const modeId = this.resolveAcpModeId(mode);\n if (!modeId) return; // This Agent has no such mode: don't send anything\n try {\n // Modes offered as a config option (Devin / OpenCode / Copilot) use set_config_option, otherwise set_mode\n const viaConfig = this.modeChoices().find((m) => m.id === modeId)?.configId;\n if (viaConfig) {\n await this.setOption(viaConfig, modeId);\n return;\n }\n await this.ctx.request(methods.agent.session.setMode, {\n sessionId: this.active.sessionId,\n modeId,\n });\n } catch (e) {\n log(\"info\", `ACP setMode(${mode}): ${String(e)}`);\n }\n }\n\n /**\n * Switch model → refresh level options from the new config options it returns → then apply the level (as Paseo does).\n * Cursor connects with parameterizedModelPicker: only the base model name is sent (grok-4.6); level / Fast are separate config options.\n */\n private async applySessionModel(model: string | null): Promise<void> {\n if (!this.ctx || !this.active) return;\n const value = model && this.o.flavor === \"cursor\" ? model.replace(/\\[.*\\]$/u, \"\") : model;\n if (value) {\n const modelOption = this.currentConfig().find((o) => o.id === (this.modelConfigId ?? \"model\"));\n const values = (modelOption?.options ?? []).flatMap((x) => x.options ? x.options : [x])\n .map((x) => x.value).filter((x): x is string => typeof x === \"string\");\n // Old sessions may have saved another Agent's model ID. Skip invalid values and let ACP keep its current model.\n if (!values.length || values.includes(value)) {\n await this.setOption(this.modelConfigId ?? \"model\", value);\n } else {\n log(\"info\", `忽略 ${this.o.binName} 的无效模型:${value}`);\n }\n }\n if (this.o.flavor === \"cursor\" && this.cursorFast && this.currentConfig().some((o) => o.id === \"fast\")) {\n await this.setOption(\"fast\", \"true\");\n }\n await this.applySessionThought(this.o.effort);\n }\n\n private async applyCursorAutoReviewConfig(on: boolean): Promise<void> {\n if (this.o.flavor !== \"cursor\" || !this.ctx || !this.active) return;\n for (const configId of [\"auto_review\", \"autoReview\", \"smart_auto\"]) {\n try {\n await this.ctx.request(methods.agent.session.setConfigOption, {\n sessionId: this.active.sessionId,\n configId,\n type: \"boolean\",\n value: on,\n });\n return;\n } catch {\n /* try the next configId */\n }\n }\n }\n\n /** Cursor only: Fast / Auto-review (can be changed while the session is open) */\n async updateCursorOpts(fast: boolean, autoReview: boolean): Promise<void> {\n this.cursorFast = fast;\n void autoReview; // See the constructor: auto-approval is no longer supported\n await this.ready();\n await this.applySessionModel(this.o.model);\n await this.applyCursorAutoReviewConfig(false);\n }\n\n private waitPerm(requestId: string): Promise<RespondAnswer> {\n return new Promise((resolve) => {\n this.permPending.set(requestId, resolve);\n });\n }\n\n respond(requestId: string, answer: RespondAnswer): void {\n const r = this.permPending.get(requestId);\n if (r) {\n this.permPending.delete(requestId);\n r(answer);\n this.q.push({\n type: \"permission_resolved\",\n requestId,\n optionId: answer.optionId,\n cancelled: answer.cancelled,\n });\n }\n }\n\n async send(input: SendInput): Promise<void> {\n await this.ready();\n if (this.running) throw new Error(\"当前轮次尚未结束\");\n this.turnNum++;\n this.turnId = \"u_\" + Date.now().toString(36) + \"_\" + this.turnNum;\n this.mapCtx = newMapCtx();\n this.running = true;\n this.q.push({\n type: \"turn_started\",\n turnId: this.turnId,\n model: this.o.model,\n mode: this.o.mode,\n effort: this.o.effort,\n });\n const text = input.text.trim();\n const attachments = input.images ?? [];\n if (!text && !attachments.length) {\n this.running = false;\n this.q.push({ type: \"turn_ended\", turnId: this.turnId, status: \"completed\" });\n return;\n }\n // An image-only message is still a prompt: images go as image blocks when the Agent takes them, else by file path\n const built = await buildAcpPrompt(text, attachments, this.promptCaps);\n const agent = this.o.providerName ?? this.o.binName;\n if (built.imagesByPath.length && !this.promptCaps.image) {\n const switched = this.o.imagesFollowStartModel && this.initCaps.image && this.o.model !== this.startModel;\n this.q.push({ type: \"notice\", level: \"warn\", message: tr(switched ? \"notice.acpImageByPathSwitched\" : \"notice.acpImageByPath\", { agent, paths: built.imagesByPath.join(\", \") }) });\n }\n for (const w of built.warnings) this.q.push({ type: \"notice\", level: \"warn\", message: tr(\"notice.attachmentIssue\", { detail: w }) });\n if (!built.blocks.length) {\n // Every attachment failed to resolve and there was no text: nothing to send\n this.running = false;\n this.q.push({ type: \"turn_ended\", turnId: this.turnId, status: \"completed\" });\n return;\n }\n void this.runTurn(built.blocks);\n }\n\n // Send this turn's prompt; reading updates is the job of the persistent pumpUpdates() (following Paseo: session/update is handled at session level)\n private async runTurn(prompt: Parameters<ActiveSession[\"prompt\"]>[0]): Promise<void> {\n this.activeTurnId = this.turnId;\n this.wakePump?.();\n this.wakePump = null;\n this.active!.prompt(prompt).catch(() => {\n /* failures surface through nextUpdate() and pumpUpdates ends the turn */\n });\n }\n\n private endTurn(ev: ProviderEvent): void {\n this.q.push(ev);\n this.activeTurnId = null;\n this.running = false;\n }\n\n /**\n * Read session/update for the whole lifetime of the session.\n * It used to read only during a turn: the available_commands_update an Agent pushes after session/new and before the first message went unread,\n * so the slash menu stayed empty. Now command updates are cached at any time; conversation content becomes timeline events only while a turn is in progress.\n */\n private async pumpUpdates(): Promise<void> {\n const session = this.active;\n if (!session) return;\n while (!this.closed) {\n let msg: Awaited<ReturnType<typeof session.nextUpdate>>;\n try {\n msg = await session.nextUpdate();\n } catch (e) {\n if (this.closed) return;\n const turnId = this.activeTurnId;\n if (turnId) {\n this.endTurn({ type: \"turn_ended\", turnId, status: \"failed\", error: String((e as Error)?.message ?? e) });\n }\n // After an error the queue keeps throwing the same error until the next prompt clears it: wait for the next turn before reading again\n await new Promise<void>((r) => (this.wakePump = r));\n continue;\n }\n if (msg.kind === \"session_update\") {\n const u = msg.update;\n if (u.sessionUpdate === \"available_commands_update\") {\n this.applyAvailableCommands(u.availableCommands ?? []);\n continue;\n }\n if (!this.activeTurnId) continue; // Other updates outside a turn (e.g. mode change echoes) don't go to the timeline\n for (const ev of mapSessionUpdate(u, this.mapCtx)) this.q.push(ev);\n } else if (this.activeTurnId) {\n this.endTurn(stopToTurnEnd(msg.stopReason, this.activeTurnId));\n }\n }\n }\n\n async interrupt(): Promise<void> {\n await this.ready();\n if (!this.ctx || !this.active) return;\n try {\n await this.ctx.request(methods.agent.session.cancel, { sessionId: this.active.sessionId });\n } catch (e) {\n log(\"info\", `ACP cancel: ${String(e)}`);\n }\n }\n\n async setModel(model: string | null): Promise<void> {\n this.o.model = model;\n await this.ready();\n if (this.o.imagesFollowStartModel) {\n // dsh answered initialize for the model it started on; another model may not take image blocks (it refuses the prompt)\n this.promptCaps = model === this.startModel ? this.initCaps : { ...this.initCaps, image: false };\n }\n await this.applySessionModel(model);\n }\n\n async setMode(mode: Mode): Promise<void> {\n this.o.mode = mode;\n await this.ready();\n await this.applySessionMode(mode);\n }\n\n async setEffort(effort: string | null): Promise<void> {\n this.o.effort = effort;\n await this.ready();\n await this.applySessionThought(effort);\n }\n\n async listCommands(): Promise<SlashCommand[]> {\n try {\n await this.ready();\n } catch {\n return [];\n }\n // Commands are pushed asynchronously after session/new: wait at most 10 s for the first batch (Agents that report none return empty after the timeout)\n if (!this.slashCommands.length) {\n await Promise.race([this.commandsReady, new Promise((r) => setTimeout(r, 10000))]);\n }\n return this.slashCommands;\n }\n\n async close(): Promise<void> {\n this.closed = true;\n this.wakePump?.();\n this.settleCommands();\n for (const r of this.permPending.values()) r({ cancelled: true });\n this.permPending.clear();\n try {\n this.active?.dispose();\n } catch {}\n try {\n this.conn?.close();\n } catch {}\n await killAcpChild(this.child);\n this.child = null;\n this.q.close();\n }\n}\n","import type { Provider, DetectResult, ModelInfo, Capabilities, Mode, LaunchCommand } from \"../types.js\";\nimport { killTree, spawnBin, type ResolveResult } from \"../../util/bin.js\";\nimport { resolveFirstBin } from \"../../util/bin.js\";\nimport { resolveLaunch } from \"../launch.js\";\nimport { PLACEHOLDER_MODEL_NAME } from \"../types.js\";\nimport { AcpSession } from \"./session.js\";\nimport { knownPromptCaps } from \"./promptCaps.js\";\n\nexport type AcpProviderConfig = {\n id: string;\n name: string;\n binName: string;\n /** Takes precedence over binName: detect / listModels / session resolve these in order */\n binCandidates?: string[];\n acpArgs: string[];\n /** Arguments for one session's ACP process from its model (dsh starts on the conversation's route); default acpArgs */\n argsFor?: (model: string | null) => Promise<string[]>;\n /** The Agent decides at initialize whether it takes images, for the model it started on (dsh): a model picked later sends images by path */\n imagesFollowStartModel?: boolean;\n installHint: string;\n appVersion?: string;\n flavor?: \"cursor\" | \"generic\";\n capabilities?: Capabilities;\n fetchModels?: (r: ResolveResult & { ok: true }, launchArgs?: string[]) => Promise<ModelInfo[]>;\n /** Our permission modes → this Agent's mode names over ACP; when given, only modes in the table are shown */\n modeMap?: Partial<Record<Mode, string>>;\n /** Mode names shown in the UI (the Agent's own naming) */\n modeLabels?: Partial<Record<Mode, string>>;\n};\n\nexport const acpCapabilities: Capabilities = {\n resume: true,\n interrupt: true,\n steer: false,\n images: false,\n plan: true,\n questions: false,\n cost: false,\n effort: [],\n modes: [\"plan\", \"default\", \"acceptEdits\", \"bypassPermissions\"],\n deltasOnly: true,\n};\n\nexport const cursorAcpCapabilities: Capabilities = {\n ...acpCapabilities,\n questions: true,\n modes: [\"default\", \"plan\", \"ask\"],\n};\n\nfunction runVersion(r: ResolveResult & { ok: true }, args: string[], timeoutMs = 8000): Promise<string> {\n return new Promise((resolvePromise, reject) => {\n let out = \"\";\n const p = spawnBin(r, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"], env: { ...process.env, NO_COLOR: \"1\" } });\n const t = setTimeout(() => {\n try {\n void killTree(p, { graceMs: 500 }); // On Windows a .cmd wrapper must be killed together with its child processes\n } catch {}\n reject(new Error(\"timeout\"));\n }, timeoutMs);\n p.stdout?.on(\"data\", (c: Buffer) => (out += c.toString()));\n p.stderr?.on(\"data\", (c: Buffer) => (out += c.toString()));\n p.on(\"error\", reject);\n p.on(\"close\", (code) => {\n clearTimeout(t);\n if (code === 0 || out.trim()) resolvePromise(out.trim());\n else reject(new Error(\"exit \" + code));\n });\n });\n}\n\nasync function resolveProviderBin(cfg: AcpProviderConfig) {\n const names = cfg.binCandidates?.length ? cfg.binCandidates : [cfg.binName];\n return resolveFirstBin(names);\n}\n\nexport function createAcpProvider(cfg: AcpProviderConfig): Provider {\n const base = cfg.capabilities ?? acpCapabilities;\n // With a mode table, expose only the modes the Agent really has (in our fixed order)\n const ORDER: Mode[] = [\"plan\", \"default\", \"acceptEdits\", \"bypassPermissions\"];\n const caps: Capabilities = cfg.modeMap\n ? { ...base, modes: ORDER.filter((m) => cfg.modeMap![m] !== undefined), modeLabels: cfg.modeLabels }\n : base;\n return {\n id: cfg.id,\n name: cfg.name,\n // images is what the Agent's own initialize says (probe at warm-up / providers.list, or any session); until then unknown\n get capabilities(): Capabilities {\n const learned = knownPromptCaps(cfg.id);\n return learned ? { ...caps, images: learned.image, imagesKnown: true } : { ...caps, images: false, imagesKnown: false };\n },\n async detect(launch?: LaunchCommand): Promise<DetectResult> {\n const r = launch ? await resolveLaunch(launch) : await resolveProviderBin(cfg);\n if (!r.ok) {\n return { available: false, reason: r.reason, installHint: cfg.installHint };\n }\n let version: string | undefined;\n const versionArgs = cfg.id === \"devin\" ? [\"version\"] : [\"cursor\", \"opencode\"].includes(cfg.id) ? [\"--version\"] : null;\n try {\n if (versionArgs) {\n // Only the internal prefix: the user's extra args are meant for the ACP command, not for --version\n version = (await runVersion(r, [...(launch?.prefixArgs ?? []), ...versionArgs])).split(/\\r?\\n/)[0]?.trim();\n }\n } catch {\n /* Having the binary is enough */\n }\n return { available: true, bin: r.display, version };\n },\n async listModels(launch?: LaunchCommand): Promise<ModelInfo[]> {\n const resolved = launch ? await resolveLaunch(launch) : await resolveProviderBin(cfg);\n if (!resolved.ok) return [{ id: \"default\", name: PLACEHOLDER_MODEL_NAME, isDefault: true }];\n // The internal prefix rides on the resolution (fetchModels puts its own ACP args after it), the user's args go last\n const r = launch?.prefixArgs?.length && resolved.via !== \"cmd-shim\"\n ? { ...resolved, prefixArgs: [...resolved.prefixArgs, ...launch.prefixArgs] }\n : resolved;\n if (cfg.fetchModels) return cfg.fetchModels(r, launch?.args ?? []);\n return [{ id: \"default\", name: PLACEHOLDER_MODEL_NAME, isDefault: true }];\n },\n async createSession(o) {\n return new AcpSession({\n threadId: o.threadId,\n providerId: cfg.id,\n providerName: cfg.name,\n cwd: o.cwd,\n model: o.model,\n mode: o.mode,\n effort: o.effort,\n resumeId: o.resumeId,\n binName: cfg.binName,\n binCandidates: cfg.binCandidates ?? [cfg.binName],\n acpArgs: cfg.argsFor ? await cfg.argsFor(o.model) : cfg.acpArgs,\n imagesFollowStartModel: cfg.imagesFollowStartModel,\n appVersion: cfg.appVersion ?? \"0.0.1\",\n flavor: cfg.flavor ?? \"generic\",\n modeMap: cfg.modeMap,\n cursorFast: o.cursorFast,\n cursorAutoReview: o.cursorAutoReview,\n launch: o.launch,\n });\n },\n };\n}\n","// dsh (DeepSeek Harness) over ACP: start it on the model the conversation uses, so it can take images.\n//\n// dsh decides at ACP initialize whether it accepts image blocks, from the route in its `acp` config row\n// (`dsh-acp`'s supportsAcpImagePrompts), not from the session's model. That row ships as\n// deepseek-official / deepseek-v4-flash, which isn't in dsh's own catalog (deepseek-flash is) and isn't a\n// route Magpie writes (Magpie writes `agent-default-model` and its `magpie*` routes, not the `acp` row).\n// So dsh 0.2.1-rc.5 / 0.2.2-alpha.2 answer promptCapabilities.image: false and then refuse every image\n// block (\"inline image prompts were not advertised by this connection\"), even on a model that sees images.\n//\n// The launcher takes `--patch <file>` overlays, applied after the profile and home patches. We start dsh\n// with one that sets the `acp` row to the conversation's route ([provider, model], the value dsh's ACP model\n// option uses). dsh then advertises image input exactly when that route declares it (a Magpie model it can\n// see images with is written as `input: [text, image]`) and passes the image to the model.\n// A model picked later in the same session goes by path: dsh's read_image tool opens it on a model that sees images.\nimport { createHash } from \"node:crypto\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const DSH_ACP_ARGS = [\"--profile\", \"acp\"];\n\nexport type DshRoute = { provider: string; model: string };\n\n/** dsh's ACP model value is JSON [provider, model]; anything else isn't a route */\nexport function dshRoute(model: string | null | undefined): DshRoute | null {\n if (!model) return null;\n try {\n const v = JSON.parse(model) as unknown;\n if (Array.isArray(v) && v.length === 2 && typeof v[0] === \"string\" && typeof v[1] === \"string\" && v[0] && v[1]) {\n return { provider: v[0], model: v[1] };\n }\n } catch {\n /* not a dsh route */\n }\n return null;\n}\n\n/** The patch list that starts dsh's ACP on this route (JSON strings are valid YAML double-quoted scalars) */\nexport function dshRoutePatch(route: DshRoute): string {\n return [\n \"# Agent Console: the route dsh's ACP starts on, so initialize advertises image input for it\",\n \"- id: acp\",\n \" config:\",\n ` provider: ${JSON.stringify(route.provider)}`,\n ` model: ${JSON.stringify(route.model)}`,\n \"\",\n ].join(\"\\n\");\n}\n\n/** Arguments for `dsh`: the ACP profile, plus a --patch overlay naming the route when the model is one */\nexport async function dshAcpArgs(model: string | null | undefined, dir = join(tmpdir(), \"agent-console-dsh\")): Promise<string[]> {\n const route = dshRoute(model);\n if (!route) return [...DSH_ACP_ARGS];\n const body = dshRoutePatch(route);\n const file = join(dir, `acp-route-${createHash(\"sha256\").update(body).digest(\"hex\").slice(0, 16)}.yml`);\n await mkdir(dir, { recursive: true });\n await writeFile(file, body, { mode: 0o600 });\n return [...DSH_ACP_ARGS, \"--patch\", file];\n}\n\n/** The route a new dsh conversation starts on, as the manager picks it: a Magpie route first, else dsh's current one */\nexport function dshDefaultModel(models: { id: string }[], current: string | null): string | null {\n return models.find((m) => /magpie/i.test(m.id))?.id ?? current ?? models[0]?.id ?? null;\n}\n","// ACP probe: start the Agent's ACP process once → initialize → session/new, read the models and thinking levels it reports, then close it.\n// Sends no prompt and costs nothing. This is the Agent's own model list (as Paseo does), more reliable than parsing CLI text.\nimport { tmpdir } from \"node:os\";\nimport type { ModelInfo } from \"../types.js\";\nimport type { ResolveResult } from \"../../util/bin.js\";\nimport { spawnResolved, killAcpChild } from \"./spawn.js\";\nimport { log } from \"../../log.js\";\nimport { promptCapsFromInitialize, rememberPromptCaps, type AcpPromptCaps } from \"./promptCaps.js\";\nimport { DSH_ACP_ARGS, dshAcpArgs, dshDefaultModel, dshRoute } from \"./dsh.js\";\n\ntype SelectOption = { value?: unknown; name?: unknown; options?: SelectOption[] };\ntype ConfigOption = { id?: string; category?: string; type?: string; currentValue?: unknown; options?: SelectOption[] };\n\nexport type AcpProbeResult = {\n models: { id: string; name: string }[];\n currentModel: string | null;\n thinking: { id: string; label: string }[];\n currentThinking: string | null;\n};\n\nfunction flatten(opts: SelectOption[] | undefined): { id: string; name: string }[] {\n const out: { id: string; name: string }[] = [];\n for (const o of opts ?? []) {\n if (o.options) out.push(...flatten(o.options));\n else if (typeof o.value === \"string\" && o.value) {\n out.push({ id: o.value, name: typeof o.name === \"string\" && o.name ? o.name : o.value });\n }\n }\n // Dedupe (Copilot reports auto twice)\n return out.filter((m, i) => out.findIndex((x) => x.id === m.id) === i);\n}\n\n/** Extract models and thinking levels from a session/new response (pure function, easy to test) */\nexport function parseAcpSession(res: { configOptions?: ConfigOption[]; models?: { currentModelId?: string; availableModels?: { modelId?: string; name?: string }[] } }): AcpProbeResult {\n const opts = res.configOptions ?? [];\n const modelOpt = opts.find((o) => o.type === \"select\" && (o.category === \"model\" || o.id === \"model\"));\n const thoughtOpt = opts.find((o) => o.type === \"select\" && (o.category === \"thought_level\" || o.id === \"thought_level\"));\n let models = flatten(modelOpt?.options);\n let currentModel = typeof modelOpt?.currentValue === \"string\" ? modelOpt.currentValue : null;\n if (!models.length && res.models?.availableModels?.length) {\n models = res.models.availableModels\n .filter((m) => typeof m.modelId === \"string\" && m.modelId)\n .map((m) => ({ id: m.modelId!, name: m.name || m.modelId! }));\n models = models.filter((m, i) => models.findIndex((x) => x.id === m.id) === i);\n currentModel = res.models.currentModelId ?? currentModel;\n }\n const thinking = flatten(thoughtOpt?.options).map((t) => ({ id: t.id, label: t.name }));\n const currentThinking = typeof thoughtOpt?.currentValue === \"string\" ? thoughtOpt.currentValue : null;\n return { models, currentModel, thinking, currentThinking };\n}\n\n/** providerId: remember what the Agent's initialize advertised for prompts (images) under this id */\nexport function probeAcp(r: ResolveResult & { ok: true }, acpArgs: string[], timeoutMs = 30000, providerId?: string): Promise<AcpProbeResult> {\n return probeAcpRaw(r, acpArgs, timeoutMs).then((x) => {\n rememberPromptCaps(providerId, x.promptCaps);\n return x.parsed;\n });\n}\n\n/** Like probeAcp, but also calls an Agent-specific method after session/new (e.g. Cursor's cursor/list_available_models) */\nexport function probeAcpRaw(\n r: ResolveResult & { ok: true },\n acpArgs: string[],\n timeoutMs = 30000,\n extMethod?: string,\n): Promise<{ parsed: AcpProbeResult; ext: unknown; promptCaps: AcpPromptCaps }> {\n return new Promise((resolvePromise, reject) => {\n const child = spawnResolved(r, acpArgs, { cwd: tmpdir() });\n let buf = \"\";\n let nextId = 0;\n const pending = new Map<number, { res: (v: unknown) => void; rej: (e: Error) => void }>();\n let done = false;\n const finish = (err: Error | null, v?: { parsed: AcpProbeResult; ext: unknown; promptCaps: AcpPromptCaps }) => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n void killAcpChild(child).catch(() => {});\n if (err) reject(err);\n else resolvePromise(v!);\n };\n const timer = setTimeout(() => finish(new Error(\"ACP 探测超时\")), timeoutMs);\n const send = (method: string, params: unknown) =>\n new Promise<unknown>((res, rej) => {\n const id = ++nextId;\n pending.set(id, { res, rej });\n child.stdin?.write(JSON.stringify({ jsonrpc: \"2.0\", id, method, params }) + \"\\n\");\n });\n child.on(\"error\", (e) => finish(e));\n child.on(\"close\", () => finish(new Error(\"ACP 进程提前退出\")));\n child.stderr?.on(\"data\", () => {});\n child.stdout?.on(\"data\", (d: Buffer) => {\n buf += d.toString();\n let n: number;\n while ((n = buf.indexOf(\"\\n\")) >= 0) {\n const line = buf.slice(0, n).trim();\n buf = buf.slice(n + 1);\n if (!line) continue;\n let m: { id?: number; method?: string; result?: unknown; error?: unknown };\n try {\n m = JSON.parse(line);\n } catch {\n continue;\n }\n if (m.id !== undefined && !m.method && pending.has(m.id)) {\n const p = pending.get(m.id)!;\n pending.delete(m.id);\n if (m.error) p.rej(new Error(JSON.stringify(m.error)));\n else p.res(m.result);\n } else if (m.id !== undefined && m.method) {\n // Requests from the Agent (shouldn't happen during a probe): always answer empty so it doesn't hang\n child.stdin?.write(JSON.stringify({ jsonrpc: \"2.0\", id: m.id, result: null }) + \"\\n\");\n }\n }\n });\n void (async () => {\n try {\n const init = await send(\"initialize\", { protocolVersion: 1, clientCapabilities: {}, clientInfo: { name: \"Agent Console\", version: \"probe\" } });\n const res = (await send(\"session/new\", { cwd: tmpdir(), mcpServers: [] })) as Parameters<typeof parseAcpSession>[0];\n let ext: unknown = null;\n if (extMethod) ext = await send(extMethod, {}).catch(() => null);\n finish(null, { parsed: parseAcpSession(res ?? {}), ext, promptCaps: promptCapsFromInitialize(init) });\n } catch (e) {\n finish(e instanceof Error ? e : new Error(String(e)));\n }\n })();\n });\n}\n\n/** Probe result → model list: the current model is the default; thinking levels hang on the current model (other models' levels are only known after switching, so reuse the same set for now) */\nexport function probeToModels(p: AcpProbeResult): ModelInfo[] {\n return p.models.map((m) => ({\n id: m.id,\n name: m.name,\n isDefault: m.id === p.currentModel,\n ...(p.thinking.length\n ? { thinkingOptions: p.thinking, defaultThinking: p.currentThinking ?? undefined }\n : {}),\n }));\n}\n\nconst EFFORT_LABEL: Record<string, string> = {\n none: \"None\", minimal: \"Minimal\", low: \"Low\", medium: \"Medium\", high: \"High\", xhigh: \"Extra High\", max: \"Max\",\n};\n\ntype CursorCatalog = {\n models?: { value?: string; name?: string; configOptions?: ConfigOption[] }[];\n};\n\n/**\n * Cursor: a model's thinking levels are not in the session-level thought_level but in each model's own parameter (effort / reasoning_effort / reasoning).\n * Following Paseo's resolveCursorCatalogModels: call Cursor's extension method cursor/list_available_models to get each model's parameter definitions.\n * The model id is the base name without parameters (grok-4.6); thinkingParam records the level parameter name, sent as grok-4.6[effort=high].\n */\nexport function cursorCatalogToModels(catalog: CursorCatalog, currentModel: string | null): ModelInfo[] {\n const currentBase = currentModel?.replace(/\\[.*\\]$/u, \"\") ?? null;\n const out: ModelInfo[] = [];\n for (const m of catalog.models ?? []) {\n if (typeof m.value !== \"string\" || !m.value) continue;\n const id = m.value.replace(/\\[.*\\]$/u, \"\");\n const thought = (m.configOptions ?? []).find((o) => o.category === \"thought_level\");\n const levels = flatten(thought?.options);\n out.push({\n id,\n name: typeof m.name === \"string\" && m.name ? m.name : id,\n isDefault: id === currentBase,\n ...(thought && levels.length\n ? {\n thinkingOptions: levels.map((l) => ({ id: l.id, label: EFFORT_LABEL[l.id] ?? l.name })),\n defaultThinking: typeof thought.currentValue === \"string\" ? thought.currentValue : undefined,\n thinkingParam: thought.id,\n }\n : {}),\n });\n }\n return out;\n}\n\nexport function cursorProbeModels(acpArgs: string[], providerId?: string) {\n return async (r: ResolveResult & { ok: true }, launchArgs: string[] = []): Promise<ModelInfo[]> => {\n try {\n const { parsed, ext, promptCaps } = await probeAcpRaw(r, [...acpArgs, ...launchArgs], 40000, \"cursor/list_available_models\");\n rememberPromptCaps(providerId, promptCaps);\n const fromCatalog = ext ? cursorCatalogToModels(ext as CursorCatalog, parsed.currentModel) : [];\n // If the extension method is unavailable (older Cursor CLI), fall back to the model list reported by the session (no levels)\n return fromCatalog.length ? fromCatalog : probeToModels(parsed);\n } catch (e) {\n log(\"warn\", \"Cursor 模型探测失败\", { err: String(e) });\n return [];\n }\n };\n}\n\n/**\n * dsh: the model list from a plain `dsh --profile acp`, then whether it takes images from an initialize started on the\n * route a new conversation uses (dsh answers for the route it starts on, see dsh.ts).\n */\nexport function dshProbeModels(providerId?: string) {\n return async (r: ResolveResult & { ok: true }, launchArgs: string[] = []): Promise<ModelInfo[]> => {\n try {\n const first = await probeAcpRaw(r, [...DSH_ACP_ARGS, ...launchArgs], 30000);\n let caps = first.promptCaps;\n const start = dshDefaultModel(first.parsed.models, first.parsed.currentModel);\n if (start && start !== first.parsed.currentModel && dshRoute(start)) {\n caps = await probeAcpRaw(r, [...await dshAcpArgs(start), ...launchArgs], 30000).then((x) => x.promptCaps, () => caps);\n }\n rememberPromptCaps(providerId, caps);\n return probeToModels(first.parsed);\n } catch (e) {\n log(\"warn\", \"ACP 探测模型失败\", { err: String(e) });\n return [];\n }\n };\n}\n\nexport function acpProbeModels(acpArgs: string[], providerId?: string) {\n return async (r: ResolveResult & { ok: true }, launchArgs: string[] = []): Promise<ModelInfo[]> => {\n try {\n return probeToModels(await probeAcp(r, [...acpArgs, ...launchArgs], 30000, providerId));\n } catch (e) {\n log(\"warn\", \"ACP 探测模型失败\", { err: String(e) });\n return [];\n }\n };\n}\n","import type { ProviderCatalogEntry } from \"../catalog.js\";\nimport type { AcpProviderConfig } from \"./provider.js\";\nimport { cursorAcpCapabilities } from \"./provider.js\";\nimport { acpProbeModels, cursorProbeModels, dshProbeModels } from \"./probe.js\";\nimport { DSH_ACP_ARGS, dshAcpArgs } from \"./dsh.js\";\n\nconst ACP_IDS = new Set([\"cursor\", \"devin\", \"opencode\", \"dsh\", \"pi\", \"copilot\"]);\n\nexport function isAcpCatalogId(id: string): boolean {\n return ACP_IDS.has(id);\n}\n\n// Model lists and thinking levels always come from what the Agent reports over ACP (acpProbeModels), no longer from parsing each CLI's text output.\n// modeMap: our permission modes → the Agent's real mode names (from what session/new actually reports); \"\" means keep the entry but send nothing.\nexport function acpConfigForEntry(entry: ProviderCatalogEntry, appVersion: string): AcpProviderConfig | null {\n if (!ACP_IDS.has(entry.id)) return null;\n const base: Omit<AcpProviderConfig, \"acpArgs\" | \"fetchModels\" | \"flavor\" | \"capabilities\"> = {\n id: entry.id,\n name: entry.name,\n binName: entry.bins[0] ?? entry.id,\n binCandidates: entry.bins,\n installHint: entry.installHint,\n appVersion,\n };\n\n switch (entry.id) {\n case \"cursor\":\n // Modes: agent / plan / ask (see cursorAcpCapabilities)\n return {\n ...base,\n acpArgs: [\"acp\"],\n flavor: \"cursor\",\n capabilities: cursorAcpCapabilities,\n // Each model's own thinking levels come from cursor/list_available_models (as Paseo does)\n fetchModels: cursorProbeModels([\"acp\"], entry.id),\n };\n case \"devin\":\n // Modes: Code(accept-edits) / Smart / Ask / Plan / Bypass Permissions\n return {\n ...base,\n acpArgs: [\"acp\"],\n fetchModels: acpProbeModels([\"acp\"], entry.id),\n modeMap: { plan: \"plan\", default: \"ask\", acceptEdits: \"accept-edits\", bypassPermissions: \"bypass\" },\n modeLabels: { plan: \"Plan\", default: \"Ask\", acceptEdits: \"Code\", bypassPermissions: \"Bypass Permissions\" },\n };\n case \"opencode\":\n // Modes: build / plan; thinking level effort (low…ultra, including fast variants)\n return {\n ...base,\n acpArgs: [\"acp\"],\n fetchModels: acpProbeModels([\"acp\"], entry.id),\n modeMap: { plan: \"plan\", default: \"build\" },\n modeLabels: { plan: \"Plan\", default: \"Build\" },\n };\n case \"copilot\":\n // As Paseo: Agent / Plan / Allow All. Allow All = agent mode + allow_all config on (autopilot is not used)\n return {\n ...base,\n acpArgs: [\"--acp\"],\n fetchModels: acpProbeModels([\"--acp\"], entry.id),\n modeMap: { plan: \"plan\", default: \"agent\", bypassPermissions: \"allow-all\" },\n modeLabels: { plan: \"Plan\", default: \"Agent\", bypassPermissions: \"Allow All\" },\n };\n case \"pi\":\n // pi-acp has no mode options; thinking level thought_level (low…max)\n return { ...base, acpArgs: [], fetchModels: acpProbeModels([], entry.id), modeMap: { default: \"\" } };\n case \"dsh\":\n // Started on the conversation's route (--patch), so its initialize advertises image input for that model (see dsh.ts)\n return {\n ...base,\n acpArgs: DSH_ACP_ARGS,\n argsFor: (model) => dshAcpArgs(model),\n imagesFollowStartModel: true,\n fetchModels: dshProbeModels(entry.id),\n };\n default:\n return null;\n }\n}\n","// Provider registry: 8 in the catalog; claude/codex native, the rest over ACP (including copilot --acp).\nimport type { Provider } from \"./types.js\";\nimport { createMockProvider } from \"./mock.js\";\nimport { createClaudeProvider } from \"./claude/provider.js\";\nimport { createCodexProvider } from \"./codex/provider.js\";\nimport { PROVIDER_CATALOG } from \"./catalog.js\";\nimport { createAcpProvider } from \"./acp/provider.js\";\nimport { acpConfigForEntry } from \"./acp/specs.js\";\n\nconst providers = new Map<string, Provider>();\n\nexport function registerProvider(p: Provider): void {\n providers.set(p.id, p);\n}\n\nexport function getProvider(id: string): Provider | undefined {\n return providers.get(id);\n}\n\nexport function listProviders(): Provider[] {\n return [...providers.values()];\n}\n\nexport function initProviders(version: string = \"\"): void {\n providers.clear();\n for (const entry of PROVIDER_CATALOG) {\n if (entry.id === \"claude\") registerProvider(createClaudeProvider());\n else if (entry.id === \"codex\") registerProvider(createCodexProvider(version));\n else {\n const acp = acpConfigForEntry(entry, version);\n if (acp) registerProvider(createAcpProvider(acp));\n }\n }\n if (process.env.AGENT_CONSOLE_MOCK === \"1\") {\n registerProvider(createMockProvider());\n }\n}\n","// Whether the user enabled this Provider in settings.\n// Never toggled by hand: catalog status=verified is on by default, others off; entries outside the catalog (mock etc.) are on.\nimport type { Settings } from \"../store/settings.js\";\nimport { catalogById } from \"./catalog.js\";\n\nexport function isProviderEnabled(settings: Settings, id: string): boolean {\n const m = settings.providerEnabled;\n if (m && typeof m === \"object\" && typeof m[id] === \"boolean\") return m[id];\n const entry = catalogById(id);\n if (!entry) return true;\n return entry.status === \"verified\";\n}\n","import { execFile } from \"node:child_process\";\n\n/** Parse PowerShell stdout into a folder path (handles Base64 and CP936 consoles) */\nexport function decodePickFolderStdout(stdout: string | Buffer): string | null {\n const buf = Buffer.isBuffer(stdout) ? stdout : Buffer.from(stdout, \"utf8\");\n const line = buf.toString(\"utf8\").trim().split(/\\r?\\n/).pop()?.trim() ?? \"\";\n if (!line) return null;\n\n // New format: Base64 of the UTF-8 path, so a GBK-encoded Chinese Windows console isn't garbled when Node decodes it as UTF-8\n if (/^[A-Za-z0-9+/]+=*$/.test(line)) {\n const decoded = Buffer.from(line, \"base64\").toString(\"utf8\");\n if (decoded && !decoded.includes(\"\\uFFFD\")) return decoded;\n }\n\n if (!line.includes(\"\\uFFFD\")) return line;\n\n const gbkLine = new TextDecoder(\"gbk\").decode(buf).trim().split(/\\r?\\n/).pop()?.trim() ?? \"\";\n return gbkLine || null;\n}\n\nexport function pickFolderWindows(initial?: string): Promise<{ available: boolean; path: string | null }> {\n return new Promise((resolvePromise) => {\n if (process.platform !== \"win32\") return resolvePromise({ available: false, path: null });\n const init = (initial ?? \"\").replace(/'/g, \"''\");\n const script =\n \"Add-Type -AssemblyName System.Windows.Forms;\" +\n \"$d = New-Object System.Windows.Forms.FolderBrowserDialog;\" +\n \"$d.Description = '选择项目文件夹';\" +\n \"$d.ShowNewFolderButton = $true;\" +\n (init ? `$d.SelectedPath = '${init}';` : \"\") +\n \"if ($d.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) { \" +\n \"[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($d.SelectedPath)) \" +\n \"}\";\n execFile(\n \"powershell.exe\",\n [\"-NoProfile\", \"-STA\", \"-NonInteractive\", \"-Command\", script],\n { timeout: 120000, windowsHide: false, encoding: \"buffer\" },\n (e, stdout) => {\n if (e) return resolvePromise({ available: true, path: null });\n resolvePromise({ available: true, path: decodePickFolderStdout(stdout ?? Buffer.alloc(0)) });\n },\n );\n });\n}\n","// Native folder picker: Windows uses PowerShell FolderBrowserDialog (pickFolderWin.ts),\n// macOS osascript's choose folder, Linux zenity / kdialog when present; with none, report unavailable and the frontend falls back to typing.\n// Everything starts processes directly via execFile, no shell; the initial directory is passed only as an argument or an escaped AppleScript string.\nimport { execFile } from \"node:child_process\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { findOnPath } from \"../../../lib/pathscan.mjs\";\nimport { pickFolderWindows } from \"./pickFolderWin.js\";\n\nexport type PickResult = { available: boolean; path: string | null };\nconst TIMEOUT = 10 * 60 * 1000; // The user may keep the dialog open for a while\n\n/** AppleScript string literal: only backslashes and double quotes need escaping. */\nexport function appleScriptString(s: string): string {\n return '\"' + s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"') + '\"';\n}\n\nfunction isDir(p: string | undefined): p is string {\n try {\n return !!p && existsSync(p) && statSync(p).isDirectory();\n } catch {\n return false;\n }\n}\n\n/** Command-line arguments (for testability). Returns null when the platform has no picker. */\nexport function pickFolderCommand(\n platform: NodeJS.Platform,\n initial: string | undefined,\n find: (name: string) => string | null = (n) => findOnPath(n)[0] ?? null,\n env: NodeJS.ProcessEnv = process.env,\n): { cmd: string; args: string[] } | null {\n const init = isDir(initial) ? initial : undefined;\n if (platform === \"darwin\") {\n const prompt = appleScriptString(\"选择项目文件夹 / Choose a project folder\");\n const loc = init ? ` default location (POSIX file ${appleScriptString(init)})` : \"\";\n return { cmd: \"/usr/bin/osascript\", args: [\"-e\", `POSIX path of (choose folder with prompt ${prompt}${loc})`] };\n }\n if (platform === \"linux\" || platform === \"freebsd\" || platform === \"openbsd\") {\n // No graphical session (magpie web on a server): no window can open, so the frontend asks for a typed path\n if (!env.DISPLAY && !env.WAYLAND_DISPLAY) return null;\n const zenity = find(\"zenity\");\n if (zenity) {\n const args = [\"--file-selection\", \"--directory\", \"--title=选择项目文件夹 / Choose a project folder\"];\n if (init) args.push(`--filename=${init.endsWith(\"/\") ? init : init + \"/\"}`);\n return { cmd: zenity, args };\n }\n const kdialog = find(\"kdialog\");\n if (kdialog) return { cmd: kdialog, args: [\"--getexistingdirectory\", init ?? env.HOME ?? \"/\"] };\n }\n return null;\n}\n\nexport function pickFolder(initial?: string): Promise<PickResult> {\n if (process.platform === \"win32\") return pickFolderWindows(initial);\n const c = pickFolderCommand(process.platform, initial);\n if (!c) return Promise.resolve({ available: false, path: null });\n return new Promise((resolvePromise) => {\n execFile(c.cmd, c.args, { timeout: TIMEOUT, encoding: \"utf8\" }, (e, stdout) => {\n // Cancel: osascript / zenity / kdialog all exit non-zero\n if (e) return resolvePromise({ available: true, path: null });\n let p = String(stdout ?? \"\").replace(/\\r?\\n$/, \"\").trim();\n // osascript's POSIX path ends with / (except for the root)\n if (p.length > 1) p = p.replace(/\\/+$/, \"\");\n resolvePromise({ available: true, path: p || null });\n }).on(\"error\", () => resolvePromise({ available: false, path: null }));\n });\n}\n","// magpie gateway: magpie points each Agent's models at the local gateway (applied.json records the model currently applied to each).\n// Here we fill in, for those Agents, the model list, the default model and each model's thinking levels. Read-only; no configuration is changed.\nimport { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ModelInfo } from \"./types.js\";\nimport { log } from \"../log.js\";\n\n/** Agent Console provider id → the key in magpie's applied.json + the model id prefix used inside that Agent */\nconst MAGPIE_TOOLS: Record<string, { key: string; prefix: string }> = {\n claude: { key: \"claude\", prefix: \"\" },\n codex: { key: \"codex\", prefix: \"\" },\n opencode: { key: \"opencode\", prefix: \"magpie/\" },\n pi: { key: \"pi\", prefix: \"magpie/\" },\n dsh: { key: \"dsh\", prefix: \"magpie/\" },\n};\n\nconst EFFORT_LABEL: Record<string, string> = {\n low: \"Low\", medium: \"Medium\", high: \"High\", xhigh: \"Extra High\", max: \"Max\",\n};\n\ntype Applied = Record<string, { fields?: { model?: string; effort?: string } }>;\n\nasync function readJson<T>(path: string): Promise<T | null> {\n try {\n return JSON.parse(await readFile(path, \"utf8\")) as T;\n } catch {\n return null;\n }\n}\n\nasync function readApplied(): Promise<Applied> {\n return (await readJson<Applied>(join(homedir(), \".config\", \"magpie\", \"applied.json\"))) ?? {};\n}\n\nasync function readClaudeEnv(): Promise<Record<string, string>> {\n const s = await readJson<{ env?: Record<string, string> }>(join(homedir(), \".claude\", \"settings.json\"));\n return s?.env ?? {};\n}\n\n/** Gateway address: ANTHROPIC_BASE_URL from the Claude config (written by magpie), otherwise the default 3425 */\nasync function gatewayBase(): Promise<string> {\n const env = await readClaudeEnv();\n const raw = env.ANTHROPIC_BASE_URL?.trim();\n return (raw && /^https?:\\/\\/(127\\.0\\.0\\.1|localhost)(:\\d+)?/i.test(raw) ? raw : \"http://127.0.0.1:3425\").replace(/\\/+$/, \"\");\n}\n\nasync function fetchGatewayModelIds(): Promise<string[]> {\n const base = await gatewayBase();\n try {\n const res = await fetch(`${base}/v1/models`, { signal: AbortSignal.timeout(5000) });\n if (!res.ok) return [];\n const j = (await res.json()) as { data?: { id?: unknown }[] };\n return (j.data ?? []).map((m) => m.id).filter((id): id is string => typeof id === \"string\" && !!id);\n } catch (e) {\n log(\"warn\", \"读取 magpie 网关模型列表失败\", { err: String(e) });\n return [];\n }\n}\n\n/** CLAUDE_CODE_MODEL_CAPABILITIES: `id=effort,xhigh_effort,max_effort;id2=effort` → each model's levels */\nexport function parseCapabilities(raw: string | undefined): Map<string, string[]> {\n const out = new Map<string, string[]>();\n for (const part of (raw ?? \"\").split(\";\")) {\n const i = part.indexOf(\"=\");\n if (i <= 0) continue;\n const flags = new Set(part.slice(i + 1).split(\",\").map((s) => s.trim()));\n if (!flags.has(\"effort\")) continue;\n const levels = [\"low\", \"medium\", \"high\"];\n if (flags.has(\"xhigh_effort\")) levels.push(\"xhigh\");\n if (flags.has(\"max_effort\")) levels.push(\"max\");\n out.set(part.slice(0, i).trim(), levels);\n }\n return out;\n}\n\nfunction isPlaceholder(m: ModelInfo): boolean {\n return !m.id || /^(default|auto)$/i.test(m.id);\n}\n\n/**\n * Fill in model info for Agents managed by magpie; if magpie doesn't manage this Agent (not in applied.json) return it unchanged.\n * - The Agent's own list knows magpie models (e.g. OpenCode, Codex): keep its list with magpie's first (only what it knows, so picks never fail)\n * - The Agent can't report models (Claude, Pi, dsh): use the gateway's /v1/models with the prefix that Agent uses\n * - Default model = the model magpie currently applies to it; thinking levels from magpie's capability table\n */\nexport async function withMagpie(providerId: string, own: ModelInfo[]): Promise<ModelInfo[]> {\n const tool = MAGPIE_TOOLS[providerId];\n if (!tool) return own;\n const applied = (await readApplied())[tool.key]?.fields;\n if (!applied?.model) return own;\n\n const caps = parseCapabilities((await readClaudeEnv()).CLAUDE_CODE_MODEL_CAPABILITIES);\n const real = own.filter((m) => !isPlaceholder(m));\n\n // Over ACP, DSH returns its own real model IDs (JSON-array strings).\n // We must not push an old / another Agent's model ID from applied.json into DSH,\n // otherwise DSH treats it as a routed model and sends it to the wrong provider.\n if (providerId === \"dsh\") {\n const appliedId = applied.model.replace(/^magpie\\//, \"\");\n const selected = real.find((m) =>\n m.id === applied.model ||\n m.id === appliedId ||\n (appliedId.includes(\"/\") && m.id.includes(appliedId)),\n );\n const fallback = selected ?? real.find((m) => m.isDefault) ?? real[0];\n return real.map((m) => ({ ...m, isDefault: m.id === fallback?.id }));\n }\n\n const knowsMagpie = tool.prefix ? real.some((m) => m.id.startsWith(tool.prefix)) : real.length > 0;\n\n let list: ModelInfo[];\n if (knowsMagpie) {\n const mine = real.filter((m) => !tool.prefix || m.id.startsWith(tool.prefix));\n const others = tool.prefix ? real.filter((m) => !m.id.startsWith(tool.prefix)) : [];\n list = [...mine, ...others];\n } else {\n list = (await fetchGatewayModelIds()).map((gid) => ({ id: tool.prefix + gid, name: gid }));\n }\n\n // Default model = the one magpie currently applies; if it's not in the list, add it at the top\n const defId = applied.model;\n if (!list.some((m) => m.id === defId)) list.unshift({ id: defId, name: defId.slice(tool.prefix.length) || defId });\n list = list.map((m) => ({ ...m, isDefault: m.id === defId }));\n list.sort((a, b) => Number(!!b.isDefault) - Number(!!a.isDefault));\n\n // Thinking levels: use the Agent's own if it reports them, otherwise magpie's capability table\n return list.map((m) => {\n const name = tool.prefix && m.name.startsWith(tool.prefix) ? m.name.slice(tool.prefix.length) : m.name;\n if (m.thinkingOptions?.length && providerId !== \"claude\") return { ...m, name };\n const levels = caps.get(m.id.slice(tool.prefix.length) || m.id);\n if (!levels) return { ...m, name, thinkingOptions: providerId === \"claude\" ? [] : m.thinkingOptions };\n const def = applied.effort && levels.includes(applied.effort) ? applied.effort : levels.includes(\"high\") ? \"high\" : levels[0];\n return {\n ...m,\n name,\n thinkingOptions: levels.map((id) => ({ id, label: EFFORT_LABEL[id] ?? id })),\n defaultThinking: m.isDefault ? def : m.defaultThinking ?? def,\n };\n });\n}\n","// In-memory cache of Provider detection results and model lists.\n// detect / listModels often have to start a CLI (seconds); without a cache every page open and model pick would wait.\nimport type { Provider, DetectResult, ModelInfo, LaunchCommand } from \"./types.js\";\nimport { PLACEHOLDER_MODEL_NAME } from \"./types.js\";\nimport { withMagpie } from \"./magpieGateway.js\";\nimport { launchKey } from \"./launch.js\";\nimport { tr } from \"../util/i18n.js\";\n\n\nconst DETECT_MS = 60 * 1000;\nconst MODELS_MS = 10 * 60 * 1000;\nconst STEP_TIMEOUT_MS = 15000;\n// Fetching models may start an ACP session (Cursor launches slowly through PowerShell), so it gets a longer timeout\nconst MODELS_TIMEOUT_MS = 35000;\n\ntype Entry<T> = { at: number; value: T } | undefined;\nconst detects = new Map<string, Entry<DetectResult>>();\nconst models = new Map<string, Entry<ModelInfo[]>>();\n// Concurrent requests for the same Provider share one in-flight detection\nconst inflightDetect = new Map<string, Promise<DetectResult>>();\nconst inflightModels = new Map<string, Promise<ModelInfo[]>>();\n\nfunction withTimeout<T>(p: Promise<T>, ms: number, fb: T): Promise<T> {\n return Promise.race([p, new Promise<T>((r) => setTimeout(() => r(fb), ms))]);\n}\n\nfunction fresh<T>(e: Entry<T>, ttl: number): e is { at: number; value: T } {\n return !!e && Date.now() - e.at < ttl;\n}\n\nfunction cacheKey(p: Provider, launch?: LaunchCommand): string {\n return launch ? `${p.id}\\0${launchKey(launch)}` : p.id;\n}\n\nexport async function cachedDetect(p: Provider, launch?: LaunchCommand): Promise<DetectResult> {\n const key = cacheKey(p, launch);\n const hit = detects.get(key);\n if (fresh(hit, DETECT_MS)) return hit.value;\n let job = inflightDetect.get(key);\n if (!job) {\n const timedOut: DetectResult = { available: false, reason: tr(\"provider.timeout\") };\n job = withTimeout(\n p.detect(launch).catch((e): DetectResult => ({ available: false, reason: String((e as Error)?.message ?? e) })),\n STEP_TIMEOUT_MS,\n timedOut,\n ).then((v) => {\n // Don't cache a timeout; try again next time\n if (v !== timedOut) detects.set(key, { at: Date.now(), value: v });\n return v;\n }).finally(() => inflightDetect.delete(key));\n inflightDetect.set(key, job);\n }\n return job;\n}\n\nexport async function cachedModels(p: Provider, launch?: LaunchCommand): Promise<ModelInfo[]> {\n const key = cacheKey(p, launch);\n const hit = models.get(key);\n if (fresh(hit, MODELS_MS)) return hit.value;\n let job = inflightModels.get(key);\n if (!job) {\n job = withTimeout<ModelInfo[] | null>(p.listModels(launch).catch(() => []), MODELS_TIMEOUT_MS, null)\n .then(async (v) => {\n // Timeout: don't cache, fall back to the old value for now\n if (v === null) return models.get(key)?.value ?? [];\n // Agents behind the magpie gateway: fill in gateway models, the default model and thinking levels\n const list = await withMagpie(p.id, dropPlaceholder(v)).catch(() => dropPlaceholder(v));\n models.set(key, { at: Date.now(), value: list });\n return list;\n })\n .finally(() => inflightModels.delete(key));\n inflightModels.set(key, job);\n }\n return job;\n}\n\n/** A list holding only our own \"Default\" placeholder (id=default, name \"默认\") counts as having no real models.\n * An auto / Auto the Agent itself reports (e.g. Copilot) is a real option and is kept. */\nexport function dropPlaceholder(list: ModelInfo[]): ModelInfo[] {\n if (list.length === 1 && list[0].id === \"default\" && (list[0].name === \"默认\" || list[0].name === PLACEHOLDER_MODEL_NAME)) return [];\n return list;\n}\n\n/** Return the cached value immediately if there is one (may be stale), else undefined */\nexport function peekModels(id: string): ModelInfo[] | undefined {\n return models.get(id)?.value;\n}\n\nexport function clearProviderCache(id?: string): void {\n if (id) {\n for (const m of [detects, models] as Map<string, unknown>[]) {\n for (const k of [...m.keys()]) if (k === id || k.startsWith(id + \"\\0\")) m.delete(k);\n }\n } else {\n detects.clear();\n models.clear();\n }\n}\n","import type { Mode } from \"./types.js\";\n\n/** Map a permission mode onto an Agent's modes: kept when it has it, else that Agent's \"default\", else its first mode. */\nexport function clampMode(modes: Mode[], mode: Mode | null | undefined): Mode {\n if (mode && modes.includes(mode)) return mode;\n if (modes.includes(\"default\")) return \"default\";\n return modes[0] ?? \"default\";\n}\n","// Method registry: zod-validated params → call the service → return. P0-5 skeleton; filled in from P1 on.\nimport { z } from \"zod\";\nimport type { Gateway, ConnCtx } from \"./gateway.js\";\nimport type { Config } from \"../config.js\";\nimport type { SettingsStore, Settings } from \"../store/settings.js\";\nimport { parseSettingsPatch } from \"../store/settings.js\";\nimport type { ProjectsStore } from \"../store/projects.js\";\nimport type { ThreadsStore } from \"../store/threads.js\";\nimport { listProviders, getProvider } from \"../providers/registry.js\";\nimport { PROVIDER_CATALOG, catalogById, providerCreatable } from \"../providers/catalog.js\";\nimport { isProviderEnabled } from \"../providers/enabled.js\";\nimport type { SlashCommand } from \"../providers/types.js\";\nimport { GitService } from \"../git/service.js\";\nimport { FileService } from \"../files/service.js\";\nimport type { TerminalService } from \"../terminal/service.js\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, win32 as win32Path } from \"node:path\";\nimport { execFile } from \"node:child_process\";\nimport { pickFolder } from \"../util/pickFolder.js\";\nimport { clearBinCache } from \"../util/bin.js\";\nimport { cachedDetect, cachedModels, clearProviderCache } from \"../providers/infoCache.js\";\nimport { launchFromSettings } from \"../providers/launch.js\";\nimport { clampMode } from \"../providers/modes.js\";\nimport { tr, intlLocale } from \"../util/i18n.js\";\n\nconst threadModeSchema = z.enum([\"plan\", \"default\", \"acceptEdits\", \"bypassPermissions\", \"ask\"]);\n\nexport type Services = {\n cfg: Config;\n settings: SettingsStore;\n gateway: Gateway;\n projects: ProjectsStore;\n threads: ThreadsStore;\n git: GitService;\n files: FileService;\n terminals: TerminalService;\n // AgentManager provides runtime info once wired in at P1-4; may be empty (no session started)\n runtime?: (threadId: string) => { status: string; queue: unknown[]; pending: unknown[] } | null;\n manager?: {\n send(threadId: string, input: { text: string; attachments?: { path: string; mime: string; name?: string }[] }, behavior?: \"queue\" | \"steer\"): Promise<\"started\" | \"steered\" | \"queued\" | void>;\n interrupt(threadId: string): Promise<void>;\n respond(threadId: string, requestId: string, answer: { optionId?: string; answers?: Record<string, string>; cancelled?: boolean }): Promise<void>;\n setModel(threadId: string, model: string | null): Promise<void>;\n setMode(threadId: string, mode: \"plan\" | \"default\" | \"acceptEdits\" | \"bypassPermissions\" | \"ask\"): Promise<void>;\n setEffort(threadId: string, effort: string | null): Promise<void>;\n setCursorOpts(threadId: string, patch: { cursorFast?: boolean; cursorAutoReview?: boolean }): Promise<void>;\n setProvider(threadId: string, providerId: string): Promise<void>;\n close(threadId: string): Promise<void>;\n deleteThread(threadId: string): Promise<void>;\n listCommands(threadId: string, opts?: { load?: boolean }): Promise<SlashCommand[]>;\n removeQueued(threadId: string, queueId: string): boolean;\n };\n};\n\nexport class ApiError extends Error {\n code: string;\n constructor(code: string, message: string) {\n super(message);\n this.code = code;\n }\n}\n\nfunction wrap<T extends z.ZodType>(schema: T, fn: (p: z.infer<T>, ctx: ConnCtx) => unknown) {\n return (params: unknown, ctx: ConnCtx) => {\n const r = schema.safeParse(params ?? {});\n if (!r.success) {\n throw new ApiError(\"bad_params\", tr(\"err.badParams\", { detail: r.error.issues.map((i) => i.message).join(\"; \") }));\n }\n return fn(r.data, ctx);\n };\n}\n\nexport function registerMethods(gw: Gateway, svc: Services): void {\n const zEmpty = z.object({}).passthrough().optional();\n\n gw.method(\"app.info\", wrap(zEmpty, () => ({\n version: svc.cfg.version,\n dataDir: svc.cfg.dataDir,\n pid: process.pid,\n port: svc.cfg.port,\n })));\n\n gw.method(\"app.shutdown\", wrap(zEmpty, () => {\n setTimeout(() => process.exit(0), 100);\n return { ok: true };\n }));\n\n gw.method(\"settings.get\", wrap(zEmpty, () => svc.settings.get()));\n\n gw.method(\"settings.set\", wrap(z.object({ patch: z.record(z.string(), z.unknown()) }), async (p) => {\n const checked = parseSettingsPatch(p.patch);\n if (!checked.ok) throw new ApiError(\"bad_params\", `Invalid setting: ${checked.error}`);\n const before = await svc.settings.get();\n const next = await svc.settings.set(checked.patch as Partial<Settings>);\n // A changed launch command only invalidates that Agent's detection / model cache (B2: toggling never wipes the rest)\n for (const id of Object.keys(checked.patch.providerCommand ?? {})) {\n if (JSON.stringify(before.providerCommand?.[id] ?? null) !== JSON.stringify(next.providerCommand?.[id] ?? null)) {\n clearProviderCache(id);\n }\n }\n return next;\n }));\n\n gw.method(\"sub.add\", wrap(\n z.object({ ch: z.string().min(1).max(120), afterSeq: z.number().int().nonnegative().optional() }),\n async (p, ctx) => {\n svc.gateway.subscribe(ctx.conn, p.ch);\n // The thread:<id> channel replays persisted events after afterSeq (late subscribers / reconnects lose nothing)\n const m = /^thread:(.+)$/.exec(p.ch);\n if (m && p.afterSeq != null) {\n const events = await svc.threads.readEvents(m[1], p.afterSeq, 5000).catch(() => []);\n for (const ev of events) ctx.conn.send({ t: \"evt\", ch: p.ch, d: { type: \"event\", event: ev } });\n }\n return { ok: true };\n }\n ));\n\n gw.method(\"sub.remove\", wrap(z.object({ ch: z.string().min(1).max(120) }), (p, ctx) => {\n svc.gateway.unsubscribe(ctx.conn, p.ch);\n return { ok: true };\n }));\n\n // ---- providers.list (§6): detection + model list + capabilities ----\n // detect/listModels in parallel; 8s total per provider (listModels may start a temporary process).\n gw.method(\"providers.list\", wrap(\n z.object({ refresh: z.boolean().optional() }).passthrough().optional(),\n async (p) => {\n if (p?.refresh) {\n clearBinCache();\n clearProviderCache();\n }\n const settings = await svc.settings.get();\n const rows = await Promise.all(\n listProviders().map(async (p) => {\n const entry = catalogById(p.id);\n const enabled = isProviderEnabled(settings, p.id);\n const launch = launchFromSettings(settings, p.id);\n // Disabled / not-integrated ones are neither detected nor asked for models (saves seconds of CLI startup)\n const skip = !enabled || entry?.status === \"planned\";\n const det: import(\"../providers/types.js\").DetectResult = skip\n ? { available: false, reason: !enabled ? tr(\"provider.disabled\") : tr(\"provider.planned\") }\n : await cachedDetect(p, launch);\n const models = !skip && det.available ? await cachedModels(p, launch) : [];\n return {\n id: p.id,\n name: p.name,\n available: det.available,\n enabled,\n status: entry?.status ?? \"verified\",\n ready: entry?.status === \"verified\",\n bin: det.bin,\n version: det.version,\n reason: !enabled ? tr(\"provider.disabled\") : det.reason,\n installHint: det.installHint,\n capabilities: p.capabilities,\n models,\n };\n }),\n );\n const byId = new Map(rows.map((r) => [r.id, r]));\n const ordered = PROVIDER_CATALOG.map((e) => byId.get(e.id)).filter(Boolean) as typeof rows;\n for (const r of rows) {\n if (!PROVIDER_CATALOG.some((e) => e.id === r.id)) ordered.push(r);\n }\n return ordered;\n }\n ));\n\n // ---- projects.* ----\n gw.method(\"projects.list\", wrap(zEmpty, () => svc.projects.list()));\n\n gw.method(\"projects.create\", wrap(\n z.object({ path: z.string().min(1), name: z.string().optional() }),\n async (p) => {\n const proj = await svc.projects.create(p.path, p.name);\n // Record recent directories (deduped, case-insensitive, at most 12)\n const s = await svc.settings.get();\n const dirs = (s.recentDirs ?? []).filter((d) => d.toLowerCase() !== p.path.toLowerCase());\n await svc.settings.set({ recentDirs: [p.path, ...dirs].slice(0, 12) });\n gw.publish(\"sidebar\", { type: \"project.upsert\", project: proj });\n return proj;\n }\n ));\n\n gw.method(\"projects.rename\", wrap(z.object({ id: z.string(), name: z.string() }), async (p) => {\n const proj = await svc.projects.rename(p.id, p.name);\n gw.publish(\"sidebar\", { type: \"project.upsert\", project: proj });\n return proj;\n }));\n\n gw.method(\"projects.remove\", wrap(z.object({ id: z.string() }), async (p) => {\n const proj = await svc.projects.get(p.id);\n if (!proj) throw new ApiError(\"not_found\", tr(\"err.projectMissing\"));\n // Move all of the project's conversations to the trash\n for (const t of await svc.threads.list()) {\n if (t.projectId === p.id) {\n await svc.threads.delete(t.id);\n gw.publish(\"sidebar\", { type: \"thread.remove\", id: t.id });\n }\n }\n await svc.projects.remove(p.id);\n gw.publish(\"sidebar\", { type: \"project.remove\", id: p.id });\n return { ok: true };\n }));\n\n gw.method(\"projects.open\", wrap(z.object({ id: z.string() }), async (p) => {\n const proj = await svc.projects.get(p.id);\n if (!proj) throw new ApiError(\"not_found\", tr(\"err.projectMissing\"));\n if (!existsSync(proj.path)) throw new ApiError(\"bad_path\", tr(\"err.dirMissing\"));\n const cmd = process.platform === \"win32\" ? \"explorer.exe\" : process.platform === \"darwin\" ? \"open\" : \"xdg-open\";\n // explorer.exe doesn't understand forward-slash paths (it opens \"Documents\"); a missing xdg-open must not make the daemon throw either\n const target = process.platform === \"win32\" ? win32Path.normalize(proj.path) : proj.path;\n execFile(cmd, [target], { windowsHide: true }, () => {}).on(\"error\", () => {});\n return { ok: true };\n }));\n\n // ---- fs.* ----\n gw.method(\"fs.check\", wrap(z.object({ path: z.string().min(1) }), (p) => {\n let exists = false;\n let isDir = false;\n try {\n exists = existsSync(p.path);\n isDir = exists && statSync(p.path).isDirectory();\n } catch {}\n return { exists, isDir };\n }));\n\n gw.method(\"fs.recentDirs\", wrap(zEmpty, async () => {\n const s = await svc.settings.get();\n return (s.recentDirs ?? []).slice(0, 12);\n }));\n\n // fs.pickFolder: show the native folder picker (the daemon runs locally): Windows PowerShell, macOS osascript,\n // Linux zenity/kdialog; with none, report unavailable and the frontend falls back to typing.\n gw.method(\"fs.pickFolder\", wrap(z.object({ initial: z.string().optional() }).passthrough().optional(), (p) =>\n pickFolder(p?.initial),\n ));\n\n // ---- threads.* ----\n gw.method(\"threads.list\", wrap(zEmpty, () => svc.threads.list()));\n\n gw.method(\"threads.create\", wrap(\n z.object({\n projectId: z.string().min(1),\n provider: z.string().min(1),\n model: z.string().nullable().optional(),\n mode: threadModeSchema.optional(),\n effort: z.string().nullable().optional(),\n title: z.string().optional(),\n providerSessionId: z.string().nullable().optional(),\n importedFrom: z.object({ provider: z.string(), sessionId: z.string() }).optional(),\n }),\n async (p) => {\n const proj = await svc.projects.get(p.projectId);\n if (!proj) throw new ApiError(\"not_found\", tr(\"err.projectMissing\"));\n if (!existsSync(proj.path)) throw new ApiError(\"bad_path\", tr(\"err.projectDirGone\"));\n // New conversations must use an enabled Agent (except imported sessions, which already ran)\n if (!p.providerSessionId && !isProviderEnabled(await svc.settings.get(), p.provider)) {\n throw new ApiError(\"bad_params\", tr(\"provider.disabledNamed\", { name: catalogById(p.provider)?.name ?? p.provider }));\n }\n const cat = catalogById(p.provider);\n if (!p.providerSessionId && cat && !providerCreatable(cat.status)) {\n throw new ApiError(\"bad_params\", tr(\"provider.plannedNamed\", { name: cat.name }));\n }\n // B8: the default permission mode is mapped onto this Agent's own modes (same rule as thread.setProvider)\n const provider = getProvider(p.provider);\n const mode = clampMode(provider?.capabilities.modes ?? [], p.mode);\n const meta = await svc.threads.create({ ...p, mode });\n gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: meta });\n return meta;\n }\n ));\n\n gw.method(\"threads.get\", wrap(\n z.object({ id: z.string(), afterSeq: z.number().int().nonnegative().optional() }),\n async (p) => {\n const meta = await svc.threads.get(p.id);\n if (!meta) throw new ApiError(\"not_found\", tr(\"err.threadMissing\"));\n const events = await svc.threads.readEvents(p.id, p.afterSeq ?? 0, 5000);\n const rt = svc.runtime?.(p.id) ?? null;\n return {\n meta,\n events,\n queue: rt?.queue ?? [],\n pending: rt?.pending ?? [],\n runtimeStatus: rt?.status ?? meta.status,\n };\n }\n ));\n\n gw.method(\"threads.update\", wrap(\n z.object({\n id: z.string(),\n title: z.string().optional(),\n pinned: z.boolean().optional(),\n archived: z.boolean().optional(),\n }),\n async (p) => {\n const meta = await svc.threads.get(p.id);\n if (!meta) throw new ApiError(\"not_found\", tr(\"err.threadMissing\"));\n const patch: Record<string, unknown> = {};\n if (p.title !== undefined) {\n patch.title = p.title.trim() || meta.title;\n patch.titleAuto = false; // Once renamed by hand, never auto-overwrite\n }\n if (p.pinned !== undefined) patch.pinned = p.pinned;\n if (p.archived !== undefined) patch.archived = p.archived;\n const next = await svc.threads.patch(p.id, patch);\n gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: next });\n return next;\n }\n ));\n\n gw.method(\"threads.delete\", wrap(z.object({ id: z.string() }), async (p) => {\n const meta = await svc.threads.get(p.id);\n if (!meta) throw new ApiError(\"not_found\", tr(\"err.threadMissing\"));\n if (svc.manager) await svc.manager.deleteThread(p.id);\n else await svc.threads.delete(p.id);\n gw.publish(\"sidebar\", { type: \"thread.remove\", id: p.id });\n return { ok: true };\n }));\n\n // ---- git.* (§5.8) ----\n const projectPath = async (projectId: string): Promise<string> => {\n const proj = await svc.projects.get(projectId);\n if (!proj) throw new ApiError(\"not_found\", tr(\"err.projectMissing\"));\n if (!existsSync(proj.path)) throw new ApiError(\"bad_path\", tr(\"err.projectDirGone\"));\n return proj.path;\n };\n\n gw.method(\"git.status\", wrap(z.object({ projectId: z.string() }), async (p) =>\n svc.git.status(await projectPath(p.projectId))\n ));\n\n gw.method(\"git.diff\", wrap(z.object({ projectId: z.string(), path: z.string() }), async (p) =>\n svc.git.diff(await projectPath(p.projectId), p.path)\n ));\n\n gw.method(\"git.discard\", wrap(z.object({ projectId: z.string(), path: z.string() }), async (p) =>\n svc.git.discard(await projectPath(p.projectId), p.path, svc.cfg.dataDir)\n ));\n\n // ---- files.* (§5.9) ----\n gw.method(\"files.tree\", wrap(z.object({ projectId: z.string(), dir: z.string().default(\".\") }), async (p) =>\n svc.files.tree(await projectPath(p.projectId), p.dir)\n ));\n\n gw.method(\"files.read\", wrap(z.object({ projectId: z.string(), path: z.string() }), async (p) =>\n svc.files.read(await projectPath(p.projectId), p.path)\n ));\n\n // ---- history.* (§7.6) ----\n gw.method(\"history.list\", wrap(z.object({ projectId: z.string() }), async (p) => {\n const proj = await svc.projects.get(p.projectId);\n if (!proj) throw new ApiError(\"not_found\", tr(\"err.projectMissing\"));\n const imported = new Set(\n (await svc.threads.list())\n .filter((t) => t.projectId === p.projectId && t.providerSessionId)\n .map((t) => t.providerSessionId),\n );\n const out: unknown[] = [];\n for (const provider of listProviders()) {\n if (!provider.listHistory) continue;\n const items = await provider.listHistory(proj.path).catch(() => []);\n for (const i of items) out.push({ ...i, imported: imported.has(i.sessionId) });\n }\n return out;\n }));\n\n gw.method(\"history.import\", wrap(\n z.object({\n projectId: z.string(),\n items: z.array(z.object({ provider: z.string(), sessionId: z.string(), title: z.string().optional() })).min(1).max(20),\n }),\n async (p) => {\n const proj = await svc.projects.get(p.projectId);\n if (!proj) throw new ApiError(\"not_found\", tr(\"err.projectMissing\"));\n const metas = [];\n for (const item of p.items) {\n const provider = getProvider(item.provider);\n if (!provider?.readHistory) continue;\n // Idempotent: reuse if the same providerSessionId was already imported\n const existing = (await svc.threads.list()).find(\n (t) => t.projectId === p.projectId && t.provider === item.provider && t.providerSessionId === item.sessionId,\n );\n if (existing) { metas.push(existing); continue; }\n const meta = await svc.threads.create({\n projectId: p.projectId,\n provider: item.provider,\n title: item.title,\n providerSessionId: item.sessionId,\n importedFrom: { provider: item.provider, sessionId: item.sessionId },\n });\n const events = await provider.readHistory(item.sessionId, proj.path).catch(() => []);\n for (const ev of events) {\n await svc.threads.appendEvent(meta.id, ev as Parameters<typeof svc.threads.appendEvent>[1]);\n }\n await svc.threads.patch(meta.id, { status: \"closed\" });\n gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: await svc.threads.get(meta.id) });\n metas.push(await svc.threads.get(meta.id));\n }\n return metas;\n }\n ));\n\n // ---- terminal.* (§7.5) ----\n gw.method(\"terminal.list\", wrap(z.object({ projectId: z.string().optional() }).passthrough().optional(), (p) =>\n svc.terminals.list(p?.projectId)\n ));\n\n gw.method(\"terminal.create\", wrap(\n z.object({ projectId: z.string(), cols: z.number().int().min(20).max(500).default(80), rows: z.number().int().min(5).max(200).default(24) }),\n async (p) => {\n const path = await projectPath(p.projectId);\n const r = await svc.terminals.create(p.projectId, path, p.cols, p.rows);\n if (\"error\" in r) throw new ApiError(\"bad_params\", r.error);\n return r;\n }\n ));\n\n gw.method(\"terminal.attach\", wrap(z.object({ id: z.string() }), async (p, ctx) => {\n const r = svc.terminals.attach(p.id);\n if (r.error || r.index == null) throw new ApiError(\"not_found\", r.error ?? tr(\"err.terminalMissing\"));\n // attach also subscribes to the terminal:<index> channel (input frames are gated on that subscription too)\n svc.gateway.subscribe(ctx.conn, `terminal:${r.index}`);\n return r;\n }));\n\n gw.method(\"terminal.resize\", wrap(z.object({ id: z.string(), cols: z.number().int(), rows: z.number().int() }), (p) =>\n svc.terminals.resize(p.id, p.cols, p.rows)\n ));\n\n gw.method(\"terminal.kill\", wrap(z.object({ id: z.string() }), (p) => svc.terminals.kill(p.id)));\n\n // ---- thread.* (runtime operations, need the manager) ----\n const needManager = () => {\n if (!svc.manager) throw new ApiError(\"unavailable\", tr(\"err.noManager\"));\n return svc.manager;\n };\n\n gw.method(\"thread.send\", wrap(\n z.object({\n id: z.string(),\n text: z.string(),\n attachments: z.array(z.object({ path: z.string(), mime: z.string(), name: z.string().optional() })).optional(),\n behavior: z.enum([\"queue\", \"steer\"]).optional(),\n }),\n async (p) => {\n // delivered tells the composer what happened: a steer an Agent can't take is queued (B7)\n const delivered = await needManager().send(p.id, { text: p.text, attachments: p.attachments }, p.behavior ?? \"queue\");\n return { ok: true, delivered: delivered ?? \"started\" };\n }\n ));\n\n // The composer's queue list has a remove button; it used to call a method that didn't exist\n gw.method(\"thread.queueRemove\", wrap(z.object({ id: z.string(), queueId: z.string() }), async (p) => {\n return { ok: needManager().removeQueued(p.id, p.queueId) };\n }));\n\n gw.method(\"thread.interrupt\", wrap(z.object({ id: z.string() }), async (p) => {\n await needManager().interrupt(p.id);\n return { ok: true };\n }));\n\n gw.method(\"thread.respond\", wrap(\n z.object({\n id: z.string(),\n requestId: z.string(),\n optionId: z.string().optional(),\n answers: z.record(z.string(), z.string()).optional(),\n cancelled: z.boolean().optional(),\n }),\n async (p) => {\n await needManager().respond(p.id, p.requestId, { optionId: p.optionId, answers: p.answers, cancelled: p.cancelled });\n return { ok: true };\n }\n ));\n\n gw.method(\"thread.setModel\", wrap(z.object({ id: z.string(), model: z.string().nullable() }), async (p) => {\n await needManager().setModel(p.id, p.model);\n return { ok: true };\n }));\n\n gw.method(\"thread.setMode\", wrap(z.object({ id: z.string(), mode: threadModeSchema }), async (p) => {\n await needManager().setMode(p.id, p.mode);\n return { ok: true };\n }));\n\n gw.method(\"thread.setEffort\", wrap(z.object({ id: z.string(), effort: z.string().nullable() }), async (p) => {\n await needManager().setEffort(p.id, p.effort);\n return { ok: true };\n }));\n\n gw.method(\"thread.commands\", wrap(z.object({ id: z.string(), load: z.boolean().optional() }), async (p) => {\n const commands = await needManager().listCommands(p.id, { load: p.load });\n return { commands };\n }));\n\n gw.method(\"thread.setCursorOpts\", wrap(\n z.object({\n id: z.string(),\n cursorFast: z.boolean().optional(),\n cursorAutoReview: z.boolean().optional(),\n }),\n async (p) => {\n await needManager().setCursorOpts(p.id, {\n cursorFast: p.cursorFast,\n cursorAutoReview: p.cursorAutoReview,\n });\n return { ok: true };\n },\n ));\n\n gw.method(\"thread.setProvider\", wrap(z.object({ id: z.string(), provider: z.string().min(1) }), async (p) => {\n await needManager().setProvider(p.id, p.provider);\n return { ok: true };\n }));\n\n gw.method(\"thread.close\", wrap(z.object({ id: z.string() }), async (p) => {\n await needManager().close(p.id);\n return { ok: true };\n }));\n\n // ---- thread.exportMarkdown (P2-7): persisted events → Markdown text ----\n gw.method(\"thread.exportMarkdown\", wrap(z.object({ id: z.string() }), async (p) => {\n const meta = await svc.threads.get(p.id);\n if (!meta) throw new ApiError(\"not_found\", tr(\"err.threadMissing\"));\n const events = await svc.threads.readEvents(p.id, 0, 20000);\n const L: string[] = [];\n L.push(`# ${meta.title}`, \"\");\n L.push(`> ${meta.provider} · ${meta.model ?? tr(\"export.defaultModel\")} · ${meta.mode} · ${new Date(meta.createdAt).toLocaleString(intlLocale())}`, \"\");\n for (const e of events) {\n switch (e.type) {\n case \"user_message\": L.push(`**${tr(\"export.me\")}**${e.steered ? tr(\"export.steered\") : \"\"}:\\n\\n${e.text}`, \"\"); break;\n case \"assistant_message\": L.push(e.text, \"\"); break;\n case \"reasoning\": L.push(`<details><summary>${tr(\"export.reasoning\")}</summary>\\n\\n${e.text}\\n</details>`, \"\"); break;\n case \"tool_call\": {\n const icon = e.status === \"ok\" ? \"✓\" : e.status === \"failed\" ? \"✗\" : \"…\";\n L.push(`- \\`${e.kind}\\` ${icon} ${e.title}${e.output ? `\\n \\`\\`\\`\\n ${e.output.slice(0, 2000)}\\n \\`\\`\\`` : \"\"}`);\n break;\n }\n case \"plan\": L.push(`### ${tr(\"export.plan\")}\\n\\n` + e.markdown, \"\"); break;\n case \"todo\": L.push(`### ${tr(\"export.todo\")}\\n\\n` + e.items.map((i) => `- [${i.status === \"done\" || i.status === \"completed\" ? \"x\" : \" \"}] ${i.text}`).join(\"\\n\"), \"\"); break;\n case \"notice\": L.push(`_${e.message}_`, \"\"); break;\n case \"turn_ended\": L.push(`— ${e.status}${e.durationMs ? ` · ${Math.round(e.durationMs / 1000)}s` : \"\"}${e.error ? ` · ${e.error}` : \"\"} —`, \"\"); break;\n default: break;\n }\n }\n const markdown = L.join(\"\\n\");\n const safe = meta.title.replace(/[\\\\/:*?\"<>|\\s]+/g, \"_\").slice(0, 60) || \"thread\";\n const filename = `${safe}.md`;\n // ~/Downloads when it can be used, else <data>/exports (B21); the file is revealed with execFile (no shell)\n let dir = join(homedir(), \"Downloads\");\n try {\n await mkdir(dir, { recursive: true });\n } catch {\n dir = join(svc.cfg.dataDir, \"exports\");\n await mkdir(dir, { recursive: true });\n }\n let dest = join(dir, filename);\n if (existsSync(dest)) {\n const stamp = new Date().toISOString().replace(/[:.]/g, \"-\").slice(0, 19);\n dest = join(dir, `${safe}-${stamp}.md`);\n }\n await writeFile(dest, markdown, \"utf8\");\n revealInFileManager(dest);\n return { markdown, filename, path: dest };\n }));\n}\n\nfunction revealInFileManager(filePath: string): void {\n if (process.platform === \"win32\") {\n execFile(\"explorer.exe\", [\"/select,\" + win32Path.normalize(filePath)], { windowsHide: true }, () => {}).on(\"error\", () => {});\n return;\n }\n if (process.platform === \"darwin\") {\n execFile(\"open\", [\"-R\", filePath], () => {}).on(\"error\", () => {});\n return;\n }\n execFile(\"xdg-open\", [dirname(filePath)], () => {}).on(\"error\", () => {});\n}\n","// Atomic JSON write: temp file + rename. On fs failure throws an ApiError with a Chinese message (P5-2: disk write failure notice).\nimport { writeFile, rename, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { ApiError } from \"../ws/methods.js\";\n\nexport async function writeJsonAtomic(file: string, obj: unknown): Promise<void> {\n try {\n await mkdir(dirname(file), { recursive: true });\n const tmp = `${file}.tmp-${process.pid}-${Math.random().toString(36).slice(2, 8)}`;\n await writeFile(tmp, JSON.stringify(obj, null, 2), \"utf8\");\n await rename(tmp, file);\n } catch (e) {\n if (e instanceof ApiError) throw e;\n throw new ApiError(\"io_error\", `写入数据失败(${file}):${(e as Error)?.message ?? e}`);\n }\n}\n","// settings.json: defaults per EXEC §5.6; unknown fields are preserved on read.\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport { writeJsonAtomic } from \"../util/atomic.js\";\n\nexport type Settings = {\n defaultProvider: string;\n defaultMode: \"plan\" | \"default\" | \"acceptEdits\" | \"bypassPermissions\" | \"ask\";\n sendKey: \"enter\" | \"ctrlEnter\";\n runningSend: \"queue\" | \"steer\";\n showThinking: boolean;\n theme: \"auto\" | \"light\" | \"dark\";\n idleCloseMinutes: number;\n collapsedProjects: string[];\n panel: { open: boolean; tab: string; width: number };\n sidebarWidth: number;\n lastProjectId: string | null;\n lastThreadId: string | null;\n recentDirs?: string[];\n v1Migrated?: boolean;\n /** false = turned off by the user in settings; absent means on */\n providerEnabled?: Record<string, boolean>;\n /** Advanced: override how a Provider is launched (executable + args array, no shell) */\n providerCommand?: Record<string, { executable?: string; args?: string[] }>;\n [k: string]: unknown;\n};\n\nexport const DEFAULT_SETTINGS: Settings = {\n defaultProvider: \"claude\",\n defaultMode: \"default\",\n sendKey: \"enter\",\n runningSend: \"queue\",\n showThinking: true,\n theme: \"auto\",\n idleCloseMinutes: 30,\n collapsedProjects: [],\n panel: { open: false, tab: \"changes\", width: 440 },\n sidebarWidth: 248,\n lastProjectId: null,\n lastThreadId: null,\n recentDirs: [],\n};\n\nexport const IDLE_CLOSE_MIN = 5;\nexport const IDLE_CLOSE_MAX = 240;\n\nconst mode = z.enum([\"plan\", \"default\", \"acceptEdits\", \"bypassPermissions\", \"ask\"]);\nconst id = z.string().min(1).max(200);\n/** B18: what settings.set accepts. Every key the UI writes is listed; anything else or a wrong type is refused. */\nexport const settingsPatchSchema = z\n .object({\n defaultProvider: z.string().min(1).max(64),\n defaultMode: mode,\n sendKey: z.enum([\"enter\", \"ctrlEnter\"]),\n runningSend: z.enum([\"queue\", \"steer\"]),\n showThinking: z.boolean(),\n // auto = follow the host: Magpie's light/dark inside Magpie, the OS outside it\n theme: z.enum([\"auto\", \"light\", \"dark\"]),\n idleCloseMinutes: z.number().int().min(IDLE_CLOSE_MIN).max(IDLE_CLOSE_MAX),\n collapsedProjects: z.array(id).max(1000),\n panel: z.object({ open: z.boolean(), tab: z.string().max(40), width: z.number().min(0).max(5000) }).partial(),\n sidebarWidth: z.number().min(0).max(5000),\n lastProjectId: id.nullable(),\n lastThreadId: id.nullable(),\n recentDirs: z.array(z.string().max(4096)).max(50),\n providerEnabled: z.record(z.string().max(64), z.boolean()),\n providerCommand: z.record(\n z.string().max(64),\n z.object({ executable: z.string().max(4096).optional(), args: z.array(z.string().max(4096)).max(64).optional() }).strict(),\n ),\n v1Migrated: z.boolean(),\n })\n .partial()\n .strict();\n\nexport type SettingsPatch = z.infer<typeof settingsPatchSchema>;\n\n/** Validate a patch from the page; returns the parsed patch or a readable error. */\nexport function parseSettingsPatch(patch: unknown): { ok: true; patch: SettingsPatch } | { ok: false; error: string } {\n const r = settingsPatchSchema.safeParse(patch);\n if (r.success) return { ok: true, patch: r.data };\n return {\n ok: false,\n error: r.error.issues.map((i) => `${i.path.join(\".\") || \"(patch)\"}: ${i.message}`).join(\"; \"),\n };\n}\n\n/** Values in settings.json that have the wrong type (hand edits, older builds) fall back to the default; unknown keys are kept. */\nexport function sanitizeStored(raw: Record<string, unknown>): Record<string, unknown> {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return {};\n const shape = settingsPatchSchema.shape as Record<string, z.ZodType>;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(raw)) {\n const field = shape[k];\n if (field && k !== \"idleCloseMinutes\" && !field.safeParse(v).success) continue;\n if (k === \"idleCloseMinutes\") {\n const n = Number(v);\n if (!Number.isFinite(n)) continue;\n out[k] = Math.min(IDLE_CLOSE_MAX, Math.max(IDLE_CLOSE_MIN, Math.round(n)));\n continue;\n }\n out[k] = v;\n }\n return out;\n}\n\nexport class SettingsStore {\n private file: string;\n private cache: Settings | null = null;\n private writing: Promise<void> = Promise.resolve();\n constructor(dataDir: string) {\n this.file = join(dataDir, \"settings.json\");\n }\n async get(): Promise<Settings> {\n if (this.cache) return this.cache;\n let raw: Record<string, unknown> = {};\n try {\n raw = JSON.parse(await readFile(this.file, \"utf8\"));\n } catch {}\n raw = sanitizeStored(raw);\n this.cache = { ...DEFAULT_SETTINGS, ...raw, panel: { ...DEFAULT_SETTINGS.panel, ...(raw.panel as object | undefined) } };\n return this.cache;\n }\n async set(patch: Partial<Settings>): Promise<Settings> {\n const cur = await this.get();\n const next = { ...cur, ...patch, panel: { ...cur.panel, ...(patch.panel as object | undefined) } };\n this.cache = next;\n const snap = next;\n this.writing = this.writing.then(() => writeJsonAtomic(this.file, snap));\n await this.writing;\n return next;\n }\n}\n","// JSONL read/write: serialized appends, corrupt lines skipped. Write failures throw an ApiError with a Chinese message (P5-2: disk write failure notice).\nimport { appendFile, readFile, mkdir, rename, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { ApiError } from \"../ws/methods.js\";\n\nexport async function readJsonl<T = unknown>(file: string): Promise<T[]> {\n let text = \"\";\n try {\n text = await readFile(file, \"utf8\");\n } catch {\n return [];\n }\n const out: T[] = [];\n for (const line of text.split(\"\\n\")) {\n const t = line.trim();\n if (!t) continue;\n try {\n out.push(JSON.parse(t) as T);\n } catch {\n // Skip corrupt lines\n }\n }\n return out;\n}\n\n// One serialized write queue per file to keep append order.\nconst writers = new Map<string, Promise<void>>();\n\nexport function appendJsonl(file: string, obj: unknown): Promise<void> {\n const prev = writers.get(file) ?? Promise.resolve();\n const next = prev.then(async () => {\n try {\n await mkdir(dirname(file), { recursive: true });\n await appendFile(file, JSON.stringify(obj) + \"\\n\", \"utf8\");\n } catch (e) {\n if (e instanceof ApiError) throw e;\n throw new ApiError(\"io_error\", `写入数据失败(${file}):${(e as Error)?.message ?? e}`);\n }\n });\n writers.set(\n file,\n next.catch(() => {})\n );\n return next;\n}\n\n// Full rewrite (rare path, e.g. cleanup)\nexport async function writeJsonl(file: string, items: unknown[]): Promise<void> {\n try {\n await mkdir(dirname(file), { recursive: true });\n const tmp = file + \".tmp-\" + process.pid;\n await writeFile(tmp, items.map((o) => JSON.stringify(o)).join(\"\\n\") + (items.length ? \"\\n\" : \"\"), \"utf8\");\n await rename(tmp, file);\n } catch (e) {\n if (e instanceof ApiError) throw e;\n throw new ApiError(\"io_error\", `写入数据失败(${file}):${(e as Error)?.message ?? e}`);\n }\n}\n","// Legacy data migration (§10.1): runs once when the daemon starts.\n// Old: sessions/<id>/{meta.json,events.jsonl} + projects in settings.json →\n// New: projects.json + threads/<id>/{meta.json,timeline.jsonl}. Old files are read-only and copied to trash/legacy-<ts>/ as a backup.\nimport { cp, mkdir, readdir, readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { SettingsStore } from \"../store/settings.js\";\nimport type { ProjectsStore } from \"../store/projects.js\";\nimport type { ThreadsStore, ThreadMeta } from \"../store/threads.js\";\nimport type { Mode, TimelineEvent } from \"../timeline/types.js\";\nimport { appendJsonl } from \"../util/jsonl.js\";\nimport { writeJsonAtomic } from \"../util/atomic.js\";\nimport { validId } from \"../util/paths.js\";\nimport { log } from \"../log.js\";\n\ntype OldMeta = {\n id: string; agent: string; cwd: string; model: string; permission: string;\n title: string; titleAuto: boolean; pinned: boolean; cliSessionId: string | null;\n created: number; updated: number; lastStatus?: string; totalCost?: number; totalUsage?: { inputTokens?: number; outputTokens?: number; cacheReadTokens?: number } | null;\n};\ntype OldEvt = Record<string, unknown> & { type: string; seq?: number; ts?: number };\n\nconst SKIP_TITLE = /^\\/(slow|deny|error|long|codex)/;\nconst MODE_MAP: Record<string, Mode> = {\n plan: \"plan\", default: \"default\", acceptEdits: \"acceptEdits\", bypassPermissions: \"bypassPermissions\",\n auto: \"acceptEdits\", full: \"bypassPermissions\",\n};\nconst belongsTo = (cwd: string, parent: string) => {\n const c = cwd.replace(/\\\\/g, \"/\").toLowerCase().replace(/\\/+$/, \"\");\n const p = parent.replace(/\\\\/g, \"/\").toLowerCase().replace(/\\/+$/, \"\");\n return c === p || c.startsWith(p + \"/\");\n};\n\nfunction stamp(): string {\n const d = new Date();\n const p = (n: number) => String(n).padStart(2, \"0\");\n return `${d.getFullYear()}${p(d.getMonth() + 1)}${p(d.getDate())}-${p(d.getHours())}${p(d.getMinutes())}`;\n}\n\nexport async function migrateLegacy(dataDir: string, stores: {\n settings: SettingsStore; projects: ProjectsStore; threads: ThreadsStore;\n}): Promise<{ migrated: number; skipped: boolean }> {\n const settings = await stores.settings.get();\n if (settings.v1Migrated) return { migrated: 0, skipped: true };\n const oldDir = join(dataDir, \"sessions\");\n const oldSettingsPath = join(dataDir, \"settings.json\");\n if (!existsSync(oldDir) && !existsSync(oldSettingsPath)) {\n await stores.settings.set({ v1Migrated: true });\n return { migrated: 0, skipped: true };\n }\n\n // 1. Backup\n const backup = join(dataDir, \"trash\", `legacy-${stamp()}`);\n await mkdir(backup, { recursive: true });\n if (existsSync(oldDir)) await cp(oldDir, join(backup, \"sessions\"), { recursive: true }).catch(() => {});\n if (existsSync(oldSettingsPath)) await cp(oldSettingsPath, join(backup, \"settings.json\")).catch(() => {});\n\n // Read the old settings (read the file directly; SettingsStore already loaded the same path, the fields coexist without conflict)\n const oldSettings = existsSync(oldSettingsPath)\n ? (JSON.parse(await readFile(oldSettingsPath, \"utf8\").catch(() => \"{}\")) as Record<string, unknown>)\n : {};\n\n // 2. Projects: old settings.projects → projects.json; orphan cwds are added per the adoptOrphans rule\n const projectIdByPath = new Map<string, string>();\n const lc = (p: string) => p.replace(/\\\\/g, \"/\").toLowerCase().replace(/\\/+$/, \"\");\n for (const p of (oldSettings.projects as { name?: string; path?: string }[] | undefined) ?? []) {\n if (!p?.path) continue;\n try {\n const proj = await stores.projects.create(p.path, p.name);\n projectIdByPath.set(lc(proj.path), proj.id);\n } catch (e) {\n log(\"warn\", \"迁移:建项目失败\", { path: p.path, err: String(e) });\n }\n }\n\n // Old session list\n let sessionIds: string[] = [];\n try {\n sessionIds = (await readdir(oldDir)).filter((d) => validId(d) && existsSync(join(oldDir, d, \"meta.json\")));\n } catch {}\n const metas: OldMeta[] = [];\n for (const id of sessionIds) {\n try {\n const m = JSON.parse(await readFile(join(oldDir, id, \"meta.json\"), \"utf8\")) as OldMeta;\n if (m?.cwd) metas.push(m);\n } catch {}\n }\n // Orphan cwd → add a project (subdirectories fold into their parent)\n const extraDirs: string[] = [];\n const projPaths = [...projectIdByPath.keys()];\n for (const m of metas) {\n const covered = projPaths.some((pp) => belongsTo(m.cwd, pp)) || extraDirs.some((d) => belongsTo(m.cwd, d));\n if (covered) continue;\n for (let i = extraDirs.length - 1; i >= 0; i--) if (belongsTo(extraDirs[i], m.cwd)) extraDirs.splice(i, 1);\n extraDirs.push(m.cwd);\n }\n for (const d of extraDirs) {\n if (!existsSync(d)) continue; // Skip directories that no longer exist (same as the old adoptOrphans)\n try {\n const name = d.replace(/\\\\/g, \"/\").split(\"/\").filter(Boolean).pop() ?? d;\n const proj = await stores.projects.create(d, name);\n projectIdByPath.set(lc(proj.path), proj.id);\n projPaths.push(lc(proj.path));\n } catch (e) {\n log(\"warn\", \"迁移:补建孤儿项目失败\", { path: d, err: String(e) });\n }\n }\n\n const projectOf = (cwd: string): string | null => {\n const l = lc(cwd);\n // Take the longest match (a subdirectory joins the most specific project)\n let best: string | null = null;\n for (const [pp, id] of projectIdByPath) {\n if (belongsTo(l, pp) && (best == null || pp.length > best.length)) best = pp;\n }\n return best ? projectIdByPath.get(best)! : null;\n };\n\n // 3. Sessions\n let migrated = 0;\n const threadsDir = join(dataDir, \"threads\");\n for (const m of metas) {\n try {\n const projectId = projectOf(m.cwd);\n if (!projectId) { log(\"warn\", \"迁移:无项目可归,跳过\", { id: m.id, cwd: m.cwd }); continue; }\n const testTitle = SKIP_TITLE.test(m.title ?? \"\") || m.title === \"默认剧本演示\";\n const provider = m.agent === \"claude\" || m.agent === \"codex\" ? m.agent : \"mock\";\n const archived = testTitle || (m.agent !== \"claude\" && m.agent !== \"codex\");\n const now = Date.now();\n const meta: ThreadMeta = {\n id: `t_${m.id.replace(/^s?_?/, \"\")}`.slice(0, 80),\n projectId,\n title: m.title || \"旧对话\",\n titleAuto: false,\n provider,\n model: m.model || null,\n mode: MODE_MAP[m.permission] ?? \"default\",\n effort: null,\n providerSessionId: m.cliSessionId || null,\n status: \"closed\",\n pinned: !!m.pinned,\n archived,\n createdAt: m.created || now,\n updatedAt: m.updated || now,\n lastTurnStatus: m.lastStatus === \"ok\" ? \"completed\" : m.lastStatus === \"error\" ? \"failed\" : null,\n usage: {\n inputTokens: m.totalUsage?.inputTokens ?? 0,\n outputTokens: m.totalUsage?.outputTokens ?? 0,\n cacheReadTokens: m.totalUsage?.cacheReadTokens ?? 0,\n costUsd: m.totalCost ?? 0,\n },\n importedFrom: m.cliSessionId ? { provider, sessionId: m.cliSessionId } : undefined,\n seq: 0,\n };\n const tdir = join(threadsDir, meta.id);\n if (existsSync(tdir)) meta.id = `t_${m.id}_v1`.slice(0, 80);\n await mkdir(join(threadsDir, meta.id), { recursive: true });\n\n // Event mapping\n const oldEvts = (await readFile(join(oldDir, m.id, \"events.jsonl\"), \"utf8\").catch(() => \"\"))\n .split(\"\\n\").filter((l) => l.trim())\n .map((l) => { try { return JSON.parse(l) as OldEvt; } catch { return null; } })\n .filter((x): x is OldEvt => !!x);\n const lines: TimelineEvent[] = [];\n const openTools = new Map<string, { kind: string; title: string; input?: unknown; detail?: unknown }>();\n let seq = 0;\n const push = (ev: Record<string, unknown> & { type: TimelineEvent[\"type\"] }) => {\n seq++;\n lines.push({ ...ev, seq, ts: Date.now(), threadId: meta.id } as TimelineEvent);\n };\n for (const e of oldEvts) {\n switch (e.type) {\n case \"user\": push({ type: \"user_message\", text: String(e.text ?? \"\") }); break;\n case \"text\": push({ type: \"assistant_message\", itemId: `lg_${seq}`, text: String(e.text ?? \"\") }); break;\n case \"thinking\": push({ type: \"reasoning\", itemId: `lg_${seq}`, text: String(e.text ?? \"\") }); break;\n case \"tool.call\": {\n const key = String(e.itemId ?? e.callId ?? `c${seq}`);\n openTools.set(key, { kind: String(e.kind ?? \"other\"), title: String(e.title ?? e.kind ?? \"工具\"), input: e.input, detail: e.detail });\n push({ type: \"tool_call\", itemId: key, kind: \"other\", title: String(e.title ?? \"工具\"), status: \"running\", input: e.input, detail: e.detail });\n break;\n }\n case \"tool.result\": {\n const key = String(e.itemId ?? e.callId ?? `c${seq}`);\n const open = openTools.get(key);\n openTools.delete(key);\n push({\n type: \"tool_call\", itemId: key,\n kind: (open?.kind ?? \"other\") as import(\"../timeline/types.js\").ToolKind,\n title: open?.title ?? \"工具\",\n status: e.ok === false || e.error ? \"failed\" : \"ok\",\n output: typeof e.output === \"string\" ? e.output.slice(0, 20000) : undefined,\n detail: open?.detail,\n } as Record<string, unknown> & { type: \"tool_call\" });\n break;\n }\n case \"todo\": {\n const items = (e.items as { text?: string; status?: string }[] | undefined) ?? [];\n push({ type: \"todo\", items: items.map((i) => ({ text: String(i.text ?? \"\"), status: i.status === \"done\" ? \"done\" : i.status === \"in_progress\" ? \"in_progress\" : \"todo\" })) });\n break;\n }\n case \"permission.denied\": push({ type: \"notice\", level: \"warn\", message: `已拒绝:${String(e.title ?? e.kind ?? \"\")}` }); break;\n case \"permission.request\": case \"permission.resolved\": break; // Old permission cards are stale; don't recreate them\n case \"notice\": push({ type: \"notice\", level: (e.level as \"info\" | \"warn\" | \"error\") ?? \"info\", message: String(e.message ?? \"\") }); break;\n case \"run.end\": {\n const u = e.usage as { inputTokens?: number; outputTokens?: number; cacheReadTokens?: number } | undefined;\n if (u) push({ type: \"usage\", turnId: `lg_t${seq}`, inputTokens: u.inputTokens ?? 0, outputTokens: u.outputTokens ?? 0, cacheReadTokens: u.cacheReadTokens ?? 0, costUsd: (e.costUsd as number) ?? 0 });\n push({ type: \"turn_ended\", turnId: `lg_t${seq}`, status: e.status === \"error\" ? \"failed\" : e.status === \"interrupted\" ? \"interrupted\" : \"completed\", durationMs: (e.ms as number) ?? undefined, error: e.error as string | undefined });\n break;\n }\n case \"run.start\": break;\n case \"init\": break;\n default: break;\n }\n }\n // Unclosed tool.call → mark failed\n for (const [key, o] of openTools) {\n seq++;\n lines.push({ type: \"tool_call\", itemId: key, kind: \"other\", title: o.title, status: \"failed\", seq, ts: Date.now(), threadId: meta.id } as TimelineEvent);\n }\n for (const ev of lines) await appendJsonl(join(threadsDir, meta.id, \"timeline.jsonl\"), ev);\n meta.seq = seq;\n await writeJsonAtomic(join(threadsDir, meta.id, \"meta.json\"), meta);\n migrated++;\n } catch (e) {\n log(\"warn\", \"迁移:会话失败\", { id: m.id, err: String(e) });\n }\n }\n\n // 4. Merge settings (UI preference fields only)\n const patch: Record<string, unknown> = { v1Migrated: true };\n if (typeof oldSettings.theme === \"string\") patch.theme = oldSettings.theme;\n if (typeof oldSettings.sendKey === \"string\") patch.sendKey = oldSettings.sendKey;\n if (typeof oldSettings.showThinking === \"boolean\") patch.showThinking = oldSettings.showThinking;\n if (typeof oldSettings.defaultAgent === \"string\") patch.defaultProvider = oldSettings.defaultAgent === \"claude\" || oldSettings.defaultAgent === \"codex\" ? oldSettings.defaultAgent : \"claude\";\n if (typeof oldSettings.defaultPermission === \"string\") patch.defaultMode = MODE_MAP[oldSettings.defaultPermission] ?? \"default\";\n await stores.settings.set(patch);\n\n log(\"info\", `旧数据迁移完成:${migrated} 个会话、${projectIdByPath.size} 个项目,备份在 ${backup}`);\n return { migrated, skipped: false };\n}\n","// Startup warm-up: for enabled, non-planned Providers, detect then fetch models; results go into infoCache.\nimport type { Settings } from \"../store/settings.js\";\nimport { listProviders } from \"./registry.js\";\nimport { catalogById } from \"./catalog.js\";\nimport { isProviderEnabled } from \"./enabled.js\";\nimport { cachedDetect, cachedModels } from \"./infoCache.js\";\n\nexport async function warmProviderCache(settings: Settings): Promise<void> {\n await Promise.all(\n listProviders().map(async (p) => {\n if (!isProviderEnabled(settings, p.id) || catalogById(p.id)?.status === \"planned\") return;\n const det = await cachedDetect(p);\n if (det.available) await cachedModels(p);\n }),\n );\n}\n","// Daemon entry: parse arguments, initialize services, start HTTP+WS, write daemon.json, handle exit.\nimport { mkdirSync, existsSync, rmSync, chmodSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parseConfig } from \"./config.js\";\nimport { initLog, log } from \"./log.js\";\nimport { createHttpServer } from \"./http.js\";\nimport { AttachmentStore } from \"./store/attachments.js\";\nimport { SettingsStore } from \"./store/settings.js\";\nimport { ProjectsStore } from \"./store/projects.js\";\nimport { ThreadsStore } from \"./store/threads.js\";\nimport { Gateway } from \"./ws/gateway.js\";\nimport { registerMethods } from \"./ws/methods.js\";\nimport { writeJsonAtomic } from \"./util/atomic.js\";\nimport { initProviders } from \"./providers/registry.js\";\nimport { AgentManager } from \"./agents/manager.js\";\nimport { GitService } from \"./git/service.js\";\nimport { FileService } from \"./files/service.js\";\nimport { TerminalService } from \"./terminal/service.js\";\nimport { augmentPath, pidAlive } from \"./util/proc.js\";\n\n// The bundle targets node20: an older Node (or being started by Bun by mistake) gets a clear message instead of crashing on some API\nconst nodeMajor = Number(/^v?(\\d+)/.exec(process.versions.node ?? \"\")?.[1] ?? 0);\nif (nodeMajor < 20) {\n console.error(`[agent-console] 需要 Node.js 20 或更高版本,当前 ${process.version}(${process.execPath})`);\n process.exit(3);\n}\n\n// Agent CLI .js entries and the Claude SDK look up \"node\" by name; GUI apps launched from the macOS Dock get a minimal PATH,\n// so append the current node's directory and common install directories to PATH (existing order unchanged)\nprocess.env.PATH = augmentPath(process.env, dirname(process.execPath));\n\nconst cfg = parseConfig(process.argv.slice(2));\n\n// Top-level safety net: log, don't exit\nprocess.on(\"uncaughtException\", (e) => {\n // A console write after the host's pipe closed (EPIPE) is expected while exiting, not a crash worth logging\n if ((e as NodeJS.ErrnoException)?.code === \"EPIPE\") return;\n log(\"error\", \"uncaughtException\", { err: String(e?.stack ?? e) });\n});\nprocess.on(\"unhandledRejection\", (e) => {\n log(\"error\", \"unhandledRejection\", { err: String(e) });\n});\n\nasync function main(): Promise<void> {\n initLog(cfg.dataDir);\n for (const d of [\"threads\", \"attachments\", \"trash\", \"logs\"]) {\n mkdirSync(join(cfg.dataDir, d), { recursive: true });\n }\n\n const appDir = join(dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"app\");\n const attachments = new AttachmentStore(join(cfg.dataDir, \"attachments\"));\n const { bindAttachmentStore } = await import(\"./util/attachmentRefs.js\");\n bindAttachmentStore(attachments);\n const settings = new SettingsStore(cfg.dataDir);\n const projects = new ProjectsStore(cfg.dataDir);\n const threads = new ThreadsStore(cfg.dataDir);\n const gateway = new Gateway(cfg);\n\n initProviders(cfg.version);\n // Legacy data migration (§10.1): runs once, skipped after v1Migrated; old files are read-only\n const { migrateLegacy } = await import(\"./migrate/legacy.js\");\n try {\n await migrateLegacy(cfg.dataDir, { settings, projects, threads });\n } catch (e) {\n log(\"error\", \"旧数据迁移失败\", { err: String(e) });\n }\n const manager = new AgentManager(gateway, threads, projects, settings, attachments);\n await manager.recoverOnStart();\n const terminals = new TerminalService(gateway);\n registerMethods(gateway, {\n cfg,\n settings,\n gateway,\n projects,\n threads,\n manager,\n git: new GitService(),\n files: new FileService(),\n terminals,\n runtime: (id) => manager.runtimeInfo(id),\n });\n\n const server = createHttpServer(cfg, appDir, attachments, {\n onUpgrade: (req, socket, head) => gateway.handleUpgrade(req, socket, head),\n });\n\n // Retry 5 times if the port is in use\n let attempts = 0;\n await new Promise<void>((resolveListen, rejectListen) => {\n const tryListen = () => {\n attempts++;\n server.once(\"error\", (e: NodeJS.ErrnoException) => {\n if (e.code === \"EADDRINUSE\" && attempts < 6) {\n log(\"warn\", `端口 ${cfg.port} 被占用,500ms 后重试(第 ${attempts} 次)`);\n setTimeout(tryListen, 500);\n } else {\n rejectListen(e);\n }\n });\n server.listen(cfg.port, \"127.0.0.1\");\n };\n server.once(\"listening\", () => resolveListen());\n tryListen();\n }).catch((e) => {\n log(\"error\", `端口 ${cfg.port} 无法监听`, { err: String(e) });\n process.exit(2);\n });\n\n // --port 0: after listening on a random port, write the actual port back into cfg.port. Host/Origin checks read cfg.port,\n // and no request can arrive before this (listen has only just completed), so there is no window checking against the old port.\n const bound = server.address();\n if (bound && typeof bound === \"object\") cfg.port = bound.port;\n // Ready line: the plugin host reads this line from stdout to learn the actual port (port and pid only, no token)\n process.stdout.write(JSON.stringify({ agentConsoleReady: true, port: cfg.port, pid: process.pid }) + \"\\n\");\n // Background warm-up: after start, pull detection/models for enabled providers into the cache so the first page open doesn't wait\n void (async () => {\n const { warmProviderCache } = await import(\"./providers/warm.js\");\n await warmProviderCache(await settings.get());\n })().catch((e) => log(\"warn\", \"Provider 预热失败\", { err: String(e) }));\n\n const daemonJsonPath = join(cfg.dataDir, \"daemon.json\");\n await writeJsonAtomic(daemonJsonPath, {\n pid: process.pid,\n port: cfg.port,\n token: cfg.token,\n version: cfg.version,\n buildStamp: cfg.buildStamp,\n startedAt: Date.now(),\n });\n chmodSync(daemonJsonPath, 0o600);\n log(\"info\", `daemon 已启动 端口 ${cfg.port} 数据目录 ${cfg.dataDir} 版本 ${cfg.version} pid ${process.pid}`);\n // Standalone dev mode: print the open URL with the token to the console (console only, never the log file)\n // B20: standalone (dev) runs only: the token goes to an interactive terminal, never to a redirected stdout or a log\n if (!cfg.parentPid) {\n console.log(process.stdout.isTTY\n ? `[agent-console] open http://127.0.0.1:${cfg.port}/#t=${cfg.token}`\n : `[agent-console] listening on http://127.0.0.1:${cfg.port}/ (token not printed: stdout is not a terminal)`);\n }\n\n // Idle exit: check every minute; no WS connection + no running conversation + no open terminal → exit after idleExitMinutes\n let idleSince = Date.now();\n setInterval(() => {\n const busy = gateway.connectionCount > 0 || manager.anyBusy() || terminals.count > 0;\n if (busy) idleSince = Date.now();\n if (Date.now() - idleSince > cfg.idleExitMinutes * 60 * 1000) {\n log(\"info\", \"空闲超时,daemon 退出\");\n shutdown(0);\n }\n }, 60 * 1000).unref();\n\n let shuttingDown = false;\n function shutdown(code: number): void {\n if (shuttingDown) return;\n shuttingDown = true;\n log(\"info\", \"daemon 关闭中\");\n terminals.killAll();\n gateway.closeAll();\n try {\n rmSync(daemonJsonPath, { force: true });\n } catch {}\n // Wait for Agent sessions to close cleanly (at most 2.5 s) before exiting; process trees still alive are cleaned up by util/bin's exit hook\n const sessionsClosed = Promise.race([manager.shutdown(), new Promise((r) => setTimeout(r, 2500))]);\n void sessionsClosed.then(() => server.close(() => process.exit(code)));\n setTimeout(() => process.exit(code), 4000).unref();\n }\n process.on(\"SIGINT\", () => shutdown(0));\n process.on(\"SIGTERM\", () => shutdown(0));\n // Lifeline: when spawned by the plugin host (Magpie's Bun plugin process) we get --parent-pid, and stdin is a pipe the host holds.\n // Host exits (normally or killed) → pipe closes → stdin end/close → exit;\n // also check every 2 seconds whether the parent is still alive, in case stdin was inherited by another process and never closed.\n // Not enabled in standalone dev mode (npm run dev, no --parent-pid); there we rely on idle exit only.\n if (cfg.parentPid) {\n const parentPid = cfg.parentPid;\n const parentWatch = setInterval(() => {\n if (!pidAlive(parentPid)) {\n clearInterval(parentWatch);\n log(\"info\", `父进程 ${parentPid} 已退出,daemon 跟随退出`);\n shutdown(0);\n }\n }, 2000);\n parentWatch.unref();\n // Logged so a daemon that went away with its plugin host (Magpie restarting it) can be told from an idle exit\n // 'end' and 'close' both fire when the pipe goes away: handle it once\n let lifelineGone = false;\n const lifelineClosed = () => {\n if (lifelineGone) return;\n lifelineGone = true;\n log(\"info\", \"plugin host closed the lifeline (stdin); daemon exiting with it\");\n shutdown(0);\n };\n process.stdin.on(\"end\", lifelineClosed);\n process.stdin.on(\"close\", lifelineClosed);\n process.stdin.on(\"error\", lifelineClosed);\n process.stdin.resume();\n }\n}\n\nmain().catch((e) => {\n console.error(\"[agent-console] 启动失败\", e);\n process.exit(1);\n});\n","// Arguments and environment: port, dataDir, token, version, idleExitMinutes\nimport { randomBytes } from \"node:crypto\";\nimport { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { daemonBuildStamp } from \"./util/buildStamp.js\";\n\nexport type Config = {\n port: number;\n dataDir: string;\n token: string;\n version: string;\n idleExitMinutes: number;\n buildStamp: string;\n parentPid?: number;\n};\n\nfunction pkgVersion(): string {\n try {\n const here = dirname(fileURLToPath(import.meta.url));\n // dist/main.js → ../../package.json; src/main.ts also ends up in dist via esbuild\n const pkg = JSON.parse(readFileSync(join(here, \"..\", \"..\", \"package.json\"), \"utf8\"));\n return String(pkg.version || \"0.0.0\");\n } catch {\n return \"0.0.0\";\n }\n}\n\n// --data <dir> sets the data root (equivalent to setting XDG_CONFIG_HOME and then joining magpie/agent-console?\n// EXEC §5.2: --data <dir> (data root, equivalent to setting XDG_CONFIG_HOME; default $XDG_CONFIG_HOME\n// or ~/.config, then joined with magpie/agent-console). i.e. the --data value has XDG_CONFIG_HOME semantics.\nexport function parseConfig(argv: string[]): Config {\n let port: number | null = null;\n let data: string | null = null;\n let token: string | null = null;\n let parentPid: number | undefined;\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n if (a === \"--port\" && argv[i + 1]) port = Number(argv[++i]);\n else if (a.startsWith(\"--port=\")) port = Number(a.slice(7));\n else if (a === \"--data\" && argv[i + 1]) data = argv[++i];\n else if (a.startsWith(\"--data=\")) data = a.slice(7);\n else if (a === \"--token\" && argv[i + 1]) token = argv[++i];\n else if (a.startsWith(\"--token=\")) token = a.slice(8);\n else if (a === \"--parent-pid\" && argv[i + 1]) parentPid = Number(argv[++i]);\n else if (a.startsWith(\"--parent-pid=\")) parentPid = Number(a.slice(13));\n }\n if (port == null || !Number.isInteger(port) || port < 0 || port > 65535) {\n const envPort = Number(process.env.AGENT_CONSOLE_PORT || \"\");\n port = Number.isInteger(envPort) && envPort >= 0 && envPort <= 65535 ? envPort : 3488;\n }\n const xdg = data ?? process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\");\n const dataDir = resolve(join(xdg, \"magpie\", \"agent-console\"));\n const idleEnv = Number(process.env.AGENT_CONSOLE_IDLE_EXIT_MIN || \"\");\n return {\n port,\n dataDir,\n token: token ?? process.env.AGENT_CONSOLE_TOKEN ?? randomBytes(16).toString(\"hex\"),\n version: pkgVersion(),\n idleExitMinutes: Number.isFinite(idleEnv) && idleEnv > 0 ? idleEnv : 60,\n buildStamp: daemonBuildStamp(),\n parentPid: Number.isInteger(parentPid) ? parentPid : undefined,\n };\n}\n","import { existsSync, statSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nfunction resolveDaemonMainJs(): string | null {\n const self = fileURLToPath(import.meta.url);\n const norm = self.replace(/\\\\/g, \"/\");\n // esbuild single-file bundle: the whole package is dist/main.js\n if (norm.endsWith(\"/daemon/dist/main.js\") || norm.endsWith(\"/dist/main.js\")) return self;\n\n const here = dirname(self);\n const candidates = [\n join(here, \"..\", \"..\", \"dist\", \"main.js\"), // src/util → daemon/dist/main.js (vitest/tsc)\n join(here, \"main.js\"), // Already in the dist directory\n join(here, \"..\", \"main.js\"),\n ];\n for (const p of candidates) {\n if (existsSync(p)) return p;\n }\n return null;\n}\n\n/** mtime of daemon/dist/main.js, used by the plugin to detect code updates and restart the process */\nexport function daemonBuildStamp(): string {\n try {\n const mainJs = resolveDaemonMainJs();\n if (!mainJs) return \"0\";\n return String(statSync(mainJs).mtimeMs);\n } catch {\n return \"0\";\n }\n}\n","// HTTP routes: / → app/index.html (no token), static assets, /api/ping, /api/upload, /attachments/*\nimport { createServer, type IncomingMessage, type ServerResponse, type Server } from \"node:http\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join, normalize, extname } from \"node:path\";\nimport { checkHost, classifyOrigin, tokenEqual } from \"./security.js\";\nimport type { Config } from \"./config.js\";\nimport type { AttachmentStore } from \"./store/attachments.js\";\nimport { log } from \"./log.js\";\nimport { tr } from \"./util/i18n.js\";\n\nconst MIME: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".js\": \"text/javascript; charset=utf-8\",\n \".css\": \"text/css; charset=utf-8\",\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".woff2\": \"font/woff2\",\n \".map\": \"application/json\",\n \".json\": \"application/json; charset=utf-8\",\n};\n\nconst MAX_UPLOAD = 50 * 1024 * 1024; // 50MB\nconst MAX_MSG = 200 * 1024; // Ordinary messages: 200KB\n\nexport type HttpHooks = {\n onUpgrade?: (req: IncomingMessage, socket: import(\"node:net\").Socket, head: Buffer) => void;\n};\n\n// A malformed %xx must not become a 500\nfunction safeDecode(s: string): string | null {\n try {\n return decodeURIComponent(s);\n } catch {\n return null;\n }\n}\n\nfunction send(res: ServerResponse, code: number, body: string | Buffer, headers: Record<string, string> = {}): void {\n res.writeHead(code, headers);\n res.end(body);\n}\n\nfunction sendJson(res: ServerResponse, code: number, obj: unknown, headers: Record<string, string> = {}): void {\n send(res, code, JSON.stringify(obj), { \"content-type\": \"application/json; charset=utf-8\", \"cache-control\": \"no-store\", ...headers });\n}\n\n// Common headers for static responses: no caching (the page has no token, but don't let old versions linger), no sniffing, no Referer\nconst STATIC_HEADERS: Record<string, string> = {\n \"cache-control\": \"no-store\",\n \"x-content-type-options\": \"nosniff\",\n \"referrer-policy\": \"no-referrer\",\n};\n\nexport function createHttpServer(cfg: Config, appDir: string, attachments: AttachmentStore, hooks: HttpHooks = {}): Server {\n const server = createServer(async (req, res) => {\n try {\n await route(req, res);\n } catch (e) {\n log(\"error\", \"HTTP 处理异常\", { url: req.url, err: String(e) });\n if (!res.headersSent) sendJson(res, 500, { ok: false, e: { code: \"internal\", message: tr(\"http.internal\") } });\n else res.end();\n }\n });\n\n // Origin policy per request (see classifyOrigin in security.ts):\n // foreign (another site) → always 403, even with a token\n // opaque (Origin: null) → may only \"present\" the token on token routes (/api/*, /attachments/*);\n // it confers no trust by itself. Static routes are always refused.\n // none / self → static routes allowed (static files contain no token); token routes still need the token.\n // The CORS header is only given (as null) on responses that carry a valid token + Origin: null; preflight only for /api/upload.\n async function route(req: IncomingMessage, res: ServerResponse): Promise<void> {\n // Host must be loopback + this process's actual port: blocks DNS rebinding (a rebound page's GET carries no Origin)\n const hostCheck = checkHost(req.headers.host, cfg.port);\n if (!hostCheck.ok) {\n sendJson(res, hostCheck.code, { ok: false, e: { code: \"bad_host\", message: hostCheck.message } });\n return;\n }\n const origin = classifyOrigin(req.headers.origin, cfg.port);\n if (origin === \"foreign\") {\n sendJson(res, 403, { ok: false, e: { code: \"bad_origin\", message: tr(\"http.badOrigin\") } });\n return;\n }\n\n const url = new URL(req.url ?? \"/\", `http://127.0.0.1:${cfg.port}`);\n const pathname = url.pathname;\n const isApi = pathname.startsWith(\"/api/\");\n const isAttachment = pathname.startsWith(\"/attachments/\");\n\n // OPTIONS preflight: browsers don't send custom headers on a preflight, so there is no token here.\n // Only allow /api/upload, the one cross-origin POST the frontend really makes, and only for null / our own origin;\n // the preflight itself returns no data, and the real request still has to pass the token check.\n if (req.method === \"OPTIONS\") {\n if (pathname !== \"/api/upload\" || origin === \"none\") {\n sendJson(res, 403, { ok: false, e: { code: \"bad_preflight\", message: tr(\"http.badPreflight\") } });\n return;\n }\n send(res, 204, \"\", {\n \"access-control-allow-origin\": origin === \"opaque\" ? \"null\" : `http://127.0.0.1:${cfg.port}`,\n \"access-control-allow-headers\": \"x-agent-console, content-type\",\n \"access-control-allow-methods\": \"GET, POST, OPTIONS\",\n \"access-control-max-age\": \"600\",\n vary: \"origin\",\n });\n return;\n }\n\n // Token routes: the token is the only authorization\n if (isApi || isAttachment) {\n const headerToken = req.headers[\"x-agent-console\"];\n // Attachments accept ?t= (<img src> can't send custom headers); the API only accepts the header\n const queryToken = isAttachment ? url.searchParams.get(\"t\") : null;\n const validToken =\n (typeof headerToken === \"string\" && tokenEqual(headerToken, cfg.token)) ||\n (typeof queryToken === \"string\" && tokenEqual(queryToken, cfg.token));\n if (!validToken) {\n sendJson(res, 403, { ok: false, e: { code: \"bad_token\", message: tr(\"http.badToken\") } });\n return;\n }\n // In a sandbox iframe (no allow-same-origin) the page's origin is null, so even a same-address fetch is cross-origin:\n // the response needs allow-origin: null to be readable. It's only sent after the token is verified,\n // so any Origin: null page without the token can read nothing.\n if (origin === \"opaque\") {\n res.setHeader(\"access-control-allow-origin\", \"null\");\n res.setHeader(\"vary\", \"origin\");\n }\n if (isApi) {\n await routeApi(req, res, pathname, url);\n return;\n }\n const id = safeDecode(pathname.slice(\"/attachments/\".length));\n const a = id === null ? null : await attachments.get(id);\n if (!a) {\n sendJson(res, 404, { ok: false, e: { code: \"not_found\", message: tr(\"http.noAttachment\") } });\n return;\n }\n const data = await attachments.read(a.id);\n send(res, 200, data ?? Buffer.alloc(0), { ...STATIC_HEADERS, \"content-type\": a.mime });\n return;\n }\n\n // Static assets: refuse Origin: null. Ordinary navigations and <script src>/<link> subresource requests carry no Origin;\n // one with null can only be someone else's sandboxed/data:/file: page doing a fetch — give it nothing, and no CORS headers.\n if (origin === \"opaque\") {\n sendJson(res, 403, { ok: false, e: { code: \"bad_origin\", message: tr(\"http.badOrigin\") } });\n return;\n }\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n sendJson(res, 405, { ok: false, e: { code: \"method\", message: tr(\"http.method\") } });\n return;\n }\n if (pathname === \"/\" || pathname === \"/index.html\") {\n // The token is no longer injected into the page: the plugin gate hands it to the frontend in the #t= fragment (see lib/gate.mjs)\n try {\n const html = await readFile(join(appDir, \"index.html\"), \"utf8\");\n send(res, 200, html, { ...STATIC_HEADERS, \"content-type\": \"text/html; charset=utf-8\" });\n } catch {\n send(res, 503, tr(\"http.noApp\"), { ...STATIC_HEADERS, \"content-type\": \"text/plain; charset=utf-8\" });\n }\n return;\n }\n // Other static files must be inside app/\n const decoded = safeDecode(pathname);\n if (decoded === null) {\n sendJson(res, 400, { ok: false, e: { code: \"bad_path\", message: tr(\"http.badPath\") } });\n return;\n }\n const rel = normalize(decoded).replace(/^([\\\\/])+/, \"\");\n const full = normalize(join(appDir, rel));\n if (!full.startsWith(normalize(appDir)) || rel.includes(\"..\")) {\n sendJson(res, 403, { ok: false, e: { code: \"bad_path\", message: tr(\"http.pathDenied\") } });\n return;\n }\n if (!existsSync(full) || !(await stat(full)).isFile()) {\n sendJson(res, 404, { ok: false, e: { code: \"not_found\", message: tr(\"http.noFile\") } });\n return;\n }\n const data = await readFile(full);\n send(res, 200, data, { ...STATIC_HEADERS, \"content-type\": MIME[extname(full).toLowerCase()] ?? \"application/octet-stream\" });\n }\n\n async function routeApi(req: IncomingMessage, res: ServerResponse, pathname: string, url: URL): Promise<void> {\n if (pathname === \"/api/ping\" && req.method === \"GET\") {\n sendJson(res, 200, { ok: true, version: cfg.version, port: cfg.port, pid: process.pid, dataDir: cfg.dataDir, buildStamp: cfg.buildStamp });\n return;\n }\n if (pathname === \"/api/upload\" && req.method === \"POST\") {\n const name = url.searchParams.get(\"name\") ?? \"\";\n if (!attachments.allowedExt(name)) {\n sendJson(res, 400, { ok: false, e: { code: \"bad_type\", message: tr(\"http.badType\") } });\n return;\n }\n // The declared size is already over the limit: reject without reading the body\n const declared = Number(req.headers[\"content-length\"] ?? 0);\n if (declared > MAX_UPLOAD) {\n res.setHeader(\"connection\", \"close\");\n sendJson(res, 413, { ok: false, e: { code: \"too_large\", message: tr(\"http.tooLarge\") } });\n req.resume();\n return;\n }\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const c of req) {\n const b = c as Buffer;\n size += b.length;\n if (size > MAX_UPLOAD) {\n res.setHeader(\"connection\", \"close\");\n sendJson(res, 413, { ok: false, e: { code: \"too_large\", message: tr(\"http.tooLarge\") } });\n return;\n }\n chunks.push(b);\n }\n const a = await attachments.save(name, Buffer.concat(chunks));\n sendJson(res, 200, { ok: true, id: a.id, name: a.name, mime: a.mime, size: a.size });\n return;\n }\n sendJson(res, 404, { ok: false, e: { code: \"not_found\", message: tr(\"http.noRoute\") } });\n }\n\n if (hooks.onUpgrade) {\n server.on(\"upgrade\", hooks.onUpgrade);\n }\n return server;\n}\n\nexport { sendJson, MAX_MSG };\n","// Host / Origin / token checks (timingSafeEqual).\n//\n// Security model (after the PR #535 review):\n// - Host is checked on every HTTP request and WS upgrade and must be 127.0.0.1:<actual port> or localhost:<actual port>,\n// to block DNS rebinding (requests from a rebound page carry no Origin, so only Host identifies them).\n// - Origin: null (opaque origin) is not trusted. Any website can send Origin: null from a sandboxed iframe, a data: or a file: page,\n// so null by itself means nothing. The token is the only authorization:\n// * token routes (/api/*, /attachments/*, WS hello) let a null origin \"present\" the token,\n// because Magpie's plugin page is a sandbox=\"allow-scripts\" iframe and can only request as null;\n// * static routes (/, app.js etc.) always 403 for null and send no CORS headers.\n// - Any other website's Origin is refused, even with the correct token.\nimport { timingSafeEqual, createHash } from \"node:crypto\";\n\nexport type CheckResult = { ok: true } | { ok: false; code: number; message: string };\n\n// none: no Origin (ordinary navigation, <script src>, non-browser local clients)\n// self: this daemon's own origin (opened directly in a browser during development)\n// opaque: Origin: null — untrusted, may only present the token on token routes\n// foreign: any other origin — always refused\nexport type OriginClass = \"none\" | \"self\" | \"opaque\" | \"foreign\";\n\n// Host must be 127.0.0.1:<port> or localhost:<port> (the IPv6 loopback form [::1] is not allowed, per the requirements).\n// port must be the actual listening port (with --port 0, main.ts writes it back after listen).\nexport function checkHost(host: string | undefined, port: number): CheckResult {\n if (!host) return { ok: false, code: 421, message: \"Host 不对\" };\n const h = host.toLowerCase();\n if (h === `127.0.0.1:${port}` || h === `localhost:${port}`) return { ok: true };\n return { ok: false, code: 421, message: \"Host 不对\" };\n}\n\nexport function classifyOrigin(origin: string | undefined, port: number): OriginClass {\n if (origin === undefined || origin === \"\") return \"none\";\n if (origin === \"null\") return \"opaque\";\n const o = origin.toLowerCase();\n if (o === `http://127.0.0.1:${port}` || o === `http://localhost:${port}`) return \"self\";\n return \"foreign\";\n}\n\nexport function tokenEqual(a: string, b: string): boolean {\n // Constant-time compare against timing attacks; different lengths are hashed to the same length first.\n const ha = createHash(\"sha256\").update(a).digest();\n const hb = createHash(\"sha256\").update(b).digest();\n return timingSafeEqual(ha, hb);\n}\n","// Attachments: write uploaded files to disk, look up paths by id.\nimport { writeFile, mkdir, stat, readFile } from \"node:fs/promises\";\nimport { join, extname } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { validId } from \"../util/paths.js\";\n\nconst IMG_EXT = new Set([\".png\", \".jpg\", \".jpeg\", \".gif\", \".webp\"]);\nconst TEXT_EXT = new Set([\".txt\", \".md\", \".log\", \".json\", \".csv\", \".xml\", \".yaml\", \".yml\", \".html\", \".css\", \".js\", \".ts\", \".py\", \".toml\", \".ini\", \".conf\"]);\nconst MIME: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n};\n\nexport type Attachment = { id: string; name: string; mime: string; size: number; path: string };\n\n// Text attachments are declared UTF-8 so Chinese text isn't garbled when opened in a browser (nosniff + text/plain, so HTML is never executed)\nconst TEXT_MIME = \"text/plain; charset=utf-8\";\n\nexport class AttachmentStore {\n // id → file name: avoids a readdir of the whole directory on every lookup (slow with many attachments)\n private files = new Map<string, string>();\n constructor(private dir: string) {}\n\n private safeExt(name: string): string | null {\n const ext = extname(name).toLowerCase();\n if (IMG_EXT.has(ext) || TEXT_EXT.has(ext)) return ext;\n if (!ext) return \".txt\";\n return null;\n }\n\n allowedExt(name: string): boolean {\n return this.safeExt(name) !== null;\n }\n\n async save(name: string, data: Buffer): Promise<Attachment> {\n const ext = this.safeExt(name);\n if (!ext) throw new Error(\"不支持的文件类型\");\n const id = \"a_\" + Date.now().toString(36) + randomBytes(3).toString(\"hex\");\n await mkdir(this.dir, { recursive: true });\n const file = join(this.dir, id + ext);\n await writeFile(file, data);\n this.files.set(id, id + ext);\n const mime = MIME[ext] ?? TEXT_MIME;\n return { id, name: name || \"未命名\" + ext, mime, size: data.length, path: file };\n }\n\n async get(id: string): Promise<Attachment | null> {\n if (!validId(id)) return null;\n const known = this.files.get(id);\n if (known) {\n const hit = await this.describe(id, known);\n if (hit) return hit;\n this.files.delete(id);\n }\n const { readdir } = await import(\"node:fs/promises\");\n try {\n for (const f of await readdir(this.dir)) {\n if (f.startsWith(id + \".\")) {\n this.files.set(id, f);\n return await this.describe(id, f);\n }\n }\n } catch {}\n return null;\n }\n\n private async describe(id: string, f: string): Promise<Attachment | null> {\n const p = join(this.dir, f);\n const s = await stat(p).catch(() => null);\n if (!s?.isFile()) return null;\n const ext = extname(f).toLowerCase();\n return { id, name: f.slice(id.length + 1) || f, mime: MIME[ext] ?? TEXT_MIME, size: s.size, path: p };\n }\n\n async read(id: string): Promise<Buffer | null> {\n const a = await this.get(id);\n if (!a) return null;\n return readFile(a.path);\n }\n}\n","// projects.json CRUD\nimport { readFile } from \"node:fs/promises\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { writeJsonAtomic } from \"../util/atomic.js\";\nimport { normPath, validId } from \"../util/paths.js\";\nimport { ApiError } from \"../ws/methods.js\";\n\nexport type Project = { id: string; name: string; path: string; createdAt: number };\n\nfunction newId(): string {\n return \"p_\" + Date.now().toString(36) + randomBytes(3).toString(\"hex\");\n}\n\nexport class ProjectsStore {\n private file: string;\n private cache: Project[] | null = null;\n private writing: Promise<void> = Promise.resolve();\n constructor(dataDir: string) {\n this.file = join(dataDir, \"projects.json\");\n }\n\n async list(): Promise<Project[]> {\n if (this.cache) return this.cache;\n try {\n this.cache = JSON.parse(await readFile(this.file, \"utf8\")) as Project[];\n if (!Array.isArray(this.cache)) this.cache = [];\n } catch {\n this.cache = [];\n }\n return this.cache;\n }\n\n async get(id: string): Promise<Project | null> {\n if (!validId(id)) return null;\n return (await this.list()).find((p) => p.id === id) ?? null;\n }\n\n private async save(list: Project[]): Promise<void> {\n this.cache = list;\n const snap = list;\n this.writing = this.writing.then(() => writeJsonAtomic(this.file, snap));\n await this.writing;\n }\n\n async create(path: string, name?: string): Promise<Project> {\n if (!path || typeof path !== \"string\") throw new ApiError(\"bad_params\", \"路径不能为空\");\n if (!existsSync(path) || !statSync(path).isDirectory()) {\n throw new ApiError(\"bad_path\", \"目录不存在或不是文件夹\");\n }\n const np = normPath(path);\n const list = await this.list();\n const dup = list.find((p) => normPath(p.path) === np);\n if (dup) return dup;\n const proj: Project = {\n id: newId(),\n name: name?.trim() || path.replace(/[\\\\/]+$/, \"\").split(/[\\\\/]/).pop() || path,\n path,\n createdAt: Date.now(),\n };\n list.push(proj);\n await this.save(list);\n return proj;\n }\n\n async rename(id: string, name: string): Promise<Project> {\n const list = await this.list();\n const p = list.find((x) => x.id === id);\n if (!p) throw new ApiError(\"not_found\", \"项目不存在\");\n p.name = name.trim() || p.name;\n await this.save(list);\n return p;\n }\n\n async remove(id: string): Promise<void> {\n const list = await this.list();\n const idx = list.findIndex((x) => x.id === id);\n if (idx < 0) return;\n list.splice(idx, 1);\n await this.save(list);\n }\n}\n","// threads/<id>/meta.json + timeline.jsonl: list, read, append, delete (moved to trash)\nimport { mkdir, rename, readdir, readFile, stat } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { writeJsonAtomic } from \"../util/atomic.js\";\nimport { readJsonl, appendJsonl } from \"../util/jsonl.js\";\nimport { validId } from \"../util/paths.js\";\nimport { ApiError } from \"../ws/methods.js\";\nimport { tr } from \"../util/i18n.js\";\nimport type { Mode } from \"../timeline/types.js\";\nimport type { TimelineEvent } from \"../timeline/types.js\";\n\nexport type ThreadMeta = {\n id: string;\n projectId: string;\n title: string;\n titleAuto: boolean;\n provider: string;\n model: string | null;\n mode: Mode;\n effort: string | null;\n providerSessionId: string | null;\n status: \"initializing\" | \"idle\" | \"running\" | \"error\" | \"closed\";\n pinned: boolean;\n archived: boolean;\n createdAt: number;\n updatedAt: number;\n lastTurnStatus: \"completed\" | \"interrupted\" | \"failed\" | null;\n usage: { inputTokens: number; outputTokens: number; cacheReadTokens: number; costUsd: number };\n importedFrom?: { provider: string; sessionId: string };\n seq: number;\n /** Cursor Agent: lightning Fast mode (model parameter fast=true) */\n cursorFast?: boolean;\n /** Cursor Agent: Auto-review, the client auto-approves safe tool permissions */\n cursorAutoReview?: boolean;\n};\n\nexport type { Mode };\n\nfunction newId(): string {\n return \"t_\" + Date.now().toString(36) + randomBytes(3).toString(\"hex\");\n}\n\nexport class ThreadsStore {\n private dir: string;\n private trashDir: string;\n private metas = new Map<string, ThreadMeta>();\n private loaded = false;\n // Serialize meta writes: concurrent patch/appendEvent would overwrite each other (setStatus/patch/provider_session_id run concurrently in the manager)\n private writeQ: Promise<unknown> = Promise.resolve();\n private serial<T>(fn: () => Promise<T>): Promise<T> {\n const p = this.writeQ.then(fn, fn);\n this.writeQ = p.catch(() => {});\n return p;\n }\n constructor(dataDir: string) {\n this.dir = join(dataDir, \"threads\");\n this.trashDir = join(dataDir, \"trash\", \"threads\");\n }\n\n private tdir(id: string): string {\n return join(this.dir, id);\n }\n private metaPath(id: string): string {\n return join(this.tdir(id), \"meta.json\");\n }\n private timelinePath(id: string): string {\n return join(this.tdir(id), \"timeline.jsonl\");\n }\n\n private async loadAll(): Promise<void> {\n if (this.loaded) return;\n this.loaded = true;\n let ids: string[] = [];\n try {\n ids = (await readdir(this.dir)).filter((d) => validId(d));\n } catch {\n return;\n }\n for (const id of ids) {\n try {\n const m = JSON.parse(await readFile(this.metaPath(id), \"utf8\")) as ThreadMeta;\n if (m && typeof m.id === \"string\") this.metas.set(m.id, m);\n } catch {}\n }\n }\n\n async list(): Promise<ThreadMeta[]> {\n await this.loadAll();\n return [...this.metas.values()].sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n async get(id: string): Promise<ThreadMeta | null> {\n if (!validId(id)) return null;\n await this.loadAll();\n return this.metas.get(id) ?? null;\n }\n\n private async saveMeta(meta: ThreadMeta): Promise<void> {\n this.metas.set(meta.id, meta);\n await writeJsonAtomic(this.metaPath(meta.id), meta);\n }\n\n async create(o: {\n projectId: string;\n provider: string;\n model?: string | null;\n mode?: Mode;\n effort?: string | null;\n title?: string;\n providerSessionId?: string | null;\n importedFrom?: { provider: string; sessionId: string };\n }): Promise<ThreadMeta> {\n const now = Date.now();\n const meta: ThreadMeta = {\n id: newId(),\n projectId: o.projectId,\n title: o.title ?? tr(\"thread.defaultTitle\"),\n titleAuto: o.title == null,\n provider: o.provider,\n model: o.model ?? null,\n mode: o.mode ?? \"default\",\n effort: o.effort ?? null,\n providerSessionId: o.providerSessionId ?? null,\n status: \"idle\",\n pinned: false,\n archived: false,\n createdAt: now,\n updatedAt: now,\n lastTurnStatus: null,\n usage: { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, costUsd: 0 },\n importedFrom: o.importedFrom,\n seq: 0,\n };\n try {\n await mkdir(this.tdir(meta.id), { recursive: true });\n } catch (e) {\n throw new ApiError(\"io_error\", `创建对话目录失败:${(e as Error)?.message ?? e}`);\n }\n await this.saveMeta(meta);\n return meta;\n }\n\n async patch(id: string, patch: Partial<ThreadMeta>): Promise<ThreadMeta> {\n return this.serial(async () => {\n const meta = await this.get(id);\n if (!meta) throw new ApiError(\"not_found\", \"对话不存在\");\n if (patch.title !== undefined && patch.titleAuto === undefined) patch = { ...patch, titleAuto: false };\n const next = { ...meta, ...patch, id: meta.id, updatedAt: Date.now() };\n await this.saveMeta(next);\n return next;\n });\n }\n\n // Append an event: inside the serialized section take meta.seq+1 as seq, write the jsonl and update meta.\n // A passed-in seq is ignored (keeps it strictly increasing); ts/threadId are filled in when missing.\n async appendEvent(id: string, ev: Record<string, unknown> & { type: TimelineEvent[\"type\"] }): Promise<TimelineEvent> {\n return this.serial(async () => {\n const meta = await this.get(id);\n if (!meta) throw new ApiError(\"not_found\", \"对话不存在\");\n const full = {\n ...ev,\n seq: meta.seq + 1,\n ts: ev.ts ?? Date.now(),\n threadId: id,\n } as TimelineEvent;\n await appendJsonl(this.timelinePath(id), full);\n meta.seq = full.seq;\n meta.updatedAt = Date.now();\n this.metas.set(id, meta);\n await writeJsonAtomic(this.metaPath(id), meta);\n return full;\n });\n }\n\n async readEvents(id: string, afterSeq = 0, limit = 5000): Promise<TimelineEvent[]> {\n const rows = await readJsonl<TimelineEvent>(this.timelinePath(id));\n const out = rows.filter((e) => typeof e.seq === \"number\" && e.seq > afterSeq);\n return out.slice(-limit);\n }\n\n async delete(id: string): Promise<void> {\n const meta = await this.get(id);\n if (!meta) return;\n const stamp = new Date()\n .toISOString()\n .replace(/[:.]/g, \"-\")\n .slice(0, 19);\n await mkdir(this.trashDir, { recursive: true });\n // Windows: an Agent process / file handle just closed may not be released yet, so renaming the directory briefly fails with EPERM/EBUSY → retry with backoff\n for (let attempt = 0; ; attempt++) {\n try {\n await rename(this.tdir(id), join(this.trashDir, `${id}-${stamp}`));\n break;\n } catch (e) {\n const code = (e as NodeJS.ErrnoException)?.code;\n if ((code === \"EPERM\" || code === \"EBUSY\" || code === \"EACCES\") && attempt < 8) {\n await new Promise((r) => setTimeout(r, 250 * (attempt + 1)));\n continue;\n }\n throw new ApiError(\"internal\", \"移入回收目录失败:\" + String(e));\n }\n }\n this.metas.delete(id);\n }\n}\n","// WS gateway: hello authentication, request dispatch, subscriptions, heartbeat, binary terminal frames, broadcast.\nimport { WebSocketServer, WebSocket } from \"ws\";\nimport type { IncomingMessage } from \"node:http\";\nimport type { Socket } from \"node:net\";\nimport { createHash, randomBytes, timingSafeEqual } from \"node:crypto\";\nimport type { Config } from \"../config.js\";\nimport { checkHost, classifyOrigin, tokenEqual } from \"../security.js\";\nimport { log } from \"../log.js\";\nimport { setAppLocale } from \"../util/i18n.js\";\n\nexport type MethodHandler = (params: unknown, ctx: ConnCtx) => Promise<unknown> | unknown;\nexport type ConnCtx = { connId: string; conn: Conn };\n\ntype ClientMsg =\n | { t: \"hello\"; token: string; v?: number; lang?: string }\n | { t: \"req\"; id: number; m: string; p?: unknown }\n | { t: \"ping\" };\n\nclass Conn {\n id: string;\n ws: WebSocket;\n authed = false;\n subs = new Set<string>();\n alive = true;\n lastMsg = Date.now();\n constructor(ws: WebSocket) {\n this.id = \"c_\" + randomBytes(4).toString(\"hex\");\n this.ws = ws;\n }\n send(obj: unknown): void {\n if (this.ws.readyState !== WebSocket.OPEN) return;\n try {\n const s = JSON.stringify(obj);\n if (this.overflow(s.length)) {\n log(\"warn\", `连接 ${this.id} 出站缓冲超 8MB,断开`);\n this.ws.close(4000, \"buffer_overflow\");\n return;\n }\n this.ws.send(s);\n } catch {}\n }\n // Look at bytes really still unsent in the socket (only grows when the client is stuck), not the cumulative amount sent\n private overflow(next: number): boolean {\n return this.ws.bufferedAmount + next > 8 * 1024 * 1024;\n }\n sendBinary(frame: Buffer): void {\n if (this.ws.readyState !== WebSocket.OPEN) return;\n if (this.overflow(frame.length)) {\n log(\"warn\", `连接 ${this.id} 出站缓冲超 8MB,断开`);\n this.ws.close(4000, \"buffer_overflow\");\n return;\n }\n try {\n this.ws.send(frame);\n } catch {}\n }\n}\n\nexport class Gateway {\n private wss: WebSocketServer;\n private conns = new Map<string, Conn>();\n private methods = new Map<string, MethodHandler>();\n private helloTimers = new Map<string, NodeJS.Timeout>();\n onTerminalInput?: (conn: Conn, index: number, op: number, payload: Buffer) => void;\n\n constructor(private cfg: Config) {\n this.wss = new WebSocketServer({ noServer: true });\n }\n\n method(name: string, fn: MethodHandler): void {\n this.methods.set(name, fn);\n }\n\n get connectionCount(): number {\n return this.conns.size;\n }\n\n handleUpgrade(req: IncomingMessage, socket: Socket, head: Buffer): void {\n const hostCheck = checkHost(req.headers.host, this.cfg.port);\n if (!hostCheck.ok) {\n socket.write(\"HTTP/1.1 421 Misdirected Request\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n if (classifyOrigin(req.headers.origin, this.cfg.port) === \"foreign\") {\n socket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n const url = new URL(req.url ?? \"/\", `http://127.0.0.1:${this.cfg.port}`);\n if (url.pathname !== \"/ws\") {\n socket.write(\"HTTP/1.1 404 Not Found\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n this.wss.handleUpgrade(req, socket, head, (ws) => this.onConn(ws));\n }\n\n private onConn(ws: WebSocket): void {\n const conn = new Conn(ws);\n this.conns.set(conn.id, conn);\n // The first frame must be hello within 5 seconds\n const timer = setTimeout(() => {\n if (!conn.authed) ws.close(4401, \"auth_timeout\");\n }, 5000);\n this.helloTimers.set(conn.id, timer);\n\n ws.on(\"message\", (data: Buffer | string, isBinary: boolean) => {\n conn.lastMsg = Date.now();\n if (isBinary) {\n this.onBinary(conn, data as Buffer);\n return;\n }\n let msg: ClientMsg;\n try {\n msg = JSON.parse(String(data));\n } catch {\n conn.send({ t: \"res\", id: 0, ok: false, e: { code: \"bad_json\", message: \"消息不是合法 JSON\" } });\n return;\n }\n this.onMessage(conn, msg);\n });\n ws.on(\"close\", () => {\n this.conns.delete(conn.id);\n const t = this.helloTimers.get(conn.id);\n if (t) clearTimeout(t);\n this.helloTimers.delete(conn.id);\n });\n ws.on(\"error\", () => {});\n }\n\n private onMessage(conn: Conn, msg: ClientMsg): void {\n if (msg.t === \"hello\") {\n if (!conn.authed) {\n if (typeof msg.token === \"string\" && tokenEqual(msg.token, this.cfg.token)) {\n conn.authed = true;\n setAppLocale(msg.lang);\n const t = this.helloTimers.get(conn.id);\n if (t) clearTimeout(t);\n conn.send({ t: \"hello.ok\", version: this.cfg.version, serverTime: Date.now() });\n } else {\n conn.send({ t: \"res\", id: 0, ok: false, e: { code: \"bad_token\", message: \"令牌无效\" } });\n conn.ws.close(4401, \"bad_token\");\n }\n }\n return;\n }\n if (msg.t === \"ping\") {\n conn.send({ t: \"pong\" });\n return;\n }\n if (msg.t === \"req\") {\n if (!conn.authed) {\n conn.send({ t: \"res\", id: msg.id, ok: false, e: { code: \"unauthorized\", message: \"未鉴权\" } });\n return;\n }\n void this.dispatch(conn, msg);\n return;\n }\n }\n\n private async dispatch(conn: Conn, msg: { t: \"req\"; id: number; m: string; p?: unknown }): Promise<void> {\n const fn = this.methods.get(msg.m);\n if (!fn) {\n conn.send({ t: \"res\", id: msg.id, ok: false, e: { code: \"not_found\", message: `未知方法 ${msg.m}` } });\n return;\n }\n try {\n const r = await fn(msg.p, { connId: conn.id, conn });\n conn.send({ t: \"res\", id: msg.id, ok: true, r: r ?? null });\n } catch (e) {\n const err = e as { code?: string; message?: string };\n conn.send({\n t: \"res\",\n id: msg.id,\n ok: false,\n e: { code: err.code ?? \"internal\", message: err.message ?? \"服务内部错误\" },\n });\n }\n }\n\n // Terminal binary frame: [op:1][terminalIndex:2 BE][payload]\n private onBinary(conn: Conn, buf: Buffer): void {\n if (buf.length < 3) return;\n const op = buf.readUInt8(0);\n const index = buf.readUInt16BE(1);\n this.onTerminalInput?.(conn, index, op, buf.subarray(3));\n }\n\n publish(ch: string, data: unknown): void {\n for (const c of this.conns.values()) {\n if (c.authed && c.subs.has(ch)) c.send({ t: \"evt\", ch, d: data });\n }\n }\n\n publishTerminal(index: number, payload: Buffer): void {\n const frame = Buffer.concat([Buffer.from([1, (index >> 8) & 0xff, index & 0xff]), payload]);\n for (const c of this.conns.values()) {\n if (c.authed && c.subs.has(`terminal:${index}`)) c.sendBinary(frame);\n }\n }\n\n subscribe(conn: Conn, ch: string): void {\n conn.subs.add(ch);\n }\n unsubscribe(conn: Conn, ch: string): void {\n conn.subs.delete(ch);\n }\n\n closeAll(): void {\n for (const c of this.conns.values()) {\n try {\n c.ws.close(1001, \"server_shutdown\");\n } catch {}\n }\n this.conns.clear();\n }\n}\n\nexport { Conn };\n","// AgentManager (§5.7): conversation runtimes, send/queue/steer/interrupt/permissions, idle recycling, restart recovery.\nimport type { Gateway } from \"../ws/gateway.js\";\nimport type { ThreadsStore, ThreadMeta } from \"../store/threads.js\";\nimport type { ProjectsStore } from \"../store/projects.js\";\nimport type { SettingsStore } from \"../store/settings.js\";\nimport type { AttachmentStore } from \"../store/attachments.js\";\nimport type { Provider, ProviderSession, SendInput, RespondAnswer, Mode, SlashCommand } from \"../providers/types.js\";\nimport { launchFromSettings } from \"../providers/launch.js\";\nimport { clampMode } from \"../providers/modes.js\";\nimport { resolveAttachmentRefs } from \"../util/attachmentRefs.js\";\nimport { getProvider } from \"../providers/registry.js\";\nimport { catalogById, providerCreatable } from \"../providers/catalog.js\";\nimport { isProviderEnabled } from \"../providers/enabled.js\";\nimport { cachedDetect, cachedModels } from \"../providers/infoCache.js\";\nimport type { ProviderEvent, TimelineEvent } from \"../timeline/types.js\";\nimport { Coalescer } from \"../timeline/coalescer.js\";\nimport { ApiError } from \"../ws/methods.js\";\nimport { log } from \"../log.js\";\nimport { tr } from \"../util/i18n.js\";\nimport {\n codexSlashCommandsFromEntries,\n loadCodexSlashEntries,\n} from \"../providers/codex/commands.js\";\n\nconst SLASH_CACHE_TTL_MS = 10 * 60 * 1000;\n/** Idle Agent processes kept warm at most (one per conversation); older idle ones are closed (resumed on the next message) */\nexport const MAX_WARM_IDLE = 3;\n\ntype QueuedMessage = { id: string; text: string; attachments: { path: string; mime: string; name?: string }[] };\ntype PendingRequest = {\n kind: \"permission\" | \"question\";\n requestId: string;\n options: { id: string; label: string; kind: string }[];\n resolve: (a: RespondAnswer) => void;\n event: ProviderEvent;\n};\n\ntype Runtime = {\n threadId: string;\n session: ProviderSession | null;\n status: ThreadMeta[\"status\"];\n currentTurnId: string | null;\n queue: QueuedMessage[];\n pending: Map<string, PendingRequest>;\n allowAlways: Set<string>;\n lastActivity: number;\n coalescer: Coalescer;\n interruptTimer: NodeJS.Timeout | null;\n endedTurnIds: Set<string>; // Turns that already have a turn_ended written (dedupe)\n starting: boolean; // startTurn in progress (session is still null while it is being created)\n commands: SlashCommand[];\n sessionCreating: Promise<ProviderSession> | null;\n /** Text streamed as deltas only (ACP Agents): saved per segment as assistant_message / reasoning (B1) */\n pendingText: Map<string, { type: \"assistant\" | \"reasoning\"; itemId: string; text: string }>;\n deltasOnly: boolean;\n};\n\ntype DeltaType = \"assistant_delta\" | \"reasoning_delta\" | \"tool_output_delta\";\nconst DELTA_TYPES: DeltaType[] = [\"assistant_delta\", \"reasoning_delta\", \"tool_output_delta\"];\n// coalescer key = type + \\u0000 + itemId; the three delta types coalesce separately and are pushed with their original type\nconst deltaKey = (type: DeltaType, itemId: string) => `${type}\\u0000${itemId}`;\n\nexport type SendBehavior = \"queue\" | \"steer\";\n\nexport class AgentManager {\n private runtimes = new Map<string, Runtime>();\n private recycleTimer: NodeJS.Timeout | null = null;\n private slashCache = new Map<string, { commands: SlashCommand[]; expires: number }>();\n\n constructor(\n private gw: Gateway,\n private threads: ThreadsStore,\n private projects: ProjectsStore,\n private settings: SettingsStore,\n private attachments: AttachmentStore,\n ) {}\n\n /** attachment.path in the frontend's thread.send is really an upload id; resolve it to the file under dataDir/attachments */\n private resolveAttachments(refs: { path: string; mime: string; name?: string }[]) {\n return resolveAttachmentRefs(this.attachments, refs);\n }\n\n private attachmentLabels(refs: { path: string; mime: string; name?: string }[]) {\n return refs.map((a) => ({ id: a.path, name: (a.name ?? \"\").trim() || a.path, mime: a.mime }));\n }\n\n // Called at startup: running/initializing conversations are recovered as closed (§5.7.6)\n async recoverOnStart(): Promise<void> {\n for (const meta of await this.threads.list()) {\n if (meta.status === \"running\" || meta.status === \"initializing\") {\n await this.appendRaw(meta.id, {\n type: \"notice\",\n level: \"warn\",\n message: tr(\"notice.daemonRestart\"),\n });\n const events = await this.threads.readEvents(meta.id, 0, 50000);\n // No turn_ended after the last turn_started → append interrupted\n // (Can't use lastTurnStatus: it records the previous turn, not the one that was running)\n // user_message is persisted before turn_started; if the provider never sent turn_started the turn is still open\n let open: string | null = null;\n for (const e of events) {\n if (e.type === \"turn_started\") open = (e as { turnId?: string }).turnId ?? \"unknown\";\n else if (e.type === \"user_message\" && !(e as { steered?: boolean }).steered) open = open ?? \"unknown\";\n else if (e.type === \"turn_ended\") open = null;\n }\n if (open !== null) {\n await this.appendRaw(meta.id, { type: \"turn_ended\", status: \"interrupted\", ...(open && open !== \"unknown\" ? { turnId: open } : {}) } as Partial<TimelineEvent> & { type: \"turn_ended\" });\n }\n // Cancel every unresolved permission request\n const resolved = new Set(\n events.filter((e) => e.type === \"permission_resolved\").map((e) => (e as { requestId: string }).requestId),\n );\n for (const e of events) {\n if (e.type === \"permission_request\" && !resolved.has((e as { requestId: string }).requestId)) {\n await this.appendRaw(meta.id, {\n type: \"permission_resolved\",\n requestId: (e as { requestId: string }).requestId,\n cancelled: true,\n });\n }\n }\n await this.threads.patch(meta.id, { status: \"closed\", lastTurnStatus: \"interrupted\" });\n }\n }\n // Idle recycling every minute\n this.recycleTimer = setInterval(() => void this.recycleIdle(), 60_000);\n this.recycleTimer.unref?.();\n }\n\n /** Close every session; the returned Promise resolves once each close finishes (or fails). Callers add their own timeout. */\n shutdown(): Promise<void> {\n if (this.recycleTimer) clearInterval(this.recycleTimer);\n const all = [...this.runtimes.values()].map((rt) => rt.session?.close().catch(() => {}));\n this.runtimes.clear();\n return Promise.all(all).then(() => {});\n }\n\n // Idle-exit check (§5.2.7): busy if any runtime is not idle\n anyBusy(): boolean {\n for (const rt of this.runtimes.values()) {\n if (rt.status === \"running\" || rt.status === \"initializing\") return true;\n }\n return false;\n }\n\n /** Drop a queued message that hasn't been sent yet (the × on the composer's queue list) */\n removeQueued(threadId: string, queueId: string): boolean {\n const rt = this.runtimes.get(threadId);\n if (!rt) return false;\n const before = rt.queue.length;\n rt.queue = rt.queue.filter((q) => q.id !== queueId);\n if (rt.queue.length === before) return false;\n this.gw.publish(`thread:${threadId}`, { type: \"queue\", queue: rt.queue });\n return true;\n }\n\n runtimeInfo(threadId: string): { status: string; queue: unknown[]; pending: unknown[] } | null {\n const rt = this.runtimes.get(threadId);\n if (!rt) return null;\n return {\n status: rt.status,\n queue: rt.queue,\n pending: [...rt.pending.values()].map((p) => ({\n requestId: p.requestId,\n kind: p.kind,\n options: p.options,\n })),\n };\n }\n\n private rt(threadId: string): Runtime {\n let r = this.runtimes.get(threadId);\n if (!r) {\n r = {\n threadId,\n session: null,\n status: \"idle\",\n currentTurnId: null,\n queue: [],\n pending: new Map(),\n allowAlways: new Set(),\n lastActivity: Date.now(),\n coalescer: this.newCoalescer(threadId),\n interruptTimer: null,\n endedTurnIds: new Set(),\n starting: false,\n commands: [],\n sessionCreating: null,\n pendingText: new Map(),\n deltasOnly: false,\n };\n this.runtimes.set(threadId, r);\n }\n return r;\n }\n\n private newCoalescer(threadId: string): Coalescer {\n return new Coalescer(60, (key, text) => {\n const i = key.indexOf(\"\\u0000\");\n const type = key.slice(0, i) as DeltaType;\n void this.pushEvent(threadId, { type, itemId: key.slice(i + 1), text });\n });\n }\n\n private flushDeltas(rt: Runtime, itemId: string): void {\n for (const t of DELTA_TYPES) rt.coalescer.flushItem(deltaKey(t, itemId));\n }\n\n // ---- send ----\n async send(threadId: string, input: { text: string; attachments?: { path: string; mime: string; name?: string }[] }, behavior: SendBehavior = \"queue\"): Promise<\"started\" | \"steered\" | \"queued\"> {\n const meta = await this.mustThread(threadId);\n if (meta.archived) {\n await this.threads.patch(threadId, { archived: false });\n this.gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: await this.threads.get(threadId) });\n }\n const rt = this.rt(threadId);\n rt.lastActivity = Date.now();\n const attachmentRefs = input.attachments ?? [];\n\n // Closed (crash/recycle/restart recovery) → drop the old session; the next message resumes via providerSessionId\n if (meta.status === \"closed\" && rt.session) {\n try { await rt.session.close(); } catch {}\n rt.session = null;\n rt.commands = [];\n }\n if (!rt.starting && rt.session === null && (rt.status === \"running\" || rt.status === \"initializing\" || rt.status === \"error\")) {\n rt.status = \"idle\";\n }\n\n if (rt.status === \"running\" || rt.starting || rt.status === \"initializing\") {\n const provider = this.providerOf(meta);\n if (behavior === \"steer\" && provider?.capabilities.steer && rt.session?.steer && !rt.starting) {\n try {\n const images = await this.resolveAttachments(attachmentRefs);\n await rt.session.steer({ text: input.text, images });\n await this.appendRaw(threadId, {\n type: \"user_message\",\n text: input.text,\n steered: true,\n attachments: this.attachmentLabels(attachmentRefs),\n });\n return \"steered\";\n } catch (e) {\n // Steering failed (e.g. the turn hasn't really started yet) → fall back to queueing so the message isn't lost\n log(\"info\", `thread ${threadId} 插话失败,改为排队:${String(e)}`);\n }\n }\n const q: QueuedMessage = { id: \"q\" + Date.now().toString(36) + Math.random().toString(36).slice(2, 6), text: input.text, attachments: attachmentRefs };\n rt.queue.push(q);\n this.gw.publish(`thread:${threadId}`, { type: \"queue\", queue: rt.queue });\n return \"queued\";\n }\n\n await this.startTurn(threadId, input.text, attachmentRefs);\n return \"started\";\n }\n\n private async startTurn(threadId: string, text: string, attachmentRefs: { path: string; mime: string; name?: string }[]): Promise<void> {\n const rt = this.rt(threadId);\n rt.starting = true;\n try {\n await this.startTurnInner(threadId, text, attachmentRefs);\n } finally {\n rt.starting = false;\n }\n }\n\n private async startTurnInner(threadId: string, text: string, attachmentRefs: { path: string; mime: string; name?: string }[]): Promise<void> {\n const meta = await this.mustThread(threadId);\n const rt = this.rt(threadId);\n // Conversations that already ran (have a providerSessionId) ignore \"disabled\": disabling only blocks new conversations\n const provider = await this.assertProviderUsable(meta.provider, { allowDisabled: !!meta.providerSessionId });\n\n if (!rt.session) {\n await this.setStatus(threadId, \"initializing\");\n try {\n await this.createSessionIfNeeded(threadId, { updateStatus: true });\n } catch (e) {\n await this.appendRaw(threadId, { type: \"notice\", level: \"error\", message: tr(\"notice.sessionStartFailed\", { detail: String((e as Error)?.message ?? e) }) });\n await this.appendRaw(threadId, { type: \"turn_ended\", status: \"failed\", error: String((e as Error)?.message ?? e) } as Partial<TimelineEvent> & { type: \"turn_ended\" });\n await this.setStatus(threadId, \"error\");\n throw e;\n }\n }\n\n // Auto title\n const trimmed = text.trim();\n if (meta.titleAuto && trimmed) {\n await this.threads.patch(threadId, { title: trimmed.slice(0, 40), titleAuto: true });\n this.gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: await this.threads.get(threadId) });\n }\n await this.appendRaw(threadId, {\n type: \"user_message\",\n text,\n attachments: this.attachmentLabels(attachmentRefs),\n });\n await this.setStatus(threadId, \"running\");\n try {\n const images = await this.resolveAttachments(attachmentRefs);\n await rt.session!.send({ text, images });\n } catch (e) {\n // A failed send must not leave the conversation running\n const msg = String((e as Error)?.message ?? e);\n await this.appendRaw(threadId, { type: \"notice\", level: \"error\", message: tr(\"notice.sendFailed\", { detail: msg }) });\n await this.appendRaw(threadId, { type: \"turn_ended\", status: \"failed\", error: msg } as Partial<TimelineEvent> & { type: \"turn_ended\" });\n await this.threads.patch(threadId, { lastTurnStatus: \"failed\" });\n rt.currentTurnId = null;\n await this.setStatus(threadId, \"idle\");\n throw e;\n }\n }\n\n // ---- event pump ----\n private async pumpEvents(threadId: string, session: ProviderSession): Promise<void> {\n const rt = this.rt(threadId);\n let ended = false;\n try {\n for await (const ev of session.events) {\n await this.onProviderEvent(threadId, ev);\n if (ev.type === \"turn_started\") ended = false; // A new turn started: reset (queued messages reuse the same session event stream)\n if (ev.type === \"turn_ended\") ended = true;\n }\n } catch (e) {\n log(\"warn\", `thread ${threadId} 事件流异常:${String(e)}`);\n }\n if (!ended && this.rt(threadId).session === session) {\n // Session exited unexpectedly: append failed\n await this.onProviderEvent(threadId, {\n type: \"turn_ended\",\n turnId: rt.currentTurnId ?? \"unknown\",\n status: \"failed\",\n error: tr(\"turn.agentExit\"),\n });\n rt.session = null;\n await this.setStatus(threadId, \"closed\");\n }\n }\n\n private async onProviderEvent(threadId: string, ev: ProviderEvent): Promise<void> {\n const rt = this.rt(threadId);\n rt.lastActivity = Date.now();\n\n if (ev.type === \"provider_session_id\") {\n await this.threads.patch(threadId, { providerSessionId: ev.id });\n return;\n }\n if (ev.type === \"slash_commands\") {\n rt.commands = ev.commands;\n const meta = await this.mustThread(threadId);\n const proj = await this.projects.get(meta.projectId);\n if (proj) this.putSlashCache(meta.provider, proj.path, ev.commands);\n this.gw.publish(`thread:${threadId}`, { type: \"commands\", commands: ev.commands });\n return;\n }\n if (ev.type === \"turn_started\") {\n rt.currentTurnId = ev.turnId;\n await this.appendRaw(threadId, ev);\n return;\n }\n if (ev.type === \"assistant_delta\" || ev.type === \"reasoning_delta\" || ev.type === \"tool_output_delta\") {\n // Goes through the coalescer, not persisted; Agents that never send the complete message get it saved from the deltas\n if (rt.deltasOnly && ev.type !== \"tool_output_delta\") {\n const key = `${ev.type === \"assistant_delta\" ? \"assistant\" : \"reasoning\"}\\0${ev.itemId}`;\n const prior = rt.pendingText.get(key);\n rt.pendingText.set(key, { type: ev.type === \"assistant_delta\" ? \"assistant\" : \"reasoning\", itemId: ev.itemId, text: (prior?.text ?? \"\") + ev.text });\n }\n rt.coalescer.push(deltaKey(ev.type, ev.itemId), ev.text);\n return;\n }\n // Before persisting a complete event, flush that itemId's pending deltas first (keeps ordering)\n const evItemId = (ev as { itemId?: unknown }).itemId;\n if (typeof evItemId === \"string\") this.flushDeltas(rt, evItemId);\n // Another item starts (tool call, plan, permission …) or the turn ends: the text streamed so far is complete, save it first\n if (rt.pendingText.size && ev.type !== \"usage\" && ev.type !== \"assistant_message\" && ev.type !== \"reasoning\") {\n await this.persistPendingText(threadId, rt);\n }\n if (ev.type === \"assistant_message\" || ev.type === \"reasoning\") {\n rt.pendingText.delete(`${ev.type === \"assistant_message\" ? \"assistant\" : \"reasoning\"}\\0${ev.itemId}`);\n await this.appendRaw(threadId, ev);\n return;\n }\n if (ev.type === \"usage\") {\n const meta = await this.mustThread(threadId);\n const u = meta.usage;\n await this.threads.patch(threadId, {\n usage: {\n inputTokens: u.inputTokens + ev.inputTokens,\n outputTokens: u.outputTokens + ev.outputTokens,\n cacheReadTokens: u.cacheReadTokens + ev.cacheReadTokens,\n costUsd: u.costUsd + ev.costUsd,\n },\n });\n await this.pushEvent(threadId, ev); // Pushing without persisting would also work; persisted so it can be reviewed later\n return;\n }\n if (ev.type === \"permission_request\" || ev.type === \"question\") {\n const options = ev.type === \"permission_request\" ? ev.options : [];\n const pending: PendingRequest = {\n kind: ev.type === \"permission_request\" ? \"permission\" : \"question\",\n requestId: ev.requestId,\n options,\n resolve: () => {},\n event: ev,\n };\n // allowAlways hit → approve directly\n const toolName = (ev as { detail?: { toolName?: string } }).detail?.toolName;\n if (toolName && rt.allowAlways.has(toolName)) {\n rt.session?.respond(ev.requestId, { optionId: \"accept\" });\n return;\n }\n rt.pending.set(ev.requestId, pending);\n await this.appendRaw(threadId, ev);\n return;\n }\n if (ev.type === \"permission_resolved\" || ev.type === \"question_answered\") {\n // The manager already persisted it (respond / interrupt) → drop the provider's echo to avoid duplicates\n if (!rt.pending.delete(ev.requestId)) return;\n await this.appendRaw(threadId, ev);\n return;\n }\n if (ev.type === \"turn_ended\") {\n // End a turn only once (drop a late one from the provider after the interrupt fallback already ended it)\n if (ev.turnId && ev.turnId !== \"unknown\" && rt.endedTurnIds.has(ev.turnId)) return;\n if (rt.interruptTimer) {\n clearTimeout(rt.interruptTimer);\n rt.interruptTimer = null;\n }\n if (ev.turnId && ev.turnId !== \"unknown\") rt.endedTurnIds.add(ev.turnId);\n rt.coalescer.dispose();\n rt.coalescer = this.newCoalescer(threadId);\n await this.appendRaw(threadId, ev);\n await this.threads.patch(threadId, { lastTurnStatus: ev.status });\n rt.currentTurnId = null;\n // After a failure/crash the session is dead (mock /exit) → clear it\n if (ev.status === \"failed\" && rt.session && !this.alive(rt.session)) rt.session = null;\n await this.setStatus(threadId, \"idle\");\n // Next queued message\n const next = rt.queue.shift();\n if (!next) void this.recycleIdle().catch(() => {});\n if (next) {\n this.gw.publish(`thread:${threadId}`, { type: \"queue\", queue: rt.queue });\n // A queued message that fails to start is only logged; it must not break the event pump (startTurn already wrote notice/turn_ended)\n await this.startTurn(threadId, next.text, next.attachments).catch((e) => {\n log(\"warn\", `thread ${threadId} 排队消息启动失败:${String(e)}`);\n });\n }\n return;\n }\n // Everything else: persist + push\n await this.appendRaw(threadId, ev);\n }\n\n private async persistPendingText(threadId: string, rt: Runtime): Promise<void> {\n const pending = [...rt.pendingText.values()];\n rt.pendingText.clear();\n for (const p of pending) {\n if (!p.text) continue;\n this.flushDeltas(rt, p.itemId);\n await this.appendRaw(threadId, { type: p.type === \"assistant\" ? \"assistant_message\" : \"reasoning\", itemId: p.itemId, text: p.text });\n }\n }\n\n private alive(_s: ProviderSession): boolean {\n return true; // mock /exit closes the queue; end of the event stream is handled separately\n }\n\n // ---- respond (permission/question answers) ----\n async respond(threadId: string, requestId: string, answer: RespondAnswer): Promise<void> {\n const rt = this.rt(threadId);\n const pending = rt.pending.get(requestId);\n if (!pending) throw new ApiError(\"not_found\", tr(\"err.requestGone\"));\n if (pending.kind === \"permission\" && answer.optionId) {\n const valid = pending.options.some((o) => o.id === answer.optionId);\n if (!valid) throw new ApiError(\"bad_params\", tr(\"err.badOption\", { id: String(answer.optionId) }));\n }\n rt.pending.delete(requestId);\n if (pending.kind === \"permission\") {\n await this.appendRaw(threadId, {\n type: \"permission_resolved\",\n requestId,\n optionId: answer.optionId,\n cancelled: answer.cancelled,\n });\n const opt = pending.options.find((o) => o.id === answer.optionId);\n if (opt?.kind === \"allow_always\") {\n const toolName = (pending.event as { detail?: { toolName?: string } }).detail?.toolName;\n if (toolName) rt.allowAlways.add(toolName);\n }\n } else {\n await this.appendRaw(threadId, {\n type: \"question_answered\",\n requestId,\n answers: answer.answers ?? {},\n });\n }\n rt.session?.respond(requestId, answer);\n }\n\n // ---- interrupt ----\n async interrupt(threadId: string): Promise<void> {\n const rt = this.rt(threadId);\n if (!rt.session || rt.status !== \"running\") return;\n // Invalidate all pending requests\n for (const [id, p] of rt.pending) {\n await this.appendRaw(threadId, { type: \"permission_resolved\", requestId: id, cancelled: true });\n p.resolve({ cancelled: true });\n }\n rt.pending.clear();\n await rt.session.interrupt();\n const turnId = rt.currentTurnId;\n // No turn_ended within 1 second → append interrupted\n // Use the normal turn_ended path: clear currentTurnId, write lastTurnStatus, continue the queue\n rt.interruptTimer = setTimeout(() => {\n rt.interruptTimer = null;\n if (rt.currentTurnId === turnId && turnId) {\n void this.onProviderEvent(threadId, { type: \"turn_ended\", turnId, status: \"interrupted\" }).catch((e) => {\n log(\"warn\", `thread ${threadId} 打断兜底失败:${String(e)}`);\n });\n }\n }, 1000);\n }\n\n // ---- setModel / setMode / setEffort ----\n async setModel(threadId: string, model: string | null): Promise<void> {\n const meta = await this.mustThread(threadId);\n let effort = meta.effort;\n const p = getProvider(meta.provider);\n if (p) {\n const models = await cachedModels(p);\n const row = models.find((m) => (model ? m.id === model : m.isDefault)) ?? models[0];\n const opts = row?.thinkingOptions ?? [];\n if (effort && opts.length && !opts.some((o) => o.id === effort)) {\n effort = null;\n await this.appendRaw(threadId, {\n type: \"notice\",\n level: \"info\",\n message: tr(\"notice.effortResetOnModel\"),\n });\n }\n }\n await this.threads.patch(threadId, { model, effort });\n const rt = this.rt(threadId);\n if (rt.session) await rt.session.setModel(model);\n this.gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: await this.threads.get(threadId) });\n }\n async setMode(threadId: string, mode: Mode): Promise<void> {\n await this.threads.patch(threadId, { mode });\n const rt = this.rt(threadId);\n if (rt.session) await rt.session.setMode(mode);\n this.gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: await this.threads.get(threadId) });\n }\n async setEffort(threadId: string, effort: string | null): Promise<void> {\n const meta = await this.mustThread(threadId);\n await this.threads.patch(threadId, { effort });\n const rt = this.rt(threadId);\n if (rt.session) await rt.session.setEffort(effort);\n if (meta.provider === \"claude\" && (rt.status === \"running\" || rt.status === \"initializing\")) {\n await this.appendRaw(threadId, {\n type: \"notice\",\n level: \"info\",\n message: tr(\"notice.effortNextTurn\"),\n });\n }\n this.gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: await this.threads.get(threadId) });\n }\n\n async setCursorOpts(\n threadId: string,\n patch: { cursorFast?: boolean; cursorAutoReview?: boolean },\n ): Promise<void> {\n const meta = await this.mustThread(threadId);\n if (meta.provider !== \"cursor\") throw new ApiError(\"bad_params\", tr(\"err.cursorOnly\"));\n const next = await this.threads.patch(threadId, patch);\n const rt = this.rt(threadId);\n const sess = rt.session as { updateCursorOpts?(f: boolean, a: boolean): Promise<void> } | null;\n if (sess?.updateCursorOpts) {\n await sess.updateCursorOpts(!!next.cursorFast, !!next.cursorAutoReview);\n }\n this.gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: next });\n }\n\n /** The Agent can be switched only before any user message and while not running */\n async setProvider(threadId: string, providerId: string): Promise<void> {\n await this.mustThread(threadId);\n const meta = await this.threads.get(threadId);\n if (!meta) throw new ApiError(\"not_found\", tr(\"err.threadMissing\"));\n const rt = this.rt(threadId);\n if (rt.status === \"running\" || rt.status === \"initializing\" || rt.starting) {\n throw new ApiError(\"busy\", tr(\"err.busySwitch\"));\n }\n const events = await this.threads.readEvents(threadId, 0, 5000);\n if (events.some((e) => e.type === \"user_message\")) {\n throw new ApiError(\"bad_params\", tr(\"err.hasMessages\"));\n }\n const p = await this.assertProviderUsable(providerId);\n if (rt.session) {\n try {\n await rt.session.close();\n } catch {}\n rt.session = null;\n rt.commands = [];\n }\n rt.status = \"idle\";\n await this.threads.patch(threadId, {\n provider: providerId,\n model: null,\n mode: clampMode(p.capabilities.modes, meta.mode),\n effort: null,\n providerSessionId: null,\n status: \"idle\",\n });\n this.gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: await this.threads.get(threadId) });\n }\n\n async close(threadId: string): Promise<void> {\n const rt = this.rt(threadId);\n if (rt.session) {\n try {\n await rt.session.close();\n } catch {}\n rt.session = null;\n rt.commands = [];\n }\n await this.setStatus(threadId, \"closed\");\n }\n\n /** Slash commands: no session by default; only with load:true do we create a session for providers that need one to list them */\n async listCommands(threadId: string, opts?: { load?: boolean }): Promise<SlashCommand[]> {\n let meta: ThreadMeta;\n try {\n meta = await this.mustThread(threadId);\n } catch {\n return [];\n }\n const rt = this.rt(threadId);\n const proj = await this.projects.get(meta.projectId);\n if (!proj) return [];\n\n if (meta.provider === \"codex\") {\n try {\n const commands = codexSlashCommandsFromEntries(await loadCodexSlashEntries(proj.path));\n rt.commands = commands;\n this.putSlashCache(meta.provider, proj.path, commands);\n return commands;\n } catch {\n return this.getSlashCache(meta.provider, proj.path) ?? rt.commands;\n }\n }\n\n if (rt.session) {\n try {\n const commands = await rt.session.listCommands();\n rt.commands = commands;\n this.putSlashCache(meta.provider, proj.path, commands);\n return commands;\n } catch {\n return rt.commands.length ? rt.commands : (this.getSlashCache(meta.provider, proj.path) ?? []);\n }\n }\n\n const cached = this.getSlashCache(meta.provider, proj.path);\n if (cached) {\n rt.commands = cached;\n return cached;\n }\n\n if (!opts?.load) return [];\n\n try {\n const session = await this.createSessionIfNeeded(threadId, { updateStatus: false });\n const commands = await session.listCommands();\n rt.commands = commands;\n this.putSlashCache(meta.provider, proj.path, commands);\n return commands;\n } catch {\n return [];\n }\n }\n\n private slashCacheKey(provider: string, projectPath: string): string {\n return `${provider}\\u0000${projectPath}`;\n }\n\n private getSlashCache(provider: string, projectPath: string): SlashCommand[] | null {\n const hit = this.slashCache.get(this.slashCacheKey(provider, projectPath));\n if (!hit) return null;\n if (Date.now() > hit.expires) {\n this.slashCache.delete(this.slashCacheKey(provider, projectPath));\n return null;\n }\n return hit.commands;\n }\n\n private putSlashCache(provider: string, projectPath: string, commands: SlashCommand[]): void {\n // Don't cache an empty list: commands often arrive late (async push), and a cached empty result would keep the menu empty for the TTL\n if (!commands.length) return;\n this.slashCache.set(this.slashCacheKey(provider, projectPath), {\n commands,\n expires: Date.now() + SLASH_CACHE_TTL_MS,\n });\n }\n\n private async createSessionIfNeeded(\n threadId: string,\n opts: { updateStatus: boolean },\n ): Promise<ProviderSession> {\n const rt = this.rt(threadId);\n if (rt.session) return rt.session;\n if (rt.sessionCreating) return rt.sessionCreating;\n\n const creating = this.createSessionInner(threadId, opts);\n rt.sessionCreating = creating;\n try {\n return await creating;\n } finally {\n if (rt.sessionCreating === creating) rt.sessionCreating = null;\n }\n }\n\n private async createSessionInner(\n threadId: string,\n opts: { updateStatus: boolean },\n ): Promise<ProviderSession> {\n const meta = await this.mustThread(threadId);\n const rt = this.rt(threadId);\n if (rt.session) return rt.session;\n const provider = await this.assertProviderUsable(meta.provider, { allowDisabled: !!meta.providerSessionId });\n const proj = await this.projects.get(meta.projectId);\n if (!proj) throw new ApiError(\"not_found\", tr(\"err.projectMissing\"));\n let model = meta.model;\n // DSH model IDs come from ACP; old conversations may still hold a model ID from another Agent.\n // Clear that stale value so it isn't sent to the wrong Magpie provider route.\n if (meta.provider === \"dsh\" && model) {\n // Use the cache: listModels spawns a dsh ACP probe process, too wasteful to do for every new session\n const available = await cachedModels(provider).catch(() => []);\n if (available.length && !available.some((m) => m.id === model)) {\n // Prefer DSH's Magpie-routed model so it doesn't fall back to DeepSeek's official model without an API key.\n model = available.find((m) => /magpie/i.test(m.id))?.id ?? available.find((m) => m.isDefault)?.id ?? null;\n await this.threads.patch(threadId, { model });\n this.gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: await this.threads.get(threadId) });\n }\n } else if (meta.provider === \"dsh\" && !model) {\n // No model picked: start dsh on the route a new conversation would use (its ACP takes images only for the route it starts on)\n const available = await cachedModels(provider).catch(() => []);\n const magpie = available.filter((m) => /magpie/i.test(m.id));\n model = (magpie.find((m) => m.isDefault) ?? magpie[0] ?? available.find((m) => m.isDefault))?.id ?? null;\n }\n if (opts.updateStatus) await this.setStatus(threadId, \"initializing\");\n const settings = await this.settings.get();\n const launch = launchFromSettings(settings, meta.provider);\n rt.deltasOnly = !!provider.capabilities.deltasOnly;\n rt.session = await provider.createSession({\n threadId,\n cwd: proj.path,\n model,\n mode: clampMode(provider.capabilities.modes, meta.mode),\n effort: meta.effort,\n resumeId: meta.providerSessionId,\n cursorFast: meta.cursorFast,\n cursorAutoReview: meta.cursorAutoReview,\n launch,\n });\n void this.pumpEvents(threadId, rt.session);\n return rt.session;\n }\n\n async deleteThread(threadId: string): Promise<void> {\n await this.close(threadId);\n this.runtimes.delete(threadId);\n await this.threads.delete(threadId);\n }\n\n // ---- internals ----\n private async mustThread(threadId: string): Promise<ThreadMeta> {\n const meta = await this.threads.get(threadId);\n if (!meta) throw new ApiError(\"not_found\", tr(\"err.threadMissing\"));\n return meta;\n }\n\n private providerOf(meta: ThreadMeta): Provider | undefined {\n return getProvider(meta.provider);\n }\n\n private async assertProviderUsable(providerId: string, opts: { allowDisabled?: boolean } = {}): Promise<Provider> {\n const p = getProvider(providerId);\n if (!p) throw new ApiError(\"bad_params\", tr(\"provider.unknown\", { id: providerId }));\n const s = await this.settings.get();\n if (!opts.allowDisabled && !isProviderEnabled(s, providerId)) {\n throw new ApiError(\"bad_params\", tr(\"provider.disabledNamed\", { name: p.name }));\n }\n const entry = catalogById(providerId);\n if (entry && !providerCreatable(entry.status)) {\n throw new ApiError(\"bad_params\", tr(\"provider.plannedNamed\", { name: p.name }));\n }\n const det = await cachedDetect(p, launchFromSettings(s, providerId));\n if (!det.available) throw new ApiError(\"bad_params\", det.reason ?? tr(\"provider.unavailable\", { name: p.name }));\n return p;\n }\n\n private async setStatus(threadId: string, status: ThreadMeta[\"status\"]): Promise<void> {\n const rt = this.rt(threadId);\n rt.status = status;\n const meta = await this.threads.patch(threadId, { status });\n this.gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: meta });\n this.gw.publish(`thread:${threadId}`, { type: \"status\", status }); // Frontend running state / timer / send button\n }\n\n // Append an event: seq is assigned in the store's serialized section, persisted, then pushed to thread:<id>\n private async appendRaw(threadId: string, ev: Record<string, unknown> & { type: TimelineEvent[\"type\"] }): Promise<void> {\n const full = await this.threads.appendEvent(threadId, { ...ev, ts: Date.now() });\n this.gw.publish(`thread:${threadId}`, { type: \"event\", event: full });\n }\n\n // Push without persisting (for coalescer deltas; usage is already accumulated above).\n // Unpersisted events take no seq: seq=-1 so the frontend dedupes only by persisted seq,\n // otherwise deltas would push the client's maxSeq up and the following persisted events would be dropped by mistake.\n private async pushEvent(threadId: string, ev: Record<string, unknown> & { type: TimelineEvent[\"type\"] }): Promise<void> {\n const full = { ...ev, seq: -1, ts: Date.now(), threadId } as TimelineEvent;\n this.gw.publish(`thread:${threadId}`, { type: \"event\", event: full });\n }\n\n /** B17: idle Agent processes are closed after idleCloseMinutes, and at most MAX_WARM_IDLE of them stay warm\n * (least recently used go first). A running turn, one starting, or one waiting on an approval is never touched. */\n private recycling = false;\n async recycleIdle(): Promise<void> {\n if (this.recycling) return;\n this.recycling = true;\n try {\n const s = await this.settings.get();\n const minutes = Number(s.idleCloseMinutes);\n const limit = (Number.isFinite(minutes) && minutes > 0 ? minutes : 30) * 60_000;\n const idle = [...this.runtimes.values()]\n .filter((rt) => rt.session && rt.status === \"idle\" && !rt.starting && !rt.sessionCreating && rt.pending.size === 0 && rt.queue.length === 0)\n .sort((a, b) => b.lastActivity - a.lastActivity);\n const now = Date.now();\n for (const [i, rt] of idle.entries()) {\n const expired = now - rt.lastActivity > limit;\n if (!expired && i < MAX_WARM_IDLE) continue;\n log(\"info\", `idle cleanup: closing thread ${rt.threadId} (${expired ? \"idle timeout\" : \"over the warm limit\"})`);\n try {\n await this.close(rt.threadId);\n } catch (e) {\n // The conversation may have been deleted meanwhile: just forget its runtime\n log(\"info\", `idle cleanup: thread ${rt.threadId}: ${String((e as Error)?.message ?? e)}`);\n this.runtimes.delete(rt.threadId);\n }\n }\n } finally {\n this.recycling = false;\n }\n }\n}\n","// Coalescer (after Paseo's agent-stream-coalescer):\n// accumulate deltas per itemId; the first is pushed immediately (leading), the rest accumulated within the window are pushed once (trailing);\n// flush that itemId before its complete event arrives.\nexport class Coalescer {\n private windowMs: number;\n private acc = new Map<string, { text: string; timer: NodeJS.Timeout | null }>();\n private onEmit: (itemId: string, text: string) => void;\n constructor(windowMs: number, onEmit: (itemId: string, text: string) => void) {\n this.windowMs = windowMs;\n this.onEmit = onEmit;\n }\n\n // Push a delta; the first goes out immediately, the rest are merged within the window and sent trailing\n push(itemId: string, text: string): void {\n const acc = this.acc.get(itemId);\n if (!acc) {\n // leading: send immediately\n this.onEmit(itemId, text);\n this.acc.set(itemId, { text: \"\", timer: setTimeout(() => this.flush(itemId), this.windowMs) });\n return;\n }\n acc.text += text;\n }\n\n // Must flush before the complete event arrives to keep ordering (deltas before the complete event)\n flush(itemId: string): void {\n const acc = this.acc.get(itemId);\n if (!acc) return;\n if (acc.timer) {\n clearTimeout(acc.timer);\n acc.timer = null;\n }\n if (acc.text.length > 0) this.onEmit(itemId, acc.text);\n this.acc.delete(itemId);\n }\n\n // Call before an itemId's complete event arrives: flush the deltas not yet sent\n flushItem(itemId: string): void {\n this.flush(itemId);\n }\n\n dispose(): void {\n for (const id of [...this.acc.keys()]) this.flush(id);\n }\n}\n","// GitService (§5.8): runs the local git via execFile (no shell), cwd = project path, 15 s timeout.\nimport { execFile } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { cp, mkdir, readFile, rename, rm, stat } from \"node:fs/promises\";\nimport { join, normalize, sep } from \"node:path\";\nimport { tr } from \"../util/i18n.js\";\n\nexport type GitFileEntry = {\n path: string;\n index: string;\n worktree: string;\n kind: \"modified\" | \"added\" | \"deleted\" | \"untracked\" | \"renamed\";\n};\nexport type GitStatus = { isRepo: boolean; branch?: string; files?: GitFileEntry[]; error?: string };\n\nconst TIMEOUT = 15_000;\nconst DIFF_LIMIT = 1024 * 1024;\n\nfunction runGit(cwd: string, args: string[]): Promise<{ code: number; out: string; err: string }> {\n return new Promise((res) => {\n // core.quotepath=false: non-ASCII paths (e.g. Chinese file names) are no longer turned into \"\\346\\226\\207\" octal escapes in diff headers\n execFile(\"git\", [\"-c\", \"core.quotepath=false\", ...args], { cwd, timeout: TIMEOUT, maxBuffer: 8 * 1024 * 1024, windowsHide: true }, (e, stdout, stderr) => {\n const code = e && typeof (e as { code?: number }).code === \"number\" ? (e as { code: number }).code! : e ? 1 : 0;\n const missing = (e as NodeJS.ErrnoException | null)?.code === \"ENOENT\";\n res({ code, out: String(stdout ?? \"\"), err: missing ? tr(\"git.missing\") : String(stderr || (e?.message ?? \"\")) });\n });\n });\n}\n\n// The path must be inside the project (no .. escape); returns the project-relative path (posix form)\nfunction insidePath(projectPath: string, p: string): string | null {\n const rel = normalize(p).replace(/\\\\/g, \"/\");\n const abs = normalize(join(projectPath, rel));\n const proj = normalize(projectPath);\n if (abs !== proj && !abs.startsWith(proj + sep)) return null;\n return rel.replace(/\\\\/g, \"/\");\n}\n\n// rename across drives/volumes (Windows project on D:, data dir on C:; different mount points on Linux) fails with EXDEV → copy then delete\nexport async function moveAcrossDevices(\n from: string,\n to: string,\n ops: { rename?: typeof rename; cp?: typeof cp; rm?: typeof rm } = {},\n): Promise<void> {\n const ren = ops.rename ?? rename;\n try {\n await ren(from, to);\n } catch (e) {\n const code = (e as NodeJS.ErrnoException)?.code;\n if (code !== \"EXDEV\") throw e;\n await (ops.cp ?? cp)(from, to, { recursive: true, errorOnExist: true, force: false, preserveTimestamps: true });\n await (ops.rm ?? rm)(from, { recursive: true, force: true });\n }\n}\n\nexport class GitService {\n // projectPath is resolved from projectId by the caller (the service doesn't know about the store)\n async status(projectPath: string): Promise<GitStatus> {\n const inside = await runGit(projectPath, [\"rev-parse\", \"--is-inside-work-tree\"]);\n if (inside.code !== 0 || inside.out.trim() !== \"true\") return { isRepo: false };\n const br = await runGit(projectPath, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n const st = await runGit(projectPath, [\"status\", \"--porcelain=v1\", \"-z\", \"-uall\"]);\n if (st.code !== 0) return { isRepo: true, branch: br.out.trim() || undefined, error: st.err.trim() || \"status 失败\" };\n const files: GitFileEntry[] = [];\n const parts = st.out.split(\"\\0\");\n for (let i = 0; i < parts.length; i++) {\n const rec = parts[i];\n if (!rec || rec.length < 4) continue;\n const index = rec[0];\n const worktree = rec[1];\n let path = rec.slice(3);\n let kind: GitFileEntry[\"kind\"] = \"modified\";\n if (index === \"?\" && worktree === \"?\") kind = \"untracked\";\n else if (index === \"R\" || worktree === \"R\") {\n kind = \"renamed\";\n // A renamed record looks like \"R new\\0old\": the next part is the old path, skip it\n i++;\n } else if (index === \"A\" || worktree === \"A\") kind = \"added\";\n else if (index === \"D\" || worktree === \"D\") kind = \"deleted\";\n files.push({ path, index, worktree, kind });\n }\n return { isRepo: true, branch: br.out.trim() || undefined, files };\n }\n\n // Unified diff text; {tooLarge:true} when the diff is > 1MB\n async diff(projectPath: string, p: string): Promise<{ diff?: string; tooLarge?: boolean; untracked?: boolean; error?: string }> {\n const rel = insidePath(projectPath, p);\n if (!rel) return { error: tr(\"fs.pathDenied\") };\n // Check untracked first (git diff prints nothing for untracked files)\n const ls = await runGit(projectPath, [\"ls-files\", \"--error-unmatch\", \"--\", rel]);\n if (ls.code !== 0) {\n // Untracked/not in the index: treat the whole file as added\n const full = join(projectPath, rel);\n if (!existsSync(full)) return { error: tr(\"fs.fileMissing\") };\n const s = await stat(full);\n if (!s.isFile()) return { error: tr(\"fs.notFile\") };\n if (s.size > DIFF_LIMIT) return { tooLarge: true };\n const text = await readFile(full, \"utf8\").catch(() => null);\n if (text === null) return { error: tr(\"git.binary\") };\n const lines = text.split(\"\\n\").map((l) => \"+\" + l).join(\"\\n\");\n return { untracked: true, diff: `--- /dev/null\\n+++ b/${rel}\\n@@ -0,0 +1,${text.split(\"\\n\").length} @@\\n${lines}` };\n }\n let d = await runGit(projectPath, [\"diff\", \"--no-color\", \"--\", rel]);\n if (d.code !== 0) return { error: d.err.trim() || \"diff 失败\" };\n if (!d.out.trim()) {\n d = await runGit(projectPath, [\"diff\", \"--cached\", \"--no-color\", \"--\", rel]);\n if (d.code !== 0) return { error: d.err.trim() || \"diff 失败\" };\n }\n if (d.out.length > DIFF_LIMIT) return { tooLarge: true };\n return { diff: d.out };\n }\n\n // Tracked → git restore; untracked → move to trash/discarded/<ts>/<relpath>\n async discard(projectPath: string, p: string, dataDir: string): Promise<{ ok: boolean; trashedTo?: string; error?: string }> {\n const rel = insidePath(projectPath, p);\n if (!rel) return { ok: false, error: tr(\"fs.pathDenied\") };\n // Only discard a single file: an empty path / \".\" would make git restore act on the whole repository\n if (rel === \".\" || rel === \"\" || rel === \"./\") return { ok: false, error: tr(\"fs.pathDenied\") };\n const ls = await runGit(projectPath, [\"ls-files\", \"--error-unmatch\", \"--\", rel]);\n if (ls.code === 0) {\n let r = await runGit(projectPath, [\"restore\", \"--staged\", \"--worktree\", \"--\", rel]);\n if (r.code !== 0) r = await runGit(projectPath, [\"checkout\", \"--\", rel]);\n if (r.code !== 0) return { ok: false, error: r.err.trim() || \"放弃失败\" };\n return { ok: true };\n }\n const full = join(projectPath, rel);\n if (!existsSync(full)) return { ok: false, error: tr(\"fs.fileMissing\") };\n const stamp = new Date().toISOString().replace(/[:.]/g, \"-\").slice(0, 19);\n const dest = join(dataDir, \"trash\", \"discarded\", stamp, rel);\n await mkdir(join(dest, \"..\"), { recursive: true });\n try {\n await moveAcrossDevices(full, dest);\n } catch (e) {\n return { ok: false, error: \"移动失败:\" + String((e as Error)?.message ?? e) };\n }\n return { ok: true, trashedTo: dest };\n }\n}\n","// FileService (§5.9): file tree (lazily, one level at a time) and file preview.\n// tree: ignore .git/node_modules + the project root .gitignore (ignore library); directories first, sorted by name; ≤2000 per level.\n// read: ≤1MB; a \\0 in the first 8KB → {binary}; otherwise {text, language} (inferred from the extension).\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, normalize, sep, relative, extname } from \"node:path\";\nimport ignore from \"ignore\";\nimport { tr } from \"../util/i18n.js\";\n\nexport type TreeEntry = { name: string; path: string; isDir: boolean };\nexport type ReadResult = {\n text?: string;\n language?: string;\n encoding?: \"utf8\" | \"gbk\";\n binary?: boolean;\n tooLarge?: boolean;\n error?: string;\n};\n\n/** Text decoding: UTF-8 (BOM stripped); if it isn't valid UTF-8 try GBK once (old files on Chinese Windows), else lenient UTF-8. */\nexport function decodeText(buf: Buffer): { text: string; encoding: \"utf8\" | \"gbk\" } {\n try {\n const text = new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: false }).decode(buf);\n return { text, encoding: \"utf8\" };\n } catch {}\n try {\n const text = new TextDecoder(\"gbk\", { fatal: true }).decode(buf);\n return { text, encoding: \"gbk\" };\n } catch {}\n return { text: new TextDecoder(\"utf-8\").decode(buf), encoding: \"utf8\" };\n}\n\nconst MAX_READ = 1024 * 1024;\nconst MAX_PER_LEVEL = 2000;\nconst ALWAYS_IGNORE = new Set([\".git\", \"node_modules\"]);\n\nconst LANG: Record<string, string> = {\n \".ts\": \"typescript\", \".tsx\": \"typescript\", \".js\": \"javascript\", \".jsx\": \"javascript\",\n \".mjs\": \"javascript\", \".cjs\": \"javascript\", \".json\": \"json\", \".md\": \"markdown\",\n \".py\": \"python\", \".rs\": \"rust\", \".go\": \"go\", \".java\": \"java\", \".c\": \"c\", \".h\": \"c\",\n \".cpp\": \"cpp\", \".hpp\": \"cpp\", \".cs\": \"csharp\", \".css\": \"css\", \".scss\": \"scss\",\n \".html\": \"xml\", \".htm\": \"xml\", \".xml\": \"xml\", \".svg\": \"xml\", \".yaml\": \"yaml\", \".yml\": \"yaml\",\n \".toml\": \"ini\", \".ini\": \"ini\", \".sh\": \"bash\", \".bash\": \"bash\", \".ps1\": \"powershell\",\n \".sql\": \"sql\", \".lua\": \"lua\", \".rb\": \"ruby\", \".php\": \"php\", \".swift\": \"swift\",\n \".kt\": \"kotlin\", \".vue\": \"xml\", \".svelte\": \"xml\", \".dockerfile\": \"dockerfile\",\n \".txt\": \"plaintext\", \".log\": \"plaintext\",\n};\n\nfunction insidePath(projectPath: string, p: string): string | null {\n const rel = normalize(p || \".\").replace(/\\\\/g, \"/\");\n const abs = normalize(join(projectPath, rel));\n const proj = normalize(projectPath);\n if (abs !== proj && !abs.startsWith(proj + sep)) return null;\n return rel;\n}\n\nexport class FileService {\n // Cache an ignore instance per project (.gitignore changes are picked up on the next daemon restart; acceptable cost)\n // Invalidate by .gitignore mtime: an edited .gitignore takes effect the next time a directory is expanded\n private igCache = new Map<string, { mtime: number; ig: ReturnType<typeof ignore> | null }>();\n\n private async igFor(projectPath: string) {\n const gi = join(projectPath, \".gitignore\");\n const st = await stat(gi).catch(() => null);\n const mtime = st?.isFile() ? st.mtimeMs : -1;\n const hit = this.igCache.get(projectPath);\n if (hit && hit.mtime === mtime) return hit.ig;\n let ig: ReturnType<typeof ignore> | null = null;\n if (mtime >= 0) {\n try {\n ig = ignore().add(await readFile(gi, \"utf8\"));\n } catch {\n ig = null;\n }\n }\n this.igCache.set(projectPath, { mtime, ig });\n return ig;\n }\n\n async tree(projectPath: string, dir: string): Promise<{ entries?: TreeEntry[]; error?: string }> {\n const rel = insidePath(projectPath, dir);\n if (rel === null) return { error: tr(\"fs.pathDenied\") };\n const abs = join(projectPath, rel);\n const s = await stat(abs).catch(() => null);\n if (!s?.isDirectory()) return { error: tr(\"fs.dirMissing\") };\n const ig = await this.igFor(projectPath);\n const dirents = await readdir(abs, { withFileTypes: true }).catch(() => null);\n if (!dirents) return { error: tr(\"fs.dirUnreadable\") };\n const out: TreeEntry[] = [];\n for (const d of dirents) {\n if (out.length >= MAX_PER_LEVEL) break;\n const name = d.name;\n if (ALWAYS_IGNORE.has(name)) continue;\n const childRel = rel === \".\" ? name : `${rel}/${name}`;\n // Only symlinks / junctions get an extra stat (to see whether they point at a directory); large directories are no longer stat'ed entry by entry\n let isDir = d.isDirectory();\n if (d.isSymbolicLink()) {\n const st = await stat(join(projectPath, childRel)).catch(() => null);\n if (!st) continue;\n isDir = st.isDirectory();\n } else if (!d.isFile() && !isDir) {\n continue; // socket / fifo etc.\n }\n if (ig) {\n // The ignore library wants posix relative paths; directory rules need a trailing / to match directories\n if (ig.ignores(isDir ? childRel + \"/\" : childRel)) continue;\n }\n out.push({ name, path: childRel, isDir });\n }\n out.sort((a, b) => (a.isDir === b.isDir ? a.name.localeCompare(b.name, \"zh-CN\") : a.isDir ? -1 : 1));\n return { entries: out };\n }\n\n async read(projectPath: string, p: string): Promise<ReadResult> {\n const rel = insidePath(projectPath, p);\n if (rel === null) return { error: tr(\"fs.pathDenied\") };\n const abs = join(projectPath, rel);\n const s = await stat(abs).catch(() => null);\n if (!s) return { error: tr(\"fs.fileMissing\") };\n if (!s.isFile()) return { error: tr(\"fs.notFile\") };\n if (s.size > MAX_READ) return { tooLarge: true };\n const buf = await readFile(abs).catch(() => null);\n if (!buf) return { error: tr(\"fs.unreadable\") };\n const head = buf.subarray(0, 8192);\n if (head.includes(0)) return { binary: true };\n const { text, encoding } = decodeText(buf);\n return { text, encoding, language: LANG[extname(rel).toLowerCase()] ?? \"plaintext\" };\n }\n}\n","// TerminalService (§7.5): node-pty first, falling back to a no-PTY mode if it can't be loaded.\n// Output goes into a ring buffer (5000 lines / 2MB), coalesced every 16ms and pushed as gateway binary frames to connections subscribed to terminal:<index>.\n// Frame format (§5.4): [op:1][index:2 BE][payload]; op 1=output 2=input 3=resize (JSON).\nimport { spawn, execFileSync, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport { accessSync, chmodSync, constants as fsc, existsSync, statSync } from \"node:fs\";\nimport { createRequire as moduleRequire } from \"node:module\";\nimport { release } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { StringDecoder } from \"node:string_decoder\";\nimport { findOnPath } from \"../../../lib/pathscan.mjs\";\nimport type { Gateway } from \"../ws/gateway.js\";\nimport { log } from \"../log.js\";\nimport { tr } from \"../util/i18n.js\";\n\ntype Pty = {\n write(data: string): void;\n resize(cols: number, rows: number): void;\n kill(): void;\n onData(cb: (d: string) => void): void;\n onExit(cb: (e: { exitCode: number }) => void): void;\n pid: number;\n};\n\ntype Term = {\n id: string;\n index: number;\n projectId: string;\n cwd: string;\n title: string;\n alive: boolean;\n simple: boolean; // No-PTY fallback\n pty: Pty | null;\n proc: ChildProcessWithoutNullStreams | null;\n buf: string; // Ring buffer text (≤2MB; attach takes the last 5000 lines)\n pend: string; // Pending output, coalesced every 16ms\n timer: NodeJS.Timeout | null;\n exited?: boolean;\n};\n\nconst MAX_TERMS_PER_PROJECT = 8;\nconst BUF_MAX = 2 * 1024 * 1024;\nconst SNAP_LINES = 5000;\n\ntype ShellEnv = {\n platform?: NodeJS.Platform;\n env?: NodeJS.ProcessEnv;\n find?: (name: string) => string | null;\n isExec?: (file: string) => boolean;\n};\n\nfunction isExecFile(file: string): boolean {\n try {\n accessSync(file, fsc.X_OK);\n return statSync(file).isFile();\n } catch {\n return false;\n }\n}\n\n/** Default shell: Windows pwsh → powershell → cmd; elsewhere $SHELL (if it exists) → macOS zsh → bash → sh. */\nexport function pickShell(o: ShellEnv = {}): string {\n const platform = o.platform ?? process.platform;\n const env = o.env ?? process.env;\n const find = o.find ?? ((n: string) => findOnPath(n, { platform, env })[0] ?? null);\n const isExec = o.isExec ?? isExecFile;\n if (platform === \"win32\") {\n for (const s of [\"pwsh\", \"powershell\"]) {\n const hit = find(s);\n if (hit) return hit;\n }\n const sysRoot = env.SystemRoot || env.SYSTEMROOT || env.windir || \"C:\\\\Windows\";\n const ps = `${sysRoot}\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe`;\n if (isExec(ps)) return ps;\n return env.ComSpec || env.COMSPEC || \"cmd.exe\";\n }\n if (env.SHELL && env.SHELL.startsWith(\"/\") && isExec(env.SHELL)) return env.SHELL;\n const order = platform === \"darwin\" ? [\"/bin/zsh\", \"/bin/bash\", \"/bin/sh\"] : [\"/bin/bash\", \"/usr/bin/bash\", \"/bin/zsh\", \"/bin/sh\"];\n for (const s of order) if (isExec(s)) return s;\n return \"/bin/sh\";\n}\n\n/** Shell arguments without a PTY: powershell needs -Command - since it doesn't read a stdin prompt; cmd uses /Q; POSIX uses interactive -i. */\nexport function simpleShellArgs(shell: string, platform: NodeJS.Platform = process.platform): string[] {\n if (platform === \"win32\") {\n if (/(^|[\\\\/])cmd(\\.exe)?$/i.test(shell)) return [\"/Q\"];\n return [\"-NoLogo\"];\n }\n return [\"-i\"];\n}\n\n/** node-pty's macOS prebuilds start children through spawn-helper; npm unpacking sometimes drops its executable bit → posix_spawnp failed. */\nfunction fixSpawnHelper(): void {\n if (process.platform !== \"darwin\") return;\n try {\n const req = moduleRequire(import.meta.url);\n const root = dirname(req.resolve(\"node-pty/package.json\"));\n for (const sub of [`prebuilds/darwin-${process.arch}`, \"build/Release\"]) {\n const f = join(root, sub, \"spawn-helper\");\n if (existsSync(f) && !isExecFile(f)) {\n chmodSync(f, 0o755);\n log(\"info\", \"已修复 node-pty spawn-helper 的可执行位\", { file: f });\n }\n }\n } catch {}\n}\n\nfunction conptyInfo(): { backend: \"conpty\"; buildNumber: number } {\n const build = Number(release().split(\".\")[2]);\n return { backend: \"conpty\", buildNumber: Number.isFinite(build) ? build : 0 };\n}\n\nlet nextIndex = 1;\nconst rid = () => \"t_\" + Math.random().toString(36).slice(2, 10);\n\nexport class TerminalService {\n private terms = new Map<string, Term>();\n private byIndex = new Map<number, Term>();\n private ptyLib: typeof import(\"node-pty\") | null | undefined;\n\n constructor(private gw: Gateway) {\n gw.onTerminalInput = (conn, index, op, payload) => this.onInput(conn, index, op, payload);\n }\n\n private async loadPty(): Promise<typeof import(\"node-pty\") | null> {\n if (this.ptyLib !== undefined) return this.ptyLib;\n try {\n fixSpawnHelper();\n this.ptyLib = await import(\"node-pty\");\n } catch (e) {\n log(\"warn\", \"node-pty 加载失败,终端退化无 PTY 方案\", { err: String(e) });\n this.ptyLib = null;\n }\n return this.ptyLib;\n }\n\n list(projectId?: string) {\n return [...this.terms.values()]\n .filter((t) => !projectId || t.projectId === projectId)\n .map((t) => ({ id: t.id, index: t.index, projectId: t.projectId, title: t.title, alive: t.alive, simple: t.simple }));\n }\n\n get count(): number {\n return [...this.terms.values()].filter((t) => t.alive).length;\n }\n\n async create(projectId: string, cwd: string, cols: number, rows: number): Promise<{ id: string; index: number; simple: boolean } | { error: string }> {\n const alive = [...this.terms.values()].filter((t) => t.projectId === projectId && t.alive);\n if (alive.length >= MAX_TERMS_PER_PROJECT) return { error: tr(\"term.max\", { n: MAX_TERMS_PER_PROJECT }) };\n const shell = pickShell();\n const term: Term = {\n id: rid(), index: nextIndex++, projectId, cwd, title: tr(\"term.title\", { n: alive.length + 1 }),\n alive: true, simple: false, pty: null, proc: null, buf: \"\", pend: \"\", timer: null,\n };\n const pty = await this.loadPty();\n if (pty) {\n try {\n const p = pty.spawn(shell, [], {\n name: \"xterm-256color\", cols: Math.max(20, cols), rows: Math.max(5, rows), cwd, env: process.env,\n });\n term.pty = { write: (d) => p.write(d), resize: (c, r) => p.resize(c, r), kill: () => p.kill(), onData: (cb) => p.onData(cb), onExit: (cb) => p.onExit(cb), pid: p.pid };\n term.pty.onData((d) => this.onData(term, d));\n term.pty.onExit(() => this.onExit(term));\n } catch (e) {\n log(\"warn\", \"pty.spawn 失败,退化无 PTY 方案\", { err: String(e) });\n }\n }\n if (!term.pty) {\n // No-PTY mode\n term.simple = true;\n const args = simpleShellArgs(shell);\n // Non-Windows: detached, its own process group, so closing the terminal kill(-pgid)s the commands running in the shell too\n const proc = spawn(shell, args, {\n cwd, stdio: \"pipe\", windowsHide: true, env: process.env,\n detached: process.platform !== \"win32\",\n });\n term.proc = proc;\n // StringDecoder: no garbling when a multibyte character (e.g. Chinese) is split across two chunks\n const outDec = new StringDecoder(\"utf8\");\n const errDec = new StringDecoder(\"utf8\");\n proc.stdout.on(\"data\", (d: Buffer) => this.onData(term, outDec.write(d)));\n proc.stderr.on(\"data\", (d: Buffer) => this.onData(term, errDec.write(d)));\n proc.on(\"exit\", () => this.onExit(term));\n proc.on(\"error\", () => this.onExit(term));\n }\n this.terms.set(term.id, term);\n this.byIndex.set(term.index, term);\n return { id: term.id, index: term.index, simple: term.simple };\n }\n\n attach(id: string): {\n index?: number;\n snapshot?: string;\n simple?: boolean;\n windowsPty?: { backend: \"conpty\"; buildNumber: number };\n error?: string;\n } {\n const t = this.terms.get(id);\n if (!t) return { error: tr(\"err.terminalMissing\") };\n // Last 5000 lines\n const lines = t.buf.split(\"\\n\");\n const snapshot = lines.length > SNAP_LINES ? lines.slice(-SNAP_LINES).join(\"\\n\") : t.buf;\n // On Windows node-pty uses ConPTY: tell xterm.js so it handles line reflow the ConPTY way\n const windowsPty = process.platform === \"win32\" && t.pty ? conptyInfo() : undefined;\n return { index: t.index, snapshot, simple: t.simple, ...(windowsPty ? { windowsPty } : {}) };\n }\n\n indexOf(id: string): number | null {\n return this.terms.get(id)?.index ?? null;\n }\n\n resize(id: string, cols: number, rows: number): { ok: boolean } {\n const t = this.terms.get(id);\n if (!t || !t.alive) return { ok: false };\n t.pty?.resize(Math.max(20, cols), Math.max(5, rows));\n return { ok: true };\n }\n\n kill(id: string): { ok: boolean } {\n const t = this.terms.get(id);\n if (!t) return { ok: false };\n this.killTerm(t);\n return { ok: true };\n }\n\n killAll(): void {\n // Called before the daemon exits: kill synchronously so the process trees are gone before exit\n for (const t of this.terms.values()) this.killTerm(t, true);\n }\n\n // ---- internals ----\n // Killing only the shell would orphan the npm run dev etc. it started → on Windows taskkill /T kills the whole tree\n private killTree(pid: number | undefined, sync: boolean, group: boolean): void {\n if (!pid) return;\n if (process.platform !== \"win32\") {\n // The no-PTY shell leads a detached process group; a PTY shell leads its session, and pty.kill() sends SIGHUP, which the shell forwards to its jobs\n if (group) {\n try { process.kill(-pid, \"SIGTERM\"); } catch {}\n const t = setTimeout(() => { try { process.kill(-pid, \"SIGKILL\"); } catch {} }, 1500);\n t.unref?.();\n }\n return;\n }\n const args = [\"/pid\", String(pid), \"/T\", \"/F\"];\n try {\n if (sync) execFileSync(\"taskkill\", args, { windowsHide: true, stdio: \"ignore\", timeout: 5000 });\n else spawn(\"taskkill\", args, { windowsHide: true, stdio: \"ignore\" }).on(\"error\", () => {});\n } catch {}\n }\n\n private killTerm(t: Term, sync = false): void {\n t.alive = false;\n this.killTree(t.pty?.pid ?? t.proc?.pid, sync, !t.pty && !!t.proc);\n if (t.timer) { clearTimeout(t.timer); t.timer = null; }\n try { t.pty?.kill(); } catch {}\n try { t.proc?.kill(); } catch {}\n this.terms.delete(t.id);\n this.byIndex.delete(t.index);\n }\n\n private onExit(t: Term): void {\n if (t.timer) {\n // Flush the last batch of output first, then send exit\n clearTimeout(t.timer);\n t.timer = null;\n if (t.pend) {\n this.gw.publishTerminal(t.index, Buffer.from(t.pend, \"utf8\"));\n t.pend = \"\";\n }\n }\n if (t.exited) return; // exit and error may both fire: send only once\n t.exited = true;\n t.alive = false;\n this.terms.delete(t.id);\n this.byIndex.delete(t.index);\n this.gw.publish(\"terminals\", { type: \"terminal.exit\", id: t.id, index: t.index });\n }\n\n private onData(t: Term, d: string): void {\n t.buf += d;\n if (t.buf.length > BUF_MAX) t.buf = t.buf.slice(-BUF_MAX / 2);\n t.pend += d;\n if (!t.timer) {\n t.timer = setTimeout(() => {\n t.timer = null;\n if (t.pend) {\n this.gw.publishTerminal(t.index, Buffer.from(t.pend, \"utf8\"));\n t.pend = \"\";\n }\n }, 16);\n }\n }\n\n // Input frames: op 2=input, 3=resize\n private onInput(conn: { subs: Set<string> }, index: number, op: number, payload: Buffer): void {\n const t = this.byIndex.get(index);\n if (!t || !t.alive) return;\n if (!conn.subs.has(`terminal:${index}`)) return; // Only connections that attached may write\n if (op === 2) {\n const s = payload.toString(\"utf8\");\n if (t.pty) t.pty.write(s);\n else t.proc?.stdin.write(s);\n } else if (op === 3) {\n try {\n const { cols, rows } = JSON.parse(payload.toString(\"utf8\")) as { cols?: number; rows?: number };\n if (cols && rows) this.resize(t.id, cols, rows);\n } catch {}\n }\n }\n}\n","// Small process/environment helpers: cross-platform pid liveness, PATH completion.\nimport { delimiter } from \"node:path\";\nimport { extraBinDirs } from \"../../../lib/pathscan.mjs\";\n\n/** kill(pid, 0): ESRCH = gone; EPERM = exists but we may not signal it (common on Windows across sessions / elevated processes), counts as alive. */\nexport function pidAlive(pid: number, kill: (pid: number, sig: 0) => unknown = (p, s) => process.kill(p, s)): boolean {\n if (!Number.isInteger(pid) || pid <= 0) return false;\n try {\n kill(pid, 0);\n return true;\n } catch (e) {\n return (e as NodeJS.ErrnoException)?.code === \"EPERM\";\n }\n}\n\n/** Append nodeDir and common CLI install directories to the end of PATH (deduped; case-insensitive on Windows). Returns the new PATH string. */\nexport function augmentPath(\n env: NodeJS.ProcessEnv,\n nodeDir: string,\n platform: NodeJS.Platform = process.platform,\n home?: string,\n): string {\n const win = platform === \"win32\";\n const sep = win ? \";\" : platform === process.platform ? delimiter : \":\";\n const key = Object.keys(env).find((k) => k.toUpperCase() === \"PATH\") ?? \"PATH\";\n const cur = (env[key] ?? \"\").split(sep).filter(Boolean);\n const norm = (d: string) => (win ? d.replace(/[\\\\/]+$/, \"\").toLowerCase() : d.replace(/\\/+$/, \"\"));\n const seen = new Set(cur.map(norm));\n const out = [...cur];\n for (const d of [nodeDir, ...extraBinDirs({ platform, env, home })]) {\n if (!d || seen.has(norm(d))) continue;\n seen.add(norm(d));\n out.push(d);\n }\n return out.join(sep);\n}\n"],"mappings":"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","names":["join","existsSync","id","i","j","id","resolve","mode","statSync","homedir","sep","readFile","existsSync","path","findNode","id","existsSync","readFile","stat","resolve","id","mode","rid","resolve","id","mode","readFile","stat","existsSync","join","homedir","rec","str","path","resolve","readdir","readFile","stat","join","homedir","str","path","rec","spawn","id","basename","str","rec","trunc","MAX_OUTPUT","init_map","readdir","readFile","stat","homedir","basename","join","path","rid","init_session","init_map","guarded","resolve","mode","homedir","join","readFile","runVersion","models","id","INSTALL_HINT","init_provider","init_session","id","readFile","writeFile","rid","readFile","stat","basename","methods","init_session","id","mode","resolve","runVersion","cfg","learned","init_provider","init_session","createHash","mkdir","writeFile","join","models","tmpdir","models","send","id","init_provider","id","acp","init_provider","id","execFile","existsSync","statSync","readFile","homedir","join","path","id","EFFORT_LABEL","id","mode","existsSync","statSync","mkdir","writeFile","homedir","dirname","join","execFile","id","p","models","isDir","mode","path","stamp","writeFile","mkdir","dirname","readFile","join","z","readFile","mkdir","rename","writeFile","dirname","cp","mkdir","readdir","readFile","existsSync","join","id","mkdirSync","rmSync","chmodSync","join","dirname","fileURLToPath","join","dirname","fileURLToPath","dirname","fileURLToPath","join","existsSync","join","cfg","id","data","join","existsSync","stat","readFile","join","extname","randomBytes","MIME","id","readdir","readFile","existsSync","statSync","join","randomBytes","id","path","mkdir","rename","readdir","readFile","join","randomBytes","newId","id","stamp","randomBytes","randomBytes","cfg","id","id","models","mode","execFile","existsSync","mkdir","readFile","rename","stat","join","normalize","sep","TIMEOUT","rec","path","stamp","readdir","readFile","stat","join","normalize","sep","extname","insidePath","isDir","spawn","execFileSync","accessSync","existsSync","statSync","dirname","join","rid","id","sep","dirname","mkdirSync","join","fileURLToPath","bindAttachmentStore","migrateLegacy","id","warmProviderCache","chmodSync","rmSync"]}
|
|
1
|
+
{"version":3,"sources":["../src/log.ts","../src/security.ts","../src/util/i18n.ts","../src/util/paths.ts","../src/util/queue.ts","../src/agents/diff.ts","../src/providers/slash.ts","../src/providers/mock.ts","../../lib/pathscan.mjs","../src/util/bin.ts","../src/agents/kinds.ts","../src/providers/claude/map.ts","../src/util/attachmentRefs.ts","../src/util/attachmentKinds.ts","../src/providers/claude/content.ts","../src/providers/launch.ts","../src/providers/claude/cli.ts","../src/providers/claude/session.ts","../src/providers/claude/models.ts","../src/history/import.ts","../src/providers/claude/provider.ts","../src/history/codex.ts","../src/providers/codex/rpc.ts","../src/providers/codex/input.ts","../src/providers/codex/map.ts","../src/providers/codex/commands.ts","../src/providers/codex/session.ts","../src/providers/types.ts","../src/providers/codex/provider.ts","../src/providers/catalog.ts","../src/providers/acp/spawn.ts","../src/providers/acp/clientHandlers.ts","../src/providers/acp/mapUpdate.ts","../src/providers/acp/promptCaps.ts","../src/providers/acp/sessionCaps.ts","../src/providers/acp/prompt.ts","../src/providers/acp/session.ts","../src/providers/acp/provider.ts","../src/providers/acp/dsh.ts","../src/providers/acp/probe.ts","../src/providers/acp/specs.ts","../src/providers/registry.ts","../src/providers/enabled.ts","../src/util/pickFolderWin.ts","../src/util/pickFolder.ts","../src/providers/magpieGateway.ts","../src/providers/infoCache.ts","../src/providers/modes.ts","../src/util/mentions.ts","../src/preview/url.ts","../src/util/openExternal.ts","../src/preview/inject.ts","../src/preview/proxy.ts","../src/preview/host.ts","../src/ws/methods.ts","../src/util/atomic.ts","../src/store/settings.ts","../src/util/jsonl.ts","../src/migrate/legacy.ts","../src/providers/warm.ts","../src/main.ts","../src/config.ts","../src/util/buildStamp.ts","../src/http.ts","../src/store/attachments.ts","../src/store/projects.ts","../src/store/threads.ts","../src/ws/gateway.ts","../src/agents/manager.ts","../src/timeline/coalescer.ts","../src/git/service.ts","../src/files/service.ts","../src/terminal/service.ts","../src/util/proc.ts","../src/preview/ports.ts"],"sourcesContent":["// Simple logging: writes dataDir/logs/daemon-YYYY-MM-DD.log (kept 7 days) and to the console.\nimport { appendFileSync, mkdirSync, readdirSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nlet logDir = \"\";\nlet today = \"\";\nlet logFile = \"\";\n\nfunction fileName(d: Date): string {\n const p = (n: number) => String(n).padStart(2, \"0\");\n return `daemon-${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}.log`;\n}\n\nexport function initLog(dataDir: string): void {\n logDir = join(dataDir, \"logs\");\n mkdirSync(logDir, { recursive: true });\n // Keep 7 days\n try {\n const keep = new Set<string>();\n const now = new Date();\n for (let i = 0; i < 7; i++) {\n keep.add(fileName(new Date(now.getTime() - i * 86400000)));\n }\n for (const f of readdirSync(logDir)) {\n if (/^daemon-\\d{4}-\\d{2}-\\d{2}\\.log$/.test(f) && !keep.has(f)) {\n rmSync(join(logDir, f), { force: true });\n }\n }\n } catch {}\n}\n\n// The console is a pipe to the plugin host. When the host is killed hard, the reader is gone and a write fails with EPIPE\n// (asynchronously, as an 'error' event on the stream): without a listener that becomes an uncaughtException. Once that happens\n// the console is dropped and only the log file is written.\nlet consoleGone = false;\nlet guarded = false;\nfunction guardConsole(): void {\n if (guarded) return;\n guarded = true;\n for (const stream of [process.stdout, process.stderr]) {\n // EPIPE, EIO, ERR_STREAM_DESTROYED…: any write error means the reader is gone; logging must never take the daemon down\n stream?.on?.(\"error\", () => { consoleGone = true; });\n }\n}\nexport function consoleClosed(): boolean {\n return consoleGone;\n}\n\nexport function log(level: \"info\" | \"warn\" | \"error\", msg: string, extra?: unknown): void {\n const line = `[${new Date().toISOString()}] [${level}] ${msg}${extra !== undefined ? \" \" + safeJson(extra) : \"\"}`;\n try {\n const d = new Date();\n const name = fileName(d);\n if (name !== today && logDir) {\n today = name;\n logFile = join(logDir, name);\n }\n if (logFile) appendFileSync(logFile, line + \"\\n\", \"utf8\");\n } catch {}\n guardConsole();\n if (consoleGone) return;\n const stream = level === \"info\" ? process.stdout : process.stderr;\n if (stream?.destroyed || stream?.writableEnded) { consoleGone = true; return; }\n const fn = level === \"error\" ? console.error : level === \"warn\" ? console.warn : console.log;\n try {\n fn(`[agent-console] ${msg}`, extra !== undefined ? extra : \"\");\n } catch {\n consoleGone = true;\n }\n}\n\nfunction safeJson(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n","// Host / Origin / token checks (timingSafeEqual).\n//\n// Security model (after the PR #535 review):\n// - Host is checked on every HTTP request and WS upgrade and must be 127.0.0.1:<actual port> or localhost:<actual port>,\n// to block DNS rebinding (requests from a rebound page carry no Origin, so only Host identifies them).\n// - Origin: null (opaque origin) is not trusted. Any website can send Origin: null from a sandboxed iframe, a data: or a file: page,\n// so null by itself means nothing. The token is the only authorization:\n// * token routes (/api/*, /attachments/*, WS hello) let a null origin \"present\" the token,\n// because Magpie's plugin page is a sandbox=\"allow-scripts\" iframe and can only request as null;\n// * static routes (/, app.js etc.) always 403 for null and send no CORS headers.\n// - Any other website's Origin is refused, even with the correct token.\nimport { timingSafeEqual, createHash } from \"node:crypto\";\n\nexport type CheckResult = { ok: true } | { ok: false; code: number; message: string };\n\n// none: no Origin (ordinary navigation, <script src>, non-browser local clients)\n// self: this daemon's own origin (opened directly in a browser during development)\n// opaque: Origin: null — untrusted, may only present the token on token routes\n// foreign: any other origin — always refused\nexport type OriginClass = \"none\" | \"self\" | \"opaque\" | \"foreign\";\n\n// Host must be 127.0.0.1:<port> or localhost:<port> (the IPv6 loopback form [::1] is not allowed, per the requirements).\n// port must be the actual listening port (with --port 0, main.ts writes it back after listen).\nexport function checkHost(host: string | undefined, port: number): CheckResult {\n if (!host) return { ok: false, code: 421, message: \"Host 不对\" };\n const h = host.toLowerCase();\n if (h === `127.0.0.1:${port}` || h === `localhost:${port}`) return { ok: true };\n return { ok: false, code: 421, message: \"Host 不对\" };\n}\n\nexport function classifyOrigin(origin: string | undefined, port: number): OriginClass {\n if (origin === undefined || origin === \"\") return \"none\";\n if (origin === \"null\") return \"opaque\";\n const o = origin.toLowerCase();\n if (o === `http://127.0.0.1:${port}` || o === `http://localhost:${port}`) return \"self\";\n return \"foreign\";\n}\n\nexport function tokenEqual(a: string, b: string): boolean {\n // Constant-time compare against timing attacks; different lengths are hashed to the same length first.\n const ha = createHash(\"sha256\").update(a).digest();\n const hb = createHash(\"sha256\").update(b).digest();\n return timingSafeEqual(ha, hb);\n}\n","/** Same as the frontend's normalizeLang */\nexport type AppLocale = \"zh\" | \"en\";\n\nlet locale: AppLocale = \"zh\";\n\nexport function normalizeLang(raw: string | null | undefined): AppLocale {\n const s = String(raw ?? \"\").trim().toLowerCase();\n if (!s) return \"zh\";\n if (s === \"zh\" || s.startsWith(\"zh-\")) return \"zh\";\n return \"en\";\n}\n\nexport function setAppLocale(lang: string | undefined): void {\n locale = normalizeLang(lang);\n}\n\nexport function getAppLocale(): AppLocale {\n return locale;\n}\n\nexport function intlLocale(): string {\n return locale === \"zh\" ? \"zh-CN\" : \"en-US\";\n}\n\nconst dict: Record<AppLocale, Record<string, string>> = {\n zh: {\n \"thread.defaultTitle\": \"新对话\",\n \"notice.daemonRestart\": \"后台已重启,本轮已中断\",\n \"notice.sessionStartFailed\": \"会话启动失败:{detail}\",\n \"notice.sendFailed\": \"发送失败:{detail}\",\n \"notice.effortNextTurn\": \"思考强度已保存,将在下一轮生效\",\n \"notice.effortResetOnModel\": \"当前模型不支持该思考强度,已恢复为 Default\",\n \"turn.agentExit\": \"Agent 进程意外退出\",\n \"attachment.missing\": \"附件不存在或已失效({ref}),请重新上传\",\n \"notice.acpImageByPath\": \"{agent} 不能直接看图片(它的 ACP 初始化未声明支持图片输入),已改为发送图片的文件路径:{paths}\",\n \"notice.acpImageByPathSwitched\": \"{agent} 是在另一个模型上启动的,只对那个模型接收图片,这次改为发送图片的文件路径(当前模型能看图时它会用 read_image 打开):{paths}\",\n \"notice.acpSessionNotRestored\": \"{agent} 不能恢复上一轮对话(它的 ACP 既不支持 session/load 也不支持 session/resume),已新开一轮;先前的上下文不会带回。\",\n \"notice.attachmentIssue\": \"附件问题:{detail}\",\n \"notice.mentionSkipped\": \"这些路径不在项目里或已不存在,没有发给 Agent:{paths}\",\n \"claude.notFound\": \"找不到 claude({detail})。本插件不附带 Claude Code,请先安装:{hint}\",\n \"claude.startFailed\": \"无法启动 claude:{detail}\",\n \"claude.exited\": \"claude 进程意外退出({code})\",\n \"claude.notRunning\": \"claude 没有在运行,消息未发出\",\n \"claude.closed\": \"会话已关闭\",\n \"export.defaultModel\": \"默认\",\n \"bin.notOnPath\": \"PATH 里找不到 {name}\",\n \"bin.or\": \" 或 \",\n \"launch.notFound\": \"找不到自定义的可执行文件:{cmd}(请填写绝对路径,或 PATH 里能找到的命令名)\",\n \"codex.notFound\": \"找不到 codex({detail})。请先安装:{hint}\",\n \"provider.disabled\": \"已在设置中禁用\",\n \"provider.planned\": \"尚未接入\",\n \"provider.disabledNamed\": \"{name} 已在设置中禁用\",\n \"provider.plannedNamed\": \"{name} 尚未接入,暂不能新建对话\",\n \"provider.unavailable\": \"{name} 未安装或不可用\",\n \"provider.unknown\": \"未知 Agent:{id}\",\n \"provider.timeout\": \"检测超时\",\n \"err.previewUrl\": \"预览只支持本机地址(localhost、127.0.0.1 等)\",\n \"err.previewDenied\": \"这个端口不能预览(是 Agent 控制台或 Magpie 自己的端口)\",\n \"err.previewUnavailable\": \"预览不可用\",\n \"err.projectMissing\": \"项目不存在\",\n \"err.threadMissing\": \"对话不存在\",\n \"err.dirMissing\": \"目录不存在或不是文件夹\",\n \"err.projectDirGone\": \"项目目录已不存在\",\n \"err.terminalMissing\": \"终端不存在\",\n \"err.noManager\": \"会话管理器未启动\",\n \"err.badParams\": \"参数不对:{detail}\",\n \"export.me\": \"我\",\n \"export.steered\": \"(插话)\",\n \"export.reasoning\": \"思考\",\n \"export.plan\": \"计划\",\n \"export.todo\": \"待办\",\n \"err.requestGone\": \"授权/提问不存在或已回应\",\n \"err.badOption\": \"optionId 非法:{id}\",\n \"err.cursorOnly\": \"仅 Cursor 对话支持该选项\",\n \"err.busySwitch\": \"对话运行中,不能更换 Agent\",\n \"err.hasMessages\": \"已有消息,不能更换 Agent\",\n \"tool.read\": \"读取 {x}\",\n \"tool.edit\": \"编辑 {x}\",\n \"tool.multiEdit\": \"编辑 {x}({n} 处)\",\n \"tool.overwrite\": \"覆盖 {x}\",\n \"tool.create\": \"新建 {x}\",\n \"tool.notebook\": \"编辑笔记本 {x}\",\n \"tool.run\": \"运行 {x}\",\n \"tool.output\": \"查看输出 {x}\",\n \"tool.kill\": \"结束进程 {x}\",\n \"tool.grep\": \"搜索 \\\"{x}\\\"\",\n \"tool.glob\": \"查找 {x}\",\n \"tool.fetch\": \"打开 {x}\",\n \"tool.webSearch\": \"搜索网页 \\\"{x}\\\"\",\n \"tool.todo\": \"更新待办({done}/{n})\",\n \"tool.task\": \"子任务:{x}\",\n \"tool.generic\": \"工具\",\n \"tool.editFiles\": \"修改 {n} 个文件\",\n \"tool.needsApproval\": \"需要授权\",\n \"perm.editFiles\": \"修改文件\",\n \"perm.allow\": \"允许\",\n \"perm.allowSession\": \"本对话都允许\",\n \"perm.deny\": \"拒绝\",\n \"perm.plan\": \"Agent 提交了计划\",\n \"perm.implement\": \"实施\",\n \"http.internal\": \"服务内部错误\",\n \"http.badOrigin\": \"来源不允许\",\n \"http.badPreflight\": \"预检不允许\",\n \"http.badToken\": \"令牌无效\",\n \"http.noAttachment\": \"附件不存在\",\n \"http.method\": \"方法不允许\",\n \"http.noApp\": \"app 还没构建(缺 app/index.html)\",\n \"http.badPath\": \"路径不合法\",\n \"http.pathDenied\": \"路径不允许\",\n \"http.noFile\": \"文件不存在\",\n \"http.badType\": \"不支持的文件类型\",\n \"http.tooLarge\": \"文件太大(上限 50MB)\",\n \"http.noRoute\": \"接口不存在\",\n \"codex.error\": \"Codex 错误\",\n \"codex.closed\": \"会话已关闭\",\n \"codex.noTurnSteer\": \"当前轮次还没开始,无法插话\",\n \"acp.exited\": \"{name} 进程退出 ({code})\",\n \"notice.apiRetry\": \"API 重试中(第 {n} 次)\",\n \"notice.compacted\": \"上下文已压缩\",\n \"term.max\": \"每个项目最多 {n} 个终端\",\n \"term.title\": \"终端 {n}\",\n \"stub.planned\": \"该 Agent 尚未在 Agent Console 接入,敬请期待\",\n \"stub.unverified\": \"已检测到 CLI,会话驱动尚未完全验证\",\n \"stub.notFound\": \"未找到 {bin}\",\n \"history.untitled\": \"(无标题)\",\n \"history.toolCall\": \"(历史)调用 {name}\",\n \"fs.pathDenied\": \"路径不允许\",\n \"fs.dirMissing\": \"目录不存在\",\n \"fs.dirUnreadable\": \"无法读取目录\",\n \"fs.fileMissing\": \"文件不存在\",\n \"fs.notFile\": \"不是文件\",\n \"fs.unreadable\": \"无法读取\",\n \"git.missing\": \"找不到 git(请先安装 git 并加入 PATH)\",\n \"git.binary\": \"二进制或无法读取\",\n },\n en: {\n \"thread.defaultTitle\": \"New chat\",\n \"notice.daemonRestart\": \"Daemon restarted — this turn was interrupted\",\n \"notice.sessionStartFailed\": \"Session start failed: {detail}\",\n \"notice.sendFailed\": \"Send failed: {detail}\",\n \"notice.effortNextTurn\": \"Reasoning effort saved — takes effect on the next turn\",\n \"notice.effortResetOnModel\": \"This model does not support that effort level; reset to Default\",\n \"turn.agentExit\": \"Agent process exited unexpectedly\",\n \"attachment.missing\": \"Attachment missing or expired ({ref}) — upload again\",\n \"notice.acpImageByPath\": \"{agent} can't see images directly (its ACP initialize doesn't advertise image input); sent the image file path instead: {paths}\",\n \"notice.acpImageByPathSwitched\": \"{agent} was started on another model and takes image blocks only for that one, so the image went as its file path (it opens it with read_image when this model sees images): {paths}\",\n \"notice.acpSessionNotRestored\": \"{agent} can't restore the previous conversation (its ACP advertises neither session/load nor session/resume); started a new one — prior context won't come back.\",\n \"notice.attachmentIssue\": \"Attachment issue: {detail}\",\n \"notice.mentionSkipped\": \"Not sent to the Agent (outside the project or gone): {paths}\",\n \"claude.notFound\": \"claude was not found ({detail}). Claude Code is not bundled with this plugin; install it first: {hint}\",\n \"claude.startFailed\": \"Could not start claude: {detail}\",\n \"claude.exited\": \"claude exited unexpectedly ({code})\",\n \"claude.notRunning\": \"claude is not running; the message was not sent\",\n \"claude.closed\": \"The session is closed\",\n \"export.defaultModel\": \"Default\",\n \"bin.notOnPath\": \"{name} was not found on PATH\",\n \"bin.or\": \" or \",\n \"launch.notFound\": \"Custom executable not found: {cmd} (use an absolute path or a command name on PATH)\",\n \"codex.notFound\": \"codex was not found ({detail}). Install it first: {hint}\",\n \"provider.disabled\": \"Disabled in Settings\",\n \"provider.planned\": \"Not supported yet\",\n \"provider.disabledNamed\": \"{name} is disabled in Settings\",\n \"provider.plannedNamed\": \"{name} is not supported yet; it can't start new conversations\",\n \"provider.unavailable\": \"{name} is not installed or not available\",\n \"provider.unknown\": \"Unknown agent: {id}\",\n \"provider.timeout\": \"Detection timed out\",\n \"err.previewUrl\": \"Preview only supports local addresses (localhost, 127.0.0.1, …)\",\n \"err.previewDenied\": \"This port can't be previewed (it belongs to Agent Console or Magpie)\",\n \"err.previewUnavailable\": \"Preview is unavailable\",\n \"err.projectMissing\": \"Project not found\",\n \"err.threadMissing\": \"Conversation not found\",\n \"err.dirMissing\": \"The folder does not exist or is not a folder\",\n \"err.projectDirGone\": \"The project folder no longer exists\",\n \"err.terminalMissing\": \"Terminal not found\",\n \"err.noManager\": \"The session manager is not running\",\n \"err.badParams\": \"Invalid parameters: {detail}\",\n \"export.me\": \"Me\",\n \"export.steered\": \" (steer)\",\n \"export.reasoning\": \"Reasoning\",\n \"export.plan\": \"Plan\",\n \"export.todo\": \"Todos\",\n \"err.requestGone\": \"That approval or question no longer exists or was already answered\",\n \"err.badOption\": \"Invalid optionId: {id}\",\n \"err.cursorOnly\": \"Only Cursor conversations support this option\",\n \"err.busySwitch\": \"The conversation is running; the agent can't be changed\",\n \"err.hasMessages\": \"The conversation already has messages; the agent can't be changed\",\n \"tool.read\": \"Read {x}\",\n \"tool.edit\": \"Edit {x}\",\n \"tool.multiEdit\": \"Edit {x} ({n} edits)\",\n \"tool.overwrite\": \"Overwrite {x}\",\n \"tool.create\": \"Create {x}\",\n \"tool.notebook\": \"Edit notebook {x}\",\n \"tool.run\": \"Run {x}\",\n \"tool.output\": \"Read output {x}\",\n \"tool.kill\": \"Stop process {x}\",\n \"tool.grep\": \"Search \\\"{x}\\\"\",\n \"tool.glob\": \"Find {x}\",\n \"tool.fetch\": \"Open {x}\",\n \"tool.webSearch\": \"Web search \\\"{x}\\\"\",\n \"tool.todo\": \"Update todos ({done}/{n})\",\n \"tool.task\": \"Subtask: {x}\",\n \"tool.generic\": \"Tool\",\n \"tool.editFiles\": \"Edit {n} file(s)\",\n \"tool.needsApproval\": \"Needs approval\",\n \"perm.editFiles\": \"Edit files\",\n \"perm.allow\": \"Allow\",\n \"perm.allowSession\": \"Allow for this chat\",\n \"perm.deny\": \"Deny\",\n \"perm.plan\": \"The agent proposed a plan\",\n \"perm.implement\": \"Implement\",\n \"http.internal\": \"Internal error\",\n \"http.badOrigin\": \"Origin not allowed\",\n \"http.badPreflight\": \"Preflight not allowed\",\n \"http.badToken\": \"Invalid token\",\n \"http.noAttachment\": \"Attachment not found\",\n \"http.method\": \"Method not allowed\",\n \"http.noApp\": \"The app is not built (app/index.html is missing)\",\n \"http.badPath\": \"Invalid path\",\n \"http.pathDenied\": \"Path not allowed\",\n \"http.noFile\": \"File not found\",\n \"http.badType\": \"Unsupported file type\",\n \"http.tooLarge\": \"File too large (50 MB max)\",\n \"http.noRoute\": \"No such endpoint\",\n \"codex.error\": \"Codex error\",\n \"codex.closed\": \"The session is closed\",\n \"codex.noTurnSteer\": \"The turn hasn't started yet; can't steer\",\n \"acp.exited\": \"{name} exited ({code})\",\n \"notice.apiRetry\": \"Retrying the API (attempt {n})\",\n \"notice.compacted\": \"Context compacted\",\n \"term.max\": \"At most {n} terminals per project\",\n \"term.title\": \"Terminal {n}\",\n \"stub.planned\": \"This agent isn't supported in Agent Console yet\",\n \"stub.unverified\": \"CLI found; its session driver isn't fully verified yet\",\n \"stub.notFound\": \"{bin} was not found\",\n \"history.untitled\": \"(untitled)\",\n \"history.toolCall\": \"(history) called {name}\",\n \"fs.pathDenied\": \"Path not allowed\",\n \"fs.dirMissing\": \"Folder not found\",\n \"fs.dirUnreadable\": \"Can't read the folder\",\n \"fs.fileMissing\": \"File not found\",\n \"fs.notFile\": \"Not a file\",\n \"fs.unreadable\": \"Can't read the file\",\n \"git.missing\": \"git was not found (install git and add it to PATH)\",\n \"git.binary\": \"Binary or unreadable\",\n },\n};\n\nexport function tr(key: string, params?: Record<string, string | number>): string {\n let s = dict[locale][key] ?? dict.en[key] ?? key;\n if (params) {\n for (const [k, v] of Object.entries(params)) s = s.replaceAll(`{${k}}`, String(v));\n }\n return s;\n}\n","// Path utilities: normalization, samePath, isInside (decided after resolving realpath).\nimport { realpathSync, existsSync } from \"node:fs\";\nimport { posix, sep, win32 } from \"node:path\";\n\n// Normalization: realpath (when it exists) + unified separators + case-insensitive on Windows/macOS (NTFS and APFS are case-insensitive by default).\n// Only for comparison/dedupe, never for display or storage.\nexport function normPath(p: string, platform: NodeJS.Platform = process.platform): string {\n // Resolve with the target platform's rules: normalizing a macOS/Linux path on Windows must not prepend the host drive (D:\\…)\n let r = (platform === \"win32\" ? win32 : posix).resolve(p);\n try {\n // native restores 8.3 short names (C:\\PROGRA~1), subst drives and letter case to what's on disk; fall back to the JS implementation on failure\n r = realpathSync.native(r);\n } catch {\n try {\n r = realpathSync(r);\n } catch {}\n }\n if (platform === \"win32\") {\n // Strip the \\\\?\\ long-path prefix; UNC stays \\\\server\\share\n r = r.replace(/\\//g, \"\\\\\").replace(/^\\\\\\\\\\?\\\\(?!UNC\\\\)/i, \"\").replace(/^\\\\\\\\\\?\\\\UNC\\\\/i, \"\\\\\\\\\").toLowerCase();\n } else {\n r = r.replace(/\\\\/g, \"/\");\n if (platform === \"darwin\") r = r.normalize(\"NFC\").toLowerCase();\n }\n // Strip trailing separators (except for the root)\n while (r.length > 3 && (r.endsWith(\"/\") || r.endsWith(\"\\\\\"))) r = r.slice(0, -1);\n return r;\n}\n\nexport function samePath(a: string, b: string): boolean {\n return normPath(a) === normPath(b);\n}\n\n// Whether child is inside the parent directory (including equal).\nexport function isInside(child: string, parent: string): boolean {\n const c = normPath(child);\n const p = normPath(parent);\n if (c === p) return true;\n return c.startsWith(p + sep) || c.startsWith(p + \"/\") || c.startsWith(p + \"\\\\\");\n}\n\n// id check: only safe characters, prevents path traversal.\nconst ID_RE = /^[\\w-]{1,80}$/;\nexport function validId(id: unknown): id is string {\n return typeof id === \"string\" && ID_RE.test(id);\n}\n\nexport function pathExists(p: string): boolean {\n return existsSync(p);\n}\n","// AsyncQueue: push/close/[Symbol.asyncIterator], the prompt input stream for the Claude SDK.\nexport class AsyncQueue<T> implements AsyncIterable<T> {\n private buf: T[] = [];\n private waiters: ((v: IteratorResult<T>) => void)[] = [];\n private closed = false;\n private err: unknown = null;\n\n push(item: T): void {\n if (this.closed) return;\n const w = this.waiters.shift();\n if (w) w({ value: item, done: false });\n else this.buf.push(item);\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n while (this.waiters.length) {\n const w = this.waiters.shift()!;\n w({ value: undefined as never, done: true });\n }\n }\n\n fail(err: unknown): void {\n if (this.closed) return;\n this.err = err;\n this.closed = true;\n while (this.waiters.length) {\n const w = this.waiters.shift()!;\n // Make waiters throw\n w({ value: undefined as never, done: true });\n }\n }\n\n get isClosed(): boolean {\n return this.closed;\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: (): Promise<IteratorResult<T>> => {\n if (this.buf.length) return Promise.resolve({ value: this.buf.shift()!, done: false });\n if (this.closed) {\n if (this.err) return Promise.reject(this.err);\n return Promise.resolve({ value: undefined as never, done: true });\n }\n if (this.err) return Promise.reject(this.err);\n return new Promise<IteratorResult<T>>((res, rej) => {\n this.waiters.push((r) => {\n if (this.err) {\n rej(this.err);\n return;\n }\n res(r);\n });\n });\n },\n };\n }\n}\n","// Line-level diff (ported from lib/diff.mjs): oldStr/newStr → { hunks, added, removed }\n// hunk: { oldStart, newStart, lines: [{ t: \" \"|\"+\"|\"-\", s }] }\n// LCS minimal edit script; keep context lines between changes and merge nearby small blocks into one hunk.\n\nconst CONTEXT = 3;\nconst MERGE_GAP = 6;\nconst MAX_LINES = 400;\n\nexport type DiffLine = { t: \" \" | \"+\" | \"-\"; s: string };\nexport type Hunk = { oldStart: number; newStart: number; lines: DiffLine[] };\nexport type DiffResult = { hunks: Hunk[]; added: number; removed: number; truncated?: boolean };\n\nexport function diffLines(oldStr = \"\", newStr = \"\", { context = CONTEXT } = {}): DiffResult {\n const a = splitLines(oldStr);\n const b = splitLines(newStr);\n if (a.length > MAX_LINES || b.length > MAX_LINES) return coarseDiff(a, b);\n const ops = lcsOps(a, b);\n return buildHunks(ops, context);\n}\n\nfunction splitLines(s: string): string[] {\n s = String(s);\n if (!s) return [];\n return s.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\").split(\"\\n\");\n}\n\ntype Op = { t: \" \" | \"+\" | \"-\"; s: string };\n\nfunction lcsOps(a: string[], b: string[]): Op[] {\n const n = a.length;\n const m = b.length;\n const dp = new Uint32Array((n + 1) * (m + 1));\n for (let i = n - 1; i >= 0; i--)\n for (let j = m - 1; j >= 0; j--)\n dp[i * (m + 1) + j] = a[i] === b[j]\n ? dp[(i + 1) * (m + 1) + j + 1] + 1\n : Math.max(dp[(i + 1) * (m + 1) + j], dp[i * (m + 1) + j + 1]);\n const ops: Op[] = [];\n let i = 0;\n let j = 0;\n while (i < n && j < m) {\n if (a[i] === b[j]) {\n ops.push({ t: \" \", s: a[i] });\n i++; j++;\n } else if (dp[(i + 1) * (m + 1) + j] >= dp[i * (m + 1) + j + 1]) {\n ops.push({ t: \"-\", s: a[i] });\n i++;\n } else {\n ops.push({ t: \"+\", s: b[j] });\n j++;\n }\n }\n while (i < n) ops.push({ t: \"-\", s: a[i++] });\n while (j < m) ops.push({ t: \"+\", s: b[j++] });\n return ops;\n}\n\nfunction buildHunks(ops: Op[], context: number): DiffResult {\n const changed: number[] = [];\n ops.forEach((op, i) => {\n if (op.t !== \" \") changed.push(i);\n });\n if (!changed.length) return { hunks: [], added: 0, removed: 0 };\n\n let added = 0;\n let removed = 0;\n for (const op of ops) {\n if (op.t === \"+\") added++;\n else if (op.t === \"-\") removed++;\n }\n\n const ranges: { s: number; e: number }[] = [];\n for (const idx of changed) {\n const s = Math.max(0, idx - context);\n const e = Math.min(ops.length, idx + context + 1);\n const last = ranges[ranges.length - 1];\n if (last && s <= last.e + MERGE_GAP) last.e = Math.max(last.e, e);\n else ranges.push({ s, e });\n }\n\n const hunks: Hunk[] = [];\n let oldLn = 1;\n let newLn = 1;\n const oldNos: number[] = [];\n const newNos: number[] = [];\n for (const op of ops) {\n oldNos.push(oldLn);\n newNos.push(newLn);\n if (op.t !== \"+\") oldLn++;\n if (op.t !== \"-\") newLn++;\n }\n for (const r of ranges) {\n hunks.push({\n oldStart: oldNos[r.s],\n newStart: newNos[r.s],\n lines: ops.slice(r.s, r.e).map((op) => ({ t: op.t, s: op.s })),\n });\n }\n return { hunks, added, removed };\n}\n\nfunction coarseDiff(a: string[], b: string[]): DiffResult {\n return {\n hunks: [\n {\n oldStart: 1,\n newStart: 1,\n lines: [...a.map((s) => ({ t: \"-\" as const, s })), ...b.map((s) => ({ t: \"+\" as const, s }))].slice(0, 2000),\n },\n ],\n added: b.length,\n removed: a.length,\n truncated: true,\n };\n}\n\n// Build the detail for Edit/MultiEdit: compute hunks from old/new or edits[]\nexport function editDetail(detail: Record<string, unknown> = {}) {\n if (Array.isArray(detail.edits) && detail.edits.length) {\n const hunks: Hunk[] = [];\n let added = 0;\n let removed = 0;\n for (const e of detail.edits as { old_string?: string; old?: string; new_string?: string; new?: string }[]) {\n const d = diffLines(e.old_string ?? e.old ?? \"\", e.new_string ?? e.new ?? \"\");\n for (const h of d.hunks) hunks.push(h);\n added += d.added;\n removed += d.removed;\n }\n return { path: detail.path, hunks, added, removed };\n }\n if (detail.old !== undefined || detail.new !== undefined) {\n const d = diffLines(String(detail.old ?? \"\"), String(detail.new ?? \"\"));\n return { path: detail.path, hunks: d.hunks, added: d.added, removed: d.removed };\n }\n return detail;\n}\n","export type SlashCommandKind = \"command\" | \"skill\";\n\nexport type SlashCommand = {\n name: string;\n description: string;\n argumentHint?: string;\n kind: SlashCommandKind;\n};\n\nconst CLAUDE_BUILTIN_COMMANDS = new Set([\"clear\", \"compact\", \"context\", \"usage\", \"init\", \"debug\"]);\n\nexport function classifyClaudeSlashCommand(name: string): SlashCommandKind {\n return CLAUDE_BUILTIN_COMMANDS.has(name) ? \"command\" : \"skill\";\n}\n\n/** Parse \"/name args\" (must start with /) */\nexport function parseSlashInput(text: string): { name: string; args: string; raw: string } | null {\n const t = text.trim();\n if (!t.startsWith(\"/\")) return null;\n const body = t.slice(1).trim();\n if (!body) return null;\n const sp = body.indexOf(\" \");\n if (sp === -1) return { name: body, args: \"\", raw: t };\n return { name: body.slice(0, sp), args: body.slice(sp + 1).trim(), raw: t };\n}\n\nexport function mapAcpAvailableCommands(\n cmds: { name: string; description: string; input?: { hint?: string } | null }[],\n): SlashCommand[] {\n return cmds.map((c) => ({\n name: c.name,\n description: c.description,\n argumentHint: c.input?.hint,\n kind: \"skill\" as const,\n }));\n}\n\nexport function sortSlashCommands(list: SlashCommand[]): SlashCommand[] {\n return [...list].sort((a, b) => {\n if (a.kind !== b.kind) return a.kind === \"command\" ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n}\n","// MockProvider: registered only with AGENT_CONSOLE_MOCK=1. Persistent session, interruptible, with permissions and steering.\n// Scripts by message prefix: default /perm /plan /ask /slow /error /long /exit; supports steer/interrupt/resume.\nimport { tr } from \"../util/i18n.js\";\nimport type { Provider, ProviderSession, DetectResult, ModelInfo,\n Mode, SendInput, RespondAnswer, SlashCommand,\n} from \"./types.js\";\nimport type { ProviderEvent } from \"../timeline/types.js\";\nimport { AsyncQueue } from \"../util/queue.js\";\nimport { editDetail } from \"../agents/diff.js\";\nimport { sortSlashCommands } from \"./slash.js\";\n\nexport const mockCapabilities = {\n resume: true,\n interrupt: true,\n steer: true,\n images: true,\n plan: true,\n questions: true,\n cost: true,\n effort: [\"low\", \"medium\", \"high\"],\n modes: [\"plan\", \"default\", \"acceptEdits\", \"bypassPermissions\"] as Mode[],\n};\n\nconst rid = () => Math.random().toString(36).slice(2, 10);\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nclass MockCrash extends Error {\n constructor() {\n super(\"__mock_crash__\");\n }\n}\n\ntype Ctx = {\n emit: (ev: ProviderEvent) => void;\n waitFor: (requestId: string) => Promise<RespondAnswer>;\n interrupted: () => boolean;\n steerText: () => string;\n replyPrefix: () => string;\n input: SendInput;\n};\n\nexport class MockSession implements ProviderSession {\n events: AsyncIterable<ProviderEvent>;\n private q = new AsyncQueue<ProviderEvent>();\n private sessionId: string;\n private turnId: string | null = null;\n private turnNum = 0;\n private interruptFlag = false;\n private closed = false;\n private pendingReq = new Map<string, (a: RespondAnswer) => void>();\n private steered: string[] = [];\n private resumed = false;\n\n constructor(private o: {\n threadId: string;\n cwd: string;\n model: string | null;\n mode: Mode;\n effort: string | null;\n resumeId: string | null;\n }) {\n this.sessionId = o.resumeId ?? \"mock-\" + rid();\n this.resumed = o.resumeId !== null;\n this.events = this.q;\n this.q.push({ type: \"provider_session_id\", id: this.sessionId });\n }\n\n private emit(ev: ProviderEvent): void {\n (ev as { turnId?: string }).turnId ??= this.turnId ?? undefined;\n this.q.push(ev);\n }\n\n async send(input: SendInput): Promise<void> {\n if (this.closed) throw new Error(\"mock session closed\");\n this.turnNum++;\n this.turnId = \"u_\" + Date.now().toString(36) + \"_\" + this.turnNum;\n this.interruptFlag = false;\n this.steered = [];\n this.emit({\n type: \"turn_started\",\n turnId: this.turnId,\n model: this.o.model ?? \"demo-fast\",\n mode: this.o.mode,\n effort: this.o.effort,\n });\n void this.runTurn(input);\n }\n\n private async runTurn(input: SendInput): Promise<void> {\n // itemIds are globally unique (a real provider creates new itemIds each time); sessionId can't be used:\n // a resumed session keeps the same providerSessionId and would collide with the old session's itemIds.\n // Same ids would merge the new turn's events into old entries, and the new reply would \"fly\" into an old bubble mid-timeline.\n const p = \"i\" + rid() + \"_\";\n const ctx: Ctx = {\n emit: (ev) => {\n const e = ev as { itemId?: string };\n if (e.itemId) e.itemId = p + e.itemId;\n this.emit(ev);\n },\n waitFor: (id) => this.waitFor(id),\n interrupted: () => this.interruptFlag || this.closed,\n steerText: () => this.steered.join(\";\"),\n replyPrefix: () => this.resumePrefix(),\n input,\n };\n try {\n const script = pickScript(input.text);\n await script(ctx);\n if (this.interruptFlag || this.closed) {\n this.emit({ type: \"turn_ended\", turnId: this.turnId!, status: \"interrupted\", durationMs: 0 });\n } else {\n this.emit({ type: \"usage\", inputTokens: 1200, outputTokens: 340, cacheReadTokens: 800, costUsd: 0.0123 });\n this.emit({ type: \"turn_ended\", turnId: this.turnId!, status: \"completed\", durationMs: 6000, filesChanged: 1 });\n }\n } catch (e) {\n if (e instanceof MockCrash) {\n this.q.close(); // Crash: no turn_ended; the manager appends failed\n return;\n }\n if (this.interruptFlag || this.closed) {\n this.emit({ type: \"turn_ended\", turnId: this.turnId!, status: \"interrupted\", durationMs: 0 });\n } else {\n this.emit({ type: \"turn_ended\", turnId: this.turnId!, status: \"failed\", error: String((e as Error)?.message ?? e) });\n }\n }\n }\n\n respond(requestId: string, answer: RespondAnswer): void {\n const resolve = this.pendingReq.get(requestId);\n if (resolve) {\n this.pendingReq.delete(requestId);\n resolve(answer);\n }\n }\n\n private waitFor(requestId: string): Promise<RespondAnswer> {\n return new Promise((resolve) => {\n this.pendingReq.set(requestId, resolve);\n });\n }\n\n async interrupt(): Promise<void> {\n this.interruptFlag = true;\n // Pending permissions/questions are cancelled directly\n for (const [id, resolve] of this.pendingReq) {\n resolve({ cancelled: true });\n this.pendingReq.delete(id);\n }\n await sleep(120); // Guarantees interrupted within <1s\n }\n\n async steer(input: SendInput): Promise<void> {\n this.steered.push(input.text);\n }\n\n async setModel(model: string | null): Promise<void> {\n this.o.model = model;\n }\n async setMode(mode: Mode): Promise<void> {\n this.o.mode = mode;\n }\n async setEffort(effort: string | null): Promise<void> {\n this.o.effort = effort;\n }\n\n async listCommands(): Promise<SlashCommand[]> {\n return sortSlashCommands([\n { name: \"perm\", description: \"演示授权弹窗\", kind: \"command\" },\n { name: \"plan\", description: \"演示计划审批\", kind: \"command\" },\n { name: \"ask\", description: \"演示提问\", kind: \"command\" },\n { name: \"slow\", description: \"慢速多步工具\", kind: \"skill\" },\n { name: \"error\", description: \"模拟失败\", kind: \"skill\" },\n ]);\n }\n\n async close(): Promise<void> {\n this.closed = true;\n for (const [, resolve] of this.pendingReq) resolve({ cancelled: true });\n this.pendingReq.clear();\n this.q.close();\n }\n\n // With resumeId the first reply gets a \"(已续接)\" prefix\n private resumePrefix(): string {\n if (this.resumed && this.turnNum === 1) return \"(已续接)\";\n return \"\";\n }\n}\n\n// ---------- scripts ----------\n\nasync function scriptDefault(ctx: Ctx): Promise<void> {\n const { emit } = ctx;\n const sleepA = (ms: number) => sleepAbortable(ms, ctx);\n\n emit({ type: \"reasoning_delta\", itemId: \"r1\", text: \"让我看看项目结构…\" });\n await sleepA(500);\n emit({ type: \"reasoning\", itemId: \"r1\", text: \"让我看看项目结构…需要先读几个文件。\" });\n\n const tools = [\n { id: \"t1\", name: \"Read\", input: { file_path: ctx.input.text.includes(\"abs\") ? \"D:/x/a.ts\" : \"src/index.ts\" } },\n { id: \"t2\", name: \"Read\", input: { file_path: \"package.json\" } },\n ];\n for (const t of tools) {\n emit({ type: \"tool_call\", itemId: t.id, kind: \"read\", title: `读取 ${t.input.file_path}`, status: \"running\", input: t.input });\n if (await sleepA(300)) return;\n emit({ type: \"tool_call\", itemId: t.id, kind: \"read\", title: `读取 ${t.input.file_path}`, status: \"ok\", output: \"…文件内容…\", durationMs: 300 });\n }\n\n emit({ type: \"tool_call\", itemId: \"t3\", kind: \"search\", title: '搜索 \"TODO\"', status: \"running\", input: { pattern: \"TODO\" } });\n await sleepA(200);\n emit({ type: \"tool_call\", itemId: \"t3\", kind: \"search\", title: '搜索 \"TODO\"', status: \"ok\", output: \"3 处匹配\" });\n\n const oldStr = \"const x = 1;\\nconst y = 2;\\nreturn x + y;\";\n const newStr = \"const x = 1;\\nconst y = 2;\\nconst z = 3;\\nreturn x + y + z;\";\n emit({\n type: \"tool_call\", itemId: \"t4\", kind: \"edit\", title: \"编辑 src/index.ts\", status: \"running\",\n input: { file_path: \"src/index.ts\", old_string: oldStr, new_string: newStr },\n detail: editDetail({ path: \"src/index.ts\", old: oldStr, new: newStr }),\n });\n if (await sleepA(400)) return;\n emit({\n type: \"tool_call\", itemId: \"t4\", kind: \"edit\", title: \"编辑 src/index.ts\", status: \"ok\",\n detail: editDetail({ path: \"src/index.ts\", old: oldStr, new: newStr }), durationMs: 400,\n });\n\n emit({ type: \"tool_call\", itemId: \"t5\", kind: \"bash\", title: \"运行 npm test\", status: \"running\", input: { command: \"npm test\" } });\n for (let i = 1; i <= 20; i++) {\n if (await sleepA(60)) return;\n emit({ type: \"tool_output_delta\", itemId: \"t5\", text: `第 ${i} 行输出\\n` });\n }\n emit({ type: \"tool_call\", itemId: \"t5\", kind: \"bash\", title: \"运行 npm test\", status: \"ok\", output: \"✓ 全部通过\", exitCode: 0, durationMs: 1200 });\n\n emit({\n type: \"todo\",\n items: [\n { text: \"分析需求\", status: \"done\" },\n { text: \"修改代码\", status: \"done\" },\n { text: \"跑测试\", status: \"done\" },\n { text: \"写文档\", status: \"in_progress\" },\n ],\n });\n await sleepA(300);\n\n const reply = ctx.replyPrefix() + mockReply(ctx);\n for (const ch of chunkText(reply, 40)) {\n if (await sleepA(30)) return;\n emit({ type: \"assistant_delta\", itemId: \"m1\", text: ch });\n }\n emit({ type: \"assistant_message\", itemId: \"m1\", text: reply });\n}\n\nasync function scriptPerm(ctx: Ctx): Promise<void> {\n const { emit } = ctx;\n const requestId = \"perm-\" + rid();\n emit({\n type: \"permission_request\",\n requestId,\n title: \"运行 npm test\",\n kind: \"tool\",\n detail: { command: \"npm test\", cwd: \".\", toolName: \"Bash\" },\n options: [\n { id: \"accept\", label: tr(\"perm.allow\"), kind: \"allow_once\" },\n { id: \"acceptForSession\", label: tr(\"perm.allowSession\"), kind: \"allow_always\" },\n { id: \"decline\", label: tr(\"perm.deny\"), kind: \"reject_once\" },\n ],\n });\n const ans = await ctx.waitFor(requestId);\n if (ans.cancelled || ans.optionId === \"decline\") {\n emit({ type: \"tool_call\", itemId: \"p1\", kind: \"bash\", title: \"运行 npm test\", status: \"failed\", output: \"已被用户拒绝\", exitCode: 1 });\n emit({ type: \"assistant_message\", itemId: \"pm\", text: \"已按你的要求跳过该操作。\" });\n return;\n }\n emit({ type: \"tool_call\", itemId: \"p1\", kind: \"bash\", title: \"运行 npm test\", status: \"running\", input: { command: \"npm test\" } });\n if (await sleepAbortable(500, ctx)) return;\n emit({ type: \"tool_call\", itemId: \"p1\", kind: \"bash\", title: \"运行 npm test\", status: \"ok\", output: \"✓ 12 个测试通过\", exitCode: 0, durationMs: 500 });\n emit({ type: \"assistant_message\", itemId: \"pm\", text: \"测试通过了。\" });\n}\n\nasync function scriptPlan(ctx: Ctx): Promise<void> {\n const { emit } = ctx;\n emit({\n type: \"plan\",\n itemId: \"plan1\",\n markdown: \"## 实施计划\\n\\n1. 改 `src/index.ts` 入口\\n2. 更新测试\\n3. 跑一遍 e2e\",\n entries: [\n { step: \"改 src/index.ts 入口\", status: \"pending\" },\n { step: \"更新测试\", status: \"pending\" },\n { step: \"跑一遍 e2e\", status: \"pending\" },\n ],\n });\n const requestId = \"perm-\" + rid();\n emit({\n type: \"permission_request\",\n requestId,\n title: \"实施这个计划?\",\n kind: \"plan\",\n detail: { markdown: \"见上方计划\" },\n options: [\n { id: \"implement\", label: \"开始实施\", kind: \"allow_once\" },\n { id: \"reject\", label: tr(\"perm.deny\"), kind: \"reject_once\" },\n ],\n });\n const ans = await ctx.waitFor(requestId);\n if (ans.cancelled || ans.optionId === \"reject\") {\n emit({ type: \"assistant_message\", itemId: \"pm\", text: \"好的,请告诉我怎么改。\" });\n return;\n }\n emit({ type: \"tool_call\", itemId: \"pl1\", kind: \"edit\", title: \"编辑 src/index.ts\", status: \"ok\" });\n await sleepAbortable(400, ctx);\n emit({ type: \"assistant_message\", itemId: \"pm\", text: \"已按计划改完入口和测试。\" });\n}\n\nasync function scriptAsk(ctx: Ctx): Promise<void> {\n const { emit } = ctx;\n const requestId = \"q-\" + rid();\n emit({\n type: \"question\",\n requestId,\n questions: [\n {\n id: \"q1\",\n header: \"部署目标\",\n question: \"要部署到哪个环境?\",\n options: [\n { id: \"staging\", label: \"Staging\" },\n { id: \"prod\", label: \"生产环境\" },\n ],\n },\n {\n id: \"q2\",\n header: \"备注\",\n question: \"还有什么要补充的?\",\n freeText: true,\n },\n ],\n });\n const ans = await ctx.waitFor(requestId);\n const env = ans.answers?.q1 ?? \"(未选)\";\n const note = ans.answers?.q2 ?? \"\";\n emit({ type: \"assistant_message\", itemId: \"am\", text: `收到:部署到 ${env}${note ? `,备注「${note}」` : \"\"}。` });\n}\n\nasync function scriptSlow(ctx: Ctx): Promise<void> {\n const { emit } = ctx;\n for (let i = 1; i <= 6; i++) {\n const id = \"s\" + i;\n emit({ type: \"tool_call\", itemId: id, kind: \"bash\", title: `步骤 ${i}/6`, status: \"running\", input: { command: `step ${i}` } });\n if (await sleepAbortable(2000, ctx)) return;\n emit({ type: \"tool_call\", itemId: id, kind: \"bash\", title: `步骤 ${i}/6`, status: \"ok\", output: `步骤 ${i} 完成`, durationMs: 2000 });\n }\n emit({ type: \"assistant_message\", itemId: \"sm\", text: \"6 个步骤全部跑完。\" });\n}\n\nasync function scriptError(ctx: Ctx): Promise<void> {\n const { emit } = ctx;\n emit({ type: \"tool_call\", itemId: \"e1\", kind: \"bash\", title: \"运行 ./build.sh\", status: \"running\", input: { command: \"./build.sh\" } });\n await sleepAbortable(800, ctx);\n throw new Error(\"构建失败:找不到模块 foo(模拟错误)\");\n}\n\nasync function scriptLong(ctx: Ctx): Promise<void> {\n const { emit } = ctx;\n emit({ type: \"assistant_delta\", itemId: \"L1\", text: \"\" });\n for (let i = 0; i < 5000; i++) {\n if (i % 100 === 0 && ctx.interrupted()) return;\n emit({ type: \"assistant_delta\", itemId: \"L1\", text: `块${i} ` });\n if (i % 200 === 0) await sleep(0);\n }\n emit({ type: \"assistant_message\", itemId: \"L1\", text: \"(5000 个增量合并后的长文)\" });\n}\n\nasync function scriptExit(_ctx: Ctx): Promise<void> {\n await sleep(300);\n throw new MockCrash();\n}\n\nfunction pickScript(text: string): (ctx: Ctx) => Promise<void> {\n const t = text.trim();\n if (t.startsWith(\"/perm\")) return scriptPerm;\n if (t.startsWith(\"/plan\")) return scriptPlan;\n if (t.startsWith(\"/ask\")) return scriptAsk;\n if (t.startsWith(\"/slow\")) return scriptSlow;\n if (t.startsWith(\"/error\")) return scriptError;\n if (t.startsWith(\"/long\")) return scriptLong;\n if (t.startsWith(\"/exit\")) return scriptExit;\n if (t.startsWith(\"/serve\")) return scriptServe;\n return scriptDefault;\n}\n\nasync function sleepAbortable(ms: number, ctx: Ctx): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < ms) {\n if (ctx.interrupted()) return true;\n await sleep(Math.min(20, Math.max(1, ms - (Date.now() - start))));\n }\n return ctx.interrupted();\n}\n\nfunction chunkText(s: string, n: number): string[] {\n const out: string[] = [];\n for (let i = 0; i < s.length; i += n) out.push(s.slice(i, i + n));\n return out;\n}\n\n// \"/serve\": a reply with local dev-server addresses (1.2 preview links) and one external link\nasync function scriptServe(ctx: Ctx): Promise<void> {\n const emit = (e: Parameters<Ctx[\"emit\"]>[0]) => ctx.emit(e);\n const reply = [\n \"开发服务器已经启动:http://localhost:5173/ ,接口在 127.0.0.1:5173/api.json。\",\n \"\",\n \"- 在预览里打开 [首页](http://localhost:5173/) 或 [about](http://localhost:5173/about.html)\",\n \"- 文档:[Vite](https://vite.dev/guide/)\",\n \"\",\n \"```\",\n \" VITE v5.4.21 ready in 139 ms\",\n \" ➜ Local: http://localhost:5173/\",\n \"```\",\n ].join(\"\\n\");\n for (const ch of chunkText(reply, 40)) {\n if (await sleepAbortable(20, ctx)) return;\n emit({ type: \"assistant_delta\", itemId: \"sv\", text: ch });\n }\n emit({ type: \"assistant_message\", itemId: \"sv\", text: reply });\n}\n\nfunction mockReply(ctx: Ctx): string {\n const base = [\n \"好的,我已经按你的要求改好了。\",\n \"\",\n \"## 改动\",\n \"- `src/index.ts`:把返回逻辑补成三变量求和\",\n \"- 新增一行常量 `z`\",\n \"\",\n \"```ts\",\n \"const z = 3;\",\n \"return x + y + z;\",\n \"```\",\n \"\",\n \"| 文件 | 变更 |\",\n \"|---|---|\",\n \"| src/index.ts | +2/-1 |\",\n \"\",\n \"测试全部通过。\",\n ].join(\"\\n\");\n return ctx.steerText() ? base + `\\n\\n> 插话:${ctx.steerText()}` : base;\n}\n\n// ---------- Provider ----------\n\n/** For tests: counts createSession calls */\nexport const mockProviderMetrics = { createSessionCalls: 0 };\n\nexport function createMockProvider(): Provider {\n return {\n id: \"mock\",\n name: \"Mock(演示)\",\n capabilities: mockCapabilities,\n async detect(): Promise<DetectResult> {\n return { available: true, bin: \"mock\", version: \"demo\" };\n },\n async listModels(): Promise<ModelInfo[]> {\n return [\n { id: \"demo-fast\", name: \"演示·快\", isDefault: true, efforts: [\"low\", \"medium\", \"high\"] },\n { id: \"demo-pro\", name: \"演示·强\", efforts: [\"low\", \"medium\", \"high\"] },\n ];\n },\n async createSession(o) {\n mockProviderMetrics.createSessionCalls++;\n return new MockSession(o);\n },\n };\n}\n","// Cross-platform executable lookup in PATH (shared by the plugin host index.mjs and the daemon; esbuild bundles it into dist for the daemon).\n//\n// which / where.exe are no longer used:\n// - some minimal Linux systems have no which;\n// - where.exe writes in the console code page (CP936 on Chinese Windows), so a Chinese user name or path is garbled when decoded as UTF-8,\n// existsSync fails and the CLI \"can't be found\".\n// Windows searches in PATHEXT order (.COM;.EXE;.BAT;.CMD), with .ps1 last; extensionless npm sh shims are never returned.\n// Besides PATH, add a set of common install directories: GUI apps launched from the macOS Dock/Finder only get launchd's minimal PATH\n// (Magpie adds the login shell's PATH itself; this is the fallback): Homebrew, npm global, Volta, Claude's native install, etc.\nimport { accessSync, constants, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\n\nfunction defaultExists(file, platform) {\n try {\n if (!statSync(file).isFile()) return false;\n if (platform !== \"win32\") accessSync(file, constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction envGet(env, name) {\n if (env[name] !== undefined) return env[name];\n // Windows environment variable names are case-insensitive (Path / PATH)\n const lower = name.toLowerCase();\n for (const key of Object.keys(env)) if (key.toLowerCase() === lower) return env[key];\n return undefined;\n}\n\n/** Common install directories that aren't necessarily in a GUI process's PATH (candidates only; callers check whether they exist). */\nexport function extraBinDirs({ platform = process.platform, env = process.env, home = homedir() } = {}) {\n const p = platform === \"win32\" ? path.win32 : path.posix;\n const dirs = [];\n if (platform === \"win32\") {\n const appData = envGet(env, \"APPDATA\");\n const localAppData = envGet(env, \"LOCALAPPDATA\");\n const programFiles = envGet(env, \"ProgramFiles\") || \"C:\\\\Program Files\";\n const nvmSymlink = envGet(env, \"NVM_SYMLINK\");\n if (home) dirs.push(p.join(home, \".local\", \"bin\"));\n if (appData) dirs.push(p.join(appData, \"npm\"));\n if (nvmSymlink) dirs.push(nvmSymlink);\n dirs.push(p.join(programFiles, \"nodejs\"));\n if (localAppData) dirs.push(p.join(localAppData, \"Programs\", \"nodejs\"));\n if (home) {\n dirs.push(p.join(home, \".volta\", \"bin\"));\n dirs.push(p.join(home, \".bun\", \"bin\"));\n }\n return dirs;\n }\n if (home) {\n dirs.push(p.join(home, \".local\", \"bin\"));\n dirs.push(p.join(home, \".npm-global\", \"bin\"));\n dirs.push(p.join(home, \".volta\", \"bin\"));\n dirs.push(p.join(home, \".bun\", \"bin\"));\n dirs.push(p.join(home, \".claude\", \"local\"));\n }\n if (platform === \"darwin\") dirs.push(\"/opt/homebrew/bin\");\n dirs.push(\"/usr/local/bin\", \"/usr/bin\", \"/bin\");\n return dirs;\n}\n\n/** PATH's directories followed by extraBinDirs; deduped (case-insensitive on Windows). */\nexport function searchDirs({ platform = process.platform, env = process.env, home = homedir(), extra = true } = {}) {\n const sep = platform === \"win32\" ? \";\" : \":\";\n const raw = String(envGet(env, \"PATH\") ?? \"\")\n .split(sep)\n .map((d) => d.trim().replace(/^\"(.*)\"$/, \"$1\"))\n .filter(Boolean);\n const all = extra ? [...raw, ...extraBinDirs({ platform, env, home })] : raw;\n const seen = new Set();\n const out = [];\n for (const d of all) {\n const key = platform === \"win32\" ? d.toLowerCase().replace(/[\\\\/]+$/, \"\") : d.replace(/\\/+$/, \"\");\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(d);\n }\n return out;\n}\n\nfunction windowsExts(env) {\n const list = String(envGet(env, \"PATHEXT\") || \".COM;.EXE;.BAT;.CMD\")\n .split(\";\")\n .map((e) => e.trim().toLowerCase())\n .filter((e) => e.startsWith(\".\"));\n if (!list.includes(\".ps1\")) list.push(\".ps1\");\n return list;\n}\n\n/**\n * Return the full paths of every hit, in order (PATH first, then extraBinDirs).\n * @param {string} name command name (may include an extension on Windows)\n */\nexport function findOnPath(\n name,\n { platform = process.platform, env = process.env, home = homedir(), extra = true, exists } = {},\n) {\n if (!name) return [];\n const p = platform === \"win32\" ? path.win32 : path.posix;\n const check = exists ?? ((file) => defaultExists(file, platform));\n // Already a path: check it directly\n if (name.includes(\"/\") || (platform === \"win32\" && name.includes(\"\\\\\"))) {\n return check(name) ? [name] : [];\n }\n let names = [name];\n if (platform === \"win32\") {\n const exts = windowsExts(env);\n const ext = p.extname(name).toLowerCase();\n names = ext && exts.includes(ext) ? [name] : exts.map((e) => name + e);\n }\n const hits = [];\n for (const dir of searchDirs({ platform, env, home, extra })) {\n for (const n of names) {\n const file = p.join(dir, n);\n if (check(file) && !hits.includes(file)) hits.push(file);\n }\n }\n return hits;\n}\n\n/** The resolved node executable, or null if not found (the plugin host is Bun, so process.execPath can't serve as node). */\nexport function findNode(opts = {}) {\n return findOnPath(\"node\", opts).find((file) => isNodeExecutable(file)) ?? null;\n}\n\n/** Whether process.execPath itself is node (rather than Bun / Electron etc.). */\nexport function isNodeExecutable(file) {\n return /^node(\\.exe)?$/i.test(String(file || \"\").split(/[\\\\/]/).pop() ?? \"\");\n}\n\nexport const NODE_MISSING_MESSAGE =\n \"找不到 Node.js(需要 20 或更高版本)。请安装 Node.js(https://nodejs.org)后完全退出并重新打开 Magpie。\" +\n \" / Node.js 20+ was not found on PATH. Install it, then quit and reopen Magpie.\";\nexport const NODE_TOO_OLD_MESSAGE =\n \"Node.js 版本太旧,需要 20 或更高版本。升级后完全退出并重新打开 Magpie。\" +\n \" / Node.js 20+ is required. Upgrade it, then quit and reopen Magpie.\";\n\n/**\n * For the plugin host: return the real node path (the host itself is Bun). If none is found, throw an error with a userMessage,\n * which the gate's 503 page displays; the daemon is no longer silently run on Bun.\n */\nexport function requireNode({ execPath = process.execPath, find = findNode } = {}) {\n if (isNodeExecutable(execPath)) return execPath;\n const hit = find();\n if (hit) return hit;\n const error = new Error(\"node not found on PATH\");\n error.code = \"ENODE\";\n error.userMessage = NODE_MISSING_MESSAGE;\n throw error;\n}\n","// Cross-platform executable resolution + process tree termination (ported from lib/bin.mjs).\n// Goal: start .cmd-shim CLIs like claude/codex without shell:true.\n\nimport { execFileSync, spawn, type ChildProcess, type SpawnOptions } from \"node:child_process\";\nimport { findOnPath, findNode as findNodeOnPath, isNodeExecutable } from \"../../../lib/pathscan.mjs\";\nimport { readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { tr } from \"./i18n.js\";\n\nconst IS_WIN = process.platform === \"win32\";\nconst cache = new Map<string, { out: ResolveResult; at: number }>();\nconst CACHE_MS = 60 * 1000;\n\nexport type ResolveResult =\n | {\n ok: true;\n cmd: string;\n prefixArgs: string[];\n display: string;\n via: string;\n /** via === \"cmd-shim\": a .cmd/.bat that must be started through cmd.exe (spawnBin / argvFor handle escaping) */\n shim?: string;\n }\n | { ok: false; reason: string };\n\n// PATH lookup lives in lib/pathscan.mjs: which / where.exe are no longer used (where's output uses the console code page, which garbles Chinese paths).\nfunction which(name: string): string[] {\n return findOnPath(name);\n}\n\n// ---- Windows: escaping when starting a .cmd/.bat through cmd.exe (same rules as cross-spawn) ----\nconst CMD_META = /([()\\][%!^\"`<>&|;, *?])/g;\n\nexport function escapeCmdCommand(cmd: string): string {\n return cmd.replace(CMD_META, \"^$1\");\n}\n\nexport function escapeCmdArgument(arg: string, doubleEscape: boolean): string {\n let a = String(arg);\n // First quote per CommandLineToArgvW rules (backslashes + quotes)\n a = a.replace(/(\\\\*)\"/g, '$1$1\\\\\"');\n a = a.replace(/(\\\\*)$/, \"$1$1\");\n a = `\"${a}\"`;\n // Then escape cmd metacharacters; batch files parse arguments again, so escape twice\n a = a.replace(CMD_META, \"^$1\");\n if (doubleEscape) a = a.replace(CMD_META, \"^$1\");\n return a;\n}\n\nexport type Argv = { cmd: string; args: string[]; windowsVerbatimArguments?: boolean };\n\n/** Resolution result + arguments → the command line actually given to spawn. */\nexport function argvFor(r: ResolveResult & { ok: true }, args: string[]): Argv {\n if (r.via === \"cmd-shim\" && r.shim) {\n const line = [escapeCmdCommand(r.shim), ...args.map((a) => escapeCmdArgument(a, true))].join(\" \");\n return { cmd: r.cmd, args: [\"/d\", \"/s\", \"/c\", `\"${line}\"`], windowsVerbatimArguments: true };\n }\n return { cmd: r.cmd, args: [...r.prefixArgs, ...args] };\n}\n\n// ---- Safety net: end Agent process trees still alive when the daemon exits ----\nconst liveTrees = new Set<number>();\nlet exitHookInstalled = false;\n\nfunction reapOnExit(): void {\n for (const pid of liveTrees) {\n try {\n if (IS_WIN) execFileSync(\"taskkill\", [\"/pid\", String(pid), \"/T\", \"/F\"], { stdio: \"ignore\", windowsHide: true, timeout: 3000 });\n else process.kill(-pid, \"SIGKILL\");\n } catch {}\n }\n liveTrees.clear();\n}\n\n/** Register a process to clean up when the daemon exits (on non-Windows it must lead a detached process group). */\nexport function trackTree(child: ChildProcess): void {\n if (child.pid == null) return;\n const pid = child.pid;\n liveTrees.add(pid);\n child.once(\"exit\", () => liveTrees.delete(pid));\n if (!exitHookInstalled) {\n exitHookInstalled = true;\n process.once(\"exit\", reapOnExit);\n }\n}\n\n/** Start a CLI from a resolution result. On non-Windows it gets its own process group (detached) so killTree can also end grandchildren. */\nexport function spawnBin(\n r: ResolveResult & { ok: true },\n args: string[],\n opts: SpawnOptions & { group?: boolean } = {},\n): ChildProcess {\n const a = argvFor(r, args);\n const { group, ...rest } = opts;\n const child = spawn(a.cmd, a.args, {\n windowsHide: true,\n ...rest,\n ...(a.windowsVerbatimArguments ? { windowsVerbatimArguments: true } : {}),\n ...(group && !IS_WIN ? { detached: true } : {}),\n });\n if (group) trackTree(child);\n return child;\n}\n\n// Find the script/program path a .cmd calls from its text.\nexport function shimTarget(\n cmdText: string,\n cmdDir: string | null,\n deps: { exists?: (p: string) => boolean; win?: boolean } = {},\n): string | null {\n const exists = deps.exists ?? existsSync;\n const P = (deps.win ?? IS_WIN) ? path.win32 : path;\n const cands: string[] = [];\n const re = /\"([^\"]+?\\.(?:js|mjs|cjs|exe|cmd|bat))\"/gi;\n let m: RegExpExecArray | null;\n while ((m = re.exec(cmdText))) cands.push(m[1]);\n const re2 = /(?:%~?dp0%?)?[A-Za-z]:?[\\\\/\\w.@-]*?\\.(?:js|mjs|cjs|exe)\\b/gi;\n while ((m = re2.exec(cmdText))) cands.push(m[0]);\n const found: string[] = [];\n for (const raw of cands) {\n let p = raw.replace(/%~?dp0%?/gi, \"\");\n p = p.replace(/%[A-Z_]+%/gi, \"\");\n p = p.trim().replace(/^[\\\\/]+/, \"\");\n if (!p || /%\\w+%/.test(p) || !/\\.(js|mjs|cjs|exe)$/i.test(p)) continue;\n if (!P.isAbsolute(p)) {\n if (!cmdDir) continue;\n p = P.join(cmdDir, p);\n }\n if (exists(p)) found.push(P.resolve(p));\n }\n // npm shims first write IF EXIST \"%dp0%\\node.exe\" (it really exists when the global dir is the node install dir, e.g. nvm-windows),\n // and only then the real cli.js: the script wins, node.exe itself is not the target\n return (\n found.find((f) => /\\.(js|mjs|cjs)$/i.test(f)) ??\n found.find((f) => /\\.exe$/i.test(f) && !isNodeExecutable(P.basename(f))) ??\n null\n );\n}\n\n// Which node to use when the shim points at a .js: the daemon itself runs on node, so prefer that one; otherwise node from PATH\nfunction findNode(): string {\n if (isNodeExecutable(process.execPath)) return process.execPath;\n return findNodeOnPath() ?? \"node\";\n}\n\nexport async function resolveBin(name: string): Promise<ResolveResult> {\n const hit = cache.get(name);\n if (hit && Date.now() - hit.at < CACHE_MS) return hit.out;\n const out = await resolveBinUncached(name);\n cache.set(name, { out, at: Date.now() });\n return out;\n}\n\nexport type ResolvedBin = ResolveResult & { ok: true; binName: string };\n\n/** Try several executable names from the catalog in order and return the first hit. */\nexport async function resolveFirstBin(names: string[]): Promise<ResolvedBin | ResolveResult> {\n const uniq = [...new Set(names.filter(Boolean))];\n for (const binName of uniq) {\n const r = await resolveBin(binName);\n if (r.ok) return { ...r, binName };\n }\n const label = uniq[0] ?? \"cli\";\n return { ok: false, reason: tr(\"bin.notOnPath\", { name: uniq.length > 1 ? uniq.join(tr(\"bin.or\")) : label }) };\n}\n\nexport function clearBinCache(name?: string): void {\n if (name) cache.delete(name);\n else cache.clear();\n}\n\nexport type ResolveDeps = {\n platform?: NodeJS.Platform;\n find?: (name: string) => string[];\n readText?: (file: string) => Promise<string>;\n exists?: (file: string) => boolean;\n node?: () => string;\n comspec?: string;\n};\n\nfunction resolveBinUncached(name: string): Promise<ResolveResult> {\n return resolveBinWith(name);\n}\n\n/** Implementation of resolveBin with injectable dependencies (tests simulate a Windows PATH / shims). */\nexport async function resolveBinWith(name: string, deps: ResolveDeps = {}): Promise<ResolveResult> {\n const platform = deps.platform ?? process.platform;\n const win = platform === \"win32\";\n const P = win ? path.win32 : path.posix;\n const exists = deps.exists ?? existsSync;\n const hits = (deps.find ?? which)(name);\n if (!hits.length) return { ok: false, reason: tr(\"bin.notOnPath\", { name }) };\n // Take the first hit in PATH order (same as typing the command in a terminal; within one directory on Windows, PATHEXT order)\n const first = hits[0];\n if (!win) return { ok: true, cmd: first, prefixArgs: [], display: first, via: \"path\" };\n\n const ext = P.extname(first).toLowerCase();\n if (ext === \".exe\" || ext === \".com\") return { ok: true, cmd: first, prefixArgs: [], display: first, via: \"exe\" };\n if (ext === \".ps1\") {\n return {\n ok: true,\n cmd: \"powershell.exe\",\n prefixArgs: [\"-NoProfile\", \"-NonInteractive\", \"-ExecutionPolicy\", \"Bypass\", \"-File\", first],\n display: first,\n via: \"ps1\",\n };\n }\n // .cmd / .bat\n const dir = P.dirname(first);\n if (name.toLowerCase() === \"npx\") {\n const node = P.join(dir, \"node.exe\");\n const cli = P.join(dir, \"node_modules\", \"npm\", \"bin\", \"npx-cli.js\");\n if (exists(node) && exists(cli))\n return { ok: true, cmd: node, prefixArgs: [cli], display: `${node} ${cli}`, via: \"npx-shim\" };\n }\n const text = await (deps.readText ?? ((f: string) => readFile(f, \"utf8\")))(first).catch(() => \"\");\n const target = shimTarget(text, dir, { exists, win: true });\n if (target && /\\.(js|mjs|cjs)$/i.test(target)) {\n const node = (deps.node ?? findNode)();\n return { ok: true, cmd: node, prefixArgs: [target], display: `${node} ${target}`, via: \"shim-js\" };\n }\n if (target && /\\.exe$/i.test(target)) {\n return { ok: true, cmd: target, prefixArgs: [], display: target, via: \"shim-exe\" };\n }\n // PowerShell / other .cmd wrappers: start through cmd.exe (e.g. cursor-agent); escaping happens in argvFor\n const comspec = deps.comspec ?? (process.env.ComSpec || \"cmd.exe\");\n return { ok: true, cmd: comspec, prefixArgs: [], display: first, via: \"cmd-shim\", shim: first };\n}\n\n// Windows: taskkill /T kills the whole tree; elsewhere: detached process group, kill(-pid).\nexport function killTree(child: ChildProcess | null | undefined, { graceMs = 3000 } = {}): Promise<void> {\n if (!child || child.pid == null) return Promise.resolve();\n const pid = child.pid;\n if (IS_WIN) {\n return new Promise((resolvePromise) => {\n const tk = spawn(\"taskkill\", [\"/pid\", String(pid), \"/T\", \"/F\"], { windowsHide: true });\n tk.on(\"error\", () => {\n try {\n child.kill();\n } catch {}\n resolvePromise();\n });\n tk.on(\"close\", () => resolvePromise());\n setTimeout(resolvePromise, graceMs + 2000);\n });\n }\n return new Promise((resolvePromise) => {\n let done = false;\n const finish = () => {\n if (!done) {\n done = true;\n resolvePromise();\n }\n };\n try {\n process.kill(-pid, \"SIGTERM\");\n } catch {\n try {\n child.kill(\"SIGTERM\");\n } catch {}\n }\n // A child that has already exited won't emit close again: no need to wait out graceMs\n if (child.exitCode !== null || child.signalCode !== null) {\n finish();\n return;\n }\n const t = setTimeout(() => {\n try {\n process.kill(-pid, \"SIGKILL\");\n } catch {\n try {\n child.kill(\"SIGKILL\");\n } catch {}\n }\n finish();\n }, graceMs);\n t.unref?.();\n child.on(\"close\", () => {\n clearTimeout(t);\n finish();\n });\n });\n}\n","// Tool name → kind / title / detail mapping (ported from lib/agents/kinds.mjs).\n// Adapters call callInfo(name, input, cwd) to get {kind, title, detail}; the frontend renders by kind.\nimport type { ToolKind } from \"../timeline/types.js\";\nimport { tr } from \"../util/i18n.js\";\nimport { existsSync } from \"node:fs\";\nimport { isAbsolute, resolve } from \"node:path\";\n\nconst MAX_CMD = 80;\nconst trunc = (s: string, n = MAX_CMD): string => (s.length > n ? s.slice(0, n - 1) + \"…\" : s);\n\nexport function relPath(p: string, cwd: string): string {\n if (!p) return \"\";\n const s = String(p);\n if (!cwd) return s;\n const norm = (x: string) => x.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n const a = norm(s);\n const b = norm(cwd);\n if (a.toLowerCase().startsWith(b.toLowerCase() + \"/\")) return a.slice(b.length + 1);\n if (a.toLowerCase() === b.toLowerCase()) return \".\";\n return s;\n}\n\n/** Whether a Write target already exists (checked when the tool call arrives, i.e. before it runs). */\nexport function targetExists(input: Record<string, unknown>, cwd = \"\"): boolean {\n const p = String(input.file_path ?? input.path ?? \"\");\n if (!p) return false;\n try {\n return existsSync(isAbsolute(p) || !cwd ? p : resolve(cwd, p));\n } catch {\n return false;\n }\n}\n\nexport type CallInfo = { kind: ToolKind; title: string; detail: Record<string, unknown> };\n\ntype ToolInput = Record<string, unknown> & { _exists?: boolean };\n\nexport function callInfo(name: string, input: ToolInput = {}, cwd = \"\"): CallInfo {\n const t = String(name || \"\");\n const f = (kind: ToolKind, title: string, detail: Record<string, unknown>): CallInfo => ({ kind, title, detail });\n const file = String(input.file_path ?? input.path ?? input.notebook_path ?? \"\");\n\n switch (t) {\n case \"Read\":\n return f(\"read\", tr(\"tool.read\", { x: relPath(file, cwd) }), { path: file, offset: input.offset, limit: input.limit });\n case \"Edit\":\n return f(\"edit\", tr(\"tool.edit\", { x: relPath(file, cwd) }), { path: file, old: input.old_string, new: input.new_string });\n case \"MultiEdit\":\n return f(\"edit\", tr(\"tool.multiEdit\", { x: relPath(file, cwd), n: ((input.edits as unknown[]) || []).length }), { path: file, edits: input.edits ?? [] });\n case \"Write\":\n return f(\"write\", tr(input._exists ? \"tool.overwrite\" : \"tool.create\", { x: relPath(file, cwd) }), { path: file, content: input.content });\n case \"NotebookEdit\":\n return f(\"edit\", tr(\"tool.notebook\", { x: relPath(String(input.notebook_path || file), cwd) }), { path: input.notebook_path ?? file });\n case \"Bash\":\n return f(\"bash\", tr(\"tool.run\", { x: trunc(String(input.command ?? \"\")) }), { command: input.command, description: input.description });\n case \"BashOutput\":\n return f(\"bash\", tr(\"tool.output\", { x: String(input.bash_id ?? \"\") }), { bashId: input.bash_id });\n case \"KillShell\":\n return f(\"bash\", tr(\"tool.kill\", { x: String(input.shell_id ?? \"\") }), { shellId: input.shell_id });\n case \"Grep\":\n return f(\"search\", tr(\"tool.grep\", { x: trunc(String(input.pattern ?? \"\"), 40) }), { pattern: input.pattern, path: input.path, glob: input.glob });\n case \"Glob\":\n case \"LS\":\n return f(\"glob\", tr(\"tool.glob\", { x: trunc(String(input.pattern ?? input.path ?? \"\"), 40) }), { pattern: input.pattern, path: input.path });\n case \"WebFetch\":\n return f(\"web\", tr(\"tool.fetch\", { x: hostOf(String(input.url ?? \"\")) }), { url: input.url });\n case \"WebSearch\":\n return f(\"web\", tr(\"tool.webSearch\", { x: trunc(String(input.query ?? \"\"), 40) }), { query: input.query });\n case \"TodoWrite\": {\n const items = todoItems((input.todos as { content?: string; text?: string; status?: string }[]) ?? []);\n const done = items.filter((x) => x.status === \"done\").length;\n return f(\"todo\", tr(\"tool.todo\", { done, n: items.length }), { items });\n }\n case \"Task\":\n case \"Agent\":\n return f(\"task\", tr(\"tool.task\", { x: trunc(String(input.description ?? input.prompt ?? \"\"), 40) }), { description: input.description });\n default:\n break;\n }\n const m = /^mcp__([^_]+)__(.+)$/.exec(t);\n if (m) return f(\"mcp\", `${m[1]} · ${m[2]}`, { server: m[1], tool: m[2] });\n return f(\"other\", t || tr(\"tool.generic\"), {});\n}\n\nfunction hostOf(url: string): string {\n try {\n return new URL(url).host;\n } catch {\n return String(url || \"\").slice(0, 40);\n }\n}\n\nexport function todoItems(todos: { content?: string; text?: string; status?: string }[] = []): { text: string; status: string }[] {\n return todos.map((x) => ({\n text: x.content || x.text || \"\",\n status: x.status === \"completed\" ? \"done\" : x.status === \"in_progress\" ? \"in_progress\" : \"pending\",\n }));\n}\n","// claude stream-json messages (and ~/.claude/projects jsonl lines) → ProviderEvent (§7.2.3). Ported from normalize in lib/agents/claude.mjs.\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { targetExists, callInfo, todoItems } from \"../../agents/kinds.js\";\nimport { editDetail } from \"../../agents/diff.js\";\nimport { tr } from \"../../util/i18n.js\";\n\nconst MAX_OUTPUT = 20 * 1024;\nconst ANSI_RE = /\\x1b\\[[0-9;]*[a-zA-Z]|\\x1b\\][^\\x07]*\\x07/g;\nconst clean = (s: string): string => String(s ?? \"\").replace(ANSI_RE, \"\");\n\nexport type MapState = {\n blocks: Map<number, string>; // content_block_start index → block type\n msgId: string; // Current streaming message.id\n // Streaming block index → unified itemId (msgId:type:ordinal within type).\n // claude's content_block index interleaves thinking/text, while the content array of the assistant event\n // may be renumbered (when thinking is split into another message, text goes back to 0) — a bare index would make\n // the delta and complete event itemIds diverge and the frontend render two duplicate replies. Align both sides by type + ordinal within type.\n itemIdByBlock: Map<number, string>;\n typeSeq: Map<string, number>; // Count of each block type in the current message (delta side)\n sawInterrupt: boolean; // After interrupt() the next result counts as interrupted\n};\n\nexport function newMapState(): MapState {\n return { blocks: new Map(), msgId: \"\", itemIdByBlock: new Map(), typeSeq: new Map(), sawInterrupt: false };\n}\n\n// Block type → short code and channel for itemIds; thinking/reasoning are one kind, text another; tool_use uses the tool id and doesn't go through here\nconst blockKind = (t: string): string =>\n t === \"thinking\" || t === \"redacted_thinking\" ? \"k\" : t === \"text\" ? \"t\" : \"x\";\n\nfunction itemIdFor(st: MapState, blockIdx: number, blkType: string): string {\n const k = blockKind(blkType);\n const n = st.typeSeq.get(k) ?? 0;\n st.typeSeq.set(k, n + 1);\n const id = `${st.msgId}:${k}${n}`;\n st.itemIdByBlock.set(blockIdx, id);\n return id;\n}\n\ntype Rec = Record<string, unknown>;\nconst rec = (v: unknown): Rec => (v && typeof v === \"object\" ? (v as Rec) : {});\nconst str = (v: unknown): string | undefined => (typeof v === \"string\" ? v : undefined);\n\n// One stream-json message → 0..n unified events\n/** total_cost_usd is Claude Code's estimate at Anthropic's prices. For another vendor's model behind a gateway (DeepSeek through\n * magpie, say) it is meaningless, so it is only kept when every model the turn used is a Claude model (B14). */\nexport function costIsReal(modelUsage: unknown): boolean {\n if (!modelUsage || typeof modelUsage !== \"object\") return true;\n const names = Object.keys(modelUsage as Record<string, unknown>);\n return names.every((n) => /claude|opus|sonnet|haiku/i.test(n));\n}\n\nexport function mapSdkMessage(m: unknown, st: MapState, cwd: string): ProviderEvent[] {\n const out: ProviderEvent[] = [];\n if (!m || typeof m !== \"object\") return out;\n const r = m as unknown as Rec;\n\n if (r.type === \"system\") {\n if (r.subtype === \"init\") {\n const sid = str(r.session_id) ?? \"\";\n if (sid) out.push({ type: \"provider_session_id\", id: sid });\n }\n // compact_boundary / status / api_retry etc. → lightweight notices\n if (r.subtype === \"api_retry\") {\n out.push({ type: \"notice\", level: \"warn\", message: tr(\"notice.apiRetry\", { n: String(r.attempt ?? \"?\") }) });\n }\n if (r.subtype === \"compact_boundary\") {\n out.push({ type: \"notice\", level: \"info\", message: tr(\"notice.compacted\") });\n }\n return out;\n }\n\n if (r.type === \"stream_event\") {\n const e = rec(r.event);\n if (e.type === \"message_start\") {\n const mid = str(rec(e.message).id);\n if (mid) st.msgId = mid;\n st.blocks.clear();\n st.itemIdByBlock.clear();\n st.typeSeq.clear();\n return out;\n }\n if (e.type === \"content_block_start\") {\n const idx = typeof e.index === \"number\" ? e.index : 0;\n const bt = str(rec(e.content_block).type) ?? \"\";\n st.blocks.set(idx, bt);\n itemIdFor(st, idx, bt); // Register index → unified itemId\n return out;\n }\n if (e.type === \"content_block_delta\") {\n const idx = typeof e.index === \"number\" ? e.index : 0;\n const d = rec(e.delta);\n // Fallback when a delta arrives before its start: infer and register from the delta type\n const itemId = st.itemIdByBlock.get(idx) ?? itemIdFor(st, idx, d.type === \"thinking_delta\" ? \"thinking\" : \"text\");\n if (d.type === \"text_delta\" && typeof d.text === \"string\" && d.text) {\n out.push({ type: \"assistant_delta\", itemId, text: d.text });\n } else if (d.type === \"thinking_delta\") {\n const t = str(d.thinking) ?? str(d.text);\n if (t) out.push({ type: \"reasoning_delta\", itemId, text: t });\n }\n // Ignore input_json_delta: wait for the complete tool_use in the assistant message\n }\n return out;\n }\n\n if (r.type === \"assistant\") {\n const mid = str(rec(r.message).id) ?? st.msgId ?? \"\";\n const content = rec(r.message).content;\n const parts = Array.isArray(content) ? content : [];\n // Same rule as the streaming side: build itemIds from type + ordinal within type so they overwrite the matching deltas\n const seqs = new Map<string, number>();\n parts.forEach((p) => {\n const blk = rec(p);\n const t = str(blk.type) ?? \"\";\n const k = blockKind(t);\n const n = seqs.get(k) ?? 0;\n seqs.set(k, n + 1);\n const itemId = `${mid}:${k}${n}`;\n if (blk.type === \"text\" && typeof blk.text === \"string\" && blk.text) {\n out.push({ type: \"assistant_message\", itemId, text: blk.text });\n } else if (blk.type === \"thinking\" || blk.type === \"redacted_thinking\") {\n const t2 = str(blk.thinking) ?? str(blk.text);\n if (t2) out.push({ type: \"reasoning\", itemId, text: t2 });\n } else if (blk.type === \"tool_use\") {\n out.push(...mapToolUse(blk, cwd));\n }\n });\n return out;\n }\n\n if (r.type === \"user\") {\n const content = rec(r.message).content;\n const parts = Array.isArray(content) ? content : [];\n for (const p of parts) {\n const blk = rec(p);\n if (blk.type === \"tool_result\") {\n const output = clean(contentText(blk.content));\n out.push({\n type: \"tool_call\",\n itemId: str(blk.tool_use_id) ?? \"\",\n kind: \"other\",\n title: \"\",\n status: blk.is_error ? \"failed\" : \"ok\",\n output: output.length > MAX_OUTPUT ? output.slice(0, MAX_OUTPUT) : output,\n });\n }\n }\n return out;\n }\n\n if (r.type === \"result\") {\n const usage = rec(r.usage);\n const num = (k: string): number => (typeof usage[k] === \"number\" ? (usage[k] as number) : 0);\n out.push({\n type: \"usage\",\n inputTokens: num(\"input_tokens\"),\n outputTokens: num(\"output_tokens\"),\n cacheReadTokens: num(\"cache_read_input_tokens\"),\n costUsd: typeof r.total_cost_usd === \"number\" && costIsReal(r.modelUsage) ? r.total_cost_usd : 0,\n });\n const subtype = str(r.subtype) ?? \"\";\n const interrupted = st.sawInterrupt || /interrupt/i.test(subtype);\n const isError = r.is_error === true;\n out.push({\n type: \"turn_ended\",\n turnId: \"\", // The session fills in the current turnId\n status: interrupted ? \"interrupted\" : isError ? \"failed\" : \"completed\",\n durationMs: typeof r.duration_ms === \"number\" ? r.duration_ms : undefined,\n error: isError && !interrupted ? str(r.result) ?? subtype : undefined,\n filesChanged: typeof r.num_turns === \"number\" ? undefined : undefined,\n });\n st.sawInterrupt = false;\n return out;\n }\n return out;\n}\n\nfunction mapToolUse(blk: Rec, cwd: string): ProviderEvent[] {\n const input = rec(blk.input);\n const name = str(blk.name) ?? \"tool\";\n const id = str(blk.id) ?? \"\";\n const info = callInfo(name, { ...input, _exists: name === \"Write\" ? targetExists(input, cwd) : true }, cwd);\n let detail: unknown = info.detail;\n if (info.kind === \"edit\" && (input.old_string !== undefined || Array.isArray(input.edits))) {\n detail = editDetail({ path: (info.detail as Rec).path as string, old: input.old_string, new: input.new_string, edits: input.edits });\n }\n if (info.kind === \"write\" && typeof input.content === \"string\") {\n const lines = input.content.split(\"\\n\");\n detail = { path: (info.detail as Rec).path, lines: lines.slice(0, 200), totalLines: lines.length };\n }\n const out: ProviderEvent[] = [\n {\n type: \"tool_call\",\n itemId: id,\n kind: info.kind,\n title: info.title,\n status: \"running\",\n input,\n detail,\n },\n ];\n if (name === \"TodoWrite\") {\n out.push({ type: \"todo\", items: todoItems((input.todos as { content?: string; status?: string }[]) ?? []) });\n }\n return out;\n}\n\nfunction contentText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) return content.map((p) => str(rec(p).text) ?? \"\").join(\"\");\n return \"\";\n}\n","import { existsSync } from \"node:fs\";\nimport type { AttachmentStore } from \"../store/attachments.js\";\nimport { validId } from \"./paths.js\";\nimport { tr } from \"./i18n.js\";\n\nlet globalAttachmentStore: AttachmentStore | null = null;\n\n/** Registered at main startup so Providers can resolve upload ids when reading images */\nexport function bindAttachmentStore(store: AttachmentStore): void {\n globalAttachmentStore = store;\n}\n\nasync function lookupAttachmentPath(ref: string): Promise<string | null> {\n const store = globalAttachmentStore;\n if (!store || !validId(ref)) return null;\n const att = await store.get(ref);\n return att?.path ?? null;\n}\n\nexport async function resolveAttachmentRefs(\n store: AttachmentStore,\n refs: { path: string; mime: string }[],\n): Promise<{ path: string; mime: string }[]> {\n const out: { path: string; mime: string }[] = [];\n for (const a of refs) {\n const att = validId(a.path) ? await store.get(a.path) : null;\n if (att) {\n out.push({ path: att.path, mime: att.mime || a.mime });\n continue;\n }\n const viaGlobal = await lookupAttachmentPath(a.path);\n if (viaGlobal) {\n out.push({ path: viaGlobal, mime: a.mime });\n continue;\n }\n if (existsSync(a.path)) {\n out.push(a);\n continue;\n }\n throw new Error(tr(\"attachment.missing\", { ref: a.path }));\n }\n return out;\n}\n\n/** One path: absolute path / upload id → the file under the attachments directory; throws on failure */\nexport async function resolveImagePath(ref: string): Promise<string> {\n if (existsSync(ref)) return ref;\n const p = await lookupAttachmentPath(ref);\n if (p) return p;\n throw new Error(tr(\"attachment.missing\", { ref: ref }));\n}\n","// What an attachment is, for deciding how each Agent gets it.\n// Only PNG, JPEG, GIF and WebP are images to the model APIs behind Claude Code, Codex and the ACP Agents\n// (Anthropic's Base64ImageSource.media_type is exactly these four); anything else is a file the Agent opens by path.\nexport const MODEL_IMAGE_MIMES = new Set([\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]);\n\nexport type AttachmentKind = \"image\" | \"text\" | \"other\";\n\n/** \"text/plain; charset=utf-8\" → \"text/plain\" */\nexport function baseMime(mime: string | undefined | null): string {\n return String(mime ?? \"\").split(\";\")[0].trim().toLowerCase();\n}\n\nconst TEXT_APP = new Set([\"application/json\", \"application/xml\", \"application/yaml\", \"application/x-yaml\", \"application/toml\", \"application/javascript\"]);\n\nexport function attachmentKind(mime: string | undefined | null): AttachmentKind {\n const m = baseMime(mime);\n if (MODEL_IMAGE_MIMES.has(m)) return \"image\";\n if (m.startsWith(\"text/\") || TEXT_APP.has(m)) return \"text\";\n return \"other\";\n}\n\n/** The line an Agent gets for an attachment sent by path */\nexport function pathNote(kind: AttachmentKind, file: string): string {\n return `${kind === \"image\" ? \"Attached image\" : \"Attached file\"}: ${file}`;\n}\n","// One user message → the content blocks of a claude stream-json user message (Anthropic Messages content).\n// - PNG / JPEG / GIF / WebP (Base64ImageSource's media types), up to 5 MB each: an image block\n// - text files up to 1 MB: a document block with a plain-text source (DocumentBlockParam + PlainTextSource)\n// - anything else, or too large: the file's absolute path in the text, which Claude Code can Read; with a warning\n// for files that aren't images or text, so the user knows\nimport { readFile, stat } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { resolveImagePath } from \"../../util/attachmentRefs.js\";\nimport { attachmentKind, baseMime, pathNote } from \"../../util/attachmentKinds.js\";\n\n/** Anthropic's per-image limit */\nexport const CLAUDE_MAX_IMAGE_BYTES = 5 * 1024 * 1024;\nexport const CLAUDE_MAX_TEXT_BYTES = 1024 * 1024;\n\ntype ImageMedia = \"image/png\" | \"image/jpeg\" | \"image/gif\" | \"image/webp\";\nexport type ClaudeBlock =\n | { type: \"text\"; text: string }\n | { type: \"image\"; source: { type: \"base64\"; media_type: ImageMedia; data: string } }\n | { type: \"document\"; source: { type: \"text\"; media_type: \"text/plain\"; data: string }; title?: string; context?: string };\n\nexport async function buildClaudeContent(\n text: string,\n attachments: { path: string; mime: string }[],\n): Promise<{ blocks: ClaudeBlock[]; warnings: string[] }> {\n const media: ClaudeBlock[] = [];\n const notes: string[] = [];\n const warnings: string[] = [];\n for (const a of attachments) {\n let file: string;\n let size: number;\n try {\n file = await resolveImagePath(a.path);\n size = (await stat(file)).size;\n } catch (e) {\n warnings.push(`${a.path}: ${String((e as Error)?.message ?? e)}`);\n continue;\n }\n const kind = attachmentKind(a.mime);\n try {\n if (kind === \"image\" && size <= CLAUDE_MAX_IMAGE_BYTES) {\n const data = (await readFile(file)).toString(\"base64\");\n media.push({ type: \"image\", source: { type: \"base64\", media_type: baseMime(a.mime) as ImageMedia, data } });\n continue;\n }\n if (kind === \"text\" && size <= CLAUDE_MAX_TEXT_BYTES) {\n const data = await readFile(file, \"utf8\");\n media.push({ type: \"document\", source: { type: \"text\", media_type: \"text/plain\", data }, title: basename(file), context: file });\n continue;\n }\n } catch (e) {\n warnings.push(`${basename(file)}: ${String((e as Error)?.message ?? e)}`);\n }\n notes.push(pathNote(kind, file));\n if (kind === \"other\") warnings.push(`${basename(file)} (${baseMime(a.mime) || \"unknown type\"}) is not an image or a text file; sent its path`);\n else if (kind === \"image\" && size > CLAUDE_MAX_IMAGE_BYTES) warnings.push(`${basename(file)}: ${(size / 1024 / 1024).toFixed(1)} MB, over Claude's 5 MB image limit; sent its path`);\n else if (kind === \"text\" && size > CLAUDE_MAX_TEXT_BYTES) warnings.push(`${basename(file)}: ${(size / 1024 / 1024).toFixed(1)} MB, too large to attach inline; sent its path`);\n }\n const fullText = [text, ...(notes.length ? [notes.join(\"\\n\")] : [])].filter(Boolean).join(\"\\n\\n\");\n // Media first, as before; the text block always comes last (claude needs at least one block)\n return { blocks: [...media, { type: \"text\", text: fullText }], warnings };\n}\n","// Settings › Launch command: a custom executable for an Agent plus extra arguments.\n// The arguments the user types are APPENDED after the built-in ones (e.g. `opencode acp --foo`, `codex app-server --foo`,\n// `claude <stream-json flags> --foo`). prefixArgs is internal (tests run `node fixture.mjs`) and goes before the built-ins.\nimport type { LaunchCommand } from \"./types.js\";\nimport type { Settings } from \"../store/settings.js\";\nimport { resolveBin, type ResolveResult } from \"../util/bin.js\";\nimport { tr } from \"../util/i18n.js\";\n\nexport function launchFromSettings(settings: Settings, providerId: string): LaunchCommand | undefined {\n const c = settings.providerCommand?.[providerId];\n const cmd = typeof c?.executable === \"string\" ? c.executable.trim() : \"\";\n if (!cmd) return undefined;\n const args = Array.isArray(c?.args) ? c!.args.filter((a): a is string => typeof a === \"string\") : [];\n return { cmd, args };\n}\n\n/** Built-in arguments wrapped with the launch command's internal prefix and the user's extra arguments. */\nexport function launchArgv(builtin: string[], launch?: LaunchCommand): string[] {\n return [...(launch?.prefixArgs ?? []), ...builtin, ...(launch?.args ?? [])];\n}\n\n/** Resolve a custom executable (absolute path or a name on PATH; Windows .cmd/.ps1 shims are handled by resolveBin). */\nexport async function resolveLaunch(launch: LaunchCommand): Promise<ResolveResult> {\n const r = await resolveBin(launch.cmd);\n if (r.ok) return r;\n return { ok: false, reason: tr(\"launch.notFound\", { cmd: launch.cmd }) };\n}\n\nexport function launchKey(launch?: LaunchCommand): string {\n return launch ? `${launch.cmd}\\0${(launch.prefixArgs ?? []).join(\"\\0\")}\\0\\0${(launch.args ?? []).join(\"\\0\")}` : \"\";\n}\n","// The user's own `claude` CLI driven over its stream-json protocol (no SDK):\n// claude -p --input-format stream-json --output-format stream-json --verbose --include-partial-messages\n// --permission-prompt-tool stdio [--model m] [--permission-mode p] [--effort e] [--resume id]\n// stdin and stdout carry one JSON object per line. Besides the conversation messages (user / assistant / system /\n// stream_event / result), both sides send control messages:\n// → {type:\"control_request\", request_id, request:{subtype:\"initialize\" | \"interrupt\" | \"set_model\" | \"set_permission_mode\", ...}}\n// ← {type:\"control_response\", response:{subtype:\"success\" | \"error\", request_id, response? | error?}}\n// ← {type:\"control_request\", request_id, request:{subtype:\"can_use_tool\", tool_name, input, tool_use_id, ...}}\n// → {type:\"control_response\", response:{subtype:\"success\", request_id, response:{behavior:\"allow\", updatedInput} | {behavior:\"deny\", message, interrupt?}}}\n// ← {type:\"control_cancel_request\", request_id} (the CLI no longer waits for that answer)\nimport type { LaunchCommand } from \"../types.js\";\nimport { launchArgv } from \"../launch.js\";\nimport type { ChildProcess } from \"node:child_process\";\nimport { killTree, spawnBin, type ResolveResult } from \"../../util/bin.js\";\nimport { AsyncQueue } from \"../../util/queue.js\";\n\nexport type ClaudeBin = ResolveResult & { ok: true };\nexport type Json = Record<string, unknown>;\n\nexport type ClaudeCliOpts = {\n bin: ClaudeBin;\n cwd: string;\n model: string | null;\n permissionMode: string;\n effort: string | null;\n resume: string | null;\n env?: NodeJS.ProcessEnv;\n /** Settings › Launch command: internal prefix before, user args after the built-in flags */\n launch?: LaunchCommand;\n};\n\nexport type PermissionDecision =\n | { behavior: \"allow\"; updatedInput: Json }\n | { behavior: \"deny\"; message: string; interrupt?: boolean };\n\nexport type ToolRequest = { toolName: string; input: Json; toolUseId?: string; signal: AbortSignal };\nexport type CanUseTool = (req: ToolRequest) => Promise<PermissionDecision>;\n\n/** Session ids and model / mode / effort names become argv: plain tokens only, so nothing can turn into another flag. */\nconst SAFE_ARG = /^[A-Za-z0-9][A-Za-z0-9._:\\[\\]\\/@+-]{0,199}$/;\n\nexport function claudeArgs(o: Pick<ClaudeCliOpts, \"model\" | \"permissionMode\" | \"effort\" | \"resume\">): string[] {\n const args = [\n \"-p\",\n \"--input-format\", \"stream-json\",\n \"--output-format\", \"stream-json\",\n \"--verbose\",\n \"--include-partial-messages\",\n \"--permission-prompt-tool\", \"stdio\",\n \"--setting-sources\", \"user,project,local\",\n ];\n const put = (flag: string, v: string | null | undefined) => {\n if (!v) return;\n if (!SAFE_ARG.test(v)) throw new Error(`Refusing to pass an unexpected value to claude ${flag}: ${JSON.stringify(v).slice(0, 80)}`);\n args.push(flag, v);\n };\n put(\"--permission-mode\", o.permissionMode);\n // claude only takes bypassPermissions when it is allowed at launch; it is not allowed otherwise (a later switch\n // into it restarts the CLI with --resume)\n if (o.permissionMode === \"bypassPermissions\") args.push(\"--allow-dangerously-skip-permissions\");\n put(\"--model\", o.model);\n put(\"--effort\", o.effort);\n put(\"--resume\", o.resume);\n return args;\n}\n\ntype Pending = { resolve: (v: Json) => void; reject: (e: Error) => void; timer?: NodeJS.Timeout };\n\nexport class ClaudeCli {\n /** Conversation messages (everything that is not a control message) */\n readonly messages = new AsyncQueue<Json>();\n readonly exited: Promise<{ code: number | null; signal: NodeJS.Signals | null }>;\n /** The answer to initialize (commands, models, account …), null when it failed */\n readonly initialized: Promise<Json | null>;\n private child: ChildProcess;\n private buf = \"\";\n private seq = 0;\n private pending = new Map<string, Pending>();\n private cancels = new Map<string, AbortController>();\n private stderrTail = \"\";\n private dead = false;\n private spawnError: Error | null = null;\n\n constructor(private o: ClaudeCliOpts, private canUseTool: CanUseTool) {\n const args = launchArgv(claudeArgs(o), o.launch);\n this.child = spawnBin(o.bin, args, {\n cwd: o.cwd,\n env: { ...(o.env ?? process.env), NO_COLOR: \"1\", FORCE_COLOR: \"0\" },\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n group: true,\n });\n this.child.stdout?.setEncoding(\"utf8\");\n this.child.stdout?.on(\"data\", (d: string) => this.onData(d));\n this.child.stderr?.on(\"data\", (d: Buffer) => {\n this.stderrTail = (this.stderrTail + d.toString()).slice(-4096);\n });\n this.child.stdin?.on(\"error\", () => {}); // EPIPE after the CLI exits: reported through exited\n this.exited = new Promise((resolve) => {\n this.child.on(\"error\", (e) => {\n this.spawnError = e;\n this.finish();\n resolve({ code: null, signal: null });\n });\n this.child.on(\"close\", (code, signal) => {\n this.finish();\n resolve({ code, signal });\n });\n });\n this.initialized = this.request({ subtype: \"initialize\" }, 60000).catch(() => null);\n }\n\n get stderr(): string {\n return this.stderrTail;\n }\n\n get failure(): Error | null {\n return this.spawnError;\n }\n\n get alive(): boolean {\n return !this.dead;\n }\n\n private finish(): void {\n if (this.dead) return;\n this.dead = true;\n for (const [, p] of this.pending) {\n if (p.timer) clearTimeout(p.timer);\n p.reject(new Error(\"claude exited\"));\n }\n this.pending.clear();\n for (const [, c] of this.cancels) c.abort();\n this.cancels.clear();\n this.messages.close();\n }\n\n private onData(d: string): void {\n this.buf += d;\n let i: number;\n while ((i = this.buf.indexOf(\"\\n\")) >= 0) {\n const line = this.buf.slice(0, i).trim();\n this.buf = this.buf.slice(i + 1);\n if (!line) continue;\n let m: Json;\n try {\n m = JSON.parse(line);\n } catch {\n continue; // a stray non-JSON line (warnings some versions print) is not part of the protocol\n }\n if (m && typeof m === \"object\") this.onMessage(m);\n }\n }\n\n private onMessage(m: Json): void {\n if (m.type === \"control_response\") {\n const r = (m.response ?? {}) as Json;\n const id = String(r.request_id ?? \"\");\n const p = this.pending.get(id);\n if (!p) return;\n this.pending.delete(id);\n if (p.timer) clearTimeout(p.timer);\n if (r.subtype === \"success\") p.resolve((r.response ?? {}) as Json);\n else p.reject(new Error(String(r.error ?? \"control request failed\")));\n return;\n }\n if (m.type === \"control_request\") {\n void this.onControlRequest(String(m.request_id ?? \"\"), (m.request ?? {}) as Json);\n return;\n }\n if (m.type === \"control_cancel_request\") {\n const id = String(m.request_id ?? \"\");\n this.cancels.get(id)?.abort();\n this.cancels.delete(id);\n return;\n }\n if (m.type === \"keep_alive\") return;\n this.messages.push(m);\n }\n\n private async onControlRequest(id: string, req: Json): Promise<void> {\n if (req.subtype !== \"can_use_tool\") {\n // hooks, in-process MCP servers, elicitation …: none are registered, so say so instead of leaving the CLI waiting\n this.write({ type: \"control_response\", response: { subtype: \"error\", request_id: id, error: `Unsupported control request: ${String(req.subtype)}` } });\n return;\n }\n const ac = new AbortController();\n this.cancels.set(id, ac);\n try {\n const decision = await this.canUseTool({\n toolName: String(req.tool_name ?? \"\"),\n input: (req.input && typeof req.input === \"object\" ? req.input : {}) as Json,\n toolUseId: typeof req.tool_use_id === \"string\" ? req.tool_use_id : undefined,\n signal: ac.signal,\n });\n if (ac.signal.aborted && !this.cancels.has(id)) return; // cancelled by the CLI: it no longer reads this answer\n this.write({ type: \"control_response\", response: { subtype: \"success\", request_id: id, response: decision } });\n } catch (e) {\n this.write({ type: \"control_response\", response: { subtype: \"error\", request_id: id, error: String((e as Error)?.message ?? e) } });\n } finally {\n this.cancels.delete(id);\n }\n }\n\n private write(o: Json): boolean {\n if (this.dead || !this.child.stdin || this.child.stdin.destroyed) return false;\n try {\n this.child.stdin.write(JSON.stringify(o) + \"\\n\");\n return true;\n } catch {\n return false;\n }\n }\n\n /** Send one control request and wait for its answer */\n request(request: Json, timeoutMs = 10000): Promise<Json> {\n if (this.dead) return Promise.reject(new Error(\"claude is not running\"));\n const id = `ac_${++this.seq}_${Math.random().toString(36).slice(2, 8)}`;\n return new Promise<Json>((resolve, reject) => {\n const p: Pending = { resolve, reject };\n p.timer = setTimeout(() => {\n if (this.pending.delete(id)) reject(new Error(`claude did not answer ${String(request.subtype)} in ${Math.round(timeoutMs / 1000)} s`));\n }, timeoutMs);\n this.pending.set(id, p);\n if (!this.write({ type: \"control_request\", request_id: id, request })) {\n this.pending.delete(id);\n clearTimeout(p.timer);\n reject(new Error(\"claude is not running\"));\n }\n });\n }\n\n /** One user message into the conversation */\n sendUser(content: unknown[], sessionId: string | null): boolean {\n return this.write({ type: \"user\", message: { role: \"user\", content }, parent_tool_use_id: null, session_id: sessionId ?? \"\" });\n }\n\n interrupt(): Promise<Json> {\n return this.request({ subtype: \"interrupt\" }, 5000);\n }\n\n setModel(model: string | null): Promise<Json> {\n return this.request(model ? { subtype: \"set_model\", model } : { subtype: \"set_model\" });\n }\n\n setPermissionMode(mode: string): Promise<Json> {\n return this.request({ subtype: \"set_permission_mode\", mode });\n }\n\n /** End stdin (the CLI finishes and exits), then end the process tree if it lingers */\n async close(graceMs = 2000): Promise<void> {\n try {\n this.child.stdin?.end();\n } catch {}\n const done = await Promise.race([this.exited.then(() => true), new Promise<boolean>((r) => setTimeout(() => r(false), graceMs))]);\n if (!done) await killTree(this.child, { graceMs: 500 });\n this.finish();\n }\n}\n","// Claude ProviderSession (§7.2.2/7.2.4/7.2.5/7.2.6): the user's own `claude` CLI over stream-json (./cli.ts),\n// one process per conversation, streaming, permissions, interrupt, hot switching. No SDK.\nimport type { LaunchCommand, ProviderSession, SendInput, RespondAnswer, Mode, SlashCommand } from \"../types.js\";\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { AsyncQueue } from \"../../util/queue.js\";\nimport { targetExists, callInfo } from \"../../agents/kinds.js\";\nimport { editDetail } from \"../../agents/diff.js\";\nimport { mapSdkMessage, newMapState, type MapState } from \"./map.js\";\nimport { log } from \"../../log.js\";\nimport { buildClaudeContent } from \"./content.js\";\nimport { tr } from \"../../util/i18n.js\";\nimport { classifyClaudeSlashCommand, sortSlashCommands } from \"../slash.js\";\nimport { ClaudeCli, type ClaudeBin, type PermissionDecision, type ToolRequest } from \"./cli.js\";\n\nconst EFFORTS = [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"];\nconst MODES = [\"plan\", \"default\", \"acceptEdits\", \"bypassPermissions\"];\nconst rid = () => Math.random().toString(36).slice(2, 10);\n\ntype PendingReq = {\n kind: \"permission\" | \"question\";\n resolve: (r: RespondAnswer) => void;\n};\n\nexport type ClaudeSessionOpts = {\n threadId: string;\n cwd: string;\n model: string | null;\n mode: Mode;\n effort: string | null;\n resumeId: string | null;\n /** The user's claude, as resolveBin found it (a .cmd / .ps1 shim is started through cmd.exe / PowerShell by spawnBin) */\n bin: ClaudeBin;\n launch?: LaunchCommand;\n /** Environment for the CLI (tests point it at a stand-in); process.env when absent */\n env?: NodeJS.ProcessEnv;\n onModeChange?: (mode: Mode) => void; // Callback when a plan is approved → default (the manager updates meta)\n};\n\nexport class ClaudeSession implements ProviderSession {\n events: AsyncIterable<ProviderEvent>;\n private q = new AsyncQueue<ProviderEvent>();\n private cli: ClaudeCli | null = null;\n private sessionId: string | null;\n private turnId: string | null = null;\n private turnNum = 0;\n private st: MapState = newMapState();\n private pending = new Map<string, PendingReq>();\n private needsRestart = false;\n private restarting: Promise<void> | null = null;\n private closed = false;\n private stopping = new WeakSet<ClaudeCli>();\n private pumpDone: Promise<void> | null = null;\n /** Mode the running CLI was started with (bypassPermissions has to be allowed at launch) */\n private launchedMode: string | null = null;\n\n constructor(private o: ClaudeSessionOpts) {\n this.sessionId = o.resumeId;\n this.events = this.q;\n }\n\n // The CLI is only started before the first send (or a command list request)\n private ensureCli(): ClaudeCli {\n if (this.cli && !this.needsRestart) return this.cli;\n this.st = newMapState();\n const effort = this.o.effort && EFFORTS.includes(this.o.effort) ? this.o.effort : null;\n const cli = new ClaudeCli(\n {\n bin: this.o.bin,\n cwd: this.o.cwd,\n model: this.o.model,\n permissionMode: MODES.includes(this.o.mode) ? this.o.mode : \"default\",\n effort,\n resume: this.sessionId,\n env: this.o.env,\n launch: this.o.launch,\n },\n (req) => this.canUseTool(req),\n );\n this.cli = cli;\n this.launchedMode = this.o.mode;\n this.needsRestart = false;\n this.pumpDone = this.pump(cli);\n return cli;\n }\n\n private async pump(cli: ClaudeCli): Promise<void> {\n for await (const m of cli.messages) {\n for (const ev of mapSdkMessage(m, this.st, this.o.cwd)) this.emit(ev);\n }\n const exit = await cli.exited;\n // A CLI this session stopped on purpose (restart / close) is not a crash\n if (this.closed || this.stopping.has(cli)) return;\n const detail = cli.failure\n ? tr(\"claude.startFailed\", { detail: String(cli.failure.message) })\n : tr(\"claude.exited\", { code: String(exit.code ?? exit.signal ?? \"?\") });\n const tail = cli.stderr.trim().slice(-400);\n this.emit({ type: \"notice\", level: \"error\", message: tail ? `${detail} — stderr: ${tail}` : detail });\n if (this.turnId) this.emit({ type: \"turn_ended\", turnId: this.turnId, status: \"failed\", error: detail });\n this.turnId = null;\n // The event stream ended: an old CLI that restart() replaced must not close the event queue\n if (this.cli === cli) {\n this.needsRestart = true; // Rebuild with --resume on the next send\n this.q.close();\n }\n }\n\n private emit(ev: ProviderEvent): void {\n if (ev.type === \"turn_ended\" && !ev.turnId) ev.turnId = this.turnId ?? \"unknown\";\n if (ev.type === \"turn_ended\") this.turnId = null;\n if (ev.type === \"provider_session_id\" && ev.id) this.sessionId = ev.id;\n this.q.push(ev);\n }\n\n async send(input: SendInput): Promise<void> {\n if (this.closed) throw new Error(tr(\"claude.closed\"));\n if (this.needsRestart) await this.restart();\n const cli = this.ensureCli();\n this.turnNum++;\n this.turnId = \"u_\" + Date.now().toString(36) + \"_\" + this.turnNum;\n this.st.sawInterrupt = false; // A new turn clears the old interrupt flag\n this.emit({\n type: \"turn_started\",\n turnId: this.turnId,\n model: this.o.model,\n mode: this.o.mode,\n effort: this.o.effort,\n });\n const built = await buildClaudeContent(input.text, input.images ?? []);\n for (const w of built.warnings) this.emit({ type: \"notice\", level: \"warn\", message: tr(\"notice.attachmentIssue\", { detail: w }) });\n if (!cli.sendUser(built.blocks, this.sessionId)) throw new Error(tr(\"claude.notRunning\"));\n }\n\n private async restart(): Promise<void> {\n if (this.restarting) return this.restarting;\n this.restarting = (async () => {\n const old = this.cli;\n this.cli = null;\n if (old) {\n this.stopping.add(old);\n await old.close().catch(() => {});\n }\n if (this.pumpDone) await this.pumpDone.catch(() => {});\n try {\n this.ensureCli();\n } finally {\n this.restarting = null;\n }\n })();\n return this.restarting;\n }\n\n // ---- permissions (§7.2.4) ----\n private canUseTool(req: ToolRequest): Promise<PermissionDecision> {\n const { toolName, input, signal } = req;\n const requestId = \"perm_\" + rid();\n const opts = { toolUseID: req.toolUseId };\n\n if (toolName === \"ExitPlanMode\") {\n return this.handlePlanMode(requestId, input, signal, opts.toolUseID);\n }\n if (toolName === \"AskUserQuestion\" && Array.isArray(input.questions)) {\n return this.handleQuestion(requestId, input, signal);\n }\n\n const info = callInfo(toolName, { ...input, _exists: toolName === \"Write\" ? targetExists(input, this.o.cwd) : true }, this.o.cwd);\n let detail: Record<string, unknown> = { ...(info.detail as Record<string, unknown>), toolName };\n if (info.kind === \"edit\" && (input.old_string !== undefined || Array.isArray(input.edits))) {\n detail = { ...editDetail({ path: info.detail.path as string, old: input.old_string, new: input.new_string, edits: input.edits }), toolName };\n }\n this.emit({\n type: \"permission_request\",\n requestId,\n title: info.title,\n kind: \"tool\",\n detail,\n options: [\n { id: \"allow\", label: tr(\"perm.allow\"), kind: \"allow_once\" },\n { id: \"allow_always\", label: tr(\"perm.allowSession\"), kind: \"allow_always\" },\n { id: \"deny\", label: tr(\"perm.deny\"), kind: \"reject_once\" },\n ],\n });\n return new Promise<PermissionDecision>((resolve) => {\n this.pending.set(requestId, { kind: \"permission\", resolve: (a) => resolve(this.toPermissionDecision(a, input)) });\n signal.addEventListener(\"abort\", () => {\n if (this.pending.delete(requestId)) {\n this.emit({ type: \"permission_resolved\", requestId, cancelled: true });\n resolve({ behavior: \"deny\", message: \"Cancelled by the user\", interrupt: true });\n }\n }, { once: true });\n });\n }\n\n private toPermissionDecision(a: RespondAnswer, input: Record<string, unknown>): PermissionDecision {\n if (a.cancelled || a.optionId === \"deny\") {\n return { behavior: \"deny\", message: \"The user denied this action\", ...(a.cancelled ? { interrupt: true } : {}) };\n }\n return { behavior: \"allow\", updatedInput: input };\n }\n\n private async handlePlanMode(requestId: string, input: Record<string, unknown>, signal: AbortSignal, toolUseID?: string): Promise<PermissionDecision> {\n const planText = typeof input.plan === \"string\" ? input.plan : \"\";\n if (planText) {\n this.emit({ type: \"plan\", itemId: toolUseID ?? requestId, markdown: planText });\n }\n this.emit({\n type: \"permission_request\",\n requestId,\n title: tr(\"perm.plan\"),\n kind: \"plan\",\n detail: { plan: planText },\n options: [\n { id: \"implement\", label: tr(\"perm.implement\"), kind: \"allow_once\" },\n { id: \"reject\", label: tr(\"perm.deny\"), kind: \"reject_once\" },\n ],\n });\n const answer = await new Promise<RespondAnswer>((resolve) => {\n this.pending.set(requestId, { kind: \"permission\", resolve: (a) => resolve(a as RespondAnswer) });\n signal.addEventListener(\"abort\", () => {\n if (this.pending.delete(requestId)) {\n this.emit({ type: \"permission_resolved\", requestId, cancelled: true });\n resolve({ cancelled: true });\n }\n }, { once: true });\n });\n if (answer.cancelled || answer.optionId === \"reject\") {\n return { behavior: \"deny\", message: \"The user rejected the plan; revise it based on their feedback\", ...(answer.cancelled ? { interrupt: true } : {}) };\n }\n // implement: switch back to default mode\n try {\n await this.cli?.setPermissionMode(\"default\");\n this.o.mode = \"default\";\n this.o.onModeChange?.(\"default\");\n } catch (e) {\n log(\"warn\", \"setPermissionMode(default) 失败\", { err: String(e) });\n }\n return { behavior: \"allow\", updatedInput: input };\n }\n\n private async handleQuestion(requestId: string, input: Record<string, unknown>, signal: AbortSignal): Promise<PermissionDecision> {\n this.emit({ type: \"question\", requestId, questions: input.questions as unknown[] });\n const answer = await new Promise<RespondAnswer>((resolve) => {\n this.pending.set(requestId, { kind: \"question\", resolve: (a) => resolve(a as RespondAnswer) });\n signal.addEventListener(\"abort\", () => {\n if (this.pending.delete(requestId)) {\n this.emit({ type: \"permission_resolved\", requestId, cancelled: true });\n resolve({ cancelled: true });\n }\n }, { once: true });\n });\n if (answer.cancelled) {\n return { behavior: \"deny\", message: \"The user cancelled the question\", interrupt: true };\n }\n // answers are keyed by the question text (Claude's AskUserQuestion schema keys answers by question text)\n const questions = (input.questions as { question?: string; header?: string }[]) ?? [];\n const normalized: Record<string, string> = {};\n for (const ques of questions) {\n const text = ques.question;\n if (!text) continue;\n const v = answer.answers?.[text] ?? (ques.header ? answer.answers?.[ques.header] : undefined);\n if (v) normalized[text] = v;\n }\n return { behavior: \"allow\", updatedInput: { ...input, answers: normalized } };\n }\n\n respond(requestId: string, answer: RespondAnswer): void {\n const p = this.pending.get(requestId);\n if (p) {\n this.pending.delete(requestId);\n p.resolve(answer);\n }\n }\n\n async interrupt(): Promise<void> {\n this.st.sawInterrupt = true;\n // Cancel every pending permission/question\n for (const [id, p] of this.pending) {\n this.emit({ type: \"permission_resolved\", requestId: id, cancelled: true });\n p.resolve({ cancelled: true });\n }\n this.pending.clear();\n const cli = this.cli;\n if (!cli || !cli.alive) return;\n try {\n await cli.interrupt();\n } catch (e) {\n // No answer: stop this CLI; the next send starts it again with --resume\n log(\"warn\", \"claude interrupt failed\", { err: String(e) });\n this.stopping.add(cli);\n this.needsRestart = true;\n void cli.close(500);\n if (this.turnId) this.emit({ type: \"turn_ended\", turnId: this.turnId, status: \"interrupted\" });\n }\n }\n\n async setModel(model: string | null): Promise<void> {\n this.o.model = model;\n if (!this.cli?.alive) return;\n try {\n await this.cli.setModel(model);\n } catch (e) {\n log(\"warn\", \"claude set_model failed\", { err: String(e) });\n this.needsRestart = true;\n }\n }\n\n async setMode(mode: Mode): Promise<void> {\n this.o.mode = mode;\n if (!this.cli?.alive) return;\n // bypassPermissions is only accepted by a CLI started with it allowed: restart into it (--resume keeps the context)\n if (mode === \"bypassPermissions\" && this.launchedMode !== \"bypassPermissions\") {\n this.needsRestart = true;\n return;\n }\n try {\n await this.cli.setPermissionMode(mode);\n } catch (e) {\n log(\"warn\", \"claude set_permission_mode failed\", { err: String(e) });\n this.needsRestart = true;\n }\n }\n\n async setEffort(effort: string | null): Promise<void> {\n this.o.effort = effort;\n // --effort is a launch flag → restart (continued via --resume)\n this.needsRestart = true;\n }\n\n async listCommands(): Promise<SlashCommand[]> {\n try {\n const init = await this.ensureCli().initialized;\n const commands = Array.isArray(init?.commands) ? (init!.commands as { name?: string; description?: string; argumentHint?: string }[]) : [];\n const map = new Map<string, SlashCommand>();\n for (const cmd of commands) {\n if (cmd?.name && !map.has(cmd.name)) {\n map.set(cmd.name, {\n name: cmd.name,\n description: cmd.description ?? \"\",\n argumentHint: cmd.argumentHint,\n kind: classifyClaudeSlashCommand(cmd.name),\n });\n }\n }\n return sortSlashCommands([...map.values()]);\n } catch {\n return [];\n }\n }\n\n async close(): Promise<void> {\n this.closed = true;\n for (const [, p] of this.pending) p.resolve({ cancelled: true });\n this.pending.clear();\n const cli = this.cli;\n if (cli) {\n this.stopping.add(cli);\n await cli.close().catch(() => {});\n }\n if (this.pumpDone) {\n await Promise.race([this.pumpDone.catch(() => {}), new Promise((r) => setTimeout(r, 3000))]);\n }\n this.q.close();\n }\n}\n","// Model list (§7.2.7): Claude Code has no model query API.\n// Behind the magpie gateway, gateway models, the default model and thinking levels are filled in by providers/magpieGateway.ts;\n// without magpie only \"Default\" is offered (the frontend always shows it; no empty-id placeholder is added here anymore).\nimport type { ModelInfo } from \"../types.js\";\n\nexport async function listClaudeModels(): Promise<ModelInfo[]> {\n return [];\n}\n","// History import (§7.6): Claude sessions live in ~/.claude/projects/<encoded dir>/<sessionId>.jsonl.\n// Don't guess the encoding rule: list every directory, read the first record with a cwd from each jsonl, match the project with samePath.\n// Read-only throughout.\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { samePath } from \"../util/paths.js\";\nimport { tr } from \"../util/i18n.js\";\n\nconst CLAUDE_ROOT = join(homedir(), \".claude\", \"projects\");\n\ntype Rec = Record<string, unknown>;\nconst rec = (v: unknown): Rec => (v && typeof v === \"object\" ? (v as Rec) : {});\nconst str = (v: unknown): string | undefined => (typeof v === \"string\" ? v : undefined);\n\n// One jsonl line → {cwd?, title?, isUserText}\nfunction parseLine(line: string): { cwd?: string; userText?: string } | null {\n let r: Rec;\n try {\n r = rec(JSON.parse(line));\n } catch {\n return null;\n }\n const cwd = str(r.cwd);\n let userText: string | undefined;\n if (r.type === \"user\") {\n const content = rec(r.message).content;\n if (typeof content === \"string\") userText = content;\n else if (Array.isArray(content)) {\n const t = content.map((p) => (rec(p).type === \"text\" ? str(rec(p).text) : undefined)).find(Boolean);\n userText = t;\n }\n }\n return { cwd, userText };\n}\n\nasync function* linesOf(path: string): AsyncGenerator<string> {\n const text = await readFile(path, \"utf8\").catch(() => \"\");\n for (const line of text.split(\"\\n\")) {\n if (line.trim()) yield line;\n }\n}\n\n// Project cwd → that project's past sessions\nexport async function listClaudeHistory(cwd: string): Promise<{ sessionId: string; title: string; updatedAt: number; messageCount: number }[]> {\n const out: { sessionId: string; title: string; updatedAt: number; messageCount: number }[] = [];\n const dirs = await readdir(CLAUDE_ROOT).catch(() => [] as string[]);\n for (const d of dirs) {\n const dirPath = join(CLAUDE_ROOT, d);\n const files = (await readdir(dirPath).catch(() => [] as string[])).filter((f) => f.endsWith(\".jsonl\"));\n for (const f of files) {\n const path = join(dirPath, f);\n let match = false;\n let title = \"\";\n let count = 0;\n for await (const line of linesOf(path)) {\n const p = parseLine(line);\n if (!p) continue;\n if (!match) {\n if (!p.cwd) continue;\n match = samePath(p.cwd, cwd);\n if (!match) break;\n }\n if (p.userText && !title) title = p.userText.slice(0, 40);\n if (p.userText) count++;\n }\n if (!match) continue;\n const s = await stat(path).catch(() => null);\n out.push({\n sessionId: f.replace(/\\.jsonl$/, \"\"),\n title: title || tr(\"history.untitled\"),\n updatedAt: s ? Math.round(s.mtimeMs) : 0,\n messageCount: count,\n });\n }\n }\n out.sort((a, b) => b.updatedAt - a.updatedAt);\n return out;\n}\n\n// Read one session's jsonl → SDK message shape (so mapSdkMessage can be reused)\nexport async function readClaudeHistory(sessionId: string, cwd: string): Promise<Rec[]> {\n const dirs = await readdir(CLAUDE_ROOT).catch(() => [] as string[]);\n for (const d of dirs) {\n const path = join(CLAUDE_ROOT, d, `${sessionId}.jsonl`);\n if (!existsSync(path)) continue;\n // Confirm it belongs to this project (the first cwd record matches)\n const msgs: Rec[] = [];\n let matched = false;\n for await (const line of linesOf(path)) {\n const p = parseLine(line);\n if (!matched) {\n if (p?.cwd && samePath(p.cwd, cwd)) matched = true;\n else continue;\n }\n let r: Rec;\n try {\n r = rec(JSON.parse(line));\n } catch {\n continue;\n }\n // Keep only user/assistant/result — same shape as the SDK's streamed messages, so mapSdkMessage can digest them\n if (r.type === \"user\" || r.type === \"assistant\") msgs.push(r);\n }\n return msgs;\n }\n return [];\n}\n","// Claude Provider (§7.2): detection + createSession(ClaudeSession).\nimport type { Provider, ProviderSession, DetectResult, ModelInfo, HistoryItem, LaunchCommand } from \"../types.js\";\nimport { resolveBin, killTree, spawnBin, type ResolveResult } from \"../../util/bin.js\";\nimport { ClaudeSession } from \"./session.js\";\nimport { listClaudeModels } from \"./models.js\";\nimport { listClaudeHistory, readClaudeHistory } from \"../../history/import.js\";\nimport { mapSdkMessage, newMapState } from \"./map.js\";\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { tr } from \"../../util/i18n.js\";\nimport { resolveLaunch } from \"../launch.js\";\n\nconst INSTALL_HINT = \"npm i -g @anthropic-ai/claude-code\";\n\nexport const claudeCapabilities = {\n resume: true,\n interrupt: true,\n steer: false, // Claude doesn't support real steering — the manager queues instead (§7.2.2)\n images: true,\n plan: true,\n questions: true,\n cost: true,\n effort: [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n modes: [\"plan\", \"default\", \"acceptEdits\", \"bypassPermissions\"] as (\"plan\" | \"default\" | \"acceptEdits\" | \"bypassPermissions\")[],\n};\n\nfunction runVersion(r: ResolveResult & { ok: true }, args: string[], timeoutMs = 5000): Promise<string> {\n return new Promise((resolvePromise, reject) => {\n let out = \"\";\n const p = spawnBin(r, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"], env: { ...process.env, NO_COLOR: \"1\", FORCE_COLOR: \"0\" } });\n const t = setTimeout(() => {\n try {\n void killTree(p, { graceMs: 500 }); // On Windows a .cmd wrapper must be killed together with its child processes\n } catch {}\n reject(new Error(\"timeout\"));\n }, timeoutMs);\n p.stdout?.on(\"data\", (c: Buffer) => (out += c.toString()));\n p.stderr?.on(\"data\", (c: Buffer) => (out += c.toString()));\n p.on(\"error\", reject);\n p.on(\"close\", (code) => {\n clearTimeout(t);\n if (code === 0) resolvePromise(out);\n else reject(new Error(\"exit \" + code));\n });\n });\n}\n\nexport function createClaudeProvider(opts: { resolve?: (name: string) => Promise<ResolveResult> } = {}): Provider {\n const resolve = opts.resolve ?? resolveBin;\n const resolveCustom = opts.resolve ? (l: LaunchCommand) => opts.resolve!(l.cmd) : resolveLaunch;\n return {\n id: \"claude\",\n name: \"Claude Code\",\n capabilities: claudeCapabilities,\n async detect(launch?: LaunchCommand): Promise<DetectResult> {\n const bin = launch ? await resolveCustom(launch) : await resolve(\"claude\");\n if (!bin.ok) return { available: false, reason: bin.reason, installHint: INSTALL_HINT };\n try {\n const version = await runVersion(bin, [...(launch?.prefixArgs ?? []), \"--version\"]);\n return { available: true, bin: bin.display, version: version.trim().split(\"\\n\")[0] || \"\" };\n } catch {\n return { available: true, bin: bin.display, version: \"\" };\n }\n },\n async listModels(): Promise<ModelInfo[]> {\n return listClaudeModels();\n },\n async createSession(o): Promise<ProviderSession> {\n const bin = o.launch ? await resolveCustom(o.launch) : await resolve(\"claude\");\n if (!bin.ok) throw new Error(tr(\"claude.notFound\", { detail: bin.reason, hint: INSTALL_HINT }));\n return new ClaudeSession({\n threadId: o.threadId,\n cwd: o.cwd,\n model: o.model,\n mode: o.mode,\n effort: o.effort,\n resumeId: o.resumeId,\n bin,\n launch: o.launch,\n });\n },\n // §7.6: jsonl sessions under ~/.claude/projects matched by cwd\n async listHistory(cwd: string): Promise<HistoryItem[]> {\n const items = await listClaudeHistory(cwd);\n return items.map((i) => ({ provider: \"claude\", ...i, imported: false }));\n },\n async readHistory(sessionId: string, cwd: string): Promise<ProviderEvent[]> {\n const msgs = await readClaudeHistory(sessionId, cwd);\n const st = newMapState();\n const out: ProviderEvent[] = [];\n for (const m of msgs) {\n const r = m as { type?: string; message?: { content?: unknown } };\n // User text messages don't appear as events in claude's stream-json output (the manager writes user_message itself); emit them here\n if (r.type === \"user\") {\n const content = r.message?.content;\n const text = typeof content === \"string\"\n ? content\n : Array.isArray(content)\n ? (content as { type?: string; text?: string }[]).filter((b) => b.type === \"text\").map((b) => b.text ?? \"\").join(\"\")\n : \"\";\n if (text.trim()) out.push({ type: \"user_message\", text });\n else out.push(...mapSdkMessage(m as never, st, cwd)); // tool_result and the like still go through the mapping\n continue;\n }\n out.push(...mapSdkMessage(m as never, st, cwd));\n }\n // Finish: an imported session is closed\n out.push({ type: \"turn_ended\", turnId: \"\", status: \"completed\" });\n return out;\n },\n };\n}\n","// Codex history import (§7.6): ~/.codex/sessions/**/rollout-*.jsonl\n// Layout: session_meta (with cwd) → event_msg → response_item (message/function_call/...)\n// Import only user messages (minus environment_context and similar wrappers) + the assistant's final reply text; tool steps become notices. Read-only throughout.\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { samePath } from \"../util/paths.js\";\nimport { tr } from \"../util/i18n.js\";\n\nconst CODEX_ROOT = join(homedir(), \".codex\", \"sessions\");\n\ntype Rec = Record<string, unknown>;\nconst rec = (v: unknown): Rec => (v && typeof v === \"object\" ? (v as Rec) : {});\nconst str = (v: unknown): string | undefined => (typeof v === \"string\" ? v : undefined);\n\n// Environment wrappers in user messages: anything whose first line starts with <environment_context> or <user_instructions> isn't user input\nconst WRAPPERS = /^\\s*<(environment_context|user_instructions|skills_instructions|permissions instructions)>/i;\n\nfunction textOf(content: unknown, kind: string): string {\n if (!Array.isArray(content)) return \"\";\n return (content as Rec[])\n .filter((p) => p.type === kind || p.type === \"input_text\" || p.type === \"output_text\")\n .map((p) => str(p.text) ?? \"\")\n .join(\"\\n\")\n .trim();\n}\n\n// Find rollout-*.jsonl recursively\nasync function* walk(dir: string, depth = 0): AsyncGenerator<string> {\n if (depth > 6) return;\n for (const name of await readdir(dir).catch(() => [] as string[])) {\n const p = join(dir, name);\n const s = await stat(p).catch(() => null);\n if (!s) continue;\n if (s.isDirectory()) yield* walk(p, depth + 1);\n else if (/^rollout-.*\\.jsonl$/.test(name)) yield p;\n }\n}\n\nexport type CodexHistItem = { sessionId: string; title: string; updatedAt: number; messageCount: number };\n\nexport async function listCodexHistory(cwd: string): Promise<CodexHistItem[]> {\n const out: CodexHistItem[] = [];\n for await (const path of walk(CODEX_ROOT)) {\n const m = /rollout-.*-([0-9a-f-]{36})\\.jsonl$/i.exec(path);\n const sessionId = m?.[1];\n if (!sessionId) continue;\n const text = await readFile(path, \"utf8\").catch(() => \"\");\n let match = false;\n let title = \"\";\n let count = 0;\n for (const line of text.split(\"\\n\")) {\n if (!line.trim()) continue;\n let r: Rec;\n try {\n r = rec(JSON.parse(line));\n } catch {\n continue;\n }\n // session_meta records payload.cwd\n if (r.type === \"session_meta\") {\n const cwdInFile = str(rec(r.payload).cwd);\n if (cwdInFile && samePath(cwdInFile, cwd)) match = true;\n else break; // Not this project: stop reading\n continue;\n }\n if (!match) continue;\n if (r.type === \"response_item\") {\n const p = rec(r.payload);\n if (p.type === \"message\" && p.role === \"user\") {\n const t = textOf(p.content, \"input_text\");\n if (t && !WRAPPERS.test(t)) {\n count++;\n if (!title) title = t.slice(0, 40);\n }\n }\n }\n }\n if (!match) continue;\n const s = await stat(path).catch(() => null);\n out.push({ sessionId, title: title || tr(\"history.untitled\"), updatedAt: s ? Math.round(s.mtimeMs) : 0, messageCount: count });\n }\n out.sort((a, b) => b.updatedAt - a.updatedAt);\n return out;\n}\n\n// Read one rollout → simplified events (user_message / assistant_message / notice for tool steps / turn_ended)\ntype CodexEv = {\n type: string; text?: string; message?: string; itemId?: string; level?: string;\n turnId?: string; status?: string;\n};\nexport async function readCodexHistory(sessionId: string, cwd: string): Promise<CodexEv[]> {\n const out: CodexEv[] = [];\n let file: string | null = null;\n for await (const p of walk(CODEX_ROOT)) {\n if (p.endsWith(`${sessionId}.jsonl`)) { file = p; break; }\n }\n if (!file) return out;\n const text = await readFile(file, \"utf8\").catch(() => \"\");\n let matched = false;\n let aid = 0;\n // response_item.message and event_msg.item_completed duplicate each other → dedupe by text\n const seenText = new Set<string>();\n const pushText = (type: \"user_message\" | \"assistant_message\", t: string) => {\n const key = type + \":\" + t;\n if (!t || seenText.has(key)) return;\n seenText.add(key);\n out.push(type === \"user_message\" ? { type, text: t } : { type, itemId: `imp_a${aid++}`, text: t });\n };\n for (const line of text.split(\"\\n\")) {\n if (!line.trim()) continue;\n let r: Rec;\n try {\n r = rec(JSON.parse(line));\n } catch {\n continue;\n }\n if (r.type === \"session_meta\") {\n const c = str(rec(r.payload).cwd);\n if (c && samePath(c, cwd)) matched = true;\n continue;\n }\n if (!matched) continue;\n // response_item message\n if (r.type === \"response_item\") {\n const p = rec(r.payload);\n if (p.type === \"message\") {\n const role = str(p.role);\n const phase = str(p.phase);\n if (role === \"user\") {\n const t = textOf(p.content, \"input_text\");\n if (t && !WRAPPERS.test(t)) pushText(\"user_message\", t);\n } else if (role === \"assistant\" && phase !== \"commentary\") {\n const t = textOf(p.content, \"output_text\");\n if (t) pushText(\"assistant_message\", t);\n }\n } else if (p.type === \"function_call\" || p.type === \"custom_tool_call\") {\n const name = str(p.name) ?? \"tool\";\n out.push({ type: \"notice\", level: \"info\", message: tr(\"history.toolCall\", { name }) });\n }\n continue;\n }\n // event_msg.item_completed: AgentMessage (Text content blocks) and task_complete.last_agent_message\n if (r.type === \"event_msg\") {\n const p = rec(r.payload);\n if (p.type === \"item_completed\") {\n const it = rec(p.item);\n if (it.type === \"AgentMessage\" && it.phase !== \"commentary\") {\n const t = textOf(it.content, \"Text\");\n if (t) pushText(\"assistant_message\", t);\n } else if (it.type === \"UserMessage\") {\n const t = textOf(it.content, \"text\");\n if (t && !WRAPPERS.test(t)) pushText(\"user_message\", t);\n }\n } else if (p.type === \"task_complete\") {\n const last = str(p.last_agent_message);\n if (last) pushText(\"assistant_message\", last);\n }\n continue;\n }\n const p2 = rec(r.payload);\n if (p2.type === \"function_call\" || p2.type === \"custom_tool_call\") {\n // Tool steps collapse into a one-line notice (§7.6, Codex part)\n const name = str(p2.name) ?? \"tool\";\n out.push({ type: \"notice\", level: \"info\", message: tr(\"history.toolCall\", { name }) });\n }\n }\n out.push({ type: \"turn_ended\", turnId: \"import\", status: \"completed\" });\n return out;\n}\n","// JSON-RPC over stdio client for `codex app-server` (§7.3.2).\n// stdout is parsed line by line: {id,result|error} → response; {id,method} → server request; {method} → notification.\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { log } from \"../../log.js\";\nimport { killTree, trackTree, type Argv } from \"../../util/bin.js\";\n\nexport class CodexRpcError extends Error {\n code?: number;\n constructor(message: string, code?: number) {\n super(message);\n this.code = code;\n }\n}\n\nexport class CodexProcessExitedError extends CodexRpcError {\n constructor() {\n super(\"Codex 进程已退出\");\n }\n}\n\ntype ServerRequestHandler = (method: string, params: Record<string, unknown>) => Promise<unknown>;\ntype NotificationHandler = (method: string, params: Record<string, unknown>) => void;\n\nexport class CodexRpc {\n private proc: ChildProcess;\n private nextId = 1;\n private pending = new Map<number, { resolve: (v: unknown) => void; reject: (e: Error) => void }>();\n private buf = \"\";\n private exited = false;\n onServerRequest?: ServerRequestHandler;\n onNotification?: NotificationHandler;\n onExit?: (code: number | null) => void;\n\n constructor(\n argv: Argv,\n opts: { cwd?: string; env?: NodeJS.ProcessEnv } = {},\n ) {\n this.proc = spawn(argv.cmd, argv.args, {\n cwd: opts.cwd,\n env: opts.env ?? process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n windowsHide: true,\n ...(argv.windowsVerbatimArguments ? { windowsVerbatimArguments: true } : {}),\n // Non-Windows: its own process group, so after a close() timeout killTree also ends the commands codex started\n ...(process.platform !== \"win32\" ? { detached: true } : {}),\n });\n trackTree(this.proc);\n this.proc.stdout!.setEncoding(\"utf8\");\n this.proc.stdout!.on(\"data\", (chunk: string) => this.onData(chunk));\n this.proc.stderr!.setEncoding(\"utf8\");\n this.proc.stderr!.on(\"data\", (chunk: string) => {\n this.stderrTail = (this.stderrTail + chunk).slice(-4096);\n });\n this.proc.on(\"error\", () => this.failAll());\n this.proc.on(\"close\", (code) => {\n this.exited = true;\n this.failAll();\n this.onExit?.(code);\n });\n }\n\n private stderrTail = \"\";\n\n get stderr(): string {\n return this.stderrTail;\n }\n\n get isExited(): boolean {\n return this.exited;\n }\n\n private onData(chunk: string): void {\n this.buf += chunk;\n let i: number;\n while ((i = this.buf.indexOf(\"\\n\")) >= 0) {\n const line = this.buf.slice(0, i).trim();\n this.buf = this.buf.slice(i + 1);\n if (!line) continue;\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(line);\n } catch {\n log(\"warn\", \"codex rpc: 非 JSON 行\", { line: line.slice(0, 200) });\n continue;\n }\n void this.dispatch(msg);\n }\n }\n\n private async dispatch(msg: Record<string, unknown>): Promise<void> {\n const hasId = msg.id !== undefined && msg.id !== null;\n if (hasId && (\"result\" in msg || \"error\" in msg)) {\n const id = Number(msg.id);\n const p = this.pending.get(id);\n if (p) {\n this.pending.delete(id);\n if (msg.error) {\n const e = msg.error as { code?: number; message?: string };\n p.reject(new CodexRpcError(e.message ?? \"RPC error\", e.code));\n } else {\n p.resolve(msg.result);\n }\n }\n return;\n }\n if (hasId && msg.method) {\n // Server request → needs a response\n const id = Number(msg.id);\n try {\n const result = this.onServerRequest\n ? await this.onServerRequest(String(msg.method), (msg.params as Record<string, unknown>) ?? {})\n : undefined;\n this.send({ id, result: result ?? null });\n } catch (e) {\n this.send({ id, error: { code: -32603, message: String((e as Error)?.message ?? e) } });\n }\n return;\n }\n if (!hasId && msg.method) {\n try {\n this.onNotification?.(String(msg.method), (msg.params as Record<string, unknown>) ?? {});\n } catch (e) {\n log(\"warn\", \"codex rpc: 通知处理失败\", { method: msg.method, err: String(e) });\n }\n }\n }\n\n private send(obj: Record<string, unknown>): void {\n if (this.exited) return;\n try {\n this.proc.stdin!.write(JSON.stringify(obj) + \"\\n\");\n } catch {}\n }\n\n request<T = unknown>(method: string, params?: Record<string, unknown>, timeoutMs = 60000): Promise<T> {\n if (this.exited) return Promise.reject(new CodexProcessExitedError());\n const id = this.nextId++;\n return new Promise<T>((resolvePromise, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new CodexRpcError(`请求超时:${method}`));\n }, timeoutMs);\n this.pending.set(id, {\n resolve: (v) => {\n clearTimeout(timer);\n resolvePromise(v as T);\n },\n reject: (e) => {\n clearTimeout(timer);\n reject(e);\n },\n });\n this.send({ jsonrpc: \"2.0\", id, method, params: params ?? {} });\n });\n }\n\n notify(method: string, params?: Record<string, unknown>): void {\n this.send({ jsonrpc: \"2.0\", method, params: params ?? {} });\n }\n\n private failAll(): void {\n const err = new CodexProcessExitedError();\n for (const [, p] of this.pending) p.reject(err);\n this.pending.clear();\n }\n\n async close(): Promise<void> {\n try {\n this.proc.stdin?.end();\n } catch {}\n await new Promise<void>((resolvePromise) => {\n const t = setTimeout(() => {\n void killTree(this.proc, { graceMs: 1500 });\n resolvePromise();\n }, 3000);\n this.proc.on(\"close\", () => {\n clearTimeout(t);\n resolvePromise();\n });\n if (this.exited) {\n clearTimeout(t);\n resolvePromise();\n }\n });\n }\n}\n","// One user message → Codex app-server UserInput items.\n// Only PNG / JPEG / GIF / WebP go as localImage; every other attachment (text files included) is named by its\n// absolute path in the text, which Codex opens with its own tools. Files that aren't images or text get a warning.\nimport { basename } from \"node:path\";\nimport { resolveImagePath } from \"../../util/attachmentRefs.js\";\nimport { attachmentKind, baseMime, pathNote } from \"../../util/attachmentKinds.js\";\n\nexport async function buildCodexInput(\n text: string,\n attachments: { path: string; mime: string }[],\n): Promise<{ items: Record<string, unknown>[]; warnings: string[] }> {\n const images: Record<string, unknown>[] = [];\n const notes: string[] = [];\n const warnings: string[] = [];\n for (const a of attachments) {\n let file: string;\n try {\n file = await resolveImagePath(a.path);\n } catch (e) {\n warnings.push(`${a.path}: ${String((e as Error)?.message ?? e)}`);\n continue;\n }\n const kind = attachmentKind(a.mime);\n if (kind === \"image\") {\n images.push({ type: \"localImage\", path: file });\n continue;\n }\n notes.push(pathNote(kind, file));\n if (kind === \"other\") warnings.push(`${basename(file)} (${baseMime(a.mime) || \"unknown type\"}) is not an image or a text file; sent its path`);\n }\n const fullText = [text, ...(notes.length ? [notes.join(\"\\n\")] : [])].filter(Boolean).join(\"\\n\\n\");\n return { items: [{ type: \"text\", text: fullText }, ...images], warnings };\n}\n","// Codex app-server notifications → ProviderEvent (§7.3.4). Method and field names follow the generated schema.\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { tr } from \"../../util/i18n.js\";\n\nconst MAX_OUTPUT = 20 * 1024;\nconst trunc = (s: string, n = 80): string => (s.length > n ? s.slice(0, n - 1) + \"…\" : s);\n\ntype Rec = Record<string, unknown>;\nconst rec = (v: unknown): Rec => (v && typeof v === \"object\" ? (v as Rec) : {});\nconst str = (v: unknown): string | undefined => (typeof v === \"string\" ? v : undefined);\n\nexport type CodexMapState = {\n currentTurnId: string | null;\n filesChanged: number;\n diffText: string;\n fileChangesByItemId: Map<string, unknown[]>;\n /** Raw reasoning text streamed per item (DeepSeek and others send no summary): saved when the item completes (B15) */\n reasoningRaw: Map<string, string>;\n};\n\nexport function newCodexMapState(): CodexMapState {\n return { currentTurnId: null, filesChanged: 0, diffText: \"\", fileChangesByItemId: new Map(), reasoningRaw: new Map() };\n}\n\n// One server notification → 0..n unified events. Server requests (approvals) don't go through here.\nexport function mapNotification(method: string, params: Rec, st: CodexMapState): ProviderEvent[] {\n const out: ProviderEvent[] = [];\n const turnId = str(params.turnId);\n\n switch (method) {\n case \"turn/started\": {\n const turn = rec(params.turn);\n const tid = str(turn.id);\n if (tid) st.currentTurnId = tid;\n st.filesChanged = 0;\n st.diffText = \"\";\n st.fileChangesByItemId.clear();\n st.reasoningRaw.clear();\n break;\n }\n case \"item/agentMessage/delta\": {\n const itemId = str(params.itemId) ?? \"\";\n const delta = str(params.delta) ?? \"\";\n if (itemId && delta) out.push({ type: \"assistant_delta\", itemId, text: delta });\n break;\n }\n case \"item/plan/delta\": {\n // Incremental plan stream: wait for the plan item in item/completed to send the full plan\n break;\n }\n case \"item/reasoning/summaryTextDelta\":\n case \"item/reasoning/textDelta\": {\n const itemId = str(params.itemId) ?? \"\";\n const delta = str(params.delta) ?? \"\";\n if (itemId && delta) {\n if (method === \"item/reasoning/textDelta\") st.reasoningRaw.set(itemId, (st.reasoningRaw.get(itemId) ?? \"\") + delta);\n out.push({ type: \"reasoning_delta\", itemId, text: delta });\n }\n break;\n }\n case \"item/commandExecution/outputDelta\":\n case \"item/fileChange/outputDelta\":\n case \"command/exec/outputDelta\": {\n const itemId = str(params.itemId) ?? \"\";\n const delta = str(params.delta) ?? \"\";\n if (itemId && delta) out.push({ type: \"tool_output_delta\", itemId, text: delta });\n break;\n }\n case \"item/started\": {\n const item = rec(params.item);\n const type = str(item.type) ?? \"\";\n const itemId = str(item.id) ?? \"\";\n if (type === \"commandExecution\") {\n const cmd = str(item.command) ?? \"\";\n out.push({\n type: \"tool_call\", itemId, kind: \"bash\",\n title: tr(\"tool.run\", { x: trunc(cmd) }), status: \"running\",\n detail: { command: cmd, cwd: str(item.cwd) },\n });\n } else if (type === \"fileChange\") {\n const changes = Array.isArray(item.changes) ? item.changes : [];\n if (itemId) st.fileChangesByItemId.set(itemId, changes);\n out.push({\n type: \"tool_call\", itemId, kind: \"edit\",\n title: tr(\"tool.editFiles\", { n: changes.length }), status: \"running\",\n detail: { changes },\n });\n } else if (type === \"mcpToolCall\" || type === \"dynamicToolCall\") {\n const tool = str(item.tool) ?? str(item.name) ?? \"\";\n const server = str(item.server) ?? \"\";\n out.push({\n type: \"tool_call\", itemId, kind: \"mcp\",\n title: `${server || \"mcp\"} · ${tool}`, status: \"running\",\n });\n } else if (type === \"webSearch\") {\n out.push({\n type: \"tool_call\", itemId, kind: \"web\",\n title: tr(\"tool.webSearch\", { x: trunc(str(item.query) ?? \"\", 40) }), status: \"running\",\n });\n }\n // agentMessage/reasoning/userMessage/plan etc.: wait for a delta or completed\n break;\n }\n case \"item/completed\": {\n const item = rec(params.item);\n const type = str(item.type) ?? \"\";\n const itemId = str(item.id) ?? \"\";\n if (type === \"agentMessage\") {\n const text = str(item.text) ?? \"\";\n if (text) out.push({ type: \"assistant_message\", itemId, text });\n } else if (type === \"reasoning\") {\n const summary = Array.isArray(item.summary) ? item.summary : [];\n const content = Array.isArray(item.content) ? item.content : [];\n const strings = (a: unknown[]) => a.filter((s): s is string => typeof s === \"string\").join(\"\\n\");\n // The summary when there is one, else the raw reasoning (on the item, or as streamed)\n const text = strings(summary) || strings(content) || st.reasoningRaw.get(itemId) || \"\";\n st.reasoningRaw.delete(itemId);\n if (text) out.push({ type: \"reasoning\", itemId, text });\n } else if (type === \"commandExecution\") {\n const cmd = str(item.command) ?? \"\";\n const exitCode = typeof item.exitCode === \"number\" ? item.exitCode : undefined;\n const output = str(item.aggregatedOutput) ?? \"\";\n out.push({\n type: \"tool_call\", itemId, kind: \"bash\",\n title: tr(\"tool.run\", { x: trunc(cmd) }),\n status: exitCode === 0 ? \"ok\" : \"failed\",\n output: output.length > MAX_OUTPUT ? output.slice(0, MAX_OUTPUT) : output,\n exitCode,\n durationMs: typeof item.durationMs === \"number\" ? item.durationMs : undefined,\n });\n } else if (type === \"fileChange\") {\n const changes = Array.isArray(item.changes) ? item.changes : [];\n if (itemId) st.fileChangesByItemId.set(itemId, changes);\n const istatus = str(item.status);\n st.filesChanged += changes.length;\n out.push({\n type: \"tool_call\", itemId, kind: \"edit\",\n title: tr(\"tool.editFiles\", { n: changes.length }),\n status: istatus === \"failed\" ? \"failed\" : \"ok\",\n detail: { changes },\n });\n } else if (type === \"mcpToolCall\" || type === \"dynamicToolCall\") {\n const tool = str(item.tool) ?? str(item.name) ?? \"\";\n const server = str(item.server) ?? \"\";\n const istatus = str(item.status);\n const err = str(item.error);\n out.push({\n type: \"tool_call\", itemId, kind: \"mcp\",\n title: `${server || \"mcp\"} · ${tool}`,\n status: istatus === \"failed\" || err ? \"failed\" : \"ok\",\n output: err ?? undefined,\n });\n } else if (type === \"webSearch\") {\n out.push({\n type: \"tool_call\", itemId, kind: \"web\",\n title: tr(\"tool.webSearch\", { x: trunc(str(item.query) ?? \"\", 40) }), status: \"ok\",\n });\n } else if (type === \"plan\") {\n const text = str(item.text) ?? \"\";\n if (text) out.push({ type: \"plan\", itemId, markdown: text });\n }\n break;\n }\n case \"turn/plan/updated\": {\n const steps = Array.isArray(params.plan) ? params.plan : [];\n const items = steps.map((s) => {\n const step = rec(s);\n const status = str(step.status) ?? \"pending\";\n return {\n text: str(step.step) ?? \"\",\n status: status === \"completed\" ? \"done\" : status === \"inProgress\" || status === \"in_progress\" ? \"in_progress\" : \"pending\",\n };\n });\n if (items.length) out.push({ type: \"todo\", items });\n break;\n }\n case \"turn/diff/updated\": {\n const diff = str(params.diff) ?? \"\";\n if (diff) st.diffText = diff;\n break;\n }\n case \"thread/tokenUsage/updated\": {\n const usage = rec(params.tokenUsage);\n const last = rec(usage.last) || usage;\n const input = typeof last.inputTokens === \"number\" ? last.inputTokens : 0;\n const output = typeof last.outputTokens === \"number\" ? last.outputTokens : 0;\n const cached = typeof last.cachedInputTokens === \"number\" ? last.cachedInputTokens : 0;\n out.push({\n type: \"usage\",\n inputTokens: input,\n outputTokens: output,\n cacheReadTokens: cached,\n costUsd: 0,\n });\n break;\n }\n case \"turn/completed\": {\n const turn = rec(params.turn);\n const status = str(turn.status) ?? \"completed\";\n const error = rec(turn.error);\n out.push({\n type: \"turn_ended\",\n turnId: str(turn.id) ?? turnId ?? st.currentTurnId ?? \"\",\n status: status === \"completed\" ? \"completed\" : status === \"interrupted\" ? \"interrupted\" : \"failed\",\n durationMs: typeof turn.durationMs === \"number\" ? turn.durationMs : undefined,\n error: str(error.message),\n filesChanged: st.filesChanged || undefined,\n });\n break;\n }\n case \"error\": {\n const msg = str(params.message) ?? tr(\"codex.error\");\n out.push({ type: \"notice\", level: \"error\", message: msg });\n break;\n }\n default:\n break;\n }\n return out;\n}\n","import { readdir, readFile, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, join } from \"node:path\";\nimport type { SlashCommand } from \"../slash.js\";\nimport { parseSlashInput, sortSlashCommands } from \"../slash.js\";\n\nexport type CodexSlashEntry = SlashCommand & { body: string };\n\nfunction parseFrontMatter(raw: string): { meta: Record<string, string>; body: string } {\n if (!raw.startsWith(\"---\\n\")) return { meta: {}, body: raw };\n const end = raw.indexOf(\"\\n---\\n\", 4);\n if (end === -1) return { meta: {}, body: raw };\n const fm = raw.slice(4, end);\n const meta: Record<string, string> = {};\n for (const line of fm.split(/\\r?\\n/)) {\n const m = line.match(/^([a-zA-Z0-9_-]+):\\s*(.+)$/);\n if (m) meta[m[1]!] = m[2]!.trim().replace(/^[\"']|[\"']$/g, \"\");\n }\n return { meta, body: raw.slice(end + 5) };\n}\n\nfunction firstLine(body: string): string {\n for (const line of body.split(/\\r?\\n/)) {\n const t = line.trim();\n if (t && !t.startsWith(\"#\")) return t.replace(/^#+\\s*/, \"\").slice(0, 120);\n }\n return \"\";\n}\n\nasync function readPromptFiles(dir: string): Promise<CodexSlashEntry[]> {\n const out: CodexSlashEntry[] = [];\n let names: string[] = [];\n try {\n names = await readdir(dir);\n } catch {\n return out;\n }\n for (const f of names) {\n if (!f.endsWith(\".md\")) continue;\n const path = join(dir, f);\n try {\n const st = await stat(path);\n if (!st.isFile()) continue;\n const raw = await readFile(path, \"utf8\");\n const { meta, body } = parseFrontMatter(raw);\n const name = basename(f, \".md\");\n out.push({\n name,\n description: meta.description || firstLine(body) || name,\n argumentHint: meta.argumentHint || meta[\"argument-hint\"],\n kind: \"command\",\n body,\n });\n } catch {\n /* skip */\n }\n }\n return out;\n}\n\nasync function readSkillDirs(root: string): Promise<CodexSlashEntry[]> {\n const out: CodexSlashEntry[] = [];\n let dirs: string[] = [];\n try {\n dirs = await readdir(root);\n } catch {\n return out;\n }\n for (const d of dirs) {\n const skillPath = join(root, d, \"SKILL.md\");\n try {\n const st = await stat(skillPath);\n if (!st.isFile()) continue;\n const raw = await readFile(skillPath, \"utf8\");\n const { meta, body } = parseFrontMatter(raw);\n const name = meta.name || d;\n out.push({\n name,\n description: meta.description || firstLine(body) || name,\n argumentHint: meta.argumentHint,\n kind: \"skill\",\n body,\n });\n } catch {\n /* skip */\n }\n }\n return out;\n}\n\nexport async function loadCodexSlashEntries(cwd: string, opts?: { skipHome?: boolean }): Promise<CodexSlashEntry[]> {\n const home = homedir();\n const parts = await Promise.all([\n opts?.skipHome ? Promise.resolve([]) : readPromptFiles(join(home, \".codex\", \"prompts\")),\n readPromptFiles(join(cwd, \".codex\", \"prompts\")),\n opts?.skipHome ? Promise.resolve([]) : readSkillDirs(join(home, \".codex\", \"skills\")),\n readSkillDirs(join(cwd, \".codex\", \"skills\")),\n ]);\n const byName = new Map<string, CodexSlashEntry>();\n for (const list of parts) {\n for (const e of list) {\n if (!byName.has(e.name)) byName.set(e.name, e);\n }\n }\n return sortSlashCommands([...byName.values()]) as CodexSlashEntry[];\n}\n\nexport function expandCodexSlash(text: string, entries: CodexSlashEntry[]): string {\n const parsed = parseSlashInput(text);\n if (!parsed) return text;\n const hit = entries.find((e) => e.name === parsed.name);\n if (!hit) return text;\n return hit.body.replace(/\\$ARGUMENTS/g, parsed.args);\n}\n\nexport function codexSlashCommandsFromEntries(entries: CodexSlashEntry[]): SlashCommand[] {\n return entries.map(({ body: _b, ...rest }) => rest);\n}\n","// Codex ProviderSession (§7.3.3/7.3.5): codex app-server JSON-RPC session.\nimport type { LaunchCommand, ProviderSession, SendInput, RespondAnswer, Mode, SlashCommand } from \"../types.js\";\nimport { buildCodexInput } from \"./input.js\";\nimport { tr } from \"../../util/i18n.js\";\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { AsyncQueue } from \"../../util/queue.js\";\nimport { CodexRpc } from \"./rpc.js\";\nimport { argvFor } from \"../../util/bin.js\";\nimport { mapNotification, newCodexMapState, type CodexMapState } from \"./map.js\";\nimport {\n codexSlashCommandsFromEntries,\n expandCodexSlash,\n loadCodexSlashEntries,\n type CodexSlashEntry,\n} from \"./commands.js\";\nimport { log } from \"../../log.js\";\nimport { launchArgv } from \"../launch.js\";\n\nconst rid = () => Math.random().toString(36).slice(2, 10);\n\n// §7.3.3 permission presets (per the four modes). Note the two shapes differ:\n// `sandbox` in thread/start|resume is a kebab-case enum (\"read-only\"…);\n// `sandboxPolicy` in turn/start is an object ({type:\"readOnly\"}…).\nconst MODE_PRESETS: Record<Mode, { approvalPolicy: string; sandbox: string; sandboxPolicy: Record<string, unknown> }> = {\n plan: { approvalPolicy: \"on-request\", sandbox: \"read-only\", sandboxPolicy: { type: \"readOnly\" } },\n default: { approvalPolicy: \"on-request\", sandbox: \"read-only\", sandboxPolicy: { type: \"readOnly\" } },\n acceptEdits: { approvalPolicy: \"on-request\", sandbox: \"workspace-write\", sandboxPolicy: { type: \"workspaceWrite\" } },\n bypassPermissions: { approvalPolicy: \"never\", sandbox: \"danger-full-access\", sandboxPolicy: { type: \"dangerFullAccess\" } },\n ask: { approvalPolicy: \"on-request\", sandbox: \"read-only\", sandboxPolicy: { type: \"readOnly\" } },\n};\n\ntype PendingReq = {\n kind: \"permission\" | \"question\";\n resolve: (a: RespondAnswer) => void;\n};\n\nexport class CodexSession implements ProviderSession {\n events: AsyncIterable<ProviderEvent>;\n private q = new AsyncQueue<ProviderEvent>();\n private rpc: CodexRpc | null = null;\n private st: CodexMapState = newCodexMapState();\n private sessionThreadId: string | null = null;\n private pending = new Map<string, PendingReq>();\n private closed = false;\n private started: Promise<void> | null = null;\n private interruptWanted = false;\n private ourTurnId: string | null = null; // The current turn's turnId in the timeline (generated on send)\n private staleCodexTurns = new Set<string>();\n private codexSlash: CodexSlashEntry[] | null = null;\n\n constructor(\n private o: {\n threadId: string;\n cwd: string;\n model: string | null;\n mode: Mode;\n effort: string | null;\n resumeId: string | null;\n binCmd: string;\n binPrefixArgs: string[];\n binVia?: string;\n binShim?: string;\n version: string;\n launch?: LaunchCommand;\n },\n ) {\n this.events = this.q;\n }\n\n private emit(ev: ProviderEvent): void {\n if (ev.type === \"turn_ended\") {\n // A late completion for the previous turn (already ended by the interrupt fallback): drop it so it doesn't end the new turn\n if (ev.turnId && this.staleCodexTurns.delete(ev.turnId)) return;\n // turn_started uses our own turnId, so the end must use the same one,\n // otherwise the manager's per-turn dedupe breaks (interrupt fallback + late completion would end the next turn)\n if (this.ourTurnId) ev.turnId = this.ourTurnId;\n this.ourTurnId = null;\n this.st.currentTurnId = null;\n this.interruptWanted = false;\n }\n this.q.push(ev);\n }\n\n private async start(): Promise<void> {\n if (this.started) return this.started;\n const attempt = (async () => {\n const rpc = new CodexRpc(\n argvFor(\n { ok: true, cmd: this.o.binCmd, prefixArgs: this.o.binPrefixArgs, display: this.o.binCmd, via: this.o.binVia ?? \"path\", shim: this.o.binShim },\n launchArgv([\"app-server\"], this.o.launch),\n ),\n { cwd: this.o.cwd },\n );\n this.rpc = rpc;\n rpc.onNotification = (m, p) => {\n for (const ev of mapNotification(m, p, this.st)) this.emit(ev);\n if (this.interruptWanted && this.st.currentTurnId) void this.interrupt();\n };\n rpc.onServerRequest = (m, p) => this.onServerRequest(m, p);\n rpc.onExit = () => {\n for (const [, p] of this.pending) p.resolve({ cancelled: true });\n this.pending.clear();\n if (!this.closed) this.q.close();\n };\n await rpc.request(\"initialize\", {\n clientInfo: { name: \"agent-console\", title: \"Agent Console\", version: this.o.version },\n capabilities: { experimentalApi: true },\n });\n rpc.notify(\"initialized\", {});\n const preset = MODE_PRESETS[this.o.mode];\n let threadId: string;\n if (this.o.resumeId) {\n const res = (await rpc.request(\"thread/resume\", {\n threadId: this.o.resumeId,\n cwd: this.o.cwd,\n model: this.o.model,\n approvalPolicy: preset.approvalPolicy,\n sandbox: preset.sandbox,\n })) as { thread?: { id?: string } };\n threadId = res.thread?.id ?? this.o.resumeId;\n } else {\n const res = (await rpc.request(\"thread/start\", {\n cwd: this.o.cwd,\n model: this.o.model,\n approvalPolicy: preset.approvalPolicy,\n sandbox: preset.sandbox,\n })) as { thread?: { id?: string } };\n threadId = res.thread?.id ?? \"\";\n }\n if (threadId) {\n this.sessionThreadId = threadId;\n this.emit({ type: \"provider_session_id\", id: threadId });\n }\n })();\n // Don't cache a failed start: clear it so the next send starts app-server again\n this.started = attempt.catch((e) => {\n if (this.started === guarded) {\n this.started = null;\n const rpc = this.rpc;\n this.rpc = null;\n if (rpc) {\n rpc.onExit = () => {};\n void Promise.resolve(rpc.close()).catch(() => {});\n }\n }\n throw e;\n });\n const guarded = this.started;\n return this.started;\n }\n\n async send(input: SendInput): Promise<void> {\n if (this.closed) throw new Error(tr(\"codex.closed\"));\n await this.start();\n const rpc = this.rpc!;\n const preset = MODE_PRESETS[this.o.mode];\n const entries = this.codexSlash ?? (await loadCodexSlashEntries(this.o.cwd));\n this.codexSlash = entries;\n const wireText = expandCodexSlash(input.text, entries);\n const { items, warnings } = await buildCodexInput(wireText, input.images ?? []);\n this.interruptWanted = false;\n const turnId = \"u_\" + Date.now().toString(36) + \"_\" + rid();\n // A new turn started before the previous one completed (interrupt fallback) → remember its Codex turnId\n if (this.ourTurnId && this.st.currentTurnId) this.staleCodexTurns.add(this.st.currentTurnId);\n this.ourTurnId = turnId;\n this.st.currentTurnId = null; // Filled in by this turn's turn/started, so we never interrupt/steer with the previous turn's id\n this.emit({\n type: \"turn_started\",\n turnId,\n model: this.o.model,\n mode: this.o.mode,\n effort: this.o.effort,\n });\n for (const w of warnings) this.emit({ type: \"notice\", level: \"warn\", message: tr(\"notice.attachmentIssue\", { detail: w }) });\n try {\n await rpc.request(\"turn/start\", {\n threadId: this.sessionThreadId ?? undefined,\n input: items,\n model: this.o.model,\n effort: this.o.effort,\n approvalPolicy: preset.approvalPolicy,\n sandboxPolicy: preset.sandboxPolicy,\n });\n } catch (e) {\n this.emit({\n type: \"turn_ended\",\n turnId,\n status: \"failed\",\n error: String((e as Error)?.message ?? e),\n });\n }\n }\n\n async steer(input: SendInput): Promise<void> {\n // No Codex turnId yet (turn/started hasn't arrived) → throw; the manager queues instead so the message isn't lost\n if (!this.rpc || !this.st.currentTurnId) throw new Error(tr(\"codex.noTurnSteer\"));\n const { items, warnings } = await buildCodexInput(input.text, input.images ?? []);\n for (const w of warnings) this.emit({ type: \"notice\", level: \"warn\", message: tr(\"notice.attachmentIssue\", { detail: w }) });\n try {\n await this.rpc.request(\"turn/steer\", {\n threadId: this.threadId(),\n expectedTurnId: this.st.currentTurnId,\n input: items,\n });\n } catch (e) {\n log(\"warn\", \"codex steer 失败\", { err: String(e) });\n }\n }\n\n async interrupt(): Promise<void> {\n for (const [, p] of this.pending) p.resolve({ cancelled: true });\n this.pending.clear();\n if (!this.rpc) return;\n if (!this.st.currentTurnId) {\n // turn/started hasn't arrived yet: remember it and send the interrupt as soon as the turnId is known\n this.interruptWanted = true;\n return;\n }\n this.interruptWanted = false;\n try {\n await this.rpc.request(\n \"turn/interrupt\",\n { threadId: this.threadId(), turnId: this.st.currentTurnId },\n 5000,\n );\n } catch (e) {\n // \"Already idle\"-type errors count as success\n const msg = String((e as Error)?.message ?? e);\n if (!/idle|not running|no.*turn/i.test(msg)) {\n log(\"warn\", \"codex interrupt 失败\", { err: msg });\n }\n }\n }\n\n private threadId(): string | undefined {\n return this.sessionThreadId ?? undefined;\n }\n\n // ---- server requests (§7.3.5 approvals) ----\n private async onServerRequest(method: string, params: Record<string, unknown>): Promise<unknown> {\n switch (method) {\n case \"item/commandExecution/requestApproval\": {\n const command = String(params.command ?? \"\");\n const requestId = \"perm_\" + rid();\n this.emit({\n type: \"permission_request\",\n requestId,\n title: tr(\"tool.run\", { x: command.slice(0, 80) }),\n kind: \"tool\",\n detail: { command, cwd: params.cwd, reason: params.reason, approvalId: params.approvalId, itemId: params.itemId },\n options: [\n { id: \"accept\", label: tr(\"perm.allow\"), kind: \"allow_once\" },\n { id: \"acceptForSession\", label: tr(\"perm.allowSession\"), kind: \"allow_always\" },\n { id: \"decline\", label: tr(\"perm.deny\"), kind: \"reject_once\" },\n ],\n });\n const a = await this.waitFor(requestId);\n if (a.cancelled) return { decision: \"cancel\" };\n const opt = a.optionId === \"acceptForSession\" ? \"acceptForSession\" : a.optionId === \"decline\" ? \"decline\" : \"accept\";\n return { decision: opt };\n }\n case \"item/fileChange/requestApproval\": {\n const itemId = typeof params.itemId === \"string\" ? params.itemId : \"\";\n const changes = Array.isArray(params.changes) && params.changes.length\n ? params.changes\n : (itemId ? this.st.fileChangesByItemId.get(itemId) ?? [] : []);\n const requestId = \"perm_\" + rid();\n this.emit({\n type: \"permission_request\",\n requestId,\n title: tr(\"perm.editFiles\"),\n kind: \"tool\",\n detail: { changes, approvalId: params.approvalId, itemId: params.itemId, reason: params.reason },\n options: [\n { id: \"accept\", label: tr(\"perm.allow\"), kind: \"allow_once\" },\n { id: \"acceptForSession\", label: tr(\"perm.allowSession\"), kind: \"allow_always\" },\n { id: \"decline\", label: tr(\"perm.deny\"), kind: \"reject_once\" },\n ],\n });\n const a = await this.waitFor(requestId);\n if (a.cancelled) return { decision: \"cancel\" };\n const opt = a.optionId === \"acceptForSession\" ? \"acceptForSession\" : a.optionId === \"decline\" ? \"decline\" : \"accept\";\n return { decision: opt };\n }\n case \"item/tool/requestUserInput\": {\n const requestId = \"q_\" + rid();\n this.emit({\n type: \"question\",\n requestId,\n questions: (params.questions as unknown[]) ?? [],\n });\n const a = await this.waitFor(requestId);\n if (a.cancelled) return { answers: {} };\n // schema: { answers: { <questionId>: { answers: [..] } } }\n const raw = a.answers ?? {};\n const shaped: Record<string, { answers: string[] }> = {};\n for (const [k, v] of Object.entries(raw)) shaped[k] = { answers: [v] };\n return { answers: shaped };\n }\n default:\n throw new Error(`未识别的服务端请求 ${method}`);\n }\n }\n\n private waitFor(requestId: string): Promise<RespondAnswer> {\n return new Promise((resolve) => {\n this.pending.set(requestId, { kind: \"permission\", resolve });\n });\n }\n\n respond(requestId: string, answer: RespondAnswer): void {\n const p = this.pending.get(requestId);\n if (p) {\n this.pending.delete(requestId);\n p.resolve(answer);\n // Writing back resolved events is the manager's job (permission_resolved/question_answered)\n }\n }\n\n async setModel(model: string | null): Promise<void> {\n this.o.model = model; // Takes effect on the next turn/start\n }\n async setMode(mode: Mode): Promise<void> {\n this.o.mode = mode; // Takes effect on the next turn/start\n }\n async setEffort(effort: string | null): Promise<void> {\n this.o.effort = effort; // Takes effect on the next turn/start\n }\n\n async listCommands(): Promise<SlashCommand[]> {\n try {\n const entries = this.codexSlash ?? (await loadCodexSlashEntries(this.o.cwd));\n this.codexSlash = entries;\n return codexSlashCommandsFromEntries(entries);\n } catch {\n return [];\n }\n }\n\n async close(): Promise<void> {\n this.closed = true;\n for (const [, p] of this.pending) p.resolve({ cancelled: true });\n this.pending.clear();\n if (this.rpc) await this.rpc.close();\n this.q.close();\n }\n}\n","// Provider / ProviderSession interfaces (EXEC §7.1)\nimport type { ProviderEvent } from \"../timeline/types.js\";\nimport type { SlashCommand } from \"./slash.js\";\n\nexport type Mode = \"plan\" | \"default\" | \"acceptEdits\" | \"bypassPermissions\" | \"ask\";\n\nexport type Capabilities = {\n resume: boolean;\n interrupt: boolean;\n steer: boolean;\n /** The Agent takes images in a prompt (sees them itself). For ACP Agents: what initialize advertised, false until known */\n images: boolean;\n /** false while an ACP Agent's image support is not known yet (before its probe or first session); absent = known */\n imagesKnown?: boolean;\n plan: boolean;\n questions: boolean;\n cost: boolean;\n effort: string[];\n modes: Mode[];\n /** Each mode's name in this Agent (like Paseo, show the Agent's own naming); our default names are used when absent */\n modeLabels?: Partial<Record<Mode, string>>;\n /** The Agent only streams text deltas and never sends the complete message (ACP): the manager saves each text segment itself */\n deltasOnly?: boolean;\n};\n\nexport type ThinkingOption = { id: string; label: string };\n\nexport type ModelInfo = {\n id: string;\n name: string;\n /** @deprecated use thinkingOptions */\n efforts?: string[];\n thinkingOptions?: ThinkingOption[];\n defaultThinking?: string | null;\n isDefault?: boolean;\n /** Parameter name when the level is sent as a model parameter (Cursor: effort / reasoning_effort / reasoning) */\n thinkingParam?: string;\n};\nexport type DetectResult = { available: boolean; bin?: string; version?: string; reason?: string; installHint?: string };\n/** Custom launch (Settings › Launch command). args are appended after the built-in arguments; prefixArgs (internal) go before them. */\nexport type LaunchCommand = { cmd: string; prefixArgs?: string[]; args?: string[] };\nexport type HistoryItem = { provider: string; sessionId: string; title: string; updatedAt: number; messageCount: number; imported: boolean };\n/** text already carries the \"Referenced files\" section for mentions; mentions is there for Agents with a native form (ACP resource_link) */\nexport type SendInput = { text: string; images: { path: string; mime: string }[]; mentions?: { path: string; isDir: boolean }[] };\nexport type RespondAnswer = { optionId?: string; answers?: Record<string, string>; cancelled?: boolean };\n\nexport interface Provider {\n id: string;\n name: string;\n capabilities: Capabilities;\n detect(launch?: LaunchCommand): Promise<DetectResult>;\n listModels(launch?: LaunchCommand): Promise<ModelInfo[]>;\n createSession(o: {\n threadId: string;\n cwd: string;\n model: string | null;\n mode: Mode;\n effort: string | null;\n resumeId: string | null;\n cursorFast?: boolean;\n cursorAutoReview?: boolean;\n launch?: LaunchCommand;\n }): Promise<ProviderSession>;\n listHistory?(cwd: string): Promise<HistoryItem[]>;\n readHistory?(sessionId: string, cwd: string): Promise<ProviderEvent[]>;\n}\n\nexport interface ProviderSession {\n events: AsyncIterable<ProviderEvent>;\n send(input: SendInput): Promise<void>;\n steer?(input: SendInput): Promise<void>;\n interrupt(): Promise<void>;\n setModel(model: string | null): Promise<void>;\n setMode(mode: Mode): Promise<void>;\n setEffort(effort: string | null): Promise<void>;\n respond(requestId: string, answer: RespondAnswer): void;\n close(): Promise<void>;\n listCommands(): Promise<SlashCommand[]>;\n}\n\nexport type { SlashCommand, SlashCommandKind } from \"./slash.js\";\n\n/** Name of our own \"Default\" placeholder model row (id \"default\") */\nexport const PLACEHOLDER_MODEL_NAME = \"Default\";\n","// Codex Provider (§7.3): detect + listModels (temporary app-server → model/list, cached 10 minutes) + createSession.\nimport type { Provider, ProviderSession, DetectResult, ModelInfo, Capabilities, HistoryItem, LaunchCommand } from \"../types.js\";\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { listCodexHistory, readCodexHistory } from \"../../history/codex.js\";\nimport { argvFor, resolveBin, killTree, spawnBin, type ResolveResult } from \"../../util/bin.js\";\nimport { CodexRpc, CodexProcessExitedError } from \"./rpc.js\";\nimport { CodexSession } from \"./session.js\";\nimport { log } from \"../../log.js\";\nimport { tr } from \"../../util/i18n.js\";\nimport { launchArgv, resolveLaunch } from \"../launch.js\";\nimport { PLACEHOLDER_MODEL_NAME } from \"../types.js\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { readFile } from \"node:fs/promises\";\n\nconst INSTALL_HINT = \"npm i -g @openai/codex\";\n\nexport const codexCapabilities: Capabilities = {\n resume: true,\n interrupt: true,\n steer: true,\n images: true,\n plan: true,\n questions: true,\n cost: false, // tokenUsage yes, cost no\n effort: [], // effort values depend on the model — filled from model/list after detect\n // No \"plan\": app-server 0.16x has no plan/collaboration mode on turn/start, and a read-only \"plan\" was the same preset as default (B9)\n modes: [\"default\", \"acceptEdits\", \"bypassPermissions\"],\n modeLabels: { default: \"Read Only\", acceptEdits: \"Auto\", bypassPermissions: \"Full Access\" },\n};\n\nlet modelCache: { at: number; models: ModelInfo[] } | null = null;\nconst MODEL_CACHE_MS = 10 * 60 * 1000;\n\nfunction runVersion(r: ResolveResult & { ok: true }, args: string[], timeoutMs = 5000): Promise<string> {\n return new Promise((resolvePromise, reject) => {\n let out = \"\";\n const p = spawnBin(r, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n const t = setTimeout(() => {\n try {\n void killTree(p, { graceMs: 500 }); // On Windows a .cmd wrapper must be killed together with its child processes\n } catch {}\n reject(new Error(\"timeout\"));\n }, timeoutMs);\n p.stdout?.on(\"data\", (c: Buffer) => (out += c.toString()));\n p.stderr?.on(\"data\", (c: Buffer) => (out += c.toString()));\n p.on(\"error\", reject);\n p.on(\"close\", (code) => {\n clearTimeout(t);\n if (code === 0) resolvePromise(out);\n else reject(new Error(\"exit \" + code));\n });\n });\n}\n\n/** Normalize the level list to strings: accepts string[] and { reasoningEffort, description }[]; other shapes are dropped */\nexport function normalizeEfforts(raw: unknown[] | undefined): string[] {\n const out: string[] = [];\n for (const e of raw ?? []) {\n const v = typeof e === \"string\" ? e : (e as { reasoningEffort?: unknown } | null)?.reasoningEffort;\n if (typeof v === \"string\" && v && !out.includes(v)) out.push(v);\n }\n return out;\n}\n\nasync function fetchModels(r: ResolveResult & { ok: true }, cwd: string, launch?: LaunchCommand): Promise<ModelInfo[]> {\n const rpc = new CodexRpc(argvFor(r, launchArgv([\"app-server\"], launch)), { cwd });\n try {\n await rpc.request(\"initialize\", {\n clientInfo: { name: \"agent-console\", title: \"Agent Console\", version: \"0\" },\n capabilities: { experimentalApi: true },\n }, 15000);\n rpc.notify(\"initialized\", {});\n const res = (await rpc.request(\"model/list\", {}, 15000)) as {\n data?: {\n id?: string;\n displayName?: string;\n isDefault?: boolean;\n // Newer app-server returns { reasoningEffort, description }[], older ones string[]\n supportedReasoningEfforts?: unknown[];\n defaultReasoningEffort?: string;\n }[];\n };\n const rows = res.data ?? [];\n return rows\n .filter((m) => typeof m.id === \"string\" && m.id)\n .map((m) => {\n const efforts = normalizeEfforts(m.supportedReasoningEfforts);\n const thinkingOptions = efforts.map((e) => ({ id: e, label: e }));\n const defaultThinking = (typeof m.defaultReasoningEffort === \"string\" ? m.defaultReasoningEffort : null) ?? thinkingOptions[0]?.id ?? null;\n return {\n id: m.id!,\n name: m.displayName ?? m.id!,\n isDefault: m.isDefault,\n efforts,\n thinkingOptions,\n defaultThinking,\n };\n });\n } finally {\n await rpc.close();\n }\n}\n\nexport type CodexConfig = { modelProvider: string | null; model: string | null; providerModels: string[] };\n\nfunction tomlValue(raw: string): string | string[] | null {\n const v = raw.trim().replace(/\\s+#.*$/, \"\");\n const quoted = v.match(/^\"([\\s\\S]*)\"$/) ?? v.match(/^'([\\s\\S]*)'$/);\n if (quoted) return quoted[1];\n if (v.startsWith(\"[\") && v.endsWith(\"]\")) {\n return v.slice(1, -1).split(\",\").map((x) => tomlValue(x)).filter((x): x is string => typeof x === \"string\");\n }\n return null;\n}\n\nexport function parseCodexConfig(text: string): CodexConfig {\n let section = \"\";\n const values = new Map<string, string | string[]>();\n for (const line of text.split(/\\r?\\n/)) {\n const s = line.trim();\n if (!s || s.startsWith(\"#\")) continue;\n const header = s.match(/^\\[([^\\]]+)\\]$/);\n if (header) { section = header[1]; continue; }\n const m = s.match(/^([A-Za-z0-9_.-]+)\\s*=\\s*(.+)$/);\n if (!m) continue;\n const value = tomlValue(m[2]);\n if (typeof value === \"string\" || Array.isArray(value)) values.set(`${section}\\0${m[1]}`, value);\n }\n const top = (key: string) => values.get(`\\0${key}`);\n const profile = top(\"profile\");\n const profileName = typeof profile === \"string\" ? profile : null;\n const profileValue = (key: string) => profileName ? values.get(`profiles.${profileName}\\0${key}`) : undefined;\n const modelProvider = (profileValue(\"model_provider\") ?? top(\"model_provider\"));\n const model = (profileValue(\"model\") ?? top(\"model\"));\n const provider = typeof modelProvider === \"string\" ? modelProvider : null;\n const models = new Set<string>();\n if (typeof model === \"string\" && model) models.add(model);\n for (const [key, value] of values) {\n if (provider && key === `model_providers.${provider}\\0models` && Array.isArray(value)) {\n for (const m of value) models.add(m);\n }\n }\n return { modelProvider: provider, model: typeof model === \"string\" ? model : null, providerModels: [...models] };\n}\n\nasync function readCodexConfig(): Promise<CodexConfig> {\n const home = process.env.CODEX_HOME?.trim() || join(homedir(), \".codex\");\n const file = home.toLowerCase().endsWith(\".toml\") ? home : join(home, \"config.toml\");\n try { return parseCodexConfig(await readFile(file, \"utf8\")); } catch { return { modelProvider: null, model: null, providerModels: [] }; }\n}\n\nfunction isChatGptProvider(id: string | null): boolean {\n return !id || /^(openai|chatgpt)$/i.test(id);\n}\n\nexport function createCodexProvider(version: string): Provider {\n return {\n id: \"codex\",\n name: \"Codex\",\n capabilities: codexCapabilities,\n async detect(launch?: LaunchCommand): Promise<DetectResult> {\n const bin = launch ? await resolveLaunch(launch) : await resolveBin(\"codex\");\n if (!bin.ok) {\n return { available: false, reason: bin.reason, installHint: INSTALL_HINT };\n }\n try {\n const v = await runVersion(bin, [...(launch?.prefixArgs ?? []), \"--version\"]);\n return { available: true, bin: bin.display, version: v.trim().split(\"\\n\")[0] || \"\" };\n } catch (e) {\n return { available: true, bin: bin.display, version: \"\", reason: String(e) };\n }\n },\n async listModels(launch?: LaunchCommand): Promise<ModelInfo[]> {\n const config = await readCodexConfig();\n if (!isChatGptProvider(config.modelProvider)) {\n const rows = config.providerModels.map((id, i) => ({ id, name: id, isDefault: i === 0 }));\n return rows.length ? rows : [{ id: \"\", name: `${PLACEHOLDER_MODEL_NAME} (${config.modelProvider})`, isDefault: true }];\n }\n if (!launch && modelCache && Date.now() - modelCache.at < MODEL_CACHE_MS) return modelCache.models;\n const bin = launch ? await resolveLaunch(launch) : await resolveBin(\"codex\");\n if (!bin.ok) return [{ id: \"\", name: PLACEHOLDER_MODEL_NAME }];\n try {\n const models = await fetchModels(bin, process.cwd(), launch);\n modelCache = { at: Date.now(), models };\n return models;\n } catch (e) {\n // Gateway region errors etc. — the frontend shows a single \"Default\" entry (§7.3.6)\n log(\"warn\", \"codex model/list 失败\", { err: String(e) });\n return [{ id: \"\", name: PLACEHOLDER_MODEL_NAME }];\n }\n },\n async createSession(o): Promise<ProviderSession> {\n const bin = o.launch ? await resolveLaunch(o.launch) : await resolveBin(\"codex\");\n if (!bin.ok) throw new Error(tr(\"codex.notFound\", { detail: bin.reason, hint: INSTALL_HINT }));\n return new CodexSession({\n threadId: o.threadId,\n cwd: o.cwd,\n model: o.model,\n mode: o.mode,\n effort: o.effort,\n resumeId: o.resumeId,\n binCmd: bin.cmd,\n binPrefixArgs: bin.prefixArgs,\n binVia: bin.via,\n binShim: bin.shim,\n launch: o.launch,\n version,\n });\n },\n // §7.6: ~/.codex/sessions/**/rollout-*.jsonl matched by cwd\n async listHistory(cwd: string): Promise<HistoryItem[]> {\n const items = await listCodexHistory(cwd);\n return items.map((i) => ({ provider: \"codex\", ...i, imported: false }));\n },\n async readHistory(sessionId: string, cwd: string): Promise<ProviderEvent[]> {\n return (await readCodexHistory(sessionId, cwd)) as unknown as ProviderEvent[];\n },\n };\n}\n","import { tr } from \"../util/i18n.js\";\n/** Provider catalog (fixed, 8 entries).\n * status: verified=accepted on a real machine | experimental=usable but not guaranteed | planned=integration not confirmed\n * All 8 are currently verified; default toggle: verified ones are on by default (see enabled.ts). */\nexport type ProviderStatus = \"verified\" | \"experimental\" | \"planned\";\n\nexport type ProviderCatalogEntry = {\n id: string;\n name: string;\n bins: string[];\n installHint: string;\n status: ProviderStatus;\n};\n\nexport const PROVIDER_CATALOG: ProviderCatalogEntry[] = [\n { id: \"claude\", name: \"Claude Code\", bins: [\"claude\"], installHint: \"npm i -g @anthropic-ai/claude-code\", status: \"verified\" },\n { id: \"codex\", name: \"Codex\", bins: [\"codex\"], installHint: \"npm i -g @openai/codex\", status: \"verified\" },\n { id: \"cursor\", name: \"Cursor\", bins: [\"cursor-agent\", \"cursor\"], installHint: \"curl https://cursor.com/install -fsS | bash\", status: \"verified\" },\n { id: \"copilot\", name: \"Copilot\", bins: [\"copilot\"], installHint: \"npm i -g @github/copilot\", status: \"verified\" },\n { id: \"opencode\", name: \"OpenCode\", bins: [\"opencode\"], installHint: \"npm i -g opencode-ai\", status: \"verified\" },\n { id: \"pi\", name: \"Pi\", bins: [\"pi-acp\", \"pi\", \"pi-coding-agent\"], installHint: \"npm i -g pi-acp\", status: \"verified\" },\n { id: \"devin\", name: \"Devin CLI\", bins: [\"devin\"], installHint: \"https://docs.devin.ai/cli\", status: \"verified\" },\n { id: \"dsh\", name: \"dsh\", bins: [\"dsh\"], installHint: \"npm i -g @deepseek-ai/dsh\", status: \"verified\" },\n];\n\nexport function catalogById(id: string): ProviderCatalogEntry | undefined {\n return PROVIDER_CATALOG.find((p) => p.id === id);\n}\n\nexport function providerCreatable(status: ProviderStatus): boolean {\n return status !== \"planned\";\n}\n","import type { ChildProcess } from \"node:child_process\";\nimport { Readable, Writable } from \"node:stream\";\nimport { resolve as resolvePath } from \"node:path\";\nimport * as acp from \"@agentclientprotocol/sdk\";\nimport type { ResolveResult } from \"../../util/bin.js\";\nimport { killTree, spawnBin } from \"../../util/bin.js\";\n\nexport function spawnResolved(r: ResolveResult & { ok: true }, args: string[], o: { cwd?: string } = {}): ChildProcess {\n // group: on non-Windows it gets its own process group so killTree also ends the tool processes it started\n return spawnBin(r, args, {\n cwd: o.cwd,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env, NO_COLOR: \"1\", FORCE_COLOR: \"0\" },\n group: true,\n });\n}\n\nexport function acpStreamFromChild(child: ChildProcess): acp.Stream {\n if (!child.stdin || !child.stdout) throw new Error(\"ACP 子进程缺少 stdio 管道\");\n const output = Writable.toWeb(child.stdin) as WritableStream<Uint8Array>;\n const input = Readable.toWeb(child.stdout) as ReadableStream<Uint8Array>;\n return acp.ndJsonStream(output, input);\n}\n\nexport function absCwd(cwd: string): string {\n return resolvePath(cwd);\n}\n\nexport async function killAcpChild(child: ChildProcess | null): Promise<void> {\n await killTree(child);\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport type { ClientApp } from \"@agentclientprotocol/sdk\";\nimport { methods } from \"@agentclientprotocol/sdk\";\nimport type { RespondAnswer } from \"../types.js\";\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { tr } from \"../../util/i18n.js\";\n\nexport type PermBridge = {\n push(ev: ProviderEvent): void;\n waitFor(requestId: string): Promise<RespondAnswer>;\n /** Cursor Auto-review: no permission card, allow is chosen automatically */\n autoAcceptPermissions?: () => boolean;\n};\n\nexport function registerAcpClientHandlers(app: ClientApp, bridge: PermBridge): void {\n app.onRequest(methods.client.fs.readTextFile, async (ctx) => {\n const text = await readFile(ctx.params.path, \"utf8\");\n return { content: text };\n });\n app.onRequest(methods.client.fs.writeTextFile, async (ctx) => {\n await writeFile(ctx.params.path, ctx.params.content, \"utf8\");\n return {};\n });\n app.onRequest(methods.client.session.requestPermission, async (ctx) => {\n const tc = ctx.params.toolCall;\n const options = ctx.params.options.map((o) => ({\n id: o.optionId,\n label: o.name,\n kind: o.kind,\n }));\n if (bridge.autoAcceptPermissions?.()) {\n const allow =\n options.find((o) => o.kind === \"allow_once\" || o.kind === \"allow_always\") ?? options[0];\n if (allow) return { outcome: { outcome: \"selected\", optionId: allow.id } };\n }\n const requestId = \"p\" + Math.random().toString(36).slice(2, 10);\n bridge.push({\n type: \"permission_request\",\n requestId,\n title: tc.title ?? tc.name ?? tr(\"tool.needsApproval\"),\n kind: tc.kind ?? \"tool\",\n detail: tc.rawInput ?? undefined,\n options,\n });\n const answer = await bridge.waitFor(requestId);\n if (answer.cancelled) return { outcome: { outcome: \"cancelled\" } };\n const optionId = answer.optionId ?? options[0]?.id;\n if (!optionId) return { outcome: { outcome: \"cancelled\" } };\n return { outcome: { outcome: \"selected\", optionId } };\n });\n}\n","import type * as schema from \"@agentclientprotocol/sdk\";\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport type { ToolKind } from \"../../timeline/types.js\";\n\nconst rid = () => Math.random().toString(36).slice(2, 8);\n\nfunction mapToolKind(k: schema.ToolKind | null | undefined): ToolKind {\n switch (k) {\n case \"read\":\n case \"edit\":\n case \"search\":\n return k;\n case \"execute\":\n return \"bash\";\n case \"fetch\":\n return \"web\";\n default:\n return \"other\";\n }\n}\n\nfunction mapToolStatus(s: schema.ToolCallStatus | null | undefined): \"running\" | \"ok\" | \"failed\" {\n if (s === \"completed\") return \"ok\";\n if (s === \"failed\") return \"failed\";\n return \"running\";\n}\n\nfunction textFromContent(content: schema.ContentBlock): string {\n if (content.type === \"text\") return content.text;\n return \"\";\n}\n\n/** seg: text segment number, bumped when a tool call / plan comes between two runs of text, so the text before and\n * after a tool call are separate items (live and persisted alike: the manager saves each segment when the next item starts). */\nexport type MapCtx = { itemPrefix: string; messageIds: Map<string, string>; seg: number; lastWasText: boolean };\n\nexport function newMapCtx(): MapCtx {\n return { itemPrefix: \"a\" + rid() + \"_\", messageIds: new Map(), seg: 0, lastWasText: false };\n}\n\nfunction endTextSegment(ctx: MapCtx): void {\n if (ctx.lastWasText) {\n ctx.seg++;\n ctx.lastWasText = false;\n }\n}\n\nexport function mapSessionUpdate(update: schema.SessionUpdate, ctx: MapCtx): ProviderEvent[] {\n const out: ProviderEvent[] = [];\n const mid = \"messageId\" in update && update.messageId ? String(update.messageId) : null;\n\n switch (update.sessionUpdate) {\n case \"agent_message_chunk\": {\n const text = textFromContent(update.content);\n if (!text) break;\n const itemId = `${ctx.itemPrefix}${mid ?? \"msg\"}_${ctx.seg}`;\n if (mid) ctx.messageIds.set(mid, itemId);\n ctx.lastWasText = true;\n out.push({ type: \"assistant_delta\", itemId, text });\n break;\n }\n case \"agent_thought_chunk\": {\n const text = textFromContent(update.content);\n if (!text) break;\n const itemId = `${ctx.itemPrefix}t_${mid ?? \"think\"}_${ctx.seg}`;\n ctx.lastWasText = true;\n out.push({ type: \"reasoning_delta\", itemId, text });\n break;\n }\n case \"tool_call\":\n endTextSegment(ctx);\n out.push({\n type: \"tool_call\",\n itemId: ctx.itemPrefix + update.toolCallId,\n kind: mapToolKind(update.kind),\n title: update.title,\n status: mapToolStatus(update.status),\n input: update.rawInput,\n });\n break;\n case \"tool_call_update\":\n endTextSegment(ctx);\n out.push({\n type: \"tool_call\",\n itemId: ctx.itemPrefix + update.toolCallId,\n kind: mapToolKind(update.kind),\n title: update.title ?? update.name ?? \"\",\n status: mapToolStatus(update.status),\n input: update.rawInput,\n output: typeof update.rawOutput === \"string\" ? update.rawOutput : undefined,\n });\n break;\n case \"plan\":\n endTextSegment(ctx);\n out.push({\n type: \"plan\",\n itemId: ctx.itemPrefix + \"plan\",\n markdown: update.entries.map((e) => `- ${e.content}`).join(\"\\n\"),\n entries: update.entries.map((e) => ({ step: e.content, status: e.status ?? \"\" })),\n });\n break;\n case \"notice\":\n out.push({\n type: \"notice\",\n level: update.severity === \"error\" ? \"error\" : update.severity === \"warning\" ? \"warn\" : \"info\",\n message: update.description ? `${update.title}: ${update.description}` : update.title,\n });\n break;\n case \"usage_update\":\n out.push({\n type: \"usage\",\n inputTokens: update.used,\n outputTokens: 0,\n cacheReadTokens: 0,\n costUsd: typeof update.cost?.amount === \"number\" ? update.cost.amount : 0,\n contextWindow: update.size,\n });\n break;\n default:\n break;\n }\n return out;\n}\n\nexport function stopToTurnEnd(stopReason: schema.StopReason, turnId: string, err?: string): ProviderEvent {\n if (stopReason === \"cancelled\") {\n return { type: \"turn_ended\", turnId, status: \"interrupted\" };\n }\n if (stopReason === \"refusal\" || stopReason === \"max_tokens\") {\n return { type: \"turn_ended\", turnId, status: \"failed\", error: err ?? stopReason };\n }\n return { type: \"turn_ended\", turnId, status: \"completed\" };\n}\n","// What each ACP Agent says it accepts in a prompt: initialize → agentCapabilities.promptCapabilities.\n// ACP's baseline is text and resource_link; image / audio / embedded resources are opt-in per Agent.\n// Learned from the model probe (startup warm-up, providers.list) and from every session's initialize,\n// kept in memory per provider id, and read by the provider's capabilities (images) and by AcpSession.send.\nexport type AcpPromptCaps = { image: boolean; audio: boolean; embeddedContext: boolean };\n\nconst learned = new Map<string, AcpPromptCaps>();\n\n/** Normalize an initialize response (anything: Agents may leave fields out, which means false) */\nexport function promptCapsFromInitialize(res: unknown): AcpPromptCaps {\n const pc = (res as { agentCapabilities?: { promptCapabilities?: Record<string, unknown> | null } | null } | null)\n ?.agentCapabilities?.promptCapabilities;\n return {\n image: pc?.image === true,\n audio: pc?.audio === true,\n embeddedContext: pc?.embeddedContext === true,\n };\n}\n\nexport function rememberPromptCaps(providerId: string | undefined, caps: AcpPromptCaps): void {\n if (providerId) learned.set(providerId, caps);\n}\n\n/** undefined until the Agent has been probed or a session has initialized */\nexport function knownPromptCaps(providerId: string): AcpPromptCaps | undefined {\n return learned.get(providerId);\n}\n\nexport function forgetPromptCaps(providerId?: string): void {\n if (providerId) learned.delete(providerId);\n else learned.clear();\n}\n","// How an ACP Agent reopens an old conversation: initialize → agentCapabilities.\n// - loadSession (top-level): session/load — returns prior messages as session/update\n// - sessionCapabilities.resume: session/resume — reconnects without replaying history\n// Prefer load when both are advertised (OpenCode); resume when only resume (dsh);\n// neither → the caller starts a new session and tells the user prior context wasn't restored.\nexport type AcpSessionOpen = { load: boolean; resume: boolean };\nexport type AcpReconnect = \"load\" | \"resume\" | \"none\";\n\n/** Normalize an initialize response: missing/false/null means the Agent doesn't advertise that method */\nexport function sessionOpenFromInitialize(res: unknown): AcpSessionOpen {\n const caps = (res as { agentCapabilities?: {\n loadSession?: unknown;\n sessionCapabilities?: { resume?: unknown } | null;\n } | null } | null)?.agentCapabilities;\n // ACP: omitted or null = no; {} (any object) = yes\n const resume = caps?.sessionCapabilities?.resume != null && typeof caps.sessionCapabilities.resume === \"object\";\n return { load: caps?.loadSession === true, resume };\n}\n\nexport function pickReconnect(open: AcpSessionOpen): AcpReconnect {\n if (open.load) return \"load\";\n if (open.resume) return \"resume\";\n return \"none\";\n}\n","// Turn one user message (text + attachments) into an ACP prompt (ContentBlock[]) for what this Agent accepts.\n// - PNG/JPEG/GIF/WebP: an image block (base64 + mimeType) when the Agent advertises promptCapabilities.image;\n// otherwise the saved file's absolute path, as a resource_link (ACP baseline) and as a line of text,\n// so an Agent with file tools can still open it; the caller shows a notice that it can't see the image.\n// - audio/* : an audio block when promptCapabilities.audio, else the same path fallback.\n// - text : an embedded resource (its text) when promptCapabilities.embeddedContext and small enough, else a path.\n// Every attachment is either sent or named by path: nothing is dropped silently.\nimport type { ContentBlock } from \"@agentclientprotocol/sdk\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { resolveImagePath } from \"../../util/attachmentRefs.js\";\nimport type { AcpPromptCaps } from \"./promptCaps.js\";\nimport { attachmentKind } from \"../../util/attachmentKinds.js\";\n\n/** Largest image / audio sent inline as base64 (above it, the path is sent instead) */\nexport const MAX_INLINE_MEDIA_BYTES = 10 * 1024 * 1024;\n/** All inline media of one prompt together. Base64 adds a third, and an Agent built on the ACP SDK refuses an incoming\n * line over 32 MB (DEFAULT_MAX_MESSAGE_BYTES), so one prompt stays well under that; the rest goes by path. */\nexport const MAX_INLINE_TOTAL_BYTES = 16 * 1024 * 1024;\n/** Largest text file embedded as a resource */\nexport const MAX_EMBED_TEXT_BYTES = 1024 * 1024;\n\nexport type AcpPromptBuild = {\n blocks: ContentBlock[];\n /** Images that went by path because the Agent doesn't take image blocks */\n imagesByPath: string[];\n /** Other problems worth a notice (unreadable file, too large) */\n warnings: string[];\n};\n\nconst isText = (mime: string) => attachmentKind(mime) === \"text\";\n\nexport async function buildAcpPrompt(\n text: string,\n attachments: { path: string; mime: string }[],\n caps: AcpPromptCaps,\n mentions: { path: string; isDir: boolean }[] = [],\n): Promise<AcpPromptBuild> {\n const media: ContentBlock[] = [];\n const links: ContentBlock[] = [];\n const pathLines: string[] = [];\n const imagesByPath: string[] = [];\n const warnings: string[] = [];\n let inlineBytes = 0;\n\n const byPath = (file: string, mime: string, size: number | null, label: string) => {\n links.push({ type: \"resource_link\", uri: pathToFileURL(file).href, name: basename(file), mimeType: mime, ...(size !== null ? { size } : {}) });\n pathLines.push(`${label}: ${file}`);\n };\n\n for (const a of attachments) {\n const mime = a.mime || \"application/octet-stream\";\n let file: string;\n let size: number | null = null;\n try {\n file = await resolveImagePath(a.path);\n size = (await stat(file)).size;\n } catch (e) {\n warnings.push(`${a.path}: ${String((e as Error)?.message ?? e)}`);\n continue;\n }\n // Only the four image types model APIs take (svg, bmp… go by path like any other file)\n const image = attachmentKind(mime) === \"image\";\n const audio = mime.startsWith(\"audio/\");\n if ((image && caps.image) || (audio && caps.audio)) {\n if (size > MAX_INLINE_MEDIA_BYTES || inlineBytes + size > MAX_INLINE_TOTAL_BYTES) {\n const limit = size > MAX_INLINE_MEDIA_BYTES ? MAX_INLINE_MEDIA_BYTES : MAX_INLINE_TOTAL_BYTES;\n warnings.push(`${basename(file)}: ${(size / 1024 / 1024).toFixed(1)} MB, over the ${limit / 1024 / 1024} MB inline limit; sent as a file path`);\n byPath(file, mime, size, image ? \"Attached image\" : \"Attached audio\");\n if (image) imagesByPath.push(file);\n continue;\n }\n try {\n const data = (await readFile(file)).toString(\"base64\");\n media.push(image ? { type: \"image\", data, mimeType: mime } : { type: \"audio\", data, mimeType: mime });\n inlineBytes += size;\n } catch (e) {\n warnings.push(`${basename(file)}: ${String((e as Error)?.message ?? e)}`);\n byPath(file, mime, size, image ? \"Attached image\" : \"Attached audio\");\n if (image) imagesByPath.push(file);\n }\n continue;\n }\n if (image || audio) {\n byPath(file, mime, size, image ? \"Attached image\" : \"Attached audio\");\n if (image) imagesByPath.push(file);\n continue;\n }\n if (isText(mime) && caps.embeddedContext && size <= MAX_EMBED_TEXT_BYTES && inlineBytes + size <= MAX_INLINE_TOTAL_BYTES) {\n try {\n const body = await readFile(file, \"utf8\");\n media.push({ type: \"resource\", resource: { uri: pathToFileURL(file).href, mimeType: mime, text: body } });\n inlineBytes += size;\n continue;\n } catch {\n /* fall back to the path */\n }\n }\n byPath(file, mime, size, \"Attached file\");\n }\n\n const fullText = [text, ...(pathLines.length ? [pathLines.join(\"\\n\")] : [])].filter(Boolean).join(\"\\n\\n\");\n const blocks: ContentBlock[] = [];\n if (fullText) blocks.push({ type: \"text\", text: fullText });\n blocks.push(...media, ...links);\n // Files / folders referenced from the Files panel: a resource_link each (ACP baseline); the text already names them too\n for (const m of mentions) {\n blocks.push({ type: \"resource_link\", uri: pathToFileURL(m.path).href, name: basename(m.path) || m.path });\n }\n return { blocks, imagesByPath, warnings };\n}\n","// Persistent ACP session: cursor-agent acp / devin acp and others.\nimport type { ActiveSession, ClientConnection, ClientContext } from \"@agentclientprotocol/sdk\";\nimport { client, methods, PROTOCOL_VERSION } from \"@agentclientprotocol/sdk\";\nimport type { ChildProcess } from \"node:child_process\";\nimport type { LaunchCommand, ProviderSession, SendInput, RespondAnswer, Mode, SlashCommand } from \"../types.js\";\nimport { mapAcpAvailableCommands, sortSlashCommands } from \"../slash.js\";\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { AsyncQueue } from \"../../util/queue.js\";\nimport { resolveFirstBin, type ResolveResult } from \"../../util/bin.js\";\nimport { launchArgv, resolveLaunch } from \"../launch.js\";\nimport { absCwd, acpStreamFromChild, killAcpChild, spawnResolved } from \"./spawn.js\";\nimport { registerAcpClientHandlers } from \"./clientHandlers.js\";\nimport { mapSessionUpdate, newMapCtx, stopToTurnEnd, type MapCtx } from \"./mapUpdate.js\";\nimport { promptCapsFromInitialize, rememberPromptCaps, type AcpPromptCaps } from \"./promptCaps.js\";\nimport { pickReconnect, sessionOpenFromInitialize } from \"./sessionCaps.js\";\nimport { buildAcpPrompt } from \"./prompt.js\";\nimport { tr } from \"../../util/i18n.js\";\n\ntype AcpSelectValue = { value?: string; name?: string; options?: AcpSelectValue[] };\ntype AcpConfigOption = { id: string; category?: string | null; type?: string; currentValue?: unknown; options?: AcpSelectValue[] };\nimport { log } from \"../../log.js\";\n\nconst rid = () => Math.random().toString(36).slice(2, 10);\n\ntype AttachableCtx = {\n attachSession(response: { sessionId: string; modes?: unknown; configOptions?: unknown }): ActiveSession;\n};\n\nexport type AcpSessionOpts = {\n threadId: string;\n /** Provider id and display name: the Agent's prompt capabilities are remembered under the id; notices name the Agent */\n providerId?: string;\n providerName?: string;\n cwd: string;\n model: string | null;\n mode: Mode;\n effort: string | null;\n resumeId: string | null;\n binName: string;\n binCandidates: string[];\n acpArgs: string[];\n /** initialize's image answer holds for the start model only (dsh): after a switch, images go by path */\n imagesFollowStartModel?: boolean;\n appVersion: string;\n flavor: \"cursor\" | \"generic\";\n modeMap?: Partial<Record<Mode, string>>;\n cursorFast?: boolean;\n cursorAutoReview?: boolean;\n launch?: LaunchCommand;\n};\n\nexport class AcpSession implements ProviderSession {\n events: AsyncIterable<ProviderEvent>;\n private q = new AsyncQueue<ProviderEvent>();\n private child: ChildProcess | null = null;\n private conn: ClientConnection | null = null;\n private ctx: ClientContext | null = null;\n private active: ActiveSession | null = null;\n private initErr: Error | null = null;\n private initPromise: Promise<void>;\n private closed = false;\n private turnId: string | null = null;\n private turnNum = 0;\n private running = false;\n private permPending = new Map<string, (a: RespondAnswer) => void>();\n private mapCtx: MapCtx = newMapCtx();\n private modelConfigId: string | null = null;\n private thoughtConfigId: string | null = null;\n private cursorFast = false;\n private cursorAutoReview = false;\n private slashCommands: SlashCommand[] = [];\n private activeTurnId: string | null = null;\n private configOptions: AcpConfigOption[] | null = null;\n // initialize → agentCapabilities.promptCapabilities (ACP baseline until initialize answers: text + resource_link)\n private promptCaps: AcpPromptCaps = { image: false, audio: false, embeddedContext: false };\n private initCaps: AcpPromptCaps = this.promptCaps;\n private startModel: string | null = null;\n private wakePump: (() => void) | null = null;\n // listCommands waits for the first batch of commands (or confirmation there are none), following Paseo's waitForInitialCommands\n private commandsReady!: Promise<void>;\n private settleCommands!: () => void;\n\n constructor(private o: AcpSessionOpts) {\n this.events = this.q;\n this.startModel = o.model; // the model the process is launched for (argsFor), before any setModel\n this.cursorFast = o.cursorFast ?? false;\n // The shield (auto-accept permission prompts) UI was removed: never auto-approve, so conversations that once turned it on don't keep approving with the toggle hidden\n this.cursorAutoReview = false;\n this.commandsReady = new Promise<void>((r) => (this.settleCommands = r));\n this.initPromise = this.boot();\n }\n\n private async boot(): Promise<void> {\n const bin = this.o.launch\n ? await resolveLaunch(this.o.launch).then((r) => r.ok ? ({ ...r, binName: \"custom\" } as ResolveResult & { ok: true; binName: string }) : r)\n : await resolveFirstBin(this.o.binCandidates?.length ? this.o.binCandidates : [this.o.binName]);\n if (!bin.ok) throw new Error(bin.reason);\n try {\n this.child = spawnResolved(bin, launchArgv(this.o.acpArgs, this.o.launch), { cwd: this.o.cwd });\n this.child.stderr?.on(\"data\", (d: Buffer) => {\n const t = d.toString().trim();\n if (t) log(\"info\", `[${this.o.binName} acp] ${t.slice(0, 500)}`);\n });\n this.child.on(\"error\", (e) => this.failInit(e));\n this.child.on(\"close\", (code) => {\n if (!this.closed && code !== 0) {\n this.q.push({ type: \"notice\", level: \"error\", message: tr(\"acp.exited\", { name: this.o.binName, code: String(code) }) });\n }\n });\n\n const app = client({ name: \"magpie-agent-console\" });\n registerAcpClientHandlers(app, {\n push: (ev) => this.q.push(ev),\n waitFor: (id) => this.waitPerm(id),\n autoAcceptPermissions: () => this.cursorAutoReview,\n });\n const stream = acpStreamFromChild(this.child);\n this.conn = app.connect(stream);\n this.ctx = this.conn.agent;\n const initRes = await this.ctx.request(methods.agent.initialize, {\n protocolVersion: PROTOCOL_VERSION,\n // Cursor: declare support for the parameterized model picker (as Paseo does); only then does it expose levels / Fast as separate config options\n clientCapabilities: this.o.flavor === \"cursor\" ? { _meta: { parameterizedModelPicker: true } } : {},\n clientInfo: { name: \"Agent Console\", version: this.o.appVersion },\n });\n this.promptCaps = promptCapsFromInitialize(initRes);\n this.initCaps = this.promptCaps;\n rememberPromptCaps(this.o.providerId, this.promptCaps);\n\n const cwd = absCwd(this.o.cwd);\n const ctx = this.ctx;\n if (!ctx) throw new Error(\"ACP 未连接\");\n if (this.o.resumeId) {\n // Prefer the method the Agent's initialize advertises: load (replays history) over resume (reconnects only); neither → new session + notice\n const how = pickReconnect(sessionOpenFromInitialize(initRes));\n if (how === \"load\" || how === \"resume\") {\n const method = how === \"load\" ? methods.agent.session.load : methods.agent.session.resume;\n const restored = (await ctx.request(method, {\n sessionId: this.o.resumeId,\n cwd,\n mcpServers: [],\n })) as { modes?: unknown; configOptions?: AcpConfigOption[] };\n this.active = (ctx as unknown as AttachableCtx).attachSession({\n sessionId: this.o.resumeId,\n modes: restored.modes,\n configOptions: restored.configOptions,\n });\n if (Array.isArray(restored.configOptions)) this.configOptions = restored.configOptions;\n } else {\n this.active = await ctx.buildSession(cwd).start();\n const agent = this.o.providerName ?? this.o.binName;\n this.q.push({ type: \"notice\", level: \"warn\", message: tr(\"notice.acpSessionNotRestored\", { agent }) });\n }\n } else {\n this.active = await ctx.buildSession(cwd).start();\n }\n this.syncModelConfigId();\n this.syncThoughtConfigId();\n await this.applySessionMode(this.o.mode);\n await this.applySessionModel(this.o.model); // Also applies the thinking level\n await this.applyCursorAutoReviewConfig(this.cursorAutoReview);\n this.q.push({ type: \"provider_session_id\", id: this.active.sessionId });\n const init = (this.active.newSessionResponse as { availableCommands?: { name: string; description: string; input?: { hint?: string } | null }[] })\n ?.availableCommands;\n if (init?.length) this.applyAvailableCommands(init);\n void this.pumpUpdates();\n } catch (e) {\n this.failInit(e);\n throw e;\n }\n }\n\n private failInit(e: unknown): void {\n this.initErr = e instanceof Error ? e : new Error(String(e));\n }\n\n private applyAvailableCommands(\n raw: { name: string; description: string; input?: { hint?: string } | null }[],\n ): void {\n this.slashCommands = sortSlashCommands(mapAcpAvailableCommands(raw));\n this.q.push({ type: \"slash_commands\", commands: this.slashCommands });\n this.settleCommands();\n }\n\n private async ready(): Promise<void> {\n await this.initPromise.catch(() => {});\n if (this.initErr) throw this.initErr;\n if (!this.active) throw new Error(\"ACP 会话未就绪\");\n }\n\n /** The config options currently in effect: each set_config_option response returns the latest set (levels change after switching models); otherwise use session/new's */\n private currentConfig(): AcpConfigOption[] {\n return (this.configOptions ?? this.active?.newSessionResponse.configOptions ?? []) as AcpConfigOption[];\n }\n\n private syncModelConfigId(): void {\n for (const o of this.currentConfig()) {\n if (o.type === \"select\" && (o.category === \"model\" || o.id === \"model\")) {\n this.modelConfigId = o.id;\n return;\n }\n }\n if (this.o.flavor === \"cursor\") this.modelConfigId = \"model\";\n }\n\n // Level options belong to the current model: recompute on every refresh (cleared when switching to a model without levels)\n private syncThoughtConfigId(): void {\n this.thoughtConfigId = null;\n const opts = this.currentConfig().filter((o) => o.type === \"select\");\n const hit =\n opts.find((o) => o.category === \"thought_level\") ??\n opts.find((o) => /thought|thinking|effort|reasoning/i.test(o.id ?? \"\"));\n if (hit) this.thoughtConfigId = hit.id;\n }\n\n /** set_config_option, then refresh local state from the latest config options it returns */\n private async setOption(configId: string, value: string): Promise<boolean> {\n if (!this.ctx || !this.active) return false;\n try {\n const res = (await this.ctx.request(methods.agent.session.setConfigOption, {\n sessionId: this.active.sessionId,\n configId,\n value,\n })) as { configOptions?: AcpConfigOption[] } | null;\n if (Array.isArray(res?.configOptions)) {\n this.configOptions = res.configOptions;\n this.syncThoughtConfigId();\n }\n return true;\n } catch (e) {\n log(\"info\", `ACP set_config_option(${configId}=${value}): ${String(e)}`);\n return false;\n }\n }\n\n private async applySessionThought(effort: string | null): Promise<void> {\n if (!effort || !this.thoughtConfigId) return;\n // Don't send a level the current model doesn't support (the level set changes after switching models)\n const opt = this.currentConfig().find((o) => o.id === this.thoughtConfigId);\n const values = (opt?.options ?? []).flatMap((x) => (x.options ? x.options : [x])).map((x) => x.value);\n if (values.length && !values.includes(effort)) return;\n await this.setOption(this.thoughtConfigId, effort);\n }\n\n /** Mode choices the Agent reports: prefer a category=mode select in configOptions, otherwise ACP modes.availableModes */\n private modeChoices(): { id: string; name: string; configId: string | null }[] {\n const opt = this.currentConfig().find(\n (o) => o.type === \"select\" && (o.category === \"mode\" || o.id === \"mode\"),\n ) as { id: string; options?: { value?: string; name?: string }[] } | undefined;\n if (opt?.options?.length) {\n return opt.options\n .filter((x) => typeof x.value === \"string\")\n .map((x) => ({ id: x.value!, name: x.name ?? x.value!, configId: opt.id }));\n }\n return (this.active?.modes?.availableModes ?? []).map((m) => ({ id: m.id, name: m.name, configId: null }));\n }\n\n private resolveAcpModeId(mode: Mode): string | null {\n if (this.o.modeMap) {\n // Find the Agent's real mode via the table; Copilot's mode ids are URLs (…/session-modes#agent), so match on the # suffix\n const want = this.o.modeMap[mode];\n if (!want) return null;\n const hit = this.modeChoices().find(\n (m) => m.id === want || m.id.endsWith(`#${want}`) || m.name.toLowerCase() === want,\n );\n return hit?.id ?? want;\n }\n if (this.o.flavor === \"cursor\") {\n const map: Partial<Record<Mode, string>> = { default: \"agent\", plan: \"plan\", ask: \"ask\" };\n const want = map[mode] ?? \"agent\";\n const avail = this.active?.modes?.availableModes ?? [];\n const hit = avail.find((m) => m.id === want || m.name.toLowerCase() === want);\n return hit?.id ?? want;\n }\n return mode === \"plan\" ? \"plan\" : \"default\";\n }\n\n private async applySessionMode(mode: Mode): Promise<void> {\n if (!this.ctx || !this.active) return;\n // Copilot \"Allow All\" (as Paseo does): use the agent mode, then turn the allow_all config on; turn it off for other modes\n const hasAllowAll = this.currentConfig().some((o) => o.id === \"allow_all\");\n if (this.o.modeMap?.[mode] === \"allow-all\") {\n const agentId = this.modeChoices().find((m) => m.id === \"agent\" || m.id.endsWith(\"#agent\"));\n if (agentId?.configId) await this.setOption(agentId.configId, agentId.id);\n if (hasAllowAll) await this.setOption(\"allow_all\", \"on\");\n return;\n }\n if (hasAllowAll && this.o.modeMap) await this.setOption(\"allow_all\", \"off\");\n const modeId = this.resolveAcpModeId(mode);\n if (!modeId) return; // This Agent has no such mode: don't send anything\n try {\n // Modes offered as a config option (Devin / OpenCode / Copilot) use set_config_option, otherwise set_mode\n const viaConfig = this.modeChoices().find((m) => m.id === modeId)?.configId;\n if (viaConfig) {\n await this.setOption(viaConfig, modeId);\n return;\n }\n await this.ctx.request(methods.agent.session.setMode, {\n sessionId: this.active.sessionId,\n modeId,\n });\n } catch (e) {\n log(\"info\", `ACP setMode(${mode}): ${String(e)}`);\n }\n }\n\n /**\n * Switch model → refresh level options from the new config options it returns → then apply the level (as Paseo does).\n * Cursor connects with parameterizedModelPicker: only the base model name is sent (grok-4.6); level / Fast are separate config options.\n */\n private async applySessionModel(model: string | null): Promise<void> {\n if (!this.ctx || !this.active) return;\n const value = model && this.o.flavor === \"cursor\" ? model.replace(/\\[.*\\]$/u, \"\") : model;\n if (value) {\n const modelOption = this.currentConfig().find((o) => o.id === (this.modelConfigId ?? \"model\"));\n const values = (modelOption?.options ?? []).flatMap((x) => x.options ? x.options : [x])\n .map((x) => x.value).filter((x): x is string => typeof x === \"string\");\n // Old sessions may have saved another Agent's model ID. Skip invalid values and let ACP keep its current model.\n if (!values.length || values.includes(value)) {\n await this.setOption(this.modelConfigId ?? \"model\", value);\n } else {\n log(\"info\", `忽略 ${this.o.binName} 的无效模型:${value}`);\n }\n }\n if (this.o.flavor === \"cursor\" && this.cursorFast && this.currentConfig().some((o) => o.id === \"fast\")) {\n await this.setOption(\"fast\", \"true\");\n }\n await this.applySessionThought(this.o.effort);\n }\n\n private async applyCursorAutoReviewConfig(on: boolean): Promise<void> {\n if (this.o.flavor !== \"cursor\" || !this.ctx || !this.active) return;\n for (const configId of [\"auto_review\", \"autoReview\", \"smart_auto\"]) {\n try {\n await this.ctx.request(methods.agent.session.setConfigOption, {\n sessionId: this.active.sessionId,\n configId,\n type: \"boolean\",\n value: on,\n });\n return;\n } catch {\n /* try the next configId */\n }\n }\n }\n\n /** Cursor only: Fast / Auto-review (can be changed while the session is open) */\n async updateCursorOpts(fast: boolean, autoReview: boolean): Promise<void> {\n this.cursorFast = fast;\n void autoReview; // See the constructor: auto-approval is no longer supported\n await this.ready();\n await this.applySessionModel(this.o.model);\n await this.applyCursorAutoReviewConfig(false);\n }\n\n private waitPerm(requestId: string): Promise<RespondAnswer> {\n return new Promise((resolve) => {\n this.permPending.set(requestId, resolve);\n });\n }\n\n respond(requestId: string, answer: RespondAnswer): void {\n const r = this.permPending.get(requestId);\n if (r) {\n this.permPending.delete(requestId);\n r(answer);\n this.q.push({\n type: \"permission_resolved\",\n requestId,\n optionId: answer.optionId,\n cancelled: answer.cancelled,\n });\n }\n }\n\n async send(input: SendInput): Promise<void> {\n await this.ready();\n if (this.running) throw new Error(\"当前轮次尚未结束\");\n this.turnNum++;\n this.turnId = \"u_\" + Date.now().toString(36) + \"_\" + this.turnNum;\n this.mapCtx = newMapCtx();\n this.running = true;\n this.q.push({\n type: \"turn_started\",\n turnId: this.turnId,\n model: this.o.model,\n mode: this.o.mode,\n effort: this.o.effort,\n });\n const text = input.text.trim();\n const attachments = input.images ?? [];\n if (!text && !attachments.length) {\n this.running = false;\n this.q.push({ type: \"turn_ended\", turnId: this.turnId, status: \"completed\" });\n return;\n }\n // An image-only message is still a prompt: images go as image blocks when the Agent takes them, else by file path\n const built = await buildAcpPrompt(text, attachments, this.promptCaps, input.mentions ?? []);\n const agent = this.o.providerName ?? this.o.binName;\n if (built.imagesByPath.length && !this.promptCaps.image) {\n const switched = this.o.imagesFollowStartModel && this.initCaps.image && this.o.model !== this.startModel;\n this.q.push({ type: \"notice\", level: \"warn\", message: tr(switched ? \"notice.acpImageByPathSwitched\" : \"notice.acpImageByPath\", { agent, paths: built.imagesByPath.join(\", \") }) });\n }\n for (const w of built.warnings) this.q.push({ type: \"notice\", level: \"warn\", message: tr(\"notice.attachmentIssue\", { detail: w }) });\n if (!built.blocks.length) {\n // Every attachment failed to resolve and there was no text: nothing to send\n this.running = false;\n this.q.push({ type: \"turn_ended\", turnId: this.turnId, status: \"completed\" });\n return;\n }\n void this.runTurn(built.blocks);\n }\n\n // Send this turn's prompt; reading updates is the job of the persistent pumpUpdates() (following Paseo: session/update is handled at session level)\n private async runTurn(prompt: Parameters<ActiveSession[\"prompt\"]>[0]): Promise<void> {\n this.activeTurnId = this.turnId;\n this.wakePump?.();\n this.wakePump = null;\n this.active!.prompt(prompt).catch(() => {\n /* failures surface through nextUpdate() and pumpUpdates ends the turn */\n });\n }\n\n private endTurn(ev: ProviderEvent): void {\n this.q.push(ev);\n this.activeTurnId = null;\n this.running = false;\n }\n\n /**\n * Read session/update for the whole lifetime of the session.\n * It used to read only during a turn: the available_commands_update an Agent pushes after session/new and before the first message went unread,\n * so the slash menu stayed empty. Now command updates are cached at any time; conversation content becomes timeline events only while a turn is in progress.\n */\n private async pumpUpdates(): Promise<void> {\n const session = this.active;\n if (!session) return;\n while (!this.closed) {\n let msg: Awaited<ReturnType<typeof session.nextUpdate>>;\n try {\n msg = await session.nextUpdate();\n } catch (e) {\n if (this.closed) return;\n const turnId = this.activeTurnId;\n if (turnId) {\n this.endTurn({ type: \"turn_ended\", turnId, status: \"failed\", error: String((e as Error)?.message ?? e) });\n }\n // After an error the queue keeps throwing the same error until the next prompt clears it: wait for the next turn before reading again\n await new Promise<void>((r) => (this.wakePump = r));\n continue;\n }\n if (msg.kind === \"session_update\") {\n const u = msg.update;\n if (u.sessionUpdate === \"available_commands_update\") {\n this.applyAvailableCommands(u.availableCommands ?? []);\n continue;\n }\n if (!this.activeTurnId) continue; // Other updates outside a turn (e.g. mode change echoes) don't go to the timeline\n for (const ev of mapSessionUpdate(u, this.mapCtx)) this.q.push(ev);\n } else if (this.activeTurnId) {\n this.endTurn(stopToTurnEnd(msg.stopReason, this.activeTurnId));\n }\n }\n }\n\n async interrupt(): Promise<void> {\n await this.ready();\n if (!this.ctx || !this.active) return;\n try {\n await this.ctx.request(methods.agent.session.cancel, { sessionId: this.active.sessionId });\n } catch (e) {\n log(\"info\", `ACP cancel: ${String(e)}`);\n }\n }\n\n async setModel(model: string | null): Promise<void> {\n this.o.model = model;\n await this.ready();\n if (this.o.imagesFollowStartModel) {\n // dsh answered initialize for the model it started on; another model may not take image blocks (it refuses the prompt)\n this.promptCaps = model === this.startModel ? this.initCaps : { ...this.initCaps, image: false };\n }\n await this.applySessionModel(model);\n }\n\n async setMode(mode: Mode): Promise<void> {\n this.o.mode = mode;\n await this.ready();\n await this.applySessionMode(mode);\n }\n\n async setEffort(effort: string | null): Promise<void> {\n this.o.effort = effort;\n await this.ready();\n await this.applySessionThought(effort);\n }\n\n async listCommands(): Promise<SlashCommand[]> {\n try {\n await this.ready();\n } catch {\n return [];\n }\n // Commands are pushed asynchronously after session/new: wait at most 10 s for the first batch (Agents that report none return empty after the timeout)\n if (!this.slashCommands.length) {\n await Promise.race([this.commandsReady, new Promise((r) => setTimeout(r, 10000))]);\n }\n return this.slashCommands;\n }\n\n async close(): Promise<void> {\n this.closed = true;\n this.wakePump?.();\n this.settleCommands();\n for (const r of this.permPending.values()) r({ cancelled: true });\n this.permPending.clear();\n try {\n this.active?.dispose();\n } catch {}\n try {\n this.conn?.close();\n } catch {}\n await killAcpChild(this.child);\n this.child = null;\n this.q.close();\n }\n}\n","import type { Provider, DetectResult, ModelInfo, Capabilities, Mode, LaunchCommand } from \"../types.js\";\nimport { killTree, spawnBin, type ResolveResult } from \"../../util/bin.js\";\nimport { resolveFirstBin } from \"../../util/bin.js\";\nimport { resolveLaunch } from \"../launch.js\";\nimport { PLACEHOLDER_MODEL_NAME } from \"../types.js\";\nimport { AcpSession } from \"./session.js\";\nimport { knownPromptCaps } from \"./promptCaps.js\";\n\nexport type AcpProviderConfig = {\n id: string;\n name: string;\n binName: string;\n /** Takes precedence over binName: detect / listModels / session resolve these in order */\n binCandidates?: string[];\n acpArgs: string[];\n /** Arguments for one session's ACP process from its model (dsh starts on the conversation's route); default acpArgs */\n argsFor?: (model: string | null) => Promise<string[]>;\n /** The Agent decides at initialize whether it takes images, for the model it started on (dsh): a model picked later sends images by path */\n imagesFollowStartModel?: boolean;\n installHint: string;\n appVersion?: string;\n flavor?: \"cursor\" | \"generic\";\n capabilities?: Capabilities;\n fetchModels?: (r: ResolveResult & { ok: true }, launchArgs?: string[]) => Promise<ModelInfo[]>;\n /** Our permission modes → this Agent's mode names over ACP; when given, only modes in the table are shown */\n modeMap?: Partial<Record<Mode, string>>;\n /** Mode names shown in the UI (the Agent's own naming) */\n modeLabels?: Partial<Record<Mode, string>>;\n};\n\nexport const acpCapabilities: Capabilities = {\n resume: true,\n interrupt: true,\n steer: false,\n images: false,\n plan: true,\n questions: false,\n cost: false,\n effort: [],\n modes: [\"plan\", \"default\", \"acceptEdits\", \"bypassPermissions\"],\n deltasOnly: true,\n};\n\nexport const cursorAcpCapabilities: Capabilities = {\n ...acpCapabilities,\n questions: true,\n modes: [\"default\", \"plan\", \"ask\"],\n};\n\nfunction runVersion(r: ResolveResult & { ok: true }, args: string[], timeoutMs = 8000): Promise<string> {\n return new Promise((resolvePromise, reject) => {\n let out = \"\";\n const p = spawnBin(r, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"], env: { ...process.env, NO_COLOR: \"1\" } });\n const t = setTimeout(() => {\n try {\n void killTree(p, { graceMs: 500 }); // On Windows a .cmd wrapper must be killed together with its child processes\n } catch {}\n reject(new Error(\"timeout\"));\n }, timeoutMs);\n p.stdout?.on(\"data\", (c: Buffer) => (out += c.toString()));\n p.stderr?.on(\"data\", (c: Buffer) => (out += c.toString()));\n p.on(\"error\", reject);\n p.on(\"close\", (code) => {\n clearTimeout(t);\n if (code === 0 || out.trim()) resolvePromise(out.trim());\n else reject(new Error(\"exit \" + code));\n });\n });\n}\n\nasync function resolveProviderBin(cfg: AcpProviderConfig) {\n const names = cfg.binCandidates?.length ? cfg.binCandidates : [cfg.binName];\n return resolveFirstBin(names);\n}\n\nexport function createAcpProvider(cfg: AcpProviderConfig): Provider {\n const base = cfg.capabilities ?? acpCapabilities;\n // With a mode table, expose only the modes the Agent really has (in our fixed order)\n const ORDER: Mode[] = [\"plan\", \"default\", \"acceptEdits\", \"bypassPermissions\"];\n const caps: Capabilities = cfg.modeMap\n ? { ...base, modes: ORDER.filter((m) => cfg.modeMap![m] !== undefined), modeLabels: cfg.modeLabels }\n : base;\n return {\n id: cfg.id,\n name: cfg.name,\n // images is what the Agent's own initialize says (probe at warm-up / providers.list, or any session); until then unknown\n get capabilities(): Capabilities {\n const learned = knownPromptCaps(cfg.id);\n return learned ? { ...caps, images: learned.image, imagesKnown: true } : { ...caps, images: false, imagesKnown: false };\n },\n async detect(launch?: LaunchCommand): Promise<DetectResult> {\n const r = launch ? await resolveLaunch(launch) : await resolveProviderBin(cfg);\n if (!r.ok) {\n return { available: false, reason: r.reason, installHint: cfg.installHint };\n }\n let version: string | undefined;\n const versionArgs = cfg.id === \"devin\" ? [\"version\"] : [\"cursor\", \"opencode\"].includes(cfg.id) ? [\"--version\"] : null;\n try {\n if (versionArgs) {\n // Only the internal prefix: the user's extra args are meant for the ACP command, not for --version\n version = (await runVersion(r, [...(launch?.prefixArgs ?? []), ...versionArgs])).split(/\\r?\\n/)[0]?.trim();\n }\n } catch {\n /* Having the binary is enough */\n }\n return { available: true, bin: r.display, version };\n },\n async listModels(launch?: LaunchCommand): Promise<ModelInfo[]> {\n const resolved = launch ? await resolveLaunch(launch) : await resolveProviderBin(cfg);\n if (!resolved.ok) return [{ id: \"default\", name: PLACEHOLDER_MODEL_NAME, isDefault: true }];\n // The internal prefix rides on the resolution (fetchModels puts its own ACP args after it), the user's args go last\n const r = launch?.prefixArgs?.length && resolved.via !== \"cmd-shim\"\n ? { ...resolved, prefixArgs: [...resolved.prefixArgs, ...launch.prefixArgs] }\n : resolved;\n if (cfg.fetchModels) return cfg.fetchModels(r, launch?.args ?? []);\n return [{ id: \"default\", name: PLACEHOLDER_MODEL_NAME, isDefault: true }];\n },\n async createSession(o) {\n return new AcpSession({\n threadId: o.threadId,\n providerId: cfg.id,\n providerName: cfg.name,\n cwd: o.cwd,\n model: o.model,\n mode: o.mode,\n effort: o.effort,\n resumeId: o.resumeId,\n binName: cfg.binName,\n binCandidates: cfg.binCandidates ?? [cfg.binName],\n acpArgs: cfg.argsFor ? await cfg.argsFor(o.model) : cfg.acpArgs,\n imagesFollowStartModel: cfg.imagesFollowStartModel,\n appVersion: cfg.appVersion ?? \"0.0.1\",\n flavor: cfg.flavor ?? \"generic\",\n modeMap: cfg.modeMap,\n cursorFast: o.cursorFast,\n cursorAutoReview: o.cursorAutoReview,\n launch: o.launch,\n });\n },\n };\n}\n","// dsh (DeepSeek Harness) over ACP: start it on the model the conversation uses, so it can take images.\n//\n// dsh decides at ACP initialize whether it accepts image blocks, from the route in its `acp` config row\n// (`dsh-acp`'s supportsAcpImagePrompts), not from the session's model. That row ships as\n// deepseek-official / deepseek-v4-flash, which isn't in dsh's own catalog (deepseek-flash is) and isn't a\n// route Magpie writes (Magpie writes `agent-default-model` and its `magpie*` routes, not the `acp` row).\n// So dsh 0.2.1-rc.5 / 0.2.2-alpha.2 answer promptCapabilities.image: false and then refuse every image\n// block (\"inline image prompts were not advertised by this connection\"), even on a model that sees images.\n//\n// The launcher takes `--patch <file>` overlays, applied after the profile and home patches. We start dsh\n// with one that sets the `acp` row to the conversation's route ([provider, model], the value dsh's ACP model\n// option uses). dsh then advertises image input exactly when that route declares it (a Magpie model it can\n// see images with is written as `input: [text, image]`) and passes the image to the model.\n// A model picked later in the same session goes by path: dsh's read_image tool opens it on a model that sees images.\nimport { createHash } from \"node:crypto\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const DSH_ACP_ARGS = [\"--profile\", \"acp\"];\n\nexport type DshRoute = { provider: string; model: string };\n\n/** dsh's ACP model value is JSON [provider, model]; anything else isn't a route */\nexport function dshRoute(model: string | null | undefined): DshRoute | null {\n if (!model) return null;\n try {\n const v = JSON.parse(model) as unknown;\n if (Array.isArray(v) && v.length === 2 && typeof v[0] === \"string\" && typeof v[1] === \"string\" && v[0] && v[1]) {\n return { provider: v[0], model: v[1] };\n }\n } catch {\n /* not a dsh route */\n }\n return null;\n}\n\n/** The patch list that starts dsh's ACP on this route (JSON strings are valid YAML double-quoted scalars) */\nexport function dshRoutePatch(route: DshRoute): string {\n return [\n \"# Agent Console: the route dsh's ACP starts on, so initialize advertises image input for it\",\n \"- id: acp\",\n \" config:\",\n ` provider: ${JSON.stringify(route.provider)}`,\n ` model: ${JSON.stringify(route.model)}`,\n \"\",\n ].join(\"\\n\");\n}\n\n/** Arguments for `dsh`: the ACP profile, plus a --patch overlay naming the route when the model is one */\nexport async function dshAcpArgs(model: string | null | undefined, dir = join(tmpdir(), \"agent-console-dsh\")): Promise<string[]> {\n const route = dshRoute(model);\n if (!route) return [...DSH_ACP_ARGS];\n const body = dshRoutePatch(route);\n const file = join(dir, `acp-route-${createHash(\"sha256\").update(body).digest(\"hex\").slice(0, 16)}.yml`);\n await mkdir(dir, { recursive: true });\n await writeFile(file, body, { mode: 0o600 });\n return [...DSH_ACP_ARGS, \"--patch\", file];\n}\n\n/** The route a new dsh conversation starts on, as the manager picks it: a Magpie route first, else dsh's current one */\nexport function dshDefaultModel(models: { id: string }[], current: string | null): string | null {\n return models.find((m) => /magpie/i.test(m.id))?.id ?? current ?? models[0]?.id ?? null;\n}\n","// ACP probe: start the Agent's ACP process once → initialize → session/new, read the models and thinking levels it reports, then close it.\n// Sends no prompt and costs nothing. This is the Agent's own model list (as Paseo does), more reliable than parsing CLI text.\nimport { tmpdir } from \"node:os\";\nimport type { ModelInfo } from \"../types.js\";\nimport type { ResolveResult } from \"../../util/bin.js\";\nimport { spawnResolved, killAcpChild } from \"./spawn.js\";\nimport { log } from \"../../log.js\";\nimport { promptCapsFromInitialize, rememberPromptCaps, type AcpPromptCaps } from \"./promptCaps.js\";\nimport { DSH_ACP_ARGS, dshAcpArgs, dshDefaultModel, dshRoute } from \"./dsh.js\";\n\ntype SelectOption = { value?: unknown; name?: unknown; options?: SelectOption[] };\ntype ConfigOption = { id?: string; category?: string; type?: string; currentValue?: unknown; options?: SelectOption[] };\n\nexport type AcpProbeResult = {\n models: { id: string; name: string }[];\n currentModel: string | null;\n thinking: { id: string; label: string }[];\n currentThinking: string | null;\n};\n\nfunction flatten(opts: SelectOption[] | undefined): { id: string; name: string }[] {\n const out: { id: string; name: string }[] = [];\n for (const o of opts ?? []) {\n if (o.options) out.push(...flatten(o.options));\n else if (typeof o.value === \"string\" && o.value) {\n out.push({ id: o.value, name: typeof o.name === \"string\" && o.name ? o.name : o.value });\n }\n }\n // Dedupe (Copilot reports auto twice)\n return out.filter((m, i) => out.findIndex((x) => x.id === m.id) === i);\n}\n\n/** Extract models and thinking levels from a session/new response (pure function, easy to test) */\nexport function parseAcpSession(res: { configOptions?: ConfigOption[]; models?: { currentModelId?: string; availableModels?: { modelId?: string; name?: string }[] } }): AcpProbeResult {\n const opts = res.configOptions ?? [];\n const modelOpt = opts.find((o) => o.type === \"select\" && (o.category === \"model\" || o.id === \"model\"));\n const thoughtOpt = opts.find((o) => o.type === \"select\" && (o.category === \"thought_level\" || o.id === \"thought_level\"));\n let models = flatten(modelOpt?.options);\n let currentModel = typeof modelOpt?.currentValue === \"string\" ? modelOpt.currentValue : null;\n if (!models.length && res.models?.availableModels?.length) {\n models = res.models.availableModels\n .filter((m) => typeof m.modelId === \"string\" && m.modelId)\n .map((m) => ({ id: m.modelId!, name: m.name || m.modelId! }));\n models = models.filter((m, i) => models.findIndex((x) => x.id === m.id) === i);\n currentModel = res.models.currentModelId ?? currentModel;\n }\n const thinking = flatten(thoughtOpt?.options).map((t) => ({ id: t.id, label: t.name }));\n const currentThinking = typeof thoughtOpt?.currentValue === \"string\" ? thoughtOpt.currentValue : null;\n return { models, currentModel, thinking, currentThinking };\n}\n\n/** providerId: remember what the Agent's initialize advertised for prompts (images) under this id */\nexport function probeAcp(r: ResolveResult & { ok: true }, acpArgs: string[], timeoutMs = 30000, providerId?: string): Promise<AcpProbeResult> {\n return probeAcpRaw(r, acpArgs, timeoutMs).then((x) => {\n rememberPromptCaps(providerId, x.promptCaps);\n return x.parsed;\n });\n}\n\n/** Like probeAcp, but also calls an Agent-specific method after session/new (e.g. Cursor's cursor/list_available_models) */\nexport function probeAcpRaw(\n r: ResolveResult & { ok: true },\n acpArgs: string[],\n timeoutMs = 30000,\n extMethod?: string,\n): Promise<{ parsed: AcpProbeResult; ext: unknown; promptCaps: AcpPromptCaps }> {\n return new Promise((resolvePromise, reject) => {\n const child = spawnResolved(r, acpArgs, { cwd: tmpdir() });\n let buf = \"\";\n let nextId = 0;\n const pending = new Map<number, { res: (v: unknown) => void; rej: (e: Error) => void }>();\n let done = false;\n const finish = (err: Error | null, v?: { parsed: AcpProbeResult; ext: unknown; promptCaps: AcpPromptCaps }) => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n void killAcpChild(child).catch(() => {});\n if (err) reject(err);\n else resolvePromise(v!);\n };\n const timer = setTimeout(() => finish(new Error(\"ACP 探测超时\")), timeoutMs);\n const send = (method: string, params: unknown) =>\n new Promise<unknown>((res, rej) => {\n const id = ++nextId;\n pending.set(id, { res, rej });\n child.stdin?.write(JSON.stringify({ jsonrpc: \"2.0\", id, method, params }) + \"\\n\");\n });\n child.on(\"error\", (e) => finish(e));\n child.on(\"close\", () => finish(new Error(\"ACP 进程提前退出\")));\n child.stderr?.on(\"data\", () => {});\n child.stdout?.on(\"data\", (d: Buffer) => {\n buf += d.toString();\n let n: number;\n while ((n = buf.indexOf(\"\\n\")) >= 0) {\n const line = buf.slice(0, n).trim();\n buf = buf.slice(n + 1);\n if (!line) continue;\n let m: { id?: number; method?: string; result?: unknown; error?: unknown };\n try {\n m = JSON.parse(line);\n } catch {\n continue;\n }\n if (m.id !== undefined && !m.method && pending.has(m.id)) {\n const p = pending.get(m.id)!;\n pending.delete(m.id);\n if (m.error) p.rej(new Error(JSON.stringify(m.error)));\n else p.res(m.result);\n } else if (m.id !== undefined && m.method) {\n // Requests from the Agent (shouldn't happen during a probe): always answer empty so it doesn't hang\n child.stdin?.write(JSON.stringify({ jsonrpc: \"2.0\", id: m.id, result: null }) + \"\\n\");\n }\n }\n });\n void (async () => {\n try {\n const init = await send(\"initialize\", { protocolVersion: 1, clientCapabilities: {}, clientInfo: { name: \"Agent Console\", version: \"probe\" } });\n const res = (await send(\"session/new\", { cwd: tmpdir(), mcpServers: [] })) as Parameters<typeof parseAcpSession>[0];\n let ext: unknown = null;\n if (extMethod) ext = await send(extMethod, {}).catch(() => null);\n finish(null, { parsed: parseAcpSession(res ?? {}), ext, promptCaps: promptCapsFromInitialize(init) });\n } catch (e) {\n finish(e instanceof Error ? e : new Error(String(e)));\n }\n })();\n });\n}\n\n/** Probe result → model list: the current model is the default; thinking levels hang on the current model (other models' levels are only known after switching, so reuse the same set for now) */\nexport function probeToModels(p: AcpProbeResult): ModelInfo[] {\n return p.models.map((m) => ({\n id: m.id,\n name: m.name,\n isDefault: m.id === p.currentModel,\n ...(p.thinking.length\n ? { thinkingOptions: p.thinking, defaultThinking: p.currentThinking ?? undefined }\n : {}),\n }));\n}\n\nconst EFFORT_LABEL: Record<string, string> = {\n none: \"None\", minimal: \"Minimal\", low: \"Low\", medium: \"Medium\", high: \"High\", xhigh: \"Extra High\", max: \"Max\",\n};\n\ntype CursorCatalog = {\n models?: { value?: string; name?: string; configOptions?: ConfigOption[] }[];\n};\n\n/**\n * Cursor: a model's thinking levels are not in the session-level thought_level but in each model's own parameter (effort / reasoning_effort / reasoning).\n * Following Paseo's resolveCursorCatalogModels: call Cursor's extension method cursor/list_available_models to get each model's parameter definitions.\n * The model id is the base name without parameters (grok-4.6); thinkingParam records the level parameter name, sent as grok-4.6[effort=high].\n */\nexport function cursorCatalogToModels(catalog: CursorCatalog, currentModel: string | null): ModelInfo[] {\n const currentBase = currentModel?.replace(/\\[.*\\]$/u, \"\") ?? null;\n const out: ModelInfo[] = [];\n for (const m of catalog.models ?? []) {\n if (typeof m.value !== \"string\" || !m.value) continue;\n const id = m.value.replace(/\\[.*\\]$/u, \"\");\n const thought = (m.configOptions ?? []).find((o) => o.category === \"thought_level\");\n const levels = flatten(thought?.options);\n out.push({\n id,\n name: typeof m.name === \"string\" && m.name ? m.name : id,\n isDefault: id === currentBase,\n ...(thought && levels.length\n ? {\n thinkingOptions: levels.map((l) => ({ id: l.id, label: EFFORT_LABEL[l.id] ?? l.name })),\n defaultThinking: typeof thought.currentValue === \"string\" ? thought.currentValue : undefined,\n thinkingParam: thought.id,\n }\n : {}),\n });\n }\n return out;\n}\n\nexport function cursorProbeModels(acpArgs: string[], providerId?: string) {\n return async (r: ResolveResult & { ok: true }, launchArgs: string[] = []): Promise<ModelInfo[]> => {\n try {\n const { parsed, ext, promptCaps } = await probeAcpRaw(r, [...acpArgs, ...launchArgs], 40000, \"cursor/list_available_models\");\n rememberPromptCaps(providerId, promptCaps);\n const fromCatalog = ext ? cursorCatalogToModels(ext as CursorCatalog, parsed.currentModel) : [];\n // If the extension method is unavailable (older Cursor CLI), fall back to the model list reported by the session (no levels)\n return fromCatalog.length ? fromCatalog : probeToModels(parsed);\n } catch (e) {\n log(\"warn\", \"Cursor 模型探测失败\", { err: String(e) });\n return [];\n }\n };\n}\n\n/**\n * dsh: the model list from a plain `dsh --profile acp`, then whether it takes images from an initialize started on the\n * route a new conversation uses (dsh answers for the route it starts on, see dsh.ts).\n */\nexport function dshProbeModels(providerId?: string) {\n return async (r: ResolveResult & { ok: true }, launchArgs: string[] = []): Promise<ModelInfo[]> => {\n try {\n const first = await probeAcpRaw(r, [...DSH_ACP_ARGS, ...launchArgs], 30000);\n let caps = first.promptCaps;\n const start = dshDefaultModel(first.parsed.models, first.parsed.currentModel);\n if (start && start !== first.parsed.currentModel && dshRoute(start)) {\n caps = await probeAcpRaw(r, [...await dshAcpArgs(start), ...launchArgs], 30000).then((x) => x.promptCaps, () => caps);\n }\n rememberPromptCaps(providerId, caps);\n return probeToModels(first.parsed);\n } catch (e) {\n log(\"warn\", \"ACP 探测模型失败\", { err: String(e) });\n return [];\n }\n };\n}\n\nexport function acpProbeModels(acpArgs: string[], providerId?: string) {\n return async (r: ResolveResult & { ok: true }, launchArgs: string[] = []): Promise<ModelInfo[]> => {\n try {\n return probeToModels(await probeAcp(r, [...acpArgs, ...launchArgs], 30000, providerId));\n } catch (e) {\n log(\"warn\", \"ACP 探测模型失败\", { err: String(e) });\n return [];\n }\n };\n}\n","import type { ProviderCatalogEntry } from \"../catalog.js\";\nimport type { AcpProviderConfig } from \"./provider.js\";\nimport { cursorAcpCapabilities } from \"./provider.js\";\nimport { acpProbeModels, cursorProbeModels, dshProbeModels } from \"./probe.js\";\nimport { DSH_ACP_ARGS, dshAcpArgs } from \"./dsh.js\";\n\nconst ACP_IDS = new Set([\"cursor\", \"devin\", \"opencode\", \"dsh\", \"pi\", \"copilot\"]);\n\nexport function isAcpCatalogId(id: string): boolean {\n return ACP_IDS.has(id);\n}\n\n// Model lists and thinking levels always come from what the Agent reports over ACP (acpProbeModels), no longer from parsing each CLI's text output.\n// modeMap: our permission modes → the Agent's real mode names (from what session/new actually reports); \"\" means keep the entry but send nothing.\nexport function acpConfigForEntry(entry: ProviderCatalogEntry, appVersion: string): AcpProviderConfig | null {\n if (!ACP_IDS.has(entry.id)) return null;\n const base: Omit<AcpProviderConfig, \"acpArgs\" | \"fetchModels\" | \"flavor\" | \"capabilities\"> = {\n id: entry.id,\n name: entry.name,\n binName: entry.bins[0] ?? entry.id,\n binCandidates: entry.bins,\n installHint: entry.installHint,\n appVersion,\n };\n\n switch (entry.id) {\n case \"cursor\":\n // Modes: agent / plan / ask (see cursorAcpCapabilities)\n return {\n ...base,\n acpArgs: [\"acp\"],\n flavor: \"cursor\",\n capabilities: cursorAcpCapabilities,\n // Each model's own thinking levels come from cursor/list_available_models (as Paseo does)\n fetchModels: cursorProbeModels([\"acp\"], entry.id),\n };\n case \"devin\":\n // Modes: Code(accept-edits) / Smart / Ask / Plan / Bypass Permissions\n return {\n ...base,\n acpArgs: [\"acp\"],\n fetchModels: acpProbeModels([\"acp\"], entry.id),\n modeMap: { plan: \"plan\", default: \"ask\", acceptEdits: \"accept-edits\", bypassPermissions: \"bypass\" },\n modeLabels: { plan: \"Plan\", default: \"Ask\", acceptEdits: \"Code\", bypassPermissions: \"Bypass Permissions\" },\n };\n case \"opencode\":\n // Modes: build / plan; thinking level effort (low…ultra, including fast variants)\n return {\n ...base,\n acpArgs: [\"acp\"],\n fetchModels: acpProbeModels([\"acp\"], entry.id),\n modeMap: { plan: \"plan\", default: \"build\" },\n modeLabels: { plan: \"Plan\", default: \"Build\" },\n };\n case \"copilot\":\n // As Paseo: Agent / Plan / Allow All. Allow All = agent mode + allow_all config on (autopilot is not used)\n return {\n ...base,\n acpArgs: [\"--acp\"],\n fetchModels: acpProbeModels([\"--acp\"], entry.id),\n modeMap: { plan: \"plan\", default: \"agent\", bypassPermissions: \"allow-all\" },\n modeLabels: { plan: \"Plan\", default: \"Agent\", bypassPermissions: \"Allow All\" },\n };\n case \"pi\":\n // pi-acp has no mode options; thinking level thought_level (low…max)\n return { ...base, acpArgs: [], fetchModels: acpProbeModels([], entry.id), modeMap: { default: \"\" } };\n case \"dsh\":\n // Started on the conversation's route (--patch), so its initialize advertises image input for that model (see dsh.ts)\n return {\n ...base,\n acpArgs: DSH_ACP_ARGS,\n argsFor: (model) => dshAcpArgs(model),\n imagesFollowStartModel: true,\n fetchModels: dshProbeModels(entry.id),\n };\n default:\n return null;\n }\n}\n","// Provider registry: 8 in the catalog; claude/codex native, the rest over ACP (including copilot --acp).\nimport type { Provider } from \"./types.js\";\nimport { createMockProvider } from \"./mock.js\";\nimport { createClaudeProvider } from \"./claude/provider.js\";\nimport { createCodexProvider } from \"./codex/provider.js\";\nimport { PROVIDER_CATALOG } from \"./catalog.js\";\nimport { createAcpProvider } from \"./acp/provider.js\";\nimport { acpConfigForEntry } from \"./acp/specs.js\";\n\nconst providers = new Map<string, Provider>();\n\nexport function registerProvider(p: Provider): void {\n providers.set(p.id, p);\n}\n\nexport function getProvider(id: string): Provider | undefined {\n return providers.get(id);\n}\n\nexport function listProviders(): Provider[] {\n return [...providers.values()];\n}\n\nexport function initProviders(version: string = \"\"): void {\n providers.clear();\n for (const entry of PROVIDER_CATALOG) {\n if (entry.id === \"claude\") registerProvider(createClaudeProvider());\n else if (entry.id === \"codex\") registerProvider(createCodexProvider(version));\n else {\n const acp = acpConfigForEntry(entry, version);\n if (acp) registerProvider(createAcpProvider(acp));\n }\n }\n if (process.env.AGENT_CONSOLE_MOCK === \"1\") {\n registerProvider(createMockProvider());\n }\n}\n","// Whether the user enabled this Provider in settings.\n// Never toggled by hand: catalog status=verified is on by default, others off; entries outside the catalog (mock etc.) are on.\nimport type { Settings } from \"../store/settings.js\";\nimport { catalogById } from \"./catalog.js\";\n\nexport function isProviderEnabled(settings: Settings, id: string): boolean {\n const m = settings.providerEnabled;\n if (m && typeof m === \"object\" && typeof m[id] === \"boolean\") return m[id];\n const entry = catalogById(id);\n if (!entry) return true;\n return entry.status === \"verified\";\n}\n","import { execFile } from \"node:child_process\";\n\n/** Parse PowerShell stdout into a folder path (handles Base64 and CP936 consoles) */\nexport function decodePickFolderStdout(stdout: string | Buffer): string | null {\n const buf = Buffer.isBuffer(stdout) ? stdout : Buffer.from(stdout, \"utf8\");\n const line = buf.toString(\"utf8\").trim().split(/\\r?\\n/).pop()?.trim() ?? \"\";\n if (!line) return null;\n\n // New format: Base64 of the UTF-8 path, so a GBK-encoded Chinese Windows console isn't garbled when Node decodes it as UTF-8\n if (/^[A-Za-z0-9+/]+=*$/.test(line)) {\n const decoded = Buffer.from(line, \"base64\").toString(\"utf8\");\n if (decoded && !decoded.includes(\"\\uFFFD\")) return decoded;\n }\n\n if (!line.includes(\"\\uFFFD\")) return line;\n\n const gbkLine = new TextDecoder(\"gbk\").decode(buf).trim().split(/\\r?\\n/).pop()?.trim() ?? \"\";\n return gbkLine || null;\n}\n\nexport function pickFolderWindows(initial?: string): Promise<{ available: boolean; path: string | null }> {\n return new Promise((resolvePromise) => {\n if (process.platform !== \"win32\") return resolvePromise({ available: false, path: null });\n const init = (initial ?? \"\").replace(/'/g, \"''\");\n const script =\n \"Add-Type -AssemblyName System.Windows.Forms;\" +\n \"$d = New-Object System.Windows.Forms.FolderBrowserDialog;\" +\n \"$d.Description = '选择项目文件夹';\" +\n \"$d.ShowNewFolderButton = $true;\" +\n (init ? `$d.SelectedPath = '${init}';` : \"\") +\n \"if ($d.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) { \" +\n \"[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($d.SelectedPath)) \" +\n \"}\";\n execFile(\n \"powershell.exe\",\n [\"-NoProfile\", \"-STA\", \"-NonInteractive\", \"-Command\", script],\n { timeout: 120000, windowsHide: false, encoding: \"buffer\" },\n (e, stdout) => {\n if (e) return resolvePromise({ available: true, path: null });\n resolvePromise({ available: true, path: decodePickFolderStdout(stdout ?? Buffer.alloc(0)) });\n },\n );\n });\n}\n","// Native folder picker: Windows uses PowerShell FolderBrowserDialog (pickFolderWin.ts),\n// macOS osascript's choose folder, Linux zenity / kdialog when present; with none, report unavailable and the frontend falls back to typing.\n// Everything starts processes directly via execFile, no shell; the initial directory is passed only as an argument or an escaped AppleScript string.\nimport { execFile } from \"node:child_process\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { findOnPath } from \"../../../lib/pathscan.mjs\";\nimport { pickFolderWindows } from \"./pickFolderWin.js\";\n\nexport type PickResult = { available: boolean; path: string | null };\nconst TIMEOUT = 10 * 60 * 1000; // The user may keep the dialog open for a while\n\n/** AppleScript string literal: only backslashes and double quotes need escaping. */\nexport function appleScriptString(s: string): string {\n return '\"' + s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"') + '\"';\n}\n\nfunction isDir(p: string | undefined): p is string {\n try {\n return !!p && existsSync(p) && statSync(p).isDirectory();\n } catch {\n return false;\n }\n}\n\n/** Command-line arguments (for testability). Returns null when the platform has no picker. */\nexport function pickFolderCommand(\n platform: NodeJS.Platform,\n initial: string | undefined,\n find: (name: string) => string | null = (n) => findOnPath(n)[0] ?? null,\n env: NodeJS.ProcessEnv = process.env,\n): { cmd: string; args: string[] } | null {\n const init = isDir(initial) ? initial : undefined;\n if (platform === \"darwin\") {\n const prompt = appleScriptString(\"选择项目文件夹 / Choose a project folder\");\n const loc = init ? ` default location (POSIX file ${appleScriptString(init)})` : \"\";\n return { cmd: \"/usr/bin/osascript\", args: [\"-e\", `POSIX path of (choose folder with prompt ${prompt}${loc})`] };\n }\n if (platform === \"linux\" || platform === \"freebsd\" || platform === \"openbsd\") {\n // No graphical session (magpie web on a server): no window can open, so the frontend asks for a typed path\n if (!env.DISPLAY && !env.WAYLAND_DISPLAY) return null;\n const zenity = find(\"zenity\");\n if (zenity) {\n const args = [\"--file-selection\", \"--directory\", \"--title=选择项目文件夹 / Choose a project folder\"];\n if (init) args.push(`--filename=${init.endsWith(\"/\") ? init : init + \"/\"}`);\n return { cmd: zenity, args };\n }\n const kdialog = find(\"kdialog\");\n if (kdialog) return { cmd: kdialog, args: [\"--getexistingdirectory\", init ?? env.HOME ?? \"/\"] };\n }\n return null;\n}\n\nexport function pickFolder(initial?: string): Promise<PickResult> {\n if (process.platform === \"win32\") return pickFolderWindows(initial);\n const c = pickFolderCommand(process.platform, initial);\n if (!c) return Promise.resolve({ available: false, path: null });\n return new Promise((resolvePromise) => {\n execFile(c.cmd, c.args, { timeout: TIMEOUT, encoding: \"utf8\" }, (e, stdout) => {\n // Cancel: osascript / zenity / kdialog all exit non-zero\n if (e) return resolvePromise({ available: true, path: null });\n let p = String(stdout ?? \"\").replace(/\\r?\\n$/, \"\").trim();\n // osascript's POSIX path ends with / (except for the root)\n if (p.length > 1) p = p.replace(/\\/+$/, \"\");\n resolvePromise({ available: true, path: p || null });\n }).on(\"error\", () => resolvePromise({ available: false, path: null }));\n });\n}\n","// magpie gateway: magpie points each Agent's models at the local gateway (applied.json records the model currently applied to each).\n// Here we fill in, for those Agents, the model list, the default model and each model's thinking levels. Read-only; no configuration is changed.\nimport { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ModelInfo } from \"./types.js\";\nimport { log } from \"../log.js\";\n\n/** Agent Console provider id → the key in magpie's applied.json + the model id prefix used inside that Agent */\nconst MAGPIE_TOOLS: Record<string, { key: string; prefix: string }> = {\n claude: { key: \"claude\", prefix: \"\" },\n codex: { key: \"codex\", prefix: \"\" },\n opencode: { key: \"opencode\", prefix: \"magpie/\" },\n pi: { key: \"pi\", prefix: \"magpie/\" },\n dsh: { key: \"dsh\", prefix: \"magpie/\" },\n};\n\nconst EFFORT_LABEL: Record<string, string> = {\n low: \"Low\", medium: \"Medium\", high: \"High\", xhigh: \"Extra High\", max: \"Max\",\n};\n\ntype Applied = Record<string, { fields?: { model?: string; effort?: string } }>;\n\nasync function readJson<T>(path: string): Promise<T | null> {\n try {\n return JSON.parse(await readFile(path, \"utf8\")) as T;\n } catch {\n return null;\n }\n}\n\nasync function readApplied(): Promise<Applied> {\n return (await readJson<Applied>(join(homedir(), \".config\", \"magpie\", \"applied.json\"))) ?? {};\n}\n\nasync function readClaudeEnv(): Promise<Record<string, string>> {\n const s = await readJson<{ env?: Record<string, string> }>(join(homedir(), \".claude\", \"settings.json\"));\n return s?.env ?? {};\n}\n\n/** Gateway address: ANTHROPIC_BASE_URL from the Claude config (written by magpie), otherwise the default 3425 */\nasync function gatewayBase(): Promise<string> {\n const env = await readClaudeEnv();\n const raw = env.ANTHROPIC_BASE_URL?.trim();\n return (raw && /^https?:\\/\\/(127\\.0\\.0\\.1|localhost)(:\\d+)?/i.test(raw) ? raw : \"http://127.0.0.1:3425\").replace(/\\/+$/, \"\");\n}\n\nasync function fetchGatewayModelIds(): Promise<string[]> {\n const base = await gatewayBase();\n try {\n const res = await fetch(`${base}/v1/models`, { signal: AbortSignal.timeout(5000) });\n if (!res.ok) return [];\n const j = (await res.json()) as { data?: { id?: unknown }[] };\n return (j.data ?? []).map((m) => m.id).filter((id): id is string => typeof id === \"string\" && !!id);\n } catch (e) {\n log(\"warn\", \"读取 magpie 网关模型列表失败\", { err: String(e) });\n return [];\n }\n}\n\n/** CLAUDE_CODE_MODEL_CAPABILITIES: `id=effort,xhigh_effort,max_effort;id2=effort` → each model's levels */\nexport function parseCapabilities(raw: string | undefined): Map<string, string[]> {\n const out = new Map<string, string[]>();\n for (const part of (raw ?? \"\").split(\";\")) {\n const i = part.indexOf(\"=\");\n if (i <= 0) continue;\n const flags = new Set(part.slice(i + 1).split(\",\").map((s) => s.trim()));\n if (!flags.has(\"effort\")) continue;\n const levels = [\"low\", \"medium\", \"high\"];\n if (flags.has(\"xhigh_effort\")) levels.push(\"xhigh\");\n if (flags.has(\"max_effort\")) levels.push(\"max\");\n out.set(part.slice(0, i).trim(), levels);\n }\n return out;\n}\n\nfunction isPlaceholder(m: ModelInfo): boolean {\n return !m.id || /^(default|auto)$/i.test(m.id);\n}\n\n/**\n * Fill in model info for Agents managed by magpie; if magpie doesn't manage this Agent (not in applied.json) return it unchanged.\n * - The Agent's own list knows magpie models (e.g. OpenCode, Codex): keep its list with magpie's first (only what it knows, so picks never fail)\n * - The Agent can't report models (Claude, Pi, dsh): use the gateway's /v1/models with the prefix that Agent uses\n * - Default model = the model magpie currently applies to it; thinking levels from magpie's capability table\n */\nexport async function withMagpie(providerId: string, own: ModelInfo[]): Promise<ModelInfo[]> {\n const tool = MAGPIE_TOOLS[providerId];\n if (!tool) return own;\n const applied = (await readApplied())[tool.key]?.fields;\n if (!applied?.model) return own;\n\n const caps = parseCapabilities((await readClaudeEnv()).CLAUDE_CODE_MODEL_CAPABILITIES);\n const real = own.filter((m) => !isPlaceholder(m));\n\n // Over ACP, DSH returns its own real model IDs (JSON-array strings).\n // We must not push an old / another Agent's model ID from applied.json into DSH,\n // otherwise DSH treats it as a routed model and sends it to the wrong provider.\n if (providerId === \"dsh\") {\n const appliedId = applied.model.replace(/^magpie\\//, \"\");\n const selected = real.find((m) =>\n m.id === applied.model ||\n m.id === appliedId ||\n (appliedId.includes(\"/\") && m.id.includes(appliedId)),\n );\n const fallback = selected ?? real.find((m) => m.isDefault) ?? real[0];\n return real.map((m) => ({ ...m, isDefault: m.id === fallback?.id }));\n }\n\n const knowsMagpie = tool.prefix ? real.some((m) => m.id.startsWith(tool.prefix)) : real.length > 0;\n\n let list: ModelInfo[];\n if (knowsMagpie) {\n const mine = real.filter((m) => !tool.prefix || m.id.startsWith(tool.prefix));\n const others = tool.prefix ? real.filter((m) => !m.id.startsWith(tool.prefix)) : [];\n list = [...mine, ...others];\n } else {\n list = (await fetchGatewayModelIds()).map((gid) => ({ id: tool.prefix + gid, name: gid }));\n }\n\n // Default model = the one magpie currently applies; if it's not in the list, add it at the top\n const defId = applied.model;\n if (!list.some((m) => m.id === defId)) list.unshift({ id: defId, name: defId.slice(tool.prefix.length) || defId });\n list = list.map((m) => ({ ...m, isDefault: m.id === defId }));\n list.sort((a, b) => Number(!!b.isDefault) - Number(!!a.isDefault));\n\n // Thinking levels: use the Agent's own if it reports them, otherwise magpie's capability table\n return list.map((m) => {\n const name = tool.prefix && m.name.startsWith(tool.prefix) ? m.name.slice(tool.prefix.length) : m.name;\n if (m.thinkingOptions?.length && providerId !== \"claude\") return { ...m, name };\n const levels = caps.get(m.id.slice(tool.prefix.length) || m.id);\n if (!levels) return { ...m, name, thinkingOptions: providerId === \"claude\" ? [] : m.thinkingOptions };\n const def = applied.effort && levels.includes(applied.effort) ? applied.effort : levels.includes(\"high\") ? \"high\" : levels[0];\n return {\n ...m,\n name,\n thinkingOptions: levels.map((id) => ({ id, label: EFFORT_LABEL[id] ?? id })),\n defaultThinking: m.isDefault ? def : m.defaultThinking ?? def,\n };\n });\n}\n","// In-memory cache of Provider detection results and model lists.\n// detect / listModels often have to start a CLI (seconds); without a cache every page open and model pick would wait.\nimport type { Provider, DetectResult, ModelInfo, LaunchCommand } from \"./types.js\";\nimport { PLACEHOLDER_MODEL_NAME } from \"./types.js\";\nimport { withMagpie } from \"./magpieGateway.js\";\nimport { launchKey } from \"./launch.js\";\nimport { tr } from \"../util/i18n.js\";\n\n\nconst DETECT_MS = 60 * 1000;\nconst MODELS_MS = 10 * 60 * 1000;\nconst STEP_TIMEOUT_MS = 15000;\n// Fetching models may start an ACP session (Cursor launches slowly through PowerShell), so it gets a longer timeout\nconst MODELS_TIMEOUT_MS = 35000;\n\ntype Entry<T> = { at: number; value: T } | undefined;\nconst detects = new Map<string, Entry<DetectResult>>();\nconst models = new Map<string, Entry<ModelInfo[]>>();\n// Concurrent requests for the same Provider share one in-flight detection\nconst inflightDetect = new Map<string, Promise<DetectResult>>();\nconst inflightModels = new Map<string, Promise<ModelInfo[]>>();\n\nfunction withTimeout<T>(p: Promise<T>, ms: number, fb: T): Promise<T> {\n return Promise.race([p, new Promise<T>((r) => setTimeout(() => r(fb), ms))]);\n}\n\nfunction fresh<T>(e: Entry<T>, ttl: number): e is { at: number; value: T } {\n return !!e && Date.now() - e.at < ttl;\n}\n\nfunction cacheKey(p: Provider, launch?: LaunchCommand): string {\n return launch ? `${p.id}\\0${launchKey(launch)}` : p.id;\n}\n\nexport async function cachedDetect(p: Provider, launch?: LaunchCommand): Promise<DetectResult> {\n const key = cacheKey(p, launch);\n const hit = detects.get(key);\n if (fresh(hit, DETECT_MS)) return hit.value;\n let job = inflightDetect.get(key);\n if (!job) {\n const timedOut: DetectResult = { available: false, reason: tr(\"provider.timeout\") };\n job = withTimeout(\n p.detect(launch).catch((e): DetectResult => ({ available: false, reason: String((e as Error)?.message ?? e) })),\n STEP_TIMEOUT_MS,\n timedOut,\n ).then((v) => {\n // Don't cache a timeout; try again next time\n if (v !== timedOut) detects.set(key, { at: Date.now(), value: v });\n return v;\n }).finally(() => inflightDetect.delete(key));\n inflightDetect.set(key, job);\n }\n return job;\n}\n\nexport async function cachedModels(p: Provider, launch?: LaunchCommand): Promise<ModelInfo[]> {\n const key = cacheKey(p, launch);\n const hit = models.get(key);\n if (fresh(hit, MODELS_MS)) return hit.value;\n let job = inflightModels.get(key);\n if (!job) {\n job = withTimeout<ModelInfo[] | null>(p.listModels(launch).catch(() => []), MODELS_TIMEOUT_MS, null)\n .then(async (v) => {\n // Timeout: don't cache, fall back to the old value for now\n if (v === null) return models.get(key)?.value ?? [];\n // Agents behind the magpie gateway: fill in gateway models, the default model and thinking levels\n const list = await withMagpie(p.id, dropPlaceholder(v)).catch(() => dropPlaceholder(v));\n models.set(key, { at: Date.now(), value: list });\n return list;\n })\n .finally(() => inflightModels.delete(key));\n inflightModels.set(key, job);\n }\n return job;\n}\n\n/** A list holding only our own \"Default\" placeholder (id=default, name \"默认\") counts as having no real models.\n * An auto / Auto the Agent itself reports (e.g. Copilot) is a real option and is kept. */\nexport function dropPlaceholder(list: ModelInfo[]): ModelInfo[] {\n if (list.length === 1 && list[0].id === \"default\" && (list[0].name === \"默认\" || list[0].name === PLACEHOLDER_MODEL_NAME)) return [];\n return list;\n}\n\n/** Return the cached value immediately if there is one (may be stale), else undefined */\nexport function peekModels(id: string): ModelInfo[] | undefined {\n return models.get(id)?.value;\n}\n\nexport function clearProviderCache(id?: string): void {\n if (id) {\n for (const m of [detects, models] as Map<string, unknown>[]) {\n for (const k of [...m.keys()]) if (k === id || k.startsWith(id + \"\\0\")) m.delete(k);\n }\n } else {\n detects.clear();\n models.clear();\n }\n}\n","import type { Mode } from \"./types.js\";\n\n/** Map a permission mode onto an Agent's modes: kept when it has it, else that Agent's \"default\", else its first mode. */\nexport function clampMode(modes: Mode[], mode: Mode | null | undefined): Mode {\n if (mode && modes.includes(mode)) return mode;\n if (modes.includes(\"default\")) return \"default\";\n return modes[0] ?? \"default\";\n}\n","// File / folder references dragged from the Files panel into the composer (1.2).\n// The page sends {rel, isDir} relative to the conversation's project; the daemon resolves the absolute path itself and\n// checks (with realpath, so a symlink can't escape) that it is still inside the project. A mention only names a path:\n// no file content is read, so it never widens what the Agent may read.\n// The path handed to the Agent is built on the project path as it was opened (macOS /var/… stays /var/…, a symlinked\n// workspace keeps its own name); realpath is only used for the containment check (#582).\nimport { realpath, stat } from \"node:fs/promises\";\nimport { isAbsolute, resolve, sep, win32, posix } from \"node:path\";\n\nexport type MentionRef = { rel: string; isDir?: boolean };\nexport type Mention = { path: string; isDir: boolean };\n\nexport const MAX_MENTIONS = 50;\n\n/** Is child inside (or equal to) root? Case-insensitive on Windows. */\nexport function insideRoot(root: string, child: string, platform: NodeJS.Platform = process.platform): boolean {\n const p = platform === \"win32\" ? win32 : posix;\n const norm = (s: string) => (platform === \"win32\" ? p.resolve(s).toLowerCase() : p.resolve(s));\n const r = p.relative(norm(root), norm(child));\n return r === \"\" || (!r.startsWith(\"..\") && !p.isAbsolute(r));\n}\n\nexport async function resolveMentions(projectPath: string, refs: MentionRef[]): Promise<{ mentions: Mention[]; warnings: string[] }> {\n const mentions: Mention[] = [];\n const warnings: string[] = [];\n const seen = new Set<string>();\n // shown: the project path as opened (what the user and the Agent know); realRoot: where it really is (containment only)\n const shown = resolve(projectPath);\n let realRoot: string;\n try {\n realRoot = await realpath(shown);\n } catch {\n return { mentions, warnings: refs.map((r) => r.rel) };\n }\n for (const ref of refs.slice(0, MAX_MENTIONS)) {\n const rel = String(ref.rel ?? \"\").replace(/\\\\/g, \"/\");\n if (!rel || rel.includes(\"\\0\") || isAbsolute(rel) || /^[a-zA-Z]:/.test(rel)) {\n warnings.push(rel || \"(empty)\");\n continue;\n }\n const abs = resolve(shown, rel === \".\" ? \"\" : rel);\n if (!insideRoot(shown, abs)) {\n warnings.push(rel);\n continue;\n }\n let real: string;\n let isDir: boolean;\n try {\n real = await realpath(abs);\n isDir = (await stat(real)).isDirectory();\n } catch {\n warnings.push(rel);\n continue;\n }\n if (!insideRoot(realRoot, real)) {\n warnings.push(rel);\n continue;\n }\n // Keep the path the user saw (inside the project), not the symlink's target\n if (seen.has(abs)) continue;\n seen.add(abs);\n mentions.push({ path: abs, isDir });\n }\n return { mentions, warnings };\n}\n\n/** Text appended to the prompt; the same for every Agent (ACP Agents also get resource_link blocks). */\nexport function mentionSection(mentions: Mention[]): string {\n if (!mentions.length) return \"\";\n const lines = mentions.map((m) => {\n const shown = m.isDir && !m.path.endsWith(sep) && !m.path.endsWith(\"/\") ? m.path + (m.path.includes(\"\\\\\") && !m.path.includes(\"/\") ? \"\\\\\" : \"/\") : m.path;\n const quoted = /\\s|`/.test(shown) ? \"`\" + shown.replace(/`/g, \"'\") + \"`\" : shown;\n return `- ${quoted}${m.isDir ? \" (folder)\" : \"\"}`;\n });\n return `Referenced files (read them as needed):\\n${lines.join(\"\\n\")}`;\n}\n\n/** The prompt text an Agent receives: the user's text, then the referenced paths */\nexport function withMentions(text: string, mentions: Mention[]): string {\n const sec = mentionSection(mentions);\n if (!sec) return text;\n return text.trim() ? `${text}\\n\\n${sec}` : sec;\n}\n\n","// Preview target URLs (1.2): normalize what the user typed or clicked, and decide whether the preview may load it.\n// Pure (no node: imports) so the page uses the very same rules (web/src/preview imports this file).\n//\n// Only loopback targets are allowed: localhost, *.localhost, 127.0.0.0/8, 0.0.0.0, [::1], [::].\n// http/https only, no user:pass@, port 1–65535, at most 2048 characters.\n// Ports the daemon refuses (its own, the gate's, Magpie's) are checked by the caller with deniedPort().\n\nexport const MAX_PREVIEW_URL = 2048;\n\nexport type PreviewTarget = {\n /** Normalized target URL, e.g. http://localhost:5173/app?x=1 */\n href: string;\n /** scheme://host:port of the target (what one proxy listener serves) */\n origin: string;\n /** Path + query + hash on the target */\n path: string;\n secure: boolean;\n /** Host name as written (lowercase; IPv6 without brackets) */\n hostname: string;\n port: number;\n /** Addresses to connect to, in order (localhost tries IPv4 first, then ::1) */\n connect: string[];\n /** Host header to send upstream (host:port as the dev server expects to see it) */\n hostHeader: string;\n};\n\nexport type PreviewCheck = { ok: true; target: PreviewTarget } | { ok: false; reason: \"empty\" | \"too_long\" | \"bad_url\" | \"scheme\" | \"userinfo\" | \"not_local\" | \"port\" };\n\n/** Is this host name a loopback host the preview may load? (brackets of IPv6 allowed or not) */\nexport function isLoopbackHost(host: string): boolean {\n const h = host.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n if (h === \"localhost\" || h.endsWith(\".localhost\")) return /^[a-z0-9.-]+$/.test(h) && !h.includes(\"..\");\n if (h === \"0.0.0.0\" || h === \"::1\" || h === \"::\") return true;\n const m = /^127\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/.exec(h);\n return !!m && m.slice(1).every((x) => Number(x) <= 255);\n}\n\nfunction connectHosts(h: string): string[] {\n if (h === \"localhost\" || h.endsWith(\".localhost\")) return [\"127.0.0.1\", \"::1\"];\n if (h === \"0.0.0.0\") return [\"127.0.0.1\"];\n if (h === \"::1\") return [\"::1\"];\n if (h === \"::\") return [\"::1\", \"127.0.0.1\"];\n return [h];\n}\n\n/** \"5173\", \":5173\", \"localhost:5173\", \"127.0.0.1:5173/x\", \"http://[::1]:4000\" → a URL string with a scheme */\nexport function withScheme(raw: string): string {\n const s = raw.trim();\n if (/^\\d{1,5}$/.test(s)) return `http://localhost:${s}/`;\n if (/^:\\d{1,5}(?:[/?#].*)?$/.test(s)) return `http://localhost${s}`;\n if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(s)) return s;\n // \"mailto:\", \"javascript:\", \"file:\" etc. stay as they are (and are refused below); \"localhost:5173\" is host:port, not a scheme\n if (/^[a-z][a-z0-9+.-]*:(?!\\d)/i.test(s)) return s;\n return `http://${s}`;\n}\n\nexport function checkPreviewUrl(raw: string): PreviewCheck {\n if (typeof raw !== \"string\" || !raw.trim()) return { ok: false, reason: \"empty\" };\n if (raw.length > MAX_PREVIEW_URL) return { ok: false, reason: \"too_long\" };\n let u: URL;\n try {\n u = new URL(withScheme(raw));\n } catch {\n return { ok: false, reason: \"bad_url\" };\n }\n if (u.protocol !== \"http:\" && u.protocol !== \"https:\") return { ok: false, reason: \"scheme\" };\n if (u.username || u.password) return { ok: false, reason: \"userinfo\" };\n const hostname = u.hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n if (!isLoopbackHost(hostname)) return { ok: false, reason: \"not_local\" };\n const secure = u.protocol === \"https:\";\n const port = u.port ? Number(u.port) : secure ? 443 : 80;\n if (!Number.isInteger(port) || port < 1 || port > 65535) return { ok: false, reason: \"port\" };\n const href = u.href;\n if (href.length > MAX_PREVIEW_URL) return { ok: false, reason: \"too_long\" };\n const hostForUrl = hostname.includes(\":\") ? `[${hostname}]` : hostname;\n return {\n ok: true,\n target: {\n href,\n origin: `${u.protocol}//${hostForUrl}:${port}`,\n path: `${u.pathname}${u.search}${u.hash}`,\n secure,\n hostname,\n port,\n connect: connectHosts(hostname),\n hostHeader: `${hostForUrl}:${port}`,\n },\n };\n}\n\n/** The preview never proxies these ports (the daemon, the gate, Magpie): rewriting Origin would bypass their own checks */\nexport function deniedPort(port: number, denied: Iterable<number>): boolean {\n for (const d of denied) if (d === port) return true;\n return false;\n}\n\n/** URL the user sees in the address bar for a proxied location: proxy origin swapped back to the target origin */\nexport function displayHref(proxiedHref: string, proxyOrigin: string, targetOrigin: string): string {\n if (proxiedHref.startsWith(proxyOrigin)) return displayOrigin(targetOrigin) + proxiedHref.slice(proxyOrigin.length);\n return proxiedHref;\n}\n\n/** http://localhost:80 → http://localhost (how a browser would print it) */\nexport function displayOrigin(origin: string): string {\n return origin.replace(/^http:\\/\\/(.+):80$/, \"http://$1\").replace(/^https:\\/\\/(.+):443$/, \"https://$1\");\n}\n\n/** Only http/https may go to the system browser (no file:, javascript:, custom schemes). Returns the re-serialized href. */\nexport function externalHref(raw: string): string | null {\n if (typeof raw !== \"string\" || !raw || raw.length > MAX_PREVIEW_URL) return null;\n let u: URL;\n try {\n u = new URL(raw);\n } catch {\n return null;\n }\n if (u.protocol !== \"http:\" && u.protocol !== \"https:\") return null;\n if (!u.hostname) return null;\n const href = u.href;\n // URL.href percent-encodes spaces/quotes/controls; refuse anything that still looks odd\n if (/[\\s\"'<>`\\\\^{|}]/.test(href) || href.length > MAX_PREVIEW_URL) return null;\n return href;\n}\n","// Open an http(s) URL in the system browser (1.2). Inside Magpie the page has no allow-popups, so target=_blank and\n// window.open do nothing; the daemon opens the link instead. execFile only (no shell), the URL is re-serialized by URL\n// and passed as one argument:\n// macOS open <href>\n// Linux xdg-open <href>\n// Windows rundll32.exe url.dll,FileProtocolHandler <href> (not `cmd /c start`: cmd would parse & | ^ in the URL)\nimport { execFile } from \"node:child_process\";\nimport { externalHref } from \"../preview/url.js\";\n\nexport function openerFor(platform: NodeJS.Platform, href: string): { cmd: string; args: string[] } {\n if (platform === \"win32\") return { cmd: \"rundll32.exe\", args: [\"url.dll,FileProtocolHandler\", href] };\n if (platform === \"darwin\") return { cmd: \"open\", args: [href] };\n return { cmd: \"xdg-open\", args: [href] };\n}\n\ntype ExecLike = (cmd: string, args: string[], opts: { windowsHide: boolean; timeout: number }, cb: (err: Error | null) => void) => { on(ev: \"error\", fn: (e: Error) => void): unknown };\n\n/** ok:false when the URL is refused or no opener could run (e.g. no xdg-open): the page then copies the link instead */\nexport async function openExternal(\n raw: string,\n opts: { platform?: NodeJS.Platform; exec?: ExecLike; waitMs?: number } = {},\n): Promise<{ ok: boolean; href?: string; reason?: string }> {\n const href = externalHref(raw);\n if (!href) return { ok: false, reason: \"bad_url\" };\n const { cmd, args } = openerFor(opts.platform ?? process.platform, href);\n const run = opts.exec ?? (execFile as unknown as ExecLike);\n return await new Promise((resolve) => {\n let settled = false;\n const done = (v: { ok: boolean; href?: string; reason?: string }) => {\n if (!settled) { settled = true; resolve(v); }\n };\n try {\n const child = run(cmd, args, { windowsHide: true, timeout: 15000 }, (err) => {\n // rundll32 / open / xdg-open return quickly; a non-zero exit means nothing was opened\n done(err ? { ok: false, href, reason: \"opener_failed\" } : { ok: true, href });\n });\n child.on(\"error\", () => done({ ok: false, href, reason: \"no_opener\" }));\n } catch {\n done({ ok: false, href, reason: \"no_opener\" });\n }\n // Some openers stay running (a browser launched in the foreground): treat \"still running\" as opened\n setTimeout(() => done({ ok: true, href }), opts.waitMs ?? 4000).unref?.();\n });\n}\n","// The small script the preview proxy adds to HTML pages it serves (as /__agent_console__/preview.js, an external script\n// so a dev app's CSP against inline scripts doesn't block it). Inside Magpie the preview frame is an opaque origin\n// (sandbox=\"allow-scripts\" is inherited), so:\n// 1. localStorage / sessionStorage / document.cookie throw SecurityError → replace them with in-memory stand-ins\n// (lost on reload; the README says so);\n// 2. navigation bridge: report {ac_preview:1, href, title} to the parent page, and take {ac_preview_cmd} back/forward/reload\n// from the parent only. Nothing else is accepted.\nexport const PREVIEW_SCRIPT_PATH = \"/__agent_console__/preview.js\";\n\nexport const PREVIEW_SCRIPT = `(function(){\n \"use strict\";\n if (window.__acPreview) return; window.__acPreview = 1;\n function mem(){ var m = new Map(); var s = {\n getItem: function(k){ k = String(k); return m.has(k) ? m.get(k) : null; },\n setItem: function(k, v){ m.set(String(k), String(v)); },\n removeItem: function(k){ m.delete(String(k)); },\n clear: function(){ m.clear(); },\n key: function(i){ var a = Array.from(m.keys()); return i >= 0 && i < a.length ? a[i] : null; }\n }; Object.defineProperty(s, \"length\", { get: function(){ return m.size; } }); return s; }\n [\"localStorage\", \"sessionStorage\"].forEach(function(n){\n var ok = true; try { var st = window[n]; st.getItem(\"__ac\"); } catch (e) { ok = false; }\n if (!ok) { try { Object.defineProperty(window, n, { value: mem(), configurable: true }); } catch (e) {} }\n });\n try { void document.cookie; } catch (e) {\n var jar = {};\n try { Object.defineProperty(document, \"cookie\", { configurable: true,\n get: function(){ return Object.keys(jar).map(function(k){ return k + \"=\" + jar[k]; }).join(\"; \"); },\n set: function(v){ var p = String(v).split(\";\")[0]; var i = p.indexOf(\"=\"); if (i > 0) jar[p.slice(0, i).trim()] = p.slice(i + 1).trim(); }\n }); } catch (e2) {}\n }\n var parentWin = window.parent;\n if (!parentWin || parentWin === window) return;\n var last = \"\";\n function report(){ try {\n var msg = { ac_preview: 1, href: String(location.href), title: String(document.title || \"\") };\n var key = msg.href + \"\\\\n\" + msg.title; if (key === last) return; last = key;\n parentWin.postMessage(msg, \"*\");\n } catch (e) {} }\n [\"pushState\", \"replaceState\"].forEach(function(k){\n var orig = history[k]; if (typeof orig !== \"function\") return;\n history[k] = function(){ var r = orig.apply(this, arguments); setTimeout(report, 0); return r; };\n });\n window.addEventListener(\"popstate\", report);\n window.addEventListener(\"hashchange\", report);\n window.addEventListener(\"load\", report);\n document.addEventListener(\"DOMContentLoaded\", report);\n setInterval(report, 1000);\n window.addEventListener(\"message\", function(e){\n if (e.source !== parentWin) return;\n var d = e.data; if (!d || typeof d !== \"object\") return;\n var c = d.ac_preview_cmd;\n if (c === \"back\") history.back();\n else if (c === \"forward\") history.forward();\n else if (c === \"reload\") location.reload();\n else if (c === \"ping\") { last = \"\"; report(); }\n });\n report();\n})();\n`;\n\n/** Insert the script tag right after <head …> (else after <html …>, else after the doctype, else at the start). */\nexport function injectScriptTag(html: string): string {\n const tag = `<script src=\"${PREVIEW_SCRIPT_PATH}\"></script>`;\n const head = /<head(\\s[^>]*)?>/i.exec(html);\n if (head) return html.slice(0, head.index + head[0].length) + tag + html.slice(head.index + head[0].length);\n const root = /<html(\\s[^>]*)?>/i.exec(html);\n if (root) return html.slice(0, root.index + root[0].length) + tag + html.slice(root.index + root[0].length);\n const doctype = /^\\s*<!doctype[^>]*>/i.exec(html);\n if (doctype) return html.slice(0, doctype[0].length) + tag + html.slice(doctype[0].length);\n return tag + html;\n}\n","// Preview proxy (1.2): a local-only reverse proxy, one 127.0.0.1:<random port> listener per loopback target origin.\n//\n// Why: Magpie's page frame is sandbox=\"allow-scripts\" and the sandbox is inherited by every child frame, so a plain\n// <iframe src=\"http://localhost:5173\"> runs as an opaque origin: module scripts and fetch() fail CORS (Origin: null),\n// storage throws. The proxy makes a dev app work there: it answers CORS for \"null\", sends the dev server its own Host/Origin,\n// drops X-Frame-Options / frame-ancestors, and adds a tiny script with in-memory storage and a navigation bridge.\n//\n// Who may use a listener (#582): the preview frame is an opaque origin, so every request it makes carries Origin: null (or\n// none) and, from an opaque document, no Referer; any other web page can send exactly the same from a sandboxed iframe of\n// its own. Origin/Referer/Sec-Fetch-* can't tell them apart, and the port is not a secret (a page can scan for it). So each\n// listener has a 128-bit random key and is only reachable at http://ac<key>.localhost:<port>: the browser puts that host\n// name in the Host header of every request the frame makes (navigations, module scripts and their imports, fetch/XHR,\n// CSS url(), workers, the HMR WebSocket), because they are all resolved against the page's own URL; no rewriting needed.\n// A request whose Host is not exactly that name is refused before anything is forwarded, with no CORS headers:\n// 127.0.0.1:<port> / localhost:<port> (no key) → 403, any other Host → 421 (DNS rebinding). Only preview.open on an\n// authenticated WS connection hands out the name. Each open also returns a per-open nonce (separate from the key): the\n// panel's ping must echo it exactly, or the listener is released at once — a plain 200 \"ok\" from a hostile DNS answer\n// is not enough. Before the keyed name is ever looked up, the panel probes a keyless canary host on the same port\n// (acprobe<random>.localhost) the same way. preview.open also reports the daemon's OS (preview/host.ts: os.platform() and\n// the Darwin major of os.release(); the WebKit UA is frozen at 10_15_7 and can't say), and the panel refuses Apple WebKit\n// on a Darwin < 25 host (macOS 12–15) or with no host info before any *.localhost name is looked up, releasing the\n// listener, so the key never hits network DNS. Chromium/WebView2, WebKitGTK and WebKit on macOS 26+ resolve *.localhost\n// themselves.\n// Responses carry Referrer-Policy: no-referrer so the key isn't sent to other sites a previewed page loads from.\n//\n// Limits (see README \"Preview proxy\"):\n// - created only through preview.open on an authenticated WS connection; targets are loopback only (preview/url.ts);\n// the daemon's, the gate's and Magpie's ports (ports.ts: defaults, env, Magpie's settings.json) and the proxy's own\n// are refused, and so is any target that answers like Magpie's gateway (GET / names \"magpie\", or X-Magpie-* headers);\n// - each listener serves exactly one target; Host must be ac<key>.localhost:<p> (see above), except a one-shot\n// keyless canary host that answers only /__agent_console__/ping with a separate nonce;\n// a request with a foreign Origin is refused (only \"null\", none, or the proxy's own origin);\n// - cookies are not forwarded in either direction (127.0.0.1 cookies are shared across ports: Magpie's would leak to the\n// dev server, and the dev server could set cookies other local apps see);\n// - a listener closes after 10 idle minutes, on preview.release, when the last page connection goes, and with the daemon;\n// at most 8 targets at once (the least recently used one is closed).\nimport { createServer, request as httpRequest, type IncomingMessage, type ServerResponse, type Server, type OutgoingHttpHeaders } from \"node:http\";\nimport { request as httpsRequest } from \"node:https\";\nimport { connect as netConnect, isIP, type Socket } from \"node:net\";\nimport { connect as tlsConnect } from \"node:tls\";\nimport { randomBytes } from \"node:crypto\";\nimport { checkHost, tokenEqual } from \"../security.js\";\nimport { checkPreviewUrl, deniedPort, displayOrigin, type PreviewTarget } from \"./url.js\";\nimport { PREVIEW_SCRIPT, PREVIEW_SCRIPT_PATH, injectScriptTag } from \"./inject.js\";\n\nexport class PreviewError extends Error {\n code: string;\n constructor(code: string, message: string) {\n super(message);\n this.code = code;\n }\n}\n\nexport type PreviewProxyOptions = {\n /** Ports never proxied (daemon, gate, Magpie); read on every open */\n deniedPorts: () => Iterable<number>;\n idleMs?: number;\n maxTargets?: number;\n maxHtmlBytes?: number;\n now?: () => number;\n /** how long the \"is this Magpie?\" check waits for GET / (fails closed: no answer, nothing forwarded) */\n identityTimeoutMs?: number;\n /** For tests: a fixed listening port is never used, always 0 (random) */\n log?: (level: \"info\" | \"warn\", msg: string) => void;\n};\n\ntype Listener = {\n target: PreviewTarget;\n server: Server;\n port: number;\n /** ac<128-bit hex key>.localhost:<port>: the Host this listener answers for real traffic */\n authority: string;\n proxyOrigin: string;\n /** echoed by GET /__agent_console__/ping on the keyed host; rotated on every preview.open */\n nonce: string;\n /** keyless acprobe<random>.localhost:<port>: ping-only canary before the keyed name is looked up */\n canaryAuthority: string;\n canaryNonce: string;\n /** the target answered like Magpie's gateway: nothing is forwarded any more */\n magpie: boolean;\n /** when the target's identity was last checked (it is checked again after IDENTITY_TTL) */\n checkedAt: number;\n resolving: Promise<string | null> | null;\n lastUsed: number;\n sockets: Set<Socket>;\n /** open WebSocket tunnels (HMR): a listener with one is never idle */\n tunnels: number;\n /** address that answered last time (localhost: 127.0.0.1 or ::1) */\n addr: string | null;\n};\n\nexport type PreviewOpen = { proxyOrigin: string; target: string; url: string; path: string; proxyHref: string; nonce: string; canaryOrigin: string; canaryNonce: string };\n\nconst HOP = new Set([\"connection\", \"keep-alive\", \"proxy-connection\", \"proxy-authorization\", \"proxy-authenticate\", \"te\", \"trailer\", \"transfer-encoding\", \"upgrade\"]);\nconst RETRY_CODES = new Set([\"ECONNREFUSED\", \"EADDRNOTAVAIL\", \"EAFNOSUPPORT\", \"ENETUNREACH\", \"EHOSTUNREACH\", \"ECONNRESET\", \"ETIMEDOUT\"]);\n/** a listener's target is asked again whether it is Magpie after this long (the port may have changed hands) */\nconst IDENTITY_TTL = 60 * 1000;\nexport const PREVIEW_PING_PATH = \"/__agent_console__/ping\";\n\nexport class PreviewProxy {\n private byOrigin = new Map<string, Listener>();\n private opening = new Map<string, Promise<Listener>>();\n private sweepTimer: NodeJS.Timeout | null = null;\n private idleMs: number;\n private maxTargets: number;\n private maxHtml: number;\n private now: () => number;\n private identityTimeout: number;\n\n constructor(private opts: PreviewProxyOptions) {\n this.idleMs = opts.idleMs ?? 10 * 60 * 1000;\n this.maxTargets = opts.maxTargets ?? 8;\n this.maxHtml = opts.maxHtmlBytes ?? 8 * 1024 * 1024;\n this.now = opts.now ?? Date.now;\n this.identityTimeout = opts.identityTimeoutMs ?? 30 * 1000;\n }\n\n /** Ports of the listeners themselves (a preview of a preview is refused) */\n ports(): number[] {\n return [...this.byOrigin.values()].map((l) => l.port);\n }\n\n get size(): number {\n return this.byOrigin.size;\n }\n\n async open(raw: string): Promise<PreviewOpen> {\n const c = checkPreviewUrl(raw);\n if (!c.ok) throw new PreviewError(c.reason, `preview url refused: ${c.reason}`);\n const t = c.target;\n if (deniedPort(t.port, [...this.opts.deniedPorts(), ...this.ports()])) {\n throw new PreviewError(\"denied_port\", `port ${t.port} can't be previewed`);\n }\n let l = this.byOrigin.get(t.origin);\n if (!l) {\n // Defense in depth for a gateway on a port we don't know about: ask the target first (short wait; the request\n // path asks again and fails closed)\n const who = await identify(t, t.connect, Math.min(3000, this.identityTimeout));\n if (who === \"magpie\") {\n this.opts.log?.(\"warn\", `preview refused: ${t.origin} answers like Magpie's gateway`);\n throw new PreviewError(\"denied_port\", `${t.origin} is Magpie's gateway`);\n }\n let p = this.opening.get(t.origin);\n if (!p) {\n p = this.listen(t).finally(() => this.opening.delete(t.origin));\n this.opening.set(t.origin, p);\n }\n l = await p;\n }\n l.lastUsed = this.now();\n // Fresh nonces every open: the panel must prove it reached *this* listener (not a hostile DNS answer)\n // before the keyed name is used, and again on the keyed ping.\n l.nonce = randomBytes(16).toString(\"hex\");\n l.canaryAuthority = `acprobe${randomBytes(16).toString(\"hex\")}.localhost:${l.port}`;\n l.canaryNonce = randomBytes(16).toString(\"hex\");\n this.ensureSweep();\n return {\n proxyOrigin: l.proxyOrigin,\n target: t.origin,\n url: t.href,\n path: t.path,\n proxyHref: l.proxyOrigin + t.path,\n nonce: l.nonce,\n canaryOrigin: `http://${l.canaryAuthority}`,\n canaryNonce: l.canaryNonce,\n };\n }\n\n /** Close the listener for this target (any URL on it, or its origin) */\n release(raw: string): boolean {\n const c = checkPreviewUrl(raw);\n if (!c.ok) return false;\n const l = this.byOrigin.get(c.target.origin);\n if (!l) return false;\n this.close(l);\n return true;\n }\n\n closeAll(): void {\n for (const l of [...this.byOrigin.values()]) this.close(l);\n if (this.sweepTimer) clearInterval(this.sweepTimer);\n this.sweepTimer = null;\n }\n\n /** Close listeners idle for idleMs (no request and no open WebSocket); exposed for tests with a fake clock */\n sweep(): void {\n const now = this.now();\n for (const l of [...this.byOrigin.values()]) {\n if (l.tunnels === 0 && now - l.lastUsed > this.idleMs) {\n this.opts.log?.(\"info\", `preview proxy for ${l.target.origin} idle, closing`);\n this.close(l);\n }\n }\n if (this.byOrigin.size === 0 && this.sweepTimer) {\n clearInterval(this.sweepTimer);\n this.sweepTimer = null;\n }\n }\n\n private ensureSweep(): void {\n if (this.sweepTimer) return;\n this.sweepTimer = setInterval(() => this.sweep(), 60 * 1000);\n this.sweepTimer.unref();\n }\n\n private close(l: Listener): void {\n if (this.byOrigin.get(l.target.origin) === l) this.byOrigin.delete(l.target.origin);\n try { l.server.close(); } catch {}\n for (const s of l.sockets) s.destroy();\n l.sockets.clear();\n }\n\n private async listen(t: PreviewTarget): Promise<Listener> {\n // Over the limit: close the least recently used target\n while (this.byOrigin.size >= this.maxTargets) {\n const oldest = [...this.byOrigin.values()].sort((a, b) => a.lastUsed - b.lastUsed)[0];\n if (!oldest) break;\n this.close(oldest);\n }\n const server = createServer();\n const l: Listener = {\n target: t, server, port: 0, authority: \"\", proxyOrigin: \"\", nonce: \"\", canaryAuthority: \"\", canaryNonce: \"\",\n magpie: false, checkedAt: 0, resolving: null,\n lastUsed: this.now(), sockets: new Set(), tunnels: 0, addr: null,\n };\n server.on(\"connection\", (s) => {\n l.sockets.add(s);\n s.on(\"close\", () => l.sockets.delete(s));\n });\n server.on(\"request\", (req, res) => this.onRequest(l, req, res));\n server.on(\"upgrade\", (req, socket, head) => this.onUpgrade(l, req, socket as Socket, head));\n server.on(\"clientError\", (_e, socket) => { try { socket.destroy(); } catch {} });\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(0, \"127.0.0.1\", () => resolve());\n });\n const a = server.address();\n l.port = a && typeof a === \"object\" ? a.port : 0;\n l.authority = `ac${randomBytes(16).toString(\"hex\")}.localhost:${l.port}`;\n l.proxyOrigin = `http://${l.authority}`;\n this.byOrigin.set(t.origin, l);\n this.opts.log?.(\"info\", `preview proxy 127.0.0.1:${l.port} → ${t.origin}`); // the key is never logged\n return l;\n }\n\n // ---- request gate shared by HTTP and WS ----\n /** null = refuse; otherwise which name matched (canary is ping-only) */\n private gate(l: Listener, req: IncomingMessage): { code: number; why: string } | { role: \"key\" | \"canary\" } {\n const host = String(req.headers.host ?? \"\").toLowerCase();\n let role: \"key\" | \"canary\" | null = null;\n if (l.authority && tokenEqual(host, l.authority)) role = \"key\";\n else if (l.canaryAuthority && tokenEqual(host, l.canaryAuthority)) role = \"canary\";\n else {\n // the bare loopback address carries no key: any page could send that (#582)\n return checkHost(req.headers.host, l.port).ok ? { code: 403, why: \"preview_key\" } : { code: 421, why: \"bad_host\" };\n }\n const o = req.headers.origin;\n if (o !== undefined && o !== \"\" && o !== \"null\") {\n // canary has no stable origin of its own; only null / absent (opaque preview / no-cors probes)\n if (role === \"key\" && o.toLowerCase() !== l.proxyOrigin) return { code: 403, why: \"bad_origin\" };\n if (role === \"canary\") return { code: 403, why: \"bad_origin\" };\n }\n return { role };\n }\n\n /** A refusal: plain text, no CORS headers (the page that sent it can't read it), nothing forwarded */\n private refuse(res: ServerResponse, req: IncomingMessage, code: number, why: string): void {\n res.writeHead(code, {\n \"content-type\": \"text/plain; charset=utf-8\",\n \"cache-control\": \"no-store\",\n \"x-content-type-options\": \"nosniff\",\n \"content-security-policy\": \"sandbox; default-src 'none'\",\n \"referrer-policy\": \"no-referrer\",\n });\n res.end(req.method === \"HEAD\" ? undefined : why);\n req.resume();\n }\n\n private onRequest(l: Listener, req: IncomingMessage, res: ServerResponse): void {\n const g = this.gate(l, req);\n if (\"code\" in g) {\n this.refuse(res, req, g.code, g.why); // a refused request doesn't keep the listener alive\n return;\n }\n l.lastUsed = this.now();\n const path = (req.url ?? \"/\").split(\"?\")[0];\n if (path === PREVIEW_PING_PATH) {\n // panel must see the nonce from preview.open (WS), not a generic 200 \"ok\" from hostile DNS (#582)\n const body = g.role === \"canary\" ? l.canaryNonce : l.nonce;\n res.writeHead(200, { \"content-type\": \"text/plain; charset=utf-8\", \"cache-control\": \"no-store\", \"access-control-allow-origin\": \"null\", \"referrer-policy\": \"no-referrer\" });\n res.end(req.method === \"HEAD\" ? undefined : body);\n req.resume();\n return;\n }\n // canary name is ping-only: never forward, never serve the inject script\n if (g.role === \"canary\") {\n this.refuse(res, req, 403, \"preview_canary\");\n return;\n }\n if (l.magpie) {\n this.refuse(res, req, 403, \"magpie\");\n return;\n }\n if (path === PREVIEW_SCRIPT_PATH) {\n res.writeHead(200, {\n \"content-type\": \"text/javascript; charset=utf-8\",\n \"cache-control\": \"no-store\",\n \"access-control-allow-origin\": \"null\",\n \"x-content-type-options\": \"nosniff\",\n \"referrer-policy\": \"no-referrer\",\n });\n res.end(req.method === \"HEAD\" ? undefined : PREVIEW_SCRIPT);\n return;\n }\n // CORS preflight from the opaque preview frame: answered here (the dev server would not allow \"null\")\n if (req.method === \"OPTIONS\" && req.headers[\"access-control-request-method\"]) {\n const h: OutgoingHttpHeaders = {\n \"access-control-allow-origin\": \"null\",\n \"access-control-allow-methods\": String(req.headers[\"access-control-request-method\"]).slice(0, 200) + \", GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD\",\n \"access-control-max-age\": \"600\",\n vary: \"origin\",\n };\n const rh = req.headers[\"access-control-request-headers\"];\n if (typeof rh === \"string\") h[\"access-control-allow-headers\"] = rh.slice(0, 2000);\n res.writeHead(204, h);\n res.end();\n req.resume();\n return;\n }\n void this.forward(l, req, res);\n }\n\n /**\n * The address to forward to, once the target is known not to be Magpie's gateway (asked again after IDENTITY_TTL).\n * Fails closed: no answer to the identity check → null (error page), Magpie → l.magpie (refused from then on).\n */\n private resolveAddr(l: Listener): Promise<string | null> {\n if (l.magpie) return Promise.resolve(null);\n if (l.addr && this.now() - l.checkedAt < IDENTITY_TTL) return Promise.resolve(l.addr);\n if (!l.resolving) {\n l.resolving = (async () => {\n const addr = l.addr ?? (await this.probeAddr(l));\n if (!addr) return null;\n const who = await identify(l.target, [addr], this.identityTimeout);\n if (who === \"magpie\") {\n l.magpie = true;\n l.addr = null;\n this.opts.log?.(\"warn\", `preview proxy for ${l.target.origin}: the target answers like Magpie's gateway, refusing`);\n return null;\n }\n if (who === \"none\") {\n l.addr = null;\n return null;\n }\n l.addr = addr;\n l.checkedAt = this.now();\n return addr;\n })().finally(() => { l.resolving = null; });\n }\n return l.resolving;\n }\n\n private async probeAddr(l: Listener): Promise<string | null> {\n for (const host of l.target.connect) {\n const ok = await new Promise<boolean>((resolve) => {\n const s = netConnect({ host, port: l.target.port });\n const done = (v: boolean) => { s.removeAllListeners(); s.destroy(); resolve(v); };\n s.setTimeout(3000, () => done(false));\n s.once(\"connect\", () => done(true));\n s.once(\"error\", () => done(false));\n });\n if (ok) return host;\n }\n return null;\n }\n\n private servername(l: Listener): string | undefined {\n return isIP(l.target.hostname) ? undefined : l.target.hostname;\n }\n\n private async forward(l: Listener, req: IncomingMessage, res: ServerResponse): Promise<void> {\n const addr = await this.resolveAddr(l);\n if (l.magpie) {\n this.refuse(res, req, 403, \"magpie\");\n return;\n }\n if (!addr) {\n this.errorPage(l, req, res);\n return;\n }\n const headers = rewriteRequestHeaders(req.headers, l.target, l.proxyOrigin, false);\n const reqFn = l.target.secure ? httpsRequest : httpRequest;\n const up = reqFn({\n host: addr,\n port: l.target.port,\n method: req.method,\n path: req.url ?? \"/\",\n headers,\n ...(l.target.secure ? { rejectUnauthorized: false, servername: this.servername(l) } : {}),\n });\n up.on(\"response\", (ur) => this.respond(l, req, res, ur));\n up.on(\"error\", (e: NodeJS.ErrnoException) => {\n if (RETRY_CODES.has(e.code ?? \"\")) l.addr = null; // re-probe next time (the dev server may have moved between 127.0.0.1 and ::1)\n if (!res.headersSent) this.errorPage(l, req, res);\n else res.destroy();\n });\n req.on(\"aborted\", () => up.destroy());\n res.on(\"close\", () => { if (!res.writableFinished) up.destroy(); });\n req.pipe(up);\n }\n\n private respond(l: Listener, req: IncomingMessage, res: ServerResponse, ur: IncomingMessage): void {\n l.lastUsed = this.now();\n if (looksLikeMagpie(ur.headers)) {\n // a gateway reply (X-Magpie-*): the port changed hands since the last check\n l.magpie = true;\n l.addr = null;\n ur.resume();\n this.refuse(res, req, 403, \"magpie\");\n return;\n }\n const h = rewriteResponseHeaders(ur.headers, l.target, l.proxyOrigin);\n const status = ur.statusCode ?? 502;\n const ctype = String(ur.headers[\"content-type\"] ?? \"\").toLowerCase();\n const encoded = !!ur.headers[\"content-encoding\"] && ur.headers[\"content-encoding\"] !== \"identity\";\n const html = ctype.includes(\"text/html\") && !encoded && req.method !== \"HEAD\" && status !== 204 && status !== 304;\n if (!html) {\n res.writeHead(status, h);\n ur.pipe(res);\n return;\n }\n // HTML: buffer (bounded) and add the script tag; a huge page passes through untouched\n const chunks: Buffer[] = [];\n let size = 0;\n let passthrough = false;\n ur.on(\"data\", (c: Buffer) => {\n if (passthrough) return;\n size += c.length;\n chunks.push(c);\n if (size > this.maxHtml) {\n passthrough = true;\n res.writeHead(status, h);\n for (const x of chunks) res.write(x);\n ur.removeAllListeners(\"data\");\n ur.removeAllListeners(\"end\");\n ur.pipe(res);\n }\n });\n ur.on(\"end\", () => {\n if (passthrough) return;\n // latin1 keeps every byte as it was, whatever the page's charset\n const out = Buffer.from(injectScriptTag(Buffer.concat(chunks).toString(\"latin1\")), \"latin1\");\n h[\"content-length\"] = String(out.length);\n res.writeHead(status, h);\n res.end(out);\n });\n ur.on(\"error\", () => res.destroy());\n }\n\n private errorPage(l: Listener, req: IncomingMessage, res: ServerResponse): void {\n const where = displayOrigin(l.target.origin).replace(/^https?:\\/\\//, \"\");\n const body = `<!doctype html><html><head><meta charset=\"utf-8\"><title>${esc(where)}</title>\n<style>body{font:13px/1.6 system-ui,sans-serif;color:#525252;display:flex;align-items:center;justify-content:center;height:100vh;margin:0;background:#fff}\n@media (prefers-color-scheme:dark){body{background:#1a1a1a;color:#a3a3a3}button{background:#262626;color:#e5e5e5;border-color:#3a3a3a}}\n.b{text-align:center;max-width:420px;padding:20px}code{font-family:ui-monospace,monospace}button{margin-top:12px;padding:5px 14px;border:1px solid #d4d4d4;border-radius:6px;background:#fafafa;cursor:pointer;font:inherit}</style></head>\n<body><div class=\"b\"><div><code>${esc(where)}</code> 没有响应,dev server 启动了吗?</div><div><code>${esc(where)}</code> is not responding. Is the dev server running?</div>\n<button onclick=\"location.reload()\">重试 / Retry</button></div></body></html>`;\n res.writeHead(502, { \"content-type\": \"text/html; charset=utf-8\", \"cache-control\": \"no-store\", \"access-control-allow-origin\": \"null\" });\n res.end(req.method === \"HEAD\" ? undefined : body);\n req.resume();\n }\n\n // ---- WebSocket (HMR) ----\n private onUpgrade(l: Listener, req: IncomingMessage, socket: Socket, head: Buffer): void {\n const g = this.gate(l, req);\n if (\"code\" in g || g.role === \"canary\" || l.magpie) {\n const code = \"code\" in g ? g.code : 403;\n socket.end(`HTTP/1.1 ${code} ${code === 421 ? \"Misdirected Request\" : \"Forbidden\"}\\r\\nconnection: close\\r\\n\\r\\n`);\n return;\n }\n l.lastUsed = this.now();\n socket.on(\"error\", () => {});\n void this.resolveAddr(l).then((addr) => {\n if (!addr || socket.destroyed) {\n socket.end(\"HTTP/1.1 502 Bad Gateway\\r\\nconnection: close\\r\\n\\r\\n\");\n return;\n }\n const up: Socket = l.target.secure\n ? tlsConnect({ host: addr, port: l.target.port, rejectUnauthorized: false, servername: this.servername(l) })\n : netConnect({ host: addr, port: l.target.port });\n const ready = l.target.secure ? \"secureConnect\" : \"connect\";\n l.tunnels++;\n let counted = true;\n const done = () => {\n if (counted) { counted = false; l.tunnels--; l.lastUsed = this.now(); }\n up.destroy();\n socket.destroy();\n };\n up.once(ready, () => {\n const lines = [`${req.method ?? \"GET\"} ${req.url ?? \"/\"} HTTP/1.1`];\n const hs = rewriteRequestHeaders(req.headers, l.target, l.proxyOrigin, true);\n for (const [k, v] of Object.entries(hs)) {\n if (v === undefined) continue;\n for (const one of Array.isArray(v) ? v : [v]) lines.push(`${k}: ${String(one).replace(/[\\r\\n]/g, \"\")}`);\n }\n up.write(lines.join(\"\\r\\n\") + \"\\r\\n\\r\\n\");\n if (head?.length) up.write(head);\n up.pipe(socket);\n socket.pipe(up);\n });\n up.on(\"data\", () => { l.lastUsed = this.now(); });\n up.on(\"error\", done);\n up.on(\"close\", done);\n socket.on(\"close\", done);\n });\n }\n}\n\nfunction esc(s: string): string {\n return s.replace(/[&<>\"']/g, (c) => ({ \"&\": \"&\", \"<\": \"<\", \">\": \">\", '\"': \""\", \"'\": \"'\" })[c]!);\n}\n\n/** Headers sent upstream: the dev server sees its own Host / Origin, no cookies, no compression. */\nexport function rewriteRequestHeaders(\n inH: IncomingMessage[\"headers\"],\n t: PreviewTarget,\n proxyOrigin: string,\n upgrade: boolean,\n): OutgoingHttpHeaders {\n const out: OutgoingHttpHeaders = {};\n const targetOrigin = displayOrigin(t.origin);\n for (const [k, v] of Object.entries(inH)) {\n if (v === undefined) continue;\n const key = k.toLowerCase();\n if (!upgrade && HOP.has(key)) continue;\n if (upgrade && (key === \"proxy-connection\" || key === \"proxy-authorization\" || key === \"keep-alive\" || key === \"te\" || key === \"trailer\" || key === \"transfer-encoding\")) continue;\n if (key === \"cookie\" || key === \"host\" || key === \"origin\" || key === \"referer\" || key === \"forwarded\" || key.startsWith(\"x-forwarded-\")) continue;\n out[key] = v;\n }\n out.host = t.hostHeader.replace(/:(80|443)$/, (m) => ((m === \":80\" && !t.secure) || (m === \":443\" && t.secure) ? \"\" : m));\n if (inH.origin !== undefined) out.origin = targetOrigin;\n const ref = inH.referer;\n if (typeof ref === \"string\" && (ref === proxyOrigin || ref.startsWith(proxyOrigin + \"/\"))) out.referer = targetOrigin + ref.slice(proxyOrigin.length);\n if (inH[\"sec-fetch-site\"] !== undefined) out[\"sec-fetch-site\"] = \"same-origin\";\n if (!upgrade) out[\"accept-encoding\"] = \"identity\";\n return out;\n}\n\n/** Headers sent back to the preview frame: readable by an opaque origin, frameable, no cookies, redirects stay on the proxy. */\nexport function rewriteResponseHeaders(inH: IncomingMessage[\"headers\"], t: PreviewTarget, proxyOrigin: string): OutgoingHttpHeaders {\n const out: OutgoingHttpHeaders = {};\n for (const [k, v] of Object.entries(inH)) {\n if (v === undefined) continue;\n const key = k.toLowerCase();\n if (HOP.has(key)) continue;\n if (key === \"x-frame-options\" || key === \"set-cookie\" || key === \"referrer-policy\" || key.startsWith(\"access-control-allow-\")) continue;\n if (key === \"content-security-policy\" || key === \"content-security-policy-report-only\") {\n const kept = (Array.isArray(v) ? v : [v]).map(stripFrameAncestors).filter(Boolean);\n if (kept.length) out[key] = kept.join(\", \");\n continue;\n }\n if (key === \"location\" && typeof v === \"string\") {\n out[key] = rewriteLocation(v, t, proxyOrigin);\n continue;\n }\n out[key] = v;\n }\n out[\"access-control-allow-origin\"] = \"null\";\n // the proxy's host name holds the listener key: never send it to another site in a Referer\n out[\"referrer-policy\"] = \"no-referrer\";\n const vary = typeof out.vary === \"string\" ? out.vary : \"\";\n out.vary = vary ? (/\\borigin\\b/i.test(vary) ? vary : `${vary}, Origin`) : \"Origin\";\n return out;\n}\n\nexport function stripFrameAncestors(csp: string): string {\n return csp\n .split(\";\")\n .map((d) => d.trim())\n .filter((d) => d && !/^frame-ancestors(\\s|$)/i.test(d))\n .join(\"; \");\n}\n\n/** A redirect to the target itself goes to the proxy instead; anything else (another site) is left alone */\nexport function rewriteLocation(loc: string, t: PreviewTarget, proxyOrigin: string): string {\n let u: URL;\n try {\n u = new URL(loc, t.href);\n } catch {\n return loc;\n }\n if (!/^[a-z][a-z0-9+.-]*:/i.test(loc) && !loc.startsWith(\"//\")) return loc; // relative: already right\n const port = u.port ? Number(u.port) : u.protocol === \"https:\" ? 443 : 80;\n const host = u.hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n if (u.protocol === (t.secure ? \"https:\" : \"http:\") && host === t.hostname && port === t.port) {\n return proxyOrigin + u.pathname + u.search + u.hash;\n }\n return loc;\n}\n\n/** Reply headers only Magpie's gateway sends */\nexport function looksLikeMagpie(h: IncomingMessage[\"headers\"]): boolean {\n return Object.keys(h).some((k) => k.toLowerCase().startsWith(\"x-magpie-\"));\n}\n\n/** GET / body of Magpie's gateway: {\"name\":\"magpie\",\"apis\":[…],\"version\":…} */\nexport function magpieIndex(body: string): boolean {\n try {\n const j = JSON.parse(body) as { name?: unknown; apis?: unknown; version?: unknown };\n return !!j && typeof j === \"object\" && j.name === \"magpie\" && (Array.isArray(j.apis) || typeof j.version === \"string\");\n } catch {\n return false;\n }\n}\n\n/**\n * Does the target answer like Magpie's gateway? GET / on the first address that answers.\n * \"magpie\" / \"other\" (any other HTTP answer) / \"none\" (no HTTP answer in time: the caller fails closed).\n */\nexport async function identify(t: PreviewTarget, addrs: string[], timeoutMs: number): Promise<\"magpie\" | \"other\" | \"none\"> {\n for (const addr of addrs) {\n const r = await new Promise<\"magpie\" | \"other\" | \"none\">((resolve) => {\n let settled = false;\n const done = (v: \"magpie\" | \"other\" | \"none\") => { if (!settled) { settled = true; clearTimeout(timer); resolve(v); } };\n const reqFn = t.secure ? httpsRequest : httpRequest;\n const q = reqFn({\n host: addr,\n port: t.port,\n method: \"GET\",\n path: \"/\",\n headers: { host: t.hostHeader, accept: \"application/json\", \"accept-encoding\": \"identity\", \"user-agent\": \"agent-console-preview-check\" },\n agent: false,\n ...(t.secure ? { rejectUnauthorized: false, servername: isIP(t.hostname) ? undefined : t.hostname } : {}),\n });\n const timer = setTimeout(() => { q.destroy(); done(\"none\"); }, timeoutMs);\n q.on(\"error\", () => done(\"none\"));\n q.on(\"response\", (res) => {\n if (looksLikeMagpie(res.headers)) { res.destroy(); return done(\"magpie\"); }\n const ct = String(res.headers[\"content-type\"] ?? \"\").toLowerCase();\n if (!ct.includes(\"json\")) { res.destroy(); return done(\"other\"); }\n const chunks: Buffer[] = [];\n let size = 0;\n res.on(\"data\", (c: Buffer) => {\n size += c.length;\n if (size > 256 * 1024) { res.destroy(); done(\"other\"); return; }\n chunks.push(c);\n });\n res.on(\"end\", () => done(magpieIndex(Buffer.concat(chunks).toString(\"utf8\")) ? \"magpie\" : \"other\"));\n res.on(\"error\", () => done(\"none\"));\n });\n q.end();\n });\n if (r !== \"none\") return r;\n }\n return \"none\";\n}\n","// What the page needs to know about the daemon's OS to decide whether the in-panel preview can run (#582).\n// Apple froze the OS version in the WebKit UA at \"Mac OS X 10_15_7\" (WKWebView and Safari on macOS 26+ still send it),\n// so the page can't tell macOS 15 from 26 by itself. The daemon runs on the same Mac (it listens on 127.0.0.1 only)\n// and reads the real version: Darwin kernel 25.x is macOS 26, whose WebKit resolves *.localhost to loopback itself.\nimport os from \"node:os\";\n\nexport type PreviewHost = {\n /** os.platform() of the daemon host */\n platform: string;\n /** major of os.release() when platform is darwin (25 = macOS 26), else null; null too when it can't be parsed */\n darwinMajor: number | null;\n};\n\n/** Darwin 25 = macOS 26, the first macOS whose WebKit answers *.localhost with loopback without asking DNS */\nexport const DARWIN_LOCALHOST_LOOPBACK = 25;\n\nexport function previewHost(platform: string = os.platform(), release: string = os.release()): PreviewHost {\n if (platform !== \"darwin\") return { platform, darwinMajor: null };\n const m = /^(\\d+)\\./.exec(String(release ?? \"\").trim()) ?? /^(\\d+)$/.exec(String(release ?? \"\").trim());\n const major = m ? Number(m[1]) : NaN;\n return { platform, darwinMajor: Number.isInteger(major) && major > 0 ? major : null };\n}\n","// Method registry: zod-validated params → call the service → return. P0-5 skeleton; filled in from P1 on.\nimport { z } from \"zod\";\nimport type { Gateway, ConnCtx } from \"./gateway.js\";\nimport type { Config } from \"../config.js\";\nimport type { SettingsStore, Settings } from \"../store/settings.js\";\nimport { parseSettingsPatch } from \"../store/settings.js\";\nimport type { ProjectsStore } from \"../store/projects.js\";\nimport type { ThreadsStore } from \"../store/threads.js\";\nimport { listProviders, getProvider } from \"../providers/registry.js\";\nimport { PROVIDER_CATALOG, catalogById, providerCreatable } from \"../providers/catalog.js\";\nimport { isProviderEnabled } from \"../providers/enabled.js\";\nimport type { SlashCommand } from \"../providers/types.js\";\nimport { GitService } from \"../git/service.js\";\nimport { FileService } from \"../files/service.js\";\nimport type { TerminalService } from \"../terminal/service.js\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, win32 as win32Path } from \"node:path\";\nimport { execFile } from \"node:child_process\";\nimport { pickFolder } from \"../util/pickFolder.js\";\nimport { clearBinCache } from \"../util/bin.js\";\nimport { cachedDetect, cachedModels, clearProviderCache } from \"../providers/infoCache.js\";\nimport { launchFromSettings } from \"../providers/launch.js\";\nimport { clampMode } from \"../providers/modes.js\";\nimport { setAppLocale, tr, intlLocale } from \"../util/i18n.js\";\nimport { MAX_MENTIONS } from \"../util/mentions.js\";\nimport { openExternal } from \"../util/openExternal.js\";\nimport { PreviewError, type PreviewProxy } from \"../preview/proxy.js\";\nimport { checkPreviewUrl, MAX_PREVIEW_URL } from \"../preview/url.js\";\nimport { previewHost } from \"../preview/host.js\";\n\nconst threadModeSchema = z.enum([\"plan\", \"default\", \"acceptEdits\", \"bypassPermissions\", \"ask\"]);\n\nexport type Services = {\n cfg: Config;\n settings: SettingsStore;\n gateway: Gateway;\n projects: ProjectsStore;\n threads: ThreadsStore;\n git: GitService;\n files: FileService;\n terminals: TerminalService;\n /** 1.2 preview proxy (absent in some tests) */\n preview?: PreviewProxy;\n // AgentManager provides runtime info once wired in at P1-4; may be empty (no session started)\n runtime?: (threadId: string) => { status: string; queue: unknown[]; pending: unknown[] } | null;\n manager?: {\n send(threadId: string, input: { text: string; attachments?: { path: string; mime: string; name?: string }[]; mentions?: { rel: string; isDir?: boolean }[] }, behavior?: \"queue\" | \"steer\"): Promise<\"started\" | \"steered\" | \"queued\" | void>;\n interrupt(threadId: string): Promise<void>;\n respond(threadId: string, requestId: string, answer: { optionId?: string; answers?: Record<string, string>; cancelled?: boolean }): Promise<void>;\n setModel(threadId: string, model: string | null): Promise<void>;\n setMode(threadId: string, mode: \"plan\" | \"default\" | \"acceptEdits\" | \"bypassPermissions\" | \"ask\"): Promise<void>;\n setEffort(threadId: string, effort: string | null): Promise<void>;\n setCursorOpts(threadId: string, patch: { cursorFast?: boolean; cursorAutoReview?: boolean }): Promise<void>;\n setProvider(threadId: string, providerId: string): Promise<void>;\n close(threadId: string): Promise<void>;\n deleteThread(threadId: string): Promise<void>;\n listCommands(threadId: string, opts?: { load?: boolean }): Promise<SlashCommand[]>;\n removeQueued(threadId: string, queueId: string): boolean;\n };\n};\n\nexport class ApiError extends Error {\n code: string;\n constructor(code: string, message: string) {\n super(message);\n this.code = code;\n }\n}\n\nfunction wrap<T extends z.ZodType>(schema: T, fn: (p: z.infer<T>, ctx: ConnCtx) => unknown) {\n return (params: unknown, ctx: ConnCtx) => {\n const r = schema.safeParse(params ?? {});\n if (!r.success) {\n throw new ApiError(\"bad_params\", tr(\"err.badParams\", { detail: r.error.issues.map((i) => i.message).join(\"; \") }));\n }\n return fn(r.data, ctx);\n };\n}\n\nexport function registerMethods(gw: Gateway, svc: Services): void {\n const zEmpty = z.object({}).passthrough().optional();\n\n // Magpie's language changed while the page is open (1.2): daemon-made text (notices, tool titles) follows it\n gw.method(\"app.setLocale\", wrap(z.object({ lang: z.string().max(32) }), (p) => {\n setAppLocale(p.lang);\n return true;\n }));\n\n gw.method(\"app.info\", wrap(zEmpty, () => ({\n version: svc.cfg.version,\n dataDir: svc.cfg.dataDir,\n pid: process.pid,\n port: svc.cfg.port,\n })));\n\n gw.method(\"app.shutdown\", wrap(zEmpty, () => {\n setTimeout(() => process.exit(0), 100);\n return { ok: true };\n }));\n\n // 1.2: open an http(s) link in the system browser (the sandboxed page can't open popups)\n gw.method(\"app.openExternal\", wrap(z.object({ url: z.string().min(1).max(MAX_PREVIEW_URL) }), async (p) => openExternal(p.url)));\n\n // 1.2 preview: a local-only reverse proxy for a loopback dev URL (see preview/proxy.ts for the limits)\n gw.method(\"preview.open\", wrap(\n z.object({ url: z.string().min(1).max(MAX_PREVIEW_URL), threadId: z.string().max(200).optional() }),\n async (p) => {\n if (!svc.preview) throw new ApiError(\"unavailable\", tr(\"err.previewUnavailable\"));\n let r;\n try {\n r = await svc.preview.open(p.url);\n } catch (e) {\n if (e instanceof PreviewError) {\n throw new ApiError(e.code === \"denied_port\" ? \"preview_denied\" : \"preview_url\", tr(e.code === \"denied_port\" ? \"err.previewDenied\" : \"err.previewUrl\"));\n }\n throw e;\n }\n if (p.threadId) {\n const meta = await svc.threads.get(p.threadId);\n if (meta && meta.previewUrl !== r.url) {\n const next = await svc.threads.patch(p.threadId, { previewUrl: r.url });\n gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: next });\n }\n }\n // The daemon's real OS (the UA can't carry it, #582): the page refuses Apple WebKit on Darwin < 25 before any\n // *.localhost name is looked up, and releases this listener\n return { ...r, host: previewHost() };\n },\n ));\n\n gw.method(\"preview.release\", wrap(z.object({ url: z.string().min(1).max(MAX_PREVIEW_URL) }), (p) => ({\n ok: svc.preview?.release(p.url) ?? false,\n })));\n\n gw.method(\"settings.get\", wrap(zEmpty, () => svc.settings.get()));\n\n gw.method(\"settings.set\", wrap(z.object({ patch: z.record(z.string(), z.unknown()) }), async (p) => {\n const checked = parseSettingsPatch(p.patch);\n if (!checked.ok) throw new ApiError(\"bad_params\", `Invalid setting: ${checked.error}`);\n const before = await svc.settings.get();\n const next = await svc.settings.set(checked.patch as Partial<Settings>);\n // A changed launch command only invalidates that Agent's detection / model cache (B2: toggling never wipes the rest)\n for (const id of Object.keys(checked.patch.providerCommand ?? {})) {\n if (JSON.stringify(before.providerCommand?.[id] ?? null) !== JSON.stringify(next.providerCommand?.[id] ?? null)) {\n clearProviderCache(id);\n }\n }\n return next;\n }));\n\n gw.method(\"sub.add\", wrap(\n z.object({ ch: z.string().min(1).max(120), afterSeq: z.number().int().nonnegative().optional() }),\n async (p, ctx) => {\n svc.gateway.subscribe(ctx.conn, p.ch);\n // The thread:<id> channel replays persisted events after afterSeq (late subscribers / reconnects lose nothing)\n const m = /^thread:(.+)$/.exec(p.ch);\n if (m && p.afterSeq != null) {\n const events = await svc.threads.readEvents(m[1], p.afterSeq, 5000).catch(() => []);\n for (const ev of events) ctx.conn.send({ t: \"evt\", ch: p.ch, d: { type: \"event\", event: ev } });\n }\n return { ok: true };\n }\n ));\n\n gw.method(\"sub.remove\", wrap(z.object({ ch: z.string().min(1).max(120) }), (p, ctx) => {\n svc.gateway.unsubscribe(ctx.conn, p.ch);\n return { ok: true };\n }));\n\n // ---- providers.list (§6): detection + model list + capabilities ----\n // detect/listModels in parallel; 8s total per provider (listModels may start a temporary process).\n gw.method(\"providers.list\", wrap(\n z.object({ refresh: z.boolean().optional() }).passthrough().optional(),\n async (p) => {\n if (p?.refresh) {\n clearBinCache();\n clearProviderCache();\n }\n const settings = await svc.settings.get();\n const rows = await Promise.all(\n listProviders().map(async (p) => {\n const entry = catalogById(p.id);\n const enabled = isProviderEnabled(settings, p.id);\n const launch = launchFromSettings(settings, p.id);\n // Disabled / not-integrated ones are neither detected nor asked for models (saves seconds of CLI startup)\n const skip = !enabled || entry?.status === \"planned\";\n const det: import(\"../providers/types.js\").DetectResult = skip\n ? { available: false, reason: !enabled ? tr(\"provider.disabled\") : tr(\"provider.planned\") }\n : await cachedDetect(p, launch);\n const models = !skip && det.available ? await cachedModels(p, launch) : [];\n return {\n id: p.id,\n name: p.name,\n available: det.available,\n enabled,\n status: entry?.status ?? \"verified\",\n ready: entry?.status === \"verified\",\n bin: det.bin,\n version: det.version,\n reason: !enabled ? tr(\"provider.disabled\") : det.reason,\n installHint: det.installHint,\n capabilities: p.capabilities,\n models,\n };\n }),\n );\n const byId = new Map(rows.map((r) => [r.id, r]));\n const ordered = PROVIDER_CATALOG.map((e) => byId.get(e.id)).filter(Boolean) as typeof rows;\n for (const r of rows) {\n if (!PROVIDER_CATALOG.some((e) => e.id === r.id)) ordered.push(r);\n }\n return ordered;\n }\n ));\n\n // ---- projects.* ----\n gw.method(\"projects.list\", wrap(zEmpty, () => svc.projects.list()));\n\n gw.method(\"projects.create\", wrap(\n z.object({ path: z.string().min(1), name: z.string().optional() }),\n async (p) => {\n const proj = await svc.projects.create(p.path, p.name);\n // Record recent directories (deduped, case-insensitive, at most 12)\n const s = await svc.settings.get();\n const dirs = (s.recentDirs ?? []).filter((d) => d.toLowerCase() !== p.path.toLowerCase());\n await svc.settings.set({ recentDirs: [p.path, ...dirs].slice(0, 12) });\n gw.publish(\"sidebar\", { type: \"project.upsert\", project: proj });\n return proj;\n }\n ));\n\n gw.method(\"projects.rename\", wrap(z.object({ id: z.string(), name: z.string() }), async (p) => {\n const proj = await svc.projects.rename(p.id, p.name);\n gw.publish(\"sidebar\", { type: \"project.upsert\", project: proj });\n return proj;\n }));\n\n gw.method(\"projects.remove\", wrap(z.object({ id: z.string() }), async (p) => {\n const proj = await svc.projects.get(p.id);\n if (!proj) throw new ApiError(\"not_found\", tr(\"err.projectMissing\"));\n // Move all of the project's conversations to the trash\n for (const t of await svc.threads.list()) {\n if (t.projectId === p.id) {\n await svc.threads.delete(t.id);\n gw.publish(\"sidebar\", { type: \"thread.remove\", id: t.id });\n }\n }\n await svc.projects.remove(p.id);\n gw.publish(\"sidebar\", { type: \"project.remove\", id: p.id });\n return { ok: true };\n }));\n\n gw.method(\"projects.open\", wrap(z.object({ id: z.string() }), async (p) => {\n const proj = await svc.projects.get(p.id);\n if (!proj) throw new ApiError(\"not_found\", tr(\"err.projectMissing\"));\n if (!existsSync(proj.path)) throw new ApiError(\"bad_path\", tr(\"err.dirMissing\"));\n const cmd = process.platform === \"win32\" ? \"explorer.exe\" : process.platform === \"darwin\" ? \"open\" : \"xdg-open\";\n // explorer.exe doesn't understand forward-slash paths (it opens \"Documents\"); a missing xdg-open must not make the daemon throw either\n const target = process.platform === \"win32\" ? win32Path.normalize(proj.path) : proj.path;\n execFile(cmd, [target], { windowsHide: true }, () => {}).on(\"error\", () => {});\n return { ok: true };\n }));\n\n // ---- fs.* ----\n gw.method(\"fs.check\", wrap(z.object({ path: z.string().min(1) }), (p) => {\n let exists = false;\n let isDir = false;\n try {\n exists = existsSync(p.path);\n isDir = exists && statSync(p.path).isDirectory();\n } catch {}\n return { exists, isDir };\n }));\n\n gw.method(\"fs.recentDirs\", wrap(zEmpty, async () => {\n const s = await svc.settings.get();\n return (s.recentDirs ?? []).slice(0, 12);\n }));\n\n // fs.pickFolder: show the native folder picker (the daemon runs locally): Windows PowerShell, macOS osascript,\n // Linux zenity/kdialog; with none, report unavailable and the frontend falls back to typing.\n gw.method(\"fs.pickFolder\", wrap(z.object({ initial: z.string().optional() }).passthrough().optional(), (p) =>\n pickFolder(p?.initial),\n ));\n\n // ---- threads.* ----\n gw.method(\"threads.list\", wrap(zEmpty, () => svc.threads.list()));\n\n gw.method(\"threads.create\", wrap(\n z.object({\n projectId: z.string().min(1),\n provider: z.string().min(1),\n model: z.string().nullable().optional(),\n mode: threadModeSchema.optional(),\n effort: z.string().nullable().optional(),\n title: z.string().optional(),\n providerSessionId: z.string().nullable().optional(),\n importedFrom: z.object({ provider: z.string(), sessionId: z.string() }).optional(),\n }),\n async (p) => {\n const proj = await svc.projects.get(p.projectId);\n if (!proj) throw new ApiError(\"not_found\", tr(\"err.projectMissing\"));\n if (!existsSync(proj.path)) throw new ApiError(\"bad_path\", tr(\"err.projectDirGone\"));\n // New conversations must use an enabled Agent (except imported sessions, which already ran)\n if (!p.providerSessionId && !isProviderEnabled(await svc.settings.get(), p.provider)) {\n throw new ApiError(\"bad_params\", tr(\"provider.disabledNamed\", { name: catalogById(p.provider)?.name ?? p.provider }));\n }\n const cat = catalogById(p.provider);\n if (!p.providerSessionId && cat && !providerCreatable(cat.status)) {\n throw new ApiError(\"bad_params\", tr(\"provider.plannedNamed\", { name: cat.name }));\n }\n // B8: the default permission mode is mapped onto this Agent's own modes (same rule as thread.setProvider)\n const provider = getProvider(p.provider);\n const mode = clampMode(provider?.capabilities.modes ?? [], p.mode);\n const meta = await svc.threads.create({ ...p, mode });\n gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: meta });\n return meta;\n }\n ));\n\n gw.method(\"threads.get\", wrap(\n z.object({ id: z.string(), afterSeq: z.number().int().nonnegative().optional() }),\n async (p) => {\n const meta = await svc.threads.get(p.id);\n if (!meta) throw new ApiError(\"not_found\", tr(\"err.threadMissing\"));\n const events = await svc.threads.readEvents(p.id, p.afterSeq ?? 0, 5000);\n const rt = svc.runtime?.(p.id) ?? null;\n return {\n meta,\n events,\n queue: rt?.queue ?? [],\n pending: rt?.pending ?? [],\n runtimeStatus: rt?.status ?? meta.status,\n };\n }\n ));\n\n gw.method(\"threads.update\", wrap(\n z.object({\n id: z.string(),\n title: z.string().optional(),\n pinned: z.boolean().optional(),\n archived: z.boolean().optional(),\n previewUrl: z.string().max(MAX_PREVIEW_URL).nullable().optional(),\n }),\n async (p) => {\n const meta = await svc.threads.get(p.id);\n if (!meta) throw new ApiError(\"not_found\", tr(\"err.threadMissing\"));\n const patch: Record<string, unknown> = {};\n if (p.title !== undefined) {\n patch.title = p.title.trim() || meta.title;\n patch.titleAuto = false; // Once renamed by hand, never auto-overwrite\n }\n if (p.pinned !== undefined) patch.pinned = p.pinned;\n if (p.archived !== undefined) patch.archived = p.archived;\n if (p.previewUrl !== undefined) {\n // Only a loopback URL is remembered (normalized); null clears it\n if (p.previewUrl === null) patch.previewUrl = null;\n else {\n const c = checkPreviewUrl(p.previewUrl);\n if (!c.ok) throw new ApiError(\"bad_params\", tr(\"err.previewUrl\"));\n patch.previewUrl = c.target.href;\n }\n }\n const next = await svc.threads.patch(p.id, patch);\n gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: next });\n return next;\n }\n ));\n\n gw.method(\"threads.delete\", wrap(z.object({ id: z.string() }), async (p) => {\n const meta = await svc.threads.get(p.id);\n if (!meta) throw new ApiError(\"not_found\", tr(\"err.threadMissing\"));\n if (svc.manager) await svc.manager.deleteThread(p.id);\n else await svc.threads.delete(p.id);\n gw.publish(\"sidebar\", { type: \"thread.remove\", id: p.id });\n return { ok: true };\n }));\n\n // ---- git.* (§5.8) ----\n const projectPath = async (projectId: string): Promise<string> => {\n const proj = await svc.projects.get(projectId);\n if (!proj) throw new ApiError(\"not_found\", tr(\"err.projectMissing\"));\n if (!existsSync(proj.path)) throw new ApiError(\"bad_path\", tr(\"err.projectDirGone\"));\n return proj.path;\n };\n\n gw.method(\"git.status\", wrap(z.object({ projectId: z.string() }), async (p) =>\n svc.git.status(await projectPath(p.projectId))\n ));\n\n gw.method(\"git.diff\", wrap(z.object({ projectId: z.string(), path: z.string() }), async (p) =>\n svc.git.diff(await projectPath(p.projectId), p.path)\n ));\n\n gw.method(\"git.discard\", wrap(z.object({ projectId: z.string(), path: z.string() }), async (p) =>\n svc.git.discard(await projectPath(p.projectId), p.path, svc.cfg.dataDir)\n ));\n\n // ---- files.* (§5.9) ----\n gw.method(\"files.tree\", wrap(z.object({ projectId: z.string(), dir: z.string().default(\".\") }), async (p) =>\n svc.files.tree(await projectPath(p.projectId), p.dir)\n ));\n\n gw.method(\"files.read\", wrap(z.object({ projectId: z.string(), path: z.string() }), async (p) =>\n svc.files.read(await projectPath(p.projectId), p.path)\n ));\n\n // ---- history.* (§7.6) ----\n gw.method(\"history.list\", wrap(z.object({ projectId: z.string() }), async (p) => {\n const proj = await svc.projects.get(p.projectId);\n if (!proj) throw new ApiError(\"not_found\", tr(\"err.projectMissing\"));\n const imported = new Set(\n (await svc.threads.list())\n .filter((t) => t.projectId === p.projectId && t.providerSessionId)\n .map((t) => t.providerSessionId),\n );\n const out: unknown[] = [];\n for (const provider of listProviders()) {\n if (!provider.listHistory) continue;\n const items = await provider.listHistory(proj.path).catch(() => []);\n for (const i of items) out.push({ ...i, imported: imported.has(i.sessionId) });\n }\n return out;\n }));\n\n gw.method(\"history.import\", wrap(\n z.object({\n projectId: z.string(),\n items: z.array(z.object({ provider: z.string(), sessionId: z.string(), title: z.string().optional() })).min(1).max(20),\n }),\n async (p) => {\n const proj = await svc.projects.get(p.projectId);\n if (!proj) throw new ApiError(\"not_found\", tr(\"err.projectMissing\"));\n const metas = [];\n for (const item of p.items) {\n const provider = getProvider(item.provider);\n if (!provider?.readHistory) continue;\n // Idempotent: reuse if the same providerSessionId was already imported\n const existing = (await svc.threads.list()).find(\n (t) => t.projectId === p.projectId && t.provider === item.provider && t.providerSessionId === item.sessionId,\n );\n if (existing) { metas.push(existing); continue; }\n const meta = await svc.threads.create({\n projectId: p.projectId,\n provider: item.provider,\n title: item.title,\n providerSessionId: item.sessionId,\n importedFrom: { provider: item.provider, sessionId: item.sessionId },\n });\n const events = await provider.readHistory(item.sessionId, proj.path).catch(() => []);\n for (const ev of events) {\n await svc.threads.appendEvent(meta.id, ev as Parameters<typeof svc.threads.appendEvent>[1]);\n }\n await svc.threads.patch(meta.id, { status: \"closed\" });\n gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: await svc.threads.get(meta.id) });\n metas.push(await svc.threads.get(meta.id));\n }\n return metas;\n }\n ));\n\n // ---- terminal.* (§7.5) ----\n gw.method(\"terminal.list\", wrap(z.object({ projectId: z.string().optional() }).passthrough().optional(), (p) =>\n svc.terminals.list(p?.projectId)\n ));\n\n gw.method(\"terminal.create\", wrap(\n z.object({ projectId: z.string(), cols: z.number().int().min(20).max(500).default(80), rows: z.number().int().min(5).max(200).default(24) }),\n async (p) => {\n const path = await projectPath(p.projectId);\n const r = await svc.terminals.create(p.projectId, path, p.cols, p.rows);\n if (\"error\" in r) throw new ApiError(\"bad_params\", r.error);\n return r;\n }\n ));\n\n gw.method(\"terminal.attach\", wrap(z.object({ id: z.string() }), async (p, ctx) => {\n const r = svc.terminals.attach(p.id);\n if (r.error || r.index == null) throw new ApiError(\"not_found\", r.error ?? tr(\"err.terminalMissing\"));\n // attach also subscribes to the terminal:<index> channel (input frames are gated on that subscription too)\n svc.gateway.subscribe(ctx.conn, `terminal:${r.index}`);\n return r;\n }));\n\n gw.method(\"terminal.resize\", wrap(z.object({ id: z.string(), cols: z.number().int(), rows: z.number().int() }), (p) =>\n svc.terminals.resize(p.id, p.cols, p.rows)\n ));\n\n gw.method(\"terminal.kill\", wrap(z.object({ id: z.string() }), (p) => svc.terminals.kill(p.id)));\n\n // ---- thread.* (runtime operations, need the manager) ----\n const needManager = () => {\n if (!svc.manager) throw new ApiError(\"unavailable\", tr(\"err.noManager\"));\n return svc.manager;\n };\n\n gw.method(\"thread.send\", wrap(\n z.object({\n id: z.string(),\n text: z.string(),\n attachments: z.array(z.object({ path: z.string(), mime: z.string(), name: z.string().optional() })).optional(),\n // 1.2: paths dragged from the Files panel, relative to the project (the daemon resolves and checks them)\n mentions: z.array(z.object({ rel: z.string().min(1).max(4096), isDir: z.boolean().optional() })).max(MAX_MENTIONS).optional(),\n behavior: z.enum([\"queue\", \"steer\"]).optional(),\n }),\n async (p) => {\n // delivered tells the composer what happened: a steer an Agent can't take is queued (B7)\n const delivered = await needManager().send(p.id, { text: p.text, attachments: p.attachments, mentions: p.mentions }, p.behavior ?? \"queue\");\n return { ok: true, delivered: delivered ?? \"started\" };\n }\n ));\n\n // The composer's queue list has a remove button; it used to call a method that didn't exist\n gw.method(\"thread.queueRemove\", wrap(z.object({ id: z.string(), queueId: z.string() }), async (p) => {\n return { ok: needManager().removeQueued(p.id, p.queueId) };\n }));\n\n gw.method(\"thread.interrupt\", wrap(z.object({ id: z.string() }), async (p) => {\n await needManager().interrupt(p.id);\n return { ok: true };\n }));\n\n gw.method(\"thread.respond\", wrap(\n z.object({\n id: z.string(),\n requestId: z.string(),\n optionId: z.string().optional(),\n answers: z.record(z.string(), z.string()).optional(),\n cancelled: z.boolean().optional(),\n }),\n async (p) => {\n await needManager().respond(p.id, p.requestId, { optionId: p.optionId, answers: p.answers, cancelled: p.cancelled });\n return { ok: true };\n }\n ));\n\n gw.method(\"thread.setModel\", wrap(z.object({ id: z.string(), model: z.string().nullable() }), async (p) => {\n await needManager().setModel(p.id, p.model);\n return { ok: true };\n }));\n\n gw.method(\"thread.setMode\", wrap(z.object({ id: z.string(), mode: threadModeSchema }), async (p) => {\n await needManager().setMode(p.id, p.mode);\n return { ok: true };\n }));\n\n gw.method(\"thread.setEffort\", wrap(z.object({ id: z.string(), effort: z.string().nullable() }), async (p) => {\n await needManager().setEffort(p.id, p.effort);\n return { ok: true };\n }));\n\n gw.method(\"thread.commands\", wrap(z.object({ id: z.string(), load: z.boolean().optional() }), async (p) => {\n const commands = await needManager().listCommands(p.id, { load: p.load });\n return { commands };\n }));\n\n gw.method(\"thread.setCursorOpts\", wrap(\n z.object({\n id: z.string(),\n cursorFast: z.boolean().optional(),\n cursorAutoReview: z.boolean().optional(),\n }),\n async (p) => {\n await needManager().setCursorOpts(p.id, {\n cursorFast: p.cursorFast,\n cursorAutoReview: p.cursorAutoReview,\n });\n return { ok: true };\n },\n ));\n\n gw.method(\"thread.setProvider\", wrap(z.object({ id: z.string(), provider: z.string().min(1) }), async (p) => {\n await needManager().setProvider(p.id, p.provider);\n return { ok: true };\n }));\n\n gw.method(\"thread.close\", wrap(z.object({ id: z.string() }), async (p) => {\n await needManager().close(p.id);\n return { ok: true };\n }));\n\n // ---- thread.exportMarkdown (P2-7): persisted events → Markdown text ----\n gw.method(\"thread.exportMarkdown\", wrap(z.object({ id: z.string() }), async (p) => {\n const meta = await svc.threads.get(p.id);\n if (!meta) throw new ApiError(\"not_found\", tr(\"err.threadMissing\"));\n const events = await svc.threads.readEvents(p.id, 0, 20000);\n const L: string[] = [];\n L.push(`# ${meta.title}`, \"\");\n L.push(`> ${meta.provider} · ${meta.model ?? tr(\"export.defaultModel\")} · ${meta.mode} · ${new Date(meta.createdAt).toLocaleString(intlLocale())}`, \"\");\n for (const e of events) {\n switch (e.type) {\n case \"user_message\": {\n const refs = e.mentions?.length ? \"\\n\\n\" + e.mentions.map((m) => `- \\`${m.path}${m.isDir ? \"/\" : \"\"}\\``).join(\"\\n\") : \"\";\n L.push(`**${tr(\"export.me\")}**${e.steered ? tr(\"export.steered\") : \"\"}:\\n\\n${e.text}${refs}`, \"\");\n break;\n }\n case \"assistant_message\": L.push(e.text, \"\"); break;\n case \"reasoning\": L.push(`<details><summary>${tr(\"export.reasoning\")}</summary>\\n\\n${e.text}\\n</details>`, \"\"); break;\n case \"tool_call\": {\n const icon = e.status === \"ok\" ? \"✓\" : e.status === \"failed\" ? \"✗\" : \"…\";\n L.push(`- \\`${e.kind}\\` ${icon} ${e.title}${e.output ? `\\n \\`\\`\\`\\n ${e.output.slice(0, 2000)}\\n \\`\\`\\`` : \"\"}`);\n break;\n }\n case \"plan\": L.push(`### ${tr(\"export.plan\")}\\n\\n` + e.markdown, \"\"); break;\n case \"todo\": L.push(`### ${tr(\"export.todo\")}\\n\\n` + e.items.map((i) => `- [${i.status === \"done\" || i.status === \"completed\" ? \"x\" : \" \"}] ${i.text}`).join(\"\\n\"), \"\"); break;\n case \"notice\": L.push(`_${e.message}_`, \"\"); break;\n case \"turn_ended\": L.push(`— ${e.status}${e.durationMs ? ` · ${Math.round(e.durationMs / 1000)}s` : \"\"}${e.error ? ` · ${e.error}` : \"\"} —`, \"\"); break;\n default: break;\n }\n }\n const markdown = L.join(\"\\n\");\n const safe = meta.title.replace(/[\\\\/:*?\"<>|\\s]+/g, \"_\").slice(0, 60) || \"thread\";\n const filename = `${safe}.md`;\n // ~/Downloads when it can be used, else <data>/exports (B21); the file is revealed with execFile (no shell)\n let dir = join(homedir(), \"Downloads\");\n try {\n await mkdir(dir, { recursive: true });\n } catch {\n dir = join(svc.cfg.dataDir, \"exports\");\n await mkdir(dir, { recursive: true });\n }\n let dest = join(dir, filename);\n if (existsSync(dest)) {\n const stamp = new Date().toISOString().replace(/[:.]/g, \"-\").slice(0, 19);\n dest = join(dir, `${safe}-${stamp}.md`);\n }\n await writeFile(dest, markdown, \"utf8\");\n revealInFileManager(dest);\n return { markdown, filename, path: dest };\n }));\n}\n\nfunction revealInFileManager(filePath: string): void {\n if (process.platform === \"win32\") {\n execFile(\"explorer.exe\", [\"/select,\" + win32Path.normalize(filePath)], { windowsHide: true }, () => {}).on(\"error\", () => {});\n return;\n }\n if (process.platform === \"darwin\") {\n execFile(\"open\", [\"-R\", filePath], () => {}).on(\"error\", () => {});\n return;\n }\n execFile(\"xdg-open\", [dirname(filePath)], () => {}).on(\"error\", () => {});\n}\n","// Atomic JSON write: temp file + rename. On fs failure throws an ApiError with a Chinese message (P5-2: disk write failure notice).\nimport { writeFile, rename, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { ApiError } from \"../ws/methods.js\";\n\nexport async function writeJsonAtomic(file: string, obj: unknown): Promise<void> {\n try {\n await mkdir(dirname(file), { recursive: true });\n const tmp = `${file}.tmp-${process.pid}-${Math.random().toString(36).slice(2, 8)}`;\n await writeFile(tmp, JSON.stringify(obj, null, 2), \"utf8\");\n await rename(tmp, file);\n } catch (e) {\n if (e instanceof ApiError) throw e;\n throw new ApiError(\"io_error\", `写入数据失败(${file}):${(e as Error)?.message ?? e}`);\n }\n}\n","// settings.json: defaults per EXEC §5.6; unknown fields are preserved on read.\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport { writeJsonAtomic } from \"../util/atomic.js\";\n\nexport type Settings = {\n defaultProvider: string;\n defaultMode: \"plan\" | \"default\" | \"acceptEdits\" | \"bypassPermissions\" | \"ask\";\n sendKey: \"enter\" | \"ctrlEnter\";\n runningSend: \"queue\" | \"steer\";\n showThinking: boolean;\n theme: \"auto\" | \"light\" | \"dark\";\n /** 1.2: width of the conversation column */\n contentWidth: ContentWidth;\n /** 1.2: chat text size in px (timeline, composer; code 1px smaller) */\n chatFontSize: number;\n idleCloseMinutes: number;\n collapsedProjects: string[];\n panel: { open: boolean; tab: string; width: number };\n sidebarWidth: number;\n /** 1.2: the sidebar column is collapsed (wide windows) */\n sidebarHidden?: boolean;\n lastProjectId: string | null;\n lastThreadId: string | null;\n recentDirs?: string[];\n v1Migrated?: boolean;\n /** false = turned off by the user in settings; absent means on */\n providerEnabled?: Record<string, boolean>;\n /** Advanced: override how a Provider is launched (executable + args array, no shell) */\n providerCommand?: Record<string, { executable?: string; args?: string[] }>;\n [k: string]: unknown;\n};\n\nexport const CONTENT_WIDTHS = [\"narrow\", \"default\", \"wide\", \"full\"] as const;\nexport type ContentWidth = (typeof CONTENT_WIDTHS)[number];\nexport const CHAT_FONT_MIN = 12;\nexport const CHAT_FONT_MAX = 18;\nexport const CHAT_FONT_DEFAULT = 13;\n\nexport const DEFAULT_SETTINGS: Settings = {\n defaultProvider: \"claude\",\n defaultMode: \"default\",\n sendKey: \"enter\",\n runningSend: \"queue\",\n showThinking: true,\n theme: \"auto\",\n contentWidth: \"default\",\n chatFontSize: CHAT_FONT_DEFAULT,\n idleCloseMinutes: 30,\n collapsedProjects: [],\n panel: { open: false, tab: \"changes\", width: 440 },\n sidebarWidth: 248,\n lastProjectId: null,\n lastThreadId: null,\n recentDirs: [],\n};\n\nexport const IDLE_CLOSE_MIN = 5;\nexport const IDLE_CLOSE_MAX = 240;\n\nconst mode = z.enum([\"plan\", \"default\", \"acceptEdits\", \"bypassPermissions\", \"ask\"]);\nconst id = z.string().min(1).max(200);\n/** B18: what settings.set accepts. Every key the UI writes is listed; anything else or a wrong type is refused. */\nexport const settingsPatchSchema = z\n .object({\n defaultProvider: z.string().min(1).max(64),\n defaultMode: mode,\n sendKey: z.enum([\"enter\", \"ctrlEnter\"]),\n runningSend: z.enum([\"queue\", \"steer\"]),\n showThinking: z.boolean(),\n // auto = follow the host: Magpie's light/dark inside Magpie, the OS outside it\n theme: z.enum([\"auto\", \"light\", \"dark\"]),\n contentWidth: z.enum(CONTENT_WIDTHS),\n chatFontSize: z.number().int().min(CHAT_FONT_MIN).max(CHAT_FONT_MAX),\n idleCloseMinutes: z.number().int().min(IDLE_CLOSE_MIN).max(IDLE_CLOSE_MAX),\n collapsedProjects: z.array(id).max(1000),\n panel: z.object({ open: z.boolean(), tab: z.string().max(40), width: z.number().min(0).max(5000) }).partial(),\n sidebarWidth: z.number().min(0).max(5000),\n sidebarHidden: z.boolean(),\n lastProjectId: id.nullable(),\n lastThreadId: id.nullable(),\n recentDirs: z.array(z.string().max(4096)).max(50),\n providerEnabled: z.record(z.string().max(64), z.boolean()),\n providerCommand: z.record(\n z.string().max(64),\n z.object({ executable: z.string().max(4096).optional(), args: z.array(z.string().max(4096)).max(64).optional() }).strict(),\n ),\n v1Migrated: z.boolean(),\n })\n .partial()\n .strict();\n\nexport type SettingsPatch = z.infer<typeof settingsPatchSchema>;\n\n/** Validate a patch from the page; returns the parsed patch or a readable error. */\nexport function parseSettingsPatch(patch: unknown): { ok: true; patch: SettingsPatch } | { ok: false; error: string } {\n const r = settingsPatchSchema.safeParse(patch);\n if (r.success) return { ok: true, patch: r.data };\n return {\n ok: false,\n error: r.error.issues.map((i) => `${i.path.join(\".\") || \"(patch)\"}: ${i.message}`).join(\"; \"),\n };\n}\n\n/** Values in settings.json that have the wrong type (hand edits, older builds) fall back to the default; unknown keys are kept. */\nexport function sanitizeStored(raw: Record<string, unknown>): Record<string, unknown> {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return {};\n const shape = settingsPatchSchema.shape as Record<string, z.ZodType>;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(raw)) {\n const field = shape[k];\n if (field && k !== \"idleCloseMinutes\" && !field.safeParse(v).success) continue;\n if (k === \"idleCloseMinutes\") {\n const n = Number(v);\n if (!Number.isFinite(n)) continue;\n out[k] = Math.min(IDLE_CLOSE_MAX, Math.max(IDLE_CLOSE_MIN, Math.round(n)));\n continue;\n }\n out[k] = v;\n }\n return out;\n}\n\nexport class SettingsStore {\n private file: string;\n private cache: Settings | null = null;\n private writing: Promise<void> = Promise.resolve();\n constructor(dataDir: string) {\n this.file = join(dataDir, \"settings.json\");\n }\n async get(): Promise<Settings> {\n if (this.cache) return this.cache;\n let raw: Record<string, unknown> = {};\n try {\n raw = JSON.parse(await readFile(this.file, \"utf8\"));\n } catch {}\n raw = sanitizeStored(raw);\n this.cache = { ...DEFAULT_SETTINGS, ...raw, panel: { ...DEFAULT_SETTINGS.panel, ...(raw.panel as object | undefined) } };\n return this.cache;\n }\n async set(patch: Partial<Settings>): Promise<Settings> {\n const cur = await this.get();\n const next = { ...cur, ...patch, panel: { ...cur.panel, ...(patch.panel as object | undefined) } };\n this.cache = next;\n const snap = next;\n this.writing = this.writing.then(() => writeJsonAtomic(this.file, snap));\n await this.writing;\n return next;\n }\n}\n","// JSONL read/write: serialized appends, corrupt lines skipped. Write failures throw an ApiError with a Chinese message (P5-2: disk write failure notice).\nimport { appendFile, readFile, mkdir, rename, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { ApiError } from \"../ws/methods.js\";\n\nexport async function readJsonl<T = unknown>(file: string): Promise<T[]> {\n let text = \"\";\n try {\n text = await readFile(file, \"utf8\");\n } catch {\n return [];\n }\n const out: T[] = [];\n for (const line of text.split(\"\\n\")) {\n const t = line.trim();\n if (!t) continue;\n try {\n out.push(JSON.parse(t) as T);\n } catch {\n // Skip corrupt lines\n }\n }\n return out;\n}\n\n// One serialized write queue per file to keep append order.\nconst writers = new Map<string, Promise<void>>();\n\nexport function appendJsonl(file: string, obj: unknown): Promise<void> {\n const prev = writers.get(file) ?? Promise.resolve();\n const next = prev.then(async () => {\n try {\n await mkdir(dirname(file), { recursive: true });\n await appendFile(file, JSON.stringify(obj) + \"\\n\", \"utf8\");\n } catch (e) {\n if (e instanceof ApiError) throw e;\n throw new ApiError(\"io_error\", `写入数据失败(${file}):${(e as Error)?.message ?? e}`);\n }\n });\n writers.set(\n file,\n next.catch(() => {})\n );\n return next;\n}\n\n// Full rewrite (rare path, e.g. cleanup)\nexport async function writeJsonl(file: string, items: unknown[]): Promise<void> {\n try {\n await mkdir(dirname(file), { recursive: true });\n const tmp = file + \".tmp-\" + process.pid;\n await writeFile(tmp, items.map((o) => JSON.stringify(o)).join(\"\\n\") + (items.length ? \"\\n\" : \"\"), \"utf8\");\n await rename(tmp, file);\n } catch (e) {\n if (e instanceof ApiError) throw e;\n throw new ApiError(\"io_error\", `写入数据失败(${file}):${(e as Error)?.message ?? e}`);\n }\n}\n","// Legacy data migration (§10.1): runs once when the daemon starts.\n// Old: sessions/<id>/{meta.json,events.jsonl} + projects in settings.json →\n// New: projects.json + threads/<id>/{meta.json,timeline.jsonl}. Old files are read-only and copied to trash/legacy-<ts>/ as a backup.\nimport { cp, mkdir, readdir, readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { SettingsStore } from \"../store/settings.js\";\nimport type { ProjectsStore } from \"../store/projects.js\";\nimport type { ThreadsStore, ThreadMeta } from \"../store/threads.js\";\nimport type { Mode, TimelineEvent } from \"../timeline/types.js\";\nimport { appendJsonl } from \"../util/jsonl.js\";\nimport { writeJsonAtomic } from \"../util/atomic.js\";\nimport { validId } from \"../util/paths.js\";\nimport { log } from \"../log.js\";\n\ntype OldMeta = {\n id: string; agent: string; cwd: string; model: string; permission: string;\n title: string; titleAuto: boolean; pinned: boolean; cliSessionId: string | null;\n created: number; updated: number; lastStatus?: string; totalCost?: number; totalUsage?: { inputTokens?: number; outputTokens?: number; cacheReadTokens?: number } | null;\n};\ntype OldEvt = Record<string, unknown> & { type: string; seq?: number; ts?: number };\n\nconst SKIP_TITLE = /^\\/(slow|deny|error|long|codex)/;\nconst MODE_MAP: Record<string, Mode> = {\n plan: \"plan\", default: \"default\", acceptEdits: \"acceptEdits\", bypassPermissions: \"bypassPermissions\",\n auto: \"acceptEdits\", full: \"bypassPermissions\",\n};\nconst belongsTo = (cwd: string, parent: string) => {\n const c = cwd.replace(/\\\\/g, \"/\").toLowerCase().replace(/\\/+$/, \"\");\n const p = parent.replace(/\\\\/g, \"/\").toLowerCase().replace(/\\/+$/, \"\");\n return c === p || c.startsWith(p + \"/\");\n};\n\nfunction stamp(): string {\n const d = new Date();\n const p = (n: number) => String(n).padStart(2, \"0\");\n return `${d.getFullYear()}${p(d.getMonth() + 1)}${p(d.getDate())}-${p(d.getHours())}${p(d.getMinutes())}`;\n}\n\nexport async function migrateLegacy(dataDir: string, stores: {\n settings: SettingsStore; projects: ProjectsStore; threads: ThreadsStore;\n}): Promise<{ migrated: number; skipped: boolean }> {\n const settings = await stores.settings.get();\n if (settings.v1Migrated) return { migrated: 0, skipped: true };\n const oldDir = join(dataDir, \"sessions\");\n const oldSettingsPath = join(dataDir, \"settings.json\");\n if (!existsSync(oldDir) && !existsSync(oldSettingsPath)) {\n await stores.settings.set({ v1Migrated: true });\n return { migrated: 0, skipped: true };\n }\n\n // 1. Backup\n const backup = join(dataDir, \"trash\", `legacy-${stamp()}`);\n await mkdir(backup, { recursive: true });\n if (existsSync(oldDir)) await cp(oldDir, join(backup, \"sessions\"), { recursive: true }).catch(() => {});\n if (existsSync(oldSettingsPath)) await cp(oldSettingsPath, join(backup, \"settings.json\")).catch(() => {});\n\n // Read the old settings (read the file directly; SettingsStore already loaded the same path, the fields coexist without conflict)\n const oldSettings = existsSync(oldSettingsPath)\n ? (JSON.parse(await readFile(oldSettingsPath, \"utf8\").catch(() => \"{}\")) as Record<string, unknown>)\n : {};\n\n // 2. Projects: old settings.projects → projects.json; orphan cwds are added per the adoptOrphans rule\n const projectIdByPath = new Map<string, string>();\n const lc = (p: string) => p.replace(/\\\\/g, \"/\").toLowerCase().replace(/\\/+$/, \"\");\n for (const p of (oldSettings.projects as { name?: string; path?: string }[] | undefined) ?? []) {\n if (!p?.path) continue;\n try {\n const proj = await stores.projects.create(p.path, p.name);\n projectIdByPath.set(lc(proj.path), proj.id);\n } catch (e) {\n log(\"warn\", \"迁移:建项目失败\", { path: p.path, err: String(e) });\n }\n }\n\n // Old session list\n let sessionIds: string[] = [];\n try {\n sessionIds = (await readdir(oldDir)).filter((d) => validId(d) && existsSync(join(oldDir, d, \"meta.json\")));\n } catch {}\n const metas: OldMeta[] = [];\n for (const id of sessionIds) {\n try {\n const m = JSON.parse(await readFile(join(oldDir, id, \"meta.json\"), \"utf8\")) as OldMeta;\n if (m?.cwd) metas.push(m);\n } catch {}\n }\n // Orphan cwd → add a project (subdirectories fold into their parent)\n const extraDirs: string[] = [];\n const projPaths = [...projectIdByPath.keys()];\n for (const m of metas) {\n const covered = projPaths.some((pp) => belongsTo(m.cwd, pp)) || extraDirs.some((d) => belongsTo(m.cwd, d));\n if (covered) continue;\n for (let i = extraDirs.length - 1; i >= 0; i--) if (belongsTo(extraDirs[i], m.cwd)) extraDirs.splice(i, 1);\n extraDirs.push(m.cwd);\n }\n for (const d of extraDirs) {\n if (!existsSync(d)) continue; // Skip directories that no longer exist (same as the old adoptOrphans)\n try {\n const name = d.replace(/\\\\/g, \"/\").split(\"/\").filter(Boolean).pop() ?? d;\n const proj = await stores.projects.create(d, name);\n projectIdByPath.set(lc(proj.path), proj.id);\n projPaths.push(lc(proj.path));\n } catch (e) {\n log(\"warn\", \"迁移:补建孤儿项目失败\", { path: d, err: String(e) });\n }\n }\n\n const projectOf = (cwd: string): string | null => {\n const l = lc(cwd);\n // Take the longest match (a subdirectory joins the most specific project)\n let best: string | null = null;\n for (const [pp, id] of projectIdByPath) {\n if (belongsTo(l, pp) && (best == null || pp.length > best.length)) best = pp;\n }\n return best ? projectIdByPath.get(best)! : null;\n };\n\n // 3. Sessions\n let migrated = 0;\n const threadsDir = join(dataDir, \"threads\");\n for (const m of metas) {\n try {\n const projectId = projectOf(m.cwd);\n if (!projectId) { log(\"warn\", \"迁移:无项目可归,跳过\", { id: m.id, cwd: m.cwd }); continue; }\n const testTitle = SKIP_TITLE.test(m.title ?? \"\") || m.title === \"默认剧本演示\";\n const provider = m.agent === \"claude\" || m.agent === \"codex\" ? m.agent : \"mock\";\n const archived = testTitle || (m.agent !== \"claude\" && m.agent !== \"codex\");\n const now = Date.now();\n const meta: ThreadMeta = {\n id: `t_${m.id.replace(/^s?_?/, \"\")}`.slice(0, 80),\n projectId,\n title: m.title || \"旧对话\",\n titleAuto: false,\n provider,\n model: m.model || null,\n mode: MODE_MAP[m.permission] ?? \"default\",\n effort: null,\n providerSessionId: m.cliSessionId || null,\n status: \"closed\",\n pinned: !!m.pinned,\n archived,\n createdAt: m.created || now,\n updatedAt: m.updated || now,\n lastTurnStatus: m.lastStatus === \"ok\" ? \"completed\" : m.lastStatus === \"error\" ? \"failed\" : null,\n usage: {\n inputTokens: m.totalUsage?.inputTokens ?? 0,\n outputTokens: m.totalUsage?.outputTokens ?? 0,\n cacheReadTokens: m.totalUsage?.cacheReadTokens ?? 0,\n costUsd: m.totalCost ?? 0,\n },\n importedFrom: m.cliSessionId ? { provider, sessionId: m.cliSessionId } : undefined,\n seq: 0,\n };\n const tdir = join(threadsDir, meta.id);\n if (existsSync(tdir)) meta.id = `t_${m.id}_v1`.slice(0, 80);\n await mkdir(join(threadsDir, meta.id), { recursive: true });\n\n // Event mapping\n const oldEvts = (await readFile(join(oldDir, m.id, \"events.jsonl\"), \"utf8\").catch(() => \"\"))\n .split(\"\\n\").filter((l) => l.trim())\n .map((l) => { try { return JSON.parse(l) as OldEvt; } catch { return null; } })\n .filter((x): x is OldEvt => !!x);\n const lines: TimelineEvent[] = [];\n const openTools = new Map<string, { kind: string; title: string; input?: unknown; detail?: unknown }>();\n let seq = 0;\n const push = (ev: Record<string, unknown> & { type: TimelineEvent[\"type\"] }) => {\n seq++;\n lines.push({ ...ev, seq, ts: Date.now(), threadId: meta.id } as TimelineEvent);\n };\n for (const e of oldEvts) {\n switch (e.type) {\n case \"user\": push({ type: \"user_message\", text: String(e.text ?? \"\") }); break;\n case \"text\": push({ type: \"assistant_message\", itemId: `lg_${seq}`, text: String(e.text ?? \"\") }); break;\n case \"thinking\": push({ type: \"reasoning\", itemId: `lg_${seq}`, text: String(e.text ?? \"\") }); break;\n case \"tool.call\": {\n const key = String(e.itemId ?? e.callId ?? `c${seq}`);\n openTools.set(key, { kind: String(e.kind ?? \"other\"), title: String(e.title ?? e.kind ?? \"工具\"), input: e.input, detail: e.detail });\n push({ type: \"tool_call\", itemId: key, kind: \"other\", title: String(e.title ?? \"工具\"), status: \"running\", input: e.input, detail: e.detail });\n break;\n }\n case \"tool.result\": {\n const key = String(e.itemId ?? e.callId ?? `c${seq}`);\n const open = openTools.get(key);\n openTools.delete(key);\n push({\n type: \"tool_call\", itemId: key,\n kind: (open?.kind ?? \"other\") as import(\"../timeline/types.js\").ToolKind,\n title: open?.title ?? \"工具\",\n status: e.ok === false || e.error ? \"failed\" : \"ok\",\n output: typeof e.output === \"string\" ? e.output.slice(0, 20000) : undefined,\n detail: open?.detail,\n } as Record<string, unknown> & { type: \"tool_call\" });\n break;\n }\n case \"todo\": {\n const items = (e.items as { text?: string; status?: string }[] | undefined) ?? [];\n push({ type: \"todo\", items: items.map((i) => ({ text: String(i.text ?? \"\"), status: i.status === \"done\" ? \"done\" : i.status === \"in_progress\" ? \"in_progress\" : \"todo\" })) });\n break;\n }\n case \"permission.denied\": push({ type: \"notice\", level: \"warn\", message: `已拒绝:${String(e.title ?? e.kind ?? \"\")}` }); break;\n case \"permission.request\": case \"permission.resolved\": break; // Old permission cards are stale; don't recreate them\n case \"notice\": push({ type: \"notice\", level: (e.level as \"info\" | \"warn\" | \"error\") ?? \"info\", message: String(e.message ?? \"\") }); break;\n case \"run.end\": {\n const u = e.usage as { inputTokens?: number; outputTokens?: number; cacheReadTokens?: number } | undefined;\n if (u) push({ type: \"usage\", turnId: `lg_t${seq}`, inputTokens: u.inputTokens ?? 0, outputTokens: u.outputTokens ?? 0, cacheReadTokens: u.cacheReadTokens ?? 0, costUsd: (e.costUsd as number) ?? 0 });\n push({ type: \"turn_ended\", turnId: `lg_t${seq}`, status: e.status === \"error\" ? \"failed\" : e.status === \"interrupted\" ? \"interrupted\" : \"completed\", durationMs: (e.ms as number) ?? undefined, error: e.error as string | undefined });\n break;\n }\n case \"run.start\": break;\n case \"init\": break;\n default: break;\n }\n }\n // Unclosed tool.call → mark failed\n for (const [key, o] of openTools) {\n seq++;\n lines.push({ type: \"tool_call\", itemId: key, kind: \"other\", title: o.title, status: \"failed\", seq, ts: Date.now(), threadId: meta.id } as TimelineEvent);\n }\n for (const ev of lines) await appendJsonl(join(threadsDir, meta.id, \"timeline.jsonl\"), ev);\n meta.seq = seq;\n await writeJsonAtomic(join(threadsDir, meta.id, \"meta.json\"), meta);\n migrated++;\n } catch (e) {\n log(\"warn\", \"迁移:会话失败\", { id: m.id, err: String(e) });\n }\n }\n\n // 4. Merge settings (UI preference fields only)\n const patch: Record<string, unknown> = { v1Migrated: true };\n if (typeof oldSettings.theme === \"string\") patch.theme = oldSettings.theme;\n if (typeof oldSettings.sendKey === \"string\") patch.sendKey = oldSettings.sendKey;\n if (typeof oldSettings.showThinking === \"boolean\") patch.showThinking = oldSettings.showThinking;\n if (typeof oldSettings.defaultAgent === \"string\") patch.defaultProvider = oldSettings.defaultAgent === \"claude\" || oldSettings.defaultAgent === \"codex\" ? oldSettings.defaultAgent : \"claude\";\n if (typeof oldSettings.defaultPermission === \"string\") patch.defaultMode = MODE_MAP[oldSettings.defaultPermission] ?? \"default\";\n await stores.settings.set(patch);\n\n log(\"info\", `旧数据迁移完成:${migrated} 个会话、${projectIdByPath.size} 个项目,备份在 ${backup}`);\n return { migrated, skipped: false };\n}\n","// Startup warm-up: for enabled, non-planned Providers, detect then fetch models; results go into infoCache.\nimport type { Settings } from \"../store/settings.js\";\nimport { listProviders } from \"./registry.js\";\nimport { catalogById } from \"./catalog.js\";\nimport { isProviderEnabled } from \"./enabled.js\";\nimport { cachedDetect, cachedModels } from \"./infoCache.js\";\n\nexport async function warmProviderCache(settings: Settings): Promise<void> {\n await Promise.all(\n listProviders().map(async (p) => {\n if (!isProviderEnabled(settings, p.id) || catalogById(p.id)?.status === \"planned\") return;\n const det = await cachedDetect(p);\n if (det.available) await cachedModels(p);\n }),\n );\n}\n","// Daemon entry: parse arguments, initialize services, start HTTP+WS, write daemon.json, handle exit.\nimport { mkdirSync, existsSync, rmSync, chmodSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parseConfig } from \"./config.js\";\nimport { initLog, log } from \"./log.js\";\nimport { createHttpServer } from \"./http.js\";\nimport { AttachmentStore } from \"./store/attachments.js\";\nimport { SettingsStore } from \"./store/settings.js\";\nimport { ProjectsStore } from \"./store/projects.js\";\nimport { ThreadsStore } from \"./store/threads.js\";\nimport { Gateway } from \"./ws/gateway.js\";\nimport { registerMethods } from \"./ws/methods.js\";\nimport { writeJsonAtomic } from \"./util/atomic.js\";\nimport { initProviders } from \"./providers/registry.js\";\nimport { AgentManager } from \"./agents/manager.js\";\nimport { GitService } from \"./git/service.js\";\nimport { FileService } from \"./files/service.js\";\nimport { TerminalService } from \"./terminal/service.js\";\nimport { augmentPath, pidAlive } from \"./util/proc.js\";\nimport { PreviewProxy } from \"./preview/proxy.js\";\nimport { previewDeniedPorts } from \"./preview/ports.js\";\n\n// The bundle targets node20: an older Node (or being started by Bun by mistake) gets a clear message instead of crashing on some API\nconst nodeMajor = Number(/^v?(\\d+)/.exec(process.versions.node ?? \"\")?.[1] ?? 0);\nif (nodeMajor < 20) {\n console.error(`[agent-console] 需要 Node.js 20 或更高版本,当前 ${process.version}(${process.execPath})`);\n process.exit(3);\n}\n\n// Agent CLI .js entries and the Claude SDK look up \"node\" by name; GUI apps launched from the macOS Dock get a minimal PATH,\n// so append the current node's directory and common install directories to PATH (existing order unchanged)\nprocess.env.PATH = augmentPath(process.env, dirname(process.execPath));\n\nconst cfg = parseConfig(process.argv.slice(2));\n\n// Top-level safety net: log, don't exit\nprocess.on(\"uncaughtException\", (e) => {\n // A console write after the host's pipe closed (EPIPE) is expected while exiting, not a crash worth logging\n if ((e as NodeJS.ErrnoException)?.code === \"EPIPE\") return;\n log(\"error\", \"uncaughtException\", { err: String(e?.stack ?? e) });\n});\nprocess.on(\"unhandledRejection\", (e) => {\n log(\"error\", \"unhandledRejection\", { err: String(e) });\n});\n\nasync function main(): Promise<void> {\n initLog(cfg.dataDir);\n for (const d of [\"threads\", \"attachments\", \"trash\", \"logs\"]) {\n mkdirSync(join(cfg.dataDir, d), { recursive: true });\n }\n\n const appDir = join(dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"app\");\n const attachments = new AttachmentStore(join(cfg.dataDir, \"attachments\"));\n const { bindAttachmentStore } = await import(\"./util/attachmentRefs.js\");\n bindAttachmentStore(attachments);\n const settings = new SettingsStore(cfg.dataDir);\n const projects = new ProjectsStore(cfg.dataDir);\n const threads = new ThreadsStore(cfg.dataDir);\n const gateway = new Gateway(cfg);\n\n initProviders(cfg.version);\n // Legacy data migration (§10.1): runs once, skipped after v1Migrated; old files are read-only\n const { migrateLegacy } = await import(\"./migrate/legacy.js\");\n try {\n await migrateLegacy(cfg.dataDir, { settings, projects, threads });\n } catch (e) {\n log(\"error\", \"旧数据迁移失败\", { err: String(e) });\n }\n const manager = new AgentManager(gateway, threads, projects, settings, attachments);\n await manager.recoverOnStart();\n const terminals = new TerminalService(gateway);\n const preview = new PreviewProxy({\n deniedPorts: () => previewDeniedPorts(cfg),\n log: (level, msg) => log(level, msg),\n });\n // Last page gone → no preview frame is left to use the proxies\n gateway.onConnectionClosed = (left) => { if (left === 0) preview.closeAll(); };\n registerMethods(gateway, {\n cfg,\n settings,\n gateway,\n projects,\n threads,\n manager,\n git: new GitService(),\n files: new FileService(),\n terminals,\n preview,\n runtime: (id) => manager.runtimeInfo(id),\n });\n\n const server = createHttpServer(cfg, appDir, attachments, {\n onUpgrade: (req, socket, head) => gateway.handleUpgrade(req, socket, head),\n });\n\n // Retry 5 times if the port is in use\n let attempts = 0;\n await new Promise<void>((resolveListen, rejectListen) => {\n const tryListen = () => {\n attempts++;\n server.once(\"error\", (e: NodeJS.ErrnoException) => {\n if (e.code === \"EADDRINUSE\" && attempts < 6) {\n log(\"warn\", `端口 ${cfg.port} 被占用,500ms 后重试(第 ${attempts} 次)`);\n setTimeout(tryListen, 500);\n } else {\n rejectListen(e);\n }\n });\n server.listen(cfg.port, \"127.0.0.1\");\n };\n server.once(\"listening\", () => resolveListen());\n tryListen();\n }).catch((e) => {\n log(\"error\", `端口 ${cfg.port} 无法监听`, { err: String(e) });\n process.exit(2);\n });\n\n // --port 0: after listening on a random port, write the actual port back into cfg.port. Host/Origin checks read cfg.port,\n // and no request can arrive before this (listen has only just completed), so there is no window checking against the old port.\n const bound = server.address();\n if (bound && typeof bound === \"object\") cfg.port = bound.port;\n // Ready line: the plugin host reads this line from stdout to learn the actual port (port and pid only, no token)\n process.stdout.write(JSON.stringify({ agentConsoleReady: true, port: cfg.port, pid: process.pid }) + \"\\n\");\n // Background warm-up: after start, pull detection/models for enabled providers into the cache so the first page open doesn't wait\n void (async () => {\n const { warmProviderCache } = await import(\"./providers/warm.js\");\n await warmProviderCache(await settings.get());\n })().catch((e) => log(\"warn\", \"Provider 预热失败\", { err: String(e) }));\n\n const daemonJsonPath = join(cfg.dataDir, \"daemon.json\");\n await writeJsonAtomic(daemonJsonPath, {\n pid: process.pid,\n port: cfg.port,\n token: cfg.token,\n version: cfg.version,\n buildStamp: cfg.buildStamp,\n startedAt: Date.now(),\n });\n chmodSync(daemonJsonPath, 0o600);\n log(\"info\", `daemon 已启动 端口 ${cfg.port} 数据目录 ${cfg.dataDir} 版本 ${cfg.version} pid ${process.pid}`);\n // Standalone dev mode: print the open URL with the token to the console (console only, never the log file)\n // B20: standalone (dev) runs only: the token goes to an interactive terminal, never to a redirected stdout or a log\n if (!cfg.parentPid) {\n console.log(process.stdout.isTTY\n ? `[agent-console] open http://127.0.0.1:${cfg.port}/#t=${cfg.token}`\n : `[agent-console] listening on http://127.0.0.1:${cfg.port}/ (token not printed: stdout is not a terminal)`);\n }\n\n // Idle exit: check every minute; no WS connection + no running conversation + no open terminal → exit after idleExitMinutes\n let idleSince = Date.now();\n setInterval(() => {\n const busy = gateway.connectionCount > 0 || manager.anyBusy() || terminals.count > 0;\n if (busy) idleSince = Date.now();\n if (Date.now() - idleSince > cfg.idleExitMinutes * 60 * 1000) {\n log(\"info\", \"空闲超时,daemon 退出\");\n shutdown(0);\n }\n }, 60 * 1000).unref();\n\n let shuttingDown = false;\n function shutdown(code: number): void {\n if (shuttingDown) return;\n shuttingDown = true;\n log(\"info\", \"daemon 关闭中\");\n terminals.killAll();\n preview.closeAll();\n gateway.closeAll();\n try {\n rmSync(daemonJsonPath, { force: true });\n } catch {}\n // Wait for Agent sessions to close cleanly (at most 2.5 s) before exiting; process trees still alive are cleaned up by util/bin's exit hook\n const sessionsClosed = Promise.race([manager.shutdown(), new Promise((r) => setTimeout(r, 2500))]);\n void sessionsClosed.then(() => server.close(() => process.exit(code)));\n setTimeout(() => process.exit(code), 4000).unref();\n }\n process.on(\"SIGINT\", () => shutdown(0));\n process.on(\"SIGTERM\", () => shutdown(0));\n // Lifeline: when spawned by the plugin host (Magpie's Bun plugin process) we get --parent-pid, and stdin is a pipe the host holds.\n // Host exits (normally or killed) → pipe closes → stdin end/close → exit;\n // also check every 2 seconds whether the parent is still alive, in case stdin was inherited by another process and never closed.\n // Not enabled in standalone dev mode (npm run dev, no --parent-pid); there we rely on idle exit only.\n if (cfg.parentPid) {\n const parentPid = cfg.parentPid;\n const parentWatch = setInterval(() => {\n if (!pidAlive(parentPid)) {\n clearInterval(parentWatch);\n log(\"info\", `父进程 ${parentPid} 已退出,daemon 跟随退出`);\n shutdown(0);\n }\n }, 2000);\n parentWatch.unref();\n // Logged so a daemon that went away with its plugin host (Magpie restarting it) can be told from an idle exit\n // 'end' and 'close' both fire when the pipe goes away: handle it once\n let lifelineGone = false;\n const lifelineClosed = () => {\n if (lifelineGone) return;\n lifelineGone = true;\n log(\"info\", \"plugin host closed the lifeline (stdin); daemon exiting with it\");\n shutdown(0);\n };\n process.stdin.on(\"end\", lifelineClosed);\n process.stdin.on(\"close\", lifelineClosed);\n process.stdin.on(\"error\", lifelineClosed);\n process.stdin.resume();\n }\n}\n\nmain().catch((e) => {\n console.error(\"[agent-console] 启动失败\", e);\n process.exit(1);\n});\n","// Arguments and environment: port, dataDir, token, version, idleExitMinutes\nimport { randomBytes } from \"node:crypto\";\nimport { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { daemonBuildStamp } from \"./util/buildStamp.js\";\n\nexport type Config = {\n port: number;\n dataDir: string;\n token: string;\n version: string;\n idleExitMinutes: number;\n buildStamp: string;\n parentPid?: number;\n /** The plugin gate's port (index.mjs passes --gate-port); the preview refuses it */\n gatePort?: number;\n};\n\nfunction pkgVersion(): string {\n try {\n const here = dirname(fileURLToPath(import.meta.url));\n // dist/main.js → ../../package.json; src/main.ts also ends up in dist via esbuild\n const pkg = JSON.parse(readFileSync(join(here, \"..\", \"..\", \"package.json\"), \"utf8\"));\n return String(pkg.version || \"0.0.0\");\n } catch {\n return \"0.0.0\";\n }\n}\n\n// --data <dir> sets the data root (equivalent to setting XDG_CONFIG_HOME and then joining magpie/agent-console?\n// EXEC §5.2: --data <dir> (data root, equivalent to setting XDG_CONFIG_HOME; default $XDG_CONFIG_HOME\n// or ~/.config, then joined with magpie/agent-console). i.e. the --data value has XDG_CONFIG_HOME semantics.\nexport function parseConfig(argv: string[]): Config {\n let port: number | null = null;\n let data: string | null = null;\n let token: string | null = null;\n let parentPid: number | undefined;\n let gatePort: number | undefined;\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n if (a === \"--port\" && argv[i + 1]) port = Number(argv[++i]);\n else if (a.startsWith(\"--port=\")) port = Number(a.slice(7));\n else if (a === \"--data\" && argv[i + 1]) data = argv[++i];\n else if (a.startsWith(\"--data=\")) data = a.slice(7);\n else if (a === \"--token\" && argv[i + 1]) token = argv[++i];\n else if (a.startsWith(\"--token=\")) token = a.slice(8);\n else if (a === \"--parent-pid\" && argv[i + 1]) parentPid = Number(argv[++i]);\n else if (a.startsWith(\"--parent-pid=\")) parentPid = Number(a.slice(13));\n else if (a === \"--gate-port\" && argv[i + 1]) gatePort = Number(argv[++i]);\n else if (a.startsWith(\"--gate-port=\")) gatePort = Number(a.slice(12));\n }\n if (port == null || !Number.isInteger(port) || port < 0 || port > 65535) {\n const envPort = Number(process.env.AGENT_CONSOLE_PORT || \"\");\n port = Number.isInteger(envPort) && envPort >= 0 && envPort <= 65535 ? envPort : 3488;\n }\n const xdg = data ?? process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\");\n const dataDir = resolve(join(xdg, \"magpie\", \"agent-console\"));\n const idleEnv = Number(process.env.AGENT_CONSOLE_IDLE_EXIT_MIN || \"\");\n return {\n port,\n dataDir,\n token: token ?? process.env.AGENT_CONSOLE_TOKEN ?? randomBytes(16).toString(\"hex\"),\n version: pkgVersion(),\n idleExitMinutes: Number.isFinite(idleEnv) && idleEnv > 0 ? idleEnv : 60,\n buildStamp: daemonBuildStamp(),\n parentPid: Number.isInteger(parentPid) ? parentPid : undefined,\n gatePort: Number.isInteger(gatePort) && gatePort! > 0 && gatePort! <= 65535 ? gatePort : undefined,\n };\n}\n","import { existsSync, statSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nfunction resolveDaemonMainJs(): string | null {\n const self = fileURLToPath(import.meta.url);\n const norm = self.replace(/\\\\/g, \"/\");\n // esbuild single-file bundle: the whole package is dist/main.js\n if (norm.endsWith(\"/daemon/dist/main.js\") || norm.endsWith(\"/dist/main.js\")) return self;\n\n const here = dirname(self);\n const candidates = [\n join(here, \"..\", \"..\", \"dist\", \"main.js\"), // src/util → daemon/dist/main.js (vitest/tsc)\n join(here, \"main.js\"), // Already in the dist directory\n join(here, \"..\", \"main.js\"),\n ];\n for (const p of candidates) {\n if (existsSync(p)) return p;\n }\n return null;\n}\n\n/** mtime of daemon/dist/main.js, used by the plugin to detect code updates and restart the process */\nexport function daemonBuildStamp(): string {\n try {\n const mainJs = resolveDaemonMainJs();\n if (!mainJs) return \"0\";\n return String(statSync(mainJs).mtimeMs);\n } catch {\n return \"0\";\n }\n}\n","// HTTP routes: / → app/index.html (no token), static assets, /api/ping, /api/upload, /attachments/*\nimport { createServer, type IncomingMessage, type ServerResponse, type Server } from \"node:http\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join, normalize, extname } from \"node:path\";\nimport { checkHost, classifyOrigin, tokenEqual } from \"./security.js\";\nimport type { Config } from \"./config.js\";\nimport type { AttachmentStore } from \"./store/attachments.js\";\nimport { log } from \"./log.js\";\nimport { tr } from \"./util/i18n.js\";\n\nconst MIME: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".js\": \"text/javascript; charset=utf-8\",\n \".css\": \"text/css; charset=utf-8\",\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".woff2\": \"font/woff2\",\n \".map\": \"application/json\",\n \".json\": \"application/json; charset=utf-8\",\n};\n\nconst MAX_UPLOAD = 50 * 1024 * 1024; // 50MB\nconst MAX_MSG = 200 * 1024; // Ordinary messages: 200KB\n\nexport type HttpHooks = {\n onUpgrade?: (req: IncomingMessage, socket: import(\"node:net\").Socket, head: Buffer) => void;\n};\n\n// A malformed %xx must not become a 500\nfunction safeDecode(s: string): string | null {\n try {\n return decodeURIComponent(s);\n } catch {\n return null;\n }\n}\n\nfunction send(res: ServerResponse, code: number, body: string | Buffer, headers: Record<string, string> = {}): void {\n res.writeHead(code, headers);\n res.end(body);\n}\n\nfunction sendJson(res: ServerResponse, code: number, obj: unknown, headers: Record<string, string> = {}): void {\n send(res, code, JSON.stringify(obj), { \"content-type\": \"application/json; charset=utf-8\", \"cache-control\": \"no-store\", ...headers });\n}\n\n// Common headers for static responses: no caching (the page has no token, but don't let old versions linger), no sniffing, no Referer\nconst STATIC_HEADERS: Record<string, string> = {\n \"cache-control\": \"no-store\",\n \"x-content-type-options\": \"nosniff\",\n \"referrer-policy\": \"no-referrer\",\n};\n\nexport function createHttpServer(cfg: Config, appDir: string, attachments: AttachmentStore, hooks: HttpHooks = {}): Server {\n const server = createServer(async (req, res) => {\n try {\n await route(req, res);\n } catch (e) {\n log(\"error\", \"HTTP 处理异常\", { url: req.url, err: String(e) });\n if (!res.headersSent) sendJson(res, 500, { ok: false, e: { code: \"internal\", message: tr(\"http.internal\") } });\n else res.end();\n }\n });\n\n // Origin policy per request (see classifyOrigin in security.ts):\n // foreign (another site) → always 403, even with a token\n // opaque (Origin: null) → may only \"present\" the token on token routes (/api/*, /attachments/*);\n // it confers no trust by itself. Static routes are always refused.\n // none / self → static routes allowed (static files contain no token); token routes still need the token.\n // The CORS header is only given (as null) on responses that carry a valid token + Origin: null; preflight only for /api/upload.\n async function route(req: IncomingMessage, res: ServerResponse): Promise<void> {\n // Host must be loopback + this process's actual port: blocks DNS rebinding (a rebound page's GET carries no Origin)\n const hostCheck = checkHost(req.headers.host, cfg.port);\n if (!hostCheck.ok) {\n sendJson(res, hostCheck.code, { ok: false, e: { code: \"bad_host\", message: hostCheck.message } });\n return;\n }\n const origin = classifyOrigin(req.headers.origin, cfg.port);\n if (origin === \"foreign\") {\n sendJson(res, 403, { ok: false, e: { code: \"bad_origin\", message: tr(\"http.badOrigin\") } });\n return;\n }\n\n const url = new URL(req.url ?? \"/\", `http://127.0.0.1:${cfg.port}`);\n const pathname = url.pathname;\n const isApi = pathname.startsWith(\"/api/\");\n const isAttachment = pathname.startsWith(\"/attachments/\");\n\n // OPTIONS preflight: browsers don't send custom headers on a preflight, so there is no token here.\n // Only allow /api/upload, the one cross-origin POST the frontend really makes, and only for null / our own origin;\n // the preflight itself returns no data, and the real request still has to pass the token check.\n if (req.method === \"OPTIONS\") {\n if (pathname !== \"/api/upload\" || origin === \"none\") {\n sendJson(res, 403, { ok: false, e: { code: \"bad_preflight\", message: tr(\"http.badPreflight\") } });\n return;\n }\n send(res, 204, \"\", {\n \"access-control-allow-origin\": origin === \"opaque\" ? \"null\" : `http://127.0.0.1:${cfg.port}`,\n \"access-control-allow-headers\": \"x-agent-console, content-type\",\n \"access-control-allow-methods\": \"GET, POST, OPTIONS\",\n \"access-control-max-age\": \"600\",\n vary: \"origin\",\n });\n return;\n }\n\n // Token routes: the token is the only authorization\n if (isApi || isAttachment) {\n const headerToken = req.headers[\"x-agent-console\"];\n // Attachments accept ?t= (<img src> can't send custom headers); the API only accepts the header\n const queryToken = isAttachment ? url.searchParams.get(\"t\") : null;\n const validToken =\n (typeof headerToken === \"string\" && tokenEqual(headerToken, cfg.token)) ||\n (typeof queryToken === \"string\" && tokenEqual(queryToken, cfg.token));\n if (!validToken) {\n sendJson(res, 403, { ok: false, e: { code: \"bad_token\", message: tr(\"http.badToken\") } });\n return;\n }\n // In a sandbox iframe (no allow-same-origin) the page's origin is null, so even a same-address fetch is cross-origin:\n // the response needs allow-origin: null to be readable. It's only sent after the token is verified,\n // so any Origin: null page without the token can read nothing.\n if (origin === \"opaque\") {\n res.setHeader(\"access-control-allow-origin\", \"null\");\n res.setHeader(\"vary\", \"origin\");\n }\n if (isApi) {\n await routeApi(req, res, pathname, url);\n return;\n }\n const id = safeDecode(pathname.slice(\"/attachments/\".length));\n const a = id === null ? null : await attachments.get(id);\n if (!a) {\n sendJson(res, 404, { ok: false, e: { code: \"not_found\", message: tr(\"http.noAttachment\") } });\n return;\n }\n const data = await attachments.read(a.id);\n send(res, 200, data ?? Buffer.alloc(0), { ...STATIC_HEADERS, \"content-type\": a.mime });\n return;\n }\n\n // Static assets: refuse Origin: null. Ordinary navigations and <script src>/<link> subresource requests carry no Origin;\n // one with null can only be someone else's sandboxed/data:/file: page doing a fetch — give it nothing, and no CORS headers.\n if (origin === \"opaque\") {\n sendJson(res, 403, { ok: false, e: { code: \"bad_origin\", message: tr(\"http.badOrigin\") } });\n return;\n }\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n sendJson(res, 405, { ok: false, e: { code: \"method\", message: tr(\"http.method\") } });\n return;\n }\n if (pathname === \"/\" || pathname === \"/index.html\") {\n // The token is no longer injected into the page: the plugin gate hands it to the frontend in the #t= fragment (see lib/gate.mjs)\n try {\n const html = await readFile(join(appDir, \"index.html\"), \"utf8\");\n send(res, 200, html, { ...STATIC_HEADERS, \"content-type\": \"text/html; charset=utf-8\" });\n } catch {\n send(res, 503, tr(\"http.noApp\"), { ...STATIC_HEADERS, \"content-type\": \"text/plain; charset=utf-8\" });\n }\n return;\n }\n // Other static files must be inside app/\n const decoded = safeDecode(pathname);\n if (decoded === null) {\n sendJson(res, 400, { ok: false, e: { code: \"bad_path\", message: tr(\"http.badPath\") } });\n return;\n }\n const rel = normalize(decoded).replace(/^([\\\\/])+/, \"\");\n const full = normalize(join(appDir, rel));\n if (!full.startsWith(normalize(appDir)) || rel.includes(\"..\")) {\n sendJson(res, 403, { ok: false, e: { code: \"bad_path\", message: tr(\"http.pathDenied\") } });\n return;\n }\n if (!existsSync(full) || !(await stat(full)).isFile()) {\n sendJson(res, 404, { ok: false, e: { code: \"not_found\", message: tr(\"http.noFile\") } });\n return;\n }\n const data = await readFile(full);\n send(res, 200, data, { ...STATIC_HEADERS, \"content-type\": MIME[extname(full).toLowerCase()] ?? \"application/octet-stream\" });\n }\n\n async function routeApi(req: IncomingMessage, res: ServerResponse, pathname: string, url: URL): Promise<void> {\n if (pathname === \"/api/ping\" && req.method === \"GET\") {\n sendJson(res, 200, { ok: true, version: cfg.version, port: cfg.port, pid: process.pid, dataDir: cfg.dataDir, buildStamp: cfg.buildStamp });\n return;\n }\n if (pathname === \"/api/upload\" && req.method === \"POST\") {\n const name = url.searchParams.get(\"name\") ?? \"\";\n if (!attachments.allowedExt(name)) {\n sendJson(res, 400, { ok: false, e: { code: \"bad_type\", message: tr(\"http.badType\") } });\n return;\n }\n // The declared size is already over the limit: reject without reading the body\n const declared = Number(req.headers[\"content-length\"] ?? 0);\n if (declared > MAX_UPLOAD) {\n res.setHeader(\"connection\", \"close\");\n sendJson(res, 413, { ok: false, e: { code: \"too_large\", message: tr(\"http.tooLarge\") } });\n req.resume();\n return;\n }\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const c of req) {\n const b = c as Buffer;\n size += b.length;\n if (size > MAX_UPLOAD) {\n res.setHeader(\"connection\", \"close\");\n sendJson(res, 413, { ok: false, e: { code: \"too_large\", message: tr(\"http.tooLarge\") } });\n return;\n }\n chunks.push(b);\n }\n const a = await attachments.save(name, Buffer.concat(chunks));\n sendJson(res, 200, { ok: true, id: a.id, name: a.name, mime: a.mime, size: a.size });\n return;\n }\n sendJson(res, 404, { ok: false, e: { code: \"not_found\", message: tr(\"http.noRoute\") } });\n }\n\n if (hooks.onUpgrade) {\n server.on(\"upgrade\", hooks.onUpgrade);\n }\n return server;\n}\n\nexport { sendJson, MAX_MSG };\n","// Attachments: write uploaded files to disk, look up paths by id.\nimport { writeFile, mkdir, stat, readFile } from \"node:fs/promises\";\nimport { join, extname } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { validId } from \"../util/paths.js\";\n\nconst IMG_EXT = new Set([\".png\", \".jpg\", \".jpeg\", \".gif\", \".webp\"]);\nconst TEXT_EXT = new Set([\".txt\", \".md\", \".log\", \".json\", \".csv\", \".xml\", \".yaml\", \".yml\", \".html\", \".css\", \".js\", \".ts\", \".py\", \".toml\", \".ini\", \".conf\"]);\nconst MIME: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n};\n\nexport type Attachment = { id: string; name: string; mime: string; size: number; path: string };\n\n// Text attachments are declared UTF-8 so Chinese text isn't garbled when opened in a browser (nosniff + text/plain, so HTML is never executed)\nconst TEXT_MIME = \"text/plain; charset=utf-8\";\n\nexport class AttachmentStore {\n // id → file name: avoids a readdir of the whole directory on every lookup (slow with many attachments)\n private files = new Map<string, string>();\n constructor(private dir: string) {}\n\n private safeExt(name: string): string | null {\n const ext = extname(name).toLowerCase();\n if (IMG_EXT.has(ext) || TEXT_EXT.has(ext)) return ext;\n if (!ext) return \".txt\";\n return null;\n }\n\n allowedExt(name: string): boolean {\n return this.safeExt(name) !== null;\n }\n\n async save(name: string, data: Buffer): Promise<Attachment> {\n const ext = this.safeExt(name);\n if (!ext) throw new Error(\"不支持的文件类型\");\n const id = \"a_\" + Date.now().toString(36) + randomBytes(3).toString(\"hex\");\n await mkdir(this.dir, { recursive: true });\n const file = join(this.dir, id + ext);\n await writeFile(file, data);\n this.files.set(id, id + ext);\n const mime = MIME[ext] ?? TEXT_MIME;\n return { id, name: name || \"未命名\" + ext, mime, size: data.length, path: file };\n }\n\n async get(id: string): Promise<Attachment | null> {\n if (!validId(id)) return null;\n const known = this.files.get(id);\n if (known) {\n const hit = await this.describe(id, known);\n if (hit) return hit;\n this.files.delete(id);\n }\n const { readdir } = await import(\"node:fs/promises\");\n try {\n for (const f of await readdir(this.dir)) {\n if (f.startsWith(id + \".\")) {\n this.files.set(id, f);\n return await this.describe(id, f);\n }\n }\n } catch {}\n return null;\n }\n\n private async describe(id: string, f: string): Promise<Attachment | null> {\n const p = join(this.dir, f);\n const s = await stat(p).catch(() => null);\n if (!s?.isFile()) return null;\n const ext = extname(f).toLowerCase();\n return { id, name: f.slice(id.length + 1) || f, mime: MIME[ext] ?? TEXT_MIME, size: s.size, path: p };\n }\n\n async read(id: string): Promise<Buffer | null> {\n const a = await this.get(id);\n if (!a) return null;\n return readFile(a.path);\n }\n}\n","// projects.json CRUD\nimport { readFile } from \"node:fs/promises\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { writeJsonAtomic } from \"../util/atomic.js\";\nimport { normPath, validId } from \"../util/paths.js\";\nimport { ApiError } from \"../ws/methods.js\";\n\nexport type Project = { id: string; name: string; path: string; createdAt: number };\n\nfunction newId(): string {\n return \"p_\" + Date.now().toString(36) + randomBytes(3).toString(\"hex\");\n}\n\nexport class ProjectsStore {\n private file: string;\n private cache: Project[] | null = null;\n private writing: Promise<void> = Promise.resolve();\n constructor(dataDir: string) {\n this.file = join(dataDir, \"projects.json\");\n }\n\n async list(): Promise<Project[]> {\n if (this.cache) return this.cache;\n try {\n this.cache = JSON.parse(await readFile(this.file, \"utf8\")) as Project[];\n if (!Array.isArray(this.cache)) this.cache = [];\n } catch {\n this.cache = [];\n }\n return this.cache;\n }\n\n async get(id: string): Promise<Project | null> {\n if (!validId(id)) return null;\n return (await this.list()).find((p) => p.id === id) ?? null;\n }\n\n private async save(list: Project[]): Promise<void> {\n this.cache = list;\n const snap = list;\n this.writing = this.writing.then(() => writeJsonAtomic(this.file, snap));\n await this.writing;\n }\n\n async create(path: string, name?: string): Promise<Project> {\n if (!path || typeof path !== \"string\") throw new ApiError(\"bad_params\", \"路径不能为空\");\n if (!existsSync(path) || !statSync(path).isDirectory()) {\n throw new ApiError(\"bad_path\", \"目录不存在或不是文件夹\");\n }\n const np = normPath(path);\n const list = await this.list();\n const dup = list.find((p) => normPath(p.path) === np);\n if (dup) return dup;\n const proj: Project = {\n id: newId(),\n name: name?.trim() || path.replace(/[\\\\/]+$/, \"\").split(/[\\\\/]/).pop() || path,\n path,\n createdAt: Date.now(),\n };\n list.push(proj);\n await this.save(list);\n return proj;\n }\n\n async rename(id: string, name: string): Promise<Project> {\n const list = await this.list();\n const p = list.find((x) => x.id === id);\n if (!p) throw new ApiError(\"not_found\", \"项目不存在\");\n p.name = name.trim() || p.name;\n await this.save(list);\n return p;\n }\n\n async remove(id: string): Promise<void> {\n const list = await this.list();\n const idx = list.findIndex((x) => x.id === id);\n if (idx < 0) return;\n list.splice(idx, 1);\n await this.save(list);\n }\n}\n","// threads/<id>/meta.json + timeline.jsonl: list, read, append, delete (moved to trash)\nimport { mkdir, rename, readdir, readFile, stat } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { writeJsonAtomic } from \"../util/atomic.js\";\nimport { readJsonl, appendJsonl } from \"../util/jsonl.js\";\nimport { validId } from \"../util/paths.js\";\nimport { ApiError } from \"../ws/methods.js\";\nimport { tr } from \"../util/i18n.js\";\nimport type { Mode } from \"../timeline/types.js\";\nimport type { TimelineEvent } from \"../timeline/types.js\";\n\nexport type ThreadMeta = {\n id: string;\n projectId: string;\n title: string;\n titleAuto: boolean;\n provider: string;\n model: string | null;\n mode: Mode;\n effort: string | null;\n providerSessionId: string | null;\n status: \"initializing\" | \"idle\" | \"running\" | \"error\" | \"closed\";\n pinned: boolean;\n archived: boolean;\n createdAt: number;\n updatedAt: number;\n lastTurnStatus: \"completed\" | \"interrupted\" | \"failed\" | null;\n usage: { inputTokens: number; outputTokens: number; cacheReadTokens: number; costUsd: number };\n importedFrom?: { provider: string; sessionId: string };\n seq: number;\n /** Cursor Agent: lightning Fast mode (model parameter fast=true) */\n cursorFast?: boolean;\n /** Cursor Agent: Auto-review, the client auto-approves safe tool permissions */\n cursorAutoReview?: boolean;\n /** 1.2: last URL shown in the Preview tab (the target, not the proxy URL) */\n previewUrl?: string | null;\n};\n\nexport type { Mode };\n\nfunction newId(): string {\n return \"t_\" + Date.now().toString(36) + randomBytes(3).toString(\"hex\");\n}\n\nexport class ThreadsStore {\n private dir: string;\n private trashDir: string;\n private metas = new Map<string, ThreadMeta>();\n private loaded = false;\n // Serialize meta writes: concurrent patch/appendEvent would overwrite each other (setStatus/patch/provider_session_id run concurrently in the manager)\n private writeQ: Promise<unknown> = Promise.resolve();\n private serial<T>(fn: () => Promise<T>): Promise<T> {\n const p = this.writeQ.then(fn, fn);\n this.writeQ = p.catch(() => {});\n return p;\n }\n constructor(dataDir: string) {\n this.dir = join(dataDir, \"threads\");\n this.trashDir = join(dataDir, \"trash\", \"threads\");\n }\n\n private tdir(id: string): string {\n return join(this.dir, id);\n }\n private metaPath(id: string): string {\n return join(this.tdir(id), \"meta.json\");\n }\n private timelinePath(id: string): string {\n return join(this.tdir(id), \"timeline.jsonl\");\n }\n\n private async loadAll(): Promise<void> {\n if (this.loaded) return;\n this.loaded = true;\n let ids: string[] = [];\n try {\n ids = (await readdir(this.dir)).filter((d) => validId(d));\n } catch {\n return;\n }\n for (const id of ids) {\n try {\n const m = JSON.parse(await readFile(this.metaPath(id), \"utf8\")) as ThreadMeta;\n if (m && typeof m.id === \"string\") this.metas.set(m.id, m);\n } catch {}\n }\n }\n\n async list(): Promise<ThreadMeta[]> {\n await this.loadAll();\n return [...this.metas.values()].sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n async get(id: string): Promise<ThreadMeta | null> {\n if (!validId(id)) return null;\n await this.loadAll();\n return this.metas.get(id) ?? null;\n }\n\n private async saveMeta(meta: ThreadMeta): Promise<void> {\n this.metas.set(meta.id, meta);\n await writeJsonAtomic(this.metaPath(meta.id), meta);\n }\n\n async create(o: {\n projectId: string;\n provider: string;\n model?: string | null;\n mode?: Mode;\n effort?: string | null;\n title?: string;\n providerSessionId?: string | null;\n importedFrom?: { provider: string; sessionId: string };\n }): Promise<ThreadMeta> {\n const now = Date.now();\n const meta: ThreadMeta = {\n id: newId(),\n projectId: o.projectId,\n title: o.title ?? tr(\"thread.defaultTitle\"),\n titleAuto: o.title == null,\n provider: o.provider,\n model: o.model ?? null,\n mode: o.mode ?? \"default\",\n effort: o.effort ?? null,\n providerSessionId: o.providerSessionId ?? null,\n status: \"idle\",\n pinned: false,\n archived: false,\n createdAt: now,\n updatedAt: now,\n lastTurnStatus: null,\n usage: { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, costUsd: 0 },\n importedFrom: o.importedFrom,\n seq: 0,\n };\n try {\n await mkdir(this.tdir(meta.id), { recursive: true });\n } catch (e) {\n throw new ApiError(\"io_error\", `创建对话目录失败:${(e as Error)?.message ?? e}`);\n }\n await this.saveMeta(meta);\n return meta;\n }\n\n async patch(id: string, patch: Partial<ThreadMeta>): Promise<ThreadMeta> {\n return this.serial(async () => {\n const meta = await this.get(id);\n if (!meta) throw new ApiError(\"not_found\", \"对话不存在\");\n if (patch.title !== undefined && patch.titleAuto === undefined) patch = { ...patch, titleAuto: false };\n const next = { ...meta, ...patch, id: meta.id, updatedAt: Date.now() };\n await this.saveMeta(next);\n return next;\n });\n }\n\n // Append an event: inside the serialized section take meta.seq+1 as seq, write the jsonl and update meta.\n // A passed-in seq is ignored (keeps it strictly increasing); ts/threadId are filled in when missing.\n async appendEvent(id: string, ev: Record<string, unknown> & { type: TimelineEvent[\"type\"] }): Promise<TimelineEvent> {\n return this.serial(async () => {\n const meta = await this.get(id);\n if (!meta) throw new ApiError(\"not_found\", \"对话不存在\");\n const full = {\n ...ev,\n seq: meta.seq + 1,\n ts: ev.ts ?? Date.now(),\n threadId: id,\n } as TimelineEvent;\n await appendJsonl(this.timelinePath(id), full);\n meta.seq = full.seq;\n meta.updatedAt = Date.now();\n this.metas.set(id, meta);\n await writeJsonAtomic(this.metaPath(id), meta);\n return full;\n });\n }\n\n async readEvents(id: string, afterSeq = 0, limit = 5000): Promise<TimelineEvent[]> {\n const rows = await readJsonl<TimelineEvent>(this.timelinePath(id));\n const out = rows.filter((e) => typeof e.seq === \"number\" && e.seq > afterSeq);\n return out.slice(-limit);\n }\n\n async delete(id: string): Promise<void> {\n const meta = await this.get(id);\n if (!meta) return;\n const stamp = new Date()\n .toISOString()\n .replace(/[:.]/g, \"-\")\n .slice(0, 19);\n await mkdir(this.trashDir, { recursive: true });\n // Windows: an Agent process / file handle just closed may not be released yet, so renaming the directory briefly fails with EPERM/EBUSY → retry with backoff\n for (let attempt = 0; ; attempt++) {\n try {\n await rename(this.tdir(id), join(this.trashDir, `${id}-${stamp}`));\n break;\n } catch (e) {\n const code = (e as NodeJS.ErrnoException)?.code;\n if ((code === \"EPERM\" || code === \"EBUSY\" || code === \"EACCES\") && attempt < 8) {\n await new Promise((r) => setTimeout(r, 250 * (attempt + 1)));\n continue;\n }\n throw new ApiError(\"internal\", \"移入回收目录失败:\" + String(e));\n }\n }\n this.metas.delete(id);\n }\n}\n","// WS gateway: hello authentication, request dispatch, subscriptions, heartbeat, binary terminal frames, broadcast.\nimport { WebSocketServer, WebSocket } from \"ws\";\nimport type { IncomingMessage } from \"node:http\";\nimport type { Socket } from \"node:net\";\nimport { createHash, randomBytes, timingSafeEqual } from \"node:crypto\";\nimport type { Config } from \"../config.js\";\nimport { checkHost, classifyOrigin, tokenEqual } from \"../security.js\";\nimport { log } from \"../log.js\";\nimport { setAppLocale } from \"../util/i18n.js\";\n\nexport type MethodHandler = (params: unknown, ctx: ConnCtx) => Promise<unknown> | unknown;\nexport type ConnCtx = { connId: string; conn: Conn };\n\ntype ClientMsg =\n | { t: \"hello\"; token: string; v?: number; lang?: string }\n | { t: \"req\"; id: number; m: string; p?: unknown }\n | { t: \"ping\" };\n\nclass Conn {\n id: string;\n ws: WebSocket;\n authed = false;\n subs = new Set<string>();\n alive = true;\n lastMsg = Date.now();\n constructor(ws: WebSocket) {\n this.id = \"c_\" + randomBytes(4).toString(\"hex\");\n this.ws = ws;\n }\n send(obj: unknown): void {\n if (this.ws.readyState !== WebSocket.OPEN) return;\n try {\n const s = JSON.stringify(obj);\n if (this.overflow(s.length)) {\n log(\"warn\", `连接 ${this.id} 出站缓冲超 8MB,断开`);\n this.ws.close(4000, \"buffer_overflow\");\n return;\n }\n this.ws.send(s);\n } catch {}\n }\n // Look at bytes really still unsent in the socket (only grows when the client is stuck), not the cumulative amount sent\n private overflow(next: number): boolean {\n return this.ws.bufferedAmount + next > 8 * 1024 * 1024;\n }\n sendBinary(frame: Buffer): void {\n if (this.ws.readyState !== WebSocket.OPEN) return;\n if (this.overflow(frame.length)) {\n log(\"warn\", `连接 ${this.id} 出站缓冲超 8MB,断开`);\n this.ws.close(4000, \"buffer_overflow\");\n return;\n }\n try {\n this.ws.send(frame);\n } catch {}\n }\n}\n\nexport class Gateway {\n private wss: WebSocketServer;\n private conns = new Map<string, Conn>();\n private methods = new Map<string, MethodHandler>();\n private helloTimers = new Map<string, NodeJS.Timeout>();\n onTerminalInput?: (conn: Conn, index: number, op: number, payload: Buffer) => void;\n /** Called after a connection closes, with how many are left (the preview proxy closes when none are) */\n onConnectionClosed?: (left: number) => void;\n\n constructor(private cfg: Config) {\n this.wss = new WebSocketServer({ noServer: true });\n }\n\n method(name: string, fn: MethodHandler): void {\n this.methods.set(name, fn);\n }\n\n get connectionCount(): number {\n return this.conns.size;\n }\n\n handleUpgrade(req: IncomingMessage, socket: Socket, head: Buffer): void {\n const hostCheck = checkHost(req.headers.host, this.cfg.port);\n if (!hostCheck.ok) {\n socket.write(\"HTTP/1.1 421 Misdirected Request\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n if (classifyOrigin(req.headers.origin, this.cfg.port) === \"foreign\") {\n socket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n const url = new URL(req.url ?? \"/\", `http://127.0.0.1:${this.cfg.port}`);\n if (url.pathname !== \"/ws\") {\n socket.write(\"HTTP/1.1 404 Not Found\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n this.wss.handleUpgrade(req, socket, head, (ws) => this.onConn(ws));\n }\n\n private onConn(ws: WebSocket): void {\n const conn = new Conn(ws);\n this.conns.set(conn.id, conn);\n // The first frame must be hello within 5 seconds\n const timer = setTimeout(() => {\n if (!conn.authed) ws.close(4401, \"auth_timeout\");\n }, 5000);\n this.helloTimers.set(conn.id, timer);\n\n ws.on(\"message\", (data: Buffer | string, isBinary: boolean) => {\n conn.lastMsg = Date.now();\n if (isBinary) {\n this.onBinary(conn, data as Buffer);\n return;\n }\n let msg: ClientMsg;\n try {\n msg = JSON.parse(String(data));\n } catch {\n conn.send({ t: \"res\", id: 0, ok: false, e: { code: \"bad_json\", message: \"消息不是合法 JSON\" } });\n return;\n }\n this.onMessage(conn, msg);\n });\n ws.on(\"close\", () => {\n this.conns.delete(conn.id);\n try { this.onConnectionClosed?.(this.conns.size); } catch {}\n const t = this.helloTimers.get(conn.id);\n if (t) clearTimeout(t);\n this.helloTimers.delete(conn.id);\n });\n ws.on(\"error\", () => {});\n }\n\n private onMessage(conn: Conn, msg: ClientMsg): void {\n if (msg.t === \"hello\") {\n if (!conn.authed) {\n if (typeof msg.token === \"string\" && tokenEqual(msg.token, this.cfg.token)) {\n conn.authed = true;\n setAppLocale(msg.lang);\n const t = this.helloTimers.get(conn.id);\n if (t) clearTimeout(t);\n conn.send({ t: \"hello.ok\", version: this.cfg.version, serverTime: Date.now() });\n } else {\n conn.send({ t: \"res\", id: 0, ok: false, e: { code: \"bad_token\", message: \"令牌无效\" } });\n conn.ws.close(4401, \"bad_token\");\n }\n }\n return;\n }\n if (msg.t === \"ping\") {\n conn.send({ t: \"pong\" });\n return;\n }\n if (msg.t === \"req\") {\n if (!conn.authed) {\n conn.send({ t: \"res\", id: msg.id, ok: false, e: { code: \"unauthorized\", message: \"未鉴权\" } });\n return;\n }\n void this.dispatch(conn, msg);\n return;\n }\n }\n\n private async dispatch(conn: Conn, msg: { t: \"req\"; id: number; m: string; p?: unknown }): Promise<void> {\n const fn = this.methods.get(msg.m);\n if (!fn) {\n conn.send({ t: \"res\", id: msg.id, ok: false, e: { code: \"not_found\", message: `未知方法 ${msg.m}` } });\n return;\n }\n try {\n const r = await fn(msg.p, { connId: conn.id, conn });\n conn.send({ t: \"res\", id: msg.id, ok: true, r: r ?? null });\n } catch (e) {\n const err = e as { code?: string; message?: string };\n conn.send({\n t: \"res\",\n id: msg.id,\n ok: false,\n e: { code: err.code ?? \"internal\", message: err.message ?? \"服务内部错误\" },\n });\n }\n }\n\n // Terminal binary frame: [op:1][terminalIndex:2 BE][payload]\n private onBinary(conn: Conn, buf: Buffer): void {\n if (buf.length < 3) return;\n const op = buf.readUInt8(0);\n const index = buf.readUInt16BE(1);\n this.onTerminalInput?.(conn, index, op, buf.subarray(3));\n }\n\n publish(ch: string, data: unknown): void {\n for (const c of this.conns.values()) {\n if (c.authed && c.subs.has(ch)) c.send({ t: \"evt\", ch, d: data });\n }\n }\n\n publishTerminal(index: number, payload: Buffer): void {\n const frame = Buffer.concat([Buffer.from([1, (index >> 8) & 0xff, index & 0xff]), payload]);\n for (const c of this.conns.values()) {\n if (c.authed && c.subs.has(`terminal:${index}`)) c.sendBinary(frame);\n }\n }\n\n subscribe(conn: Conn, ch: string): void {\n conn.subs.add(ch);\n }\n unsubscribe(conn: Conn, ch: string): void {\n conn.subs.delete(ch);\n }\n\n closeAll(): void {\n for (const c of this.conns.values()) {\n try {\n c.ws.close(1001, \"server_shutdown\");\n } catch {}\n }\n this.conns.clear();\n }\n}\n\nexport { Conn };\n","// AgentManager (§5.7): conversation runtimes, send/queue/steer/interrupt/permissions, idle recycling, restart recovery.\nimport type { Gateway } from \"../ws/gateway.js\";\nimport type { ThreadsStore, ThreadMeta } from \"../store/threads.js\";\nimport type { ProjectsStore } from \"../store/projects.js\";\nimport type { SettingsStore } from \"../store/settings.js\";\nimport type { AttachmentStore } from \"../store/attachments.js\";\nimport type { Provider, ProviderSession, SendInput, RespondAnswer, Mode, SlashCommand } from \"../providers/types.js\";\nimport { launchFromSettings } from \"../providers/launch.js\";\nimport { clampMode } from \"../providers/modes.js\";\nimport { resolveAttachmentRefs } from \"../util/attachmentRefs.js\";\nimport { getProvider } from \"../providers/registry.js\";\nimport { catalogById, providerCreatable } from \"../providers/catalog.js\";\nimport { isProviderEnabled } from \"../providers/enabled.js\";\nimport { cachedDetect, cachedModels } from \"../providers/infoCache.js\";\nimport type { ProviderEvent, TimelineEvent } from \"../timeline/types.js\";\nimport { Coalescer } from \"../timeline/coalescer.js\";\nimport { ApiError } from \"../ws/methods.js\";\nimport { log } from \"../log.js\";\nimport { tr } from \"../util/i18n.js\";\nimport { resolveMentions, withMentions, type Mention, type MentionRef } from \"../util/mentions.js\";\nimport {\n codexSlashCommandsFromEntries,\n loadCodexSlashEntries,\n} from \"../providers/codex/commands.js\";\n\nconst SLASH_CACHE_TTL_MS = 10 * 60 * 1000;\n/** Idle Agent processes kept warm at most (one per conversation); older idle ones are closed (resumed on the next message) */\nexport const MAX_WARM_IDLE = 3;\n\ntype QueuedMessage = { id: string; text: string; attachments: { path: string; mime: string; name?: string }[]; mentions?: Mention[] };\ntype PendingRequest = {\n kind: \"permission\" | \"question\";\n requestId: string;\n options: { id: string; label: string; kind: string }[];\n resolve: (a: RespondAnswer) => void;\n event: ProviderEvent;\n};\n\ntype Runtime = {\n threadId: string;\n session: ProviderSession | null;\n status: ThreadMeta[\"status\"];\n currentTurnId: string | null;\n queue: QueuedMessage[];\n pending: Map<string, PendingRequest>;\n allowAlways: Set<string>;\n lastActivity: number;\n coalescer: Coalescer;\n interruptTimer: NodeJS.Timeout | null;\n endedTurnIds: Set<string>; // Turns that already have a turn_ended written (dedupe)\n starting: boolean; // startTurn in progress (session is still null while it is being created)\n commands: SlashCommand[];\n sessionCreating: Promise<ProviderSession> | null;\n /** Text streamed as deltas only (ACP Agents): saved per segment as assistant_message / reasoning (B1) */\n pendingText: Map<string, { type: \"assistant\" | \"reasoning\"; itemId: string; text: string }>;\n deltasOnly: boolean;\n};\n\ntype DeltaType = \"assistant_delta\" | \"reasoning_delta\" | \"tool_output_delta\";\nconst DELTA_TYPES: DeltaType[] = [\"assistant_delta\", \"reasoning_delta\", \"tool_output_delta\"];\n// coalescer key = type + \\u0000 + itemId; the three delta types coalesce separately and are pushed with their original type\nconst deltaKey = (type: DeltaType, itemId: string) => `${type}\\u0000${itemId}`;\n\nexport type SendBehavior = \"queue\" | \"steer\";\n\nexport class AgentManager {\n private runtimes = new Map<string, Runtime>();\n private recycleTimer: NodeJS.Timeout | null = null;\n private slashCache = new Map<string, { commands: SlashCommand[]; expires: number }>();\n\n constructor(\n private gw: Gateway,\n private threads: ThreadsStore,\n private projects: ProjectsStore,\n private settings: SettingsStore,\n private attachments: AttachmentStore,\n ) {}\n\n /** attachment.path in the frontend's thread.send is really an upload id; resolve it to the file under dataDir/attachments */\n private resolveAttachments(refs: { path: string; mime: string; name?: string }[]) {\n return resolveAttachmentRefs(this.attachments, refs);\n }\n\n /** Mentions from the Files panel → absolute paths inside the project; a path that can't be used gets a notice */\n private async resolveMentionRefs(threadId: string, projectId: string, refs: MentionRef[] | undefined): Promise<Mention[]> {\n if (!refs?.length) return [];\n const proj = await this.projects.get(projectId);\n if (!proj) return [];\n const { mentions, warnings } = await resolveMentions(proj.path, refs);\n if (warnings.length) {\n await this.appendRaw(threadId, { type: \"notice\", level: \"warn\", message: tr(\"notice.mentionSkipped\", { paths: warnings.join(\", \") }) });\n }\n return mentions;\n }\n\n private attachmentLabels(refs: { path: string; mime: string; name?: string }[]) {\n return refs.map((a) => ({ id: a.path, name: (a.name ?? \"\").trim() || a.path, mime: a.mime }));\n }\n\n // Called at startup: running/initializing conversations are recovered as closed (§5.7.6)\n async recoverOnStart(): Promise<void> {\n for (const meta of await this.threads.list()) {\n if (meta.status === \"running\" || meta.status === \"initializing\") {\n await this.appendRaw(meta.id, {\n type: \"notice\",\n level: \"warn\",\n message: tr(\"notice.daemonRestart\"),\n });\n const events = await this.threads.readEvents(meta.id, 0, 50000);\n // No turn_ended after the last turn_started → append interrupted\n // (Can't use lastTurnStatus: it records the previous turn, not the one that was running)\n // user_message is persisted before turn_started; if the provider never sent turn_started the turn is still open\n let open: string | null = null;\n for (const e of events) {\n if (e.type === \"turn_started\") open = (e as { turnId?: string }).turnId ?? \"unknown\";\n else if (e.type === \"user_message\" && !(e as { steered?: boolean }).steered) open = open ?? \"unknown\";\n else if (e.type === \"turn_ended\") open = null;\n }\n if (open !== null) {\n await this.appendRaw(meta.id, { type: \"turn_ended\", status: \"interrupted\", ...(open && open !== \"unknown\" ? { turnId: open } : {}) } as Partial<TimelineEvent> & { type: \"turn_ended\" });\n }\n // Cancel every unresolved permission request\n const resolved = new Set(\n events.filter((e) => e.type === \"permission_resolved\").map((e) => (e as { requestId: string }).requestId),\n );\n for (const e of events) {\n if (e.type === \"permission_request\" && !resolved.has((e as { requestId: string }).requestId)) {\n await this.appendRaw(meta.id, {\n type: \"permission_resolved\",\n requestId: (e as { requestId: string }).requestId,\n cancelled: true,\n });\n }\n }\n await this.threads.patch(meta.id, { status: \"closed\", lastTurnStatus: \"interrupted\" });\n }\n }\n // Idle recycling every minute\n this.recycleTimer = setInterval(() => void this.recycleIdle(), 60_000);\n this.recycleTimer.unref?.();\n }\n\n /** Close every session; the returned Promise resolves once each close finishes (or fails). Callers add their own timeout. */\n shutdown(): Promise<void> {\n if (this.recycleTimer) clearInterval(this.recycleTimer);\n const all = [...this.runtimes.values()].map((rt) => rt.session?.close().catch(() => {}));\n this.runtimes.clear();\n return Promise.all(all).then(() => {});\n }\n\n // Idle-exit check (§5.2.7): busy if any runtime is not idle\n anyBusy(): boolean {\n for (const rt of this.runtimes.values()) {\n if (rt.status === \"running\" || rt.status === \"initializing\") return true;\n }\n return false;\n }\n\n /** Drop a queued message that hasn't been sent yet (the × on the composer's queue list) */\n removeQueued(threadId: string, queueId: string): boolean {\n const rt = this.runtimes.get(threadId);\n if (!rt) return false;\n const before = rt.queue.length;\n rt.queue = rt.queue.filter((q) => q.id !== queueId);\n if (rt.queue.length === before) return false;\n this.gw.publish(`thread:${threadId}`, { type: \"queue\", queue: rt.queue });\n return true;\n }\n\n runtimeInfo(threadId: string): { status: string; queue: unknown[]; pending: unknown[] } | null {\n const rt = this.runtimes.get(threadId);\n if (!rt) return null;\n return {\n status: rt.status,\n queue: rt.queue,\n pending: [...rt.pending.values()].map((p) => ({\n requestId: p.requestId,\n kind: p.kind,\n options: p.options,\n })),\n };\n }\n\n private rt(threadId: string): Runtime {\n let r = this.runtimes.get(threadId);\n if (!r) {\n r = {\n threadId,\n session: null,\n status: \"idle\",\n currentTurnId: null,\n queue: [],\n pending: new Map(),\n allowAlways: new Set(),\n lastActivity: Date.now(),\n coalescer: this.newCoalescer(threadId),\n interruptTimer: null,\n endedTurnIds: new Set(),\n starting: false,\n commands: [],\n sessionCreating: null,\n pendingText: new Map(),\n deltasOnly: false,\n };\n this.runtimes.set(threadId, r);\n }\n return r;\n }\n\n private newCoalescer(threadId: string): Coalescer {\n return new Coalescer(60, (key, text) => {\n const i = key.indexOf(\"\\u0000\");\n const type = key.slice(0, i) as DeltaType;\n void this.pushEvent(threadId, { type, itemId: key.slice(i + 1), text });\n });\n }\n\n private flushDeltas(rt: Runtime, itemId: string): void {\n for (const t of DELTA_TYPES) rt.coalescer.flushItem(deltaKey(t, itemId));\n }\n\n // ---- send ----\n async send(threadId: string, input: { text: string; attachments?: { path: string; mime: string; name?: string }[]; mentions?: MentionRef[] }, behavior: SendBehavior = \"queue\"): Promise<\"started\" | \"steered\" | \"queued\"> {\n const meta = await this.mustThread(threadId);\n const mentions = await this.resolveMentionRefs(threadId, meta.projectId, input.mentions);\n if (meta.archived) {\n await this.threads.patch(threadId, { archived: false });\n this.gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: await this.threads.get(threadId) });\n }\n const rt = this.rt(threadId);\n rt.lastActivity = Date.now();\n const attachmentRefs = input.attachments ?? [];\n\n // Closed (crash/recycle/restart recovery) → drop the old session; the next message resumes via providerSessionId\n if (meta.status === \"closed\" && rt.session) {\n try { await rt.session.close(); } catch {}\n rt.session = null;\n rt.commands = [];\n }\n if (!rt.starting && rt.session === null && (rt.status === \"running\" || rt.status === \"initializing\" || rt.status === \"error\")) {\n rt.status = \"idle\";\n }\n\n if (rt.status === \"running\" || rt.starting || rt.status === \"initializing\") {\n const provider = this.providerOf(meta);\n if (behavior === \"steer\" && provider?.capabilities.steer && rt.session?.steer && !rt.starting) {\n try {\n const images = await this.resolveAttachments(attachmentRefs);\n await rt.session.steer({ text: withMentions(input.text, mentions), images, mentions });\n await this.appendRaw(threadId, {\n type: \"user_message\",\n text: input.text,\n steered: true,\n attachments: this.attachmentLabels(attachmentRefs),\n ...(mentions.length ? { mentions } : {}),\n });\n return \"steered\";\n } catch (e) {\n // Steering failed (e.g. the turn hasn't really started yet) → fall back to queueing so the message isn't lost\n log(\"info\", `thread ${threadId} 插话失败,改为排队:${String(e)}`);\n }\n }\n const q: QueuedMessage = { id: \"q\" + Date.now().toString(36) + Math.random().toString(36).slice(2, 6), text: input.text, attachments: attachmentRefs, ...(mentions.length ? { mentions } : {}) };\n rt.queue.push(q);\n this.gw.publish(`thread:${threadId}`, { type: \"queue\", queue: rt.queue });\n return \"queued\";\n }\n\n await this.startTurn(threadId, input.text, attachmentRefs, mentions);\n return \"started\";\n }\n\n private async startTurn(threadId: string, text: string, attachmentRefs: { path: string; mime: string; name?: string }[], mentions: Mention[] = []): Promise<void> {\n const rt = this.rt(threadId);\n rt.starting = true;\n try {\n await this.startTurnInner(threadId, text, attachmentRefs, mentions);\n } finally {\n rt.starting = false;\n }\n }\n\n private async startTurnInner(threadId: string, text: string, attachmentRefs: { path: string; mime: string; name?: string }[], mentions: Mention[]): Promise<void> {\n const meta = await this.mustThread(threadId);\n const rt = this.rt(threadId);\n // Conversations that already ran (have a providerSessionId) ignore \"disabled\": disabling only blocks new conversations\n const provider = await this.assertProviderUsable(meta.provider, { allowDisabled: !!meta.providerSessionId });\n\n if (!rt.session) {\n await this.setStatus(threadId, \"initializing\");\n try {\n await this.createSessionIfNeeded(threadId, { updateStatus: true });\n } catch (e) {\n await this.appendRaw(threadId, { type: \"notice\", level: \"error\", message: tr(\"notice.sessionStartFailed\", { detail: String((e as Error)?.message ?? e) }) });\n await this.appendRaw(threadId, { type: \"turn_ended\", status: \"failed\", error: String((e as Error)?.message ?? e) } as Partial<TimelineEvent> & { type: \"turn_ended\" });\n await this.setStatus(threadId, \"error\");\n throw e;\n }\n }\n\n // Auto title\n const trimmed = text.trim();\n if (meta.titleAuto && trimmed) {\n await this.threads.patch(threadId, { title: trimmed.slice(0, 40), titleAuto: true });\n this.gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: await this.threads.get(threadId) });\n }\n await this.appendRaw(threadId, {\n type: \"user_message\",\n text,\n attachments: this.attachmentLabels(attachmentRefs),\n ...(mentions.length ? { mentions } : {}),\n });\n await this.setStatus(threadId, \"running\");\n try {\n const images = await this.resolveAttachments(attachmentRefs);\n await rt.session!.send({ text: withMentions(text, mentions), images, mentions });\n } catch (e) {\n // A failed send must not leave the conversation running\n const msg = String((e as Error)?.message ?? e);\n await this.appendRaw(threadId, { type: \"notice\", level: \"error\", message: tr(\"notice.sendFailed\", { detail: msg }) });\n await this.appendRaw(threadId, { type: \"turn_ended\", status: \"failed\", error: msg } as Partial<TimelineEvent> & { type: \"turn_ended\" });\n await this.threads.patch(threadId, { lastTurnStatus: \"failed\" });\n rt.currentTurnId = null;\n await this.setStatus(threadId, \"idle\");\n throw e;\n }\n }\n\n // ---- event pump ----\n private async pumpEvents(threadId: string, session: ProviderSession): Promise<void> {\n const rt = this.rt(threadId);\n let ended = false;\n try {\n for await (const ev of session.events) {\n await this.onProviderEvent(threadId, ev);\n if (ev.type === \"turn_started\") ended = false; // A new turn started: reset (queued messages reuse the same session event stream)\n if (ev.type === \"turn_ended\") ended = true;\n }\n } catch (e) {\n log(\"warn\", `thread ${threadId} 事件流异常:${String(e)}`);\n }\n if (!ended && this.rt(threadId).session === session) {\n // Session exited unexpectedly: append failed\n await this.onProviderEvent(threadId, {\n type: \"turn_ended\",\n turnId: rt.currentTurnId ?? \"unknown\",\n status: \"failed\",\n error: tr(\"turn.agentExit\"),\n });\n rt.session = null;\n await this.setStatus(threadId, \"closed\");\n }\n }\n\n private async onProviderEvent(threadId: string, ev: ProviderEvent): Promise<void> {\n const rt = this.rt(threadId);\n rt.lastActivity = Date.now();\n\n if (ev.type === \"provider_session_id\") {\n await this.threads.patch(threadId, { providerSessionId: ev.id });\n return;\n }\n if (ev.type === \"slash_commands\") {\n rt.commands = ev.commands;\n const meta = await this.mustThread(threadId);\n const proj = await this.projects.get(meta.projectId);\n if (proj) this.putSlashCache(meta.provider, proj.path, ev.commands);\n this.gw.publish(`thread:${threadId}`, { type: \"commands\", commands: ev.commands });\n return;\n }\n if (ev.type === \"turn_started\") {\n rt.currentTurnId = ev.turnId;\n await this.appendRaw(threadId, ev);\n return;\n }\n if (ev.type === \"assistant_delta\" || ev.type === \"reasoning_delta\" || ev.type === \"tool_output_delta\") {\n // Goes through the coalescer, not persisted; Agents that never send the complete message get it saved from the deltas\n if (rt.deltasOnly && ev.type !== \"tool_output_delta\") {\n const key = `${ev.type === \"assistant_delta\" ? \"assistant\" : \"reasoning\"}\\0${ev.itemId}`;\n const prior = rt.pendingText.get(key);\n rt.pendingText.set(key, { type: ev.type === \"assistant_delta\" ? \"assistant\" : \"reasoning\", itemId: ev.itemId, text: (prior?.text ?? \"\") + ev.text });\n }\n rt.coalescer.push(deltaKey(ev.type, ev.itemId), ev.text);\n return;\n }\n // Before persisting a complete event, flush that itemId's pending deltas first (keeps ordering)\n const evItemId = (ev as { itemId?: unknown }).itemId;\n if (typeof evItemId === \"string\") this.flushDeltas(rt, evItemId);\n // Another item starts (tool call, plan, permission …) or the turn ends: the text streamed so far is complete, save it first\n if (rt.pendingText.size && ev.type !== \"usage\" && ev.type !== \"assistant_message\" && ev.type !== \"reasoning\") {\n await this.persistPendingText(threadId, rt);\n }\n if (ev.type === \"assistant_message\" || ev.type === \"reasoning\") {\n rt.pendingText.delete(`${ev.type === \"assistant_message\" ? \"assistant\" : \"reasoning\"}\\0${ev.itemId}`);\n await this.appendRaw(threadId, ev);\n return;\n }\n if (ev.type === \"usage\") {\n const meta = await this.mustThread(threadId);\n const u = meta.usage;\n await this.threads.patch(threadId, {\n usage: {\n inputTokens: u.inputTokens + ev.inputTokens,\n outputTokens: u.outputTokens + ev.outputTokens,\n cacheReadTokens: u.cacheReadTokens + ev.cacheReadTokens,\n costUsd: u.costUsd + ev.costUsd,\n },\n });\n await this.pushEvent(threadId, ev); // Pushing without persisting would also work; persisted so it can be reviewed later\n return;\n }\n if (ev.type === \"permission_request\" || ev.type === \"question\") {\n const options = ev.type === \"permission_request\" ? ev.options : [];\n const pending: PendingRequest = {\n kind: ev.type === \"permission_request\" ? \"permission\" : \"question\",\n requestId: ev.requestId,\n options,\n resolve: () => {},\n event: ev,\n };\n // allowAlways hit → approve directly\n const toolName = (ev as { detail?: { toolName?: string } }).detail?.toolName;\n if (toolName && rt.allowAlways.has(toolName)) {\n rt.session?.respond(ev.requestId, { optionId: \"accept\" });\n return;\n }\n rt.pending.set(ev.requestId, pending);\n await this.appendRaw(threadId, ev);\n return;\n }\n if (ev.type === \"permission_resolved\" || ev.type === \"question_answered\") {\n // The manager already persisted it (respond / interrupt) → drop the provider's echo to avoid duplicates\n if (!rt.pending.delete(ev.requestId)) return;\n await this.appendRaw(threadId, ev);\n return;\n }\n if (ev.type === \"turn_ended\") {\n // End a turn only once (drop a late one from the provider after the interrupt fallback already ended it)\n if (ev.turnId && ev.turnId !== \"unknown\" && rt.endedTurnIds.has(ev.turnId)) return;\n if (rt.interruptTimer) {\n clearTimeout(rt.interruptTimer);\n rt.interruptTimer = null;\n }\n if (ev.turnId && ev.turnId !== \"unknown\") rt.endedTurnIds.add(ev.turnId);\n rt.coalescer.dispose();\n rt.coalescer = this.newCoalescer(threadId);\n await this.appendRaw(threadId, ev);\n await this.threads.patch(threadId, { lastTurnStatus: ev.status });\n rt.currentTurnId = null;\n // After a failure/crash the session is dead (mock /exit) → clear it\n if (ev.status === \"failed\" && rt.session && !this.alive(rt.session)) rt.session = null;\n await this.setStatus(threadId, \"idle\");\n // Next queued message\n const next = rt.queue.shift();\n if (!next) void this.recycleIdle().catch(() => {});\n if (next) {\n this.gw.publish(`thread:${threadId}`, { type: \"queue\", queue: rt.queue });\n // A queued message that fails to start is only logged; it must not break the event pump (startTurn already wrote notice/turn_ended)\n await this.startTurn(threadId, next.text, next.attachments, next.mentions ?? []).catch((e) => {\n log(\"warn\", `thread ${threadId} 排队消息启动失败:${String(e)}`);\n });\n }\n return;\n }\n // Everything else: persist + push\n await this.appendRaw(threadId, ev);\n }\n\n private async persistPendingText(threadId: string, rt: Runtime): Promise<void> {\n const pending = [...rt.pendingText.values()];\n rt.pendingText.clear();\n for (const p of pending) {\n if (!p.text) continue;\n this.flushDeltas(rt, p.itemId);\n await this.appendRaw(threadId, { type: p.type === \"assistant\" ? \"assistant_message\" : \"reasoning\", itemId: p.itemId, text: p.text });\n }\n }\n\n private alive(_s: ProviderSession): boolean {\n return true; // mock /exit closes the queue; end of the event stream is handled separately\n }\n\n // ---- respond (permission/question answers) ----\n async respond(threadId: string, requestId: string, answer: RespondAnswer): Promise<void> {\n const rt = this.rt(threadId);\n const pending = rt.pending.get(requestId);\n if (!pending) throw new ApiError(\"not_found\", tr(\"err.requestGone\"));\n if (pending.kind === \"permission\" && answer.optionId) {\n const valid = pending.options.some((o) => o.id === answer.optionId);\n if (!valid) throw new ApiError(\"bad_params\", tr(\"err.badOption\", { id: String(answer.optionId) }));\n }\n rt.pending.delete(requestId);\n if (pending.kind === \"permission\") {\n await this.appendRaw(threadId, {\n type: \"permission_resolved\",\n requestId,\n optionId: answer.optionId,\n cancelled: answer.cancelled,\n });\n const opt = pending.options.find((o) => o.id === answer.optionId);\n if (opt?.kind === \"allow_always\") {\n const toolName = (pending.event as { detail?: { toolName?: string } }).detail?.toolName;\n if (toolName) rt.allowAlways.add(toolName);\n }\n } else {\n await this.appendRaw(threadId, {\n type: \"question_answered\",\n requestId,\n answers: answer.answers ?? {},\n });\n }\n rt.session?.respond(requestId, answer);\n }\n\n // ---- interrupt ----\n async interrupt(threadId: string): Promise<void> {\n const rt = this.rt(threadId);\n if (!rt.session || rt.status !== \"running\") return;\n // Invalidate all pending requests\n for (const [id, p] of rt.pending) {\n await this.appendRaw(threadId, { type: \"permission_resolved\", requestId: id, cancelled: true });\n p.resolve({ cancelled: true });\n }\n rt.pending.clear();\n await rt.session.interrupt();\n const turnId = rt.currentTurnId;\n // No turn_ended within 1 second → append interrupted\n // Use the normal turn_ended path: clear currentTurnId, write lastTurnStatus, continue the queue\n rt.interruptTimer = setTimeout(() => {\n rt.interruptTimer = null;\n if (rt.currentTurnId === turnId && turnId) {\n void this.onProviderEvent(threadId, { type: \"turn_ended\", turnId, status: \"interrupted\" }).catch((e) => {\n log(\"warn\", `thread ${threadId} 打断兜底失败:${String(e)}`);\n });\n }\n }, 1000);\n }\n\n // ---- setModel / setMode / setEffort ----\n async setModel(threadId: string, model: string | null): Promise<void> {\n const meta = await this.mustThread(threadId);\n let effort = meta.effort;\n const p = getProvider(meta.provider);\n if (p) {\n const models = await cachedModels(p);\n const row = models.find((m) => (model ? m.id === model : m.isDefault)) ?? models[0];\n const opts = row?.thinkingOptions ?? [];\n if (effort && opts.length && !opts.some((o) => o.id === effort)) {\n effort = null;\n await this.appendRaw(threadId, {\n type: \"notice\",\n level: \"info\",\n message: tr(\"notice.effortResetOnModel\"),\n });\n }\n }\n await this.threads.patch(threadId, { model, effort });\n const rt = this.rt(threadId);\n if (rt.session) await rt.session.setModel(model);\n this.gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: await this.threads.get(threadId) });\n }\n async setMode(threadId: string, mode: Mode): Promise<void> {\n await this.threads.patch(threadId, { mode });\n const rt = this.rt(threadId);\n if (rt.session) await rt.session.setMode(mode);\n this.gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: await this.threads.get(threadId) });\n }\n async setEffort(threadId: string, effort: string | null): Promise<void> {\n const meta = await this.mustThread(threadId);\n await this.threads.patch(threadId, { effort });\n const rt = this.rt(threadId);\n if (rt.session) await rt.session.setEffort(effort);\n if (meta.provider === \"claude\" && (rt.status === \"running\" || rt.status === \"initializing\")) {\n await this.appendRaw(threadId, {\n type: \"notice\",\n level: \"info\",\n message: tr(\"notice.effortNextTurn\"),\n });\n }\n this.gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: await this.threads.get(threadId) });\n }\n\n async setCursorOpts(\n threadId: string,\n patch: { cursorFast?: boolean; cursorAutoReview?: boolean },\n ): Promise<void> {\n const meta = await this.mustThread(threadId);\n if (meta.provider !== \"cursor\") throw new ApiError(\"bad_params\", tr(\"err.cursorOnly\"));\n const next = await this.threads.patch(threadId, patch);\n const rt = this.rt(threadId);\n const sess = rt.session as { updateCursorOpts?(f: boolean, a: boolean): Promise<void> } | null;\n if (sess?.updateCursorOpts) {\n await sess.updateCursorOpts(!!next.cursorFast, !!next.cursorAutoReview);\n }\n this.gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: next });\n }\n\n /** The Agent can be switched only before any user message and while not running */\n async setProvider(threadId: string, providerId: string): Promise<void> {\n await this.mustThread(threadId);\n const meta = await this.threads.get(threadId);\n if (!meta) throw new ApiError(\"not_found\", tr(\"err.threadMissing\"));\n const rt = this.rt(threadId);\n if (rt.status === \"running\" || rt.status === \"initializing\" || rt.starting) {\n throw new ApiError(\"busy\", tr(\"err.busySwitch\"));\n }\n const events = await this.threads.readEvents(threadId, 0, 5000);\n if (events.some((e) => e.type === \"user_message\")) {\n throw new ApiError(\"bad_params\", tr(\"err.hasMessages\"));\n }\n const p = await this.assertProviderUsable(providerId);\n if (rt.session) {\n try {\n await rt.session.close();\n } catch {}\n rt.session = null;\n rt.commands = [];\n }\n rt.status = \"idle\";\n await this.threads.patch(threadId, {\n provider: providerId,\n model: null,\n mode: clampMode(p.capabilities.modes, meta.mode),\n effort: null,\n providerSessionId: null,\n status: \"idle\",\n });\n this.gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: await this.threads.get(threadId) });\n }\n\n async close(threadId: string): Promise<void> {\n const rt = this.rt(threadId);\n if (rt.session) {\n try {\n await rt.session.close();\n } catch {}\n rt.session = null;\n rt.commands = [];\n }\n await this.setStatus(threadId, \"closed\");\n }\n\n /** Slash commands: no session by default; only with load:true do we create a session for providers that need one to list them */\n async listCommands(threadId: string, opts?: { load?: boolean }): Promise<SlashCommand[]> {\n let meta: ThreadMeta;\n try {\n meta = await this.mustThread(threadId);\n } catch {\n return [];\n }\n const rt = this.rt(threadId);\n const proj = await this.projects.get(meta.projectId);\n if (!proj) return [];\n\n if (meta.provider === \"codex\") {\n try {\n const commands = codexSlashCommandsFromEntries(await loadCodexSlashEntries(proj.path));\n rt.commands = commands;\n this.putSlashCache(meta.provider, proj.path, commands);\n return commands;\n } catch {\n return this.getSlashCache(meta.provider, proj.path) ?? rt.commands;\n }\n }\n\n if (rt.session) {\n try {\n const commands = await rt.session.listCommands();\n rt.commands = commands;\n this.putSlashCache(meta.provider, proj.path, commands);\n return commands;\n } catch {\n return rt.commands.length ? rt.commands : (this.getSlashCache(meta.provider, proj.path) ?? []);\n }\n }\n\n const cached = this.getSlashCache(meta.provider, proj.path);\n if (cached) {\n rt.commands = cached;\n return cached;\n }\n\n if (!opts?.load) return [];\n\n try {\n const session = await this.createSessionIfNeeded(threadId, { updateStatus: false });\n const commands = await session.listCommands();\n rt.commands = commands;\n this.putSlashCache(meta.provider, proj.path, commands);\n return commands;\n } catch {\n return [];\n }\n }\n\n private slashCacheKey(provider: string, projectPath: string): string {\n return `${provider}\\u0000${projectPath}`;\n }\n\n private getSlashCache(provider: string, projectPath: string): SlashCommand[] | null {\n const hit = this.slashCache.get(this.slashCacheKey(provider, projectPath));\n if (!hit) return null;\n if (Date.now() > hit.expires) {\n this.slashCache.delete(this.slashCacheKey(provider, projectPath));\n return null;\n }\n return hit.commands;\n }\n\n private putSlashCache(provider: string, projectPath: string, commands: SlashCommand[]): void {\n // Don't cache an empty list: commands often arrive late (async push), and a cached empty result would keep the menu empty for the TTL\n if (!commands.length) return;\n this.slashCache.set(this.slashCacheKey(provider, projectPath), {\n commands,\n expires: Date.now() + SLASH_CACHE_TTL_MS,\n });\n }\n\n private async createSessionIfNeeded(\n threadId: string,\n opts: { updateStatus: boolean },\n ): Promise<ProviderSession> {\n const rt = this.rt(threadId);\n if (rt.session) return rt.session;\n if (rt.sessionCreating) return rt.sessionCreating;\n\n const creating = this.createSessionInner(threadId, opts);\n rt.sessionCreating = creating;\n try {\n return await creating;\n } finally {\n if (rt.sessionCreating === creating) rt.sessionCreating = null;\n }\n }\n\n private async createSessionInner(\n threadId: string,\n opts: { updateStatus: boolean },\n ): Promise<ProviderSession> {\n const meta = await this.mustThread(threadId);\n const rt = this.rt(threadId);\n if (rt.session) return rt.session;\n const provider = await this.assertProviderUsable(meta.provider, { allowDisabled: !!meta.providerSessionId });\n const proj = await this.projects.get(meta.projectId);\n if (!proj) throw new ApiError(\"not_found\", tr(\"err.projectMissing\"));\n let model = meta.model;\n // DSH model IDs come from ACP; old conversations may still hold a model ID from another Agent.\n // Clear that stale value so it isn't sent to the wrong Magpie provider route.\n if (meta.provider === \"dsh\" && model) {\n // Use the cache: listModels spawns a dsh ACP probe process, too wasteful to do for every new session\n const available = await cachedModels(provider).catch(() => []);\n if (available.length && !available.some((m) => m.id === model)) {\n // Prefer DSH's Magpie-routed model so it doesn't fall back to DeepSeek's official model without an API key.\n model = available.find((m) => /magpie/i.test(m.id))?.id ?? available.find((m) => m.isDefault)?.id ?? null;\n await this.threads.patch(threadId, { model });\n this.gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: await this.threads.get(threadId) });\n }\n } else if (meta.provider === \"dsh\" && !model) {\n // No model picked: start dsh on the route a new conversation would use (its ACP takes images only for the route it starts on)\n const available = await cachedModels(provider).catch(() => []);\n const magpie = available.filter((m) => /magpie/i.test(m.id));\n model = (magpie.find((m) => m.isDefault) ?? magpie[0] ?? available.find((m) => m.isDefault))?.id ?? null;\n }\n if (opts.updateStatus) await this.setStatus(threadId, \"initializing\");\n const settings = await this.settings.get();\n const launch = launchFromSettings(settings, meta.provider);\n rt.deltasOnly = !!provider.capabilities.deltasOnly;\n rt.session = await provider.createSession({\n threadId,\n cwd: proj.path,\n model,\n mode: clampMode(provider.capabilities.modes, meta.mode),\n effort: meta.effort,\n resumeId: meta.providerSessionId,\n cursorFast: meta.cursorFast,\n cursorAutoReview: meta.cursorAutoReview,\n launch,\n });\n void this.pumpEvents(threadId, rt.session);\n return rt.session;\n }\n\n async deleteThread(threadId: string): Promise<void> {\n await this.close(threadId);\n this.runtimes.delete(threadId);\n await this.threads.delete(threadId);\n }\n\n // ---- internals ----\n private async mustThread(threadId: string): Promise<ThreadMeta> {\n const meta = await this.threads.get(threadId);\n if (!meta) throw new ApiError(\"not_found\", tr(\"err.threadMissing\"));\n return meta;\n }\n\n private providerOf(meta: ThreadMeta): Provider | undefined {\n return getProvider(meta.provider);\n }\n\n private async assertProviderUsable(providerId: string, opts: { allowDisabled?: boolean } = {}): Promise<Provider> {\n const p = getProvider(providerId);\n if (!p) throw new ApiError(\"bad_params\", tr(\"provider.unknown\", { id: providerId }));\n const s = await this.settings.get();\n if (!opts.allowDisabled && !isProviderEnabled(s, providerId)) {\n throw new ApiError(\"bad_params\", tr(\"provider.disabledNamed\", { name: p.name }));\n }\n const entry = catalogById(providerId);\n if (entry && !providerCreatable(entry.status)) {\n throw new ApiError(\"bad_params\", tr(\"provider.plannedNamed\", { name: p.name }));\n }\n const det = await cachedDetect(p, launchFromSettings(s, providerId));\n if (!det.available) throw new ApiError(\"bad_params\", det.reason ?? tr(\"provider.unavailable\", { name: p.name }));\n return p;\n }\n\n private async setStatus(threadId: string, status: ThreadMeta[\"status\"]): Promise<void> {\n const rt = this.rt(threadId);\n rt.status = status;\n const meta = await this.threads.patch(threadId, { status });\n this.gw.publish(\"sidebar\", { type: \"thread.upsert\", thread: meta });\n this.gw.publish(`thread:${threadId}`, { type: \"status\", status }); // Frontend running state / timer / send button\n }\n\n // Append an event: seq is assigned in the store's serialized section, persisted, then pushed to thread:<id>\n private async appendRaw(threadId: string, ev: Record<string, unknown> & { type: TimelineEvent[\"type\"] }): Promise<void> {\n const full = await this.threads.appendEvent(threadId, { ...ev, ts: Date.now() });\n this.gw.publish(`thread:${threadId}`, { type: \"event\", event: full });\n }\n\n // Push without persisting (for coalescer deltas; usage is already accumulated above).\n // Unpersisted events take no seq: seq=-1 so the frontend dedupes only by persisted seq,\n // otherwise deltas would push the client's maxSeq up and the following persisted events would be dropped by mistake.\n private async pushEvent(threadId: string, ev: Record<string, unknown> & { type: TimelineEvent[\"type\"] }): Promise<void> {\n const full = { ...ev, seq: -1, ts: Date.now(), threadId } as TimelineEvent;\n this.gw.publish(`thread:${threadId}`, { type: \"event\", event: full });\n }\n\n /** B17: idle Agent processes are closed after idleCloseMinutes, and at most MAX_WARM_IDLE of them stay warm\n * (least recently used go first). A running turn, one starting, or one waiting on an approval is never touched. */\n private recycling = false;\n async recycleIdle(): Promise<void> {\n if (this.recycling) return;\n this.recycling = true;\n try {\n const s = await this.settings.get();\n const minutes = Number(s.idleCloseMinutes);\n const limit = (Number.isFinite(minutes) && minutes > 0 ? minutes : 30) * 60_000;\n const idle = [...this.runtimes.values()]\n .filter((rt) => rt.session && rt.status === \"idle\" && !rt.starting && !rt.sessionCreating && rt.pending.size === 0 && rt.queue.length === 0)\n .sort((a, b) => b.lastActivity - a.lastActivity);\n const now = Date.now();\n for (const [i, rt] of idle.entries()) {\n const expired = now - rt.lastActivity > limit;\n if (!expired && i < MAX_WARM_IDLE) continue;\n log(\"info\", `idle cleanup: closing thread ${rt.threadId} (${expired ? \"idle timeout\" : \"over the warm limit\"})`);\n try {\n await this.close(rt.threadId);\n } catch (e) {\n // The conversation may have been deleted meanwhile: just forget its runtime\n log(\"info\", `idle cleanup: thread ${rt.threadId}: ${String((e as Error)?.message ?? e)}`);\n this.runtimes.delete(rt.threadId);\n }\n }\n } finally {\n this.recycling = false;\n }\n }\n}\n","// Coalescer (after Paseo's agent-stream-coalescer):\n// accumulate deltas per itemId; the first is pushed immediately (leading), the rest accumulated within the window are pushed once (trailing);\n// flush that itemId before its complete event arrives.\nexport class Coalescer {\n private windowMs: number;\n private acc = new Map<string, { text: string; timer: NodeJS.Timeout | null }>();\n private onEmit: (itemId: string, text: string) => void;\n constructor(windowMs: number, onEmit: (itemId: string, text: string) => void) {\n this.windowMs = windowMs;\n this.onEmit = onEmit;\n }\n\n // Push a delta; the first goes out immediately, the rest are merged within the window and sent trailing\n push(itemId: string, text: string): void {\n const acc = this.acc.get(itemId);\n if (!acc) {\n // leading: send immediately\n this.onEmit(itemId, text);\n this.acc.set(itemId, { text: \"\", timer: setTimeout(() => this.flush(itemId), this.windowMs) });\n return;\n }\n acc.text += text;\n }\n\n // Must flush before the complete event arrives to keep ordering (deltas before the complete event)\n flush(itemId: string): void {\n const acc = this.acc.get(itemId);\n if (!acc) return;\n if (acc.timer) {\n clearTimeout(acc.timer);\n acc.timer = null;\n }\n if (acc.text.length > 0) this.onEmit(itemId, acc.text);\n this.acc.delete(itemId);\n }\n\n // Call before an itemId's complete event arrives: flush the deltas not yet sent\n flushItem(itemId: string): void {\n this.flush(itemId);\n }\n\n dispose(): void {\n for (const id of [...this.acc.keys()]) this.flush(id);\n }\n}\n","// GitService (§5.8): runs the local git via execFile (no shell), cwd = project path, 15 s timeout.\nimport { execFile } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { cp, mkdir, readFile, rename, rm, stat } from \"node:fs/promises\";\nimport { join, normalize, sep } from \"node:path\";\nimport { tr } from \"../util/i18n.js\";\n\nexport type GitFileEntry = {\n path: string;\n index: string;\n worktree: string;\n kind: \"modified\" | \"added\" | \"deleted\" | \"untracked\" | \"renamed\";\n};\nexport type GitStatus = { isRepo: boolean; branch?: string; files?: GitFileEntry[]; error?: string };\n\nconst TIMEOUT = 15_000;\nconst DIFF_LIMIT = 1024 * 1024;\n\nfunction runGit(cwd: string, args: string[]): Promise<{ code: number; out: string; err: string }> {\n return new Promise((res) => {\n // core.quotepath=false: non-ASCII paths (e.g. Chinese file names) are no longer turned into \"\\346\\226\\207\" octal escapes in diff headers\n execFile(\"git\", [\"-c\", \"core.quotepath=false\", ...args], { cwd, timeout: TIMEOUT, maxBuffer: 8 * 1024 * 1024, windowsHide: true }, (e, stdout, stderr) => {\n const code = e && typeof (e as { code?: number }).code === \"number\" ? (e as { code: number }).code! : e ? 1 : 0;\n const missing = (e as NodeJS.ErrnoException | null)?.code === \"ENOENT\";\n res({ code, out: String(stdout ?? \"\"), err: missing ? tr(\"git.missing\") : String(stderr || (e?.message ?? \"\")) });\n });\n });\n}\n\n// The path must be inside the project (no .. escape); returns the project-relative path (posix form)\nfunction insidePath(projectPath: string, p: string): string | null {\n const rel = normalize(p).replace(/\\\\/g, \"/\");\n const abs = normalize(join(projectPath, rel));\n const proj = normalize(projectPath);\n if (abs !== proj && !abs.startsWith(proj + sep)) return null;\n return rel.replace(/\\\\/g, \"/\");\n}\n\n// rename across drives/volumes (Windows project on D:, data dir on C:; different mount points on Linux) fails with EXDEV → copy then delete\nexport async function moveAcrossDevices(\n from: string,\n to: string,\n ops: { rename?: typeof rename; cp?: typeof cp; rm?: typeof rm } = {},\n): Promise<void> {\n const ren = ops.rename ?? rename;\n try {\n await ren(from, to);\n } catch (e) {\n const code = (e as NodeJS.ErrnoException)?.code;\n if (code !== \"EXDEV\") throw e;\n await (ops.cp ?? cp)(from, to, { recursive: true, errorOnExist: true, force: false, preserveTimestamps: true });\n await (ops.rm ?? rm)(from, { recursive: true, force: true });\n }\n}\n\nexport class GitService {\n // projectPath is resolved from projectId by the caller (the service doesn't know about the store)\n async status(projectPath: string): Promise<GitStatus> {\n const inside = await runGit(projectPath, [\"rev-parse\", \"--is-inside-work-tree\"]);\n if (inside.code !== 0 || inside.out.trim() !== \"true\") return { isRepo: false };\n const br = await runGit(projectPath, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n const st = await runGit(projectPath, [\"status\", \"--porcelain=v1\", \"-z\", \"-uall\"]);\n if (st.code !== 0) return { isRepo: true, branch: br.out.trim() || undefined, error: st.err.trim() || \"status 失败\" };\n const files: GitFileEntry[] = [];\n const parts = st.out.split(\"\\0\");\n for (let i = 0; i < parts.length; i++) {\n const rec = parts[i];\n if (!rec || rec.length < 4) continue;\n const index = rec[0];\n const worktree = rec[1];\n let path = rec.slice(3);\n let kind: GitFileEntry[\"kind\"] = \"modified\";\n if (index === \"?\" && worktree === \"?\") kind = \"untracked\";\n else if (index === \"R\" || worktree === \"R\") {\n kind = \"renamed\";\n // A renamed record looks like \"R new\\0old\": the next part is the old path, skip it\n i++;\n } else if (index === \"A\" || worktree === \"A\") kind = \"added\";\n else if (index === \"D\" || worktree === \"D\") kind = \"deleted\";\n files.push({ path, index, worktree, kind });\n }\n return { isRepo: true, branch: br.out.trim() || undefined, files };\n }\n\n // Unified diff text; {tooLarge:true} when the diff is > 1MB\n async diff(projectPath: string, p: string): Promise<{ diff?: string; tooLarge?: boolean; untracked?: boolean; error?: string }> {\n const rel = insidePath(projectPath, p);\n if (!rel) return { error: tr(\"fs.pathDenied\") };\n // Check untracked first (git diff prints nothing for untracked files)\n const ls = await runGit(projectPath, [\"ls-files\", \"--error-unmatch\", \"--\", rel]);\n if (ls.code !== 0) {\n // Untracked/not in the index: treat the whole file as added\n const full = join(projectPath, rel);\n if (!existsSync(full)) return { error: tr(\"fs.fileMissing\") };\n const s = await stat(full);\n if (!s.isFile()) return { error: tr(\"fs.notFile\") };\n if (s.size > DIFF_LIMIT) return { tooLarge: true };\n const text = await readFile(full, \"utf8\").catch(() => null);\n if (text === null) return { error: tr(\"git.binary\") };\n const lines = text.split(\"\\n\").map((l) => \"+\" + l).join(\"\\n\");\n return { untracked: true, diff: `--- /dev/null\\n+++ b/${rel}\\n@@ -0,0 +1,${text.split(\"\\n\").length} @@\\n${lines}` };\n }\n let d = await runGit(projectPath, [\"diff\", \"--no-color\", \"--\", rel]);\n if (d.code !== 0) return { error: d.err.trim() || \"diff 失败\" };\n if (!d.out.trim()) {\n d = await runGit(projectPath, [\"diff\", \"--cached\", \"--no-color\", \"--\", rel]);\n if (d.code !== 0) return { error: d.err.trim() || \"diff 失败\" };\n }\n if (d.out.length > DIFF_LIMIT) return { tooLarge: true };\n return { diff: d.out };\n }\n\n // Tracked → git restore; untracked → move to trash/discarded/<ts>/<relpath>\n async discard(projectPath: string, p: string, dataDir: string): Promise<{ ok: boolean; trashedTo?: string; error?: string }> {\n const rel = insidePath(projectPath, p);\n if (!rel) return { ok: false, error: tr(\"fs.pathDenied\") };\n // Only discard a single file: an empty path / \".\" would make git restore act on the whole repository\n if (rel === \".\" || rel === \"\" || rel === \"./\") return { ok: false, error: tr(\"fs.pathDenied\") };\n const ls = await runGit(projectPath, [\"ls-files\", \"--error-unmatch\", \"--\", rel]);\n if (ls.code === 0) {\n let r = await runGit(projectPath, [\"restore\", \"--staged\", \"--worktree\", \"--\", rel]);\n if (r.code !== 0) r = await runGit(projectPath, [\"checkout\", \"--\", rel]);\n if (r.code !== 0) return { ok: false, error: r.err.trim() || \"放弃失败\" };\n return { ok: true };\n }\n const full = join(projectPath, rel);\n if (!existsSync(full)) return { ok: false, error: tr(\"fs.fileMissing\") };\n const stamp = new Date().toISOString().replace(/[:.]/g, \"-\").slice(0, 19);\n const dest = join(dataDir, \"trash\", \"discarded\", stamp, rel);\n await mkdir(join(dest, \"..\"), { recursive: true });\n try {\n await moveAcrossDevices(full, dest);\n } catch (e) {\n return { ok: false, error: \"移动失败:\" + String((e as Error)?.message ?? e) };\n }\n return { ok: true, trashedTo: dest };\n }\n}\n","// FileService (§5.9): file tree (lazily, one level at a time) and file preview.\n// tree: ignore .git/node_modules + the project root .gitignore (ignore library); directories first, sorted by name; ≤2000 per level.\n// read: ≤1MB; a \\0 in the first 8KB → {binary}; otherwise {text, language} (inferred from the extension).\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, normalize, sep, relative, extname } from \"node:path\";\nimport ignore from \"ignore\";\nimport { tr } from \"../util/i18n.js\";\n\nexport type TreeEntry = { name: string; path: string; isDir: boolean };\nexport type ReadResult = {\n text?: string;\n language?: string;\n encoding?: \"utf8\" | \"gbk\";\n binary?: boolean;\n tooLarge?: boolean;\n error?: string;\n};\n\n/** Text decoding: UTF-8 (BOM stripped); if it isn't valid UTF-8 try GBK once (old files on Chinese Windows), else lenient UTF-8. */\nexport function decodeText(buf: Buffer): { text: string; encoding: \"utf8\" | \"gbk\" } {\n try {\n const text = new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: false }).decode(buf);\n return { text, encoding: \"utf8\" };\n } catch {}\n try {\n const text = new TextDecoder(\"gbk\", { fatal: true }).decode(buf);\n return { text, encoding: \"gbk\" };\n } catch {}\n return { text: new TextDecoder(\"utf-8\").decode(buf), encoding: \"utf8\" };\n}\n\nconst MAX_READ = 1024 * 1024;\nconst MAX_PER_LEVEL = 2000;\nconst ALWAYS_IGNORE = new Set([\".git\", \"node_modules\"]);\n\nconst LANG: Record<string, string> = {\n \".ts\": \"typescript\", \".tsx\": \"typescript\", \".js\": \"javascript\", \".jsx\": \"javascript\",\n \".mjs\": \"javascript\", \".cjs\": \"javascript\", \".json\": \"json\", \".md\": \"markdown\",\n \".py\": \"python\", \".rs\": \"rust\", \".go\": \"go\", \".java\": \"java\", \".c\": \"c\", \".h\": \"c\",\n \".cpp\": \"cpp\", \".hpp\": \"cpp\", \".cs\": \"csharp\", \".css\": \"css\", \".scss\": \"scss\",\n \".html\": \"xml\", \".htm\": \"xml\", \".xml\": \"xml\", \".svg\": \"xml\", \".yaml\": \"yaml\", \".yml\": \"yaml\",\n \".toml\": \"ini\", \".ini\": \"ini\", \".sh\": \"bash\", \".bash\": \"bash\", \".ps1\": \"powershell\",\n \".sql\": \"sql\", \".lua\": \"lua\", \".rb\": \"ruby\", \".php\": \"php\", \".swift\": \"swift\",\n \".kt\": \"kotlin\", \".vue\": \"xml\", \".svelte\": \"xml\", \".dockerfile\": \"dockerfile\",\n \".txt\": \"plaintext\", \".log\": \"plaintext\",\n};\n\nfunction insidePath(projectPath: string, p: string): string | null {\n const rel = normalize(p || \".\").replace(/\\\\/g, \"/\");\n const abs = normalize(join(projectPath, rel));\n const proj = normalize(projectPath);\n if (abs !== proj && !abs.startsWith(proj + sep)) return null;\n return rel;\n}\n\nexport class FileService {\n // Cache an ignore instance per project (.gitignore changes are picked up on the next daemon restart; acceptable cost)\n // Invalidate by .gitignore mtime: an edited .gitignore takes effect the next time a directory is expanded\n private igCache = new Map<string, { mtime: number; ig: ReturnType<typeof ignore> | null }>();\n\n private async igFor(projectPath: string) {\n const gi = join(projectPath, \".gitignore\");\n const st = await stat(gi).catch(() => null);\n const mtime = st?.isFile() ? st.mtimeMs : -1;\n const hit = this.igCache.get(projectPath);\n if (hit && hit.mtime === mtime) return hit.ig;\n let ig: ReturnType<typeof ignore> | null = null;\n if (mtime >= 0) {\n try {\n ig = ignore().add(await readFile(gi, \"utf8\"));\n } catch {\n ig = null;\n }\n }\n this.igCache.set(projectPath, { mtime, ig });\n return ig;\n }\n\n async tree(projectPath: string, dir: string): Promise<{ entries?: TreeEntry[]; error?: string }> {\n const rel = insidePath(projectPath, dir);\n if (rel === null) return { error: tr(\"fs.pathDenied\") };\n const abs = join(projectPath, rel);\n const s = await stat(abs).catch(() => null);\n if (!s?.isDirectory()) return { error: tr(\"fs.dirMissing\") };\n const ig = await this.igFor(projectPath);\n const dirents = await readdir(abs, { withFileTypes: true }).catch(() => null);\n if (!dirents) return { error: tr(\"fs.dirUnreadable\") };\n const out: TreeEntry[] = [];\n for (const d of dirents) {\n if (out.length >= MAX_PER_LEVEL) break;\n const name = d.name;\n if (ALWAYS_IGNORE.has(name)) continue;\n const childRel = rel === \".\" ? name : `${rel}/${name}`;\n // Only symlinks / junctions get an extra stat (to see whether they point at a directory); large directories are no longer stat'ed entry by entry\n let isDir = d.isDirectory();\n if (d.isSymbolicLink()) {\n const st = await stat(join(projectPath, childRel)).catch(() => null);\n if (!st) continue;\n isDir = st.isDirectory();\n } else if (!d.isFile() && !isDir) {\n continue; // socket / fifo etc.\n }\n if (ig) {\n // The ignore library wants posix relative paths; directory rules need a trailing / to match directories\n if (ig.ignores(isDir ? childRel + \"/\" : childRel)) continue;\n }\n out.push({ name, path: childRel, isDir });\n }\n out.sort((a, b) => (a.isDir === b.isDir ? a.name.localeCompare(b.name, \"zh-CN\") : a.isDir ? -1 : 1));\n return { entries: out };\n }\n\n async read(projectPath: string, p: string): Promise<ReadResult> {\n const rel = insidePath(projectPath, p);\n if (rel === null) return { error: tr(\"fs.pathDenied\") };\n const abs = join(projectPath, rel);\n const s = await stat(abs).catch(() => null);\n if (!s) return { error: tr(\"fs.fileMissing\") };\n if (!s.isFile()) return { error: tr(\"fs.notFile\") };\n if (s.size > MAX_READ) return { tooLarge: true };\n const buf = await readFile(abs).catch(() => null);\n if (!buf) return { error: tr(\"fs.unreadable\") };\n const head = buf.subarray(0, 8192);\n if (head.includes(0)) return { binary: true };\n const { text, encoding } = decodeText(buf);\n return { text, encoding, language: LANG[extname(rel).toLowerCase()] ?? \"plaintext\" };\n }\n}\n","// TerminalService (§7.5): node-pty first, falling back to a no-PTY mode if it can't be loaded.\n// Output goes into a ring buffer (5000 lines / 2MB), coalesced every 16ms and pushed as gateway binary frames to connections subscribed to terminal:<index>.\n// Frame format (§5.4): [op:1][index:2 BE][payload]; op 1=output 2=input 3=resize (JSON).\nimport { spawn, execFileSync, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport { accessSync, chmodSync, constants as fsc, existsSync, statSync } from \"node:fs\";\nimport { createRequire as moduleRequire } from \"node:module\";\nimport { release } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { StringDecoder } from \"node:string_decoder\";\nimport { findOnPath } from \"../../../lib/pathscan.mjs\";\nimport type { Gateway } from \"../ws/gateway.js\";\nimport { log } from \"../log.js\";\nimport { tr } from \"../util/i18n.js\";\n\ntype Pty = {\n write(data: string): void;\n resize(cols: number, rows: number): void;\n kill(): void;\n onData(cb: (d: string) => void): void;\n onExit(cb: (e: { exitCode: number }) => void): void;\n pid: number;\n};\n\ntype Term = {\n id: string;\n index: number;\n projectId: string;\n cwd: string;\n title: string;\n alive: boolean;\n simple: boolean; // No-PTY fallback\n pty: Pty | null;\n proc: ChildProcessWithoutNullStreams | null;\n buf: string; // Ring buffer text (≤2MB; attach takes the last 5000 lines)\n pend: string; // Pending output, coalesced every 16ms\n timer: NodeJS.Timeout | null;\n exited?: boolean;\n};\n\nconst MAX_TERMS_PER_PROJECT = 8;\nconst BUF_MAX = 2 * 1024 * 1024;\nconst SNAP_LINES = 5000;\n\ntype ShellEnv = {\n platform?: NodeJS.Platform;\n env?: NodeJS.ProcessEnv;\n find?: (name: string) => string | null;\n isExec?: (file: string) => boolean;\n};\n\nfunction isExecFile(file: string): boolean {\n try {\n accessSync(file, fsc.X_OK);\n return statSync(file).isFile();\n } catch {\n return false;\n }\n}\n\n/** Default shell: Windows pwsh → powershell → cmd; elsewhere $SHELL (if it exists) → macOS zsh → bash → sh. */\nexport function pickShell(o: ShellEnv = {}): string {\n const platform = o.platform ?? process.platform;\n const env = o.env ?? process.env;\n const find = o.find ?? ((n: string) => findOnPath(n, { platform, env })[0] ?? null);\n const isExec = o.isExec ?? isExecFile;\n if (platform === \"win32\") {\n for (const s of [\"pwsh\", \"powershell\"]) {\n const hit = find(s);\n if (hit) return hit;\n }\n const sysRoot = env.SystemRoot || env.SYSTEMROOT || env.windir || \"C:\\\\Windows\";\n const ps = `${sysRoot}\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe`;\n if (isExec(ps)) return ps;\n return env.ComSpec || env.COMSPEC || \"cmd.exe\";\n }\n if (env.SHELL && env.SHELL.startsWith(\"/\") && isExec(env.SHELL)) return env.SHELL;\n const order = platform === \"darwin\" ? [\"/bin/zsh\", \"/bin/bash\", \"/bin/sh\"] : [\"/bin/bash\", \"/usr/bin/bash\", \"/bin/zsh\", \"/bin/sh\"];\n for (const s of order) if (isExec(s)) return s;\n return \"/bin/sh\";\n}\n\n/** Shell arguments without a PTY: powershell needs -Command - since it doesn't read a stdin prompt; cmd uses /Q; POSIX uses interactive -i. */\nexport function simpleShellArgs(shell: string, platform: NodeJS.Platform = process.platform): string[] {\n if (platform === \"win32\") {\n if (/(^|[\\\\/])cmd(\\.exe)?$/i.test(shell)) return [\"/Q\"];\n return [\"-NoLogo\"];\n }\n return [\"-i\"];\n}\n\n/** node-pty's macOS prebuilds start children through spawn-helper; npm unpacking sometimes drops its executable bit → posix_spawnp failed. */\nfunction fixSpawnHelper(): void {\n if (process.platform !== \"darwin\") return;\n try {\n const req = moduleRequire(import.meta.url);\n const root = dirname(req.resolve(\"node-pty/package.json\"));\n for (const sub of [`prebuilds/darwin-${process.arch}`, \"build/Release\"]) {\n const f = join(root, sub, \"spawn-helper\");\n if (existsSync(f) && !isExecFile(f)) {\n chmodSync(f, 0o755);\n log(\"info\", \"已修复 node-pty spawn-helper 的可执行位\", { file: f });\n }\n }\n } catch {}\n}\n\nfunction conptyInfo(): { backend: \"conpty\"; buildNumber: number } {\n const build = Number(release().split(\".\")[2]);\n return { backend: \"conpty\", buildNumber: Number.isFinite(build) ? build : 0 };\n}\n\nlet nextIndex = 1;\nconst rid = () => \"t_\" + Math.random().toString(36).slice(2, 10);\n\nexport class TerminalService {\n private terms = new Map<string, Term>();\n private byIndex = new Map<number, Term>();\n private ptyLib: typeof import(\"node-pty\") | null | undefined;\n\n constructor(private gw: Gateway) {\n gw.onTerminalInput = (conn, index, op, payload) => this.onInput(conn, index, op, payload);\n }\n\n private async loadPty(): Promise<typeof import(\"node-pty\") | null> {\n if (this.ptyLib !== undefined) return this.ptyLib;\n try {\n fixSpawnHelper();\n this.ptyLib = await import(\"node-pty\");\n } catch (e) {\n log(\"warn\", \"node-pty 加载失败,终端退化无 PTY 方案\", { err: String(e) });\n this.ptyLib = null;\n }\n return this.ptyLib;\n }\n\n list(projectId?: string) {\n return [...this.terms.values()]\n .filter((t) => !projectId || t.projectId === projectId)\n .map((t) => ({ id: t.id, index: t.index, projectId: t.projectId, title: t.title, alive: t.alive, simple: t.simple }));\n }\n\n get count(): number {\n return [...this.terms.values()].filter((t) => t.alive).length;\n }\n\n async create(projectId: string, cwd: string, cols: number, rows: number): Promise<{ id: string; index: number; simple: boolean } | { error: string }> {\n const alive = [...this.terms.values()].filter((t) => t.projectId === projectId && t.alive);\n if (alive.length >= MAX_TERMS_PER_PROJECT) return { error: tr(\"term.max\", { n: MAX_TERMS_PER_PROJECT }) };\n const shell = pickShell();\n const term: Term = {\n id: rid(), index: nextIndex++, projectId, cwd, title: tr(\"term.title\", { n: alive.length + 1 }),\n alive: true, simple: false, pty: null, proc: null, buf: \"\", pend: \"\", timer: null,\n };\n const pty = await this.loadPty();\n if (pty) {\n try {\n const p = pty.spawn(shell, [], {\n name: \"xterm-256color\", cols: Math.max(20, cols), rows: Math.max(5, rows), cwd, env: process.env,\n });\n term.pty = { write: (d) => p.write(d), resize: (c, r) => p.resize(c, r), kill: () => p.kill(), onData: (cb) => p.onData(cb), onExit: (cb) => p.onExit(cb), pid: p.pid };\n term.pty.onData((d) => this.onData(term, d));\n term.pty.onExit(() => this.onExit(term));\n } catch (e) {\n log(\"warn\", \"pty.spawn 失败,退化无 PTY 方案\", { err: String(e) });\n }\n }\n if (!term.pty) {\n // No-PTY mode\n term.simple = true;\n const args = simpleShellArgs(shell);\n // Non-Windows: detached, its own process group, so closing the terminal kill(-pgid)s the commands running in the shell too\n const proc = spawn(shell, args, {\n cwd, stdio: \"pipe\", windowsHide: true, env: process.env,\n detached: process.platform !== \"win32\",\n });\n term.proc = proc;\n // StringDecoder: no garbling when a multibyte character (e.g. Chinese) is split across two chunks\n const outDec = new StringDecoder(\"utf8\");\n const errDec = new StringDecoder(\"utf8\");\n proc.stdout.on(\"data\", (d: Buffer) => this.onData(term, outDec.write(d)));\n proc.stderr.on(\"data\", (d: Buffer) => this.onData(term, errDec.write(d)));\n proc.on(\"exit\", () => this.onExit(term));\n proc.on(\"error\", () => this.onExit(term));\n }\n this.terms.set(term.id, term);\n this.byIndex.set(term.index, term);\n return { id: term.id, index: term.index, simple: term.simple };\n }\n\n attach(id: string): {\n index?: number;\n snapshot?: string;\n simple?: boolean;\n windowsPty?: { backend: \"conpty\"; buildNumber: number };\n error?: string;\n } {\n const t = this.terms.get(id);\n if (!t) return { error: tr(\"err.terminalMissing\") };\n // Last 5000 lines\n const lines = t.buf.split(\"\\n\");\n const snapshot = lines.length > SNAP_LINES ? lines.slice(-SNAP_LINES).join(\"\\n\") : t.buf;\n // On Windows node-pty uses ConPTY: tell xterm.js so it handles line reflow the ConPTY way\n const windowsPty = process.platform === \"win32\" && t.pty ? conptyInfo() : undefined;\n return { index: t.index, snapshot, simple: t.simple, ...(windowsPty ? { windowsPty } : {}) };\n }\n\n indexOf(id: string): number | null {\n return this.terms.get(id)?.index ?? null;\n }\n\n resize(id: string, cols: number, rows: number): { ok: boolean } {\n const t = this.terms.get(id);\n if (!t || !t.alive) return { ok: false };\n t.pty?.resize(Math.max(20, cols), Math.max(5, rows));\n return { ok: true };\n }\n\n kill(id: string): { ok: boolean } {\n const t = this.terms.get(id);\n if (!t) return { ok: false };\n this.killTerm(t);\n return { ok: true };\n }\n\n killAll(): void {\n // Called before the daemon exits: kill synchronously so the process trees are gone before exit\n for (const t of this.terms.values()) this.killTerm(t, true);\n }\n\n // ---- internals ----\n // Killing only the shell would orphan the npm run dev etc. it started → on Windows taskkill /T kills the whole tree\n private killTree(pid: number | undefined, sync: boolean, group: boolean): void {\n if (!pid) return;\n if (process.platform !== \"win32\") {\n // The no-PTY shell leads a detached process group; a PTY shell leads its session, and pty.kill() sends SIGHUP, which the shell forwards to its jobs\n if (group) {\n try { process.kill(-pid, \"SIGTERM\"); } catch {}\n const t = setTimeout(() => { try { process.kill(-pid, \"SIGKILL\"); } catch {} }, 1500);\n t.unref?.();\n }\n return;\n }\n const args = [\"/pid\", String(pid), \"/T\", \"/F\"];\n try {\n if (sync) execFileSync(\"taskkill\", args, { windowsHide: true, stdio: \"ignore\", timeout: 5000 });\n else spawn(\"taskkill\", args, { windowsHide: true, stdio: \"ignore\" }).on(\"error\", () => {});\n } catch {}\n }\n\n private killTerm(t: Term, sync = false): void {\n t.alive = false;\n this.killTree(t.pty?.pid ?? t.proc?.pid, sync, !t.pty && !!t.proc);\n if (t.timer) { clearTimeout(t.timer); t.timer = null; }\n try { t.pty?.kill(); } catch {}\n try { t.proc?.kill(); } catch {}\n this.terms.delete(t.id);\n this.byIndex.delete(t.index);\n }\n\n private onExit(t: Term): void {\n if (t.timer) {\n // Flush the last batch of output first, then send exit\n clearTimeout(t.timer);\n t.timer = null;\n if (t.pend) {\n this.gw.publishTerminal(t.index, Buffer.from(t.pend, \"utf8\"));\n t.pend = \"\";\n }\n }\n if (t.exited) return; // exit and error may both fire: send only once\n t.exited = true;\n t.alive = false;\n this.terms.delete(t.id);\n this.byIndex.delete(t.index);\n this.gw.publish(\"terminals\", { type: \"terminal.exit\", id: t.id, index: t.index });\n }\n\n private onData(t: Term, d: string): void {\n t.buf += d;\n if (t.buf.length > BUF_MAX) t.buf = t.buf.slice(-BUF_MAX / 2);\n t.pend += d;\n if (!t.timer) {\n t.timer = setTimeout(() => {\n t.timer = null;\n if (t.pend) {\n this.gw.publishTerminal(t.index, Buffer.from(t.pend, \"utf8\"));\n t.pend = \"\";\n }\n }, 16);\n }\n }\n\n // Input frames: op 2=input, 3=resize\n private onInput(conn: { subs: Set<string> }, index: number, op: number, payload: Buffer): void {\n const t = this.byIndex.get(index);\n if (!t || !t.alive) return;\n if (!conn.subs.has(`terminal:${index}`)) return; // Only connections that attached may write\n if (op === 2) {\n const s = payload.toString(\"utf8\");\n if (t.pty) t.pty.write(s);\n else t.proc?.stdin.write(s);\n } else if (op === 3) {\n try {\n const { cols, rows } = JSON.parse(payload.toString(\"utf8\")) as { cols?: number; rows?: number };\n if (cols && rows) this.resize(t.id, cols, rows);\n } catch {}\n }\n }\n}\n","// Small process/environment helpers: cross-platform pid liveness, PATH completion.\nimport { delimiter } from \"node:path\";\nimport { extraBinDirs } from \"../../../lib/pathscan.mjs\";\n\n/** kill(pid, 0): ESRCH = gone; EPERM = exists but we may not signal it (common on Windows across sessions / elevated processes), counts as alive. */\nexport function pidAlive(pid: number, kill: (pid: number, sig: 0) => unknown = (p, s) => process.kill(p, s)): boolean {\n if (!Number.isInteger(pid) || pid <= 0) return false;\n try {\n kill(pid, 0);\n return true;\n } catch (e) {\n return (e as NodeJS.ErrnoException)?.code === \"EPERM\";\n }\n}\n\n/** Append nodeDir and common CLI install directories to the end of PATH (deduped; case-insensitive on Windows). Returns the new PATH string. */\nexport function augmentPath(\n env: NodeJS.ProcessEnv,\n nodeDir: string,\n platform: NodeJS.Platform = process.platform,\n home?: string,\n): string {\n const win = platform === \"win32\";\n const sep = win ? \";\" : platform === process.platform ? delimiter : \":\";\n const key = Object.keys(env).find((k) => k.toUpperCase() === \"PATH\") ?? \"PATH\";\n const cur = (env[key] ?? \"\").split(sep).filter(Boolean);\n const norm = (d: string) => (win ? d.replace(/[\\\\/]+$/, \"\").toLowerCase() : d.replace(/\\/+$/, \"\"));\n const seen = new Set(cur.map(norm));\n const out = [...cur];\n for (const d of [nodeDir, ...extraBinDirs({ platform, env, home })]) {\n if (!d || seen.has(norm(d))) continue;\n seen.add(norm(d));\n out.push(d);\n }\n return out.join(sep);\n}\n","// Ports the preview proxy never forwards to (1.2): rewriting Origin for them would get around their own checks.\n// - this daemon's port and the plugin gate's (--gate-port, default 3488)\n// - Magpie's local API / gateway and magpie web: their defaults 3425 and 3430, MAGPIE_ADDR / MAGPIE_WEB_ADDR / MAGPIE_URL\n// where set, and (#582) the port saved in Magpie's own settings.json (Settings → gateway port, settings.Port), read\n// again on every preview.open: older Magpie builds don't tell plugin hosts MAGPIE_ADDR, and the user can move the\n// gateway while the daemon runs.\n// Magpie keeps settings.json in its config folder (internal/appdir.Config): the \"data\" folder beside a portable magpie,\n// else $XDG_CONFIG_HOME/magpie, else ~/.config/magpie, on Windows, macOS and Linux alike. A portable folder is found\n// from where this package is installed (<config>/plugins/node_modules/…) and from the daemon's working folder\n// (<config>/plugin-work). The proxy also refuses a target that answers like a Magpie gateway (proxy.ts), whatever its port.\nimport { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, isAbsolute, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport const MAGPIE_DEFAULT_PORTS = [3425, 3430];\nexport const GATE_DEFAULT_PORT = 3488;\n\nfunction portOf(addr: string | undefined): number | null {\n if (!addr) return null;\n const m = /:(\\d{1,5})\\/?$/.exec(addr.trim());\n const n = m ? Number(m[1]) : NaN;\n return Number.isInteger(n) && n > 0 && n <= 65535 ? n : null;\n}\n\n/** <config> of a Magpie whose plugins folder holds this path (…/<config>/plugins/node_modules/…), or null */\nexport function magpieDirFromInstall(p: string): string | null {\n const norm = p.replace(/\\\\/g, \"/\");\n const i = norm.lastIndexOf(\"/plugins/node_modules/\");\n if (i <= 0) return null;\n return p.slice(0, i);\n}\n\n/** Magpie config folders that may hold its settings.json, most specific first (duplicates removed) */\nexport function magpieConfigDirs(\n env: Record<string, string | undefined> = process.env,\n where: { self?: string; cwd?: string; home?: string; platform?: NodeJS.Platform } = {},\n): string[] {\n const out: string[] = [];\n const add = (d: string | null | undefined) => { if (d && isAbsolute(d) && !out.includes(d)) out.push(d); };\n let self = where.self;\n if (self === undefined) { try { self = fileURLToPath(import.meta.url); } catch { self = \"\"; } }\n add(magpieDirFromInstall(self));\n const cwd = where.cwd ?? (env === process.env ? process.cwd() : \"\");\n if (cwd && basename(cwd) === \"plugin-work\") add(dirname(cwd));\n const x = env.XDG_CONFIG_HOME;\n if (x && isAbsolute(x)) add(join(x, \"magpie\"));\n const platform = where.platform ?? process.platform;\n const home = where.home ?? (env === process.env ? homedir() : platform === \"win32\" ? env.USERPROFILE : env.HOME);\n if (home) add(join(home, \".config\", \"magpie\"));\n return out;\n}\n\n/** The gateway port saved in a Magpie settings.json (settings.Port; 0 or out of range = the default 3425), or null */\nexport function savedGatewayPort(file: string, read: (f: string) => string = (f) => readFileSync(f, \"utf8\")): number | null {\n let raw: string;\n try {\n raw = read(file);\n } catch {\n return null;\n }\n try {\n const s = JSON.parse(raw) as { port?: unknown };\n const p = typeof s?.port === \"number\" ? s.port : 0;\n return Number.isInteger(p) && p >= 1024 && p <= 65535 ? p : MAGPIE_DEFAULT_PORTS[0]!;\n } catch {\n return null;\n }\n}\n\nexport function previewDeniedPorts(\n cfg: { port: number; gatePort?: number },\n env: Record<string, string | undefined> = process.env,\n opts: { configDirs?: string[]; read?: (f: string) => string } = {},\n): number[] {\n const out = new Set<number>([cfg.port, GATE_DEFAULT_PORT, ...MAGPIE_DEFAULT_PORTS]);\n if (cfg.gatePort) out.add(cfg.gatePort);\n for (const k of [\"MAGPIE_ADDR\", \"MAGPIE_WEB_ADDR\", \"MAGPIE_URL\"]) {\n const p = portOf(env[k]);\n if (p) out.add(p);\n }\n for (const d of opts.configDirs ?? magpieConfigDirs(env)) {\n const p = savedGatewayPort(join(d, \"settings.json\"), opts.read);\n if (p) out.add(p);\n }\n const extra = env.AGENT_CONSOLE_PREVIEW_DENY;\n if (extra) for (const s of extra.split(/[,\\s]+/)) { const n = Number(s); if (Number.isInteger(n) && n > 0 && n <= 65535) out.add(n); }\n out.delete(0);\n return [...out];\n}\n"],"mappings":"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","names":["join","existsSync","id","i","j","id","resolve","mode","statSync","homedir","sep","readFile","existsSync","path","findNode","existsSync","resolve","id","existsSync","readFile","stat","resolve","id","mode","rid","resolve","id","mode","readFile","stat","existsSync","join","homedir","rec","str","path","resolve","readdir","readFile","stat","join","homedir","str","path","rec","spawn","id","basename","str","rec","trunc","MAX_OUTPUT","init_map","readdir","readFile","stat","homedir","basename","join","path","rid","init_session","init_map","guarded","resolve","mode","homedir","join","readFile","runVersion","models","id","INSTALL_HINT","init_provider","init_session","id","readFile","writeFile","rid","readFile","stat","basename","methods","init_session","id","mode","resolve","runVersion","cfg","learned","init_provider","init_session","createHash","mkdir","writeFile","join","models","tmpdir","models","send","id","init_provider","id","acp","init_provider","id","execFile","existsSync","statSync","readFile","homedir","join","path","id","EFFORT_LABEL","id","mode","stat","isAbsolute","resolve","sep","win32","posix","isDir","execFile","resolve","createServer","randomBytes","resolve","a","path","release","existsSync","statSync","mkdir","writeFile","homedir","dirname","join","execFile","id","p","models","isDir","mode","path","stamp","writeFile","mkdir","dirname","readFile","join","z","readFile","mkdir","rename","writeFile","dirname","cp","mkdir","readdir","readFile","existsSync","join","id","mkdirSync","rmSync","chmodSync","join","dirname","fileURLToPath","join","dirname","fileURLToPath","dirname","fileURLToPath","join","existsSync","join","cfg","id","data","stat","readFile","join","extname","randomBytes","MIME","id","readdir","readFile","existsSync","statSync","join","randomBytes","id","path","mkdir","rename","readdir","readFile","join","randomBytes","newId","id","stamp","randomBytes","cfg","id","id","models","mode","execFile","existsSync","mkdir","readFile","rename","stat","join","normalize","sep","TIMEOUT","rec","path","stamp","readdir","readFile","stat","join","normalize","sep","extname","insidePath","isDir","spawn","execFileSync","accessSync","existsSync","statSync","dirname","join","rid","id","sep","readFileSync","homedir","basename","dirname","isAbsolute","join","fileURLToPath","cfg","dirname","mkdirSync","join","fileURLToPath","bindAttachmentStore","migrateLegacy","id","warmProviderCache","chmodSync","rmSync"]}
|