magpie-agent-console 0.1.0 → 1.0.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.
@@ -1,7 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/log.ts", "../src/util/paths.ts", "../src/util/queue.ts", "../src/agents/diff.ts", "../src/providers/slash.ts", "../src/providers/mock.ts", "../src/util/bin.ts", "../src/agents/kinds.ts", "../src/providers/claude/map.ts", "../src/util/i18n.ts", "../src/util/attachmentRefs.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/map.ts", "../src/providers/codex/commands.ts", "../src/providers/codex/session.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/session.ts", "../src/providers/acp/provider.ts", "../src/providers/acp/probe.ts", "../src/providers/acp/specs.ts", "../src/providers/registry.ts", "../src/providers/enabled.ts", "../src/util/pickFolderWin.ts", "../src/providers/magpieGateway.ts", "../src/providers/infoCache.ts", "../src/ws/methods.ts", "../src/util/atomic.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/settings.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"],
4
- "sourcesContent": ["// \u7B80\u5355\u65E5\u5FD7\uFF1A\u5199 dataDir/logs/daemon-YYYY-MM-DD.log\uFF08\u4FDD\u7559 7 \u5929\uFF09\uFF0C\u540C\u65F6 console\u3002\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 // \u4FDD\u7559 7 \u5929\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\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 const fn = level === \"error\" ? console.error : level === \"warn\" ? console.warn : console.log;\n fn(`[agent-console] ${msg}`, extra !== undefined ? extra : \"\");\n}\n\nfunction safeJson(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n", "// \u8DEF\u5F84\u5DE5\u5177\uFF1A\u89C4\u8303\u5316\u3001samePath\u3001isInside\uFF08\u89E3\u6790 realpath \u540E\u5224\u65AD\uFF09\u3002\nimport { realpathSync, existsSync } from \"node:fs\";\nimport { resolve, sep } from \"node:path\";\n\n// \u89C4\u8303\u5316\uFF1Arealpath\uFF08\u5B58\u5728\u65F6\uFF09+ \u7EDF\u4E00\u5206\u9694\u7B26 + Windows \u5FFD\u7565\u5927\u5C0F\u5199\u3002\nexport function normPath(p: string): string {\n let r = resolve(p);\n try {\n r = realpathSync(r);\n } catch {}\n if (process.platform === \"win32\") {\n r = r.replace(/\\//g, \"\\\\\").toLowerCase();\n } else {\n r = r.replace(/\\\\/g, \"/\");\n }\n // \u53BB\u6389\u5C3E\u90E8\u5206\u9694\u7B26\uFF08\u6839\u76EE\u5F55\u9664\u5916\uFF09\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// child \u662F\u5426\u4F4D\u4E8E parent \u76EE\u5F55\u5185\uFF08\u542B\u76F8\u7B49\uFF09\u3002\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 \u6821\u9A8C\uFF1A\u53EA\u653E\u884C\u5B89\u5168\u5B57\u7B26\uFF0C\u9632\u8DEF\u5F84\u7A7F\u8D8A\u3002\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\uFF1Apush/close/[Symbol.asyncIterator]\uFF0C\u7ED9 Claude SDK \u5F53 prompt \u8F93\u5165\u6D41\u3002\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 // \u8BA9\u7B49\u5F85\u8005\u629B\u51FA\u9519\u8BEF\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", "// \u884C\u7EA7 diff\uFF08\u79FB\u690D\u81EA lib/diff.mjs\uFF09\uFF1AoldStr/newStr \u2192 { hunks, added, removed }\n// hunk: { oldStart, newStart, lines: [{ t: \" \"|\"+\"|\"-\", s }] }\n// LCS \u6700\u5C0F\u7F16\u8F91\u5E8F\u5217\uFF1B\u53D8\u66F4\u5757\u4E4B\u95F4\u4FDD\u7559 context \u884C\uFF0C\u79BB\u5F97\u8FD1\u7684\u5C0F\u5757\u5408\u5E76\u8FDB\u540C\u4E00 hunk\u3002\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// Edit/MultiEdit \u7684 detail \u7EC4\u88C5\uFF1A\u7531 old/new \u6216 edits[] \u7B97 hunks\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/** \u89E3\u6790 \"/name args\"\uFF08\u9700\u4EE5 / \u5F00\u5934\uFF09 */\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\uFF1A\u4EC5 AGENT_CONSOLE_MOCK=1 \u65F6\u6CE8\u518C\u3002\u5E38\u9A7B\u4F1A\u8BDD\u3001\u53EF\u6253\u65AD\u3001\u53EF\u6388\u6743\u3001\u53EF\u63D2\u8BDD\u3002\n// \u5267\u672C\u6309\u6D88\u606F\u524D\u7F00\uFF1A\u9ED8\u8BA4 /perm /plan /ask /slow /error /long /exit\uFF1B\u652F\u6301 steer/interrupt/resume\u3002\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 // itemId \u5168\u5C40\u552F\u4E00\uFF08\u771F\u5B9E provider \u7684 itemId \u6BCF\u6B21\u65B0\u5EFA\uFF09\uFF1B\u4E0D\u80FD\u7528 sessionId\uFF1A\n // \u7EED\u63A5\u4F1A\u8BDD\u6CBF\u7528\u540C\u4E00 providerSessionId\uFF0C\u4F1A\u649E\u4E0A\u65E7\u4F1A\u8BDD\u7684 itemId\u3002\n // \u540C\u540D\u4F1A\u8BA9\u65B0\u4E00\u8F6E\u4E8B\u4EF6\u5408\u5E76\u8FDB\u65E7\u6761\u76EE\uFF0C\u65B0\u56DE\u590D\"\u98DE\"\u5230\u65F6\u95F4\u7EBF\u4E2D\u90E8\u7684\u65E7\u6C14\u6CE1\u91CC\u3002\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(\"\uFF1B\"),\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(); // \u5D29\u6E83\uFF1A\u4E0D\u53D1 turn_ended\uFF0Cmanager \u8865 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 // \u5DF2\u6302\u8D77\u7684\u6388\u6743/\u63D0\u95EE\u76F4\u63A5\u53D6\u6D88\n for (const [id, resolve] of this.pendingReq) {\n resolve({ cancelled: true });\n this.pendingReq.delete(id);\n }\n await sleep(120); // \u4FDD\u8BC1 <1s \u5185\u51FA interrupted\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: \"\u6F14\u793A\u6388\u6743\u5F39\u7A97\", kind: \"command\" },\n { name: \"plan\", description: \"\u6F14\u793A\u8BA1\u5212\u5BA1\u6279\", kind: \"command\" },\n { name: \"ask\", description: \"\u6F14\u793A\u63D0\u95EE\", kind: \"command\" },\n { name: \"slow\", description: \"\u6162\u901F\u591A\u6B65\u5DE5\u5177\", kind: \"skill\" },\n { name: \"error\", description: \"\u6A21\u62DF\u5931\u8D25\", 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 // resumeId \u65F6\u9996\u6761\u56DE\u590D\u52A0\uFF08\u5DF2\u7EED\u63A5\uFF09\u524D\u7F00\n private resumePrefix(): string {\n if (this.resumed && this.turnNum === 1) return \"\uFF08\u5DF2\u7EED\u63A5\uFF09\";\n return \"\";\n }\n}\n\n// ---------- \u5267\u672C ----------\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: \"\u8BA9\u6211\u770B\u770B\u9879\u76EE\u7ED3\u6784\u2026\" });\n await sleepA(500);\n emit({ type: \"reasoning\", itemId: \"r1\", text: \"\u8BA9\u6211\u770B\u770B\u9879\u76EE\u7ED3\u6784\u2026\u9700\u8981\u5148\u8BFB\u51E0\u4E2A\u6587\u4EF6\u3002\" });\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: `\u8BFB\u53D6 ${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: `\u8BFB\u53D6 ${t.input.file_path}`, status: \"ok\", output: \"\u2026\u6587\u4EF6\u5185\u5BB9\u2026\", durationMs: 300 });\n }\n\n emit({ type: \"tool_call\", itemId: \"t3\", kind: \"search\", title: '\u641C\u7D22 \"TODO\"', status: \"running\", input: { pattern: \"TODO\" } });\n await sleepA(200);\n emit({ type: \"tool_call\", itemId: \"t3\", kind: \"search\", title: '\u641C\u7D22 \"TODO\"', status: \"ok\", output: \"3 \u5904\u5339\u914D\" });\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: \"\u7F16\u8F91 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: \"\u7F16\u8F91 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: \"\u8FD0\u884C 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: `\u7B2C ${i} \u884C\u8F93\u51FA\\n` });\n }\n emit({ type: \"tool_call\", itemId: \"t5\", kind: \"bash\", title: \"\u8FD0\u884C npm test\", status: \"ok\", output: \"\u2713 \u5168\u90E8\u901A\u8FC7\", exitCode: 0, durationMs: 1200 });\n\n emit({\n type: \"todo\",\n items: [\n { text: \"\u5206\u6790\u9700\u6C42\", status: \"done\" },\n { text: \"\u4FEE\u6539\u4EE3\u7801\", status: \"done\" },\n { text: \"\u8DD1\u6D4B\u8BD5\", status: \"done\" },\n { text: \"\u5199\u6587\u6863\", 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: \"\u8FD0\u884C npm test\",\n kind: \"tool\",\n detail: { command: \"npm test\", cwd: \".\", toolName: \"Bash\" },\n options: [\n { id: \"accept\", label: \"\u5141\u8BB8\", kind: \"allow_once\" },\n { id: \"acceptForSession\", label: \"\u672C\u5BF9\u8BDD\u90FD\u5141\u8BB8\", kind: \"allow_always\" },\n { id: \"decline\", label: \"\u62D2\u7EDD\", 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: \"\u8FD0\u884C npm test\", status: \"failed\", output: \"\u5DF2\u88AB\u7528\u6237\u62D2\u7EDD\", exitCode: 1 });\n emit({ type: \"assistant_message\", itemId: \"pm\", text: \"\u5DF2\u6309\u4F60\u7684\u8981\u6C42\u8DF3\u8FC7\u8BE5\u64CD\u4F5C\u3002\" });\n return;\n }\n emit({ type: \"tool_call\", itemId: \"p1\", kind: \"bash\", title: \"\u8FD0\u884C 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: \"\u8FD0\u884C npm test\", status: \"ok\", output: \"\u2713 12 \u4E2A\u6D4B\u8BD5\u901A\u8FC7\", exitCode: 0, durationMs: 500 });\n emit({ type: \"assistant_message\", itemId: \"pm\", text: \"\u6D4B\u8BD5\u901A\u8FC7\u4E86\u3002\" });\n}\n\nasync function scriptPlan(ctx: Ctx): Promise<void> {\n const { emit } = ctx;\n emit({\n type: \"plan\",\n itemId: \"plan1\",\n markdown: \"## \u5B9E\u65BD\u8BA1\u5212\\n\\n1. \u6539 `src/index.ts` \u5165\u53E3\\n2. \u66F4\u65B0\u6D4B\u8BD5\\n3. \u8DD1\u4E00\u904D e2e\",\n entries: [\n { step: \"\u6539 src/index.ts \u5165\u53E3\", status: \"pending\" },\n { step: \"\u66F4\u65B0\u6D4B\u8BD5\", status: \"pending\" },\n { step: \"\u8DD1\u4E00\u904D e2e\", status: \"pending\" },\n ],\n });\n const requestId = \"perm-\" + rid();\n emit({\n type: \"permission_request\",\n requestId,\n title: \"\u5B9E\u65BD\u8FD9\u4E2A\u8BA1\u5212\uFF1F\",\n kind: \"plan\",\n detail: { markdown: \"\u89C1\u4E0A\u65B9\u8BA1\u5212\" },\n options: [\n { id: \"implement\", label: \"\u5F00\u59CB\u5B9E\u65BD\", kind: \"allow_once\" },\n { id: \"reject\", label: \"\u62D2\u7EDD\", 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: \"\u597D\u7684\uFF0C\u8BF7\u544A\u8BC9\u6211\u600E\u4E48\u6539\u3002\" });\n return;\n }\n emit({ type: \"tool_call\", itemId: \"pl1\", kind: \"edit\", title: \"\u7F16\u8F91 src/index.ts\", status: \"ok\" });\n await sleepAbortable(400, ctx);\n emit({ type: \"assistant_message\", itemId: \"pm\", text: \"\u5DF2\u6309\u8BA1\u5212\u6539\u5B8C\u5165\u53E3\u548C\u6D4B\u8BD5\u3002\" });\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: \"\u90E8\u7F72\u76EE\u6807\",\n question: \"\u8981\u90E8\u7F72\u5230\u54EA\u4E2A\u73AF\u5883\uFF1F\",\n options: [\n { id: \"staging\", label: \"Staging\" },\n { id: \"prod\", label: \"\u751F\u4EA7\u73AF\u5883\" },\n ],\n },\n {\n id: \"q2\",\n header: \"\u5907\u6CE8\",\n question: \"\u8FD8\u6709\u4EC0\u4E48\u8981\u8865\u5145\u7684\uFF1F\",\n freeText: true,\n },\n ],\n });\n const ans = await ctx.waitFor(requestId);\n const env = ans.answers?.q1 ?? \"\uFF08\u672A\u9009\uFF09\";\n const note = ans.answers?.q2 ?? \"\";\n emit({ type: \"assistant_message\", itemId: \"am\", text: `\u6536\u5230\uFF1A\u90E8\u7F72\u5230 ${env}${note ? `\uFF0C\u5907\u6CE8\u300C${note}\u300D` : \"\"}\u3002` });\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: `\u6B65\u9AA4 ${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: `\u6B65\u9AA4 ${i}/6`, status: \"ok\", output: `\u6B65\u9AA4 ${i} \u5B8C\u6210`, durationMs: 2000 });\n }\n emit({ type: \"assistant_message\", itemId: \"sm\", text: \"6 \u4E2A\u6B65\u9AA4\u5168\u90E8\u8DD1\u5B8C\u3002\" });\n}\n\nasync function scriptError(ctx: Ctx): Promise<void> {\n const { emit } = ctx;\n emit({ type: \"tool_call\", itemId: \"e1\", kind: \"bash\", title: \"\u8FD0\u884C ./build.sh\", status: \"running\", input: { command: \"./build.sh\" } });\n await sleepAbortable(800, ctx);\n throw new Error(\"\u6784\u5EFA\u5931\u8D25\uFF1A\u627E\u4E0D\u5230\u6A21\u5757 foo\uFF08\u6A21\u62DF\u9519\u8BEF\uFF09\");\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: `\u5757${i} ` });\n if (i % 200 === 0) await sleep(0);\n }\n emit({ type: \"assistant_message\", itemId: \"L1\", text: \"\uFF085000 \u4E2A\u589E\u91CF\u5408\u5E76\u540E\u7684\u957F\u6587\uFF09\" });\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 \"\u597D\u7684\uFF0C\u6211\u5DF2\u7ECF\u6309\u4F60\u7684\u8981\u6C42\u6539\u597D\u4E86\u3002\",\n \"\",\n \"## \u6539\u52A8\",\n \"- `src/index.ts`\uFF1A\u628A\u8FD4\u56DE\u903B\u8F91\u8865\u6210\u4E09\u53D8\u91CF\u6C42\u548C\",\n \"- \u65B0\u589E\u4E00\u884C\u5E38\u91CF `z`\",\n \"\",\n \"```ts\",\n \"const z = 3;\",\n \"return x + y + z;\",\n \"```\",\n \"\",\n \"| \u6587\u4EF6 | \u53D8\u66F4 |\",\n \"|---|---|\",\n \"| src/index.ts | +2/-1 |\",\n \"\",\n \"\u6D4B\u8BD5\u5168\u90E8\u901A\u8FC7\u3002\",\n ].join(\"\\n\");\n return ctx.steerText() ? base + `\\n\\n> \u63D2\u8BDD\uFF1A${ctx.steerText()}` : base;\n}\n\n// ---------- Provider ----------\n\n/** \u6D4B\u8BD5\u7528\uFF1A\u7EDF\u8BA1 createSession \u8C03\u7528\u6B21\u6570 */\nexport const mockProviderMetrics = { createSessionCalls: 0 };\n\nexport function createMockProvider(): Provider {\n return {\n id: \"mock\",\n name: \"Mock\uFF08\u6F14\u793A\uFF09\",\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: \"\u6F14\u793A\u00B7\u5FEB\", isDefault: true, efforts: [\"low\", \"medium\", \"high\"] },\n { id: \"demo-pro\", name: \"\u6F14\u793A\u00B7\u5F3A\", efforts: [\"low\", \"medium\", \"high\"] },\n ];\n },\n async createSession(o) {\n mockProviderMetrics.createSessionCalls++;\n return new MockSession(o);\n },\n };\n}\n", "// \u8DE8\u5E73\u53F0\u53EF\u6267\u884C\u6587\u4EF6\u89E3\u6790 + \u8FDB\u7A0B\u6811\u7ED3\u675F\uFF08\u79FB\u690D\u81EA lib/bin.mjs\uFF09\u3002\n// \u76EE\u6807\uFF1A\u4E0D\u7528 shell:true \u4E5F\u80FD\u8D77 claude/codex \u8FD9\u7C7B .cmd shim \u7684 CLI\u3002\n\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\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 | { ok: true; cmd: string; prefixArgs: string[]; display: string; via: string }\n | { ok: false; reason: string };\n\nfunction which(name: string): Promise<string[]> {\n return new Promise((resolvePromise) => {\n const cmd = IS_WIN ? \"where.exe\" : \"which\";\n let out = \"\";\n let done = false;\n const finish = (v: string[]) => {\n if (!done) {\n done = true;\n resolvePromise(v);\n }\n };\n try {\n const p = spawn(cmd, [name], { windowsHide: true });\n const t = setTimeout(() => {\n try {\n p.kill();\n } catch {}\n finish([]);\n }, 4000);\n p.stdout.on(\"data\", (c: Buffer) => (out += c.toString()));\n p.on(\"error\", () => {\n clearTimeout(t);\n finish([]);\n });\n p.on(\"close\", (code) => {\n clearTimeout(t);\n const lines = out\n .split(/\\r?\\n/)\n .map((s) => s.trim())\n .filter(Boolean);\n finish(code === 0 ? lines : []);\n });\n } catch {\n finish([]);\n }\n });\n}\n\n// \u4ECE .cmd \u6587\u672C\u91CC\u627E\u5B83\u8C03\u7528\u7684\u811A\u672C/\u7A0B\u5E8F\u8DEF\u5F84\u3002\nexport function shimTarget(cmdText: string, cmdDir: string | null): string | null {\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 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 (!isAbsolute(p)) {\n if (!cmdDir) continue;\n p = join(cmdDir, p);\n }\n if (existsSync(p)) return resolve(p);\n }\n return null;\n}\n\nasync function findNode(): Promise<string> {\n const hits = await which(\"node\");\n for (const h of hits) if (/node\\.exe$/i.test(h) || /node$/.test(h)) return h;\n return hits[0] || process.execPath;\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/** \u6309\u987A\u5E8F\u5C1D\u8BD5 catalog \u91CC\u7684\u591A\u4E2A\u53EF\u6267\u884C\u540D\uFF0C\u547D\u4E2D\u7B2C\u4E00\u4E2A\u5373\u8FD4\u56DE\u3002 */\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: `PATH \u91CC\u627E\u4E0D\u5230 ${uniq.length > 1 ? uniq.join(\" \u6216 \") : label}` };\n}\n\nexport function clearBinCache(name?: string): void {\n if (name) cache.delete(name);\n else cache.clear();\n}\n\nasync function resolveBinUncached(name: string): Promise<ResolveResult> {\n const hits = await which(name);\n if (!hits.length) return { ok: false, reason: `PATH \u91CC\u627E\u4E0D\u5230 ${name}` };\n\n const exe = hits.find((h) => /\\.exe$/i.test(h));\n if (exe && existsSync(exe)) {\n return { ok: true, cmd: exe, prefixArgs: [], display: exe, via: \"exe\" };\n }\n\n if (IS_WIN) {\n const shim = hits.find((h) => /\\.(cmd|bat)$/i.test(h));\n if (shim && existsSync(shim)) {\n const dir = dirname(shim);\n if (name.toLowerCase() === \"npx\") {\n const node = join(dir, \"node.exe\");\n const cli = join(dir, \"node_modules\", \"npm\", \"bin\", \"npx-cli.js\");\n if (existsSync(node) && existsSync(cli))\n return { ok: true, cmd: node, prefixArgs: [cli], display: `${node} ${cli}`, via: \"npx-shim\" };\n }\n const text = await readFile(shim, \"utf8\").catch(() => \"\");\n const target = shimTarget(text, dir);\n if (target && /\\.(js|mjs|cjs)$/i.test(target)) {\n const node = await 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 / \u5176\u5B83 .cmd \u5305\u88C5\uFF1A\u7528 cmd /c \u542F\u52A8\uFF08\u5982 cursor-agent\uFF09\n const comspec = process.env.ComSpec || \"cmd.exe\";\n return { ok: true, cmd: comspec, prefixArgs: [\"/d\", \"/s\", \"/c\", shim], display: shim, via: \"cmd-shim\" };\n }\n }\n\n const first = hits[0];\n if (existsSync(first)) return { ok: true, cmd: first, prefixArgs: [], display: first, via: \"path\" };\n return { ok: false, reason: `\u627E\u4E0D\u5230\u53EF\u6267\u884C\u7684 ${name}` };\n}\n\n// Windows\uFF1Ataskkill /T \u6740\u6574\u68F5\u6811\uFF1B\u5176\u5B83\uFF1Adetached \u8FDB\u7A0B\u7EC4\uFF0Ckill(-pid)\u3002\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 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", "// \u5DE5\u5177\u540D \u2192 kind / title / detail \u6620\u5C04\uFF08\u79FB\u690D\u81EA lib/agents/kinds.mjs\uFF09\u3002\n// \u9002\u914D\u5668\u8C03 callInfo(name, input, cwd) \u62FF {kind, title, detail}\uFF0C\u524D\u7AEF\u6309 kind \u6E32\u67D3\u3002\nimport type { ToolKind } from \"../timeline/types.js\";\n\nconst MAX_CMD = 80;\nconst trunc = (s: string, n = MAX_CMD): string => (s.length > n ? s.slice(0, n - 1) + \"\u2026\" : 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\", `\u8BFB\u53D6 ${relPath(file, cwd)}`, { path: file, offset: input.offset, limit: input.limit });\n case \"Edit\":\n return f(\"edit\", `\u7F16\u8F91 ${relPath(file, cwd)}`, { path: file, old: input.old_string, new: input.new_string });\n case \"MultiEdit\":\n return f(\"edit\", `\u7F16\u8F91 ${relPath(file, cwd)}\uFF08${((input.edits as unknown[]) || []).length} \u5904\uFF09`, { path: file, edits: input.edits ?? [] });\n case \"Write\":\n return f(\"write\", `${input._exists ? \"\u8986\u76D6\" : \"\u65B0\u5EFA\"} ${relPath(file, cwd)}`, { path: file, content: input.content });\n case \"NotebookEdit\":\n return f(\"edit\", `\u7F16\u8F91\u7B14\u8BB0\u672C ${relPath(String(input.notebook_path || file), cwd)}`, { path: input.notebook_path ?? file });\n case \"Bash\":\n return f(\"bash\", `\u8FD0\u884C ${trunc(String(input.command ?? \"\"))}`, { command: input.command, description: input.description });\n case \"BashOutput\":\n return f(\"bash\", `\u67E5\u770B\u8F93\u51FA ${String(input.bash_id ?? \"\")}`, { bashId: input.bash_id });\n case \"KillShell\":\n return f(\"bash\", `\u7ED3\u675F\u8FDB\u7A0B ${String(input.shell_id ?? \"\")}`, { shellId: input.shell_id });\n case \"Grep\":\n return f(\"search\", `\u641C\u7D22 \"${trunc(String(input.pattern ?? \"\"), 40)}\"`, { pattern: input.pattern, path: input.path, glob: input.glob });\n case \"Glob\":\n case \"LS\":\n return f(\"glob\", `\u67E5\u627E ${trunc(String(input.pattern ?? input.path ?? \"\"), 40)}`, { pattern: input.pattern, path: input.path });\n case \"WebFetch\":\n return f(\"web\", `\u6253\u5F00 ${hostOf(String(input.url ?? \"\"))}`, { url: input.url });\n case \"WebSearch\":\n return f(\"web\", `\u641C\u7D22\u7F51\u9875 \"${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\", `\u66F4\u65B0\u5F85\u529E\uFF08${done}/${items.length}\uFF09`, { items });\n }\n case \"Task\":\n case \"Agent\":\n return f(\"task\", `\u5B50\u4EFB\u52A1\uFF1A${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]} \u00B7 ${m[2]}`, { server: m[1], tool: m[2] });\n return f(\"other\", t || \"\u5DE5\u5177\", {});\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", "// SDK \u6D88\u606F \u2192 ProviderEvent\uFF08\u00A77.2.3\uFF09\u3002\u79FB\u690D\u81EA lib/agents/claude.mjs \u7684 normalize\u3002\nimport type { SDKMessage, SDKPartialAssistantMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { callInfo, todoItems } from \"../../agents/kinds.js\";\nimport { editDetail } from \"../../agents/diff.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 \u7684 index \u2192 \u5757\u7C7B\u578B\n msgId: string; // \u5F53\u524D\u6D41\u5F0F message.id\n // \u6D41\u5F0F\u5757 index \u2192 \u7EDF\u4E00 itemId\uFF08msgId:\u7C7B\u578B:\u540C\u7C7B\u5E8F\u53F7\uFF09\u3002\n // SDK \u7684 content_block index \u628A thinking/text \u6DF7\u7F16\uFF0C\u800C assistant \u4E8B\u4EF6\u7684 content\n // \u6570\u7EC4\u5E8F\u53F7\u53EF\u80FD\u91CD\u6392\uFF08thinking \u62C6\u6210\u53E6\u4E00\u6761 message \u65F6 text \u56DE\u5230 0\uFF09\u2014\u2014\u88F8 index \u4F1A\u8BA9\n // delta \u4E0E\u5B8C\u6574\u4E8B\u4EF6 itemId \u9519\u4F4D\uFF0C\u524D\u7AEF\u6E32\u67D3\u6210\u4E24\u6761\u91CD\u590D\u56DE\u590D\u3002\u6309\u300C\u7C7B\u578B+\u540C\u7C7B\u5E8F\u53F7\u300D\u5BF9\u9F50\u4E24\u4FA7\u3002\n itemIdByBlock: Map<number, string>;\n typeSeq: Map<string, number>; // \u5F53\u524D\u6D88\u606F\u91CC\u6BCF\u7C7B\u5757\u7684\u8BA1\u6570\uFF08delta \u4FA7\uFF09\n sawInterrupt: boolean; // interrupt() \u8C03\u7528\u540E\uFF0C\u4E0B\u4E00\u6761 result \u5F52 interrupted\n};\n\nexport function newMapState(): MapState {\n return { blocks: new Map(), msgId: \"\", itemIdByBlock: new Map(), typeSeq: new Map(), sawInterrupt: false };\n}\n\n// \u5757\u7C7B\u578B \u2192 itemId \u7528\u7684\u77ED\u7801\u4E0E\u901A\u9053\uFF1Bthinking/reasoning \u4E00\u7C7B\uFF0Ctext \u4E00\u7C7B\uFF0Ctool_use \u7528 tool id \u4E0D\u8D70\u8FD9\u91CC\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// \u4E00\u6761 SDK \u6D88\u606F \u2192 0..n \u4E2A\u7EDF\u4E00\u4E8B\u4EF6\nexport function mapSdkMessage(m: SDKMessage, 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 \u7B49 \u2192 \u8F7B\u63D0\u793A\n if (r.subtype === \"api_retry\") {\n out.push({ type: \"notice\", level: \"warn\", message: `API \u91CD\u8BD5\u4E2D\uFF08\u7B2C ${r.attempt ?? \"?\"} \u6B21\uFF09` });\n }\n if (r.subtype === \"compact_boundary\") {\n out.push({ type: \"notice\", level: \"info\", message: \"\u4E0A\u4E0B\u6587\u5DF2\u538B\u7F29\" });\n }\n return out;\n }\n\n if (r.type === \"stream_event\") {\n const e = rec((m as SDKPartialAssistantMessage).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); // \u767B\u8BB0 index \u2192 \u7EDF\u4E00 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 // delta \u5148\u4E8E start \u5230\u8FBE\u7684\u515C\u5E95\uFF1A\u6309 delta \u7C7B\u578B\u63A8\u65AD\u767B\u8BB0\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 // input_json_delta \u5FFD\u7565\uFF1A\u7B49 assistant \u91CC\u7684\u5B8C\u6574 tool_use\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 // \u4E0E\u6D41\u5F0F\u4FA7\u540C\u89C4\u5219\uFF1A\u6309\u300C\u7C7B\u578B+\u540C\u7C7B\u5E8F\u53F7\u300D\u751F\u6210 itemId\uFF0C\u4FDD\u8BC1\u8986\u76D6\u5BF9\u5E94 delta\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\" ? 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: \"\", // session \u8865\u5F53\u524D 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", "/** \u4E0E\u524D\u7AEF normalizeLang \u4E00\u81F4 */\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\": \"\u65B0\u5BF9\u8BDD\",\n \"notice.daemonRestart\": \"\u540E\u53F0\u5DF2\u91CD\u542F\uFF0C\u672C\u8F6E\u5DF2\u4E2D\u65AD\",\n \"notice.sessionStartFailed\": \"\u4F1A\u8BDD\u542F\u52A8\u5931\u8D25\uFF1A{detail}\",\n \"notice.sendFailed\": \"\u53D1\u9001\u5931\u8D25\uFF1A{detail}\",\n \"notice.effortNextTurn\": \"\u601D\u8003\u5F3A\u5EA6\u5DF2\u4FDD\u5B58\uFF0C\u5C06\u5728\u4E0B\u4E00\u8F6E\u751F\u6548\",\n \"notice.effortResetOnModel\": \"\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u8BE5\u601D\u8003\u5F3A\u5EA6\uFF0C\u5DF2\u6062\u590D\u4E3A Default\",\n \"turn.agentExit\": \"Agent \u8FDB\u7A0B\u610F\u5916\u9000\u51FA\",\n \"attachment.missing\": \"\u9644\u4EF6\u4E0D\u5B58\u5728\u6216\u5DF2\u5931\u6548\uFF08{ref}\uFF09\uFF0C\u8BF7\u91CD\u65B0\u4E0A\u4F20\",\n \"export.defaultModel\": \"\u9ED8\u8BA4\",\n },\n en: {\n \"thread.defaultTitle\": \"New chat\",\n \"notice.daemonRestart\": \"Daemon restarted \u2014 this turn was interrupted\",\n \"notice.sessionStartFailed\": \"Session start failed: {detail}\",\n \"notice.sendFailed\": \"Send failed: {detail}\",\n \"notice.effortNextTurn\": \"Reasoning effort saved \u2014 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}) \u2014 upload again\",\n \"export.defaultModel\": \"Default\",\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", "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/** main \u542F\u52A8\u65F6\u6CE8\u518C\uFF0C\u4F9B Provider \u8BFB\u56FE\u65F6\u515C\u5E95\u89E3\u6790\u4E0A\u4F20 id */\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/** \u5355\u6761\u8DEF\u5F84\uFF1A\u7EDD\u5BF9\u8DEF\u5F84 / \u4E0A\u4F20 id \u2192 attachments \u76EE\u5F55\u4E0B\u7684\u6587\u4EF6\uFF1B\u5931\u8D25\u629B\u9519 */\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", "// Claude ProviderSession\uFF08\u00A77.2.2/7.2.4/7.2.5/7.2.6\uFF09\uFF1A\u5E38\u9A7B query\u3001\u6D41\u5F0F\u3001\u6388\u6743\u3001\u6253\u65AD\u3001\u70ED\u5207\u6362\u3002\nimport { query, type Query, type Options, type SDKUserMessage, type PermissionResult, type EffortLevel, type PermissionMode } from \"@anthropic-ai/claude-agent-sdk\";\nimport { readFile } from \"node:fs/promises\";\nimport type { 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 { resolveImagePath } from \"../../util/attachmentRefs.js\";\nimport { classifyClaudeSlashCommand, sortSlashCommands } from \"../slash.js\";\n\nconst EFFORTS: EffortLevel[] = [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"];\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 binCmd: string; // claude \u53EF\u6267\u884C\u6587\u4EF6\uFF08resolveBin \u7684 cmd\uFF09\n binPrefixArgs: string[]; // shim \u573A\u666F node cli.js \u65F6 = [cli.js]\n onModeChange?: (mode: Mode) => void; // \u8BA1\u5212\u6279\u51C6 \u2192 default \u65F6\u56DE\u8C03\uFF08manager \u66F4\u65B0 meta\uFF09\n};\n\nexport class ClaudeSession implements ProviderSession {\n events: AsyncIterable<ProviderEvent>;\n private q = new AsyncQueue<ProviderEvent>();\n private input = new AsyncQueue<SDKUserMessage>();\n private query: Query | null = null;\n private abort = new AbortController();\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 stderrTail = \"\";\n private pumpDone: Promise<void> | null = null;\n\n constructor(private o: ClaudeSessionOpts) {\n this.sessionId = o.resumeId;\n this.events = this.q;\n }\n\n // \u9996\u6B21 send \u524D\u624D\u771F\u6B63\u8D77 query\uFF08\u68C0\u6D4B\u5931\u8D25\u8981\u5C3D\u5FEB\u62A5\u9519\uFF09\n private ensureQuery(): Query {\n if (this.query && !this.needsRestart) return this.query;\n this.abort = new AbortController();\n this.st = newMapState();\n const options: Options = {\n cwd: this.o.cwd,\n model: this.o.model ?? undefined,\n permissionMode: this.o.mode as PermissionMode,\n canUseTool: (toolName, input, opts) => this.canUseTool(toolName, input, opts),\n includePartialMessages: true,\n settingSources: [\"user\", \"project\", \"local\"],\n systemPrompt: { type: \"preset\", preset: \"claude_code\" },\n abortController: this.abort,\n ...(this.sessionId ? { resume: this.sessionId } : {}),\n stderr: (d: string) => {\n this.stderrTail = (this.stderrTail + d).slice(-4096);\n },\n };\n if (this.o.binCmd) {\n // resolveBin shim \u573A\u666F\uFF1Acmd=node.exe + prefixArgs=[cli.js] \u2192 \u5165\u53E3\u811A\u672C\u7ED9 SDK\uFF0Cnode \u8D70 executable\n if (this.o.binPrefixArgs.length) {\n options.pathToClaudeCodeExecutable = this.o.binPrefixArgs[this.o.binPrefixArgs.length - 1];\n options.executable = \"node\";\n } else {\n options.pathToClaudeCodeExecutable = this.o.binCmd;\n }\n }\n if (this.o.effort && EFFORTS.includes(this.o.effort as EffortLevel)) {\n options.effort = this.o.effort as EffortLevel;\n }\n const q = query({ prompt: this.input as AsyncIterable<SDKUserMessage>, options });\n this.query = q;\n this.needsRestart = false;\n this.pumpDone = this.pump(q);\n return q;\n }\n\n private async pump(q: Query): Promise<void> {\n try {\n for await (const m of q) {\n for (const ev of mapSdkMessage(m, this.st, this.o.cwd)) this.emit(ev);\n }\n } catch (e) {\n // abort \u5BFC\u81F4\u7684\u7ED3\u675F\u4E0D\u7B97\u5D29\u6E83\n if (!this.abort.signal.aborted && !this.closed) {\n this.emit({ type: \"notice\", level: \"error\", message: \"Claude \u4F1A\u8BDD\u5F02\u5E38\uFF1A\" + this.errText(e) });\n }\n }\n // \u4E8B\u4EF6\u6D41\u7ED3\u675F\u3002restart() \u4E3B\u52A8\u6362\u6389\u7684\u65E7 query\uFF08this.query \u5DF2\u4E0D\u662F\u5B83\uFF09\u4E0D\u80FD\u5173\u4E8B\u4EF6\u961F\u5217\uFF0C\n // \u5426\u5219\u65B0 query \u7684\u4E8B\u4EF6\u5168\u88AB\u4E22\u5F03\u3001\u4E0B\u4E00\u8F6E\u6C38\u8FDC\u505C\u5728 running\u3002\n if (!this.closed && this.query === q) {\n this.needsRestart = true; // \u4E0B\u6B21 send \u7528 resume \u91CD\u5EFA\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 === \"provider_session_id\" && ev.id) this.sessionId = ev.id;\n this.q.push(ev);\n }\n\n private errText(e: unknown): string {\n const base = String((e as Error)?.message ?? e);\n return this.stderrTail ? `${base}\uFF1Bstderr: ${this.stderrTail.slice(-400)}` : base;\n }\n\n async send(input: SendInput): Promise<void> {\n if (this.closed) throw new Error(\"\u4F1A\u8BDD\u5DF2\u5173\u95ED\");\n if (this.needsRestart) await this.restart();\n const q = this.ensureQuery();\n this.turnNum++;\n this.turnId = \"u_\" + Date.now().toString(36) + \"_\" + this.turnNum;\n this.st.sawInterrupt = false; // \u65B0\u4E00\u8F6E\u5F00\u59CB\u6E05\u6389\u65E7\u7684 interrupt \u6807\u8BB0\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 content = [] as unknown as SDKUserMessage[\"message\"][\"content\"];\n const blocks = content as unknown as Record<string, unknown>[];\n for (const img of input.images ?? []) {\n try {\n const disk = await resolveImagePath(img.path);\n const data = await readFile(disk);\n blocks.push({\n type: \"image\",\n source: { type: \"base64\", media_type: img.mime, data: data.toString(\"base64\") },\n });\n } catch (e) {\n this.emit({ type: \"notice\", level: \"warn\", message: `\u56FE\u7247\u8BFB\u53D6\u5931\u8D25 ${img.path}\uFF1A${String(e)}` });\n }\n }\n blocks.push({ type: \"text\", text: input.text });\n this.input.push({\n type: \"user\",\n message: { role: \"user\", content },\n parent_tool_use_id: null,\n session_id: this.sessionId ?? \"\",\n });\n void q; // \u6D88\u606F\u7ECF input \u6D41\u5165\u5DF2\u542F\u52A8\u7684 query\n }\n\n private async restart(): Promise<void> {\n if (this.restarting) return this.restarting;\n this.restarting = (async () => {\n // \u5173\u65E7 query\uFF08\u5148\u6458\u6389\u5F15\u7528\uFF0C\u65E7 pump \u7ED3\u675F\u65F6\u636E\u6B64\u77E5\u9053\u662F\u4E3B\u52A8\u91CD\u542F\uFF09\n this.query = null;\n try {\n this.input.close();\n this.abort.abort();\n } catch {}\n if (this.pumpDone) await this.pumpDone.catch(() => {});\n // \u65B0 input queue\uFF08\u65E7\u7684\u53EF\u80FD\u5DF2 close\uFF09\n this.input = new AsyncQueue<SDKUserMessage>();\n try {\n this.ensureQuery();\n } finally {\n this.restarting = null;\n }\n })();\n return this.restarting;\n }\n\n // ---- \u6388\u6743\uFF08\u00A77.2.4\uFF09----\n private canUseTool(\n toolName: string,\n input: Record<string, unknown>,\n opts: { signal: AbortSignal; toolUseID?: string },\n ): Promise<PermissionResult | null> {\n const requestId = \"perm_\" + rid();\n const { signal } = opts;\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: \"\u5141\u8BB8\", kind: \"allow_once\" },\n { id: \"allow_always\", label: \"\u672C\u5BF9\u8BDD\u90FD\u5141\u8BB8\", kind: \"allow_always\" },\n { id: \"deny\", label: \"\u62D2\u7EDD\", kind: \"reject_once\" },\n ],\n });\n return new Promise<PermissionResult | null>((resolve) => {\n this.pending.set(requestId, { kind: \"permission\", resolve: (a) => resolve(this.toPermissionResult(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: \"\u5DF2\u53D6\u6D88\", interrupt: true });\n }\n }, { once: true });\n });\n }\n\n private toPermissionResult(a: RespondAnswer, input: Record<string, unknown>): PermissionResult {\n if (a.cancelled || a.optionId === \"deny\") {\n return { behavior: \"deny\", message: \"\u7528\u6237\u62D2\u7EDD\u4E86\u6B64\u64CD\u4F5C\", ...(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<PermissionResult | null> {\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: \"Agent \u63D0\u4EA4\u4E86\u8BA1\u5212\",\n kind: \"plan\",\n detail: { plan: planText },\n options: [\n { id: \"implement\", label: \"\u5B9E\u65BD\", kind: \"allow_once\" },\n { id: \"reject\", label: \"\u62D2\u7EDD\", 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: \"\u7528\u6237\u62D2\u7EDD\u4E86\u8BA1\u5212\uFF0C\u8BF7\u6839\u636E\u53CD\u9988\u4FEE\u6539\", ...(answer.cancelled ? { interrupt: true } : {}) };\n }\n // implement\uFF1A\u5207\u56DE default \u6A21\u5F0F\n try {\n await this.query?.setPermissionMode(\"default\");\n this.o.mode = \"default\";\n this.o.onModeChange?.(\"default\");\n } catch (e) {\n log(\"warn\", \"setPermissionMode(default) \u5931\u8D25\", { 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<PermissionResult | null> {\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: \"\u7528\u6237\u53D6\u6D88\u4E86\u63D0\u95EE\", interrupt: true };\n }\n // answers \u952E\u4E3A\u95EE\u9898\u539F\u6587\uFF08Claude AskUserQuestion \u7684 schema \u8981\u6C42\u6309 question \u6587\u672C\u952E\u5165\uFF09\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 // \u53D6\u6D88\u6240\u6709\u6302\u8D77\u6388\u6743/\u63D0\u95EE\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 try {\n const q = this.query;\n if (q) {\n await Promise.race([\n q.interrupt(),\n new Promise((_, rej) => setTimeout(() => rej(new Error(\"interrupt \u8D85\u65F6\")), 3000)),\n ]);\n }\n } catch (e) {\n log(\"warn\", \"interrupt \u5931\u8D25\", { err: String(e) });\n this.needsRestart = true;\n }\n }\n\n async setModel(model: string | null): Promise<void> {\n this.o.model = model;\n try {\n await this.query?.setModel(model ?? undefined);\n } catch (e) {\n log(\"warn\", \"setModel \u5931\u8D25\", { err: String(e) });\n }\n }\n\n async setMode(mode: Mode): Promise<void> {\n this.o.mode = mode;\n try {\n await this.query?.setPermissionMode(mode as PermissionMode);\n } catch (e) {\n log(\"warn\", \"setPermissionMode \u5931\u8D25\", { err: String(e) });\n }\n }\n\n async setEffort(effort: string | null): Promise<void> {\n this.o.effort = effort;\n // SDK Options.effort \u53EA\u5728\u5EFA query \u65F6\u751F\u6548 \u2192 \u91CD\u5EFA\uFF08resume \u7EED\u4E0A\uFF09\n this.needsRestart = true;\n }\n\n async listCommands(): Promise<SlashCommand[]> {\n try {\n const q = this.ensureQuery();\n const commands = await q.supportedCommands();\n const map = new Map<string, SlashCommand>();\n for (const cmd of commands) {\n if (!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 this.input.close();\n try {\n this.abort.abort();\n } catch {}\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", "// \u6A21\u578B\u5217\u8868\uFF08\u00A77.2.7\uFF09\uFF1AClaude Code \u6CA1\u6709\u53EF\u67E5\u8BE2\u7684\u6A21\u578B\u63A5\u53E3\u3002\n// \u7ECF magpie \u7F51\u5173\u65F6\uFF0C\u7F51\u5173\u6A21\u578B\u3001\u9ED8\u8BA4\u6A21\u578B\u4E0E\u601D\u8003\u6863\u4F4D\u7531 providers/magpieGateway.ts \u7EDF\u4E00\u8865\u5168\uFF1B\n// \u6CA1\u6709 magpie \u65F6\u53EA\u63D0\u4F9B\u300C\u9ED8\u8BA4\u300D\uFF08\u524D\u7AEF\u56FA\u5B9A\u663E\u793A\uFF0C\u8FD9\u91CC\u4E0D\u518D\u585E\u4E00\u4E2A id \u4E3A\u7A7A\u7684\u5360\u4F4D\u9879\uFF09\u3002\nimport type { ModelInfo } from \"../types.js\";\n\nexport async function listClaudeModels(): Promise<ModelInfo[]> {\n return [];\n}\n", "// \u5BFC\u5165\u5386\u53F2\uFF08\u00A77.6\uFF09\uFF1AClaude sessions \u5B58\u5728 ~/.claude/projects/<\u7F16\u7801\u76EE\u5F55>/<sessionId>.jsonl\u3002\n// \u4E0D\u731C\u7F16\u7801\u89C4\u5219\uFF1A\u5217\u51FA\u6240\u6709\u76EE\u5F55\uFF0C\u8BFB\u6BCF\u4E2A jsonl \u7B2C\u4E00\u6761\u5E26 cwd \u7684\u8BB0\u5F55\uFF0CsamePath \u5339\u914D\u9879\u76EE\u3002\n// \u5168\u7A0B\u53EA\u8BFB\u3002\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\";\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// \u4E00\u6761 jsonl \u884C \u2192 {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// \u9879\u76EE cwd \u2192 \u8BE5\u9879\u76EE\u7684\u5386\u53F2\u4F1A\u8BDD\u6E05\u5355\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 || \"\uFF08\u65E0\u6807\u9898\uFF09\",\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// \u8BFB\u4E00\u4E2A\u4F1A\u8BDD\u7684 jsonl \u2192 SDK \u6D88\u606F\u5F62\uFF08\u4F9B mapSdkMessage \u590D\u7528\uFF09\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 // \u786E\u8BA4\u5C5E\u4E8E\u8BE5\u9879\u76EE\uFF08\u7B2C\u4E00\u6761 cwd \u8BB0\u5F55\u5339\u914D\uFF09\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 // \u53EA\u7559 user/assistant/result \u2014\u2014 \u4E0E SDK \u6D41\u5F0F\u6D88\u606F\u540C\u5F62\uFF0CmapSdkMessage \u80FD\u6D88\u5316\n if (r.type === \"user\" || r.type === \"assistant\") msgs.push(r);\n }\n return msgs;\n }\n return [];\n}\n", "// Claude Provider\uFF08\u00A77.2\uFF09\uFF1A\u68C0\u6D4B + createSession(ClaudeSession)\u3002\nimport { spawn } from \"node:child_process\";\nimport type { Provider, ProviderSession, DetectResult, ModelInfo, HistoryItem } from \"../types.js\";\nimport { resolveBin } 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\";\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 \u4E0D\u652F\u6301\u771F\u6B63\u63D2\u8BDD \u2014 manager \u4F1A\u6392\u961F\uFF08\u00A77.2.2\uFF09\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(cmd: string, args: string[], timeoutMs = 5000): Promise<string> {\n return new Promise((resolvePromise, reject) => {\n let out = \"\";\n const p = spawn(cmd, args, { windowsHide: true, env: { ...process.env, NO_COLOR: \"1\", FORCE_COLOR: \"0\" } });\n const t = setTimeout(() => {\n try {\n p.kill();\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(): Provider {\n return {\n id: \"claude\",\n name: \"Claude Code\",\n capabilities: claudeCapabilities,\n async detect(): Promise<DetectResult> {\n const bin = await resolveBin(\"claude\");\n if (!bin.ok) return { available: false, reason: bin.reason, installHint: INSTALL_HINT };\n try {\n const version = await runVersion(bin.cmd, [...bin.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 = await resolveBin(\"claude\");\n if (!bin.ok) throw new Error(`\u627E\u4E0D\u5230 claude\uFF1A${bin.reason}`);\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 binCmd: bin.cmd,\n binPrefixArgs: bin.prefixArgs,\n });\n },\n // \u00A77.6\uFF1A~/.claude/projects \u4E0B\u6309 cwd \u5339\u914D\u7684 jsonl \u4F1A\u8BDD\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 // \u7528\u6237\u6587\u672C\u6D88\u606F\uFF1ASDK \u6D41\u91CC\u4E0D\u4F1A\u4F5C\u4E3A\u4E8B\u4EF6\u51FA\u73B0\uFF08manager \u81EA\u5DF1\u5199 user_message\uFF09\uFF0C\u8FD9\u91CC\u8865\u53D1\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 \u7B49\u4ECD\u8D70\u6620\u5C04\n continue;\n }\n out.push(...mapSdkMessage(m as never, st, cwd));\n }\n // \u6536\u5C3E\uFF1A\u5BFC\u5165\u4F1A\u8BDD\u662F\u95ED\u5408\u7684\n out.push({ type: \"turn_ended\", turnId: \"\", status: \"completed\" });\n return out;\n },\n };\n}\n", "// Codex \u5386\u53F2\u5BFC\u5165\uFF08\u00A77.6\uFF09\uFF1A~/.codex/sessions/**/rollout-*.jsonl\n// \u7ED3\u6784\uFF1Asession_meta\uFF08\u542B cwd\uFF09\u2192 event_msg \u2192 response_item\uFF08message/function_call/...\uFF09\n// \u53EA\u5BFC\u5165\u7528\u6237\u6D88\u606F\uFF08\u53BB\u6389 environment_context \u7B49\u5305\u88C5\uFF09+ \u52A9\u624B\u6700\u7EC8\u56DE\u590D\u6587\u672C\uFF1B\u5DE5\u5177\u6B65\u9AA4\u7B80\u5316\u4E3A notice\u3002\u5168\u7A0B\u53EA\u8BFB\u3002\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { samePath } from \"../util/paths.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// \u7528\u6237\u6D88\u606F\u91CC\u7684\u73AF\u5883\u5305\u88C5\uFF1A\u7B2C\u4E00\u884C <environment_context> \u6216 <user_instructions> \u5F00\u5934\u7684\u4E0D\u7B97\u7528\u6237\u8F93\u5165\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// \u9012\u5F52\u627E rollout-*.jsonl\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 \u8BB0\u5F55 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; // \u4E0D\u5C5E\u4E8E\u672C\u9879\u76EE\u5C31\u4E0D\u7528\u518D\u8BFB\u4E0B\u53BB\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 || \"\uFF08\u65E0\u6807\u9898\uFF09\", 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// \u8BFB\u4E00\u4E2A rollout \u2192 \u7B80\u5316\u4E8B\u4EF6\uFF08user_message / assistant_message / notice \u5DE5\u5177\u6B65 / turn_ended\uFF09\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 \u4E0E event_msg.item_completed \u4E92\u76F8\u91CD\u590D \u2192 \u6309\u6587\u672C\u53BB\u91CD\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 \u6D88\u606F\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: `\uFF08\u5386\u53F2\uFF09\u8C03\u7528 ${name}` });\n }\n continue;\n }\n // event_msg.item_completed\uFF1AAgentMessage\uFF08\u5185\u5BB9\u5757 Text\uFF09\u4E0E 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 // \u5DE5\u5177\u6B65\u9AA4\u7B80\u5316\u6210\u4E00\u884C notice\uFF08\u00A77.6 Codex \u90E8\u5206\uFF09\n const name = str(p2.name) ?? \"tool\";\n out.push({ type: \"notice\", level: \"info\", message: `\uFF08\u5386\u53F2\uFF09\u8C03\u7528 ${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`\uFF08\u00A77.3.2\uFF09\u3002\n// stdout \u6309\u884C\u89E3\u6790\uFF1A{id,result|error} \u2192 \u8BF7\u6C42\u5E94\u7B54\uFF1B{id,method} \u2192 \u670D\u52A1\u7AEF\u8BF7\u6C42\uFF1B{method} \u2192 \u901A\u77E5\u3002\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { log } from \"../../log.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 \u8FDB\u7A0B\u5DF2\u9000\u51FA\");\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 cmd: string,\n args: string[],\n opts: { cwd?: string; env?: NodeJS.ProcessEnv } = {},\n ) {\n this.proc = spawn(cmd, args, {\n cwd: opts.cwd,\n env: opts.env ?? process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n windowsHide: true,\n });\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: \u975E JSON \u884C\", { 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 // \u670D\u52A1\u7AEF\u8BF7\u6C42 \u2192 \u9700\u8981\u5E94\u7B54\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: \u901A\u77E5\u5904\u7406\u5931\u8D25\", { 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(`\u8BF7\u6C42\u8D85\u65F6\uFF1A${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 try {\n this.proc.kill();\n } catch {}\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", "// Codex app-server \u901A\u77E5 \u2192 ProviderEvent\uFF08\u00A77.3.4\uFF09\u3002\u65B9\u6CD5\u540D/\u5B57\u6BB5\u4EE5\u751F\u6210\u7684 schema \u4E3A\u51C6\u3002\nimport type { ProviderEvent } from \"../../timeline/types.js\";\n\nconst MAX_OUTPUT = 20 * 1024;\nconst trunc = (s: string, n = 80): string => (s.length > n ? s.slice(0, n - 1) + \"\u2026\" : 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};\n\nexport function newCodexMapState(): CodexMapState {\n return { currentTurnId: null, filesChanged: 0, diffText: \"\" };\n}\n\n// \u4E00\u4E2A server \u901A\u77E5 \u2192 0..n \u7EDF\u4E00\u4E8B\u4EF6\u3002\u670D\u52A1\u7AEF\u8BF7\u6C42\uFF08\u5BA1\u6279\uFF09\u4E0D\u8D70\u8FD9\u91CC\u3002\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 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 // plan \u589E\u91CF\u6D41\uFF1A\u7B49 item/completed \u7684 plan \u9879\u53D1\u5B8C\u6574 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) out.push({ type: \"reasoning_delta\", itemId, text: delta });\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: `\u8FD0\u884C ${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 out.push({\n type: \"tool_call\", itemId, kind: \"edit\",\n title: `\u4FEE\u6539 ${changes.length} \u4E2A\u6587\u4EF6`, 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\"} \u00B7 ${tool}`, status: \"running\",\n });\n } else if (type === \"webSearch\") {\n out.push({\n type: \"tool_call\", itemId, kind: \"web\",\n title: `\u641C\u7D22\u7F51\u9875 \"${trunc(str(item.query) ?? \"\", 40)}\"`, status: \"running\",\n });\n }\n // agentMessage/reasoning/userMessage/plan \u7B49\uFF1A\u7B49 delta \u6216 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 text = summary.filter((s): s is string => typeof s === \"string\").join(\"\\n\");\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: `\u8FD0\u884C ${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 const istatus = str(item.status);\n st.filesChanged += changes.length;\n out.push({\n type: \"tool_call\", itemId, kind: \"edit\",\n title: `\u4FEE\u6539 ${changes.length} \u4E2A\u6587\u4EF6`,\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\"} \u00B7 ${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: `\u641C\u7D22\u7F51\u9875 \"${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) ?? \"Codex \u9519\u8BEF\";\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\uFF08\u00A77.3.3/7.3.5\uFF09\uFF1Acodex app-server JSON-RPC \u4F1A\u8BDD\u3002\nimport type { ProviderSession, SendInput, RespondAnswer, Mode, SlashCommand } from \"../types.js\";\nimport { resolveImagePath } from \"../../util/attachmentRefs.js\";\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { AsyncQueue } from \"../../util/queue.js\";\nimport { CodexRpc } from \"./rpc.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\";\n\nconst rid = () => Math.random().toString(36).slice(2, 10);\n\n// \u00A77.3.3 \u6743\u9650\u9884\u8BBE\uFF08\u6309\u56DB\u6863 mode\uFF09\u3002\u6CE8\u610F\u4E24\u5904\u5F62\u72B6\u4E0D\u540C\uFF1A\n// thread/start|resume \u7684 `sandbox` \u662F kebab \u679A\u4E3E\uFF08\"read-only\"\u2026\uFF09\uFF1B\n// turn/start \u7684 `sandboxPolicy` \u662F\u5BF9\u8C61\uFF08{type:\"readOnly\"}\u2026\uFF09\u3002\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; // \u5F53\u524D\u8F6E\u5728 timeline \u91CC\u7684 turnId\uFF08send \u65F6\u751F\u6210\uFF09\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 version: string;\n },\n ) {\n this.events = this.q;\n }\n\n private emit(ev: ProviderEvent): void {\n if (ev.type === \"turn_ended\") {\n // \u4E0A\u4E00\u8F6E\uFF08\u5DF2\u88AB\u6253\u65AD\u515C\u5E95\u7ED3\u675F\uFF09\u8FDF\u5230\u7684\u5B8C\u6210\u901A\u77E5\uFF1A\u4E22\u6389\uFF0C\u522B\u628A\u65B0\u4E00\u8F6E\u7ED3\u675F\u6389\n if (ev.turnId && this.staleCodexTurns.delete(ev.turnId)) return;\n // turn_started \u7528\u7684\u662F\u6211\u4EEC\u81EA\u5DF1\u7684 turnId\uFF0C\u7ED3\u675F\u4E5F\u5FC5\u987B\u7528\u540C\u4E00\u4E2A\uFF0C\n // \u5426\u5219 manager \u7684\u6309\u8F6E\u53BB\u91CD\u5931\u6548\uFF08\u6253\u65AD\u515C\u5E95 + \u8FDF\u5230\u7684\u5B8C\u6210\u4F1A\u7ED3\u675F\u6389\u4E0B\u4E00\u8F6E\uFF09\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 this.o.binCmd,\n [...this.o.binPrefixArgs, \"app-server\"],\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 // \u542F\u52A8\u5931\u8D25\u4E0D\u7F13\u5B58\uFF1A\u6E05\u6389\uFF0C\u4E0B\u4E00\u6B21 send \u91CD\u65B0\u62C9\u8D77 app-server\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(\"\u4F1A\u8BDD\u5DF2\u5173\u95ED\");\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: Record<string, unknown>[] = [{ type: \"text\", text: wireText }];\n for (const img of input.images ?? []) {\n items.push({ type: \"localImage\", path: await resolveImagePath(img.path) });\n }\n this.interruptWanted = false;\n const turnId = \"u_\" + Date.now().toString(36) + \"_\" + rid();\n // \u4E0A\u4E00\u8F6E\u8FD8\u6CA1\u6536\u5230\u5B8C\u6210\u5C31\u5F00\u4E86\u65B0\u4E00\u8F6E\uFF08\u6253\u65AD\u515C\u5E95\uFF09\u2192 \u8BB0\u4E0B\u5B83\u7684 Codex turnId\n if (this.ourTurnId && this.st.currentTurnId) this.staleCodexTurns.add(this.st.currentTurnId);\n this.ourTurnId = turnId;\n this.st.currentTurnId = null; // \u7B49\u8FD9\u4E00\u8F6E\u7684 turn/started \u518D\u586B\uFF0C\u907F\u514D\u62FF\u4E0A\u4E00\u8F6E\u7684 id \u53BB\u6253\u65AD/\u63D2\u8BDD\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 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 // \u8FD8\u6CA1\u62FF\u5230 Codex \u7684 turnId\uFF08turn/started \u672A\u5230\uFF09\u2192 \u629B\u9519\uFF0Cmanager \u6539\u4E3A\u6392\u961F\uFF0C\u6D88\u606F\u4E0D\u4F1A\u4E22\n if (!this.rpc || !this.st.currentTurnId) throw new Error(\"\u5F53\u524D\u8F6E\u6B21\u8FD8\u6CA1\u5F00\u59CB\uFF0C\u65E0\u6CD5\u63D2\u8BDD\");\n const items: Record<string, unknown>[] = [{ type: \"text\", text: input.text }];\n for (const img of input.images ?? []) {\n items.push({ type: \"localImage\", path: await resolveImagePath(img.path) });\n }\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 \u5931\u8D25\", { 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 \u8FD8\u6CA1\u5230\uFF1A\u8BB0\u4E0B\u6765\uFF0C\u62FF\u5230 turnId \u65F6\u7ACB\u5373\u8865\u53D1\u6253\u65AD\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 // \"\u5DF2\u7A7A\u95F2\" \u7C7B\u9519\u8BEF\u89C6\u4E3A\u6210\u529F\n const msg = String((e as Error)?.message ?? e);\n if (!/idle|not running|no.*turn/i.test(msg)) {\n log(\"warn\", \"codex interrupt \u5931\u8D25\", { err: msg });\n }\n }\n }\n\n private threadId(): string | undefined {\n return this.sessionThreadId ?? undefined;\n }\n\n // ---- \u670D\u52A1\u7AEF\u8BF7\u6C42\uFF08\u00A77.3.5 \u5BA1\u6279\uFF09----\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: `\u8FD0\u884C ${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: \"\u5141\u8BB8\", kind: \"allow_once\" },\n { id: \"acceptForSession\", label: \"\u672C\u5BF9\u8BDD\u90FD\u5141\u8BB8\", kind: \"allow_always\" },\n { id: \"decline\", label: \"\u62D2\u7EDD\", 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 changes = Array.isArray(params.changes) ? params.changes : [];\n const requestId = \"perm_\" + rid();\n this.emit({\n type: \"permission_request\",\n requestId,\n title: \"\u4FEE\u6539\u6587\u4EF6\",\n kind: \"tool\",\n detail: { changes, approvalId: params.approvalId, itemId: params.itemId, reason: params.reason },\n options: [\n { id: \"accept\", label: \"\u5141\u8BB8\", kind: \"allow_once\" },\n { id: \"acceptForSession\", label: \"\u672C\u5BF9\u8BDD\u90FD\u5141\u8BB8\", kind: \"allow_always\" },\n { id: \"decline\", label: \"\u62D2\u7EDD\", 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(`\u672A\u8BC6\u522B\u7684\u670D\u52A1\u7AEF\u8BF7\u6C42 ${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 // \u56DE\u5199 resolved \u4E8B\u4EF6\u7531 manager \u7EDF\u4E00\u8D1F\u8D23\uFF08permission_resolved/question_answered\uFF09\n }\n }\n\n async setModel(model: string | null): Promise<void> {\n this.o.model = model; // \u4E0B\u4E00\u6B21 turn/start \u751F\u6548\n }\n async setMode(mode: Mode): Promise<void> {\n this.o.mode = mode; // \u4E0B\u4E00\u6B21 turn/start \u751F\u6548\n }\n async setEffort(effort: string | null): Promise<void> {\n this.o.effort = effort; // \u4E0B\u4E00\u6B21 turn/start \u751F\u6548\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", "// Codex Provider\uFF08\u00A77.3\uFF09\uFF1Adetect + listModels\uFF08\u4E34\u65F6 app-server \u2192 model/list\uFF0C\u7F13\u5B58 10 \u5206\u949F\uFF09+ createSession\u3002\nimport { spawn } from \"node:child_process\";\nimport type { Provider, ProviderSession, DetectResult, ModelInfo, Capabilities, HistoryItem } from \"../types.js\";\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { listCodexHistory, readCodexHistory } from \"../../history/codex.js\";\nimport { resolveBin } from \"../../util/bin.js\";\nimport { CodexRpc, CodexProcessExitedError } from \"./rpc.js\";\nimport { CodexSession } from \"./session.js\";\nimport { log } from \"../../log.js\";\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 \u6709\uFF0Ccost \u65E0\n effort: [], // effort \u503C\u968F\u6A21\u578B\u800C\u5B9A \u2014 detect \u540E\u7531 model/list \u586B\u5145\n modes: [\"plan\", \"default\", \"acceptEdits\", \"bypassPermissions\"],\n};\n\nlet modelCache: { at: number; models: ModelInfo[] } | null = null;\nconst MODEL_CACHE_MS = 10 * 60 * 1000;\n\nfunction runVersion(cmd: string, args: string[], timeoutMs = 5000): Promise<string> {\n return new Promise((resolvePromise, reject) => {\n let out = \"\";\n const p = spawn(cmd, args, { windowsHide: true });\n const t = setTimeout(() => {\n try {\n p.kill();\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/** \u6863\u4F4D\u5217\u8868\u7EDF\u4E00\u6210\u5B57\u7B26\u4E32\uFF1A\u517C\u5BB9 string[] \u4E0E { reasoningEffort, description }[]\uFF0C\u5176\u5B83\u5F62\u6001\u4E22\u5F03 */\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(cmd: string, prefixArgs: string[], cwd: string): Promise<ModelInfo[]> {\n const rpc = new CodexRpc(cmd, [...prefixArgs, \"app-server\"], { 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 // \u65B0\u7248 app-server \u8FD4\u56DE { reasoningEffort, description }[]\uFF0C\u65E7\u7248\u662F 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 function createCodexProvider(version: string): Provider {\n return {\n id: \"codex\",\n name: \"Codex\",\n capabilities: codexCapabilities,\n async detect(): Promise<DetectResult> {\n const bin = 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.cmd, [...bin.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(): Promise<ModelInfo[]> {\n if (modelCache && Date.now() - modelCache.at < MODEL_CACHE_MS) return modelCache.models;\n const bin = await resolveBin(\"codex\");\n if (!bin.ok) return [{ id: \"\", name: \"\u9ED8\u8BA4\" }];\n try {\n const models = await fetchModels(bin.cmd, bin.prefixArgs, process.cwd());\n modelCache = { at: Date.now(), models };\n return models;\n } catch (e) {\n // \u7F51\u5173\u5730\u533A\u9519\u8BEF\u7B49 \u2014 \u524D\u7AEF\u663E\u793A\"\u9ED8\u8BA4\"\u4E00\u9879\uFF08\u00A77.3.6\uFF09\n log(\"warn\", \"codex model/list \u5931\u8D25\", { err: String(e) });\n return [{ id: \"\", name: \"\u9ED8\u8BA4\" }];\n }\n },\n async createSession(o): Promise<ProviderSession> {\n const bin = await resolveBin(\"codex\");\n if (!bin.ok) throw new Error(`\u627E\u4E0D\u5230 codex\uFF1A${bin.reason}`);\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 version,\n });\n },\n // \u00A77.6\uFF1A~/.codex/sessions/**/rollout-*.jsonl \u6309 cwd \u5339\u914D\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", "/** Provider \u76EE\u5F55\uFF08\u56FA\u5B9A 8 \u4E2A\uFF09\u3002\n * status: verified=\u672C\u673A\u9A8C\u6536\u901A\u8FC7 | experimental=\u53EF\u8BD5\u4F46\u4E0D\u4FDD\u8BC1 | planned=\u672A\u786E\u8BA4\u63A5\u6CD5\n * \u5F53\u524D 8 \u4E2A\u5747\u5DF2\u9A8C\u6536\u901A\u8FC7\uFF1B\u9ED8\u8BA4\u5F00\u5173\uFF1Averified \u9ED8\u8BA4\u5F00\uFF08\u89C1 enabled.ts\uFF09\u3002 */\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: \"\u89C1 OpenAI Codex CLI \u5B89\u88C5\u8BF4\u660E\", status: \"verified\" },\n { id: \"cursor\", name: \"Cursor\", bins: [\"cursor-agent\", \"cursor\"], installHint: \"\u5B89\u88C5 Cursor \u5E76\u786E\u4FDD CLI \u5728 PATH\", status: \"verified\" },\n { id: \"copilot\", name: \"Copilot\", bins: [\"copilot\"], installHint: \"GitHub Copilot CLI \u5B89\u88C5\u8BF4\u660E\", status: \"verified\" },\n { id: \"opencode\", name: \"OpenCode\", bins: [\"opencode\"], installHint: \"npm i -g opencode / \u89C1 OpenCode \u6587\u6863\", status: \"verified\" },\n { id: \"pi\", name: \"Pi\", bins: [\"pi-acp\", \"pi\", \"pi-coding-agent\"], installHint: \"npm i -g pi-acp\uFF08\u6216 Pi coding agent + ACP \u9002\u914D\u5668\uFF09\", status: \"verified\" },\n { id: \"devin\", name: \"Devin CLI\", bins: [\"devin\"], installHint: \"Devin CLI \u5B98\u65B9\u5B89\u88C5\", 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 { spawn, 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 } from \"../../util/bin.js\";\n\nexport function spawnResolved(r: ResolveResult & { ok: true }, args: string[], o: { cwd?: string } = {}): ChildProcess {\n return spawn(r.cmd, [...r.prefixArgs, ...args], {\n cwd: o.cwd,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n windowsHide: true,\n env: { ...process.env, NO_COLOR: \"1\", FORCE_COLOR: \"0\" },\n });\n}\n\nexport function acpStreamFromChild(child: ChildProcess): acp.Stream {\n if (!child.stdin || !child.stdout) throw new Error(\"ACP \u5B50\u8FDB\u7A0B\u7F3A\u5C11 stdio \u7BA1\u9053\");\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\";\n\nexport type PermBridge = {\n push(ev: ProviderEvent): void;\n waitFor(requestId: string): Promise<RespondAnswer>;\n /** Cursor Auto-review\uFF1A\u4E0D\u5F39\u6388\u6743\u5361\uFF0C\u81EA\u52A8\u9009 allow */\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 ?? \"\u9700\u8981\u6388\u6743\",\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\nexport type MapCtx = { itemPrefix: string; messageIds: Map<string, string> };\n\nexport function newMapCtx(): MapCtx {\n return { itemPrefix: \"a\" + rid() + \"_\", messageIds: new Map() };\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 = mid ? ctx.messageIds.get(mid) ?? ctx.itemPrefix + mid : ctx.itemPrefix + \"msg\";\n if (mid) ctx.messageIds.set(mid, itemId);\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 = mid ? ctx.itemPrefix + \"t_\" + mid : ctx.itemPrefix + \"think\";\n out.push({ type: \"reasoning_delta\", itemId, text });\n break;\n }\n case \"tool_call\":\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 out.push({\n type: \"tool_call\",\n itemId: ctx.itemPrefix + update.toolCallId,\n kind: mapToolKind(update.kind),\n title: update.title ?? update.name ?? \"tool\",\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 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", "// ACP \u5E38\u9A7B\u4F1A\u8BDD\uFF1Acursor-agent acp / devin acp \u7B49\u3002\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 { 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 { absCwd, acpStreamFromChild, killAcpChild, spawnResolved } from \"./spawn.js\";\nimport { registerAcpClientHandlers } from \"./clientHandlers.js\";\nimport { mapSessionUpdate, newMapCtx, stopToTurnEnd, type MapCtx } from \"./mapUpdate.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 }): ActiveSession;\n};\n\nexport type AcpSessionOpts = {\n threadId: 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 appVersion: string;\n flavor: \"cursor\" | \"generic\";\n modeMap?: Partial<Record<Mode, string>>;\n cursorFast?: boolean;\n cursorAutoReview?: boolean;\n launch?: { cmd: string; prefixArgs: string[] };\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 private wakePump: (() => void) | null = null;\n // \u7B2C\u4E00\u6279\u547D\u4EE4\u5230\u8FBE\uFF08\u6216\u786E\u8BA4\u6CA1\u6709\uFF09\u524D listCommands \u7B49\u5B83\uFF0C\u53C2\u8003 Paseo \u7684 waitForInitialCommands\n private commandsReady!: Promise<void>;\n private settleCommands!: () => void;\n\n constructor(private o: AcpSessionOpts) {\n this.events = this.q;\n this.cursorFast = o.cursorFast ?? false;\n // \u76FE\u724C\uFF08\u81EA\u52A8\u63A5\u53D7\u6743\u9650\u63D0\u793A\uFF09\u754C\u9762\u5DF2\u53BB\u6389\uFF1A\u4E00\u5F8B\u4E0D\u81EA\u52A8\u653E\u884C\uFF0C\u907F\u514D\u4EE5\u524D\u5F00\u8FC7\u7684\u5BF9\u8BDD\u5728\u770B\u4E0D\u89C1\u5F00\u5173\u65F6\u7EE7\u7EED\u81EA\u52A8\u6279\u51C6\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 ? ({\n ok: true as const,\n cmd: this.o.launch.cmd,\n prefixArgs: this.o.launch.prefixArgs,\n display: this.o.launch.cmd,\n via: \"custom\",\n binName: \"custom\",\n } satisfies ResolveResult & { ok: true; binName: string })\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, this.o.acpArgs, { 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: `${this.o.binName} \u8FDB\u7A0B\u9000\u51FA (${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 await this.ctx.request(methods.agent.initialize, {\n protocolVersion: PROTOCOL_VERSION,\n // Cursor\uFF1A\u58F0\u660E\u652F\u6301\u53C2\u6570\u5316\u6A21\u578B\u9009\u62E9\u5668\uFF08\u540C Paseo\uFF09\uFF0C\u5B83\u624D\u4F1A\u628A\u6863\u4F4D / Fast \u4F5C\u4E3A\u5355\u72EC\u914D\u7F6E\u9879\u4EA4\u51FA\u6765\n clientCapabilities: this.o.flavor === \"cursor\" ? { _meta: { parameterizedModelPicker: true } } : {},\n clientInfo: { name: \"Agent Console\", version: this.o.appVersion },\n });\n\n const cwd = absCwd(this.o.cwd);\n const ctx = this.ctx;\n if (!ctx) throw new Error(\"ACP \u672A\u8FDE\u63A5\");\n if (this.o.resumeId) {\n const loaded = await ctx.request(methods.agent.session.load, {\n sessionId: this.o.resumeId,\n cwd,\n mcpServers: [],\n });\n this.active = (ctx as unknown as AttachableCtx).attachSession({\n sessionId: this.o.resumeId,\n modes: loaded.modes,\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); // \u5185\u542B\u4E0B\u53D1\u6863\u4F4D\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 \u4F1A\u8BDD\u672A\u5C31\u7EEA\");\n }\n\n /** \u5F53\u524D\u751F\u6548\u7684\u914D\u7F6E\u9879\uFF1A\u6BCF\u6B21 set_config_option \u7684\u8FD4\u56DE\u4F1A\u5E26\u56DE\u6700\u65B0\u4E00\u4EFD\uFF08\u6362\u6A21\u578B\u540E\u6863\u4F4D\u9009\u9879\u4F1A\u53D8\uFF09\uFF0C\u6CA1\u6709\u5C31\u7528 session/new \u7684 */\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 // \u6863\u4F4D\u9009\u9879\u5C5E\u4E8E\u300C\u5F53\u524D\u6A21\u578B\u300D\uFF1A\u6BCF\u6B21\u5237\u65B0\u90FD\u91CD\u7B97\uFF08\u6362\u5230\u6CA1\u6709\u6863\u4F4D\u7684\u6A21\u578B\u65F6\u6E05\u7A7A\uFF09\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\uFF0C\u5E76\u7528\u8FD4\u56DE\u7684\u6700\u65B0\u914D\u7F6E\u9879\u5237\u65B0\u672C\u5730\u72B6\u6001 */\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 // \u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u8FD9\u4E00\u6863\u5C31\u4E0D\u53D1\uFF08\u6362\u6A21\u578B\u540E\u6863\u4F4D\u96C6\u5408\u4F1A\u53D8\uFF09\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 /** Agent \u62A5\u7684\u6A21\u5F0F\u9009\u9879\uFF1A\u4F18\u5148 configOptions \u91CC category=mode \u7684 select\uFF0C\u5426\u5219 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 // \u6309\u5BF9\u7167\u8868\u627E Agent \u771F\u5B9E\u7684\u6A21\u5F0F\uFF1BCopilot \u7684\u6A21\u5F0F id \u662F URL\uFF08\u2026/session-modes#agent\uFF09\uFF0C\u6309 # \u540E\u7F00\u5339\u914D\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\u300CAllow All\u300D\uFF08\u540C Paseo\uFF09\uFF1A\u6A21\u5F0F\u7528 agent\uFF0C\u518D\u628A allow_all \u914D\u7F6E\u6253\u5F00\uFF1B\u5176\u5B83\u6A21\u5F0F\u65F6\u5173\u6389\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; // \u8BE5 Agent \u6CA1\u6709\u8FD9\u4E2A\u6A21\u5F0F\uFF1A\u4E0D\u4E71\u53D1\n try {\n // \u6A21\u5F0F\u4EE5\u914D\u7F6E\u9879\u5F62\u5F0F\u63D0\u4F9B\u7684\uFF08Devin / OpenCode / Copilot\uFF09\u7528 set_config_option\uFF0C\u5426\u5219\u7528 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 * \u6362\u6A21\u578B \u2192 \u7528\u8FD4\u56DE\u7684\u65B0\u914D\u7F6E\u9879\u5237\u65B0\u6863\u4F4D\u9009\u9879 \u2192 \u518D\u4E0B\u53D1\u6863\u4F4D\uFF08\u540C Paseo\uFF09\u3002\n * Cursor \u4EE5 parameterizedModelPicker \u65B9\u5F0F\u8FDE\u63A5\uFF1A\u6A21\u578B\u53EA\u53D1\u57FA\u540D\uFF08grok-4.6\uFF09\uFF0C\u6863\u4F4D / Fast \u662F\u5355\u72EC\u7684\u914D\u7F6E\u9879\u3002\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 // \u65E7\u4F1A\u8BDD\u53EF\u80FD\u4FDD\u5B58\u4E86\u5176\u5B83 Agent \u7684\u6A21\u578B ID\u3002\u8DF3\u8FC7\u975E\u6CD5\u503C\uFF0C\u8BA9 ACP \u4FDD\u7559\u81EA\u5DF1\u7684\u5F53\u524D\u6A21\u578B\u3002\n if (!values.length || values.includes(value)) {\n await this.setOption(this.modelConfigId ?? \"model\", value);\n } else {\n log(\"info\", `\u5FFD\u7565 ${this.o.binName} \u7684\u65E0\u6548\u6A21\u578B\uFF1A${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 /* \u5C1D\u8BD5\u4E0B\u4E00\u4E2A configId */\n }\n }\n }\n\n /** Cursor \u4E13\u7528\uFF1AFast / Auto-review\uFF08\u4F1A\u8BDD\u5DF2\u5F00\u65F6\u4E5F\u53EF\u6539\uFF09 */\n async updateCursorOpts(fast: boolean, autoReview: boolean): Promise<void> {\n this.cursorFast = fast;\n void autoReview; // \u89C1\u6784\u9020\u51FD\u6570\uFF1A\u4E0D\u518D\u652F\u6301\u81EA\u52A8\u653E\u884C\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(\"\u5F53\u524D\u8F6E\u6B21\u5C1A\u672A\u7ED3\u675F\");\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 if (!text) {\n this.running = false;\n this.q.push({ type: \"turn_ended\", turnId: this.turnId, status: \"completed\" });\n return;\n }\n void this.runTurn(text);\n }\n\n // \u53D1\u51FA\u8FD9\u4E00\u8F6E\u7684 prompt\uFF1B\u8BFB\u66F4\u65B0\u7531\u5E38\u9A7B\u7684 pumpUpdates() \u8D1F\u8D23\uFF08\u53C2\u8003 Paseo\uFF1A\u4F1A\u8BDD\u7EA7\u7EDF\u4E00\u5904\u7406 session/update\uFF09\n private async runTurn(text: string): Promise<void> {\n this.activeTurnId = this.turnId;\n this.wakePump?.();\n this.wakePump = null;\n this.active!.prompt(text).catch(() => {\n /* \u5931\u8D25\u4F1A\u7ECF nextUpdate() \u629B\u51FA\uFF0C\u7531 pumpUpdates \u7ED3\u675F\u672C\u8F6E */\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 * \u4F1A\u8BDD\u6574\u4E2A\u751F\u547D\u5468\u671F\u5185\u6301\u7EED\u8BFB session/update\u3002\n * \u539F\u6765\u53EA\u5728\u4E00\u8F6E\u5BF9\u8BDD\u91CC\u8BFB\uFF1AAgent \u5728 session/new \u4E4B\u540E\u3001\u7B2C\u4E00\u6761\u6D88\u606F\u4E4B\u524D\u63A8\u7684 available_commands_update \u5C31\u6CA1\u4EBA\u6536\uFF0C\n * \u659C\u6760\u83DC\u5355\u4E00\u76F4\u662F\u7A7A\u7684\u3002\u73B0\u5728\u547D\u4EE4\u66F4\u65B0\u968F\u65F6\u7F13\u5B58\uFF1B\u5BF9\u8BDD\u5185\u5BB9\u53EA\u5728\u6709\u8FDB\u884C\u4E2D\u7684\u8F6E\u6B21\u65F6\u8F6C\u6210\u65F6\u95F4\u7EBF\u4E8B\u4EF6\u3002\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 // \u51FA\u9519\u540E\u961F\u5217\u4F1A\u4E00\u76F4\u629B\u540C\u4E00\u4E2A\u9519\u8BEF\uFF0C\u76F4\u5230\u4E0B\u4E00\u6B21 prompt \u6E05\u6389\uFF1A\u7B49\u4E0B\u4E00\u8F6E\u518D\u8BFB\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; // \u8F6E\u6B21\u4E4B\u5916\u7684\u5176\u5B83\u66F4\u65B0\uFF08\u5982\u6A21\u5F0F\u53D8\u5316\u56DE\u663E\uFF09\u4E0D\u8FDB\u65F6\u95F4\u7EBF\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 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 // \u547D\u4EE4\u662F session/new \u4E4B\u540E\u5F02\u6B65\u63A8\u6765\u7684\uFF1A\u6700\u591A\u7B49 10 \u79D2\u7B2C\u4E00\u6279\uFF08\u4E0D\u62A5\u547D\u4EE4\u7684 Agent \u8D85\u65F6\u540E\u8FD4\u56DE\u7A7A\uFF09\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 { spawn } from \"node:child_process\";\nimport type { Provider, DetectResult, ModelInfo, Capabilities, Mode } from \"../types.js\";\nimport type { ResolveResult } from \"../../util/bin.js\";\nimport { resolveFirstBin } from \"../../util/bin.js\";\nimport { AcpSession } from \"./session.js\";\n\nexport type AcpProviderConfig = {\n id: string;\n name: string;\n binName: string;\n /** \u4F18\u5148\u4E8E binName\uFF1Adetect / listModels / session \u6309\u5E8F\u89E3\u6790 */\n binCandidates?: string[];\n acpArgs: string[];\n installHint: string;\n appVersion?: string;\n flavor?: \"cursor\" | \"generic\";\n capabilities?: Capabilities;\n fetchModels?: (r: ResolveResult & { ok: true }) => Promise<ModelInfo[]>;\n /** \u6211\u4EEC\u7684\u6743\u9650\u6A21\u5F0F \u2192 \u8BE5 Agent \u5728 ACP \u91CC\u7684\u6A21\u5F0F\u540D\uFF1B\u7ED9\u4E86\u5C31\u53EA\u663E\u793A\u8868\u91CC\u6709\u7684\u6A21\u5F0F */\n modeMap?: Partial<Record<Mode, string>>;\n /** \u754C\u9762\u4E0A\u663E\u793A\u7684\u6A21\u5F0F\u540D\uFF08Agent \u81EA\u5DF1\u7684\u53EB\u6CD5\uFF09 */\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};\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 = spawn(r.cmd, [...r.prefixArgs, ...args], { windowsHide: true, env: { ...process.env, NO_COLOR: \"1\" } });\n const t = setTimeout(() => {\n try {\n p.kill();\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 // \u6709\u6A21\u5F0F\u5BF9\u7167\u8868\u65F6\uFF0C\u53EA\u66B4\u9732 Agent \u771F\u6709\u7684\u6A21\u5F0F\uFF08\u987A\u5E8F\u6309\u6211\u4EEC\u7684\u56FA\u5B9A\u987A\u5E8F\uFF09\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 capabilities: caps,\n async detect(): Promise<DetectResult> {\n const r = await resolveProviderBin(cfg);\n if (!r.ok) {\n return { available: false, reason: r.reason, installHint: cfg.installHint };\n }\n let version: string | undefined;\n try {\n if (cfg.id === \"cursor\") {\n version = (await runVersion(r, [\"--version\"])).split(/\\r?\\n/)[0]?.trim();\n } else if (cfg.id === \"devin\") {\n version = (await runVersion(r, [\"version\"])).split(/\\r?\\n/)[0]?.trim();\n } else if (cfg.id === \"opencode\") {\n version = (await runVersion(r, [\"--version\"])).split(/\\r?\\n/)[0]?.trim();\n }\n } catch {\n /* \u6709\u4E8C\u8FDB\u5236\u5373\u53EF\u7528 */\n }\n return { available: true, bin: r.display, version };\n },\n async listModels(): Promise<ModelInfo[]> {\n const r = await resolveProviderBin(cfg);\n if (!r.ok) return [{ id: \"default\", name: \"\u9ED8\u8BA4\", isDefault: true }];\n if (cfg.fetchModels) return cfg.fetchModels(r);\n return [{ id: \"default\", name: \"\u9ED8\u8BA4\", isDefault: true }];\n },\n async createSession(o) {\n return new AcpSession({\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 binName: cfg.binName,\n binCandidates: cfg.binCandidates ?? [cfg.binName],\n acpArgs: cfg.acpArgs,\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", "// ACP \u63A2\u6D4B\uFF1A\u8D77\u4E00\u6B21 Agent \u7684 ACP \u8FDB\u7A0B \u2192 initialize \u2192 session/new\uFF0C\u8BFB\u5B83\u81EA\u5DF1\u62A5\u7684\u6A21\u578B\u4E0E\u601D\u8003\u6863\u4F4D\uFF0C\u7136\u540E\u5173\u6389\u3002\n// \u4E0D\u53D1 prompt\uFF0C\u4E0D\u82B1\u989D\u5EA6\u3002\u8FD9\u662F Agent\u300C\u539F\u7248\u300D\u7684\u6A21\u578B\u5217\u8868\uFF08\u540C Paseo \u7684\u505A\u6CD5\uFF09\uFF0C\u6BD4\u89E3\u6790 CLI \u6587\u672C\u53EF\u9760\u3002\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\";\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 // \u53BB\u91CD\uFF08Copilot \u4F1A\u628A auto \u62A5\u4E24\u6B21\uFF09\n return out.filter((m, i) => out.findIndex((x) => x.id === m.id) === i);\n}\n\n/** \u4ECE session/new \u7684\u8FD4\u56DE\u91CC\u53D6\u6A21\u578B\u4E0E\u601D\u8003\u6863\u4F4D\uFF08\u7EAF\u51FD\u6570\uFF0C\u4FBF\u4E8E\u6D4B\u8BD5\uFF09 */\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\nexport function probeAcp(r: ResolveResult & { ok: true }, acpArgs: string[], timeoutMs = 30000): Promise<AcpProbeResult> {\n return probeAcpRaw(r, acpArgs, timeoutMs).then((x) => x.parsed);\n}\n\n/** \u540C probeAcp\uFF0C\u53E6\u5916\u5728 session/new \u4E4B\u540E\u8C03\u4E00\u4E2A Agent \u81EA\u5B9A\u4E49\u65B9\u6CD5\uFF08\u5982 Cursor \u7684 cursor/list_available_models\uFF09 */\nexport function probeAcpRaw(\n r: ResolveResult & { ok: true },\n acpArgs: string[],\n timeoutMs = 30000,\n extMethod?: string,\n): Promise<{ parsed: AcpProbeResult; ext: unknown }> {\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 }) => {\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 \u63A2\u6D4B\u8D85\u65F6\")), 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 \u8FDB\u7A0B\u63D0\u524D\u9000\u51FA\")));\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 // Agent \u53D1\u6765\u7684\u8BF7\u6C42\uFF08\u63A2\u6D4B\u671F\u95F4\u4E0D\u8BE5\u6709\uFF09\uFF1A\u4E00\u5F8B\u56DE\u7A7A\uFF0C\u907F\u514D\u5B83\u5361\u4F4F\n child.stdin?.write(JSON.stringify({ jsonrpc: \"2.0\", id: m.id, result: null }) + \"\\n\");\n }\n }\n });\n void (async () => {\n try {\n 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 });\n } catch (e) {\n finish(e instanceof Error ? e : new Error(String(e)));\n }\n })();\n });\n}\n\n/** \u63A2\u6D4B\u7ED3\u679C \u2192 \u6A21\u578B\u5217\u8868\uFF1A\u5F53\u524D\u6A21\u578B\u6807\u9ED8\u8BA4\uFF1B\u601D\u8003\u6863\u4F4D\u6302\u5728\u5F53\u524D\u6A21\u578B\u4E0A\uFF08\u5176\u5B83\u6A21\u578B\u7684\u6863\u4F4D\u8981\u5207\u8FC7\u53BB\u624D\u77E5\u9053\uFF0C\u5148\u6CBF\u7528\u540C\u4E00\u7EC4\uFF09 */\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\uFF1A\u6A21\u578B\u7684\u601D\u8003\u6863\u4F4D\u4E0D\u5728\u4F1A\u8BDD\u7EA7 thought_level \u91CC\uFF0C\u800C\u662F\u6BCF\u4E2A\u6A21\u578B\u81EA\u5DF1\u7684\u53C2\u6570\uFF08effort / reasoning_effort / reasoning\uFF09\u3002\n * \u53C2\u8003 Paseo \u7684 resolveCursorCatalogModels\uFF1A\u8C03 Cursor \u6269\u5C55\u65B9\u6CD5 cursor/list_available_models \u53D6\u6BCF\u4E2A\u6A21\u578B\u7684\u53C2\u6570\u5B9A\u4E49\u3002\n * \u6A21\u578B id \u7528\u4E0D\u5E26\u53C2\u6570\u7684\u57FA\u540D\uFF08grok-4.6\uFF09\uFF1BthinkingParam \u8BB0\u4E0B\u6863\u4F4D\u53C2\u6570\u540D\uFF0C\u53D1\u9001\u65F6\u62FC\u6210 grok-4.6[effort=high]\u3002\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[]) {\n return async (r: ResolveResult & { ok: true }): Promise<ModelInfo[]> => {\n try {\n const { parsed, ext } = await probeAcpRaw(r, acpArgs, 40000, \"cursor/list_available_models\");\n const fromCatalog = ext ? cursorCatalogToModels(ext as CursorCatalog, parsed.currentModel) : [];\n // \u6269\u5C55\u65B9\u6CD5\u4E0D\u53EF\u7528\uFF08\u65E7\u7248 Cursor CLI\uFF09\u65F6\u9000\u56DE\u4F1A\u8BDD\u91CC\u62A5\u7684\u6A21\u578B\u5217\u8868\uFF08\u6CA1\u6709\u6863\u4F4D\uFF09\n return fromCatalog.length ? fromCatalog : probeToModels(parsed);\n } catch (e) {\n log(\"warn\", \"Cursor \u6A21\u578B\u63A2\u6D4B\u5931\u8D25\", { err: String(e) });\n return [];\n }\n };\n}\n\nexport function acpProbeModels(acpArgs: string[]) {\n return async (r: ResolveResult & { ok: true }): Promise<ModelInfo[]> => {\n try {\n return probeToModels(await probeAcp(r, acpArgs));\n } catch (e) {\n log(\"warn\", \"ACP \u63A2\u6D4B\u6A21\u578B\u5931\u8D25\", { 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 } from \"./probe.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// \u6A21\u578B\u5217\u8868\u4E0E\u601D\u8003\u6863\u4F4D\u4E00\u5F8B\u53D6 Agent \u81EA\u5DF1\u5728 ACP \u91CC\u62A5\u7684\uFF08acpProbeModels\uFF09\uFF0C\u4E0D\u518D\u89E3\u6790\u5404\u5BB6 CLI \u7684\u6587\u672C\u8F93\u51FA\u3002\n// modeMap\uFF1A\u6211\u4EEC\u7684\u6743\u9650\u6A21\u5F0F \u2192 \u8BE5 Agent \u771F\u5B9E\u7684\u6A21\u5F0F\u540D\uFF08\u5B9E\u6D4B session/new \u62A5\u7684\u9009\u9879\uFF09\uFF1B\u503C\u4E3A \"\" \u8868\u793A\u4FDD\u7559\u8BE5\u9879\u4F46\u4E0D\u4E0B\u53D1\u3002\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 // \u6A21\u5F0F\uFF1Aagent / plan / ask\uFF08\u89C1 cursorAcpCapabilities\uFF09\n return {\n ...base,\n acpArgs: [\"acp\"],\n flavor: \"cursor\",\n capabilities: cursorAcpCapabilities,\n // \u6BCF\u4E2A\u6A21\u578B\u81EA\u5DF1\u7684\u601D\u8003\u6863\u4F4D\u6765\u81EA cursor/list_available_models\uFF08\u540C Paseo\uFF09\n fetchModels: cursorProbeModels([\"acp\"]),\n };\n case \"devin\":\n // \u6A21\u5F0F\uFF1ACode(accept-edits) / Smart / Ask / Plan / Bypass Permissions\n return {\n ...base,\n acpArgs: [\"acp\"],\n fetchModels: acpProbeModels([\"acp\"]),\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 // \u6A21\u5F0F\uFF1Abuild / plan\uFF1B\u601D\u8003\u6863\u4F4D effort\uFF08low\u2026ultra\uFF0C\u542B fast\uFF09\n return {\n ...base,\n acpArgs: [\"acp\"],\n fetchModels: acpProbeModels([\"acp\"]),\n modeMap: { plan: \"plan\", default: \"build\" },\n modeLabels: { plan: \"Plan\", default: \"Build\" },\n };\n case \"copilot\":\n // \u540C Paseo\uFF1AAgent / Plan / Allow All\u3002Allow All = agent \u6A21\u5F0F + allow_all \u914D\u7F6E\u5F00\uFF08\u4E0D\u7528 autopilot\uFF09\n return {\n ...base,\n acpArgs: [\"--acp\"],\n fetchModels: acpProbeModels([\"--acp\"]),\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 \u4E0D\u63D0\u4F9B\u6A21\u5F0F\u9009\u9879\uFF1B\u601D\u8003\u6863\u4F4D thought_level\uFF08low\u2026max\uFF09\n return { ...base, acpArgs: [], fetchModels: acpProbeModels([]), modeMap: { default: \"\" } };\n case \"dsh\":\n return { ...base, acpArgs: [\"--profile\", \"acp\"], fetchModels: acpProbeModels([\"--profile\", \"acp\"]) };\n default:\n return null;\n }\n}\n", "// Provider registry\uFF1A\u76EE\u5F55\u5185 8 \u4E2A\uFF1Bclaude/codex \u539F\u751F\uFF0C\u5176\u4F59 ACP\uFF08\u542B copilot --acp\uFF09\u3002\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", "// \u7528\u6237\u662F\u5426\u5728\u8BBE\u7F6E\u91CC\u542F\u7528\u8BE5 Provider\u3002\n// \u6CA1\u624B\u52A8\u5F00\u5173\u8FC7\uFF1Acatalog status=verified \u9ED8\u8BA4\u5F00\uFF0C\u5176\u4F59\u9ED8\u8BA4\u5173\uFF1B\u76EE\u5F55\u5916\uFF08mock \u7B49\uFF09\u9ED8\u8BA4\u5F00\u3002\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/** \u628A PowerShell \u6807\u51C6\u8F93\u51FA\u89E3\u6790\u6210\u6587\u4EF6\u5939\u8DEF\u5F84\uFF08\u517C\u5BB9 Base64 \u4E0E CP936 \u63A7\u5236\u53F0\uFF09 */\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 // \u65B0\u683C\u5F0F\uFF1AUTF-8 \u8DEF\u5F84\u7684 Base64\uFF0C\u907F\u514D\u4E2D\u6587 Windows \u63A7\u5236\u53F0\u7528 GBK \u8F93\u51FA\u5BFC\u81F4 Node \u6309 UTF-8 \u89E3\u7801\u4E71\u7801\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 = '\u9009\u62E9\u9879\u76EE\u6587\u4EF6\u5939';\" +\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", "// magpie \u7F51\u5173\uFF1Amagpie \u4F1A\u628A\u5404\u5BB6 Agent \u7684\u6A21\u578B\u6539\u6210\u8D70\u672C\u673A\u7F51\u5173\uFF08applied.json \u8BB0\u5F55\u6BCF\u5BB6\u5F53\u524D\u5E94\u7528\u7684\u6A21\u578B\uFF09\u3002\n// \u8FD9\u91CC\u7EDF\u4E00\u7ED9\u8FD9\u4E9B Agent \u8865\u5168\u6A21\u578B\u5217\u8868\u3001\u9ED8\u8BA4\u6A21\u578B\u3001\u6BCF\u4E2A\u6A21\u578B\u652F\u6301\u7684\u601D\u8003\u6863\u4F4D\u3002\u53EA\u8BFB\uFF0C\u4E0D\u6539\u4EFB\u4F55\u914D\u7F6E\u3002\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 \u7684 provider id \u2192 magpie applied.json \u7684\u952E + \u8BE5 Agent \u91CC\u6A21\u578B id \u7684\u524D\u7F00 */\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/** \u7F51\u5173\u5730\u5740\uFF1A\u53D6 Claude \u914D\u7F6E\u91CC\u7684 ANTHROPIC_BASE_URL\uFF08magpie \u5199\u7684\uFF09\uFF0C\u5426\u5219\u9ED8\u8BA4 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\", \"\u8BFB\u53D6 magpie \u7F51\u5173\u6A21\u578B\u5217\u8868\u5931\u8D25\", { err: String(e) });\n return [];\n }\n}\n\n/** CLAUDE_CODE_MODEL_CAPABILITIES\uFF1A`id=effort,xhigh_effort,max_effort;id2=effort` \u2192 \u6BCF\u4E2A\u6A21\u578B\u7684\u6863\u4F4D */\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 * \u7ED9 magpie \u7BA1\u7406\u7684 Agent \u8865\u5168\u6A21\u578B\u4FE1\u606F\uFF1Bmagpie \u6CA1\u7BA1\u8FD9\u4E2A Agent\uFF08applied.json \u91CC\u6CA1\u6709\uFF09\u5C31\u539F\u6837\u8FD4\u56DE\u3002\n * - Agent \u81EA\u5DF1\u5217\u8868\u91CC\u8BA4\u5F97 magpie \u6A21\u578B\uFF08\u5982 OpenCode\u3001Codex\uFF09\uFF1A\u4FDD\u7559\u81EA\u5DF1\u7684\u5217\u8868\uFF0Cmagpie \u7684\u6392\u524D\u9762\uFF08\u53EA\u5217\u5B83\u8BA4\u5F97\u7684\uFF0C\u9009\u4E86\u4E0D\u4F1A\u5931\u8D25\uFF09\n * - Agent \u62A5\u4E0D\u51FA\u6A21\u578B\uFF08Claude\u3001Pi\u3001dsh\uFF09\uFF1A\u7528\u7F51\u5173 /v1/models\uFF0C\u6309\u8BE5 Agent \u7684\u5199\u6CD5\u52A0\u524D\u7F00\n * - \u9ED8\u8BA4\u6A21\u578B = magpie \u5F53\u524D\u7ED9\u5B83\u5E94\u7528\u7684\u6A21\u578B\uFF1B\u601D\u8003\u6863\u4F4D\u6309 magpie \u5199\u7684\u80FD\u529B\u8868\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 // DSH \u901A\u8FC7 ACP \u8FD4\u56DE\u7684\u662F\u5B83\u81EA\u5DF1\u7684\u771F\u5B9E\u6A21\u578B ID\uFF08JSON \u6570\u7EC4\u5B57\u7B26\u4E32\uFF09\u3002\n // \u4E0D\u80FD\u628A applied.json \u91CC\u65E7\u7684/\u5176\u5B83 Agent \u7684\u6A21\u578B ID \u76F4\u63A5\u585E\u8FDB DSH\uFF0C\n // \u5426\u5219 DSH \u4F1A\u628A\u5B83\u5F53\u6210\u8DEF\u7531\u6A21\u578B\u53D1\u9001\u7ED9\u9519\u8BEF\u7684 provider\u3002\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 // \u9ED8\u8BA4\u6A21\u578B = magpie \u5F53\u524D\u5E94\u7528\u7684\uFF1B\u4E0D\u5728\u5217\u8868\u91CC\u5C31\u8865\u5230\u6700\u524D\u9762\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 // \u601D\u8003\u6863\u4F4D\uFF1AAgent \u81EA\u5DF1\u62A5\u4E86\u5C31\u7528\u5B83\u7684\uFF1B\u5426\u5219\u7528 magpie \u80FD\u529B\u8868\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", "// Provider \u68C0\u6D4B\u7ED3\u679C\u4E0E\u6A21\u578B\u5217\u8868\u7684\u5185\u5B58\u7F13\u5B58\u3002\n// detect / listModels \u5F80\u5F80\u8981\u73B0\u8D77 CLI\uFF08\u6570\u79D2\uFF09\uFF0C\u4E0D\u7F13\u5B58\u7684\u8BDD\u6BCF\u6B21\u6253\u5F00\u9875\u9762\u3001\u9009\u6A21\u578B\u90FD\u8981\u7B49\u3002\nimport type { Provider, DetectResult, ModelInfo } from \"./types.js\";\nimport { withMagpie } from \"./magpieGateway.js\";\n\nconst DETECT_MS = 60 * 1000;\nconst MODELS_MS = 10 * 60 * 1000;\nconst STEP_TIMEOUT_MS = 15000;\n// \u62C9\u6A21\u578B\u53EF\u80FD\u8981\u8D77\u4E00\u6B21 ACP \u4F1A\u8BDD\uFF08Cursor \u7ECF PowerShell \u542F\u52A8\u8F83\u6162\uFF09\uFF0C\u5355\u72EC\u653E\u5BBD\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// \u540C\u4E00 Provider \u5E76\u53D1\u8BF7\u6C42\u5171\u7528\u4E00\u6B21\u8FDB\u884C\u4E2D\u7684\u68C0\u6D4B\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\nexport async function cachedDetect(p: Provider): Promise<DetectResult> {\n const hit = detects.get(p.id);\n if (fresh(hit, DETECT_MS)) return hit.value;\n let job = inflightDetect.get(p.id);\n if (!job) {\n job = withTimeout(\n p.detect().catch((e): DetectResult => ({ available: false, reason: String((e as Error)?.message ?? e) })),\n STEP_TIMEOUT_MS,\n { available: false, reason: \"\u68C0\u6D4B\u8D85\u65F6\" },\n ).then((v) => {\n // \u8D85\u65F6\u4E0D\u5199\u7F13\u5B58\uFF0C\u4E0B\u6B21\u518D\u8BD5\n if (v.reason !== \"\u68C0\u6D4B\u8D85\u65F6\") detects.set(p.id, { at: Date.now(), value: v });\n return v;\n }).finally(() => inflightDetect.delete(p.id));\n inflightDetect.set(p.id, job);\n }\n return job;\n}\n\nexport async function cachedModels(p: Provider): Promise<ModelInfo[]> {\n const hit = models.get(p.id);\n if (fresh(hit, MODELS_MS)) return hit.value;\n let job = inflightModels.get(p.id);\n if (!job) {\n job = withTimeout<ModelInfo[] | null>(p.listModels().catch(() => []), MODELS_TIMEOUT_MS, null)\n .then(async (v) => {\n // \u8D85\u65F6\uFF1A\u4E0D\u5199\u7F13\u5B58\uFF0C\u5148\u7528\u65E7\u503C\u9876\u4E0A\n if (v === null) return models.get(p.id)?.value ?? [];\n // \u7ECF magpie \u7F51\u5173\u7684 Agent\uFF1A\u8865\u5168\u7F51\u5173\u6A21\u578B\u3001\u9ED8\u8BA4\u6A21\u578B\u3001\u601D\u8003\u6863\u4F4D\n const list = await withMagpie(p.id, dropPlaceholder(v)).catch(() => dropPlaceholder(v));\n models.set(p.id, { at: Date.now(), value: list });\n return list;\n })\n .finally(() => inflightModels.delete(p.id));\n inflightModels.set(p.id, job);\n }\n return job;\n}\n\n/** \u53EA\u6709\u6211\u4EEC\u81EA\u5DF1\u585E\u7684\u300C\u9ED8\u8BA4\u300D\u5360\u4F4D\u9879\uFF08id=default\u3001\u540D\u5B57\u300C\u9ED8\u8BA4\u300D\uFF09\u7684\u5217\u8868\u89C6\u4E3A\u6CA1\u6709\u771F\u5B9E\u6A21\u578B\u3002\n * Agent \u81EA\u5DF1\u62A5\u7684 auto / Auto\uFF08\u5982 Copilot\uFF09\u662F\u771F\u5B9E\u9009\u9879\uFF0C\u4FDD\u7559\u3002 */\nexport function dropPlaceholder(list: ModelInfo[]): ModelInfo[] {\n if (list.length === 1 && list[0].id === \"default\" && list[0].name === \"\u9ED8\u8BA4\") return [];\n return list;\n}\n\n/** \u6709\u7F13\u5B58\u5C31\u7ACB\u5373\u7ED9\uFF08\u53EF\u80FD\u8FC7\u671F\uFF09\uFF0C\u6CA1\u6709\u8FD4\u56DE 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 detects.delete(id);\n models.delete(id);\n } else {\n detects.clear();\n models.clear();\n }\n}\n", "// \u65B9\u6CD5\u6CE8\u518C\u8868\uFF1A\u53C2\u6570 zod \u6821\u9A8C \u2192 \u8C03\u670D\u52A1 \u2192 \u8FD4\u56DE\u3002P0-5 \u9AA8\u67B6\uFF1BP1 \u8D77\u9010\u6B65\u8865\u9F50\u3002\nimport { z } from \"zod\";\nimport type { Gateway, ConnCtx } from \"./gateway.js\";\nimport type { Config } from \"../config.js\";\nimport type { SettingsStore } 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 } from \"node:path\";\nimport { execFile } from \"node:child_process\";\nimport { pickFolderWindows } from \"../util/pickFolderWin.js\";\nimport { clearBinCache } from \"../util/bin.js\";\nimport { cachedDetect, cachedModels, clearProviderCache } from \"../providers/infoCache.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 \u5728 P1-4 \u63A5\u5165\u540E\u63D0\u4F9B\u8FD0\u884C\u65F6\u4FE1\u606F\uFF1B\u53EF\u4E3A\u7A7A\uFF08\u672A\u542F\u52A8\u4F1A\u8BDD\u65F6\uFF09\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<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 };\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\", \"\u53C2\u6570\u4E0D\u5BF9\uFF1A\" + r.error.issues.map((i) => i.message).join(\"\uFF1B\"));\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()) }), (p) =>\n svc.settings.set(p.patch)\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 // thread:<id> \u9891\u9053\u8865\u63A8 afterSeq \u4E4B\u540E\u7684\u6301\u4E45\u5316\u4E8B\u4EF6\uFF08\u665A\u8BA2\u9605/\u91CD\u8FDE\u4E0D\u4E22\u6D88\u606F\uFF09\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\uFF08\u00A76\uFF09\uFF1A\u68C0\u6D4B + \u6A21\u578B\u5217\u8868 + capabilities ----\n // detect/listModels \u5E76\u884C\uFF1B\u5355\u4E2A provider \u603B\u65F6\u9650 8s\uFF08listModels \u53EF\u80FD\u8D77\u4E34\u65F6\u8FDB\u7A0B\uFF09\u3002\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 // \u5DF2\u7981\u7528 / \u672A\u63A5\u5165\u7684\u4E0D\u68C0\u6D4B\u3001\u4E0D\u62FF\u6A21\u578B\uFF08\u7701\u6389\u73B0\u8D77 CLI \u7684\u51E0\u79D2\uFF09\n const skip = !enabled || entry?.status === \"planned\";\n const det: import(\"../providers/types.js\").DetectResult = skip\n ? { available: false, reason: !enabled ? \"\u5DF2\u5728\u8BBE\u7F6E\u4E2D\u7981\u7528\" : \"\u5C1A\u672A\u63A5\u5165\" }\n : await cachedDetect(p);\n const models = !skip && det.available ? await cachedModels(p) : [];\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 ? \"\u5DF2\u5728\u8BBE\u7F6E\u4E2D\u7981\u7528\" : 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 // \u8BB0\u5F55\u6700\u8FD1\u76EE\u5F55\uFF08\u53BB\u91CD\u3001\u5FFD\u7565\u5927\u5C0F\u5199\u3001\u6700\u591A 12 \u6761\uFF09\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\", \"\u9879\u76EE\u4E0D\u5B58\u5728\");\n // \u9879\u76EE\u4E0B\u6240\u6709\u5BF9\u8BDD\u79FB\u5165\u56DE\u6536\u76EE\u5F55\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\", \"\u9879\u76EE\u4E0D\u5B58\u5728\");\n const cmd = process.platform === \"win32\" ? \"explorer.exe\" : process.platform === \"darwin\" ? \"open\" : \"xdg-open\";\n execFile(cmd, [proj.path], { windowsHide: true }, () => {});\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\uFF1A\u5F39\u7CFB\u7EDF\u6587\u4EF6\u5939\u9009\u62E9\u6846\uFF08daemon \u5728\u672C\u673A\uFF0C\u76F4\u63A5\u501F powershell \u7684\n // FolderBrowserDialog\uFF1B\u975E Windows \u8FD4\u56DE\u4E0D\u53EF\u7528\uFF0C\u524D\u7AEF\u9000\u56DE\u624B\u8F93\uFF09\u3002\n gw.method(\"fs.pickFolder\", wrap(z.object({ initial: z.string().optional() }).passthrough().optional(), (p) =>\n pickFolderWindows(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\", \"\u9879\u76EE\u4E0D\u5B58\u5728\");\n if (!existsSync(proj.path)) throw new ApiError(\"bad_path\", \"\u9879\u76EE\u76EE\u5F55\u5DF2\u4E0D\u5B58\u5728\");\n // \u65B0\u5EFA\u5BF9\u8BDD\u5FC5\u987B\u7528\u5DF2\u542F\u7528\u7684 Agent\uFF08\u5BFC\u5165\u5DF2\u6709\u4F1A\u8BDD\u9664\u5916\uFF0C\u5B83\u5C5E\u4E8E\u300C\u5DF2\u7ECF\u804A\u8FC7\u300D\uFF09\n if (!p.providerSessionId && !isProviderEnabled(await svc.settings.get(), p.provider)) {\n throw new ApiError(\"bad_params\", \"\u8BE5 Agent \u5DF2\u5728\u8BBE\u7F6E\u4E2D\u7981\u7528\");\n }\n const cat = catalogById(p.provider);\n if (!p.providerSessionId && cat && !providerCreatable(cat.status)) {\n throw new ApiError(\"bad_params\", `${cat.name} \u5C1A\u672A\u63A5\u5165\uFF0C\u6682\u4E0D\u80FD\u65B0\u5EFA\u5BF9\u8BDD`);\n }\n const meta = await svc.threads.create(p);\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\", \"\u5BF9\u8BDD\u4E0D\u5B58\u5728\");\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\", \"\u5BF9\u8BDD\u4E0D\u5B58\u5728\");\n const patch: Record<string, unknown> = {};\n if (p.title !== undefined) {\n patch.title = p.title.trim() || meta.title;\n patch.titleAuto = false; // \u624B\u52A8\u6539\u540D\u540E\u4E0D\u518D\u81EA\u52A8\u8986\u76D6\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\", \"\u5BF9\u8BDD\u4E0D\u5B58\u5728\");\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.*\uFF08\u00A75.8\uFF09 ----\n const projectPath = async (projectId: string): Promise<string> => {\n const proj = await svc.projects.get(projectId);\n if (!proj) throw new ApiError(\"not_found\", \"\u9879\u76EE\u4E0D\u5B58\u5728\");\n if (!existsSync(proj.path)) throw new ApiError(\"bad_path\", \"\u9879\u76EE\u76EE\u5F55\u5DF2\u4E0D\u5B58\u5728\");\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.*\uFF08\u00A75.9\uFF09 ----\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.*\uFF08\u00A77.6\uFF09 ----\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\", \"\u9879\u76EE\u4E0D\u5B58\u5728\");\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\", \"\u9879\u76EE\u4E0D\u5B58\u5728\");\n const metas = [];\n for (const item of p.items) {\n const provider = getProvider(item.provider);\n if (!provider?.readHistory) continue;\n // \u5E42\u7B49\uFF1A\u540C providerSessionId \u5DF2\u5BFC\u5165\u5219\u590D\u7528\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.*\uFF08\u00A77.5\uFF09 ----\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 ?? \"\u7EC8\u7AEF\u4E0D\u5B58\u5728\");\n // attach \u5373\u8BA2\u9605 terminal:<index> \u9891\u9053\uFF08\u8F93\u5165\u5E27\u540C\u6837\u4EE5\u8BA2\u9605\u4E3A\u95E8\u69DB\uFF09\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.*\uFF08\u8FD0\u884C\u65F6\u64CD\u4F5C\uFF0C\u9700\u8981 manager\uFF09 ----\n const needManager = () => {\n if (!svc.manager) throw new ApiError(\"unavailable\", \"\u4F1A\u8BDD\u7BA1\u7406\u5668\u672A\u542F\u52A8\");\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 await needManager().send(p.id, { text: p.text, attachments: p.attachments }, p.behavior ?? \"queue\");\n return { ok: true };\n }\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\uFF08P2-7\uFF09\uFF1A\u6301\u4E45\u5316\u4E8B\u4EF6 \u2192 Markdown \u6587\u672C ----\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\", \"\u5BF9\u8BDD\u4E0D\u5B58\u5728\");\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} \u00B7 ${meta.model ?? \"\u9ED8\u8BA4\"} \u00B7 ${meta.mode} \u00B7 ${new Date(meta.createdAt).toLocaleString(\"zh-CN\")}`, \"\");\n for (const e of events) {\n switch (e.type) {\n case \"user_message\": L.push(`**\u6211**${e.steered ? \"\uFF08\u63D2\u8BDD\uFF09\" : \"\"}\uFF1A\\n\\n${e.text}`, \"\"); break;\n case \"assistant_message\": L.push(e.text, \"\"); break;\n case \"reasoning\": L.push(`<details><summary>\u601D\u8003</summary>\\n\\n${e.text}\\n</details>`, \"\"); break;\n case \"tool_call\": {\n const icon = e.status === \"ok\" ? \"\u2713\" : e.status === \"failed\" ? \"\u2717\" : \"\u2026\";\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(\"### \u8BA1\u5212\\n\\n\" + e.markdown, \"\"); break;\n case \"todo\": L.push(\"### \u5F85\u529E\\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(`\u2014 ${e.status}${e.durationMs ? ` \u00B7 ${Math.round(e.durationMs / 1000)}s` : \"\"}${e.error ? ` \u00B7 ${e.error}` : \"\"} \u2014`, \"\"); 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 const dir = join(homedir(), \"Downloads\");\n await mkdir(dir, { recursive: true });\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,\" + filePath], { windowsHide: true }, () => {});\n return;\n }\n if (process.platform === \"darwin\") {\n execFile(\"open\", [\"-R\", filePath], () => {});\n return;\n }\n execFile(\"xdg-open\", [dirname(filePath)], () => {});\n}\n", "// \u539F\u5B50\u5199 JSON\uFF1A\u4E34\u65F6\u6587\u4EF6 + rename\u3002fs \u5931\u8D25\u65F6\u629B\u4E2D\u6587 ApiError\uFF08P5-2\uFF1A\u78C1\u76D8\u5199\u5931\u8D25\u63D0\u793A\uFF09\u3002\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\", `\u5199\u5165\u6570\u636E\u5931\u8D25\uFF08${file}\uFF09\uFF1A${(e as Error)?.message ?? e}`);\n }\n}\n", "// JSONL \u8BFB\u5199\uFF1A\u4E32\u884C\u8FFD\u52A0\u3001\u635F\u574F\u884C\u8DF3\u8FC7\u3002\u5199\u5931\u8D25\u65F6\u629B\u4E2D\u6587 ApiError\uFF08P5-2\uFF1A\u78C1\u76D8\u5199\u5931\u8D25\u63D0\u793A\uFF09\u3002\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 // \u635F\u574F\u884C\u8DF3\u8FC7\n }\n }\n return out;\n}\n\n// \u6BCF\u4E2A\u6587\u4EF6\u4E00\u6761\u4E32\u884C\u5199\u961F\u5217\uFF0C\u4FDD\u8BC1\u8FFD\u52A0\u987A\u5E8F\u3002\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\", `\u5199\u5165\u6570\u636E\u5931\u8D25\uFF08${file}\uFF09\uFF1A${(e as Error)?.message ?? e}`);\n }\n });\n writers.set(\n file,\n next.catch(() => {})\n );\n return next;\n}\n\n// \u6574\u4F53\u91CD\u5199\uFF08\u5C11\u89C1\u8DEF\u5F84\uFF1A\u5982\u6E05\u7406\uFF09\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\", `\u5199\u5165\u6570\u636E\u5931\u8D25\uFF08${file}\uFF09\uFF1A${(e as Error)?.message ?? e}`);\n }\n}\n", "// \u65E7\u6570\u636E\u8FC1\u79FB\uFF08\u00A710.1\uFF09\uFF1Adaemon \u542F\u52A8\u65F6\u6267\u884C\u4E00\u6B21\u3002\n// \u65E7\uFF1Asessions/<id>/{meta.json,events.jsonl} + settings.json \u91CC\u7684 projects \u2192\n// \u65B0\uFF1Aprojects.json + threads/<id>/{meta.json,timeline.jsonl}\u3002\u65E7\u6587\u4EF6\u53EA\u8BFB\u3001\u590D\u5236\u5907\u4EFD\u5230 trash/legacy-<ts>/\u3002\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. \u5907\u4EFD\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 // \u8BFB\u65E7 settings\uFF08\u76F4\u63A5\u8BFB\u6587\u4EF6\uFF1BSettingsStore \u5DF2\u52A0\u8F7D\u540C\u4E00\u8DEF\u5F84\uFF0C\u5B57\u6BB5\u5E76\u5B58\u4E0D\u51B2\u7A81\uFF09\n const oldSettings = existsSync(oldSettingsPath)\n ? (JSON.parse(await readFile(oldSettingsPath, \"utf8\").catch(() => \"{}\")) as Record<string, unknown>)\n : {};\n\n // 2. \u9879\u76EE\uFF1A\u65E7 settings.projects \u2192 projects.json\uFF1B\u5B64\u513F cwd \u6309 adoptOrphans \u89C4\u5219\u8865\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\", \"\u8FC1\u79FB\uFF1A\u5EFA\u9879\u76EE\u5931\u8D25\", { path: p.path, err: String(e) });\n }\n }\n\n // \u65E7\u4F1A\u8BDD\u6E05\u5355\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 // \u5B64\u513F cwd \u2192 \u8865\u9879\u76EE\uFF08\u5B50\u76EE\u5F55\u5E76\u5165\u4E0A\u7EA7\u89C4\u5219\uFF09\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; // \u76EE\u5F55\u5DF2\u4E0D\u5B58\u5728\u7684\u8DF3\u8FC7\uFF08\u4E0E\u65E7 adoptOrphans \u4E00\u81F4\uFF09\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\", \"\u8FC1\u79FB\uFF1A\u8865\u5EFA\u5B64\u513F\u9879\u76EE\u5931\u8D25\", { path: d, err: String(e) });\n }\n }\n\n const projectOf = (cwd: string): string | null => {\n const l = lc(cwd);\n // \u53D6\u6700\u957F\u5339\u914D\uFF08\u5B50\u76EE\u5F55\u5E76\u5165\u6700\u8D34\u5207\u7684\u9879\u76EE\uFF09\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. \u4F1A\u8BDD\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\", \"\u8FC1\u79FB\uFF1A\u65E0\u9879\u76EE\u53EF\u5F52\uFF0C\u8DF3\u8FC7\", { id: m.id, cwd: m.cwd }); continue; }\n const testTitle = SKIP_TITLE.test(m.title ?? \"\") || m.title === \"\u9ED8\u8BA4\u5267\u672C\u6F14\u793A\";\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 || \"\u65E7\u5BF9\u8BDD\",\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 // \u4E8B\u4EF6\u6620\u5C04\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 ?? \"\u5DE5\u5177\"), input: e.input, detail: e.detail });\n push({ type: \"tool_call\", itemId: key, kind: \"other\", title: String(e.title ?? \"\u5DE5\u5177\"), 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 ?? \"\u5DE5\u5177\",\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: `\u5DF2\u62D2\u7EDD\uFF1A${String(e.title ?? e.kind ?? \"\")}` }); break;\n case \"permission.request\": case \"permission.resolved\": break; // \u65E7\u6388\u6743\u5361\u8FC7\u671F\uFF0C\u4E0D\u91CD\u5EFA\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 // \u672A\u5173\u95ED\u7684 tool.call \u8865 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\", \"\u8FC1\u79FB\uFF1A\u4F1A\u8BDD\u5931\u8D25\", { id: m.id, err: String(e) });\n }\n }\n\n // 4. \u8BBE\u7F6E\u5408\u5E76\uFF08\u53EA\u5E26 UI \u504F\u597D\u5B57\u6BB5\uFF09\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\", `\u65E7\u6570\u636E\u8FC1\u79FB\u5B8C\u6210\uFF1A${migrated} \u4E2A\u4F1A\u8BDD\u3001${projectIdByPath.size} \u4E2A\u9879\u76EE\uFF0C\u5907\u4EFD\u5728 ${backup}`);\n return { migrated, skipped: false };\n}\n", "// \u542F\u52A8\u9884\u70ED\uFF1A\u5DF2\u542F\u7528\u3001\u975E planned \u7684 Provider \u5148\u68C0\u6D4B\u518D\u62C9\u6A21\u578B\uFF0C\u7ED3\u679C\u8FDB infoCache\u3002\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 \u5165\u53E3\uFF1A\u89E3\u6790\u53C2\u6570\u3001\u521D\u59CB\u5316\u670D\u52A1\u3001\u542F\u52A8 HTTP+WS\u3001\u5199 daemon.json\u3001\u5904\u7406\u9000\u51FA\u3002\nimport { mkdirSync, existsSync, rmSync } 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\";\n\nconst cfg = parseConfig(process.argv.slice(2));\n\n// \u9876\u5C42\u515C\u5E95\uFF1A\u8BB0\u65E5\u5FD7\u4E0D\u9000\u51FA\nprocess.on(\"uncaughtException\", (e) => {\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 // \u65E7\u6570\u636E\u8FC1\u79FB\uFF08\u00A710.1\uFF09\uFF1A\u8DD1\u4E00\u6B21\uFF0Cv1Migrated \u540E\u8DF3\u8FC7\uFF1B\u65E7\u6587\u4EF6\u53EA\u8BFB\n const { migrateLegacy } = await import(\"./migrate/legacy.js\");\n try {\n await migrateLegacy(cfg.dataDir, { settings, projects, threads });\n } catch (e) {\n log(\"error\", \"\u65E7\u6570\u636E\u8FC1\u79FB\u5931\u8D25\", { 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 // \u7AEF\u53E3\u88AB\u5360\u7528\u91CD\u8BD5 5 \u6B21\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\", `\u7AEF\u53E3 ${cfg.port} \u88AB\u5360\u7528\uFF0C500ms \u540E\u91CD\u8BD5\uFF08\u7B2C ${attempts} \u6B21\uFF09`);\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\", `\u7AEF\u53E3 ${cfg.port} \u65E0\u6CD5\u76D1\u542C`, { err: String(e) });\n process.exit(2);\n });\n\n // \u540E\u53F0\u9884\u70ED\uFF1A\u542F\u52A8\u540E\u5148\u628A\u5DF2\u542F\u7528 Provider \u7684\u68C0\u6D4B/\u6A21\u578B\u62C9\u8FDB\u7F13\u5B58\uFF0C\u9875\u9762\u7B2C\u4E00\u6B21\u6253\u5F00\u5C31\u4E0D\u7528\u7B49\n void (async () => {\n const { warmProviderCache } = await import(\"./providers/warm.js\");\n await warmProviderCache(await settings.get());\n })().catch((e) => log(\"warn\", \"Provider \u9884\u70ED\u5931\u8D25\", { 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 log(\"info\", `daemon \u5DF2\u542F\u52A8 \u7AEF\u53E3 ${cfg.port} \u6570\u636E\u76EE\u5F55 ${cfg.dataDir} \u7248\u672C ${cfg.version} pid ${process.pid}`);\n\n // \u7A7A\u95F2\u9000\u51FA\uFF1A\u6BCF\u5206\u949F\u68C0\u67E5\uFF1B\u65E0 WS \u8FDE\u63A5 + \u65E0 running \u5BF9\u8BDD + \u65E0\u6253\u5F00\u7EC8\u7AEF \u2192 \u6301\u7EED idleExitMinutes \u540E\u9000\u51FA\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\", \"\u7A7A\u95F2\u8D85\u65F6\uFF0Cdaemon \u9000\u51FA\");\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 \u5173\u95ED\u4E2D\");\n terminals.killAll();\n manager.shutdown();\n gateway.closeAll();\n try {\n rmSync(daemonJsonPath, { force: true });\n } catch {}\n server.close(() => process.exit(code));\n setTimeout(() => process.exit(code), 3000).unref();\n }\n process.on(\"SIGINT\", () => shutdown(0));\n process.on(\"SIGTERM\", () => shutdown(0));\n}\n\nmain().catch((e) => {\n console.error(\"[agent-console] \u542F\u52A8\u5931\u8D25\", e);\n process.exit(1);\n});\n", "// \u53C2\u6570\u4E0E\u73AF\u5883\uFF1Aport\u3001dataDir\u3001token\u3001version\u3001idleExitMinutes\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};\n\nfunction pkgVersion(): string {\n try {\n const here = dirname(fileURLToPath(import.meta.url));\n // dist/main.js \u2192 ../../package.json\uFF1Bsrc/main.ts \u7ECF esbuild \u4E5F\u5230 dist\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> \u6307\u5B9A\u6570\u636E\u6839\u76EE\u5F55\uFF08\u7B49\u4EF7\u4E8E\u8BBE\u7F6E XDG_CONFIG_HOME \u540E\u518D\u62FC magpie/agent-console\uFF1F\n// EXEC \u00A75.2: --data <dir>\uFF08\u6570\u636E\u6839\u76EE\u5F55\uFF0C\u7B49\u4EF7\u4E8E\u8BBE\u7F6E XDG_CONFIG_HOME\uFF1B\u9ED8\u8BA4 $XDG_CONFIG_HOME\n// \u6216 ~/.config\uFF0C\u518D\u62FC magpie/agent-console\uFF09\u3002\u5373 --data \u503C\u89C6\u4F5C XDG_CONFIG_HOME \u8BED\u4E49\u3002\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 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 }\n if (port == null || !Number.isInteger(port) || port < 1 || port > 65535) {\n const envPort = Number(process.env.AGENT_CONSOLE_PORT || \"\");\n port = Number.isInteger(envPort) && envPort >= 1 && 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 };\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 \u5355\u6587\u4EF6 bundle\uFF1A\u6574\u5305\u5C31\u662F 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 \u2192 daemon/dist/main.js\uFF08vitest/tsc\uFF09\n join(here, \"main.js\"), // \u5DF2\u5728 dist \u76EE\u5F55\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/** daemon/dist/main.js \u7684 mtime\uFF0C\u7528\u4E8E\u63D2\u4EF6\u68C0\u6D4B\u4EE3\u7801\u66F4\u65B0\u5E76\u91CD\u542F\u8FDB\u7A0B */\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 \u8DEF\u7531\uFF1A/ \u2192 app/index.html\uFF08\u6CE8\u5165\u4EE4\u724C\uFF09\u3001\u9759\u6001\u8D44\u6E90\u3001/api/ping\u3001/api/upload\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, checkOrigin, tokenEqual } from \"./security.js\";\nimport type { Config } from \"./config.js\";\nimport type { AttachmentStore } from \"./store/attachments.js\";\nimport { log } from \"./log.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; // \u666E\u901A\u6D88\u606F 200KB\n\nexport type HttpHooks = {\n onUpgrade?: (req: IncomingMessage, socket: import(\"node:net\").Socket, head: Buffer) => void;\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\nfunction preflightHeaders(origin: string | undefined): Record<string, string> {\n return {\n \"access-control-allow-origin\": origin && origin !== \"null\" ? origin : \"null\",\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 };\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 \u5904\u7406\u5F02\u5E38\", { url: req.url, err: String(e) });\n if (!res.headersSent) sendJson(res, 500, { ok: false, e: { code: \"internal\", message: \"\u670D\u52A1\u5185\u90E8\u9519\u8BEF\" } });\n else res.end();\n }\n });\n\n async function route(req: IncomingMessage, res: ServerResponse): Promise<void> {\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 originCheck = checkOrigin(req.headers.origin, cfg.port);\n if (!originCheck.ok) {\n sendJson(res, originCheck.code, { ok: false, e: { code: \"bad_origin\", message: originCheck.message } });\n return;\n }\n\n const url = new URL(req.url ?? \"/\", `http://127.0.0.1:${cfg.port}`);\n const pathname = url.pathname;\n\n // sandbox iframe\uFF08\u65E0 allow-same-origin\uFF09\u91CC\u9875\u9762\u6765\u6E90\u662F null\uFF0C\u540C\u5730\u5740 fetch \u4E5F\u7B97\u8DE8\u57DF\uFF1A\n // \u6B63\u5F0F\u54CD\u5E94\u4E5F\u5FC5\u987B\u5E26 allow-origin\uFF0C\u5426\u5219\u9884\u68C0\u8FC7\u4E86\u3001\u7ED3\u679C\u4ECD\u88AB\u6D4F\u89C8\u5668\u62E6\u6389\uFF08\u4E0A\u4F20\u5931\u8D25\uFF09\n if (req.headers.origin) {\n res.setHeader(\"access-control-allow-origin\", preflightHeaders(req.headers.origin)[\"access-control-allow-origin\"]);\n res.setHeader(\"vary\", \"origin\");\n }\n\n // OPTIONS \u9884\u68C0\uFF1A\u53EA\u5BF9\u5408\u6CD5 origin \u653E\u884C\uFF08token \u6821\u9A8C\u7559\u7ED9\u771F\u5B9E\u8BF7\u6C42\uFF0C\u89C1 R3-6 \u4FEE\u590D\u7ECF\u9A8C\uFF09\n if (req.method === \"OPTIONS\") {\n send(res, 204, \"\", preflightHeaders(req.headers.origin));\n return;\n }\n\n // API\uFF1A\u9700\u8981 x-agent-console \u5934\uFF08\u503C = \u4EE4\u724C\uFF09\n if (pathname.startsWith(\"/api/\")) {\n const tok = req.headers[\"x-agent-console\"];\n if (typeof tok !== \"string\" || !tokenEqual(tok, cfg.token)) {\n sendJson(res, 403, { ok: false, e: { code: \"bad_token\", message: \"\u4EE4\u724C\u65E0\u6548\" } });\n return;\n }\n await routeApi(req, res, pathname, url);\n return;\n }\n\n // \u9644\u4EF6\uFF08\u524D\u7AEF <img> \u76F4\u63A5\u5F15\u7528\u9700\u8981\u4EE4\u724C\u5728 query \u4E0A\uFF1F\u6539\u4E3A\u524D\u7AEF fetch+blob\u3002\u8FD9\u91CC\u4ECD\u63D0\u4F9B\u5E26\u4EE4\u724C\u5934\u7684 GET\u3002\uFF09\n if (pathname.startsWith(\"/attachments/\")) {\n const tok = req.headers[\"x-agent-console\"];\n const tokQ = url.searchParams.get(\"t\");\n const okTok = (typeof tok === \"string\" && tokenEqual(tok, cfg.token)) || (tokQ && tokenEqual(tokQ, cfg.token));\n if (!okTok) {\n sendJson(res, 403, { ok: false, e: { code: \"bad_token\", message: \"\u4EE4\u724C\u65E0\u6548\" } });\n return;\n }\n const id = decodeURIComponent(pathname.slice(\"/attachments/\".length));\n const a = await attachments.get(id);\n if (!a) {\n sendJson(res, 404, { ok: false, e: { code: \"not_found\", message: \"\u9644\u4EF6\u4E0D\u5B58\u5728\" } });\n return;\n }\n const data = await attachments.read(id);\n send(res, 200, data ?? Buffer.alloc(0), { \"content-type\": a.mime, \"cache-control\": \"no-store\" });\n return;\n }\n\n // \u9759\u6001\u8D44\u6E90\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n sendJson(res, 405, { ok: false, e: { code: \"method\", message: \"\u65B9\u6CD5\u4E0D\u5141\u8BB8\" } });\n return;\n }\n if (pathname === \"/\" || pathname === \"/index.html\") {\n const htmlPath = join(appDir, \"index.html\");\n try {\n let html = await readFile(htmlPath, \"utf8\");\n html = html.replace(\"__TOKEN__\", cfg.token);\n send(res, 200, html, { \"content-type\": \"text/html; charset=utf-8\", \"cache-control\": \"no-store\" });\n } catch {\n send(res, 503, \"app \u8FD8\u6CA1\u6784\u5EFA\uFF08\u7F3A app/index.html\uFF09\", { \"content-type\": \"text/plain; charset=utf-8\" });\n }\n return;\n }\n // \u5176\u5B83\u9759\u6001\u6587\u4EF6\u5FC5\u987B\u5728 app/ \u76EE\u5F55\u5185\n const rel = normalize(decodeURIComponent(pathname)).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: \"\u8DEF\u5F84\u4E0D\u5141\u8BB8\" } });\n return;\n }\n if (!existsSync(full) || !(await stat(full)).isFile()) {\n sendJson(res, 404, { ok: false, e: { code: \"not_found\", message: \"\u6587\u4EF6\u4E0D\u5B58\u5728\" } });\n return;\n }\n const data = await readFile(full);\n send(res, 200, data, { \"content-type\": MIME[extname(full).toLowerCase()] ?? \"application/octet-stream\", \"cache-control\": \"no-store\" });\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: \"\u4E0D\u652F\u6301\u7684\u6587\u4EF6\u7C7B\u578B\" } });\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 sendJson(res, 413, { ok: false, e: { code: \"too_large\", message: \"\u6587\u4EF6\u592A\u5927\uFF08\u4E0A\u9650 50MB\uFF09\" } });\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: \"\u63A5\u53E3\u4E0D\u5B58\u5728\" } });\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 / \u4EE4\u724C\u6821\u9A8C\uFF08timingSafeEqual\uFF09\u3002\nimport { timingSafeEqual, createHash } from \"node:crypto\";\n\nexport type CheckResult = { ok: true } | { ok: false; code: number; message: string };\n\n// Host \u5FC5\u987B 127.0.0.1:<port> \u6216 localhost:<port>\uFF08\u53EF\u5E26 ipv6 loopback \u5F62\u5F0F [::1] \u4E0D\u653E\u884C\uFF0C\u6309\u9700\u6C42\u6587\u6863\uFF09\u3002\nexport function checkHost(host: string | undefined, port: number): CheckResult {\n if (!host) return { ok: false, code: 421, message: \"Host \u4E0D\u5BF9\" };\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 \u4E0D\u5BF9\" };\n}\n\n// Origin\uFF1A\u5FC5\u987B\u653E\u884C null\uFF08Magpie \u6C99\u7BB1 opaque origin\uFF09\uFF1B\u81EA\u8EAB origin \u653E\u884C\uFF1B\u65E0 Origin\uFF08WS \u5BA2\u6237\u7AEF/\u540C\u6E90 fetch \u4E0D\u5E26\uFF09\u653E\u884C\uFF1B\u5176\u5B83\u62D2\u7EDD\u3002\nexport function checkOrigin(origin: string | undefined, port: number): CheckResult {\n if (origin === undefined || origin === \"null\" || origin === \"\") return { ok: true };\n const o = origin.toLowerCase();\n if (o === `http://127.0.0.1:${port}` || o === `http://localhost:${port}`) return { ok: true };\n return { ok: false, code: 403, message: \"\u6765\u6E90\u4E0D\u5141\u8BB8\" };\n}\n\nexport function tokenEqual(a: string, b: string): boolean {\n // \u5B9A\u957F\u6BD4\u8F83\u9632\u65F6\u5E8F\uFF1B\u957F\u5EA6\u4E0D\u540C\u5148\u54C8\u5E0C\u5230\u540C\u957F\u3002\n const ha = createHash(\"sha256\").update(a).digest();\n const hb = createHash(\"sha256\").update(b).digest();\n return timingSafeEqual(ha, hb);\n}\n", "// \u9644\u4EF6\uFF1A\u4E0A\u4F20\u6587\u4EF6\u843D\u76D8\u3001\u6309 id \u53D6\u8DEF\u5F84\u3002\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\nexport class AttachmentStore {\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(\"\u4E0D\u652F\u6301\u7684\u6587\u4EF6\u7C7B\u578B\");\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 const mime = MIME[ext] ?? \"text/plain\";\n return { id, name: name || \"\u672A\u547D\u540D\" + 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 { readdir } = await import(\"node:fs/promises\");\n try {\n for (const f of await readdir(this.dir)) {\n if (f.startsWith(id + \".\")) {\n const p = join(this.dir, f);\n const s = await stat(p);\n const ext = extname(f).toLowerCase();\n return { id, name: f.slice(id.length + 1) || f, mime: MIME[ext] ?? \"text/plain\", size: s.size, path: p };\n }\n }\n } catch {}\n return null;\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", "// settings.json\uFF1A\u9ED8\u8BA4\u503C\u89C1 EXEC \u00A75.6\uFF1B\u8BFB\u53D6\u65F6\u4FDD\u7559\u4E0D\u8BA4\u8BC6\u7684\u5B57\u6BB5\u3002\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { writeJsonAtomic } from \"../util/atomic.js\";\n\nexport type Settings = {\n defaultProvider: string;\n defaultMode: \"plan\" | \"default\" | \"acceptEdits\" | \"bypassPermissions\" | \"ask\";\n defaultEffort: string | null;\n sendKey: \"enter\" | \"ctrlEnter\";\n runningSend: \"queue\" | \"steer\";\n showThinking: boolean;\n density: \"comfortable\" | \"compact\";\n theme: \"auto\" | \"light\" | \"dark\";\n idleCloseMinutes: number;\n idleExitMinutes: 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 = \u7528\u6237\u5728\u8BBE\u7F6E\u91CC\u5173\u95ED\uFF1B\u7F3A\u7701\u89C6\u4E3A\u5F00\u542F */\n providerEnabled?: Record<string, boolean>;\n /** \u9AD8\u7EA7\uFF1A\u8986\u76D6 Provider \u542F\u52A8\uFF08executable + args \u6570\u7EC4\uFF0C\u4E0D\u8D70 shell\uFF09 */\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 defaultEffort: null,\n sendKey: \"enter\",\n runningSend: \"queue\",\n showThinking: true,\n density: \"comfortable\",\n theme: \"auto\",\n idleCloseMinutes: 30,\n idleExitMinutes: 60,\n collapsedProjects: [],\n panel: { open: false, tab: \"changes\", width: 440 },\n sidebarWidth: 248,\n lastProjectId: null,\n lastThreadId: null,\n recentDirs: [],\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 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", "// 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\", \"\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A\");\n if (!existsSync(path) || !statSync(path).isDirectory()) {\n throw new ApiError(\"bad_path\", \"\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u4E0D\u662F\u6587\u4EF6\u5939\");\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\", \"\u9879\u76EE\u4E0D\u5B58\u5728\");\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\uFF1A\u5217\u8868\u3001\u8BFB\u53D6\u3001\u8FFD\u52A0\u3001\u5220\u9664\uFF08\u79FB trash\uFF09\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\uFF1A\u95EA\u7535 Fast \u6A21\u5F0F\uFF08\u6A21\u578B\u53C2\u6570 fast=true\uFF09 */\n cursorFast?: boolean;\n /** Cursor Agent\uFF1AAuto-review\uFF0C\u5BA2\u6237\u7AEF\u81EA\u52A8\u653E\u884C\u5B89\u5168\u5DE5\u5177\u6388\u6743 */\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 // meta \u5199\u4E32\u884C\u5316\uFF1A\u5E76\u53D1 patch/appendEvent \u4E92\u76F8\u8986\u76D6\uFF08manager \u91CC setStatus/patch/provider_session_id \u4F1A\u5E76\u53D1\u8DD1\uFF09\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\", `\u521B\u5EFA\u5BF9\u8BDD\u76EE\u5F55\u5931\u8D25\uFF1A${(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\", \"\u5BF9\u8BDD\u4E0D\u5B58\u5728\");\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 // \u4E8B\u4EF6\u8FFD\u52A0\uFF1A\u5728\u4E32\u884C\u533A\u5185\u53D6 meta.seq+1 \u4F5C\u4E3A seq\uFF0C\u843D\u76D8 jsonl + \u66F4\u65B0 meta\u3002\n // \u4F20\u5165\u7684 seq \u88AB\u5FFD\u7565\uFF08\u4FDD\u8BC1\u5355\u8C03\u9012\u589E\uFF09\uFF1Bts/threadId \u7F3A\u7701\u65F6\u81EA\u52A8\u8865\u3002\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\", \"\u5BF9\u8BDD\u4E0D\u5B58\u5728\");\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\uFF1A\u521A\u5173\u6389\u7684 Agent \u8FDB\u7A0B / \u6587\u4EF6\u53E5\u67C4\u53EF\u80FD\u8FD8\u6CA1\u91CA\u653E\uFF0C\u76EE\u5F55\u91CD\u547D\u540D\u4F1A\u77ED\u6682\u62A5 EPERM/EBUSY \u2192 \u9000\u907F\u91CD\u8BD5\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\", \"\u79FB\u5165\u56DE\u6536\u76EE\u5F55\u5931\u8D25\uFF1A\" + String(e));\n }\n }\n this.metas.delete(id);\n }\n}\n", "// WS \u7F51\u5173\uFF1Ahello \u9274\u6743\u3001req \u5206\u53D1\u3001\u8BA2\u9605\u3001\u5FC3\u8DF3\u3001\u4E8C\u8FDB\u5236\u7EC8\u7AEF\u5E27\u3001\u5E7F\u64AD\u3002\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, checkOrigin, 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\", `\u8FDE\u63A5 ${this.id} \u51FA\u7AD9\u7F13\u51B2\u8D85 8MB\uFF0C\u65AD\u5F00`);\n this.ws.close(4000, \"buffer_overflow\");\n return;\n }\n this.ws.send(s);\n } catch {}\n }\n // \u770B socket \u91CC\u771F\u6B63\u8FD8\u6CA1\u53D1\u51FA\u53BB\u7684\u5B57\u8282\uFF08\u5BA2\u6237\u7AEF\u5361\u4F4F\u624D\u4F1A\u6DA8\uFF09\uFF0C\u800C\u4E0D\u662F\u7D2F\u8BA1\u53D1\u9001\u91CF\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\", `\u8FDE\u63A5 ${this.id} \u51FA\u7AD9\u7F13\u51B2\u8D85 8MB\uFF0C\u65AD\u5F00`);\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 const originCheck = checkOrigin(req.headers.origin, this.cfg.port);\n if (!originCheck.ok) {\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 // \u9996\u5E27 5 \u79D2\u5185\u5FC5\u987B\u662F hello\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: \"\u6D88\u606F\u4E0D\u662F\u5408\u6CD5 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: \"\u4EE4\u724C\u65E0\u6548\" } });\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: \"\u672A\u9274\u6743\" } });\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: `\u672A\u77E5\u65B9\u6CD5 ${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 ?? \"\u670D\u52A1\u5185\u90E8\u9519\u8BEF\" },\n });\n }\n }\n\n // \u7EC8\u7AEF\u4E8C\u8FDB\u5236\u5E27\uFF1A[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\uFF08\u00A75.7\uFF09\uFF1A\u5BF9\u8BDD\u8FD0\u884C\u65F6\u3001\u53D1\u9001/\u6392\u961F/\u63D2\u8BDD/\u6253\u65AD/\u6388\u6743\u3001\u7A7A\u95F2\u56DE\u6536\u3001\u91CD\u542F\u6062\u590D\u3002\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 { 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\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>; // \u5DF2\u5199 turn_ended \u7684\u8F6E\u6B21\uFF08\u53BB\u91CD\uFF09\n starting: boolean; // startTurn \u8FDB\u884C\u4E2D\uFF08\u5EFA session \u671F\u95F4 session \u4ECD\u4E3A null\uFF09\n commands: SlashCommand[];\n sessionCreating: Promise<ProviderSession> | null;\n};\n\ntype DeltaType = \"assistant_delta\" | \"reasoning_delta\" | \"tool_output_delta\";\nconst DELTA_TYPES: DeltaType[] = [\"assistant_delta\", \"reasoning_delta\", \"tool_output_delta\"];\n// coalescer \u7684 key = \u7C7B\u578B + \\u0000 + itemId\uFF0C\u4E09\u79CD delta \u5404\u81EA\u5408\u5E76\u3001\u6309\u539F\u7C7B\u578B\u63A8\u9001\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 /** \u524D\u7AEF thread.send \u7684 attachment.path \u5B9E\u9645\u662F\u4E0A\u4F20 id\uFF0C\u9700\u89E3\u6790\u5230 dataDir/attachments \u4E0B\u7684\u6587\u4EF6 */\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 // \u542F\u52A8\u65F6\u8C03\u7528\uFF1A\u6062\u590D running/initializing \u7684\u5BF9\u8BDD\u4E3A closed\uFF08\u00A75.7.6\uFF09\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 // \u6700\u540E\u4E00\u4E2A turn_started \u4E4B\u540E\u6CA1\u6709 turn_ended \u2192 \u8865 interrupted\n // \uFF08\u4E0D\u80FD\u770B lastTurnStatus\uFF1A\u5B83\u8BB0\u7684\u662F\u4E0A\u4E00\u8F6E\uFF0C\u4E0D\u662F\u6B63\u5728\u8DD1\u7684\u8FD9\u4E00\u8F6E\uFF09\n // user_message \u5148\u4E8E turn_started \u843D\u76D8\uFF0Cprovider \u6CA1\u6765\u5F97\u53CA\u53D1 turn_started \u4E5F\u7B97\u672A\u7ED3\u675F\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 // \u672A resolved \u7684\u6388\u6743\u5168\u90E8 cancel\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 // \u6BCF\u5206\u949F\u7A7A\u95F2\u56DE\u6536\n this.recycleTimer = setInterval(() => void this.recycleIdle(), 60_000);\n this.recycleTimer.unref?.();\n }\n\n shutdown(): void {\n if (this.recycleTimer) clearInterval(this.recycleTimer);\n for (const rt of this.runtimes.values()) void rt.session?.close().catch(() => {});\n this.runtimes.clear();\n }\n\n // \u7A7A\u95F2\u9000\u51FA\u5224\u5B9A\uFF08\u00A75.2.7\uFF09\uFF1A\u4EFB\u4E00 runtime \u975E idle \u5373\u5FD9\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 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 };\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 // ---- \u53D1\u9001 ----\n async send(threadId: string, input: { text: string; attachments?: { path: string; mime: string; name?: string }[] }, behavior: SendBehavior = \"queue\"): Promise<void> {\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 // \u5DF2\u5173\u95ED\uFF08\u5D29\u6E83/\u56DE\u6536/\u91CD\u542F\u6062\u590D\uFF09\u2192 \u4E22\u6389\u65E7 session\uFF0C\u4E0B\u4E00\u6761\u6D88\u606F\u6309 providerSessionId \u7EED\u63A5\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;\n } catch (e) {\n // \u63D2\u8BDD\u4E0D\u6210\uFF08\u8F6E\u6B21\u8FD8\u6CA1\u771F\u6B63\u5F00\u59CB\u7B49\uFF09\u2192 \u9000\u56DE\u6392\u961F\uFF0C\u6D88\u606F\u4E0D\u4E22\n log(\"info\", `thread ${threadId} \u63D2\u8BDD\u5931\u8D25\uFF0C\u6539\u4E3A\u6392\u961F\uFF1A${String(e)}`);\n }\n }\n const q: QueuedMessage = { id: \"q\" + Date.now().toString(36), text: input.text, attachments: attachmentRefs };\n rt.queue.push(q);\n this.gw.publish(`thread:${threadId}`, { type: \"queue\", queue: rt.queue });\n return;\n }\n\n await this.startTurn(threadId, input.text, attachmentRefs);\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 // \u5DF2\u7ECF\u804A\u8FC7\u7684\u5BF9\u8BDD\uFF08\u6709 providerSessionId\uFF09\u4E0D\u53D7\u300C\u7981\u7528\u300D\u5F71\u54CD\uFF1A\u7981\u7528\u53EA\u62E6\u65B0\u5BF9\u8BDD\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 // \u81EA\u52A8\u6807\u9898\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 // send \u5931\u8D25\u4E0D\u80FD\u628A\u5BF9\u8BDD\u7559\u5728 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 // ---- \u4E8B\u4EF6\u6CF5 ----\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; // \u65B0\u4E00\u8F6E\u5F00\u59CB\uFF0C\u590D\u4F4D\uFF08\u6392\u961F\u6D88\u606F\u590D\u7528\u540C\u4E00 session \u4E8B\u4EF6\u6D41\uFF09\n if (ev.type === \"turn_ended\") ended = true;\n }\n } catch (e) {\n log(\"warn\", `thread ${threadId} \u4E8B\u4EF6\u6D41\u5F02\u5E38\uFF1A${String(e)}`);\n }\n if (!ended && this.rt(threadId).session === session) {\n // \u4F1A\u8BDD\u610F\u5916\u9000\u51FA\uFF1A\u8865 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 // \u8D70 coalescer\uFF0C\u4E0D\u6301\u4E45\u5316\n rt.coalescer.push(deltaKey(ev.type, ev.itemId), ev.text);\n return;\n }\n // \u540C itemId \u7684\u5B8C\u6574\u4E8B\u4EF6\u843D\u76D8\u524D\uFF0C\u5148\u628A\u5B83\u672A\u53D1\u5B8C\u7684 delta \u63A8\u51FA\u53BB\uFF08\u4FDD\u8BC1\u987A\u5E8F\uFF09\n const evItemId = (ev as { itemId?: unknown }).itemId;\n if (typeof evItemId === \"string\") this.flushDeltas(rt, evItemId);\n if (ev.type === \"assistant_message\" || ev.type === \"reasoning\") {\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); // \u63A8\u9001\u4F46\u4E0D\u843D\u76D8\u4E5F\u884C\uFF1B\u9009\u62E9\u843D\u76D8\u4FBF\u4E8E\u56DE\u770B\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 \u547D\u4E2D \u2192 \u76F4\u63A5\u7B54\u5E94\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 // manager \u5DF2\u7ECF\u66FF\u5B83\u843D\u8FC7\u76D8\uFF08respond / interrupt\uFF09\u2192 provider \u7684\u56DE\u58F0\u4E22\u5F03\uFF0C\u907F\u514D\u91CD\u590D\n if (!rt.pending.delete(ev.requestId)) return;\n await this.appendRaw(threadId, ev);\n return;\n }\n if (ev.type === \"turn_ended\") {\n // \u540C\u4E00\u8F6E\u53EA\u7ED3\u675F\u4E00\u6B21\uFF08\u6253\u65AD\u515C\u5E95\u5DF2\u8865\u8FC7\u3001provider \u53C8\u8FDF\u5230\u4E00\u6761\u65F6\u4E22\u5F03\uFF09\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 // \u5931\u8D25/\u5D29\u6389\u540E session \u5DF2\u6B7B\uFF08mock /exit\uFF09\u2192 \u6E05\u6389\n if (ev.status === \"failed\" && rt.session && !this.alive(rt.session)) rt.session = null;\n await this.setStatus(threadId, \"idle\");\n // \u6392\u961F\u7684\u4E0B\u4E00\u6761\n const next = rt.queue.shift();\n if (next) {\n this.gw.publish(`thread:${threadId}`, { type: \"queue\", queue: rt.queue });\n // \u6392\u961F\u6D88\u606F\u542F\u52A8\u5931\u8D25\u53EA\u8BB0\u5F55\uFF0C\u4E0D\u80FD\u628A\u4E8B\u4EF6\u6CF5\u6253\u65AD\uFF08startTurn \u5DF2\u843D notice/turn_ended\uFF09\n await this.startTurn(threadId, next.text, next.attachments).catch((e) => {\n log(\"warn\", `thread ${threadId} \u6392\u961F\u6D88\u606F\u542F\u52A8\u5931\u8D25\uFF1A${String(e)}`);\n });\n }\n return;\n }\n // \u5176\u5B83\u4E8B\u4EF6\u76F4\u63A5\u843D\u76D8+\u63A8\u9001\n await this.appendRaw(threadId, ev);\n }\n\n private alive(_s: ProviderSession): boolean {\n return true; // mock /exit \u5173\u95ED queue\uFF1B\u4E8B\u4EF6\u6D41\u7ED3\u675F\u5DF2\u5355\u72EC\u5904\u7406\n }\n\n // ---- respond\uFF08\u6388\u6743/\u63D0\u95EE\u56DE\u5E94\uFF09 ----\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\", \"\u6388\u6743/\u63D0\u95EE\u4E0D\u5B58\u5728\u6216\u5DF2\u56DE\u5E94\");\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\", `optionId \u975E\u6CD5\uFF1A${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 // \u4F5C\u5E9F\u5168\u90E8 pending\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 // 1 \u79D2\u5185\u6CA1\u6536\u5230 turn_ended \u2192 \u8865 interrupted\n // \u8D70\u6B63\u5E38 turn_ended \u8DEF\u5F84\uFF1A\u6E05 currentTurnId\u3001\u5199 lastTurnStatus\u3001\u7EE7\u7EED\u6392\u961F\u6D88\u606F\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} \u6253\u65AD\u515C\u5E95\u5931\u8D25\uFF1A${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\", \"\u4EC5 Cursor \u5BF9\u8BDD\u652F\u6301\u8BE5\u9009\u9879\");\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 /** \u4EC5\u5C1A\u65E0\u7528\u6237\u6D88\u606F\u3001\u4E14\u672A\u5728\u8DD1\u65F6\u53EF\u6362 Agent */\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\", \"\u5BF9\u8BDD\u4E0D\u5B58\u5728\");\n const rt = this.rt(threadId);\n if (rt.status === \"running\" || rt.status === \"initializing\" || rt.starting) {\n throw new ApiError(\"busy\", \"\u5BF9\u8BDD\u8FD0\u884C\u4E2D\uFF0C\u4E0D\u80FD\u66F4\u6362 Agent\");\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\", \"\u5DF2\u6709\u6D88\u606F\uFF0C\u4E0D\u80FD\u66F4\u6362 Agent\");\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: p.capabilities.modes.includes(meta.mode) ? meta.mode : (p.capabilities.modes[0] ?? \"default\"),\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 /** \u659C\u6760\u547D\u4EE4\uFF1A\u9ED8\u8BA4\u4E0D\u5EFA\u4F1A\u8BDD\uFF1Bload:true \u65F6\u624D\u4E3A\u9700\u4F1A\u8BDD\u7684 Provider \u5EFA\u4F1A\u8BDD\u62C9\u5217\u8868 */\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 // \u7A7A\u5217\u8868\u4E0D\u7F13\u5B58\uFF1A\u547D\u4EE4\u5F80\u5F80\u665A\u5230\uFF08\u5F02\u6B65\u63A8\u9001\uFF09\uFF0C\u7F13\u5B58\u7A7A\u7ED3\u679C\u4F1A\u8BA9\u83DC\u5355\u5728 TTL \u5185\u4E00\u76F4\u7A7A\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\", \"\u9879\u76EE\u4E0D\u5B58\u5728\");\n let model = meta.model;\n // DSH \u7684\u6A21\u578B ID \u6765\u81EA ACP\uFF0C\u65E7\u4F1A\u8BDD\u91CC\u53EF\u80FD\u6B8B\u7559\u5176\u5B83 Agent \u7684\u6A21\u578B ID\u3002\n // \u6E05\u6389\u8FD9\u4E2A\u5931\u6548\u503C\uFF0C\u907F\u514D\u5B83\u88AB\u53D1\u9001\u7ED9\u9519\u8BEF\u7684 Magpie provider route\u3002\n if (meta.provider === \"dsh\" && model) {\n const available = await provider.listModels().catch(() => []);\n if (available.length && !available.some((m) => m.id === model)) {\n // \u4F18\u5148\u56DE\u5230 DSH \u7684 Magpie \u8DEF\u7531\u6A21\u578B\uFF0C\u907F\u514D\u65E0 API key \u65F6\u843D\u56DE DeepSeek \u5B98\u65B9\u6A21\u578B\u3002\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 }\n if (opts.updateStatus) await this.setStatus(threadId, \"initializing\");\n const settings = await this.settings.get();\n const custom = settings.providerCommand?.[meta.provider];\n const launch =\n custom?.executable?.trim()\n ? { cmd: custom.executable.trim(), prefixArgs: custom.args ?? [] }\n : undefined;\n rt.session = await provider.createSession({\n threadId,\n cwd: proj.path,\n model,\n mode: 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 // ---- \u5185\u90E8 ----\n private async mustThread(threadId: string): Promise<ThreadMeta> {\n const meta = await this.threads.get(threadId);\n if (!meta) throw new ApiError(\"not_found\", \"\u5BF9\u8BDD\u4E0D\u5B58\u5728\");\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\", `\u672A\u77E5 Agent\uFF1A${providerId}`);\n const s = await this.settings.get();\n if (!opts.allowDisabled && !isProviderEnabled(s, providerId)) {\n throw new ApiError(\"bad_params\", `${p.name} \u5DF2\u5728\u8BBE\u7F6E\u4E2D\u7981\u7528`);\n }\n const entry = catalogById(providerId);\n if (entry && !providerCreatable(entry.status)) {\n throw new ApiError(\"bad_params\", `${p.name} \u5C1A\u672A\u63A5\u5165\uFF0C\u6682\u4E0D\u80FD\u65B0\u5EFA\u5BF9\u8BDD`);\n }\n const det = await cachedDetect(p);\n if (!det.available) throw new ApiError(\"bad_params\", det.reason ?? `${p.name} \u672A\u5B89\u88C5\u6216\u4E0D\u53EF\u7528`);\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 }); // \u524D\u7AEF\u8FD0\u884C\u6001/\u8BA1\u65F6/\u53D1\u9001\u94AE\n }\n\n // \u8FFD\u52A0\u4E8B\u4EF6\uFF1Aseq \u7531 store \u4E32\u884C\u533A\u5206\u914D\uFF0C\u843D\u76D8\uFF0C\u63A8\u9001 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 // \u63A8\u9001\u4F46\u4E0D\u843D\u76D8\uFF08coalescer delta \u7528\uFF1Busage \u5DF2\u7ECF\u7531\u4E0A\u9762\u7D2F\u52A0\uFF09\u3002\n // \u4E0D\u843D\u76D8\u7684\u4E8B\u4EF6\u4E0D\u5360 seq \u5E8F\u53F7\uFF1Aseq=-1 \u8BA9\u524D\u7AEF\u53EA\u6309\u6301\u4E45\u5316 seq \u53BB\u91CD\uFF0C\n // \u5426\u5219 delta \u628A\u5BA2\u6237\u7AEF\u7684 maxSeq \u9876\u4E0A\u53BB\uFF0C\u4F1A\u628A\u968F\u540E\u7684\u6301\u4E45\u5316\u4E8B\u4EF6\u8BEF\u4E22\u3002\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 private async recycleIdle(): Promise<void> {\n const s = await this.settings.get();\n const limit = (s.idleCloseMinutes ?? 30) * 60_000;\n for (const rt of this.runtimes.values()) {\n if (rt.status === \"idle\" && rt.pending.size === 0 && Date.now() - rt.lastActivity > limit) {\n log(\"info\", `\u7A7A\u95F2\u56DE\u6536 thread ${rt.threadId}`);\n await this.close(rt.threadId);\n }\n }\n }\n}\n", "// Coalescer\uFF08\u53C2\u8003 Paseo agent-stream-coalescer\uFF09\uFF1A\n// \u6309 itemId \u7D2F\u79EF delta\uFF1B\u9996\u4E2A\u7ACB\u5373\u63A8\u9001\uFF08leading\uFF09\uFF0C\u7A97\u53E3\u5185\u7D2F\u79EF\u540E trailing \u63A8\u9001\u4E00\u6B21\uFF1B\n// \u6536\u5230\u5B8C\u6574\u4E8B\u4EF6\u524D flush \u8BE5 itemId\u3002\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 // \u63A8\u5165\u4E00\u4E2A delta\uFF1B\u9996\u4E2A\u7ACB\u5373\u53D1\uFF0C\u7A97\u53E3\u5185\u5408\u5E76\u540E trailing \u53D1\n push(itemId: string, text: string): void {\n const acc = this.acc.get(itemId);\n if (!acc) {\n // leading\uFF1A\u7ACB\u5373\u53D1\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 // \u5B8C\u6574\u4E8B\u4EF6\u5230\u8FBE\u524D\u5FC5\u987B flush\uFF0C\u4FDD\u8BC1\u987A\u5E8F\uFF08delta \u5728\u5B8C\u6574\u4E8B\u4EF6\u4E4B\u524D\uFF09\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 // itemId \u7684\u5B8C\u6574\u4E8B\u4EF6\u5230\u8FBE\u524D\u8C03\u7528\uFF1Aflush \u672A\u53D1\u5B8C\u7684 delta\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\uFF08\u00A75.8\uFF09\uFF1A\u8C03\u7528\u672C\u673A git\uFF0CexecFile \u4E0D\u7ECF shell\uFF0Ccwd = \u9879\u76EE\u8DEF\u5F84\uFF0C\u8D85\u65F6 15 \u79D2\u3002\nimport { execFile } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readFile, rename, stat } from \"node:fs/promises\";\nimport { join, normalize, sep } from \"node:path\";\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 execFile(\"git\", 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 res({ code, out: String(stdout ?? \"\"), err: String(stderr ?? (e?.message ?? \"\")) });\n });\n });\n}\n\n// \u8DEF\u5F84\u5FC5\u987B\u5728\u9879\u76EE\u5185\uFF08\u9632 .. \u9003\u9038\uFF09\uFF1B\u8FD4\u56DE\u9879\u76EE\u5185\u76F8\u5BF9\u8DEF\u5F84\uFF08posix \u5F62\u5F0F\uFF09\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\nexport class GitService {\n // projectPath \u7531\u8C03\u7528\u65B9\u4ECE projectId \u89E3\u6790\uFF08service \u4E0D\u8BA4\u8BC6 store\uFF09\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 \u5931\u8D25\" };\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 // renamed \u8BB0\u5F55\u5F62\u5982 \"R new\\0old\"\uFF1A\u4E0B\u4E00\u4E2A part \u662F\u65E7\u8DEF\u5F84\uFF0C\u8DF3\u8FC7\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 // \u7EDF\u4E00 diff \u6587\u672C\uFF1B{tooLarge:true} \u5F53 diff > 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: \"\u8DEF\u5F84\u4E0D\u5141\u8BB8\" };\n // \u5148\u770B\u672A\u8DDF\u8E2A\uFF08git diff \u5BF9\u672A\u8DDF\u8E2A\u65E0\u8F93\u51FA\uFF09\n const ls = await runGit(projectPath, [\"ls-files\", \"--error-unmatch\", \"--\", rel]);\n if (ls.code !== 0) {\n // \u672A\u8DDF\u8E2A/\u672A\u5165\u7D22\u5F15\uFF1A\u6574\u6587\u4EF6\u5F53\u65B0\u589E\n const full = join(projectPath, rel);\n if (!existsSync(full)) return { error: \"\u6587\u4EF6\u4E0D\u5B58\u5728\" };\n const s = await stat(full);\n if (!s.isFile()) return { error: \"\u4E0D\u662F\u6587\u4EF6\" };\n if (s.size > DIFF_LIMIT) return { tooLarge: true };\n const text = await readFile(full, \"utf8\").catch(() => null);\n if (text === null) return { error: \"\u4E8C\u8FDB\u5236\u6216\u65E0\u6CD5\u8BFB\u53D6\" };\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 \u5931\u8D25\" };\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 \u5931\u8D25\" };\n }\n if (d.out.length > DIFF_LIMIT) return { tooLarge: true };\n return { diff: d.out };\n }\n\n // \u5DF2\u8DDF\u8E2A \u2192 git restore\uFF1B\u672A\u8DDF\u8E2A \u2192 \u79FB\u5230 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: \"\u8DEF\u5F84\u4E0D\u5141\u8BB8\" };\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() || \"\u653E\u5F03\u5931\u8D25\" };\n return { ok: true };\n }\n const full = join(projectPath, rel);\n if (!existsSync(full)) return { ok: false, error: \"\u6587\u4EF6\u4E0D\u5B58\u5728\" };\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 rename(full, dest);\n } catch (e) {\n return { ok: false, error: \"\u79FB\u52A8\u5931\u8D25\uFF1A\" + String((e as Error)?.message ?? e) };\n }\n return { ok: true, trashedTo: dest };\n }\n}\n", "// FileService\uFF08\u00A75.9\uFF09\uFF1A\u6587\u4EF6\u6811\uFF08\u61D2\u52A0\u8F7D\u4E00\u5C42\uFF09\u4E0E\u8BFB\u6587\u4EF6\u9884\u89C8\u3002\n// tree\uFF1A\u5FFD\u7565 .git/node_modules + \u9879\u76EE\u6839 .gitignore\uFF08ignore \u5E93\uFF09\uFF1B\u76EE\u5F55\u5728\u524D\u6309\u540D\u79F0\u6392\uFF1B\u6BCF\u5C42 \u22642000\u3002\n// read\uFF1A\u22641MB\uFF1B\u524D 8KB \u542B \\0 \u2192 {binary}\uFF1B\u5426\u5219 {text, language}\uFF08\u6269\u5C55\u540D\u63A8\u65AD\uFF09\u3002\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join, normalize, sep, relative, extname } from \"node:path\";\nimport ignore from \"ignore\";\n\nexport type TreeEntry = { name: string; path: string; isDir: boolean };\nexport type ReadResult = { text?: string; language?: string; binary?: boolean; tooLarge?: boolean; error?: string };\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 // \u7F13\u5B58\u6BCF\u4E2A\u9879\u76EE\u7684 ignore \u5B9E\u4F8B\uFF08.gitignore \u53D8\u66F4\u7531\u4E0B\u4E00\u6B21 daemon \u91CD\u542F\u62FE\u53D6\uFF1B\u4EE3\u4EF7\u53EF\u63A5\u53D7\uFF09\n private igCache = new Map<string, ReturnType<typeof ignore> | null>();\n\n private async igFor(projectPath: string) {\n if (this.igCache.has(projectPath)) return this.igCache.get(projectPath);\n const gi = join(projectPath, \".gitignore\");\n let ig: ReturnType<typeof ignore> | null = null;\n if (existsSync(gi)) {\n try {\n ig = ignore().add(await readFile(gi, \"utf8\"));\n } catch {\n ig = null;\n }\n }\n this.igCache.set(projectPath, 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: \"\u8DEF\u5F84\u4E0D\u5141\u8BB8\" };\n const abs = join(projectPath, rel);\n const s = await stat(abs).catch(() => null);\n if (!s?.isDirectory()) return { error: \"\u76EE\u5F55\u4E0D\u5B58\u5728\" };\n const ig = await this.igFor(projectPath);\n const names = await readdir(abs).catch(() => null);\n if (!names) return { error: \"\u65E0\u6CD5\u8BFB\u53D6\u76EE\u5F55\" };\n const out: TreeEntry[] = [];\n for (const name of names) {\n if (out.length >= MAX_PER_LEVEL) break;\n if (ALWAYS_IGNORE.has(name)) continue;\n const childRel = rel === \".\" ? name : `${rel}/${name}`;\n const st = await stat(join(projectPath, childRel)).catch(() => null);\n if (!st) continue;\n const isDir = st.isDirectory();\n if (ig) {\n // ignore \u5E93\u8981\u6C42 posix \u76F8\u5BF9\u8DEF\u5F84\uFF1B\u76EE\u5F55\u89C4\u5219\u5339\u914D\u76EE\u5F55\u8981\u52A0\u5C3E\u90E8 /\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: \"\u8DEF\u5F84\u4E0D\u5141\u8BB8\" };\n const abs = join(projectPath, rel);\n const s = await stat(abs).catch(() => null);\n if (!s) return { error: \"\u6587\u4EF6\u4E0D\u5B58\u5728\" };\n if (!s.isFile()) return { error: \"\u4E0D\u662F\u6587\u4EF6\" };\n if (s.size > MAX_READ) return { tooLarge: true };\n const buf = await readFile(abs).catch(() => null);\n if (!buf) return { error: \"\u65E0\u6CD5\u8BFB\u53D6\" };\n const head = buf.subarray(0, 8192);\n if (head.includes(0)) return { binary: true };\n return { text: buf.toString(\"utf8\"), language: LANG[extname(rel).toLowerCase()] ?? \"plaintext\" };\n }\n}\n", "// TerminalService\uFF08\u00A77.5\uFF09\uFF1Anode-pty \u4F18\u5148\uFF0C\u88C5\u4E0D\u4E0A\u9000\u56DE\u65E0 PTY \u65B9\u6848\u3002\n// \u8F93\u51FA\u5199\u73AF\u5F62\u7F13\u51B2\uFF085000 \u884C / 2MB\uFF09\uFF0C16ms \u5408\u5E76\u540E\u7ECF gateway \u4E8C\u8FDB\u5236\u5E27\u63A8\u7ED9\u8BA2\u9605 terminal:<index> \u7684\u8FDE\u63A5\u3002\n// \u5E27\u683C\u5F0F\uFF08\u00A75.4\uFF09\uFF1A[op:1][index:2 BE][payload]\uFF1Bop 1=\u8F93\u51FA 2=\u8F93\u5165 3=\u5C3A\u5BF8(JSON)\u3002\nimport { spawn, execFileSync, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport type { Gateway } from \"../ws/gateway.js\";\nimport { log } from \"../log.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; // \u65E0 PTY \u9000\u5316\n pty: Pty | null;\n proc: ChildProcessWithoutNullStreams | null;\n buf: string; // \u73AF\u5F62\u7F13\u51B2\u6587\u672C\uFF08\u22642MB\uFF0Cattach \u65F6\u53D6\u5C3E 5000 \u884C\uFF09\n pend: string; // 16ms \u5408\u5E76\u5F85\u53D1\n timer: NodeJS.Timeout | null;\n};\n\nconst MAX_TERMS_PER_PROJECT = 8;\nconst BUF_MAX = 2 * 1024 * 1024;\nconst SNAP_LINES = 5000;\n\nfunction pickShell(): string {\n if (process.platform === \"win32\") {\n for (const s of [\"pwsh.exe\", \"powershell.exe\"]) {\n try {\n execFileSync(\"where.exe\", [s], { stdio: \"ignore\", windowsHide: true });\n return s;\n } catch {}\n }\n return \"powershell.exe\";\n }\n return process.env.SHELL || \"/bin/bash\";\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 this.ptyLib = await import(\"node-pty\");\n } catch (e) {\n log(\"warn\", \"node-pty \u52A0\u8F7D\u5931\u8D25\uFF0C\u7EC8\u7AEF\u9000\u5316\u65E0 PTY \u65B9\u6848\", { 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: `\u6BCF\u4E2A\u9879\u76EE\u6700\u591A ${MAX_TERMS_PER_PROJECT} \u4E2A\u7EC8\u7AEF` };\n const shell = pickShell();\n const term: Term = {\n id: rid(), index: nextIndex++, projectId, cwd, title: `\u7EC8\u7AEF ${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 \u5931\u8D25\uFF0C\u9000\u5316\u65E0 PTY \u65B9\u6848\", { err: String(e) });\n }\n }\n if (!term.pty) {\n // \u65E0 PTY \u65B9\u6848\n term.simple = true;\n const args = process.platform === \"win32\" ? [\"-NoLogo\"] : [\"-i\"];\n const proc = spawn(shell, args, { cwd, stdio: \"pipe\", windowsHide: true, env: process.env });\n term.proc = proc;\n proc.stdout.on(\"data\", (d: Buffer) => this.onData(term, d.toString(\"utf8\")));\n proc.stderr.on(\"data\", (d: Buffer) => this.onData(term, d.toString(\"utf8\")));\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): { index?: number; snapshot?: string; simple?: boolean; error?: string } {\n const t = this.terms.get(id);\n if (!t) return { error: \"\u7EC8\u7AEF\u4E0D\u5B58\u5728\" };\n // \u5C3E 5000 \u884C\n const lines = t.buf.split(\"\\n\");\n const snapshot = lines.length > SNAP_LINES ? lines.slice(-SNAP_LINES).join(\"\\n\") : t.buf;\n return { index: t.index, snapshot, simple: t.simple };\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 // daemon \u9000\u51FA\u524D\u8C03\u7528\uFF1A\u540C\u6B65\u6740\uFF0C\u4FDD\u8BC1\u8FDB\u7A0B\u6811\u5728\u9000\u51FA\u524D\u5DF2\u6E05\u6389\n for (const t of this.terms.values()) this.killTerm(t, true);\n }\n\n // ---- \u5185\u90E8 ----\n // \u53EA\u6740 shell \u4F1A\u628A\u5B83\u542F\u52A8\u7684 npm run dev \u4E4B\u7C7B\u7559\u6210\u5B64\u513F \u2192 Windows \u7528 taskkill /T \u6740\u6574\u68F5\u6811\n private killTree(pid: number | undefined, sync: boolean): void {\n if (process.platform !== \"win32\" || !pid) return;\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);\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 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 // \u8F93\u5165\u5E27\uFF1Aop 2=\u8F93\u5165\uFF0C3=\u5C3A\u5BF8\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; // \u53EA\u5141\u8BB8\u5DF2 attach \u7684\u8FDE\u63A5\u5199\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"],
5
- "mappings": "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",
6
- "names": ["join", "existsSync", "resolve", "i", "j", "resolve", "readFile", "existsSync", "dirname", "join", "resolve", "existsSync", "readFile", "rid", "resolve", "readFile", "stat", "existsSync", "join", "homedir", "rec", "str", "spawn", "readdir", "readFile", "stat", "join", "homedir", "str", "rec", "spawn", "str", "rec", "trunc", "MAX_OUTPUT", "init_map", "readdir", "readFile", "stat", "homedir", "join", "rid", "init_session", "init_map", "resolve", "spawn", "runVersion", "INSTALL_HINT", "models", "init_provider", "init_session", "spawn", "readFile", "writeFile", "rid", "methods", "init_session", "resolve", "spawn", "runVersion", "cfg", "init_provider", "init_session", "models", "send", "init_provider", "acp", "init_provider", "readFile", "homedir", "join", "EFFORT_LABEL", "existsSync", "statSync", "mkdir", "writeFile", "homedir", "dirname", "join", "execFile", "p", "models", "stamp", "writeFile", "mkdir", "dirname", "readFile", "mkdir", "rename", "writeFile", "dirname", "mkdir", "readdir", "readFile", "existsSync", "join", "mkdirSync", "rmSync", "join", "dirname", "fileURLToPath", "join", "dirname", "fileURLToPath", "dirname", "fileURLToPath", "join", "existsSync", "join", "cfg", "data", "join", "existsSync", "stat", "readFile", "join", "extname", "randomBytes", "MIME", "readdir", "readFile", "join", "readFile", "existsSync", "statSync", "join", "randomBytes", "mkdir", "rename", "readdir", "readFile", "join", "randomBytes", "newId", "stamp", "randomBytes", "randomBytes", "cfg", "models", "execFile", "existsSync", "mkdir", "readFile", "rename", "stat", "join", "normalize", "sep", "rec", "stamp", "readdir", "readFile", "stat", "existsSync", "join", "normalize", "sep", "extname", "insidePath", "spawn", "rid", "mkdirSync", "join", "dirname", "fileURLToPath", "bindAttachmentStore", "migrateLegacy", "warmProviderCache", "rmSync"]
7
- }
1
+ {"version":3,"sources":["../src/log.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/i18n.ts","../src/util/attachmentRefs.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/map.ts","../src/providers/codex/commands.ts","../src/providers/codex/session.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/session.ts","../src/providers/acp/provider.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/ws/methods.ts","../src/util/atomic.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/settings.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\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 const fn = level === \"error\" ? console.error : level === \"warn\" ? console.warn : console.log;\n fn(`[agent-console] ${msg}`, extra !== undefined ? extra : \"\");\n}\n\nfunction safeJson(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\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 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: \"允许\", kind: \"allow_once\" },\n { id: \"acceptForSession\", label: \"本对话都允许\", kind: \"allow_always\" },\n { id: \"decline\", label: \"拒绝\", 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: \"拒绝\", 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\";\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: `PATH 里找不到 ${uniq.length > 1 ? uniq.join(\" 或 \") : 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: `PATH 里找不到 ${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\";\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\", `读取 ${relPath(file, cwd)}`, { path: file, offset: input.offset, limit: input.limit });\n case \"Edit\":\n return f(\"edit\", `编辑 ${relPath(file, cwd)}`, { path: file, old: input.old_string, new: input.new_string });\n case \"MultiEdit\":\n return f(\"edit\", `编辑 ${relPath(file, cwd)}(${((input.edits as unknown[]) || []).length} 处)`, { path: file, edits: input.edits ?? [] });\n case \"Write\":\n return f(\"write\", `${input._exists ? \"覆盖\" : \"新建\"} ${relPath(file, cwd)}`, { path: file, content: input.content });\n case \"NotebookEdit\":\n return f(\"edit\", `编辑笔记本 ${relPath(String(input.notebook_path || file), cwd)}`, { path: input.notebook_path ?? file });\n case \"Bash\":\n return f(\"bash\", `运行 ${trunc(String(input.command ?? \"\"))}`, { command: input.command, description: input.description });\n case \"BashOutput\":\n return f(\"bash\", `查看输出 ${String(input.bash_id ?? \"\")}`, { bashId: input.bash_id });\n case \"KillShell\":\n return f(\"bash\", `结束进程 ${String(input.shell_id ?? \"\")}`, { shellId: input.shell_id });\n case \"Grep\":\n return f(\"search\", `搜索 \"${trunc(String(input.pattern ?? \"\"), 40)}\"`, { pattern: input.pattern, path: input.path, glob: input.glob });\n case \"Glob\":\n case \"LS\":\n return f(\"glob\", `查找 ${trunc(String(input.pattern ?? input.path ?? \"\"), 40)}`, { pattern: input.pattern, path: input.path });\n case \"WebFetch\":\n return f(\"web\", `打开 ${hostOf(String(input.url ?? \"\"))}`, { url: input.url });\n case \"WebSearch\":\n return f(\"web\", `搜索网页 \"${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\", `更新待办(${done}/${items.length})`, { items });\n }\n case \"Task\":\n case \"Agent\":\n return f(\"task\", `子任务:${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 || \"工具\", {});\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","// SDK messages → ProviderEvent (§7.2.3). Ported from normalize in lib/agents/claude.mjs.\nimport type { SDKMessage, SDKPartialAssistantMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ProviderEvent } from \"../../timeline/types.js\";\nimport { callInfo, todoItems } from \"../../agents/kinds.js\";\nimport { editDetail } from \"../../agents/diff.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 // The SDK'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 SDK message → 0..n unified events\nexport function mapSdkMessage(m: SDKMessage, 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: `API 重试中(第 ${r.attempt ?? \"?\"} 次)` });\n }\n if (r.subtype === \"compact_boundary\") {\n out.push({ type: \"notice\", level: \"info\", message: \"上下文已压缩\" });\n }\n return out;\n }\n\n if (r.type === \"stream_event\") {\n const e = rec((m as SDKPartialAssistantMessage).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\" ? 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","/** 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 \"export.defaultModel\": \"默认\",\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 \"export.defaultModel\": \"Default\",\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","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","// Claude ProviderSession (§7.2.2/7.2.4/7.2.5/7.2.6): persistent query, streaming, permissions, interrupt, hot switching.\nimport { query, type Query, type Options, type SDKUserMessage, type PermissionResult, type EffortLevel, type PermissionMode } from \"@anthropic-ai/claude-agent-sdk\";\nimport { readFile } from \"node:fs/promises\";\nimport type { 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 { resolveImagePath } from \"../../util/attachmentRefs.js\";\nimport { classifyClaudeSlashCommand, sortSlashCommands } from \"../slash.js\";\n\nconst EFFORTS: EffortLevel[] = [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"];\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 binCmd: string; // The claude executable (resolveBin's cmd)\n binPrefixArgs: string[]; // = [cli.js] in the shim case of node cli.js\n binVia?: string; // resolveBin's via: for cmd-shim / ps1 the SDK can't launch this file directly\n onModeChange?: (mode: Mode) => void; // Callback when a plan is approved → default (the manager updates meta)\n};\n\n/** resolveBin result → pathToClaudeCodeExecutable for the SDK.\n * - shim-js (node + cli.js): give cli.js to the SDK, which launches it with node;\n * - executable (native claude / claude.exe): pass it directly;\n * - cmd-shim / ps1 (.cmd / .ps1 wrappers on Windows): Node can't spawn them directly, so let the SDK find claude itself. */\nexport function claudeExecutable(o: Pick<ClaudeSessionOpts, \"binCmd\" | \"binPrefixArgs\" | \"binVia\">): { path: string; node: boolean } | null {\n if (!o.binCmd) return null;\n if (o.binVia === \"cmd-shim\" || o.binVia === \"ps1\") return null;\n const last = o.binPrefixArgs[o.binPrefixArgs.length - 1];\n if (last && /\\.(c|m)?js$/i.test(last)) return { path: last, node: true };\n if (o.binPrefixArgs.length) return null;\n return { path: o.binCmd, node: false };\n}\n\nexport class ClaudeSession implements ProviderSession {\n events: AsyncIterable<ProviderEvent>;\n private q = new AsyncQueue<ProviderEvent>();\n private input = new AsyncQueue<SDKUserMessage>();\n private query: Query | null = null;\n private abort = new AbortController();\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 stderrTail = \"\";\n private pumpDone: Promise<void> | null = null;\n\n constructor(private o: ClaudeSessionOpts) {\n this.sessionId = o.resumeId;\n this.events = this.q;\n }\n\n // The query is only started before the first send (a failed detection should be reported quickly)\n private ensureQuery(): Query {\n if (this.query && !this.needsRestart) return this.query;\n this.abort = new AbortController();\n this.st = newMapState();\n const options: Options = {\n cwd: this.o.cwd,\n model: this.o.model ?? undefined,\n permissionMode: this.o.mode as PermissionMode,\n canUseTool: (toolName, input, opts) => this.canUseTool(toolName, input, opts),\n includePartialMessages: true,\n settingSources: [\"user\", \"project\", \"local\"],\n systemPrompt: { type: \"preset\", preset: \"claude_code\" },\n abortController: this.abort,\n ...(this.sessionId ? { resume: this.sessionId } : {}),\n stderr: (d: string) => {\n this.stderrTail = (this.stderrTail + d).slice(-4096);\n },\n };\n const exe = claudeExecutable(this.o);\n if (exe) {\n options.pathToClaudeCodeExecutable = exe.path;\n if (exe.node) options.executable = \"node\";\n }\n if (this.o.effort && EFFORTS.includes(this.o.effort as EffortLevel)) {\n options.effort = this.o.effort as EffortLevel;\n }\n const q = query({ prompt: this.input as AsyncIterable<SDKUserMessage>, options });\n this.query = q;\n this.needsRestart = false;\n this.pumpDone = this.pump(q);\n return q;\n }\n\n private async pump(q: Query): Promise<void> {\n try {\n for await (const m of q) {\n for (const ev of mapSdkMessage(m, this.st, this.o.cwd)) this.emit(ev);\n }\n } catch (e) {\n // An end caused by abort is not a crash\n if (!this.abort.signal.aborted && !this.closed) {\n this.emit({ type: \"notice\", level: \"error\", message: \"Claude 会话异常:\" + this.errText(e) });\n }\n }\n // The event stream ended. An old query that restart() deliberately replaced (this.query is no longer it) must not close the event queue,\n // otherwise every event of the new query is dropped and the next turn stays running forever.\n if (!this.closed && this.query === q) {\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 === \"provider_session_id\" && ev.id) this.sessionId = ev.id;\n this.q.push(ev);\n }\n\n private errText(e: unknown): string {\n const base = String((e as Error)?.message ?? e);\n return this.stderrTail ? `${base};stderr: ${this.stderrTail.slice(-400)}` : base;\n }\n\n async send(input: SendInput): Promise<void> {\n if (this.closed) throw new Error(\"会话已关闭\");\n if (this.needsRestart) await this.restart();\n const q = this.ensureQuery();\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 content = [] as unknown as SDKUserMessage[\"message\"][\"content\"];\n const blocks = content as unknown as Record<string, unknown>[];\n for (const img of input.images ?? []) {\n try {\n const disk = await resolveImagePath(img.path);\n const data = await readFile(disk);\n blocks.push({\n type: \"image\",\n source: { type: \"base64\", media_type: img.mime, data: data.toString(\"base64\") },\n });\n } catch (e) {\n this.emit({ type: \"notice\", level: \"warn\", message: `图片读取失败 ${img.path}:${String(e)}` });\n }\n }\n blocks.push({ type: \"text\", text: input.text });\n this.input.push({\n type: \"user\",\n message: { role: \"user\", content },\n parent_tool_use_id: null,\n session_id: this.sessionId ?? \"\",\n });\n void q; // Messages flow into the running query through input\n }\n\n private async restart(): Promise<void> {\n if (this.restarting) return this.restarting;\n this.restarting = (async () => {\n // Close the old query (drop the reference first so the old pump knows on exit that this was a deliberate restart)\n this.query = null;\n try {\n this.input.close();\n this.abort.abort();\n } catch {}\n if (this.pumpDone) await this.pumpDone.catch(() => {});\n // New input queue (the old one may already be closed)\n this.input = new AsyncQueue<SDKUserMessage>();\n try {\n this.ensureQuery();\n } finally {\n this.restarting = null;\n }\n })();\n return this.restarting;\n }\n\n // ---- permissions (§7.2.4) ----\n private canUseTool(\n toolName: string,\n input: Record<string, unknown>,\n opts: { signal: AbortSignal; toolUseID?: string },\n ): Promise<PermissionResult | null> {\n const requestId = \"perm_\" + rid();\n const { signal } = opts;\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: \"允许\", kind: \"allow_once\" },\n { id: \"allow_always\", label: \"本对话都允许\", kind: \"allow_always\" },\n { id: \"deny\", label: \"拒绝\", kind: \"reject_once\" },\n ],\n });\n return new Promise<PermissionResult | null>((resolve) => {\n this.pending.set(requestId, { kind: \"permission\", resolve: (a) => resolve(this.toPermissionResult(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: \"已取消\", interrupt: true });\n }\n }, { once: true });\n });\n }\n\n private toPermissionResult(a: RespondAnswer, input: Record<string, unknown>): PermissionResult {\n if (a.cancelled || a.optionId === \"deny\") {\n return { behavior: \"deny\", message: \"用户拒绝了此操作\", ...(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<PermissionResult | null> {\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: \"Agent 提交了计划\",\n kind: \"plan\",\n detail: { plan: planText },\n options: [\n { id: \"implement\", label: \"实施\", kind: \"allow_once\" },\n { id: \"reject\", label: \"拒绝\", 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: \"用户拒绝了计划,请根据反馈修改\", ...(answer.cancelled ? { interrupt: true } : {}) };\n }\n // implement: switch back to default mode\n try {\n await this.query?.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<PermissionResult | null> {\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: \"用户取消了提问\", 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 try {\n const q = this.query;\n if (q) {\n await Promise.race([\n q.interrupt(),\n new Promise((_, rej) => setTimeout(() => rej(new Error(\"interrupt 超时\")), 3000)),\n ]);\n }\n } catch (e) {\n log(\"warn\", \"interrupt 失败\", { err: String(e) });\n this.needsRestart = true;\n }\n }\n\n async setModel(model: string | null): Promise<void> {\n this.o.model = model;\n try {\n await this.query?.setModel(model ?? undefined);\n } catch (e) {\n log(\"warn\", \"setModel 失败\", { err: String(e) });\n }\n }\n\n async setMode(mode: Mode): Promise<void> {\n this.o.mode = mode;\n try {\n await this.query?.setPermissionMode(mode as PermissionMode);\n } catch (e) {\n log(\"warn\", \"setPermissionMode 失败\", { err: String(e) });\n }\n }\n\n async setEffort(effort: string | null): Promise<void> {\n this.o.effort = effort;\n // SDK Options.effort only applies when the query is created → rebuild (continued via resume)\n this.needsRestart = true;\n }\n\n async listCommands(): Promise<SlashCommand[]> {\n try {\n const q = this.ensureQuery();\n const commands = await q.supportedCommands();\n const map = new Map<string, SlashCommand>();\n for (const cmd of commands) {\n if (!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 this.input.close();\n try {\n this.abort.abort();\n } catch {}\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\";\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 || \"(无标题)\",\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 } 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\";\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(): Provider {\n return {\n id: \"claude\",\n name: \"Claude Code\",\n capabilities: claudeCapabilities,\n async detect(): Promise<DetectResult> {\n const bin = await resolveBin(\"claude\");\n if (!bin.ok) return { available: false, reason: bin.reason, installHint: INSTALL_HINT };\n try {\n const version = await runVersion(bin, [\"--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 = await resolveBin(\"claude\");\n if (!bin.ok) throw new Error(`找不到 claude:${bin.reason}`);\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 binCmd: bin.cmd,\n binPrefixArgs: bin.prefixArgs,\n binVia: bin.via,\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 the SDK stream (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\";\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 || \"(无标题)\", 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: `(历史)调用 ${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: `(历史)调用 ${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","// Codex app-server notifications → ProviderEvent (§7.3.4). Method and field names follow the generated schema.\nimport type { ProviderEvent } from \"../../timeline/types.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};\n\nexport function newCodexMapState(): CodexMapState {\n return { currentTurnId: null, filesChanged: 0, diffText: \"\" };\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 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) out.push({ type: \"reasoning_delta\", itemId, text: delta });\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: `运行 ${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 out.push({\n type: \"tool_call\", itemId, kind: \"edit\",\n title: `修改 ${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: `搜索网页 \"${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 text = summary.filter((s): s is string => typeof s === \"string\").join(\"\\n\");\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: `运行 ${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 const istatus = str(item.status);\n st.filesChanged += changes.length;\n out.push({\n type: \"tool_call\", itemId, kind: \"edit\",\n title: `修改 ${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: `搜索网页 \"${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) ?? \"Codex 错误\";\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 { ProviderSession, SendInput, RespondAnswer, Mode, SlashCommand } from \"../types.js\";\nimport { resolveImagePath } from \"../../util/attachmentRefs.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\";\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 },\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 [\"app-server\"],\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(\"会话已关闭\");\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: Record<string, unknown>[] = [{ type: \"text\", text: wireText }];\n for (const img of input.images ?? []) {\n items.push({ type: \"localImage\", path: await resolveImagePath(img.path) });\n }\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 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(\"当前轮次还没开始,无法插话\");\n const items: Record<string, unknown>[] = [{ type: \"text\", text: input.text }];\n for (const img of input.images ?? []) {\n items.push({ type: \"localImage\", path: await resolveImagePath(img.path) });\n }\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: `运行 ${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: \"允许\", kind: \"allow_once\" },\n { id: \"acceptForSession\", label: \"本对话都允许\", kind: \"allow_always\" },\n { id: \"decline\", label: \"拒绝\", 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 changes = Array.isArray(params.changes) ? params.changes : [];\n const requestId = \"perm_\" + rid();\n this.emit({\n type: \"permission_request\",\n requestId,\n title: \"修改文件\",\n kind: \"tool\",\n detail: { changes, approvalId: params.approvalId, itemId: params.itemId, reason: params.reason },\n options: [\n { id: \"accept\", label: \"允许\", kind: \"allow_once\" },\n { id: \"acceptForSession\", label: \"本对话都允许\", kind: \"allow_always\" },\n { id: \"decline\", label: \"拒绝\", 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","// Codex Provider (§7.3): detect + listModels (temporary app-server → model/list, cached 10 minutes) + createSession.\nimport type { Provider, ProviderSession, DetectResult, ModelInfo, Capabilities, HistoryItem } 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\";\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 modes: [\"plan\", \"default\", \"acceptEdits\", \"bypassPermissions\"],\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): Promise<ModelInfo[]> {\n const rpc = new CodexRpc(argvFor(r, [\"app-server\"]), { 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 function createCodexProvider(version: string): Provider {\n return {\n id: \"codex\",\n name: \"Codex\",\n capabilities: codexCapabilities,\n async detect(): Promise<DetectResult> {\n const bin = 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, [\"--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(): Promise<ModelInfo[]> {\n if (modelCache && Date.now() - modelCache.at < MODEL_CACHE_MS) return modelCache.models;\n const bin = await resolveBin(\"codex\");\n if (!bin.ok) return [{ id: \"\", name: \"默认\" }];\n try {\n const models = await fetchModels(bin, process.cwd());\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: \"默认\" }];\n }\n },\n async createSession(o): Promise<ProviderSession> {\n const bin = await resolveBin(\"codex\");\n if (!bin.ok) throw new Error(`找不到 codex:${bin.reason}`);\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 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","/** 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: \"见 OpenAI Codex CLI 安装说明\", status: \"verified\" },\n { id: \"cursor\", name: \"Cursor\", bins: [\"cursor-agent\", \"cursor\"], installHint: \"安装 Cursor 并确保 CLI 在 PATH\", status: \"verified\" },\n { id: \"copilot\", name: \"Copilot\", bins: [\"copilot\"], installHint: \"GitHub Copilot CLI 安装说明\", status: \"verified\" },\n { id: \"opencode\", name: \"OpenCode\", bins: [\"opencode\"], installHint: \"npm i -g opencode / 见 OpenCode 文档\", status: \"verified\" },\n { id: \"pi\", name: \"Pi\", bins: [\"pi-acp\", \"pi\", \"pi-coding-agent\"], installHint: \"npm i -g pi-acp(或 Pi coding agent + ACP 适配器)\", status: \"verified\" },\n { id: \"devin\", name: \"Devin CLI\", bins: [\"devin\"], installHint: \"Devin 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\";\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 ?? \"需要授权\",\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\nexport type MapCtx = { itemPrefix: string; messageIds: Map<string, string> };\n\nexport function newMapCtx(): MapCtx {\n return { itemPrefix: \"a\" + rid() + \"_\", messageIds: new Map() };\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 = mid ? ctx.messageIds.get(mid) ?? ctx.itemPrefix + mid : ctx.itemPrefix + \"msg\";\n if (mid) ctx.messageIds.set(mid, itemId);\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 = mid ? ctx.itemPrefix + \"t_\" + mid : ctx.itemPrefix + \"think\";\n out.push({ type: \"reasoning_delta\", itemId, text });\n break;\n }\n case \"tool_call\":\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 out.push({\n type: \"tool_call\",\n itemId: ctx.itemPrefix + update.toolCallId,\n kind: mapToolKind(update.kind),\n title: update.title ?? update.name ?? \"tool\",\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 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","// 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 { 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 { absCwd, acpStreamFromChild, killAcpChild, spawnResolved } from \"./spawn.js\";\nimport { registerAcpClientHandlers } from \"./clientHandlers.js\";\nimport { mapSessionUpdate, newMapCtx, stopToTurnEnd, type MapCtx } from \"./mapUpdate.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 }): ActiveSession;\n};\n\nexport type AcpSessionOpts = {\n threadId: 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 appVersion: string;\n flavor: \"cursor\" | \"generic\";\n modeMap?: Partial<Record<Mode, string>>;\n cursorFast?: boolean;\n cursorAutoReview?: boolean;\n launch?: { cmd: string; prefixArgs: string[] };\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 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.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 ? ({\n ok: true as const,\n cmd: this.o.launch.cmd,\n prefixArgs: this.o.launch.prefixArgs,\n display: this.o.launch.cmd,\n via: \"custom\",\n binName: \"custom\",\n } satisfies ResolveResult & { ok: true; binName: string })\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, this.o.acpArgs, { 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: `${this.o.binName} 进程退出 (${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 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\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 const loaded = await ctx.request(methods.agent.session.load, {\n sessionId: this.o.resumeId,\n cwd,\n mcpServers: [],\n });\n this.active = (ctx as unknown as AttachableCtx).attachSession({\n sessionId: this.o.resumeId,\n modes: loaded.modes,\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 if (!text) {\n this.running = false;\n this.q.push({ type: \"turn_ended\", turnId: this.turnId, status: \"completed\" });\n return;\n }\n void this.runTurn(text);\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(text: string): Promise<void> {\n this.activeTurnId = this.turnId;\n this.wakePump?.();\n this.wakePump = null;\n this.active!.prompt(text).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 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 } from \"../types.js\";\nimport { killTree, spawnBin, type ResolveResult } from \"../../util/bin.js\";\nimport { resolveFirstBin } from \"../../util/bin.js\";\nimport { AcpSession } from \"./session.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 installHint: string;\n appVersion?: string;\n flavor?: \"cursor\" | \"generic\";\n capabilities?: Capabilities;\n fetchModels?: (r: ResolveResult & { ok: true }) => 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};\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 capabilities: caps,\n async detect(): Promise<DetectResult> {\n const r = await resolveProviderBin(cfg);\n if (!r.ok) {\n return { available: false, reason: r.reason, installHint: cfg.installHint };\n }\n let version: string | undefined;\n try {\n if (cfg.id === \"cursor\") {\n version = (await runVersion(r, [\"--version\"])).split(/\\r?\\n/)[0]?.trim();\n } else if (cfg.id === \"devin\") {\n version = (await runVersion(r, [\"version\"])).split(/\\r?\\n/)[0]?.trim();\n } else if (cfg.id === \"opencode\") {\n version = (await runVersion(r, [\"--version\"])).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(): Promise<ModelInfo[]> {\n const r = await resolveProviderBin(cfg);\n if (!r.ok) return [{ id: \"default\", name: \"默认\", isDefault: true }];\n if (cfg.fetchModels) return cfg.fetchModels(r);\n return [{ id: \"default\", name: \"默认\", isDefault: true }];\n },\n async createSession(o) {\n return new AcpSession({\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 binName: cfg.binName,\n binCandidates: cfg.binCandidates ?? [cfg.binName],\n acpArgs: cfg.acpArgs,\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","// 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\";\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\nexport function probeAcp(r: ResolveResult & { ok: true }, acpArgs: string[], timeoutMs = 30000): Promise<AcpProbeResult> {\n return probeAcpRaw(r, acpArgs, timeoutMs).then((x) => x.parsed);\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 }> {\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 }) => {\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 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 });\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[]) {\n return async (r: ResolveResult & { ok: true }): Promise<ModelInfo[]> => {\n try {\n const { parsed, ext } = await probeAcpRaw(r, acpArgs, 40000, \"cursor/list_available_models\");\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\nexport function acpProbeModels(acpArgs: string[]) {\n return async (r: ResolveResult & { ok: true }): Promise<ModelInfo[]> => {\n try {\n return probeToModels(await probeAcp(r, acpArgs));\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 } from \"./probe.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\"]),\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\"]),\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\"]),\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\"]),\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([]), modeMap: { default: \"\" } };\n case \"dsh\":\n return { ...base, acpArgs: [\"--profile\", \"acp\"], fetchModels: acpProbeModels([\"--profile\", \"acp\"]) };\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 } from \"./types.js\";\nimport { withMagpie } from \"./magpieGateway.js\";\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\nexport async function cachedDetect(p: Provider): Promise<DetectResult> {\n const hit = detects.get(p.id);\n if (fresh(hit, DETECT_MS)) return hit.value;\n let job = inflightDetect.get(p.id);\n if (!job) {\n job = withTimeout(\n p.detect().catch((e): DetectResult => ({ available: false, reason: String((e as Error)?.message ?? e) })),\n STEP_TIMEOUT_MS,\n { available: false, reason: \"检测超时\" },\n ).then((v) => {\n // Don't cache a timeout; try again next time\n if (v.reason !== \"检测超时\") detects.set(p.id, { at: Date.now(), value: v });\n return v;\n }).finally(() => inflightDetect.delete(p.id));\n inflightDetect.set(p.id, job);\n }\n return job;\n}\n\nexport async function cachedModels(p: Provider): Promise<ModelInfo[]> {\n const hit = models.get(p.id);\n if (fresh(hit, MODELS_MS)) return hit.value;\n let job = inflightModels.get(p.id);\n if (!job) {\n job = withTimeout<ModelInfo[] | null>(p.listModels().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(p.id)?.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(p.id, { at: Date.now(), value: list });\n return list;\n })\n .finally(() => inflightModels.delete(p.id));\n inflightModels.set(p.id, 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 === \"默认\") 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 detects.delete(id);\n models.delete(id);\n } else {\n detects.clear();\n models.clear();\n }\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 } 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\";\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<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 };\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\", \"参数不对:\" + 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()) }), (p) =>\n svc.settings.set(p.patch)\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 // 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 ? \"已在设置中禁用\" : \"尚未接入\" }\n : await cachedDetect(p);\n const models = !skip && det.available ? await cachedModels(p) : [];\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 ? \"已在设置中禁用\" : 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\", \"项目不存在\");\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\", \"项目不存在\");\n if (!existsSync(proj.path)) throw new ApiError(\"bad_path\", \"目录不存在或不是文件夹\");\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\", \"项目不存在\");\n if (!existsSync(proj.path)) throw new ApiError(\"bad_path\", \"项目目录已不存在\");\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\", \"该 Agent 已在设置中禁用\");\n }\n const cat = catalogById(p.provider);\n if (!p.providerSessionId && cat && !providerCreatable(cat.status)) {\n throw new ApiError(\"bad_params\", `${cat.name} 尚未接入,暂不能新建对话`);\n }\n const meta = await svc.threads.create(p);\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\", \"对话不存在\");\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\", \"对话不存在\");\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\", \"对话不存在\");\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\", \"项目不存在\");\n if (!existsSync(proj.path)) throw new ApiError(\"bad_path\", \"项目目录已不存在\");\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\", \"项目不存在\");\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\", \"项目不存在\");\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 ?? \"终端不存在\");\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\", \"会话管理器未启动\");\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 await needManager().send(p.id, { text: p.text, attachments: p.attachments }, p.behavior ?? \"queue\");\n return { ok: true };\n }\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\", \"对话不存在\");\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 ?? \"默认\"} · ${meta.mode} · ${new Date(meta.createdAt).toLocaleString(\"zh-CN\")}`, \"\");\n for (const e of events) {\n switch (e.type) {\n case \"user_message\": L.push(`**我**${e.steered ? \"(插话)\" : \"\"}:\\n\\n${e.text}`, \"\"); break;\n case \"assistant_message\": L.push(e.text, \"\"); break;\n case \"reasoning\": L.push(`<details><summary>思考</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(\"### 计划\\n\\n\" + e.markdown, \"\"); break;\n case \"todo\": L.push(\"### 待办\\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 const dir = join(homedir(), \"Downloads\");\n await mkdir(dir, { recursive: true });\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","// 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 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 if (!cfg.parentPid) console.log(`[agent-console] 打开 http://127.0.0.1:${cfg.port}/#t=${cfg.token}`);\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 process.stdin.on(\"end\", () => shutdown(0));\n process.stdin.on(\"close\", () => shutdown(0));\n process.stdin.on(\"error\", () => shutdown(0));\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\";\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: \"服务内部错误\" } });\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: \"来源不允许\" } });\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: \"预检不允许\" } });\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: \"令牌无效\" } });\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: \"附件不存在\" } });\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: \"来源不允许\" } });\n return;\n }\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n sendJson(res, 405, { ok: false, e: { code: \"method\", message: \"方法不允许\" } });\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, \"app 还没构建(缺 app/index.html)\", { ...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: \"路径不合法\" } });\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: \"路径不允许\" } });\n return;\n }\n if (!existsSync(full) || !(await stat(full)).isFile()) {\n sendJson(res, 404, { ok: false, e: { code: \"not_found\", message: \"文件不存在\" } });\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: \"不支持的文件类型\" } });\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: \"文件太大(上限 50MB)\" } });\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: \"文件太大(上限 50MB)\" } });\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: \"接口不存在\" } });\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","// 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 { writeJsonAtomic } from \"../util/atomic.js\";\n\nexport type Settings = {\n defaultProvider: string;\n defaultMode: \"plan\" | \"default\" | \"acceptEdits\" | \"bypassPermissions\" | \"ask\";\n defaultEffort: string | null;\n sendKey: \"enter\" | \"ctrlEnter\";\n runningSend: \"queue\" | \"steer\";\n showThinking: boolean;\n density: \"comfortable\" | \"compact\";\n theme: \"auto\" | \"light\" | \"dark\";\n idleCloseMinutes: number;\n idleExitMinutes: 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 defaultEffort: null,\n sendKey: \"enter\",\n runningSend: \"queue\",\n showThinking: true,\n density: \"comfortable\",\n theme: \"auto\",\n idleCloseMinutes: 30,\n idleExitMinutes: 60,\n collapsedProjects: [],\n panel: { open: false, tab: \"changes\", width: 440 },\n sidebarWidth: 248,\n lastProjectId: null,\n lastThreadId: null,\n recentDirs: [],\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 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","// 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 { 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\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};\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 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 };\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<void> {\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;\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), text: input.text, attachments: attachmentRefs };\n rt.queue.push(q);\n this.gw.publish(`thread:${threadId}`, { type: \"queue\", queue: rt.queue });\n return;\n }\n\n await this.startTurn(threadId, input.text, attachmentRefs);\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\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 if (ev.type === \"assistant_message\" || ev.type === \"reasoning\") {\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) {\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 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\", \"授权/提问不存在或已回应\");\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\", `optionId 非法:${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\", \"仅 Cursor 对话支持该选项\");\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\", \"对话不存在\");\n const rt = this.rt(threadId);\n if (rt.status === \"running\" || rt.status === \"initializing\" || rt.starting) {\n throw new ApiError(\"busy\", \"对话运行中,不能更换 Agent\");\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\", \"已有消息,不能更换 Agent\");\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: p.capabilities.modes.includes(meta.mode) ? meta.mode : (p.capabilities.modes[0] ?? \"default\"),\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\", \"项目不存在\");\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 }\n if (opts.updateStatus) await this.setStatus(threadId, \"initializing\");\n const settings = await this.settings.get();\n const custom = settings.providerCommand?.[meta.provider];\n const launch =\n custom?.executable?.trim()\n ? { cmd: custom.executable.trim(), prefixArgs: custom.args ?? [] }\n : undefined;\n rt.session = await provider.createSession({\n threadId,\n cwd: proj.path,\n model,\n mode: 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\", \"对话不存在\");\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\", `未知 Agent:${providerId}`);\n const s = await this.settings.get();\n if (!opts.allowDisabled && !isProviderEnabled(s, providerId)) {\n throw new ApiError(\"bad_params\", `${p.name} 已在设置中禁用`);\n }\n const entry = catalogById(providerId);\n if (entry && !providerCreatable(entry.status)) {\n throw new ApiError(\"bad_params\", `${p.name} 尚未接入,暂不能新建对话`);\n }\n const det = await cachedDetect(p);\n if (!det.available) throw new ApiError(\"bad_params\", det.reason ?? `${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 private async recycleIdle(): Promise<void> {\n const s = await this.settings.get();\n const limit = (s.idleCloseMinutes ?? 30) * 60_000;\n for (const rt of this.runtimes.values()) {\n if (rt.status === \"idle\" && rt.pending.size === 0 && Date.now() - rt.lastActivity > limit) {\n log(\"info\", `空闲回收 thread ${rt.threadId}`);\n await this.close(rt.threadId);\n }\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\";\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 ? \"找不到 git(请先安装 git 并加入 PATH)\" : 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: \"路径不允许\" };\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: \"文件不存在\" };\n const s = await stat(full);\n if (!s.isFile()) return { error: \"不是文件\" };\n if (s.size > DIFF_LIMIT) return { tooLarge: true };\n const text = await readFile(full, \"utf8\").catch(() => null);\n if (text === null) return { error: \"二进制或无法读取\" };\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: \"路径不允许\" };\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: \"路径不允许\" };\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: \"文件不存在\" };\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\";\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: \"路径不允许\" };\n const abs = join(projectPath, rel);\n const s = await stat(abs).catch(() => null);\n if (!s?.isDirectory()) return { error: \"目录不存在\" };\n const ig = await this.igFor(projectPath);\n const dirents = await readdir(abs, { withFileTypes: true }).catch(() => null);\n if (!dirents) return { error: \"无法读取目录\" };\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: \"路径不允许\" };\n const abs = join(projectPath, rel);\n const s = await stat(abs).catch(() => null);\n if (!s) return { error: \"文件不存在\" };\n if (!s.isFile()) return { error: \"不是文件\" };\n if (s.size > MAX_READ) return { tooLarge: true };\n const buf = await readFile(abs).catch(() => null);\n if (!buf) return { error: \"无法读取\" };\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\";\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: `每个项目最多 ${MAX_TERMS_PER_PROJECT} 个终端` };\n const shell = pickShell();\n const term: Term = {\n id: rid(), index: nextIndex++, projectId, cwd, title: `终端 ${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: \"终端不存在\" };\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","i","j","resolve","statSync","homedir","sep","readFile","existsSync","path","findNode","existsSync","readFile","rid","resolve","readFile","stat","existsSync","join","homedir","rec","str","path","readdir","readFile","stat","join","homedir","str","path","rec","spawn","str","rec","trunc","MAX_OUTPUT","init_map","readdir","readFile","stat","homedir","join","path","rid","init_session","init_map","resolve","runVersion","INSTALL_HINT","models","init_provider","init_session","readFile","writeFile","rid","methods","init_session","resolve","runVersion","cfg","init_provider","init_session","models","send","init_provider","acp","init_provider","execFile","existsSync","statSync","readFile","homedir","join","path","EFFORT_LABEL","existsSync","statSync","mkdir","writeFile","homedir","dirname","join","execFile","p","models","isDir","path","stamp","writeFile","mkdir","dirname","readFile","mkdir","rename","writeFile","dirname","cp","mkdir","readdir","readFile","existsSync","join","mkdirSync","rmSync","chmodSync","join","dirname","fileURLToPath","join","dirname","fileURLToPath","dirname","fileURLToPath","join","existsSync","join","cfg","data","join","existsSync","stat","readFile","join","extname","randomBytes","MIME","readdir","readFile","join","readFile","existsSync","statSync","join","randomBytes","path","mkdir","rename","readdir","readFile","join","randomBytes","newId","stamp","randomBytes","randomBytes","cfg","models","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","sep","dirname","mkdirSync","join","fileURLToPath","bindAttachmentStore","migrateLegacy","warmProviderCache","chmodSync","rmSync"]}