dsh-vscode-mode 0.1.16 → 0.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -0
- package/lib/client.js +31 -4
- package/lib/client.js.map +1 -1
- package/lib/index.js +168 -3
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
- package/src/client/styles/mcp.css +9 -0
- package/src/client/ui/McpSettings.ts +32 -1
- package/src/compat.ts +3 -2
- package/src/devForm.ts +133 -0
- package/src/rpc.ts +11 -0
- package/src/shared/compat.ts +7 -0
- package/src/shared/rpc.ts +5 -1
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["React","React","React","React","React","React","React","React","React"],"sources":["../src/shared/rpc.ts","../src/client/rpc.ts","../src/client/events.ts","../src/client/monaco/loader.ts","../src/client/monaco/diffRender.ts","../src/shared/diff.ts","../src/client/state/records.ts","../src/client/state/regions.ts","../src/client/ui/QuickOpen.ts","../src/client/ui/shared.ts","../src/client/ui/DiffBox.ts","../src/client/ui/DiffBarEmpty.ts","../src/client/ui/DiffLauncher.ts","../src/client/ui/EditorView.ts","../src/client/ui/DiffBadge.ts","../src/client/compat.ts","../src/client/fileOpeners.ts","../src/client/settingsContext.ts","../src/client/ui/McpSettings.ts","../src/client/openPathRouter.ts","../src/client/index.ts"],"sourcesContent":["/**\n * dsh-vscode-mode RPC contract — method names, per-method request/ok payloads,\n * and the typed handler map shared by the host dispatcher and the client\n * fetch wrapper. 载荷形状与历史实现一字不差,仅把隐式约定类型化。\n *\n * Purity rule: no node/react imports (same as types.ts).\n * 作者 ddj 2026-08-20\n */\nimport type {\n ArchiveBatch,\n ArchiveEntry,\n RecordView,\n StaleHunk,\n} from './types.js'\nimport type { MpcConfig, MpcProject, MpcProjectSaveInput, MpcServer } from './mcp.js'\nimport type { CompatReport } from './compat.js'\n\n/** webServer 精确路由。 */\nexport const RPC_PATH = '/edrv/rpc'\n\n/** 决策作用域:call=整条记录,hunk=单个差异块。 */\nexport type RpcScope = 'call' | 'hunk'\n\n/** 每个方法的请求参数(sessionId 为公共可选字段)。 */\nexport interface RpcRequestMap {\n 'edrv.list': { sessionId?: string; callIds?: string[] }\n 'edrv.accept': { sessionId?: string; callId: string; scope?: RpcScope; hunkIndex?: number }\n 'edrv.reject': { sessionId?: string; callId: string; scope?: RpcScope; hunkIndex?: number }\n 'edrv.read': { sessionId?: string; path: string }\n 'edrv.original': { sessionId?: string; path: string }\n 'edrv.save': { sessionId?: string; path: string; content: string }\n 'edrv.archiveList': { sessionId?: string }\n 'edrv.archiveRead': { sessionId?: string; path?: string }\n 'edrv.rollback': { sessionId?: string; path: string; batch?: number }\n 'edrv.debug': { sessionId?: string; text: string }\n 'edrv.searchFiles': { sessionId?: string; query: string }\n 'mcp.list': {}\n 'mcp.save': { config: MpcConfig }\n 'mcp.remove': { id: string }\n 'mcp.toggle': { id: string; enabled: boolean }\n 'mcp.refresh': { id: string }\n 'mcp.projects': {}\n 'mcp.projectSave': MpcProjectSaveInput\n 'mcp.projectRemove': { workspacePath: string; serverName: string }\n 'mcp.projectToggle': { workspacePath: string; serverName: string; enabled: boolean }\n 'mcp.projectRefresh': { workspacePath: string; serverName: string }\n 'vscode.fileOpenSettingsGet': {}\n 'vscode.fileOpenSettingsUpdate': { fileOpenTool: string; expectedRevision?: number }\n 'compat': {}\n}\n\nexport type RpcMethod = keyof RpcRequestMap\n\n/** 每个方法成功(ok:true)时的附加载荷。 */\nexport interface RpcOkMap {\n 'edrv.list': { records: RecordView[] }\n 'edrv.accept': { record: RecordView }\n 'edrv.reject': { record: RecordView }\n 'edrv.read': { content: string; size: number }\n 'edrv.original': { content: string; size: number; stale: StaleHunk[]; fallback: boolean }\n 'edrv.save': object\n 'edrv.archiveList': { entries: ArchiveEntry[] }\n 'edrv.archiveRead': { batches: ArchiveBatch[] }\n 'edrv.rollback': { path: string; batch: number | null }\n 'edrv.debug': object\n 'edrv.searchFiles': { files: string[]; truncated: boolean }\n 'mcp.list': { servers: MpcServer[] }\n 'mcp.save': { server: MpcServer }\n 'mcp.remove': object\n 'mcp.toggle': { server: MpcServer }\n 'mcp.refresh': { server: MpcServer }\n 'mcp.projects': { projects: MpcProject[] }\n 'mcp.projectSave': { project: MpcProject }\n 'mcp.projectRemove': { project: MpcProject }\n 'mcp.projectToggle': { project: MpcProject }\n 'mcp.projectRefresh': { project: MpcProject }\n 'vscode.fileOpenSettingsGet': { fileOpenTool: string; revision?: number }\n 'vscode.fileOpenSettingsUpdate': { fileOpenTool: string; revision?: number }\n 'compat': { report: CompatReport }\n}\n\n/** 统一响应:{ok:true, ...payload} 或 {ok:false, error}。 */\nexport type RpcResult<M extends RpcMethod> =\n | ({ ok: true } & RpcOkMap[M])\n | { ok: false; error: string }\n\n/** 每个方法的 handler 签名(host 分发表与 client 类型检查共用)。 */\nexport type RpcHandler<M extends RpcMethod> = (\n args: RpcRequestMap[M],\n) => Promise<RpcResult<M>>\n\n/** host RPC 分发表:method → handler。 */\nexport type RpcHandlerMap = {\n [M in RpcMethod]: RpcHandler<M>\n}\n","/**\n * dsh-vscode-mode client — 类型化 RPC 包装 + 诊断日志。\n * 迁移自原 src/client/index.ts 的 rpc/dbg,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport { RPC_PATH } from '../shared/rpc.js'\nimport type { RpcMethod, RpcRequestMap, RpcResult } from '../shared/rpc.js'\n\n/** 同源 RPC 调用(host /edrv/rpc 精确路由)。 */\nexport function rpc<M extends RpcMethod>(method: M, args: RpcRequestMap[M]): Promise<RpcResult<M>> {\n return fetch(RPC_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ method, args }),\n }).then((res) => res.json()) as Promise<RpcResult<M>>\n}\n\n/**\n * 诊断日志:统一走 host edrv.debug 落盘,避免 console 刷屏。\n * @author ddj 2026年08月20号\n * @param sessionId 会话 id\n * @param text 日志文本\n */\nexport function dbg(sessionId: string | undefined, text: string): void {\n try {\n rpc('edrv.debug', { sessionId, text }).catch(() => {})\n } catch (e) { /* 日志失败忽略 */ }\n}\n","/**\n * dsh-vscode-mode client — 跨组件/跨 slot 的窗口事件助手。\n * 迁移自原 src/client/index.ts 的 openEditorView 与事件派发,语义不改。\n * 作者 ddj 2026-08-20\n */\n\n/**\n * 打开中央「文件编辑」页签:点击 shell 会话头部的视图页签(DOM 级,无需 store actions)。\n * @author ddj 2026年08月20号\n * @param path 要打开的路径(可空)\n */\nexport function openEditorView(path: string | null): void {\n const tabs = Array.from(document.querySelectorAll('div[role=\"tablist\"] button[role=\"tab\"]'))\n for (const b of tabs) {\n if (b.textContent && b.textContent.includes('文件编辑')) { (b as HTMLButtonElement).click(); break }\n }\n const p = path ?? null\n setTimeout(() => {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path: p } }))\n }, 80)\n}\n\n/** 差异状态变化:触发角标/DiffBox 重拉。 */\nexport function emitRefresh(): void {\n window.dispatchEvent(new CustomEvent('edrv:refresh'))\n}\n\n/** 打开指定路径到编辑区页签。 */\nexport function emitOpenEditor(path: string): void {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path } }))\n}\n\n/** 拉起 DiffLauncher。 */\nexport function emitShowLauncher(): void {\n window.dispatchEvent(new CustomEvent('edrv:show-launcher'))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — Monaco 加载与语言映射(AMD 构建,离线随包分发)。\n * 迁移自原 src/client/index.ts 的 MONACO_BASE/LANG_BY_EXT/langOf/loadMonaco,语义不改。\n * 作者 ddj 2026-08-20\n */\n\nexport const MONACO_BASE = '/edrv/vendor/monaco/vs'\nlet monacoPromise = null\nlet monacoStage = { phase: 'idle', progress: 0, message: '准备加载 Monaco…' }\nconst stageListeners = new Set()\n\n/**\n * Monaco 加载阶段:这是阶段进度而非网络字节进度,避免误导用户。\n * @author ddj 2026年08月22号\n */\nexport const MONACO_STAGES = {\n loader: { progress: 18, message: '加载 Monaco 引导模块…' },\n core: { progress: 72, message: '加载编辑器核心模块…' },\n ready: { progress: 100, message: 'Monaco 编辑器已就绪' },\n error: { progress: 0, message: 'Monaco 编辑器加载失败' },\n}\n\n/**\n * 发布 Monaco 加载阶段,监听器异常不得影响编辑器加载。\n * @author ddj 2026年08月22号\n * @param phase 阶段名\n * @param progress 阶段百分比\n * @param message 用户可读状态\n */\nfunction publishStage(phase, progress, message) {\n monacoStage = { phase, progress, message }\n for (const listener of stageListeners) {\n try { listener(monacoStage) } catch (error) { /* UI 回调异常忽略 */ }\n }\n}\n\n/**\n * 订阅 Monaco 加载阶段。\n * @author ddj 2026年08月22号\n * @param listener 阶段回调\n * @returns 取消订阅函数\n */\nfunction subscribeStage(listener) {\n if (typeof listener !== 'function') return () => {}\n stageListeners.add(listener)\n listener(monacoStage)\n return () => stageListeners.delete(listener)\n}\n\n/** 扩展名 → Monaco language id(常见语言;未知回退 plaintext)。 */\nexport const LANG_BY_EXT = {\n js: 'javascript', jsx: 'javascript', mjs: 'javascript', cjs: 'javascript',\n ts: 'typescript', tsx: 'typescript', mts: 'typescript', cts: 'typescript',\n json: 'json', jsonc: 'json', md: 'markdown', markdown: 'markdown', mdx: 'mdx',\n css: 'css', scss: 'scss', less: 'less', html: 'html', htm: 'html', vue: 'html', xml: 'xml',\n yaml: 'yaml', yml: 'yaml', toml: 'ini', ini: 'ini', cfg: 'ini',\n py: 'python', sh: 'shell', bash: 'shell', zsh: 'shell', ps1: 'powershell',\n lua: 'lua', java: 'java', c: 'c', h: 'c', cpp: 'cpp', cc: 'cpp', cxx: 'cpp', hpp: 'cpp',\n cs: 'csharp', go: 'go', rs: 'rust', rb: 'ruby', php: 'php', sql: 'sql',\n swift: 'swift', kt: 'kotlin', kts: 'kotlin', dart: 'dart', dockerfile: 'dockerfile'\n}\n\n/**\n * 路径 → Monaco language id:取 basename 扩展名(dockerfile/Dockerfile 特判)。\n * @author ddj 2026年08月20号\n * @param path 文件路径\n * @returns language id\n */\nexport function langOf(path) {\n const base = String(path || '').split(/[\\\\/]/).pop() || ''\n if (/^dockerfile$/i.test(base)) return 'dockerfile'\n const dot = base.lastIndexOf('.')\n if (dot <= 0) return 'plaintext'\n return LANG_BY_EXT[base.slice(dot + 1).toLowerCase()] ?? 'plaintext'\n}\n\n/**\n * 加载 Monaco Editor(AMD 构建,随插件包离线分发):注入 loader.js → require.config → editor.main。\n * @author ddj 2026年08月20号\n * @returns Promise<object> window.monaco\n */\nexport function loadMonaco(onProgress) {\n const unsubscribe = subscribeStage(onProgress)\n if (!monacoPromise) {\n publishStage('loader', MONACO_STAGES.loader.progress, MONACO_STAGES.loader.message)\n monacoPromise = new Promise((resolve, reject) => {\n const fail = (error) => {\n monacoPromise = null\n publishStage('error', MONACO_STAGES.error.progress, MONACO_STAGES.error.message)\n reject(error)\n }\n const boot = () => {\n try {\n window.require.config({ paths: { vs: MONACO_BASE } })\n publishStage('core', MONACO_STAGES.core.progress, MONACO_STAGES.core.message)\n window.require(['vs/editor/editor.main'], () => {\n publishStage('ready', MONACO_STAGES.ready.progress, MONACO_STAGES.ready.message)\n resolve(window.monaco)\n }, (err) => fail(new Error('Monaco 模块加载失败:' + String(err))))\n } catch (error) {\n fail(error)\n }\n }\n const existing = document.querySelector('script[data-edrv-monaco-loader]')\n if (existing) boot()\n else {\n const s = document.createElement('script')\n s.src = MONACO_BASE + '/loader.js'\n s.dataset.edrvMonacoLoader = '1'\n s.onload = boot\n s.onerror = () => fail(new Error('Monaco loader 加载失败'))\n document.head.appendChild(s)\n }\n })\n }\n return monacoPromise.finally(unsubscribe)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 行内差异自绘(新增行绿底 + glyph margin '+';删除块 view zone 红底)。\n * 迁移自原 src/client/index.ts 的 diff-render effect,语义不改。\n * 作者 ddj 2026-08-20\n */\n\n/**\n * 差异渲染器(每 EditorView 挂载一个,内部持有 zone/decoration 状态)。\n * @param log 诊断日志函数((sessionId, text) => void)\n */\nexport function createDiffRenderer(log) {\n let viewZoneIds = []\n let decorations = []\n\n /**\n * 渲染当前 pending 差异:绿底 decoration + 删除块 view zones + '-' 号 overlay(滚动同步)。\n * @param monaco window.monaco\n * @param editor Monaco 编辑器实例\n * @param pendingRegions 待处理差异区域\n * @param sessionId 会话 id\n */\n const render = (monaco, editor, pendingRegions, sessionId) => {\n const renderT0 = Date.now()\n const callIdAttr = (callId, idx) => String(callId) + ':' + String(idx)\n log(sessionId, '[diff-render] begin regs=' + pendingRegions.length + ' ' + pendingRegions.map((r) => callIdAttr(r.callId, r.idx) + '@' + (r.start ?? '?') + '-' + (r.end ?? '?') + '(-' + (r.oldLines ? r.oldLines.length : 0) + '/+' + (r.newLines ? r.newLines.length : 0) + ')').join('|'))\n\n const decos = []\n for (const r of pendingRegions) {\n if (r.start === undefined || r.end === undefined) continue\n if (r.newLines && r.newLines.length) {\n decos.push({\n range: new monaco.Range(r.start, 1, Math.max(r.start, r.end - 1), 1),\n options: { isWholeLine: true, className: 'edrv-mn-add-line', linesDecorationsClassName: 'edrv-mn-gutter-add' },\n })\n }\n }\n decorations = editor.deltaDecorations(decorations, decos)\n\n // 删除块 view zones(红底 + 正文;- 号由独立 overlay 层渲染,定位在 decoration 列与 + 同列,\n // 不受 view zone 容器定位/裁剪影响;滚动用 translateY 同步)\n let createdZones = []\n editor.changeViewZones((accessor) => {\n for (const id of viewZoneIds) { try { accessor.removeZone(id) } catch (e) { /* 已移除 */ } }\n viewZoneIds = []\n const zones = []\n for (const r of pendingRegions) {\n if (r.create) continue\n const oldLines = r.oldLines && r.oldLines.length ? r.oldLines : null\n if (!oldLines) continue\n const after = Math.max(0, (r.start ?? 1) - 1)\n const domNode = document.createElement('div')\n domNode.className = 'edrv-del-zone'\n domNode.dataset.edrvHunk = callIdAttr(r.callId, r.idx)\n for (const t of oldLines) {\n const row = document.createElement('div')\n row.className = 'edrv-del-row'\n const text = document.createElement('span')\n text.className = 'edrv-del-text'\n text.textContent = t\n row.appendChild(text)\n domNode.appendChild(row)\n }\n const id = accessor.addZone({\n afterLineNumber: after,\n heightInLines: oldLines.length,\n domNode,\n suppressMouseDown: false,\n })\n viewZoneIds.push(id)\n zones.push({ domNode, after, n: oldLines.length })\n }\n createdZones = zones\n })\n\n if (createdZones.length) {\n const root = editor.getDomNode()\n if (root) {\n let overlay = root.querySelector('.edrv-minus-overlay')\n if (!overlay) {\n overlay = document.createElement('div')\n overlay.className = 'edrv-minus-overlay'\n root.appendChild(overlay)\n }\n overlay.innerHTML = ''\n const lineH = editor.getOption(monaco.editor.EditorOption.lineHeight) || 20\n let li = null\n try { li = editor.getLayoutInfo() } catch (e) { /* ignore */ }\n const rawLeft = li ? li.decorationsLeft : 0\n const width = li && li.decorationsWidth > 0 ? li.decorationsWidth : 16\n // decorationsLeft 是 Monaco 内部坐标,需限制在宿主根节点内,避免窄窗口/边框\n // 或布局尚未完成时把减号绘制到编辑器左、右边界之外。\n const maxLeft = Math.max(0, root.clientWidth - width)\n // 字符本身有少量字体侧向留白;给标记列留出 4px 内缩,避免减号半个\n // 字符落到 Monaco 根节点左边框外,同时仍限制右侧不越界。\n const markerInset = 12\n const left = Math.max(0, Math.min(maxLeft, rawLeft + markerInset))\n const lineCount = editor.getModel().getLineCount()\n let itemIdx = 0\n let zi = 0\n for (const z of createdZones) {\n // 用 Monaco 坐标 API 计算 view zone 顶部,避免离屏 zone DOM 未布局导致 getBoundingClientRect 为 0\n const anchor = Math.min(z.after + 1, lineCount)\n let zoneBottom = editor.getTopForLineNumber(anchor)\n if (z.after >= lineCount) zoneBottom += lineH\n const zoneTop = zoneBottom - z.n * lineH\n for (let i = 0; i < z.n; i++) {\n const item = document.createElement('div')\n item.className = 'edrv-minus-item'\n // 使用 CSS 线段代替文本字符,避免不同字体的侧向留白把 “-” 绘制到边界外。\n item.textContent = ''\n item.style.width = width + 'px'\n item.style.height = lineH + 'px'\n item.dataset.zone = String(zi)\n item.dataset.row = String(i)\n item.style.top = (zoneTop + i * lineH) + 'px'\n item.style.left = left + 'px'\n overlay.appendChild(item)\n itemIdx++\n }\n zi++\n }\n log(sessionId, '[diff-render] placed zones=' + createdZones.length + ' items=' + itemIdx + ' left=' + left + ' w=' + width + ' t+' + (Date.now() - renderT0) + 'ms')\n // 滚动同步:overlay 随内容滚动(内容坐标 - scrollTop)\n const syncScroll = () => {\n const s2 = editor.getScrollTop() || 0\n if (overlay) overlay.style.transform = 'translateY(' + (-s2) + 'px)'\n }\n syncScroll()\n overlay.__edrvSync = syncScroll\n if (!overlay.__edrvBound) {\n overlay.__edrvBound = true\n editor.onDidScrollChange(syncScroll)\n }\n // 已可见的 zone 用真实 DOM 坐标做一次微调(离屏 zone 仍保留坐标 API 位置)\n setTimeout(() => {\n try {\n const edRect = root.getBoundingClientRect()\n const st = editor.getScrollTop() || 0\n const items = overlay.querySelectorAll('.edrv-minus-item')\n let correctedLeft = left\n try {\n const layout = editor.getLayoutInfo()\n const markerWidth = layout.decorationsWidth > 0 ? layout.decorationsWidth : width\n correctedLeft = Math.max(0, Math.min(Math.max(0, root.clientWidth - markerWidth), (layout.decorationsLeft || 0) + 12))\n } catch (e) { /* 保留首次布局计算结果 */ }\n for (const item of items) {\n item.style.left = correctedLeft + 'px'\n const zIndex = Number(item.dataset.zone)\n const rIndex = Number(item.dataset.row)\n const z = createdZones[zIndex]\n if (!z || !z.domNode.isConnected) continue\n const rowEl = z.domNode.querySelectorAll('.edrv-del-row')[rIndex]\n if (!rowEl) continue\n const rowRect = rowEl.getBoundingClientRect()\n if (rowRect.height > 0) {\n item.style.top = (rowRect.top - edRect.top + st) + 'px'\n }\n }\n } catch (e) { log(sessionId, '[diff-render] correct fail ' + String(e)) }\n }, 50)\n }\n } else {\n const root = editor.getDomNode()\n const overlay = root && root.querySelector('.edrv-minus-overlay')\n if (overlay) overlay.innerHTML = ''\n }\n }\n\n /** 卸载清理(EditorView unmount 时调用)。 */\n const dispose = () => {\n viewZoneIds = []\n decorations = []\n }\n\n return { render, dispose }\n}\n","/**\n * dsh-vscode-mode shared diff primitives — 快照指纹、hunk 规范化与安全定位。\n * 不依赖 Node/React,host 与 browser 共用,避免各层用不同 indexOf 语义。\n * 作者 ddj 2026-08-24\n */\nimport type { Hunk, RecordBase } from './types.js'\n\n/** 文件读取状态,区分真实空文件与无法读取/过大的文件。 */\nexport type ReadState =\n | { kind: 'content'; content: string }\n | { kind: 'missing' }\n | { kind: 'unavailable' }\n\n/** 文本中的一个半开区间 [start,end)。 */\nexport interface TextRange {\n start: number\n end: number\n}\n\n/** 一条 hunk 在当前内容中的定位结果。 */\nexport interface HunkLocation extends TextRange {\n idx: number\n hunk: Hunk\n matched: boolean\n}\n\n/** 统一取对应 hunk;callHunk 只用于旧记录缺失 hunks 时兼容。 */\nexport function preciseHunk(record: Pick<RecordBase, 'hunks' | 'callHunk'>, idx: number): Hunk | null {\n return hunkOf(record, idx)\n}\n\n/** 轻量、确定性的字符串指纹;不引入 Node crypto。 */\nexport function fingerprint(text: string | null | undefined): string | null {\n if (typeof text !== 'string') return null\n let hash = 2166136261\n for (let i = 0; i < text.length; i++) {\n hash ^= text.charCodeAt(i)\n hash = Math.imul(hash, 16777619)\n }\n return 'fnv1a:' + (hash >>> 0).toString(16) + ':' + text.length\n}\n\n/** 取记录第 idx 个有效 hunk;只有记录缺 hunk 时才回退 callHunk。 */\nexport function hunkOf(record: Pick<RecordBase, 'hunks' | 'callHunk'>, idx: number): Hunk | null {\n const hunk = Array.isArray(record.hunks) ? record.hunks[idx] : undefined\n if (hunk && typeof hunk.newText === 'string') return hunk\n if (idx === 0 && record.callHunk && typeof record.callHunk.newText === 'string') return record.callHunk\n return null\n}\n\n/** hunk 是否表示没有实际内容变化。 */\nexport function isNoopHunk(hunk: Hunk | null | undefined): boolean {\n return !!hunk && hunk.oldText !== null && hunk.oldText === hunk.newText\n}\n\n/** splitLines 的空文本语义:真实空文件没有一行变更内容。 */\nexport function splitLines(text: string): string[] {\n return text.length ? text.split('\\n') : []\n}\n\n/** 为执行后 hunk 写入快照坐标;空 newText 通过 before/after 公共边界定位删除点。 */\nexport function annotateHunk(hunk: Hunk, before: string | null, after: string | null): Hunk {\n return annotateHunks([hunk], before, after)[0]\n}\n\n/** 按文件顺序为多 hunk 写入不重复的 after 坐标。 */\nexport function annotateHunks(hunks: Hunk[], before: string | null, after: string | null): Hunk[] {\n if (typeof after !== 'string') return hunks\n let cursor = 0\n return hunks.map((hunk) => {\n if (hunk.newText.length > 0) {\n const start = after.indexOf(hunk.newText, cursor)\n if (start >= 0) {\n cursor = start + hunk.newText.length\n return { ...hunk, afterStart: start, afterEnd: cursor }\n }\n return hunk\n }\n if (hunks.length !== 1 || typeof before !== 'string' || before === after || hunk.oldText === null) return hunk\n const prefix = commonPrefix(before, after)\n const suffix = commonSuffix(before, after, prefix)\n const removedStart = prefix\n const removedEnd = Math.max(removedStart, before.length - suffix)\n return { ...hunk, afterStart: removedStart, afterEnd: removedStart, beforeStart: removedStart, beforeEnd: removedEnd }\n })\n}\n\n/** 计算两个文本的最长公共前缀长度。 */\nfunction commonPrefix(left: string, right: string): number {\n const limit = Math.min(left.length, right.length)\n let i = 0\n while (i < limit && left.charCodeAt(i) === right.charCodeAt(i)) i++\n return i\n}\n\n/** 计算不与 prefix 重叠的最长公共后缀长度。 */\nfunction commonSuffix(left: string, right: string, prefix: number): number {\n const limit = Math.min(left.length, right.length) - prefix\n let i = 0\n while (i < limit && left.charCodeAt(left.length - 1 - i) === right.charCodeAt(right.length - 1 - i)) i++\n return i\n}\n\n/** 计算 index 前的 0 基行数。 */\nexport function lineBefore(text: string, index: number): number {\n let n = 0\n const end = Math.max(0, Math.min(index, text.length))\n for (let i = 0; i < end; i++) if (text.charCodeAt(i) === 10) n++\n return n\n}\n\n/** 找出文本的全部非重叠出现位置。 */\nfunction allMatches(content: string, needle: string): TextRange[] {\n if (!needle.length) return []\n const out: TextRange[] = []\n let from = 0\n while (from <= content.length - needle.length) {\n const at = content.indexOf(needle, from)\n if (at < 0) break\n out.push({ start: at, end: at + needle.length })\n from = at + Math.max(1, needle.length)\n }\n return out\n}\n\n/**\n * 从 after 快照定位所有 hunk,按 hunk 顺序优先选未占用且靠近前一块的候选。\n * 若 hunk 带 afterStart/afterEnd,则优先验证快照坐标,避免重复文本错配。\n * @author ddj 2026年08月24号\n * @param content 当前文件内容\n * @param hunks 待定位 hunk\n * @returns 每个 hunk 一个结果,matched=false 表示冲突/stale\n */\nexport function locateHunks(content: string, hunks: Hunk[]): HunkLocation[] {\n const locations: HunkLocation[] = []\n let cursor = 0\n const occupied: TextRange[] = []\n for (let idx = 0; idx < hunks.length; idx++) {\n const hunk = hunks[idx]\n const newText = hunk.newText\n const snapshot = Number.isInteger(hunk.afterStart) && Number.isInteger(hunk.afterEnd)\n ? { start: hunk.afterStart as number, end: hunk.afterEnd as number }\n : null\n const snapshotMatches = snapshot && snapshot.start >= 0 && snapshot.end >= snapshot.start\n && (newText.length === 0 || content.slice(snapshot.start, snapshot.end) === newText)\n ? snapshot\n : null\n const candidates = snapshotMatches ? [snapshotMatches] : allMatches(content, newText)\n const candidate = candidates.find((range) => range.start >= cursor && !occupied.some((used) => overlaps(range, used)))\n ?? candidates.find((range) => !occupied.some((used) => overlaps(range, used)))\n if (candidate) {\n locations.push({ idx, hunk, ...candidate, matched: true })\n occupied.push(candidate)\n cursor = Math.max(cursor, candidate.end)\n continue\n }\n if (newText.length === 0 && hunk.afterStart === undefined && hunk.afterEnd === undefined && content.length === 0) {\n const point = { start: 0, end: 0 }\n locations.push({ idx, hunk, ...point, matched: true })\n continue\n }\n if (newText.length === 0 && hunk.afterStart !== undefined && hunk.afterEnd !== undefined\n && hunk.afterStart === hunk.afterEnd && hunk.afterStart >= 0 && hunk.afterStart <= content.length) {\n const point = { start: hunk.afterStart, end: hunk.afterEnd }\n if (!occupied.some((used) => overlaps(point, used))) {\n locations.push({ idx, hunk, ...point, matched: true })\n occupied.push(point)\n cursor = Math.max(cursor, point.end)\n continue\n }\n }\n locations.push({ idx, hunk, start: -1, end: -1, matched: false })\n }\n return locations\n}\n\n/** 判断两个半开区间是否重叠。零长度区间只与同一位置的零长度区间重叠。 */\nfunction overlaps(left: TextRange, right: TextRange): boolean {\n if (left.start === left.end || right.start === right.end) return left.start === right.start && left.end === right.end\n return left.start < right.end && right.start < left.end\n}\n\n/** 在可定位区间上执行一次 hunk 反向替换。 */\nexport function replaceRange(content: string, location: HunkLocation, reverse = false): string | null {\n if (!location.matched || location.start < 0) return null\n const replacement = reverse ? (location.hunk.oldText ?? '') : location.hunk.newText\n return content.slice(0, location.start) + replacement + content.slice(location.end)\n}\n\n/** 按当前内容中出现的位置从后向前应用 hunk,避免前块长度变化影响后块。 */\nexport function applyLocations(content: string, locations: HunkLocation[], reverse = false): { content: string; stale: number[] } {\n const stale = locations.filter((location) => !location.matched).map((location) => location.idx)\n let out = content\n const matched = locations.filter((location) => location.matched).sort((a, b) => b.start - a.start)\n for (const location of matched) {\n const next = replaceRange(out, location, reverse)\n if (next === null) stale.push(location.idx)\n else out = next\n }\n return { content: out, stale: stale.sort((a, b) => a - b) }\n}\n","/**\n * dsh-vscode-mode client — 记录/差异状态纯函数(可单测)。\n * 迁移自原 src/client/index.ts 前段,语义一字不改。\n * 作者 ddj 2026-08-20\n */\nimport type { CallHunk, Hunk, RecordView } from '../../shared/types.js'\nimport { preciseHunk } from '../../shared/diff.js'\n\n/** 差异决策状态。 */\nexport const ST = { PENDING: 'pending', ACCEPTED: 'accepted', REJECTED: 'rejected' } as const\nexport type Status = 'pending' | 'accepted' | 'rejected'\n\n/** 记录视图摘要(按文件分组)。 */\nexport interface FileSummary {\n path: string\n recs: RecordView[]\n pending: number\n}\nexport interface Summary {\n files: FileSummary[]\n pendingFiles: FileSummary[]\n totalFiles: number\n}\n\n/** hunk 的 DOM 定位 key(callId:idx)。 */\nexport function callIdAttr(callId: string, idx: number): string {\n return String(callId) + ':' + String(idx)\n}\n\n/** 某 hunk 的当前决策状态(缺省 pending)。 */\nexport function statusAt(rec: RecordView | undefined, idx: number): Status {\n if (!rec) return ST.PENDING\n if (Array.isArray(rec.decisions?.perHunk) && rec.decisions.perHunk[idx] !== undefined) return rec.decisions.perHunk[idx] as Status\n return (rec.decisions?.call as Status) ?? ST.PENDING\n}\n\n/** hunk 是否为空差异(old===new,无实际内容变化,不可操作)。create 记录不视为空差异。 */\nexport function noopHunk(rec: RecordView | undefined, h: Hunk | CallHunk | null | undefined): boolean {\n if (!rec || rec.create === true) return false\n const precise = rec && h && rec.hunks.indexOf(h as Hunk) >= 0\n ? preciseHunk(rec, rec.hunks.indexOf(h as Hunk))\n : h\n const oldText = precise?.oldText ?? null\n const newText = precise?.newText ?? null\n return oldText !== null && oldText === newText\n}\n\n/** 记录是否仍有待处理差异(superseded / 全部已决策 = false)。 */\nexport function isRecPending(rec: RecordView): boolean {\n if (!rec || rec.superseded === true || rec.conflict === true) return false\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n if (perHunk.length) {\n // 只认存在至少一个\"非空差异且未决策\"的 hunk\n for (let i = 0; i < perHunk.length; i++) {\n if (perHunk[i] !== 'accepted' && perHunk[i] !== 'rejected' && !noopHunk(rec, (rec.hunks || [])[i])) return true\n }\n return false\n }\n return rec.decisions.call === 'pending' || rec.decisions.call === undefined\n}\n\n/** 记录待处理差异\"处\"数(按 hunk,跳过空差异)。 */\nexport function pendingCount(recs: RecordView[]): number {\n let n = 0\n for (const rec of recs) {\n if (!isRecPending(rec)) continue\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n if (perHunk.length) {\n for (let i = 0; i < perHunk.length; i++) {\n if (perHunk[i] === 'pending' && !noopHunk(rec, (rec.hunks || [])[i])) n++\n }\n } else {\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (const h of hunks) if (!noopHunk(rec, h)) n++\n if (!hunks.length && !noopHunk(rec, rec.callHunk)) n = Math.max(n, 1)\n }\n }\n return n\n}\n\n/** 按文件分组的差异摘要(角标/Launcher 用)。 */\nexport function summarize(records: RecordView[]): Summary {\n const byPath = new Map<string, RecordView[]>()\n for (const r of records) {\n if (!byPath.has(r.path)) byPath.set(r.path, [])\n byPath.get(r.path)!.push(r)\n }\n const files: FileSummary[] = []\n for (const [path, recs] of byPath) files.push({ path, recs, pending: pendingCount(recs) })\n files.sort((a, b) => (a.path < b.path ? -1 : 1))\n const pendingFiles = files.filter((f) => f.pending > 0)\n return { files, pendingFiles, totalFiles: pendingFiles.length }\n}\n","/**\n * dsh-vscode-mode client — 差异区域计算纯函数(可单测)。\n * 迁移自原 src/client/index.ts 的 diffRegions/trimCommonLines/countLinesBefore,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport type { Hunk, RecordView } from '../../shared/types.js'\nimport { locateHunks, lineBefore, preciseHunk, splitLines } from '../../shared/diff.js'\nimport { ST, noopHunk, statusAt } from './records.js'\nimport type { Status } from './records.js'\n\n/** 差异区域(文件内一段待处理/已处理的变更)。 */\nexport interface Region {\n callId: string\n idx: number\n start?: number\n end?: number\n oldLines: string[]\n newLines: string[]\n whole?: boolean\n status: Status\n create: boolean\n rec: RecordView\n superseded: boolean\n stale?: boolean\n}\n\n/** 统计 index 之前(不含)的换行数 → 0 基行号。 */\nexport function countLinesBefore(text: string, index: number): number {\n return lineBefore(text, index)\n}\n\n/**\n * 行级公共前缀/后缀裁剪:old/new 首尾相同的行视为未变化(上下文),只保留真正变更的中间段。\n * @author ddj 2026年08月20号\n * @param oldLines 替换前内容按行拆分\n * @param newLines 替换后内容按行拆分\n * @returns 裁剪后的变更段与公共前缀行数\n */\nexport function trimCommonLines(oldLines: string[], newLines: string[]): { oldLines: string[]; newLines: string[]; shift: number } {\n let prefix = 0\n const maxPrefix = Math.min(oldLines.length, newLines.length)\n while (prefix < maxPrefix && oldLines[prefix] === newLines[prefix]) prefix++\n let suffix = 0\n const maxSuffix = Math.min(oldLines.length - prefix, newLines.length - prefix)\n while (suffix < maxSuffix && oldLines[oldLines.length - 1 - suffix] === newLines[newLines.length - 1 - suffix]) suffix++\n return { oldLines: oldLines.slice(prefix, oldLines.length - suffix), newLines: newLines.slice(prefix, newLines.length - suffix), shift: prefix }\n}\n\n/** 计算文件内各差异区域(行范围 + old/new + 状态),用于行内绿标注与 DiffBox。 */\nexport function diffRegions(records: RecordView[], content: string | null): Region[] {\n const regions: Region[] = []\n if (content === null) return regions\n const lines = splitLines(content)\n for (const rec of records) {\n if (rec.create) {\n for (let i = 0; i < rec.hunks.length; i++) {\n const h = preciseHunk(rec, i)\n if (!h || noopHunk(rec, h)) continue\n regions.push({ callId: rec.callId, idx: i, start: 1, end: lines.length + 1, oldLines: [], newLines: lines.slice(), whole: true, status: statusAt(rec, i), create: true, rec, superseded: rec.superseded === true })\n }\n continue\n }\n const entries: Array<{ idx: number; hunk: Hunk }> = []\n for (let i = 0; i < rec.hunks.length; i++) {\n const hunk = preciseHunk(rec, i)\n if (hunk && !noopHunk(rec, hunk)) entries.push({ idx: i, hunk })\n }\n const locations = locateHunks(content, entries.map((entry) => entry.hunk))\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i]\n const location = locations[i]\n const status = statusAt(rec, entry.idx)\n if (!location.matched) {\n regions.push({ callId: rec.callId, idx: entry.idx, stale: true, status, create: false, oldLines: entry.hunk.oldText === null ? [] : entry.hunk.oldText.split('\\n'), newLines: entry.hunk.newText ? entry.hunk.newText.split('\\n') : [], rec, superseded: rec.superseded === true })\n continue\n }\n const start = countLinesBefore(content, location.start) + 1\n const oldLines = entry.hunk.oldText === null ? [] : entry.hunk.oldText.split('\\n')\n const newLines = entry.hunk.newText.split('\\n')\n const trimmed = trimCommonLines(oldLines, newLines)\n const regionStart = start + trimmed.shift\n regions.push({ callId: rec.callId, idx: entry.idx, start: regionStart, end: regionStart + trimmed.newLines.length, oldLines: trimmed.oldLines, newLines: trimmed.newLines, status, create: false, rec, superseded: rec.superseded === true })\n }\n }\n regions.sort((a, b) => (a.start ?? Infinity) - (b.start ?? Infinity))\n return regions\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — QuickOpen:顶部搜索框(Ctrl+P 打开文件)。\n * 迁移自原 src/client/index.ts 的 QuickOpen,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\n\n/**\n * 快速打开搜索框:Ctrl+P 聚焦,输入 ≥2 字符经 edrv.searchFiles 搜索,\n * 结果列表点击/回车打开文件。\n * @param props.sessionId 会话 id\n * @param props.onOpen 打开回调(path)\n */\nexport function QuickOpen(props) {\n const sessionId = props?.sessionId\n const onOpen = props?.onOpen\n const [q, setQ] = React.useState('')\n const [results, setResults] = React.useState(null)\n const [open, setOpen] = React.useState(false)\n const inputRef = React.useRef(null)\n const seq = React.useRef(0)\n const timer = React.useRef(null)\n\n const search = (query) => {\n const s = ++seq.current\n const clean = String(query || '').trim()\n if (clean.length < 2) { setResults(null); return }\n rpc('edrv.searchFiles', { sessionId, query: clean }).then((res) => {\n if (s !== seq.current) return\n setResults((res && res.ok && Array.isArray(res.files)) ? res.files : [])\n }).catch(() => { if (s === seq.current) setResults([]) })\n }\n\n const onChange = (v) => {\n setQ(v); setOpen(true)\n if (timer.current) clearTimeout(timer.current)\n timer.current = setTimeout(() => search(v), 180)\n }\n\n const pick = (p) => {\n onOpen(p)\n setQ(''); setResults(null); setOpen(false)\n inputRef.current?.blur?.()\n }\n\n React.useEffect(() => {\n const onKey = (e) => {\n if ((e.ctrlKey || e.metaKey) && String(e.key).toLowerCase() === 'p') {\n e.preventDefault(); e.stopPropagation()\n inputRef.current?.focus?.()\n setOpen(true)\n } else if (e.key === 'Escape') {\n setOpen(false); inputRef.current?.blur?.()\n }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n const dirText = (p) => {\n const base = String(p).split(/[\\\\/]/).pop() || String(p)\n return String(p).slice(0, Math.max(0, String(p).length - base.length)).replace(/[\\\\/]+$/, '') || String(p)\n }\n\n let pop = null\n if (open && Array.isArray(results) && q.trim().length >= 2) {\n if (results.length) {\n const items = results.map((p) => React.createElement('div', { key: p, className: 'edrv-search-item', onClick: () => pick(p) },\n React.createElement('span', { className: 'n' }, String(p).split(/[\\\\/]/).pop() || p),\n React.createElement('span', { className: 'd' }, dirText(p))))\n pop = React.createElement('div', { className: 'edrv-search-pop' }, ...items)\n } else {\n pop = React.createElement('div', { className: 'edrv-search-pop' }, React.createElement('div', { className: 'edrv-search-empty' }, '无匹配文件'))\n }\n }\n\n return React.createElement('div', { className: 'edrv-search-wrap' },\n React.createElement('input', {\n ref: inputRef, className: 'edrv-search', placeholder: '搜索文件 (Ctrl+P)',\n value: q,\n onChange: (e) => onChange(e.target.value),\n onFocus: () => { if (q.trim().length >= 2 && !results) setOpen(true) },\n onKeyDown: (e) => {\n if (e.key === 'Enter' && Array.isArray(results) && results.length) pick(results[0])\n if (e.key === 'Escape') setOpen(false)\n },\n }),\n pop)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — UI 共用小工具(按钮样式/状态文案/等宽字体)。\n * 迁移自原 src/client/index.ts 的 btn/badgeOf/MONO,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport { ST } from '../state/records.js'\n\n/** 次级按钮内联样式(accept=true 绿色 / false 红色)。 */\nexport function btn(accept) {\n return {\n fontSize: 11,\n padding: '1px 8px',\n border: '1px solid var(--dsw-alias-border-l2,#555)',\n borderRadius: 4,\n cursor: 'pointer',\n background: 'var(--dsw-alias-bg-layer-1,transparent)',\n color: accept ? 'var(--dsw-alias-state-success-primary,#2e9e44)' : 'var(--dsw-alias-state-error-primary,#d9534f)',\n }\n}\n\n/** 状态中文文案。 */\nexport function badgeOf(status) {\n return status === ST.ACCEPTED ? '已采纳' : status === ST.REJECTED ? '已拒绝' : '待处理'\n}\n\n/** 等宽字体常量(差异行渲染用)。 */\nexport const MONO = { fontFamily: 'var(--ds-font-family-code, ui-monospace, monospace)', fontSize: 12, lineHeight: 1.55 }\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffBox:每个文件底部紧凑差异条(per-file hunk + ⋮ 二级菜单)。\n * 迁移自原 src/client/index.ts 的 DiffBox,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { callIdAttr } from '../state/records.js'\nimport { badgeOf } from './shared.js'\n\n/**\n * 差异条:当前文件内 diff 导航(↑↓←→)、Keep/Undo、展开 hunk 列表、⋮ 二级菜单\n * (Keep All / Undo All / 差异总览 / 归档 / 回滚 / 刷新)+ 其他差异文件小节。\n */\nexport function DiffBox(props) {\n const {\n pendingRegions, staleRegions, onAct, onAcceptFile, onUndoFile, onAcceptAllFiles, onUndoAllFiles,\n allPendingCount, onRollback, onJump, otherFiles, onOpenOther, onOpenLauncher, onRefresh, activePath,\n diffIdx, diffTotal, fileIdx, fileTotal, onPrevDiff, onNextDiff, onPrevFile, onNextFile,\n } = props\n const [expanded, setExpanded] = React.useState(false)\n const [menuOpen, setMenuOpen] = React.useState(false)\n const canAct = pendingRegions.length > 0\n\n const base = String(activePath || '').split(/[\\\\/]/).pop() || ''\n\n let bodyEl = null\n if (expanded) {\n const rows = pendingRegions.map((r) => {\n const key = callIdAttr(r.callId, r.idx)\n return React.createElement('div', { key, className: 'edrv-diffrow', 'data-edrv-hunk': key, title: '跳转到 L' + (r.start ?? '?'), onClick: () => onJump(r) },\n React.createElement('span', { className: 'edrv-diffrow-l' }, 'L' + (r.start ?? '?') + '-' + (r.end ?? '?')),\n (r.oldLines.length ? React.createElement('span', { className: 'edrv-diffrow-o' }, '-' + r.oldLines.length) : null),\n (r.newLines.length ? React.createElement('span', { className: 'edrv-diffrow-n' }, '+' + r.newLines.length) : null),\n (r.create ? React.createElement('span', { className: 'edrv-diffrow-tag' }, '新建') : null),\n React.createElement('span', { style: { flex: 1 } }))\n })\n const stale = staleRegions.map((r) => React.createElement('div', { key: 'stale' + callIdAttr(r.callId, r.idx), className: 'edrv-diffrow edrv-diffrow-stale', title: '差异无法定位(文件可能已被手动修改)' },\n React.createElement('span', { className: 'edrv-diffrow-l' }, 'L' + (r.start ?? '?') + ' 无法定位'),\n React.createElement('span', { className: 'edrv-diffrow-tag' }, '冲突/需刷新'),\n React.createElement('span', { className: 'edrv-diffrow-tag' }, badgeOf(r.status))))\n let othersEl = null\n if (otherFiles.length) {\n othersEl = React.createElement('div', { className: 'edrv-diffbox-others' },\n React.createElement('span', { className: 'edrv-diffrow-tag' }, '其他差异文件 (' + otherFiles.length + '):'),\n otherFiles.map((f) => React.createElement('button', { key: f.path, className: 'edrv-diffrow-file', title: f.path, onClick: () => onOpenOther(f.path) },\n String(f.path).split(/[\\\\/]/).pop() + ' (' + f.pending + ')')))\n }\n bodyEl = React.createElement('div', { className: 'edrv-diffbar-body' }, ...rows, ...stale, othersEl)\n }\n\n const menu = menuOpen\n ? React.createElement(React.Fragment, null,\n React.createElement('div', { style: { position: 'fixed', inset: 0, zIndex: 44 }, onClick: () => setMenuOpen(false) }),\n React.createElement('div', { className: 'edrv-diffbar-menu' },\n React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !allPendingCount, onClick: () => { onAcceptAllFiles(); setMenuOpen(false) } }, '✓ Keep All(全部文件采纳)'),\n React.createElement('button', { className: 'edrv-diffmenu-item danger', disabled: !allPendingCount, onClick: () => { onUndoAllFiles(); setMenuOpen(false) } }, '↩ Undo All(全部文件不采纳)'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onOpenLauncher('pending'); setMenuOpen(false) } }, '🗂 差异总览'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onOpenLauncher('archive'); setMenuOpen(false) } }, '📁 归档'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !canAct, onClick: () => { onRollback(); setMenuOpen(false) } }, '⟲ 回滚文件'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onRefresh(); setMenuOpen(false) } }, '⟳ 刷新')))\n : null\n\n return React.createElement('div', { className: 'edrv-diffbar', 'data-edrv-diffbox': '1' },\n React.createElement('div', { className: 'edrv-diffbar-row' },\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异', disabled: !canAct, onClick: onPrevDiff }, '↑'),\n React.createElement('span', { className: 'edrv-diffbar-count', title: '当前文件内差异位置(点击展开/收起差异列表)', onClick: () => setExpanded((v) => !v) }, diffTotal ? (diffIdx + 1) + '/' + diffTotal : '0/0'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '下一个差异', disabled: !canAct, onClick: onNextDiff }, '↓'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异文件', disabled: !fileTotal, onClick: onPrevFile }, '←'),\n React.createElement('span', { className: 'edrv-diffbar-count edrv-count-file', title: '差异文件位置' }, fileTotal ? (fileIdx + 1) + '/' + fileTotal + ' 文件' : '0/0 文件'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '下一个差异文件', disabled: !fileTotal, onClick: onNextFile }, '→'),\n React.createElement('span', { className: 'edrv-diffbar-file', title: activePath || '' }, base),\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', title: '采纳当前文件的全部差异', disabled: !canAct, onClick: onAcceptFile }, '✓ Keep'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-undo', title: '不采纳当前文件的全部差异(回滚)', disabled: !canAct, onClick: onUndoFile }, '↩ Undo'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '更多操作', onClick: () => setMenuOpen((v) => !v) }, '⋮')),\n bodyEl,\n menu)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffBarEmpty:无文件打开 / 当前文件无差异但有差异文件时的空态浮窗。\n * 迁移自原 src/client/index.ts 的 DiffBarEmpty,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\n\n/**\n * 空态差异条:提示当前状态 + 查看下一个差异文件 + ⋮(总览/归档/刷新)。\n */\nexport function DiffBarEmpty(props) {\n const { sum, active, staleCount, onNextFile, onOpenLauncher, onRefresh } = props\n const [menuOpen, setMenuOpen] = React.useState(false)\n const n = sum?.totalFiles ?? 0\n const tip = active\n ? (staleCount > 0 ? '当前文件有 ' + staleCount + ' 处差异无法定位(可能已被后续修改影响)' : '当前文件无待处理差异')\n : '未打开文件'\n\n const menu = menuOpen\n ? React.createElement(React.Fragment, null,\n React.createElement('div', { style: { position: 'fixed', inset: 0, zIndex: 44 }, onClick: () => setMenuOpen(false) }),\n React.createElement('div', { className: 'edrv-diffbar-menu' },\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onOpenLauncher('pending'); setMenuOpen(false) } }, '🗂 差异总览'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onOpenLauncher('archive'); setMenuOpen(false) } }, '📁 归档'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onRefresh(); setMenuOpen(false) } }, '⟳ 刷新')))\n : null\n\n return React.createElement('div', { className: 'edrv-diffbar', 'data-edrv-diffbox': '1' },\n React.createElement('div', { className: 'edrv-diffbar-row' },\n React.createElement('span', { className: 'edrv-diffbar-count' }, '⚠ 差异 ' + n + ' 文件'),\n React.createElement('span', { className: 'edrv-diffbar-file' }, tip),\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', title: '打开并跳转到下一个差异文件', onClick: onNextFile }, '查看下一个差异文件'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '更多操作', onClick: () => setMenuOpen((v) => !v) }, '⋮')),\n menu)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffLauncher:全局差异总览 + 归档 圆角下拉。\n * 迁移自原 src/client/index.ts 的 DiffLauncher,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { MONO, btn } from './shared.js'\n\n/**\n * 全局差异面板:待处理文件列表(点击打开并跳转)+ 归档浏览/批次回滚。\n * 由状态栏差异 chip / header 角标触发。\n */\nexport function DiffLauncher(props) {\n const sessionId = props?.sessionId\n const sum = props?.sum\n const onClose = props?.onClose\n const onOpenFile = props?.onOpenFile\n const [tab, setTab] = React.useState(props?.tab === 'archive' ? 'archive' : 'pending') // 'pending' | 'archive'\n const [archives, setArchives] = React.useState(null)\n const [archiveDetail, setArchiveDetail] = React.useState(null)\n const [archivePath, setArchivePath] = React.useState(null)\n const [archiveErr, setArchiveErr] = React.useState(null)\n const [error, setError] = React.useState(null)\n\n const loadArchives = () => {\n if (!sessionId) { setArchiveErr('会话不存在'); return }\n rpc('edrv.archiveList', { sessionId }).then((res) => {\n if (res && res.ok && Array.isArray(res.entries)) { setArchives(res.entries); setArchiveErr(null) }\n else setArchiveErr(res?.error ? String(res.error) : '归档列表读取失败')\n }).catch((e) => setArchiveErr('归档异常:' + String(e)))\n }\n const loadArchiveDetail = (path) => {\n if (!sessionId) return\n setArchiveDetail(null)\n rpc('edrv.archiveRead', { sessionId, path }).then((res) => {\n if (res && res.ok && Array.isArray(res.batches)) setArchiveDetail(res.batches)\n else setArchiveErr(res?.error ? String(res.error) : '归档详情读取失败')\n }).catch((e) => setArchiveErr('归档异常:' + String(e)))\n }\n React.useEffect(() => {\n if (tab !== 'archive') return\n setArchives(null); setArchiveDetail(null); setArchivePath(null); setArchiveErr(null)\n loadArchives()\n }, [tab, sessionId])\n\n let body\n if (tab === 'pending') {\n body = (sum.pendingFiles.length === 0\n ? React.createElement('div', { className: 'edrv-search-empty' }, '暂无待处理差异(已全部处理)')\n : sum.pendingFiles.map((f) => React.createElement('div', { key: f.path, className: 'edrv-launch-row', title: '打开并跳转到差异 ' + f.path, onClick: () => onOpenFile(f.path) },\n React.createElement('span', { className: 'edrv-launch-path' }, f.path),\n React.createElement('span', { className: 'edrv-launch-cnt' }, '待处理 ' + f.pending + ' 处'),\n React.createElement('button', { className: 'edrv-btn-mini edrv-btn-keep', onClick: (e) => { e.stopPropagation(); onOpenFile(f.path) } }, '打开'))))\n } else {\n if (archiveErr) body = React.createElement('div', { className: 'edrv-search-empty', style: { color: 'var(--dsw-alias-state-error-primary,#d9534f)' } }, '错误:' + String(archiveErr))\n else if (archives === null) body = React.createElement('div', { className: 'edrv-search-empty' }, '加载中…')\n else if (archives.length === 0) body = React.createElement('div', { className: 'edrv-search-empty' }, '暂无归档记录')\n else {\n const inner = archives.map((e) => {\n const open = archivePath === e.path\n let detailEl = null\n if (open) {\n if (archiveDetail === null) detailEl = React.createElement('div', { style: { padding: 8, fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, '加载中…')\n else {\n const batches = archiveDetail.filter((b) => b.path === e.path)\n detailEl = batches.map((b) => (Array.isArray(b.records) ? b.records : []).map((rec) => {\n const lines = []\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (const h of hunks) {\n const oldLs = (h.oldText ?? '').split('\\n')\n const newLs = (h.newText ?? '').split('\\n')\n for (const t of oldLs) lines.push({ k: 'old', t })\n if (oldLs.length && newLs.length) lines.push({ k: 'sep', t: '' })\n for (const t of newLs) lines.push({ k: 'new', t })\n }\n const sm = rec.summary || { accepted: 0, rejected: 0, pending: 0, superseded: false }\n return React.createElement('div', { key: rec.callId, style: { padding: '5px 8px', borderTop: '1px solid var(--dsw-alias-border-l1,#333)' } },\n React.createElement('div', { style: { display: 'flex', gap: 8, alignItems: 'center', flexWrap: 'wrap', fontSize: 11, marginBottom: 2 } },\n React.createElement('span', { style: { color: 'var(--dsw-alias-label-primary,#ddd)', fontWeight: 600 } }, rec.toolName === 'write' ? (rec.create ? '新建' : '写入') : '编辑'),\n React.createElement('span', { style: { color: 'var(--dsw-alias-state-success-primary,#2e9e44)' } }, '采纳 ' + sm.accepted),\n React.createElement('span', { style: { color: 'var(--dsw-alias-state-error-primary,#d9534f)' } }, '拒绝 ' + sm.rejected),\n (rec.superseded ? React.createElement('span', { style: { color: 'var(--dsw-alias-state-warn-primary,#b7791f)' } }, '被覆盖') : null),\n React.createElement('span', { style: { color: 'var(--dsw-alias-label-tertiary,#888)' } }, new Date(rec.at).toLocaleTimeString())),\n React.createElement('pre', { style: { margin: 0, whiteSpace: 'pre', fontFamily: MONO.fontFamily, fontSize: 11, lineHeight: 1.5, overflowX: 'auto' } }, lines.map((ln, i) => React.createElement('div', { key: i, style: { background: ln.k === 'old' ? 'rgba(239,68,68,.10)' : ln.k === 'new' ? 'rgba(34,197,94,.10)' : 'transparent', color: ln.k === 'old' ? 'var(--dsw-alias-state-error-primary,#d9534f)' : ln.k === 'new' ? 'var(--dsw-alias-state-success-primary,#2e9e44)' : 'var(--dsw-alias-label-tertiary,#888)' } }, (ln.k === 'old' ? '- ' : ln.k === 'new' ? '+ ' : '') + ln.t)))\n )\n }))\n }\n }\n return React.createElement('div', { key: e.at + e.path, style: { border: '1px solid var(--dsw-alias-border-l1,#333)', borderRadius: 8, overflow: 'hidden' } },\n React.createElement('div', { style: { display: 'flex', gap: 8, alignItems: 'center', padding: '6px 8px', background: 'var(--dsw-alias-bg-layer-1,transparent)', cursor: 'pointer', flexWrap: 'wrap' }, onClick: () => { if (open) { setArchivePath(null); setArchiveDetail(null) } else { setArchivePath(e.path); loadArchiveDetail(e.path) } } },\n React.createElement('span', { style: { flex: 1, fontSize: 12, color: 'var(--dsw-alias-label-primary,#ddd)', wordBreak: 'break-all' } }, e.path),\n (e.batch != null ? React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, '批次 ' + e.batch) : null),\n (e.reason ? React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-state-warn-primary,#b7791f)' } }, e.reason) : null),\n React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, new Date(e.at).toLocaleString()),\n React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, '采纳 ' + e.summary.accepted + ' · 拒绝 ' + e.summary.rejected + (e.summary.superseded ? ' · 覆盖 ' + e.summary.superseded : '')),\n React.createElement('button', { onClick: (ev) => {\n ev.stopPropagation()\n if (e.batch == null) return\n if (!window.confirm('将文件恢复到批次 ' + e.batch + ' 之前的状态?(当前活跃差异将一并归档)')) return\n rpc('edrv.rollback', { sessionId, path: e.path, batch: e.batch }).then((res) => {\n if (res && res.ok) {\n setError(null); window.dispatchEvent(new CustomEvent('edrv:refresh'))\n setArchivePath(null); setArchiveDetail(null); loadArchives()\n } else setError(res?.error ? String(res.error) : '回滚失败')\n }).catch((err) => setError('回滚异常:' + String(err)))\n }, style: btn(false) }, '回滚')),\n detailEl)\n })\n body = React.createElement('div', { className: 'edrv-launch-arch' }, inner)\n }\n }\n\n return React.createElement('div', { className: 'edrv-launch', 'data-edrv-launch': '1' },\n React.createElement('div', { className: 'edrv-launch-head' },\n React.createElement('span', { style: { fontSize: 12, fontWeight: 600, color: 'var(--dsw-alias-label-primary,#eee)', marginRight: 4 } }, '差异'),\n React.createElement('button', { className: 'edrv-launch-tab' + (tab === 'pending' ? ' on' : ''), onClick: () => setTab('pending') }, '待处理' + (sum.totalFiles ? ' (' + sum.totalFiles + ')' : '')),\n React.createElement('button', { className: 'edrv-launch-tab' + (tab === 'archive' ? ' on' : ''), onClick: () => setTab('archive') }, '归档'),\n React.createElement('span', { style: { flex: 1 } }),\n (error ? React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-state-error-primary,#d9534f)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: '40%' } }, '错误:' + String(error)) : null),\n React.createElement('button', { onClick: onClose, style: btn(false) }, '✕ 关闭')),\n React.createElement('div', { className: 'edrv-launch-body' }, body))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — EditorView:中央 VSCode 式文件编辑器(编排层)。\n * 迁移自原 src/client/index.ts 的 EditorView,语义不改;差异自绘已抽到 monaco/diffRender。\n * 职责:页签/QuickOpen/Monaco 编辑器/差异审查(DiffBox/Launcher/Badge 事件装配)/状态栏/自动保存。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { dbg, rpc } from '../rpc.js'\nimport { emitRefresh } from '../events.js'\nimport { langOf, loadMonaco } from '../monaco/loader.js'\nimport { createDiffRenderer } from '../monaco/diffRender.js'\nimport { ST, callIdAttr, noopHunk, summarize } from '../state/records.js'\nimport { diffRegions } from '../state/regions.js'\nimport { QuickOpen } from './QuickOpen.js'\nimport { DiffBox } from './DiffBox.js'\nimport { DiffBarEmpty } from './DiffBarEmpty.js'\nimport { DiffLauncher } from './DiffLauncher.js'\n\n/**\n * 中央编辑区:文件页签(脏点/关闭/打开路径)+ Ctrl+P 搜索 + Monaco 编辑器 +\n * 底部差异条(DiffBox/空态)+ 全局差异下拉(DiffLauncher)+ 状态栏。\n * @param props.sessionId 会话 id\n * @param props.schedule 延时调度(ctx.timeout)\n */\nexport function EditorView(props) {\n const sessionId = props?.sessionId\n const schedule = props.schedule\n const [monaco, setMonaco] = React.useState(null)\n const [monacoErr, setMonacoErr] = React.useState(null)\n const [records, setRecords] = React.useState({})\n const [tabs, setTabs] = React.useState([])\n const [active, setActive] = React.useState(null)\n const [dirtyMap, setDirtyMap] = React.useState({})\n const [content, setContent] = React.useState(null)\n const [status, setStatus] = React.useState('')\n const [error, setError] = React.useState(null)\n const [loadError, setLoadError] = React.useState(null)\n const [loadStage, setLoadStage] = React.useState({ progress: 0, message: '准备加载编辑器…' })\n const [openInput, setOpenInput] = React.useState(false)\n const [pathDraft, setPathDraft] = React.useState('')\n const [cursor, setCursor] = React.useState('')\n const [launcherOpen, setLauncherOpen] = React.useState(false)\n const [launcherTab, setLauncherTab] = React.useState('pending')\n const [hoverAct, setHoverAct] = React.useState(null) // { region, top } 编辑区 hover 差异块的 Keep/Undo 浮层\n const [diffIdx, setDiffIdx] = React.useState(0) // 当前文件内差异位置(x/x 显示)\n const [fileIdx, setFileIdx] = React.useState(0) // 全局差异文件位置(x/x 文件 显示)\n const editorRef = React.useRef(null)\n const monacoRef = React.useRef(null)\n const modelsRef = React.useRef(new Map())\n const saveTimerRef = React.useRef(null)\n const loadSeqRef = React.useRef(0)\n const programmaticRef = React.useRef(false)\n const bootRef = React.useRef(false)\n const pendingFocusRef = React.useRef(null) // { path, region } 内容加载后跳转\n const hoverRegionsRef = React.useRef([]) // 当前 pending 区域镜像(稳定回调读取)\n const lineRegionMapRef = React.useRef(new Map()) // 行 → 区域 映射(hover 命中)\n const hoverKeyRef = React.useRef(null) // 当前 hover 区域 key(区域不变不重渲染)\n const hoverTopRef = React.useRef(null) // 当前 hover 浮窗 top(滚动后位置变化才重定位)\n const hoverRightRef = React.useRef(null) // 浮窗右侧避让 Monaco 缩略栏\n const hideTimerRef = React.useRef(null) // 延迟隐藏计时器(防闪烁)\n const hoverEditorRef = React.useRef(false) // 鼠标是否仍在编辑器命中区\n const hoverPanelRef = React.useRef(false) // 鼠标是否已进入 Keep/Undo 浮层\n const batchBusyRef = React.useRef(false) // 批量 Keep All/Undo All 防重入\n const diffRendererRef = React.useRef(null)\n if (!diffRendererRef.current) diffRendererRef.current = createDiffRenderer((sid, t) => dbg(sid, t))\n\n const currentRecords = React.useMemo(() => {\n const list = []\n for (const rec of Object.values(records)) if (rec.path === active && rec.archived !== true) list.push(rec)\n return list\n }, [records, active])\n\n const regions = React.useMemo(() => diffRegions(currentRecords, content).filter((r) => !r.superseded), [currentRecords, content])\n // useMemo 稳定引用:否则 hover 等重渲染会让 view zone effect 反复重建(- 号闪烁)\n const pendingRegions = React.useMemo(() => regions.filter((r) => r.status === ST.PENDING && !r.stale), [regions])\n const staleRegions = React.useMemo(() => regions.filter((r) => r.status === ST.PENDING && r.stale), [regions])\n hoverRegionsRef.current = pendingRegions\n // 行 → 差异区域 映射(hover O(1) 命中;每行归属其区域)\n const lineRegionMap = React.useMemo(() => {\n const map = new Map()\n for (const r of pendingRegions) {\n if (r.start === undefined || r.end === undefined) continue\n const last = Math.max(r.start, r.end - 1)\n for (let ln = r.start; ln <= last; ln++) if (!map.has(ln)) map.set(ln, r)\n }\n return map\n }, [pendingRegions])\n lineRegionMapRef.current = lineRegionMap\n const sum = React.useMemo(() => summarize(Object.values(records)), [records])\n\n const addTab = (path, select) => {\n setTabs((prev) => {\n if (prev.some((t) => t.path === path)) return prev\n return prev.concat([{ path }])\n })\n if (select) setActive(path)\n }\n\n const closeTab = (path) => {\n flushSave()\n setTabs((prev) => {\n const idx = prev.findIndex((t) => t.path === path)\n if (idx < 0) return prev\n const next = prev.filter((t) => t.path !== path)\n if (active === path) setActive(next[idx] ? next[idx].path : (next[idx - 1] ? next[idx - 1].path : null))\n return next\n })\n }\n\n const refreshRecords = () => {\n if (!sessionId) return\n rpc('edrv.list', { sessionId }).then((res) => {\n if (!res || !res.ok || !Array.isArray(res.records)) return\n const map = {}\n for (const r of res.records) {\n if (r.archived === true) continue\n map[r.callId] = r\n }\n setRecords(map)\n }).catch((e) => setError('list异常:' + String(e)))\n }\n\n const loadContent = (path, sid) => {\n const seq = ++loadSeqRef.current\n setLoadError(null)\n setLoadStage({ progress: monaco ? 72 : 12, message: '读取文件内容…' })\n rpc('edrv.read', { sessionId: sid, path }).then((res) => {\n if (seq !== loadSeqRef.current || path !== active) return\n if (res && res.ok) {\n setContent(res.content)\n setLoadStage((prev) => ({ progress: Math.max(84, prev.progress), message: '文件已读取,准备创建编辑器…' }))\n setStatus('已加载')\n } else {\n const message = res?.error ? String(res.error) : '读取失败'\n setLoadError(message)\n setError(message)\n setStatus('读取失败')\n }\n }).catch((e) => {\n if (seq !== loadSeqRef.current) return\n const message = 'read异常:' + String(e)\n setLoadError(message)\n setError(message)\n setStatus('读取失败')\n })\n }\n\n // 挂载轮询 + 事件订阅\n React.useEffect(() => {\n if (!sessionId) return\n refreshRecords()\n const t = setInterval(refreshRecords, 5000)\n const onRefresh = () => refreshRecords()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => { clearInterval(t); window.removeEventListener('edrv:refresh', onRefresh) }\n }, [sessionId])\n\n React.useEffect(() => {\n const onOpen = (e) => {\n const p = e?.detail?.path\n if (p) addTab(p, true)\n }\n const onShowLauncher = () => setLauncherOpen(true)\n window.addEventListener('edrv:open-editor', onOpen)\n window.addEventListener('edrv:show-launcher', onShowLauncher)\n return () => {\n window.removeEventListener('edrv:open-editor', onOpen)\n window.removeEventListener('edrv:show-launcher', onShowLauncher)\n }\n }, [sessionId])\n\n // localStorage v2 恢复页签\n React.useEffect(() => {\n if (bootRef.current || !sessionId) return\n bootRef.current = true\n try {\n const raw = localStorage.getItem('edrv.editor.v2.' + String(sessionId))\n if (raw) {\n const saved = JSON.parse(raw)\n if (Array.isArray(saved.tabs) && saved.tabs.length) {\n setTabs(saved.tabs.map((p) => ({ path: p })))\n if (typeof saved.active === 'string') setActive(saved.active)\n }\n }\n } catch (e) { /* 损坏忽略 */ }\n }, [sessionId])\n\n React.useEffect(() => {\n if (!sessionId) return\n try { localStorage.setItem('edrv.editor.v2.' + String(sessionId), JSON.stringify({ tabs: tabs.map((t) => t.path), active })) }\n catch (e) { /* 忽略 */ }\n }, [tabs, active, sessionId])\n\n React.useEffect(() => {\n if (!active) return\n setContent(null)\n setLoadError(null)\n setLoadStage({ progress: 10, message: '准备读取文件…' })\n setStatus('加载中…')\n loadContent(active, sessionId)\n }, [active, sessionId])\n\n React.useEffect(() => {\n if (monaco || monacoErr) return\n let alive = true\n const onProgress = (stage) => {\n if (!alive) return\n const progress = stage.phase === 'ready' ? 70 : Math.round(10 + stage.progress * 0.6)\n setLoadStage((prev) => ({ progress: Math.max(prev.progress, progress), message: stage.message }))\n }\n loadMonaco(onProgress).then((m) => { if (alive) setMonaco(m) }).catch((e) => {\n if (alive) {\n setMonacoErr(String(e?.message ?? e))\n setStatus('Monaco 不可用')\n }\n })\n return () => { alive = false }\n }, [monaco, monacoErr])\n\n monacoRef.current = monaco\n\n const getModel = (path, text) => {\n const cache = modelsRef.current\n let model = cache.get(path)\n if (!model) {\n model = window.monaco.editor.createModel(text ?? '', langOf(path), window.monaco.Uri.parse('edrv:///' + encodeURI(path)))\n cache.set(path, model)\n } else if (text !== undefined && model.getValue() !== text) {\n programmaticRef.current = true\n model.setValue(text)\n programmaticRef.current = false\n }\n return model\n }\n\n const flushSave = () => {\n if (saveTimerRef.current) { saveTimerRef.current(); saveTimerRef.current = null }\n }\n\n const doSave = (silent) => {\n const ed = editorRef.current\n if (!active || !ed) return\n const text = ed.getValue()\n if (!silent) setStatus('保存中…')\n rpc('edrv.save', { sessionId, path: active, content: text }).then((res) => {\n if (res && res.ok) {\n setStatus('已保存 ' + new Date().toTimeString().slice(0, 8))\n setContent(text)\n setDirtyMap((d) => Object.assign({}, d, { [active]: false }))\n refreshRecords()\n emitRefresh()\n } else { setStatus('保存失败'); setError(res?.error ? String(res.error) : '保存失败') }\n }).catch((e) => { setStatus('保存失败'); setError('保存异常:' + String(e)) })\n }\n\n const onEdit = () => {\n const ed = editorRef.current\n if (!ed || !active) return\n setDirtyMap((d) => Object.assign({}, d, { [active]: true }))\n setStatus('编辑中…')\n if (saveTimerRef.current) saveTimerRef.current()\n saveTimerRef.current = schedule(() => doSave(true), 700)\n }\n\n // model 同步(当前内容)\n React.useEffect(() => {\n if (!monaco || !editorRef.current || !active || content === null) return\n const ed = editorRef.current\n const model = getModel(active, content)\n if (ed.getModel() !== model) ed.setModel(model)\n setLoadStage((prev) => ({ progress: Math.max(96, prev.progress), message: '创建编辑器视图…' }))\n }, [monaco, active, content])\n\n // 行内差异自绘(decorations / view zones / minus overlay)→ diffRenderer\n React.useEffect(() => {\n if (!monaco || !editorRef.current || !active || content === null) return\n diffRendererRef.current.render(monaco, editorRef.current, pendingRegions, sessionId)\n setLoadStage({ progress: 100, message: '编辑器已就绪' })\n }, [monaco, active, content, pendingRegions])\n\n React.useEffect(() => () => {\n flushSave()\n diffRendererRef.current?.dispose?.()\n if (editorRef.current) { editorRef.current.dispose(); editorRef.current = null }\n for (const m of modelsRef.current.values()) m.dispose()\n modelsRef.current.clear()\n const root = editorRef.current && editorRef.current.getDomNode ? editorRef.current.getDomNode() : null\n if (root) {\n const ov = root.querySelector('.edrv-minus-overlay')\n if (ov) ov.remove()\n }\n }, [])\n\n // 普通 Monaco 编辑器(可编辑、单列行号)+ 自绘行内差异(decoration 绿底+ / view zone 删除块)\n const ensureEditor = React.useCallback((node) => {\n if (!node) {\n if (editorRef.current) { editorRef.current.dispose(); editorRef.current = null }\n return\n }\n if (editorRef.current || !monacoRef.current) return\n const m = monacoRef.current\n const ed = m.editor.create(node, {\n value: '',\n language: 'plaintext',\n theme: 'vs',\n fontFamily: 'var(--ds-font-family-code, ui-monospace, monospace)',\n fontSize: 13,\n lineHeight: 20,\n minimap: { enabled: true, scale: 1 },\n glyphMargin: true,\n lineDecorationsWidth: 16,\n automaticLayout: true,\n scrollBeyondLastLine: false,\n wordWrap: 'off',\n tabSize: 2,\n renderWhitespace: 'selection',\n smoothScrolling: true,\n cursorBlinking: 'smooth',\n padding: { top: 8 },\n })\n ed.addCommand(m.KeyMod.CtrlCmd | m.KeyCode.KeyS, () => { flushSave(); doSave(false) })\n ed.onDidChangeModelContent(() => {\n if (!ed.getModel() || programmaticRef.current) return\n onEdit()\n })\n ed.onDidChangeCursorPosition((e) => {\n setCursor('Ln ' + e.position.lineNumber + ', Col ' + e.position.column)\n })\n // hover 差异块 → 浮出 Keep/Undo(req:鼠标移到编辑区差异块时显示)\n // 防闪烁:① 区域不变不 setState(浮窗锚定差异块起始行,不跟随鼠标);② 延迟隐藏;\n // ③ 浮窗自身 onMouseEnter 取消隐藏计时(鼠标在浮窗与编辑器间移动不闪)。\n const hideSoon = () => {\n if (hoverEditorRef.current || hoverPanelRef.current || hideTimerRef.current) return\n hideTimerRef.current = setTimeout(() => {\n hideTimerRef.current = null\n if (hoverEditorRef.current || hoverPanelRef.current) return\n hoverKeyRef.current = null\n hoverTopRef.current = null\n setHoverAct(null)\n }, 180)\n }\n ed.onMouseMove((e) => {\n hoverEditorRef.current = true\n const line = e?.target?.position?.lineNumber\n const map = lineRegionMapRef.current\n if (!line || !map.size) { hoverEditorRef.current = false; hideSoon(); return }\n const hit = map.get(line)\n if (!hit) { hoverEditorRef.current = false; hideSoon(); return }\n const key = callIdAttr(hit.callId, hit.idx)\n const top = Math.max(0, ed.getTopForLineNumber(Math.max(1, hit.start)) - ed.getScrollTop())\n const layout = ed.getLayoutInfo()\n const minimapLeft = layout.minimap?.minimapLeft || 0\n const right = minimapLeft > 0 ? Math.max(12, layout.width - minimapLeft + 8) : Math.max(12, layout.verticalScrollbarWidth + 8)\n if (hoverKeyRef.current === key && hoverTopRef.current === top && hoverRightRef.current === right) return // 同区域同位置不重复更新\n hoverKeyRef.current = key\n hoverTopRef.current = top\n hoverRightRef.current = right\n if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }\n setHoverAct({ region: hit, top, right })\n })\n editorRef.current = ed\n }, [])\n\n // 打开文件后的差异聚焦跳转(内容/差异就绪后执行一次)\n React.useEffect(() => {\n const pf = pendingFocusRef.current\n if (!pf || pf.path !== active || content === null) return\n const target = pf.region || pendingRegions[0]\n const ed = editorRef.current\n if (!target || !ed) return\n pendingFocusRef.current = null\n ed.revealLineInCenter(Math.max(1, target.start ?? 1))\n ed.setPosition({ lineNumber: Math.max(1, target.start ?? 1), column: 1 })\n ed.focus()\n }, [active, content, pendingRegions])\n\n const jumpTo = (region) => {\n if (editorRef.current) {\n editorRef.current.revealLineInCenter(Math.max(1, region?.start ?? 1))\n editorRef.current.setPosition({ lineNumber: Math.max(1, region?.start ?? 1), column: 1 })\n editorRef.current.focus()\n } else {\n pendingFocusRef.current = { path: active, region }\n }\n }\n\n // 索引校正:差异/文件被处理后 pending 列表变化,clamp 到有效范围\n React.useEffect(() => {\n if (diffIdx >= pendingRegions.length && pendingRegions.length > 0) setDiffIdx(pendingRegions.length - 1)\n else if (pendingRegions.length === 0) setDiffIdx(0)\n }, [pendingRegions.length])\n React.useEffect(() => {\n const i = sum.pendingFiles.findIndex((f) => f.path === active)\n if (i >= 0) { if (i !== fileIdx) setFileIdx(i) }\n }, [sum.pendingFiles, active])\n\n // 上下箭头:当前文件内差异切换(x/x)\n const gotoDiff = (delta) => {\n if (!pendingRegions.length) return\n const next = (diffIdx + delta + pendingRegions.length) % pendingRegions.length\n setDiffIdx(next)\n jumpTo(pendingRegions[next])\n }\n // 左右箭头:全局差异文件切换(x/x 文件),打开并跳转\n const gotoFile = (delta) => {\n if (!sum.pendingFiles.length) return\n const next = (fileIdx + delta + sum.pendingFiles.length) % sum.pendingFiles.length\n setFileIdx(next)\n openFile(sum.pendingFiles[next].path, true)\n }\n\n const reloadFile = () => {\n if (!active) return\n loadContent(active, sessionId)\n refreshRecords()\n }\n\n /**\n * 关闭当前差异浮窗并清理 hover 锚点。\n * @author ddj 2026年08月21号\n */\n const dismissHover = () => {\n hoverKeyRef.current = null\n hoverTopRef.current = null\n hoverRightRef.current = null\n hoverEditorRef.current = false\n hoverPanelRef.current = false\n if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }\n setHoverAct(null)\n }\n\n /**\n * 对单个差异区域执行采纳/不采纳。\n * @author ddj 2026年08月20号\n * @param region 差异区域(callId/idx/create)\n * @param reject true=不采纳(回滚),false=采纳\n * @param silent 批量时抑制中间 reload/报错,由批量方统一收尾\n * @returns Promise<boolean> 是否成功\n */\n const actHunk = (region, reject, silent) => {\n const method = reject ? 'edrv.reject' : 'edrv.accept'\n return rpc(method, { sessionId, callId: region.callId, scope: region.create ? 'call' : 'hunk', hunkIndex: region.idx }).then((res) => {\n if (res && res.ok) {\n setRecords((prev) => Object.assign({}, prev, { [region.callId]: res.record }))\n if (!silent) { reloadFile(); emitRefresh() }\n return true\n }\n if (!silent) setError(res?.error ? String(res.error) : '操作失败')\n return false\n }).catch((e) => {\n if (!silent) setError('操作异常:' + String(e))\n return false\n })\n }\n\n const acceptFile = () => { for (const r of pendingRegions) actHunk(r, false) }\n const undoFile = () => { for (const r of [...pendingRegions].reverse()) actHunk(r, true) }\n\n // 所有差异文件的待处理 hunk 列表(二级菜单 Keep All / Undo All 用)\n const allPending = React.useMemo(() => {\n const out = []\n for (const rec of Object.values(records)) {\n if (rec.superseded === true) continue\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (let i = 0; i < hunks.length; i++) {\n const st = perHunk.length ? perHunk[i] : rec.decisions.call\n if (st === 'pending' && !noopHunk(rec, hunks[i])) out.push({ callId: rec.callId, idx: i, create: rec.create === true, at: rec.at })\n }\n }\n return out\n }, [records])\n\n /**\n * 批量处理所有差异文件:采纳全部 / 不采纳全部。不采纳按 at 降序(新改先回滚)串行执行。\n * @author ddj 2026年08月20号\n * @param reject true=全部不采纳(回滚),false=全部采纳\n */\n const actAllPending = (reject) => {\n if (batchBusyRef.current || !allPending.length) return\n batchBusyRef.current = true\n const list = reject ? [...allPending].sort((a, b) => (a.at < b.at ? 1 : a.at > b.at ? -1 : b.idx - a.idx)) : allPending\n let ok = 0, fail = 0\n const run = async () => {\n for (const r of list) {\n if (await actHunk(r, reject, true)) ok++\n else fail++\n }\n batchBusyRef.current = false\n reloadFile()\n emitRefresh()\n setStatus((reject ? '已不采纳 ' : '已采纳 ') + ok + ' 处差异' + (fail ? ',' + fail + ' 处失败' : ''))\n if (fail) setError(fail + ' 处差异处理失败(可能已被后续修改影响),可刷新后重试')\n }\n run()\n }\n const acceptAllFiles = () => actAllPending(false)\n const undoAllFiles = () => actAllPending(true)\n const rollbackFile = () => {\n if (!active) return\n if (!window.confirm('回滚当前文件到修改前状态?(相关差异将归档)')) return\n rpc('edrv.rollback', { sessionId, path: active }).then((res) => {\n if (res && res.ok) {\n setStatus('已回滚'); reloadFile()\n emitRefresh()\n } else setError(res?.error ? String(res.error) : '回滚失败')\n }).catch((e) => setError('回滚异常:' + String(e)))\n }\n\n const openFile = (path, focusDiff) => {\n if (!path) return\n addTab(path, true)\n if (focusDiff) pendingFocusRef.current = { path, region: null }\n }\n\n const openPath = () => {\n const p = (pathDraft || '').trim()\n if (!p) return\n setStatus('打开中…')\n rpc('edrv.read', { sessionId, path: p }).then((res) => {\n if (res && res.ok) {\n openFile(p, false)\n setOpenInput(false); setPathDraft(''); setStatus('已打开'); setError(null)\n } else { setStatus('打开失败'); setError(res?.error ? String(res.error) : '打开失败') }\n }).catch((e) => { setStatus('打开失败'); setError('打开异常:' + String(e)) })\n }\n\n const tabsEl = React.createElement('div', { className: 'edrv-tabs', style: { flex: '1 1 auto', minWidth: 0 } },\n tabs.map((t) => React.createElement('div', {\n key: t.path,\n className: 'edrv-tab' + (t.path === active ? ' edrv-tab-active' : ''),\n title: t.path,\n onClick: () => { if (t.path !== active) { flushSave(); setActive(t.path) } },\n },\n React.createElement('span', { style: { overflow: 'hidden', textOverflow: 'ellipsis', maxWidth: 180 } }, t.path.split(/[\\\\/]/).pop() || t.path),\n (dirtyMap[t.path] ? React.createElement('span', { className: 'edrv-tab-dot' }) : null),\n React.createElement('span', { className: 'edrv-tab-x', onClick: (e) => { e.stopPropagation(); closeTab(t.path) } }, '×'))),\n (openInput\n ? React.createElement('input', { className: 'edrv-path-input', autoFocus: true, placeholder: '输入工作区相对/绝对路径,回车打开', value: pathDraft, onChange: (e) => setPathDraft(e.target.value), onKeyDown: (e) => { if (e.key === 'Enter') openPath(); if (e.key === 'Escape') setOpenInput(false) } })\n : React.createElement('button', { className: 'edrv-tab-add', title: '打开文件(输入路径)', onClick: () => setOpenInput(true) }, '+')))\n\n const pathBar = React.createElement('div', { className: 'edrv-pathbar', title: active || '' },\n React.createElement('span', { className: 'edrv-pb-name' }, active ? String(active).split(/[\\\\/]/).pop() : '未打开文件'),\n React.createElement('span', { className: 'edrv-pb-full' }, active || '使用右上搜索框 (Ctrl+P) 打开文件'))\n\n const tabRow = React.createElement('div', { style: { display: 'flex', alignItems: 'center', background: 'var(--dsw-alias-bg-layer-1,transparent)', flexShrink: 0 } },\n tabsEl,\n React.createElement(QuickOpen, { sessionId, onOpen: (p) => openFile(p, false) }))\n\n const statusBar = React.createElement('div', { className: 'edrv-statusbar' },\n React.createElement('span', null, '编辑'),\n React.createElement('span', null, active ? langOf(active) : ''),\n React.createElement('span', null, cursor),\n (status ? React.createElement('span', null, status) : null),\n React.createElement('span', { style: { flex: 1 } }),\n (sum.totalFiles > 0\n ? React.createElement('button', { className: 'edrv-diffchip', title: '打开差异总览/归档', onClick: () => setLauncherOpen((o) => !o) }, '⚠ 差异 ' + sum.totalFiles + ' 文件')\n : null),\n React.createElement('button', { className: 'edrv-chip-btn', title: '刷新', onClick: reloadFile }, '⟳'))\n\n const otherFiles = sum.pendingFiles.filter((f) => f.path !== active)\n\n /**\n * 渲染编辑器/文件加载进度面板。\n * @author ddj 2026年08月22号\n * @param message 当前加载阶段\n * @param progress 阶段进度\n * @param retry 可选重试回调\n * @returns 加载面板 React 元素\n */\n const loadingBody = (message, progress, retry) => React.createElement('div', { className: 'edrv-empty edrv-loading', 'aria-live': 'polite' },\n React.createElement('div', { className: 'edrv-loading-title' }, message),\n React.createElement('div', {\n className: 'edrv-progress',\n role: 'progressbar',\n 'aria-label': '编辑器加载进度',\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': progress,\n }, React.createElement('div', { className: 'edrv-progress-value', style: { width: Math.max(0, Math.min(100, progress)) + '%' } })),\n React.createElement('div', { className: 'edrv-loading-percent' }, Math.round(progress) + '%'),\n retry ? React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', onClick: retry }, '重试') : null)\n\n let body\n if (!monaco && !monacoErr) {\n body = loadingBody(loadStage.message, loadStage.progress)\n } else if (monacoErr) {\n body = React.createElement('div', { className: 'edrv-empty' },\n React.createElement('div', null, 'Monaco 编辑器加载失败:' + String(monacoErr)),\n React.createElement('div', { style: { fontSize: 11 } }, '请确认插件包 assets/vendor/monaco 完整(/edrv/vendor 路由可达)'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', onClick: () => { setMonacoErr(null); setLoadStage({ progress: 0, message: '准备重试 Monaco…' }) } }, '重试'))\n } else if (!active) {\n body = React.createElement('div', { className: 'edrv-empty' },\n React.createElement('div', null, '暂无打开的文件'),\n React.createElement('div', { style: { fontSize: 12 } }, '使用右上搜索框 (Ctrl+P) 打开工作区文件;agent 修改文件后顶部会出现差异角标'))\n } else if (content === null && loadError) {\n body = loadingBody('文件加载失败:' + loadError, 0, () => {\n setLoadError(null)\n setContent(null)\n setLoadStage({ progress: 10, message: '重新读取文件…' })\n loadContent(active, sessionId)\n })\n } else if (content === null) {\n body = loadingBody(loadStage.message || '读取文件内容…', loadStage.progress)\n } else {\n body = React.createElement('div', { className: 'edrv-monaco-host' },\n React.createElement('div', { ref: ensureEditor }))\n }\n\n const hoverEl = (hoverAct && !launcherOpen)\n ? React.createElement('div', {\n className: 'edrv-hoveract',\n style: { top: hoverAct.top, right: hoverAct.right ?? 12 },\n onMouseEnter: () => { hoverPanelRef.current = true; if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },\n onMouseMove: () => { hoverPanelRef.current = true; if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },\n onMouseLeave: () => {\n hoverPanelRef.current = false\n if (hoverEditorRef.current || hideTimerRef.current) return\n hideTimerRef.current = setTimeout(() => {\n hideTimerRef.current = null\n if (hoverEditorRef.current || hoverPanelRef.current) return\n hoverKeyRef.current = null\n hoverTopRef.current = null\n setHoverAct(null)\n }, 420)\n },\n },\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', onClick: () => { dismissHover(); actHunk(hoverAct.region, false) } }, '✓ Keep'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-undo', onClick: () => { dismissHover(); actHunk(hoverAct.region, true) } }, '↩ Undo'))\n : null\n\n const overlay = launcherOpen\n ? React.createElement(React.Fragment, null,\n React.createElement('div', { style: { position: 'fixed', inset: 0, zIndex: 30 }, onClick: () => setLauncherOpen(false) }),\n React.createElement(DiffLauncher, { sessionId, sum, tab: launcherTab, onClose: () => setLauncherOpen(false), onOpenFile: (p) => { openFile(p, true); setLauncherOpen(false) } }))\n : (pendingRegions.length > 0\n ? React.createElement(DiffBox, {\n pendingRegions, staleRegions,\n onAct: actHunk,\n onAcceptFile: acceptFile,\n onUndoFile: undoFile,\n onAcceptAllFiles: acceptAllFiles,\n onUndoAllFiles: undoAllFiles,\n allPendingCount: allPending.length,\n onRollback: rollbackFile,\n onJump: jumpTo,\n otherFiles,\n onOpenOther: (p) => openFile(p, true),\n onOpenLauncher: (tab) => { setLauncherTab(tab || 'pending'); setLauncherOpen(true) },\n onRefresh: reloadFile,\n activePath: active,\n diffIdx, diffTotal: pendingRegions.length,\n fileIdx, fileTotal: sum.pendingFiles.length,\n onPrevDiff: () => gotoDiff(-1), onNextDiff: () => gotoDiff(1),\n onPrevFile: () => gotoFile(-1), onNextFile: () => gotoFile(1),\n })\n : (sum.pendingFiles.length > 0\n ? React.createElement(DiffBarEmpty, {\n sum, active, staleCount: staleRegions.length,\n onNextFile: () => { if (sum.pendingFiles.length) openFile(sum.pendingFiles[0].path, true) },\n onOpenLauncher: (tab) => { setLauncherTab(tab || 'pending'); setLauncherOpen(true) },\n onRefresh: reloadFile,\n })\n : null))\n\n return React.createElement('div', { 'data-edrv-view': '1', style: { height: '100%', minHeight: 0, display: 'flex', flexDirection: 'column', background: 'var(--dsw-alias-bg-base,transparent)', overflow: 'hidden' } },\n pathBar,\n tabRow,\n React.createElement('div', { style: { position: 'relative', flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' } },\n body,\n hoverEl,\n overlay),\n statusBar)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffBadge:header 差异角标(仅工作区有差异时显示)。\n * 迁移自原 src/client/index.ts 的 DiffBadge,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { openEditorView, emitShowLauncher } from '../events.js'\nimport { summarize } from '../state/records.js'\n\n/**\n * 会话 header 差异角标:5s 轮询 edrv.list,有差异时显示数字徽章,点击打开编辑区并拉起 DiffLauncher。\n */\nexport function DiffBadge(props) {\n const sessionId = props?.sessionId\n const [n, setN] = React.useState(0)\n const seq = React.useRef(0)\n\n const load = React.useCallback(() => {\n if (!sessionId) return\n const s = ++seq.current\n rpc('edrv.list', { sessionId }).then((res) => {\n if (s !== seq.current || !res || !res.ok || !Array.isArray(res.records)) return\n setN(summarize(res.records).totalFiles)\n }).catch(() => {})\n }, [sessionId])\n\n React.useEffect(() => {\n load()\n const t = setInterval(load, 5000)\n const onRefresh = () => load()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => { clearInterval(t); window.removeEventListener('edrv:refresh', onRefresh) }\n }, [load])\n\n if (!n) return null\n\n const click = () => {\n openEditorView(null)\n setTimeout(() => { emitShowLauncher() }, 120)\n }\n\n return React.createElement('button', {\n onClick: click,\n title: n + ' 个文件有差异,点击在编辑区查看',\n style: { position: 'relative', display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 30, height: 30, padding: 0, background: 'transparent', border: 'none', borderRadius: 6, cursor: 'pointer' },\n },\n React.createElement('img', { src: '/edrv/assets/compare-select.png', alt: '差异', style: { width: 22, height: 22, display: 'block' } }),\n React.createElement('span', { style: { position: 'absolute', top: 1, right: 0, minWidth: 15, height: 15, padding: '0 3px', borderRadius: 8, background: 'var(--dsw-alias-state-warn-primary,#d97706)', color: '#fff', fontSize: 10, lineHeight: '15px', textAlign: 'center', fontWeight: 700, boxSizing: 'border-box' } }, String(n)))\n}\n","/**\n * dsh-vscode-mode client — 兼容层:设置桥选择 / slot 安全注册 / openPath 链式补丁 / 外部插件常量。\n * 纯逻辑与薄 ctx 胶水,node 环境可单测(不依赖 DOM)。\n * 作者 ddj 2026年08月24号\n */\n\n/** 本插件包名(与 host compat.PLUGIN_NAME 对应)。 */\nexport const PLUGIN_NAME = 'dsh-vscode-mode'\n/** 外部侧栏插件名(dsh-web-ui-all 家族的文件打开能力提供方)。 */\nexport const SIDEBAR_PLUGIN = 'dsh-better-sidebar'\n\n/** 设置 scope 的跨组件上下文形状(与官方 settingsScope 绑定的最小面)。 */\nexport interface SettingsScopeLike {\n getSnapshot: () => { status?: string; value?: { fileOpenTool?: unknown }; writable?: boolean }\n subscribe: (listener: () => void) => () => void\n set: (field: string, value: unknown) => Promise<void>\n}\n\n/**\n * 设置桥三级优先:webUiSettings(linxin666 兼容桥)→ settingsScope(官方)→ 无。\n * 桥绑定抛错时降级到下一级,不让单个桥异常拖垮设置装配。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 激活的桥名称与绑定 scope\n */\nexport function pickSettingsBinder(ctx: { get: (name: string) => unknown }): { service: string; scope: SettingsScopeLike | undefined } {\n for (const service of ['webUiSettings', 'settingsScope']) {\n try {\n const binder = ctx.get(service) as { bind?: (spec: { namespace: string }) => SettingsScopeLike } | undefined\n const scope = binder?.bind?.({ namespace: PLUGIN_NAME })\n if (scope) return { service, scope }\n } catch {\n /* 桥异常时降级到下一级 */\n }\n }\n return { service: 'none', scope: undefined }\n}\n\n/** slot 注册描述(对齐 ctx.slots.register 的形状)。 */\nexport interface SlotSpec {\n name: string\n id: string\n order?: number\n label?: string\n inject?: (sessionId: string) => object\n}\n\n/**\n * 跨版本 slot 安全注册:封装 ctx.slots.inject 等待声明模式(新老 DSH 通用),\n * 服务缺失或注册抛错时降级为警告,不让单条 slot 拖垮装配。\n * 注意:方法必须挂在服务对象上调用(slots.register 是依赖 this.records 的类方法,\n * 解构后 this 丢失会静默失败),故禁止解构。\n * @author ddj 2026年08月24号\n * @param ctx 客户端上下文(slots 服务)\n * @param spec slot 描述\n * @param render 渲染函数\n */\nexport function registerSlotSafely(ctx: { slots?: { inject?: (name: string, register: () => unknown) => unknown; register?: (...args: unknown[]) => unknown } }, spec: SlotSpec, render: (props: unknown) => unknown): void {\n const slots = ctx?.slots as { inject: (name: string, register: () => unknown) => unknown; register: (...args: unknown[]) => unknown } | undefined\n if (!slots || typeof slots.inject !== 'function' || typeof slots.register !== 'function') {\n console.warn('[' + PLUGIN_NAME + '] slots 服务不可用,跳过 slot ' + spec.name)\n return\n }\n try {\n slots.inject(spec.name, () => slots.register(spec, render))\n } catch (error) {\n console.warn('[' + PLUGIN_NAME + '] slot ' + spec.name + ' 注册失败(' + String(error) + '),已跳过')\n }\n}\n\n/**\n * 链式补丁对象方法:保存原实现、装入包装实现,dispose 恢复。\n * 恢复带归属校验(仅当当前实现仍是本包装时还原),多插件补丁按栈序互不踩踏。\n * @author ddj 2026年08月24号\n * @param owner 目标对象\n * @param key 方法名\n * @param wrapper 包装实现(original 为补丁前的实现)\n * @returns 恢复函数(幂等)\n */\nexport function patchMethod<T extends object, K extends keyof T>(\n owner: T,\n key: K,\n wrapper: (original: T[K], ...args: never[]) => unknown,\n): () => void {\n const original = owner[key]\n const patched = ((...args: never[]) => wrapper(original, ...args)) as T[K]\n owner[key] = patched\n return () => {\n if (owner[key] === patched) owner[key] = original\n }\n}\n","/**\n * dsh-vscode-mode client — 文件打开器注册表与自动选择。\n * @author ddj 2026年08月24号\n */\nimport { SIDEBAR_PLUGIN } from './compat.js'\n\nexport const AUTO_OPEN_TOOL = 'auto'\nexport const SYSTEM_OPEN_TOOL = 'system'\nexport const VSCODE_OPEN_TOOL = 'dsh-vscode-mode'\nexport const SIDEBAR_OPEN_TOOL = SIDEBAR_PLUGIN\n\nexport interface FileOpenContext {\n sessionId?: string\n cwd?: string\n}\n\nexport interface FileOpener {\n id: string\n label: string\n description?: string\n priority?: number\n isAvailable?: () => boolean\n open: (path: string, context: FileOpenContext) => void | Promise<void>\n}\n\nexport interface FileOpenerRegistry {\n register(opener: FileOpener): () => void\n registerFileOpener(opener: FileOpener): () => void\n list(): readonly FileOpener[]\n subscribe(listener: () => void): () => void\n get(id: string): FileOpener | undefined\n}\n\n/**\n * 写入外部打开器并触发注册表通知。\n * @author ddj 2026年08月24号\n * @param entries 打开器存储\n * @param notify 变更通知\n * @param opener 打开器\n */\nfunction registryRegister(entries: Map<string, FileOpener>, notify: () => void, opener: FileOpener): void {\n if (!opener.id || typeof opener.open !== 'function') throw new TypeError('文件打开器必须提供 id 和 open')\n entries.set(opener.id, opener)\n notify()\n}\n\n/**\n * 创建生命周期独立的文件打开器注册表。\n * @author ddj 2026年08月24号\n * @returns 文件打开器注册表\n */\nexport function createFileOpenerRegistry(): FileOpenerRegistry {\n const entries = new Map<string, FileOpener>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) listener()\n }\n const list = (): readonly FileOpener[] => [...entries.values()].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n return {\n register(opener: FileOpener): () => void {\n registryRegister(entries, notify, opener)\n return () => {\n if (entries.get(opener.id) !== opener) return\n entries.delete(opener.id)\n notify()\n }\n },\n registerFileOpener(opener: FileOpener): () => void {\n registryRegister(entries, notify, opener)\n return () => {\n if (entries.get(opener.id) !== opener) return\n entries.delete(opener.id)\n notify()\n }\n },\n list,\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n get: (id: string) => entries.get(id),\n }\n}\n\n/**\n * 检查打开器当前是否可用。\n * @author ddj 2026年08月24号\n * @param opener 待检查打开器\n * @returns 是否可用\n */\nexport function isAvailable(opener: FileOpener): boolean {\n try {\n return opener.isAvailable ? opener.isAvailable() : true\n } catch {\n return false\n }\n}\n\n/**\n * 返回当前可展示的文件打开器。\n * @author ddj 2026年08月24号\n * @param registry 文件打开器注册表\n * @returns 可用打开器列表\n */\nexport function availableOpeners(registry: FileOpenerRegistry): FileOpener[] {\n return registry.list().filter(isAvailable)\n}\n\n/**\n * 按设置选择打开器,不可用时回退自动优先级。\n * @author ddj 2026年08月24号\n * @param registry 文件打开器注册表\n * @param selected 用户选择的打开器 id\n * @returns 选中的打开器\n */\nexport function selectOpener(\n registry: FileOpenerRegistry,\n selected: string,\n): FileOpener | undefined {\n if (selected !== AUTO_OPEN_TOOL) {\n const requested = registry.get(selected)\n if (requested && isAvailable(requested)) return requested\n }\n return availableOpeners(registry)[0]\n}\n\n/**\n * 结构化探测 dsh-better-sidebar 的文件打开能力。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 侧边栏打开器或 undefined\n */\nexport function scanSidebar(ctx: { get: (name: string) => unknown }): FileOpener | undefined {\n try {\n const service = ctx.get('betterSidebar') as {\n openFile?: (scope: { sessionId: string; cwd?: string }, path: string, title?: string) => void\n isTabEnabled?: (id: string) => boolean\n features?: readonly string[]\n getSnapshot?: () => { state?: unknown }\n } | undefined\n if (!service || typeof service.openFile !== 'function') return undefined\n const advertised = service.features?.includes('openFile') ?? true\n if (!advertised) return undefined\n const canOpen = typeof service.isTabEnabled !== 'function' || service.isTabEnabled('editor')\n if (!canOpen) return undefined\n return {\n id: SIDEBAR_OPEN_TOOL,\n label: 'dsh-better-sidebar',\n description: '在 dsh-web-ui-all 侧边栏编辑器中打开',\n priority: 80,\n isAvailable: () => typeof service.openFile === 'function'\n && (service.features?.includes('openFile') ?? true)\n && (typeof service.isTabEnabled !== 'function' || service.isTabEnabled('editor')),\n open: (path, context) => {\n if (!context.sessionId) throw new Error('当前没有活动会话')\n service.openFile!({ sessionId: context.sessionId, cwd: context.cwd }, path, baseName(path))\n },\n }\n } catch {\n return undefined\n }\n}\n\n/**\n * 从路径提取文件名。\n * @author ddj 2026年08月24号\n * @param path 文件路径\n * @returns 文件名\n */\nexport function baseName(path: string): string {\n const normalized = path.replace(/\\\\/g, '/')\n return normalized.slice(normalized.lastIndexOf('/') + 1) || path\n}\n","/**\n * dsh-vscode-mode client — 设置 scope 的跨组件上下文。\n * 绑定逻辑(webUiSettings 兼容桥 → 官方 settingsScope 降级)统一由 compat 层提供。\n * 作者 ddj 2026年08月24号\n */\nimport React from 'react'\nimport { pickSettingsBinder, type SettingsScopeLike } from './compat.js'\n\nexport type { SettingsScopeLike }\n\nexport const SettingsContext = React.createContext<SettingsScopeLike | undefined>(undefined)\n\n/**\n * 从 Cordis 服务绑定 VSCodeMode 设置 scope(兼容桥优先,官方次之)。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 设置 scope 或 undefined\n */\nexport function getSettingsScope(ctx: { get: (name: string) => unknown }): SettingsScopeLike | undefined {\n return pickSettingsBinder(ctx).scope\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — VSCodeMode 设置区内的 MCP 管理。\n * 子 Tab:我的 MCP(profile 全局)/ 项目 MCP(各项目 .mcp.json)/ MCP 市场(占位)。\n * 作者 ddj 2026年08月22号\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport type { MpcProject, MpcServer } from '../../shared/mcp.js'\nimport '../styles/mcp.css'\nimport { availableOpeners, AUTO_OPEN_TOOL } from '../fileOpeners.js'\nimport { SettingsContext } from '../settingsContext.js'\n\nconst EMPTY = { serverName: '', transport: 'stdio', command: '', args: '', cwd: '', url: '', headers: '' }\n\n/** 将表单草稿转换为 Host MCP 配置。 */\nfunction configOf(draft) {\n const config = { serverName: draft.serverName.trim(), transport: draft.transport }\n if (draft.transport === 'stdio') {\n config.command = draft.command.trim()\n config.args = draft.args.split(/\\r?\\n|\\s+/).filter(Boolean)\n if (draft.cwd.trim()) config.cwd = draft.cwd.trim()\n } else {\n config.url = draft.url.trim()\n config.headers = parsePairs(draft.headers)\n }\n return config\n}\n\n/** 解析每行 key=value 的表单字段。 */\nfunction parsePairs(text) {\n return Object.fromEntries(text.split(/\\r?\\n/).map((line) => line.trim()).filter(Boolean).map((line) => {\n const idx = line.indexOf('=')\n return idx > 0 ? [line.slice(0, idx).trim(), line.slice(idx + 1).trim()] : [line, '']\n }))\n}\n\n/** 服务状态文案。 */\nfunction statusOf(server) {\n return server.status === 'connected' ? '在线' : server.status === 'connecting' ? '连接中' : server.status === 'disabled' ? '已禁用' : '错误'\n}\n\n/** MCP 服务卡片(全局与项目共用)。 */\nfunction ServerCard({ server, onRefresh, onToggle, onRemove }) {\n return React.createElement('article', { className: 'vsm-mcp-card' },\n React.createElement('div', { className: 'vsm-mcp-card-head' },\n React.createElement('div', { className: 'vsm-mcp-title' }, React.createElement('span', { className: 'vsm-mcp-dot ' + (server.enabled ? server.status : 'disabled') }), server.serverName),\n React.createElement('div', { className: 'vsm-mcp-actions' },\n React.createElement('button', { onClick: () => onRefresh(server.id), title: '刷新连接' }, '↻'),\n React.createElement('button', { className: 'vsm-danger', onClick: () => onRemove(server.id), title: '删除 MCP' }, '⌫'),\n React.createElement('button', { className: 'vsm-switch ' + (server.enabled ? 'on' : ''), onClick: () => onToggle(server), 'aria-label': server.enabled ? '禁用' : '启用' }, server.enabled ? '●' : '○'),\n ),\n ),\n React.createElement('div', { className: 'vsm-mcp-meta' }, statusOf(server), ' · ', server.toolCount, ' 个工具 · ', server.transport),\n server.error && React.createElement('div', { className: 'vsm-mcp-error' }, server.error),\n React.createElement('div', { className: 'vsm-mcp-tools' }, server.tools.map((tool) => React.createElement('span', { key: tool.name, className: 'vsm-mcp-chip', title: tool.description || tool.name }, tool.name))),\n )\n}\n\n/** 按项目标题或路径过滤,大小写不敏感。 */\nexport function filterProjects(projects, query) {\n const needle = String(query ?? '').trim().toLowerCase()\n if (!needle) return projects\n return projects.filter((project) => `${project.title} ${project.workspacePath}`.toLowerCase().includes(needle))\n}\n\n/** 带搜索的项目组合框。 */\nfunction ProjectPicker({ projects, value, onChange }) {\n const [open, setOpen] = React.useState(false)\n const [query, setQuery] = React.useState('')\n const [highlight, setHighlight] = React.useState(0)\n const rootRef = React.useRef(null)\n const selected = projects.find((project) => project.workspacePath === value)\n const filtered = React.useMemo(() => filterProjects(projects, query), [projects, query])\n\n React.useEffect(() => {\n const close = (event) => {\n if (!rootRef.current?.contains(event.target)) setOpen(false)\n }\n document.addEventListener('mousedown', close)\n return () => document.removeEventListener('mousedown', close)\n }, [])\n\n const choose = (project) => {\n onChange(project.workspacePath)\n setQuery('')\n setOpen(false)\n }\n const move = (delta) => setHighlight((old) => Math.max(0, Math.min(Math.max(0, filtered.length - 1), old + delta)))\n const keyDown = (event) => {\n if (event.key === 'ArrowDown') { event.preventDefault(); move(1) }\n else if (event.key === 'ArrowUp') { event.preventDefault(); move(-1) }\n else if (event.key === 'Enter' && filtered[highlight]) { event.preventDefault(); choose(filtered[highlight]) }\n else if (event.key === 'Escape') { event.preventDefault(); setOpen(false) }\n }\n return React.createElement('div', { className: 'vsm-project-picker', ref: rootRef },\n React.createElement('button', { className: 'vsm-project-picker-trigger', role: 'combobox', 'aria-expanded': open, onClick: () => setOpen((old) => !old) },\n React.createElement('span', { className: 'vsm-project-picker-label' }, selected?.title || '选择项目', selected && React.createElement('small', null, selected.workspacePath)),\n React.createElement('span', { className: 'vsm-project-picker-arrow' }, open ? '⌃' : '⌄'),\n ),\n open && React.createElement('div', { className: 'vsm-project-picker-menu' },\n React.createElement('input', { autoFocus: true, className: 'vsm-project-picker-search', value: query, placeholder: '搜索项目名称或路径…', onChange: (event) => { setQuery(event.target.value); setHighlight(0) }, onKeyDown: keyDown }),\n React.createElement('div', { className: 'vsm-project-picker-options', role: 'listbox' }, filtered.length ? filtered.map((project, index) => React.createElement('button', { key: project.workspacePath, role: 'option', 'aria-selected': project.workspacePath === value, className: 'vsm-project-option ' + (index === highlight ? 'highlight' : '') + (project.workspacePath === value ? ' selected' : ''), onMouseEnter: () => setHighlight(index), onClick: () => choose(project) }, React.createElement('span', null, project.title), React.createElement('small', null, project.workspacePath, ' · ', project.servers.length, ' 个 MCP'))) : React.createElement('div', { className: 'vsm-project-picker-empty' }, '没有匹配的项目')),\n ),\n )\n}\n\n/** 单个项目的 MCP 分组。 */\nfunction ProjectGroup({ project, busy, onAdd, onRefresh, onToggle, onRemove }) {\n const head = React.createElement('div', { className: 'vsm-project-head' },\n React.createElement('div', { className: 'vsm-project-title' }, React.createElement('span', { className: 'vsm-project-icon' }, '▣'), React.createElement('div', null, React.createElement('span', { className: 'vsm-project-name' }, project.title), React.createElement('span', { className: 'vsm-project-path' }, project.workspacePath))),\n React.createElement('button', { className: 'vsm-primary vsm-small', onClick: () => onAdd(project) }, '+ 添加 MCP'),\n )\n let body\n if (project.missingDir) body = React.createElement('div', { className: 'vsm-project-empty' }, '项目目录已不存在,无法管理 MCP')\n else if (project.fileError) body = React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, project.fileError)\n else if (!project.servers.length) body = React.createElement('div', { className: 'vsm-project-empty' }, '此项目未配置 MCP')\n else body = project.servers.map((server) => React.createElement(ServerCard, { key: server.serverName, server, onRefresh: (id) => onRefresh(project, server, id), onToggle: () => onToggle(project, server), onRemove: (id) => onRemove(project, server, id) }))\n return React.createElement('section', { className: 'vsm-project' }, head, body)\n}\n\n/** 通用设置:选择当前对话文件链接的打开器。 */\nfunction GeneralSettings({ registry }) {\n const [tool, setTool] = React.useState(AUTO_OPEN_TOOL)\n const [busy, setBusy] = React.useState(false)\n const [error, setError] = React.useState('')\n const settings = React.useContext(SettingsContext)\n const snapshot = settings?.getSnapshot?.()\n const loading = !snapshot || snapshot.status === 'loading'\n const unavailable = snapshot?.status === 'unavailable' || !settings\n const notReady = snapshot?.status !== 'ready'\n React.useEffect(() => {\n const onChange = () => {\n const next = settings?.getSnapshot?.().value?.fileOpenTool\n if (typeof next === 'string') setTool(next)\n }\n onChange()\n return settings?.subscribe?.(onChange)\n }, [settings])\n const save = (value) => {\n setTool(value); setBusy(true); setError('')\n if (!settings?.set) { setError('设置服务不可用'); setBusy(false); return }\n settings.set('fileOpenTool', value).catch((e) => setError(String(e))).finally(() => setBusy(false))\n }\n const options = [{ id: AUTO_OPEN_TOOL, label: '自动选择', description: '按当前已注册工具自动选择' }, ...availableOpeners(registry).map((item) => ({ id: item.id, label: item.label, description: item.description }))]\n const currentOption = options.some((item) => item.id === tool) ? tool : AUTO_OPEN_TOOL\n return React.createElement('section', { className: 'vsm-general-page' },\n React.createElement('h2', null, '通用'),\n React.createElement('p', null, '配置 DSH 对话中文件链接的打开工具。工具由当前运行时自动扫描。'),\n unavailable && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, '设置服务暂不可用,当前使用自动选择。'),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n React.createElement('label', { className: 'vsm-general-row' }, React.createElement('span', null, '文件链接使用工具'), React.createElement('select', { value: currentOption, disabled: loading || unavailable || notReady || busy || snapshot?.writable === false, onChange: (event) => save(event.target.value) }, options.map((item) => React.createElement('option', { key: item.id, value: item.id }, item.label))), loading && React.createElement('small', null, '读取中…')),\n )\n}\n\n/** 兼容性小节:host 报告(RPC compat)+ 客户端本地适配项。 */\nfunction CompatSection({ getSummary }) {\n const [report, setReport] = React.useState(null)\n const [error, setError] = React.useState('')\n React.useEffect(() => {\n let alive = true\n rpc('compat', {}).then((result) => {\n if (!alive) return\n if (!result.ok) setError(String(result.error))\n else setReport(result.report)\n }).catch((e) => { if (alive) setError(String(e)) })\n return () => { alive = false }\n }, [])\n const renderItems = (list) => (list ?? []).map((item) => React.createElement('div', { key: item.name, className: 'vsm-compat-item ' + (item.active ? 'ok' : 'warn') },\n React.createElement('span', { className: 'vsm-compat-name' }, item.name),\n React.createElement('span', { className: 'vsm-compat-note' }, item.note ?? (item.active ? '正常' : '未生效')),\n ))\n const warnings = report?.warnings ?? []\n return React.createElement('section', { className: 'vsm-general-page' },\n React.createElement('h2', null, '兼容性'),\n React.createElement('p', null, '检测与其他插件 / DSH 版本的适配状态与已知问题。' + (report?.pluginVersion ? '(插件版本 ' + report.pluginVersion + ')' : '')),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n React.createElement('h3', { className: 'vsm-compat-h3' }, '外部插件与服务'),\n renderItems(report?.external),\n React.createElement('h3', { className: 'vsm-compat-h3' }, '客户端适配'),\n renderItems(getSummary?.() ?? []),\n React.createElement('h3', { className: 'vsm-compat-h3' }, '护栏'),\n renderItems(report?.guards),\n React.createElement('h3', { className: 'vsm-compat-h3' }, '警告'),\n warnings.length ? warnings.map((w, index) => React.createElement('div', { key: index, className: 'vsm-mcp-error vsm-mcp-banner' }, w)) : React.createElement('div', { className: 'vsm-compat-item ok' }, React.createElement('span', { className: 'vsm-compat-name' }, '未检测到兼容性问题'), React.createElement('span', { className: 'vsm-compat-note' }, '')),\n )\n}\n\n/** MCP 管理主面板。 */\nexport function McpSettings(props) {\n const openerRegistry = props?.openerRegistry ?? { list: () => [] }\n const compatSummary = props?.compatSummary ?? (() => [])\n const [servers, setServers] = React.useState<MpcServer[]>([])\n const [projects, setProjects] = React.useState<MpcProject[]>([])\n const [loading, setLoading] = React.useState(true)\n const [busy, setBusy] = React.useState('')\n const [error, setError] = React.useState('')\n const [tab, setTab] = React.useState('general')\n const [draft, setDraft] = React.useState(EMPTY)\n const [showForm, setShowForm] = React.useState(false)\n const [projectForm, setProjectForm] = React.useState(null)\n const [selectedPath, setSelectedPath] = React.useState('')\n\n React.useEffect(() => {\n if (!projects.length) {\n setSelectedPath('')\n return\n }\n if (!projects.some((project) => project.workspacePath === selectedPath)) setSelectedPath(projects[0].workspacePath)\n }, [projects, selectedPath])\n\n const loadAll = React.useCallback(() => {\n setLoading(true)\n setError('')\n Promise.all([rpc('mcp.list', {}), rpc('mcp.projects', {})]).then(([list, prj]) => {\n if (!list.ok) throw new Error(list.error)\n if (!prj.ok) throw new Error(prj.error)\n setServers(list.servers)\n setProjects(prj.projects)\n }).catch((e) => setError(String(e))).finally(() => setLoading(false))\n }, [])\n\n React.useEffect(loadAll, [loadAll])\n\n const finish = (result) => {\n if (!result.ok) throw new Error(result.error)\n return result\n }\n\n const action = (label, id, method, args, patch) => {\n setBusy(id)\n setError('')\n return rpc(method, args).then(finish).then((result) => {\n if (patch) patch(result)\n }).catch((e) => setError(String(e))).finally(() => setBusy('')).then(() => label)\n }\n\n const refreshGlobal = (id) => action('refresh', id, 'mcp.refresh', { id }, (r) => setServers((old) => old.map((s) => s.id === id ? r.server : s)))\n const toggleGlobal = (s) => action('toggle', s.id, 'mcp.toggle', { id: s.id, enabled: !s.enabled }, (r) => setServers((old) => old.map((x) => x.id === s.id ? r.server : x)))\n const removeGlobal = (s) => window.confirm('确认删除此 MCP 服务?') && action('remove', s.id, 'mcp.remove', { id: s.id }, (r) => setServers((old) => old.filter((x) => x.id !== s.id)))\n\n const replaceProject = (workspacePath) => (result) => setProjects((old) => old.map((p) => p.workspacePath === workspacePath ? result.project : p))\n const projectAction = (workspacePath, serverName, method, args, patch) => {\n setBusy(workspacePath + ':' + serverName)\n setError('')\n return rpc(method, args).then(finish).then((result) => {\n if (patch) patch(result)\n }).catch((e) => setError(String(e))).finally(() => setBusy(''))\n }\n\n const refreshProject = (p, s) => projectAction(p.workspacePath, s.serverName, 'mcp.projectRefresh', { workspacePath: p.workspacePath, serverName: s.serverName }, replaceProject(p.workspacePath))\n const toggleProject = (p, s) => projectAction(p.workspacePath, s.serverName, 'mcp.projectToggle', { workspacePath: p.workspacePath, serverName: s.serverName, enabled: !s.enabled }, replaceProject(p.workspacePath))\n const removeProject = (p, s) => window.confirm('确认删除此项目的 MCP「' + s.serverName + '」?') && projectAction(p.workspacePath, s.serverName, 'mcp.projectRemove', { workspacePath: p.workspacePath, serverName: s.serverName }, replaceProject(p.workspacePath))\n\n const saveGlobal = () => {\n setBusy('save')\n setError('')\n rpc('mcp.save', { config: configOf(draft) }).then(finish).then((result) => {\n setServers((old) => old.some((s) => s.id === result.server.id) ? old.map((s) => s.id === result.server.id ? result.server : s) : old.concat(result.server))\n setDraft(EMPTY)\n setShowForm(false)\n }).catch((e) => setError(String(e))).finally(() => setBusy(''))\n }\n\n const saveProject = () => {\n if (!projectForm) return\n setBusy('project-save')\n setError('')\n const config = configOf(draft)\n rpc('mcp.projectSave', { workspacePath: projectForm.workspacePath, serverName: config.serverName, config }).then(finish).then((result) => {\n setProjects((old) => old.map((p) => p.workspacePath === projectForm.workspacePath ? result.project : p))\n setDraft(EMPTY)\n setProjectForm(null)\n }).catch((e) => setError(String(e))).finally(() => setBusy(''))\n }\n\n const edit = (key, value) => setDraft((old) => ({ ...old, [key]: value }))\n const marketBody = React.createElement('div', { className: 'vsm-mcp-empty' }, 'MCP 市场暂未接入')\n const selectedProject = projects.find((project) => project.workspacePath === selectedPath)\n const projectBody = projects.length ? React.createElement(React.Fragment, null,\n React.createElement(ProjectPicker, { projects, value: selectedPath, onChange: setSelectedPath }),\n selectedProject ? React.createElement(ProjectGroup, { project: selectedProject, busy, onAdd: (project) => { setDraft(EMPTY); setProjectForm({ workspacePath: project.workspacePath, title: project.title }) }, onRefresh: refreshProject, onToggle: toggleProject, onRemove: removeProject }) : React.createElement('div', { className: 'vsm-mcp-empty' }, '请选择项目'),\n ) : React.createElement('div', { className: 'vsm-mcp-empty' }, '还没有项目')\n let body\n if (loading) body = React.createElement('div', { className: 'vsm-mcp-empty' }, '正在读取 MCP 服务…')\n else if (tab === 'general') body = React.createElement(GeneralSettings, { registry: openerRegistry })\n else if (tab === 'mine') body = React.createElement('div', null, servers.length ? servers.map((s) => React.createElement(ServerCard, { key: s.id, server: s, onRefresh: refreshGlobal, onToggle: toggleGlobal, onRemove: removeGlobal })) : React.createElement('div', { className: 'vsm-mcp-empty' }, '还没有配置全局 MCP'))\n else if (tab === 'projects') body = projectBody\n else if (tab === 'compat') body = React.createElement(CompatSection, { getSummary: compatSummary })\n else body = marketBody\n const form = showForm ? React.createElement(McpForm, { title: '添加全局 MCP', draft, busy, edit, save: saveGlobal, close: () => setShowForm(false) }) : projectForm ? React.createElement(McpForm, { title: '添加项目 MCP · ' + projectForm.title, draft, busy, edit, save: saveProject, close: () => setProjectForm(null) }) : null\n return React.createElement('section', { className: 'vsm-mcp-page' },\n React.createElement('header', { className: 'vsm-mcp-header' }, React.createElement('div', null, React.createElement('h2', null, 'VSCodeMode'), React.createElement('p', null, '管理当前 profile 与各项目的 Model Context Protocol 服务。')), React.createElement('button', { className: 'vsm-primary', onClick: () => { setDraft(EMPTY); setShowForm(true) } }, '+ 添加全局 MCP')),\n React.createElement('nav', { className: 'vsm-mcp-tabs' }, React.createElement('button', { className: tab === 'general' ? 'active' : '', onClick: () => setTab('general') }, '通用'), React.createElement('button', { className: tab === 'mine' ? 'active' : '', onClick: () => setTab('mine') }, '我的 MCP'), React.createElement('button', { className: tab === 'projects' ? 'active' : '', onClick: () => setTab('projects') }, '项目 MCP'), React.createElement('button', { className: tab === 'market' ? 'active' : '', onClick: () => setTab('market') }, 'MCP 市场'), React.createElement('button', { className: tab === 'compat' ? 'active' : '', onClick: () => setTab('compat') }, '兼容性')),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n body,\n form,\n )\n}\n\n/** MCP 新增表单(全局/项目共用)。 */\nfunction McpForm({ title, draft, busy, edit, save, close }) {\n const input = (key, placeholder) => React.createElement('input', { value: draft[key], onChange: (e) => edit(key, e.target.value), placeholder })\n const fields = draft.transport === 'stdio' ? React.createElement(React.Fragment, null, React.createElement('label', null, '命令', input('command', 'npx')), React.createElement('label', null, '参数(空格或换行分隔)', React.createElement('textarea', { value: draft.args, onChange: (e) => edit('args', e.target.value) })), React.createElement('label', null, '工作目录(可选)', input('cwd', ''))) : React.createElement(React.Fragment, null, React.createElement('label', null, 'URL', input('url', 'http://localhost:3000/mcp')), React.createElement('label', null, '请求头(每行 key=value)', React.createElement('textarea', { value: draft.headers, onChange: (e) => edit('headers', e.target.value) })))\n return React.createElement('div', { className: 'vsm-mcp-modal' }, React.createElement('div', { className: 'vsm-mcp-dialog' }, React.createElement('h3', null, title), React.createElement('label', null, '名称', input('serverName', '例如 codegraph')), React.createElement('label', null, '传输方式', React.createElement('select', { value: draft.transport, onChange: (e) => edit('transport', e.target.value) }, React.createElement('option', { value: 'stdio' }, 'stdio'), React.createElement('option', { value: 'streamable-http' }, 'streamable-http'))), fields, React.createElement('div', { className: 'vsm-mcp-dialog-actions' }, React.createElement('button', { onClick: close }, '取消'), React.createElement('button', { className: 'vsm-primary', disabled: busy === 'save' || busy === 'project-save', onClick: save }, '保存并连接'))))\n}\n","/**\n * dsh-vscode-mode client — DSH 对话文件链接的统一打开路由。\n * openPath 补丁经 compat.patchMethod 安装(链式恢复,多插件补丁互不踩踏)。\n * 作者 ddj 2026年08月24号\n */\nimport { patchMethod } from './compat.js'\nimport { openEditorView } from './events.js'\nimport { AUTO_OPEN_TOOL, VSCODE_OPEN_TOOL, type FileOpenContext, type FileOpenerRegistry, isAvailable, selectOpener } from './fileOpeners.js'\n\nexport interface OpenPathRouterOptions {\n workspaces: { openPath: (path: string) => Promise<void> }\n registry: FileOpenerRegistry\n selected: () => string\n context: () => FileOpenContext\n logger?: (message: string) => void\n}\n\n/**\n * 安装可卸载的 workspaces.openPath 路由。\n * @author ddj 2026年08月24号\n * @param options 路由依赖\n * @returns 恢复原方法的 disposer\n */\nexport function installOpenPathRouter(options: OpenPathRouterOptions): () => void {\n const open = async (original: (path: string) => Promise<void>, path: string): Promise<void> => {\n const context = options.context()\n const opener = selectOpener(options.registry, options.selected())\n if (!opener || !isAvailable(opener)) return original.call(options.workspaces, path)\n try {\n await opener.open(path, context)\n } catch (error) {\n options.logger?.('文件打开器 ' + opener.id + ' 失败,回退系统打开: ' + String(error))\n if (opener.id !== 'system') await original.call(options.workspaces, path)\n else throw error\n }\n }\n return patchMethod(options.workspaces, 'openPath', open as never)\n}\n\n/**\n * 创建 VSCodeMode 内置文件打开器。\n * @author ddj 2026年08月24号\n * @returns VSCodeMode 打开器\n */\nexport function vscodeOpener(): { id: string; label: string; priority: number; open: (path: string) => void } {\n return { id: VSCODE_OPEN_TOOL, label: 'VSCodeMode', priority: 100, open: (path) => openEditorView(path) }\n}\n\n/**\n * 规范化设置中的打开器 id。\n * @author ddj 2026年08月24号\n * @param value 原始设置值\n * @returns 可路由的打开器 id\n */\nexport function autoValue(value: unknown): string {\n return typeof value === 'string' && value.trim() ? value.trim() : AUTO_OPEN_TOOL\n}\n","/**\n * dsh-vscode-mode client — 浏览器半入口:slot 注册 + 装配。\n * 挂点:conversation.view「文件编辑」页签(中央 Monaco 编辑器)+ header 差异角标。\n * 与 Host 通信:同源 fetch('/edrv/rpc')(shared/rpc 契约)。\n *\n * ⚠️ 跨版本 slot 装配(2026-08-21):新版 DSH 的 slots 系统要求 slot 必须由父 entry\n * 的 children table 先声明,直接 `ctx.slots.register({name:'conversation.view'})` 在\n * 声明未就绪时抛 `slot ... is not declared (a parent entry's children table must declare it)`。\n * 正确写法 = `ctx.slots.inject(name, () => ctx.slots.register(...))`:声明存在时同步\n * 执行,否则等待声明(官方 ui-conversation 自身即此模式);旧版(rc.8 及更早)同样支持,\n * 故跨版本兼容。slot 名未变:conversation.view / conversation.session.header.utilities。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport './styles/editor.css'\nimport { EditorView } from './ui/EditorView.js'\nimport { DiffBadge } from './ui/DiffBadge.js'\nimport { McpSettings } from './ui/McpSettings.js'\nimport { rpc } from './rpc.js'\nimport { createFileOpenerRegistry, scanSidebar, type FileOpenContext } from './fileOpeners.js'\nimport type { FileOpenerRegistry } from './fileOpeners.js'\nimport { installOpenPathRouter, vscodeOpener, autoValue } from './openPathRouter.js'\nimport { SettingsContext } from './settingsContext.js'\nimport { SIDEBAR_PLUGIN, pickSettingsBinder, registerSlotSafely } from './compat.js'\nimport type { CompatAdapter } from '../shared/compat.js'\n\nexport const inject = ['slots', 'timer', 'locale', 'connection', 'remote', 'workspaces', 'sessions', 'settingsScope', 'webUiSettings']\n\n/**\n * 装配客户端:注册中央编辑区视图与 header 差异角标。\n * @author ddj 2026年08月20号\n * @param ctx 客户端根上下文(slots + timer 服务)\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function apply(ctx: any): void {\n const schedule = (fn: () => void, ms: number) => ctx.timeout(fn, ms)\n const registry: FileOpenerRegistry = createFileOpenerRegistry()\n const workspaces = ctx.get('workspaces')\n const sessions = ctx.get('sessions')\n const originalOpenPath = workspaces?.openPath\n const binder = pickSettingsBinder(ctx)\n const settings = binder.scope\n let selected = autoValue('auto')\n\n /** 客户端侧兼容摘要(与 host 报告合并展示;惰性求值保证 HMR 后仍新鲜)。 */\n const compatSummary = (): CompatAdapter[] => [\n { name: '设置桥', active: settings !== undefined, note: settings !== undefined ? '使用 ' + binder.service + ' 桥' : '未绑定设置服务(fileOpenTool 持久化不可用)' },\n { name: '文件打开路由(workspaces.openPath)', active: Boolean(workspaces?.openPath), note: 'vscode 打开器优先,失败回退系统打开' },\n { name: '侧边栏打开器(' + SIDEBAR_PLUGIN + ')', active: registry.get(SIDEBAR_PLUGIN) !== undefined, note: registry.get(SIDEBAR_PLUGIN) !== undefined ? '已注册(优先级 80)' : '未检测到侧边栏打开能力' },\n ]\n\n ctx.provide('fileOpeners', registry)\n ctx.effect(() => registry.register(vscodeOpener()), 'vscode-mode: file opener')\n ctx.effect(() => registry.register({\n id: 'system', label: '系统默认应用', priority: 0,\n open: (path: string) => originalOpenPath.call(workspaces, path),\n }), 'vscode-mode: system file opener')\n ctx.effect(() => {\n const sidebar = scanSidebar(ctx)\n return sidebar ? registry.register(sidebar) : undefined\n }, 'vscode-mode: sidebar file opener')\n ctx.effect(() => {\n if (!settings) return undefined\n const sync = (): void => {\n const snapshot = settings.getSnapshot()\n if (snapshot.status === 'loading') return\n selected = autoValue(snapshot.value?.fileOpenTool)\n window.dispatchEvent(new CustomEvent('edrv:file-open-tool-change', { detail: { value: selected } }))\n }\n sync()\n return settings.subscribe(sync)\n }, 'vscode-mode: file opener setting sync')\n if (workspaces?.openPath) {\n ctx.effect(() => installOpenPathRouter({\n workspaces,\n registry,\n selected: () => selected,\n context: () => {\n const current = sessions?.list?.getSnapshot?.()\n const sessionId = current?.current\n const summary = sessionId ? current?.byId?.[sessionId] : undefined\n return { sessionId, cwd: summary?.cwd } as FileOpenContext\n },\n logger: (message: string) => console.warn('[dsh-vscode-mode] ' + message),\n }), 'vscode-mode: file link routing')\n }\n\n // 中央「文件编辑」页签:类 VSCode 编辑器(顶部=文件页签+搜索框,差异 UI=文件底部圆角悬浮框)\n registerSlotSafely(ctx, {\n name: 'conversation.view',\n id: 'edrv-editor',\n order: 5,\n label: '文件编辑',\n inject: (sessionId: string) => ({ sessionId }),\n }, (props: unknown) => React.createElement(EditorView, Object.assign({}, props, { schedule })))\n\n // header 差异角标:仅当前工作区存在差异时渲染\n registerSlotSafely(ctx, { name: 'conversation.session.header.utilities', id: 'edrv-diff-badge', order: 90, label: '差异' },\n (props: unknown) => React.createElement(DiffBadge, Object.assign({}, props)))\n\n // 设置页中的 VSCodeMode 专属页签,MCP 管理作为该页签的内部子 Tab。\n registerSlotSafely(ctx, {\n name: 'settings.section',\n id: 'vscode-mode',\n order: 30,\n label: 'VSCodeMode',\n }, () => React.createElement(SettingsContext.Provider, { value: settings }, React.createElement(McpSettings, { openerRegistry: registry, compatSummary })))\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["React","React","React","React","React","React","React","React","React"],"sources":["../src/shared/rpc.ts","../src/client/rpc.ts","../src/client/events.ts","../src/client/monaco/loader.ts","../src/client/monaco/diffRender.ts","../src/shared/diff.ts","../src/client/state/records.ts","../src/client/state/regions.ts","../src/client/ui/QuickOpen.ts","../src/client/ui/shared.ts","../src/client/ui/DiffBox.ts","../src/client/ui/DiffBarEmpty.ts","../src/client/ui/DiffLauncher.ts","../src/client/ui/EditorView.ts","../src/client/ui/DiffBadge.ts","../src/client/compat.ts","../src/client/fileOpeners.ts","../src/client/settingsContext.ts","../src/client/ui/McpSettings.ts","../src/client/openPathRouter.ts","../src/client/index.ts"],"sourcesContent":["/**\n * dsh-vscode-mode RPC contract — method names, per-method request/ok payloads,\n * and the typed handler map shared by the host dispatcher and the client\n * fetch wrapper. 载荷形状与历史实现一字不差,仅把隐式约定类型化。\n *\n * Purity rule: no node/react imports (same as types.ts).\n * 作者 ddj 2026-08-20\n */\nimport type {\n ArchiveBatch,\n ArchiveEntry,\n RecordView,\n StaleHunk,\n} from './types.js'\nimport type { MpcConfig, MpcProject, MpcProjectSaveInput, MpcServer } from './mcp.js'\nimport type { CompatReport, DevFormInfo } from './compat.js'\n\n/** webServer 精确路由。 */\nexport const RPC_PATH = '/edrv/rpc'\n\n/** 决策作用域:call=整条记录,hunk=单个差异块。 */\nexport type RpcScope = 'call' | 'hunk'\n\n/** 每个方法的请求参数(sessionId 为公共可选字段)。 */\nexport interface RpcRequestMap {\n 'edrv.list': { sessionId?: string; callIds?: string[] }\n 'edrv.accept': { sessionId?: string; callId: string; scope?: RpcScope; hunkIndex?: number }\n 'edrv.reject': { sessionId?: string; callId: string; scope?: RpcScope; hunkIndex?: number }\n 'edrv.read': { sessionId?: string; path: string }\n 'edrv.original': { sessionId?: string; path: string }\n 'edrv.save': { sessionId?: string; path: string; content: string }\n 'edrv.archiveList': { sessionId?: string }\n 'edrv.archiveRead': { sessionId?: string; path?: string }\n 'edrv.rollback': { sessionId?: string; path: string; batch?: number }\n 'edrv.debug': { sessionId?: string; text: string }\n 'edrv.searchFiles': { sessionId?: string; query: string }\n 'mcp.list': {}\n 'mcp.save': { config: MpcConfig }\n 'mcp.remove': { id: string }\n 'mcp.toggle': { id: string; enabled: boolean }\n 'mcp.refresh': { id: string }\n 'mcp.projects': {}\n 'mcp.projectSave': MpcProjectSaveInput\n 'mcp.projectRemove': { workspacePath: string; serverName: string }\n 'mcp.projectToggle': { workspacePath: string; serverName: string; enabled: boolean }\n 'mcp.projectRefresh': { workspacePath: string; serverName: string }\n 'vscode.fileOpenSettingsGet': {}\n 'vscode.fileOpenSettingsUpdate': { fileOpenTool: string; expectedRevision?: number }\n 'vscode.devFormGet': {}\n 'vscode.devFormSet': { enabled: boolean; path?: string }\n 'compat': {}\n}\n\nexport type RpcMethod = keyof RpcRequestMap\n\n/** 每个方法成功(ok:true)时的附加载荷。 */\nexport interface RpcOkMap {\n 'edrv.list': { records: RecordView[] }\n 'edrv.accept': { record: RecordView }\n 'edrv.reject': { record: RecordView }\n 'edrv.read': { content: string; size: number }\n 'edrv.original': { content: string; size: number; stale: StaleHunk[]; fallback: boolean }\n 'edrv.save': object\n 'edrv.archiveList': { entries: ArchiveEntry[] }\n 'edrv.archiveRead': { batches: ArchiveBatch[] }\n 'edrv.rollback': { path: string; batch: number | null }\n 'edrv.debug': object\n 'edrv.searchFiles': { files: string[]; truncated: boolean }\n 'mcp.list': { servers: MpcServer[] }\n 'mcp.save': { server: MpcServer }\n 'mcp.remove': object\n 'mcp.toggle': { server: MpcServer }\n 'mcp.refresh': { server: MpcServer }\n 'mcp.projects': { projects: MpcProject[] }\n 'mcp.projectSave': { project: MpcProject }\n 'mcp.projectRemove': { project: MpcProject }\n 'mcp.projectToggle': { project: MpcProject }\n 'mcp.projectRefresh': { project: MpcProject }\n 'vscode.fileOpenSettingsGet': { fileOpenTool: string; revision?: number }\n 'vscode.fileOpenSettingsUpdate': { fileOpenTool: string; revision?: number }\n 'vscode.devFormGet': { devForm: DevFormInfo }\n 'vscode.devFormSet': { devForm: DevFormInfo; restart: boolean }\n 'compat': { report: CompatReport }\n}\n\n/** 统一响应:{ok:true, ...payload} 或 {ok:false, error}。 */\nexport type RpcResult<M extends RpcMethod> =\n | ({ ok: true } & RpcOkMap[M])\n | { ok: false; error: string }\n\n/** 每个方法的 handler 签名(host 分发表与 client 类型检查共用)。 */\nexport type RpcHandler<M extends RpcMethod> = (\n args: RpcRequestMap[M],\n) => Promise<RpcResult<M>>\n\n/** host RPC 分发表:method → handler。 */\nexport type RpcHandlerMap = {\n [M in RpcMethod]: RpcHandler<M>\n}\n","/**\n * dsh-vscode-mode client — 类型化 RPC 包装 + 诊断日志。\n * 迁移自原 src/client/index.ts 的 rpc/dbg,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport { RPC_PATH } from '../shared/rpc.js'\nimport type { RpcMethod, RpcRequestMap, RpcResult } from '../shared/rpc.js'\n\n/** 同源 RPC 调用(host /edrv/rpc 精确路由)。 */\nexport function rpc<M extends RpcMethod>(method: M, args: RpcRequestMap[M]): Promise<RpcResult<M>> {\n return fetch(RPC_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ method, args }),\n }).then((res) => res.json()) as Promise<RpcResult<M>>\n}\n\n/**\n * 诊断日志:统一走 host edrv.debug 落盘,避免 console 刷屏。\n * @author ddj 2026年08月20号\n * @param sessionId 会话 id\n * @param text 日志文本\n */\nexport function dbg(sessionId: string | undefined, text: string): void {\n try {\n rpc('edrv.debug', { sessionId, text }).catch(() => {})\n } catch (e) { /* 日志失败忽略 */ }\n}\n","/**\n * dsh-vscode-mode client — 跨组件/跨 slot 的窗口事件助手。\n * 迁移自原 src/client/index.ts 的 openEditorView 与事件派发,语义不改。\n * 作者 ddj 2026-08-20\n */\n\n/**\n * 打开中央「文件编辑」页签:点击 shell 会话头部的视图页签(DOM 级,无需 store actions)。\n * @author ddj 2026年08月20号\n * @param path 要打开的路径(可空)\n */\nexport function openEditorView(path: string | null): void {\n const tabs = Array.from(document.querySelectorAll('div[role=\"tablist\"] button[role=\"tab\"]'))\n for (const b of tabs) {\n if (b.textContent && b.textContent.includes('文件编辑')) { (b as HTMLButtonElement).click(); break }\n }\n const p = path ?? null\n setTimeout(() => {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path: p } }))\n }, 80)\n}\n\n/** 差异状态变化:触发角标/DiffBox 重拉。 */\nexport function emitRefresh(): void {\n window.dispatchEvent(new CustomEvent('edrv:refresh'))\n}\n\n/** 打开指定路径到编辑区页签。 */\nexport function emitOpenEditor(path: string): void {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path } }))\n}\n\n/** 拉起 DiffLauncher。 */\nexport function emitShowLauncher(): void {\n window.dispatchEvent(new CustomEvent('edrv:show-launcher'))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — Monaco 加载与语言映射(AMD 构建,离线随包分发)。\n * 迁移自原 src/client/index.ts 的 MONACO_BASE/LANG_BY_EXT/langOf/loadMonaco,语义不改。\n * 作者 ddj 2026-08-20\n */\n\nexport const MONACO_BASE = '/edrv/vendor/monaco/vs'\nlet monacoPromise = null\nlet monacoStage = { phase: 'idle', progress: 0, message: '准备加载 Monaco…' }\nconst stageListeners = new Set()\n\n/**\n * Monaco 加载阶段:这是阶段进度而非网络字节进度,避免误导用户。\n * @author ddj 2026年08月22号\n */\nexport const MONACO_STAGES = {\n loader: { progress: 18, message: '加载 Monaco 引导模块…' },\n core: { progress: 72, message: '加载编辑器核心模块…' },\n ready: { progress: 100, message: 'Monaco 编辑器已就绪' },\n error: { progress: 0, message: 'Monaco 编辑器加载失败' },\n}\n\n/**\n * 发布 Monaco 加载阶段,监听器异常不得影响编辑器加载。\n * @author ddj 2026年08月22号\n * @param phase 阶段名\n * @param progress 阶段百分比\n * @param message 用户可读状态\n */\nfunction publishStage(phase, progress, message) {\n monacoStage = { phase, progress, message }\n for (const listener of stageListeners) {\n try { listener(monacoStage) } catch (error) { /* UI 回调异常忽略 */ }\n }\n}\n\n/**\n * 订阅 Monaco 加载阶段。\n * @author ddj 2026年08月22号\n * @param listener 阶段回调\n * @returns 取消订阅函数\n */\nfunction subscribeStage(listener) {\n if (typeof listener !== 'function') return () => {}\n stageListeners.add(listener)\n listener(monacoStage)\n return () => stageListeners.delete(listener)\n}\n\n/** 扩展名 → Monaco language id(常见语言;未知回退 plaintext)。 */\nexport const LANG_BY_EXT = {\n js: 'javascript', jsx: 'javascript', mjs: 'javascript', cjs: 'javascript',\n ts: 'typescript', tsx: 'typescript', mts: 'typescript', cts: 'typescript',\n json: 'json', jsonc: 'json', md: 'markdown', markdown: 'markdown', mdx: 'mdx',\n css: 'css', scss: 'scss', less: 'less', html: 'html', htm: 'html', vue: 'html', xml: 'xml',\n yaml: 'yaml', yml: 'yaml', toml: 'ini', ini: 'ini', cfg: 'ini',\n py: 'python', sh: 'shell', bash: 'shell', zsh: 'shell', ps1: 'powershell',\n lua: 'lua', java: 'java', c: 'c', h: 'c', cpp: 'cpp', cc: 'cpp', cxx: 'cpp', hpp: 'cpp',\n cs: 'csharp', go: 'go', rs: 'rust', rb: 'ruby', php: 'php', sql: 'sql',\n swift: 'swift', kt: 'kotlin', kts: 'kotlin', dart: 'dart', dockerfile: 'dockerfile'\n}\n\n/**\n * 路径 → Monaco language id:取 basename 扩展名(dockerfile/Dockerfile 特判)。\n * @author ddj 2026年08月20号\n * @param path 文件路径\n * @returns language id\n */\nexport function langOf(path) {\n const base = String(path || '').split(/[\\\\/]/).pop() || ''\n if (/^dockerfile$/i.test(base)) return 'dockerfile'\n const dot = base.lastIndexOf('.')\n if (dot <= 0) return 'plaintext'\n return LANG_BY_EXT[base.slice(dot + 1).toLowerCase()] ?? 'plaintext'\n}\n\n/**\n * 加载 Monaco Editor(AMD 构建,随插件包离线分发):注入 loader.js → require.config → editor.main。\n * @author ddj 2026年08月20号\n * @returns Promise<object> window.monaco\n */\nexport function loadMonaco(onProgress) {\n const unsubscribe = subscribeStage(onProgress)\n if (!monacoPromise) {\n publishStage('loader', MONACO_STAGES.loader.progress, MONACO_STAGES.loader.message)\n monacoPromise = new Promise((resolve, reject) => {\n const fail = (error) => {\n monacoPromise = null\n publishStage('error', MONACO_STAGES.error.progress, MONACO_STAGES.error.message)\n reject(error)\n }\n const boot = () => {\n try {\n window.require.config({ paths: { vs: MONACO_BASE } })\n publishStage('core', MONACO_STAGES.core.progress, MONACO_STAGES.core.message)\n window.require(['vs/editor/editor.main'], () => {\n publishStage('ready', MONACO_STAGES.ready.progress, MONACO_STAGES.ready.message)\n resolve(window.monaco)\n }, (err) => fail(new Error('Monaco 模块加载失败:' + String(err))))\n } catch (error) {\n fail(error)\n }\n }\n const existing = document.querySelector('script[data-edrv-monaco-loader]')\n if (existing) boot()\n else {\n const s = document.createElement('script')\n s.src = MONACO_BASE + '/loader.js'\n s.dataset.edrvMonacoLoader = '1'\n s.onload = boot\n s.onerror = () => fail(new Error('Monaco loader 加载失败'))\n document.head.appendChild(s)\n }\n })\n }\n return monacoPromise.finally(unsubscribe)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 行内差异自绘(新增行绿底 + glyph margin '+';删除块 view zone 红底)。\n * 迁移自原 src/client/index.ts 的 diff-render effect,语义不改。\n * 作者 ddj 2026-08-20\n */\n\n/**\n * 差异渲染器(每 EditorView 挂载一个,内部持有 zone/decoration 状态)。\n * @param log 诊断日志函数((sessionId, text) => void)\n */\nexport function createDiffRenderer(log) {\n let viewZoneIds = []\n let decorations = []\n\n /**\n * 渲染当前 pending 差异:绿底 decoration + 删除块 view zones + '-' 号 overlay(滚动同步)。\n * @param monaco window.monaco\n * @param editor Monaco 编辑器实例\n * @param pendingRegions 待处理差异区域\n * @param sessionId 会话 id\n */\n const render = (monaco, editor, pendingRegions, sessionId) => {\n const renderT0 = Date.now()\n const callIdAttr = (callId, idx) => String(callId) + ':' + String(idx)\n log(sessionId, '[diff-render] begin regs=' + pendingRegions.length + ' ' + pendingRegions.map((r) => callIdAttr(r.callId, r.idx) + '@' + (r.start ?? '?') + '-' + (r.end ?? '?') + '(-' + (r.oldLines ? r.oldLines.length : 0) + '/+' + (r.newLines ? r.newLines.length : 0) + ')').join('|'))\n\n const decos = []\n for (const r of pendingRegions) {\n if (r.start === undefined || r.end === undefined) continue\n if (r.newLines && r.newLines.length) {\n decos.push({\n range: new monaco.Range(r.start, 1, Math.max(r.start, r.end - 1), 1),\n options: { isWholeLine: true, className: 'edrv-mn-add-line', linesDecorationsClassName: 'edrv-mn-gutter-add' },\n })\n }\n }\n decorations = editor.deltaDecorations(decorations, decos)\n\n // 删除块 view zones(红底 + 正文;- 号由独立 overlay 层渲染,定位在 decoration 列与 + 同列,\n // 不受 view zone 容器定位/裁剪影响;滚动用 translateY 同步)\n let createdZones = []\n editor.changeViewZones((accessor) => {\n for (const id of viewZoneIds) { try { accessor.removeZone(id) } catch (e) { /* 已移除 */ } }\n viewZoneIds = []\n const zones = []\n for (const r of pendingRegions) {\n if (r.create) continue\n const oldLines = r.oldLines && r.oldLines.length ? r.oldLines : null\n if (!oldLines) continue\n const after = Math.max(0, (r.start ?? 1) - 1)\n const domNode = document.createElement('div')\n domNode.className = 'edrv-del-zone'\n domNode.dataset.edrvHunk = callIdAttr(r.callId, r.idx)\n for (const t of oldLines) {\n const row = document.createElement('div')\n row.className = 'edrv-del-row'\n const text = document.createElement('span')\n text.className = 'edrv-del-text'\n text.textContent = t\n row.appendChild(text)\n domNode.appendChild(row)\n }\n const id = accessor.addZone({\n afterLineNumber: after,\n heightInLines: oldLines.length,\n domNode,\n suppressMouseDown: false,\n })\n viewZoneIds.push(id)\n zones.push({ domNode, after, n: oldLines.length })\n }\n createdZones = zones\n })\n\n if (createdZones.length) {\n const root = editor.getDomNode()\n if (root) {\n let overlay = root.querySelector('.edrv-minus-overlay')\n if (!overlay) {\n overlay = document.createElement('div')\n overlay.className = 'edrv-minus-overlay'\n root.appendChild(overlay)\n }\n overlay.innerHTML = ''\n const lineH = editor.getOption(monaco.editor.EditorOption.lineHeight) || 20\n let li = null\n try { li = editor.getLayoutInfo() } catch (e) { /* ignore */ }\n const rawLeft = li ? li.decorationsLeft : 0\n const width = li && li.decorationsWidth > 0 ? li.decorationsWidth : 16\n // decorationsLeft 是 Monaco 内部坐标,需限制在宿主根节点内,避免窄窗口/边框\n // 或布局尚未完成时把减号绘制到编辑器左、右边界之外。\n const maxLeft = Math.max(0, root.clientWidth - width)\n // 字符本身有少量字体侧向留白;给标记列留出 4px 内缩,避免减号半个\n // 字符落到 Monaco 根节点左边框外,同时仍限制右侧不越界。\n const markerInset = 12\n const left = Math.max(0, Math.min(maxLeft, rawLeft + markerInset))\n const lineCount = editor.getModel().getLineCount()\n let itemIdx = 0\n let zi = 0\n for (const z of createdZones) {\n // 用 Monaco 坐标 API 计算 view zone 顶部,避免离屏 zone DOM 未布局导致 getBoundingClientRect 为 0\n const anchor = Math.min(z.after + 1, lineCount)\n let zoneBottom = editor.getTopForLineNumber(anchor)\n if (z.after >= lineCount) zoneBottom += lineH\n const zoneTop = zoneBottom - z.n * lineH\n for (let i = 0; i < z.n; i++) {\n const item = document.createElement('div')\n item.className = 'edrv-minus-item'\n // 使用 CSS 线段代替文本字符,避免不同字体的侧向留白把 “-” 绘制到边界外。\n item.textContent = ''\n item.style.width = width + 'px'\n item.style.height = lineH + 'px'\n item.dataset.zone = String(zi)\n item.dataset.row = String(i)\n item.style.top = (zoneTop + i * lineH) + 'px'\n item.style.left = left + 'px'\n overlay.appendChild(item)\n itemIdx++\n }\n zi++\n }\n log(sessionId, '[diff-render] placed zones=' + createdZones.length + ' items=' + itemIdx + ' left=' + left + ' w=' + width + ' t+' + (Date.now() - renderT0) + 'ms')\n // 滚动同步:overlay 随内容滚动(内容坐标 - scrollTop)\n const syncScroll = () => {\n const s2 = editor.getScrollTop() || 0\n if (overlay) overlay.style.transform = 'translateY(' + (-s2) + 'px)'\n }\n syncScroll()\n overlay.__edrvSync = syncScroll\n if (!overlay.__edrvBound) {\n overlay.__edrvBound = true\n editor.onDidScrollChange(syncScroll)\n }\n // 已可见的 zone 用真实 DOM 坐标做一次微调(离屏 zone 仍保留坐标 API 位置)\n setTimeout(() => {\n try {\n const edRect = root.getBoundingClientRect()\n const st = editor.getScrollTop() || 0\n const items = overlay.querySelectorAll('.edrv-minus-item')\n let correctedLeft = left\n try {\n const layout = editor.getLayoutInfo()\n const markerWidth = layout.decorationsWidth > 0 ? layout.decorationsWidth : width\n correctedLeft = Math.max(0, Math.min(Math.max(0, root.clientWidth - markerWidth), (layout.decorationsLeft || 0) + 12))\n } catch (e) { /* 保留首次布局计算结果 */ }\n for (const item of items) {\n item.style.left = correctedLeft + 'px'\n const zIndex = Number(item.dataset.zone)\n const rIndex = Number(item.dataset.row)\n const z = createdZones[zIndex]\n if (!z || !z.domNode.isConnected) continue\n const rowEl = z.domNode.querySelectorAll('.edrv-del-row')[rIndex]\n if (!rowEl) continue\n const rowRect = rowEl.getBoundingClientRect()\n if (rowRect.height > 0) {\n item.style.top = (rowRect.top - edRect.top + st) + 'px'\n }\n }\n } catch (e) { log(sessionId, '[diff-render] correct fail ' + String(e)) }\n }, 50)\n }\n } else {\n const root = editor.getDomNode()\n const overlay = root && root.querySelector('.edrv-minus-overlay')\n if (overlay) overlay.innerHTML = ''\n }\n }\n\n /** 卸载清理(EditorView unmount 时调用)。 */\n const dispose = () => {\n viewZoneIds = []\n decorations = []\n }\n\n return { render, dispose }\n}\n","/**\n * dsh-vscode-mode shared diff primitives — 快照指纹、hunk 规范化与安全定位。\n * 不依赖 Node/React,host 与 browser 共用,避免各层用不同 indexOf 语义。\n * 作者 ddj 2026-08-24\n */\nimport type { Hunk, RecordBase } from './types.js'\n\n/** 文件读取状态,区分真实空文件与无法读取/过大的文件。 */\nexport type ReadState =\n | { kind: 'content'; content: string }\n | { kind: 'missing' }\n | { kind: 'unavailable' }\n\n/** 文本中的一个半开区间 [start,end)。 */\nexport interface TextRange {\n start: number\n end: number\n}\n\n/** 一条 hunk 在当前内容中的定位结果。 */\nexport interface HunkLocation extends TextRange {\n idx: number\n hunk: Hunk\n matched: boolean\n}\n\n/** 统一取对应 hunk;callHunk 只用于旧记录缺失 hunks 时兼容。 */\nexport function preciseHunk(record: Pick<RecordBase, 'hunks' | 'callHunk'>, idx: number): Hunk | null {\n return hunkOf(record, idx)\n}\n\n/** 轻量、确定性的字符串指纹;不引入 Node crypto。 */\nexport function fingerprint(text: string | null | undefined): string | null {\n if (typeof text !== 'string') return null\n let hash = 2166136261\n for (let i = 0; i < text.length; i++) {\n hash ^= text.charCodeAt(i)\n hash = Math.imul(hash, 16777619)\n }\n return 'fnv1a:' + (hash >>> 0).toString(16) + ':' + text.length\n}\n\n/** 取记录第 idx 个有效 hunk;只有记录缺 hunk 时才回退 callHunk。 */\nexport function hunkOf(record: Pick<RecordBase, 'hunks' | 'callHunk'>, idx: number): Hunk | null {\n const hunk = Array.isArray(record.hunks) ? record.hunks[idx] : undefined\n if (hunk && typeof hunk.newText === 'string') return hunk\n if (idx === 0 && record.callHunk && typeof record.callHunk.newText === 'string') return record.callHunk\n return null\n}\n\n/** hunk 是否表示没有实际内容变化。 */\nexport function isNoopHunk(hunk: Hunk | null | undefined): boolean {\n return !!hunk && hunk.oldText !== null && hunk.oldText === hunk.newText\n}\n\n/** splitLines 的空文本语义:真实空文件没有一行变更内容。 */\nexport function splitLines(text: string): string[] {\n return text.length ? text.split('\\n') : []\n}\n\n/** 为执行后 hunk 写入快照坐标;空 newText 通过 before/after 公共边界定位删除点。 */\nexport function annotateHunk(hunk: Hunk, before: string | null, after: string | null): Hunk {\n return annotateHunks([hunk], before, after)[0]\n}\n\n/** 按文件顺序为多 hunk 写入不重复的 after 坐标。 */\nexport function annotateHunks(hunks: Hunk[], before: string | null, after: string | null): Hunk[] {\n if (typeof after !== 'string') return hunks\n let cursor = 0\n return hunks.map((hunk) => {\n if (hunk.newText.length > 0) {\n const start = after.indexOf(hunk.newText, cursor)\n if (start >= 0) {\n cursor = start + hunk.newText.length\n return { ...hunk, afterStart: start, afterEnd: cursor }\n }\n return hunk\n }\n if (hunks.length !== 1 || typeof before !== 'string' || before === after || hunk.oldText === null) return hunk\n const prefix = commonPrefix(before, after)\n const suffix = commonSuffix(before, after, prefix)\n const removedStart = prefix\n const removedEnd = Math.max(removedStart, before.length - suffix)\n return { ...hunk, afterStart: removedStart, afterEnd: removedStart, beforeStart: removedStart, beforeEnd: removedEnd }\n })\n}\n\n/** 计算两个文本的最长公共前缀长度。 */\nfunction commonPrefix(left: string, right: string): number {\n const limit = Math.min(left.length, right.length)\n let i = 0\n while (i < limit && left.charCodeAt(i) === right.charCodeAt(i)) i++\n return i\n}\n\n/** 计算不与 prefix 重叠的最长公共后缀长度。 */\nfunction commonSuffix(left: string, right: string, prefix: number): number {\n const limit = Math.min(left.length, right.length) - prefix\n let i = 0\n while (i < limit && left.charCodeAt(left.length - 1 - i) === right.charCodeAt(right.length - 1 - i)) i++\n return i\n}\n\n/** 计算 index 前的 0 基行数。 */\nexport function lineBefore(text: string, index: number): number {\n let n = 0\n const end = Math.max(0, Math.min(index, text.length))\n for (let i = 0; i < end; i++) if (text.charCodeAt(i) === 10) n++\n return n\n}\n\n/** 找出文本的全部非重叠出现位置。 */\nfunction allMatches(content: string, needle: string): TextRange[] {\n if (!needle.length) return []\n const out: TextRange[] = []\n let from = 0\n while (from <= content.length - needle.length) {\n const at = content.indexOf(needle, from)\n if (at < 0) break\n out.push({ start: at, end: at + needle.length })\n from = at + Math.max(1, needle.length)\n }\n return out\n}\n\n/**\n * 从 after 快照定位所有 hunk,按 hunk 顺序优先选未占用且靠近前一块的候选。\n * 若 hunk 带 afterStart/afterEnd,则优先验证快照坐标,避免重复文本错配。\n * @author ddj 2026年08月24号\n * @param content 当前文件内容\n * @param hunks 待定位 hunk\n * @returns 每个 hunk 一个结果,matched=false 表示冲突/stale\n */\nexport function locateHunks(content: string, hunks: Hunk[]): HunkLocation[] {\n const locations: HunkLocation[] = []\n let cursor = 0\n const occupied: TextRange[] = []\n for (let idx = 0; idx < hunks.length; idx++) {\n const hunk = hunks[idx]\n const newText = hunk.newText\n const snapshot = Number.isInteger(hunk.afterStart) && Number.isInteger(hunk.afterEnd)\n ? { start: hunk.afterStart as number, end: hunk.afterEnd as number }\n : null\n const snapshotMatches = snapshot && snapshot.start >= 0 && snapshot.end >= snapshot.start\n && (newText.length === 0 || content.slice(snapshot.start, snapshot.end) === newText)\n ? snapshot\n : null\n const candidates = snapshotMatches ? [snapshotMatches] : allMatches(content, newText)\n const candidate = candidates.find((range) => range.start >= cursor && !occupied.some((used) => overlaps(range, used)))\n ?? candidates.find((range) => !occupied.some((used) => overlaps(range, used)))\n if (candidate) {\n locations.push({ idx, hunk, ...candidate, matched: true })\n occupied.push(candidate)\n cursor = Math.max(cursor, candidate.end)\n continue\n }\n if (newText.length === 0 && hunk.afterStart === undefined && hunk.afterEnd === undefined && content.length === 0) {\n const point = { start: 0, end: 0 }\n locations.push({ idx, hunk, ...point, matched: true })\n continue\n }\n if (newText.length === 0 && hunk.afterStart !== undefined && hunk.afterEnd !== undefined\n && hunk.afterStart === hunk.afterEnd && hunk.afterStart >= 0 && hunk.afterStart <= content.length) {\n const point = { start: hunk.afterStart, end: hunk.afterEnd }\n if (!occupied.some((used) => overlaps(point, used))) {\n locations.push({ idx, hunk, ...point, matched: true })\n occupied.push(point)\n cursor = Math.max(cursor, point.end)\n continue\n }\n }\n locations.push({ idx, hunk, start: -1, end: -1, matched: false })\n }\n return locations\n}\n\n/** 判断两个半开区间是否重叠。零长度区间只与同一位置的零长度区间重叠。 */\nfunction overlaps(left: TextRange, right: TextRange): boolean {\n if (left.start === left.end || right.start === right.end) return left.start === right.start && left.end === right.end\n return left.start < right.end && right.start < left.end\n}\n\n/** 在可定位区间上执行一次 hunk 反向替换。 */\nexport function replaceRange(content: string, location: HunkLocation, reverse = false): string | null {\n if (!location.matched || location.start < 0) return null\n const replacement = reverse ? (location.hunk.oldText ?? '') : location.hunk.newText\n return content.slice(0, location.start) + replacement + content.slice(location.end)\n}\n\n/** 按当前内容中出现的位置从后向前应用 hunk,避免前块长度变化影响后块。 */\nexport function applyLocations(content: string, locations: HunkLocation[], reverse = false): { content: string; stale: number[] } {\n const stale = locations.filter((location) => !location.matched).map((location) => location.idx)\n let out = content\n const matched = locations.filter((location) => location.matched).sort((a, b) => b.start - a.start)\n for (const location of matched) {\n const next = replaceRange(out, location, reverse)\n if (next === null) stale.push(location.idx)\n else out = next\n }\n return { content: out, stale: stale.sort((a, b) => a - b) }\n}\n","/**\n * dsh-vscode-mode client — 记录/差异状态纯函数(可单测)。\n * 迁移自原 src/client/index.ts 前段,语义一字不改。\n * 作者 ddj 2026-08-20\n */\nimport type { CallHunk, Hunk, RecordView } from '../../shared/types.js'\nimport { preciseHunk } from '../../shared/diff.js'\n\n/** 差异决策状态。 */\nexport const ST = { PENDING: 'pending', ACCEPTED: 'accepted', REJECTED: 'rejected' } as const\nexport type Status = 'pending' | 'accepted' | 'rejected'\n\n/** 记录视图摘要(按文件分组)。 */\nexport interface FileSummary {\n path: string\n recs: RecordView[]\n pending: number\n}\nexport interface Summary {\n files: FileSummary[]\n pendingFiles: FileSummary[]\n totalFiles: number\n}\n\n/** hunk 的 DOM 定位 key(callId:idx)。 */\nexport function callIdAttr(callId: string, idx: number): string {\n return String(callId) + ':' + String(idx)\n}\n\n/** 某 hunk 的当前决策状态(缺省 pending)。 */\nexport function statusAt(rec: RecordView | undefined, idx: number): Status {\n if (!rec) return ST.PENDING\n if (Array.isArray(rec.decisions?.perHunk) && rec.decisions.perHunk[idx] !== undefined) return rec.decisions.perHunk[idx] as Status\n return (rec.decisions?.call as Status) ?? ST.PENDING\n}\n\n/** hunk 是否为空差异(old===new,无实际内容变化,不可操作)。create 记录不视为空差异。 */\nexport function noopHunk(rec: RecordView | undefined, h: Hunk | CallHunk | null | undefined): boolean {\n if (!rec || rec.create === true) return false\n const precise = rec && h && rec.hunks.indexOf(h as Hunk) >= 0\n ? preciseHunk(rec, rec.hunks.indexOf(h as Hunk))\n : h\n const oldText = precise?.oldText ?? null\n const newText = precise?.newText ?? null\n return oldText !== null && oldText === newText\n}\n\n/** 记录是否仍有待处理差异(superseded / 全部已决策 = false)。 */\nexport function isRecPending(rec: RecordView): boolean {\n if (!rec || rec.superseded === true || rec.conflict === true) return false\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n if (perHunk.length) {\n // 只认存在至少一个\"非空差异且未决策\"的 hunk\n for (let i = 0; i < perHunk.length; i++) {\n if (perHunk[i] !== 'accepted' && perHunk[i] !== 'rejected' && !noopHunk(rec, (rec.hunks || [])[i])) return true\n }\n return false\n }\n return rec.decisions.call === 'pending' || rec.decisions.call === undefined\n}\n\n/** 记录待处理差异\"处\"数(按 hunk,跳过空差异)。 */\nexport function pendingCount(recs: RecordView[]): number {\n let n = 0\n for (const rec of recs) {\n if (!isRecPending(rec)) continue\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n if (perHunk.length) {\n for (let i = 0; i < perHunk.length; i++) {\n if (perHunk[i] === 'pending' && !noopHunk(rec, (rec.hunks || [])[i])) n++\n }\n } else {\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (const h of hunks) if (!noopHunk(rec, h)) n++\n if (!hunks.length && !noopHunk(rec, rec.callHunk)) n = Math.max(n, 1)\n }\n }\n return n\n}\n\n/** 按文件分组的差异摘要(角标/Launcher 用)。 */\nexport function summarize(records: RecordView[]): Summary {\n const byPath = new Map<string, RecordView[]>()\n for (const r of records) {\n if (!byPath.has(r.path)) byPath.set(r.path, [])\n byPath.get(r.path)!.push(r)\n }\n const files: FileSummary[] = []\n for (const [path, recs] of byPath) files.push({ path, recs, pending: pendingCount(recs) })\n files.sort((a, b) => (a.path < b.path ? -1 : 1))\n const pendingFiles = files.filter((f) => f.pending > 0)\n return { files, pendingFiles, totalFiles: pendingFiles.length }\n}\n","/**\n * dsh-vscode-mode client — 差异区域计算纯函数(可单测)。\n * 迁移自原 src/client/index.ts 的 diffRegions/trimCommonLines/countLinesBefore,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport type { Hunk, RecordView } from '../../shared/types.js'\nimport { locateHunks, lineBefore, preciseHunk, splitLines } from '../../shared/diff.js'\nimport { ST, noopHunk, statusAt } from './records.js'\nimport type { Status } from './records.js'\n\n/** 差异区域(文件内一段待处理/已处理的变更)。 */\nexport interface Region {\n callId: string\n idx: number\n start?: number\n end?: number\n oldLines: string[]\n newLines: string[]\n whole?: boolean\n status: Status\n create: boolean\n rec: RecordView\n superseded: boolean\n stale?: boolean\n}\n\n/** 统计 index 之前(不含)的换行数 → 0 基行号。 */\nexport function countLinesBefore(text: string, index: number): number {\n return lineBefore(text, index)\n}\n\n/**\n * 行级公共前缀/后缀裁剪:old/new 首尾相同的行视为未变化(上下文),只保留真正变更的中间段。\n * @author ddj 2026年08月20号\n * @param oldLines 替换前内容按行拆分\n * @param newLines 替换后内容按行拆分\n * @returns 裁剪后的变更段与公共前缀行数\n */\nexport function trimCommonLines(oldLines: string[], newLines: string[]): { oldLines: string[]; newLines: string[]; shift: number } {\n let prefix = 0\n const maxPrefix = Math.min(oldLines.length, newLines.length)\n while (prefix < maxPrefix && oldLines[prefix] === newLines[prefix]) prefix++\n let suffix = 0\n const maxSuffix = Math.min(oldLines.length - prefix, newLines.length - prefix)\n while (suffix < maxSuffix && oldLines[oldLines.length - 1 - suffix] === newLines[newLines.length - 1 - suffix]) suffix++\n return { oldLines: oldLines.slice(prefix, oldLines.length - suffix), newLines: newLines.slice(prefix, newLines.length - suffix), shift: prefix }\n}\n\n/** 计算文件内各差异区域(行范围 + old/new + 状态),用于行内绿标注与 DiffBox。 */\nexport function diffRegions(records: RecordView[], content: string | null): Region[] {\n const regions: Region[] = []\n if (content === null) return regions\n const lines = splitLines(content)\n for (const rec of records) {\n if (rec.create) {\n for (let i = 0; i < rec.hunks.length; i++) {\n const h = preciseHunk(rec, i)\n if (!h || noopHunk(rec, h)) continue\n regions.push({ callId: rec.callId, idx: i, start: 1, end: lines.length + 1, oldLines: [], newLines: lines.slice(), whole: true, status: statusAt(rec, i), create: true, rec, superseded: rec.superseded === true })\n }\n continue\n }\n const entries: Array<{ idx: number; hunk: Hunk }> = []\n for (let i = 0; i < rec.hunks.length; i++) {\n const hunk = preciseHunk(rec, i)\n if (hunk && !noopHunk(rec, hunk)) entries.push({ idx: i, hunk })\n }\n const locations = locateHunks(content, entries.map((entry) => entry.hunk))\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i]\n const location = locations[i]\n const status = statusAt(rec, entry.idx)\n if (!location.matched) {\n regions.push({ callId: rec.callId, idx: entry.idx, stale: true, status, create: false, oldLines: entry.hunk.oldText === null ? [] : entry.hunk.oldText.split('\\n'), newLines: entry.hunk.newText ? entry.hunk.newText.split('\\n') : [], rec, superseded: rec.superseded === true })\n continue\n }\n const start = countLinesBefore(content, location.start) + 1\n const oldLines = entry.hunk.oldText === null ? [] : entry.hunk.oldText.split('\\n')\n const newLines = entry.hunk.newText.split('\\n')\n const trimmed = trimCommonLines(oldLines, newLines)\n const regionStart = start + trimmed.shift\n regions.push({ callId: rec.callId, idx: entry.idx, start: regionStart, end: regionStart + trimmed.newLines.length, oldLines: trimmed.oldLines, newLines: trimmed.newLines, status, create: false, rec, superseded: rec.superseded === true })\n }\n }\n regions.sort((a, b) => (a.start ?? Infinity) - (b.start ?? Infinity))\n return regions\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — QuickOpen:顶部搜索框(Ctrl+P 打开文件)。\n * 迁移自原 src/client/index.ts 的 QuickOpen,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\n\n/**\n * 快速打开搜索框:Ctrl+P 聚焦,输入 ≥2 字符经 edrv.searchFiles 搜索,\n * 结果列表点击/回车打开文件。\n * @param props.sessionId 会话 id\n * @param props.onOpen 打开回调(path)\n */\nexport function QuickOpen(props) {\n const sessionId = props?.sessionId\n const onOpen = props?.onOpen\n const [q, setQ] = React.useState('')\n const [results, setResults] = React.useState(null)\n const [open, setOpen] = React.useState(false)\n const inputRef = React.useRef(null)\n const seq = React.useRef(0)\n const timer = React.useRef(null)\n\n const search = (query) => {\n const s = ++seq.current\n const clean = String(query || '').trim()\n if (clean.length < 2) { setResults(null); return }\n rpc('edrv.searchFiles', { sessionId, query: clean }).then((res) => {\n if (s !== seq.current) return\n setResults((res && res.ok && Array.isArray(res.files)) ? res.files : [])\n }).catch(() => { if (s === seq.current) setResults([]) })\n }\n\n const onChange = (v) => {\n setQ(v); setOpen(true)\n if (timer.current) clearTimeout(timer.current)\n timer.current = setTimeout(() => search(v), 180)\n }\n\n const pick = (p) => {\n onOpen(p)\n setQ(''); setResults(null); setOpen(false)\n inputRef.current?.blur?.()\n }\n\n React.useEffect(() => {\n const onKey = (e) => {\n if ((e.ctrlKey || e.metaKey) && String(e.key).toLowerCase() === 'p') {\n e.preventDefault(); e.stopPropagation()\n inputRef.current?.focus?.()\n setOpen(true)\n } else if (e.key === 'Escape') {\n setOpen(false); inputRef.current?.blur?.()\n }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n const dirText = (p) => {\n const base = String(p).split(/[\\\\/]/).pop() || String(p)\n return String(p).slice(0, Math.max(0, String(p).length - base.length)).replace(/[\\\\/]+$/, '') || String(p)\n }\n\n let pop = null\n if (open && Array.isArray(results) && q.trim().length >= 2) {\n if (results.length) {\n const items = results.map((p) => React.createElement('div', { key: p, className: 'edrv-search-item', onClick: () => pick(p) },\n React.createElement('span', { className: 'n' }, String(p).split(/[\\\\/]/).pop() || p),\n React.createElement('span', { className: 'd' }, dirText(p))))\n pop = React.createElement('div', { className: 'edrv-search-pop' }, ...items)\n } else {\n pop = React.createElement('div', { className: 'edrv-search-pop' }, React.createElement('div', { className: 'edrv-search-empty' }, '无匹配文件'))\n }\n }\n\n return React.createElement('div', { className: 'edrv-search-wrap' },\n React.createElement('input', {\n ref: inputRef, className: 'edrv-search', placeholder: '搜索文件 (Ctrl+P)',\n value: q,\n onChange: (e) => onChange(e.target.value),\n onFocus: () => { if (q.trim().length >= 2 && !results) setOpen(true) },\n onKeyDown: (e) => {\n if (e.key === 'Enter' && Array.isArray(results) && results.length) pick(results[0])\n if (e.key === 'Escape') setOpen(false)\n },\n }),\n pop)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — UI 共用小工具(按钮样式/状态文案/等宽字体)。\n * 迁移自原 src/client/index.ts 的 btn/badgeOf/MONO,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport { ST } from '../state/records.js'\n\n/** 次级按钮内联样式(accept=true 绿色 / false 红色)。 */\nexport function btn(accept) {\n return {\n fontSize: 11,\n padding: '1px 8px',\n border: '1px solid var(--dsw-alias-border-l2,#555)',\n borderRadius: 4,\n cursor: 'pointer',\n background: 'var(--dsw-alias-bg-layer-1,transparent)',\n color: accept ? 'var(--dsw-alias-state-success-primary,#2e9e44)' : 'var(--dsw-alias-state-error-primary,#d9534f)',\n }\n}\n\n/** 状态中文文案。 */\nexport function badgeOf(status) {\n return status === ST.ACCEPTED ? '已采纳' : status === ST.REJECTED ? '已拒绝' : '待处理'\n}\n\n/** 等宽字体常量(差异行渲染用)。 */\nexport const MONO = { fontFamily: 'var(--ds-font-family-code, ui-monospace, monospace)', fontSize: 12, lineHeight: 1.55 }\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffBox:每个文件底部紧凑差异条(per-file hunk + ⋮ 二级菜单)。\n * 迁移自原 src/client/index.ts 的 DiffBox,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { callIdAttr } from '../state/records.js'\nimport { badgeOf } from './shared.js'\n\n/**\n * 差异条:当前文件内 diff 导航(↑↓←→)、Keep/Undo、展开 hunk 列表、⋮ 二级菜单\n * (Keep All / Undo All / 差异总览 / 归档 / 回滚 / 刷新)+ 其他差异文件小节。\n */\nexport function DiffBox(props) {\n const {\n pendingRegions, staleRegions, onAct, onAcceptFile, onUndoFile, onAcceptAllFiles, onUndoAllFiles,\n allPendingCount, onRollback, onJump, otherFiles, onOpenOther, onOpenLauncher, onRefresh, activePath,\n diffIdx, diffTotal, fileIdx, fileTotal, onPrevDiff, onNextDiff, onPrevFile, onNextFile,\n } = props\n const [expanded, setExpanded] = React.useState(false)\n const [menuOpen, setMenuOpen] = React.useState(false)\n const canAct = pendingRegions.length > 0\n\n const base = String(activePath || '').split(/[\\\\/]/).pop() || ''\n\n let bodyEl = null\n if (expanded) {\n const rows = pendingRegions.map((r) => {\n const key = callIdAttr(r.callId, r.idx)\n return React.createElement('div', { key, className: 'edrv-diffrow', 'data-edrv-hunk': key, title: '跳转到 L' + (r.start ?? '?'), onClick: () => onJump(r) },\n React.createElement('span', { className: 'edrv-diffrow-l' }, 'L' + (r.start ?? '?') + '-' + (r.end ?? '?')),\n (r.oldLines.length ? React.createElement('span', { className: 'edrv-diffrow-o' }, '-' + r.oldLines.length) : null),\n (r.newLines.length ? React.createElement('span', { className: 'edrv-diffrow-n' }, '+' + r.newLines.length) : null),\n (r.create ? React.createElement('span', { className: 'edrv-diffrow-tag' }, '新建') : null),\n React.createElement('span', { style: { flex: 1 } }))\n })\n const stale = staleRegions.map((r) => React.createElement('div', { key: 'stale' + callIdAttr(r.callId, r.idx), className: 'edrv-diffrow edrv-diffrow-stale', title: '差异无法定位(文件可能已被手动修改)' },\n React.createElement('span', { className: 'edrv-diffrow-l' }, 'L' + (r.start ?? '?') + ' 无法定位'),\n React.createElement('span', { className: 'edrv-diffrow-tag' }, '冲突/需刷新'),\n React.createElement('span', { className: 'edrv-diffrow-tag' }, badgeOf(r.status))))\n let othersEl = null\n if (otherFiles.length) {\n othersEl = React.createElement('div', { className: 'edrv-diffbox-others' },\n React.createElement('span', { className: 'edrv-diffrow-tag' }, '其他差异文件 (' + otherFiles.length + '):'),\n otherFiles.map((f) => React.createElement('button', { key: f.path, className: 'edrv-diffrow-file', title: f.path, onClick: () => onOpenOther(f.path) },\n String(f.path).split(/[\\\\/]/).pop() + ' (' + f.pending + ')')))\n }\n bodyEl = React.createElement('div', { className: 'edrv-diffbar-body' }, ...rows, ...stale, othersEl)\n }\n\n const menu = menuOpen\n ? React.createElement(React.Fragment, null,\n React.createElement('div', { style: { position: 'fixed', inset: 0, zIndex: 44 }, onClick: () => setMenuOpen(false) }),\n React.createElement('div', { className: 'edrv-diffbar-menu' },\n React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !allPendingCount, onClick: () => { onAcceptAllFiles(); setMenuOpen(false) } }, '✓ Keep All(全部文件采纳)'),\n React.createElement('button', { className: 'edrv-diffmenu-item danger', disabled: !allPendingCount, onClick: () => { onUndoAllFiles(); setMenuOpen(false) } }, '↩ Undo All(全部文件不采纳)'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onOpenLauncher('pending'); setMenuOpen(false) } }, '🗂 差异总览'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onOpenLauncher('archive'); setMenuOpen(false) } }, '📁 归档'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !canAct, onClick: () => { onRollback(); setMenuOpen(false) } }, '⟲ 回滚文件'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onRefresh(); setMenuOpen(false) } }, '⟳ 刷新')))\n : null\n\n return React.createElement('div', { className: 'edrv-diffbar', 'data-edrv-diffbox': '1' },\n React.createElement('div', { className: 'edrv-diffbar-row' },\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异', disabled: !canAct, onClick: onPrevDiff }, '↑'),\n React.createElement('span', { className: 'edrv-diffbar-count', title: '当前文件内差异位置(点击展开/收起差异列表)', onClick: () => setExpanded((v) => !v) }, diffTotal ? (diffIdx + 1) + '/' + diffTotal : '0/0'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '下一个差异', disabled: !canAct, onClick: onNextDiff }, '↓'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异文件', disabled: !fileTotal, onClick: onPrevFile }, '←'),\n React.createElement('span', { className: 'edrv-diffbar-count edrv-count-file', title: '差异文件位置' }, fileTotal ? (fileIdx + 1) + '/' + fileTotal + ' 文件' : '0/0 文件'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '下一个差异文件', disabled: !fileTotal, onClick: onNextFile }, '→'),\n React.createElement('span', { className: 'edrv-diffbar-file', title: activePath || '' }, base),\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', title: '采纳当前文件的全部差异', disabled: !canAct, onClick: onAcceptFile }, '✓ Keep'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-undo', title: '不采纳当前文件的全部差异(回滚)', disabled: !canAct, onClick: onUndoFile }, '↩ Undo'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '更多操作', onClick: () => setMenuOpen((v) => !v) }, '⋮')),\n bodyEl,\n menu)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffBarEmpty:无文件打开 / 当前文件无差异但有差异文件时的空态浮窗。\n * 迁移自原 src/client/index.ts 的 DiffBarEmpty,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\n\n/**\n * 空态差异条:提示当前状态 + 查看下一个差异文件 + ⋮(总览/归档/刷新)。\n */\nexport function DiffBarEmpty(props) {\n const { sum, active, staleCount, onNextFile, onOpenLauncher, onRefresh } = props\n const [menuOpen, setMenuOpen] = React.useState(false)\n const n = sum?.totalFiles ?? 0\n const tip = active\n ? (staleCount > 0 ? '当前文件有 ' + staleCount + ' 处差异无法定位(可能已被后续修改影响)' : '当前文件无待处理差异')\n : '未打开文件'\n\n const menu = menuOpen\n ? React.createElement(React.Fragment, null,\n React.createElement('div', { style: { position: 'fixed', inset: 0, zIndex: 44 }, onClick: () => setMenuOpen(false) }),\n React.createElement('div', { className: 'edrv-diffbar-menu' },\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onOpenLauncher('pending'); setMenuOpen(false) } }, '🗂 差异总览'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onOpenLauncher('archive'); setMenuOpen(false) } }, '📁 归档'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onRefresh(); setMenuOpen(false) } }, '⟳ 刷新')))\n : null\n\n return React.createElement('div', { className: 'edrv-diffbar', 'data-edrv-diffbox': '1' },\n React.createElement('div', { className: 'edrv-diffbar-row' },\n React.createElement('span', { className: 'edrv-diffbar-count' }, '⚠ 差异 ' + n + ' 文件'),\n React.createElement('span', { className: 'edrv-diffbar-file' }, tip),\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', title: '打开并跳转到下一个差异文件', onClick: onNextFile }, '查看下一个差异文件'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '更多操作', onClick: () => setMenuOpen((v) => !v) }, '⋮')),\n menu)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffLauncher:全局差异总览 + 归档 圆角下拉。\n * 迁移自原 src/client/index.ts 的 DiffLauncher,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { MONO, btn } from './shared.js'\n\n/**\n * 全局差异面板:待处理文件列表(点击打开并跳转)+ 归档浏览/批次回滚。\n * 由状态栏差异 chip / header 角标触发。\n */\nexport function DiffLauncher(props) {\n const sessionId = props?.sessionId\n const sum = props?.sum\n const onClose = props?.onClose\n const onOpenFile = props?.onOpenFile\n const [tab, setTab] = React.useState(props?.tab === 'archive' ? 'archive' : 'pending') // 'pending' | 'archive'\n const [archives, setArchives] = React.useState(null)\n const [archiveDetail, setArchiveDetail] = React.useState(null)\n const [archivePath, setArchivePath] = React.useState(null)\n const [archiveErr, setArchiveErr] = React.useState(null)\n const [error, setError] = React.useState(null)\n\n const loadArchives = () => {\n if (!sessionId) { setArchiveErr('会话不存在'); return }\n rpc('edrv.archiveList', { sessionId }).then((res) => {\n if (res && res.ok && Array.isArray(res.entries)) { setArchives(res.entries); setArchiveErr(null) }\n else setArchiveErr(res?.error ? String(res.error) : '归档列表读取失败')\n }).catch((e) => setArchiveErr('归档异常:' + String(e)))\n }\n const loadArchiveDetail = (path) => {\n if (!sessionId) return\n setArchiveDetail(null)\n rpc('edrv.archiveRead', { sessionId, path }).then((res) => {\n if (res && res.ok && Array.isArray(res.batches)) setArchiveDetail(res.batches)\n else setArchiveErr(res?.error ? String(res.error) : '归档详情读取失败')\n }).catch((e) => setArchiveErr('归档异常:' + String(e)))\n }\n React.useEffect(() => {\n if (tab !== 'archive') return\n setArchives(null); setArchiveDetail(null); setArchivePath(null); setArchiveErr(null)\n loadArchives()\n }, [tab, sessionId])\n\n let body\n if (tab === 'pending') {\n body = (sum.pendingFiles.length === 0\n ? React.createElement('div', { className: 'edrv-search-empty' }, '暂无待处理差异(已全部处理)')\n : sum.pendingFiles.map((f) => React.createElement('div', { key: f.path, className: 'edrv-launch-row', title: '打开并跳转到差异 ' + f.path, onClick: () => onOpenFile(f.path) },\n React.createElement('span', { className: 'edrv-launch-path' }, f.path),\n React.createElement('span', { className: 'edrv-launch-cnt' }, '待处理 ' + f.pending + ' 处'),\n React.createElement('button', { className: 'edrv-btn-mini edrv-btn-keep', onClick: (e) => { e.stopPropagation(); onOpenFile(f.path) } }, '打开'))))\n } else {\n if (archiveErr) body = React.createElement('div', { className: 'edrv-search-empty', style: { color: 'var(--dsw-alias-state-error-primary,#d9534f)' } }, '错误:' + String(archiveErr))\n else if (archives === null) body = React.createElement('div', { className: 'edrv-search-empty' }, '加载中…')\n else if (archives.length === 0) body = React.createElement('div', { className: 'edrv-search-empty' }, '暂无归档记录')\n else {\n const inner = archives.map((e) => {\n const open = archivePath === e.path\n let detailEl = null\n if (open) {\n if (archiveDetail === null) detailEl = React.createElement('div', { style: { padding: 8, fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, '加载中…')\n else {\n const batches = archiveDetail.filter((b) => b.path === e.path)\n detailEl = batches.map((b) => (Array.isArray(b.records) ? b.records : []).map((rec) => {\n const lines = []\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (const h of hunks) {\n const oldLs = (h.oldText ?? '').split('\\n')\n const newLs = (h.newText ?? '').split('\\n')\n for (const t of oldLs) lines.push({ k: 'old', t })\n if (oldLs.length && newLs.length) lines.push({ k: 'sep', t: '' })\n for (const t of newLs) lines.push({ k: 'new', t })\n }\n const sm = rec.summary || { accepted: 0, rejected: 0, pending: 0, superseded: false }\n return React.createElement('div', { key: rec.callId, style: { padding: '5px 8px', borderTop: '1px solid var(--dsw-alias-border-l1,#333)' } },\n React.createElement('div', { style: { display: 'flex', gap: 8, alignItems: 'center', flexWrap: 'wrap', fontSize: 11, marginBottom: 2 } },\n React.createElement('span', { style: { color: 'var(--dsw-alias-label-primary,#ddd)', fontWeight: 600 } }, rec.toolName === 'write' ? (rec.create ? '新建' : '写入') : '编辑'),\n React.createElement('span', { style: { color: 'var(--dsw-alias-state-success-primary,#2e9e44)' } }, '采纳 ' + sm.accepted),\n React.createElement('span', { style: { color: 'var(--dsw-alias-state-error-primary,#d9534f)' } }, '拒绝 ' + sm.rejected),\n (rec.superseded ? React.createElement('span', { style: { color: 'var(--dsw-alias-state-warn-primary,#b7791f)' } }, '被覆盖') : null),\n React.createElement('span', { style: { color: 'var(--dsw-alias-label-tertiary,#888)' } }, new Date(rec.at).toLocaleTimeString())),\n React.createElement('pre', { style: { margin: 0, whiteSpace: 'pre', fontFamily: MONO.fontFamily, fontSize: 11, lineHeight: 1.5, overflowX: 'auto' } }, lines.map((ln, i) => React.createElement('div', { key: i, style: { background: ln.k === 'old' ? 'rgba(239,68,68,.10)' : ln.k === 'new' ? 'rgba(34,197,94,.10)' : 'transparent', color: ln.k === 'old' ? 'var(--dsw-alias-state-error-primary,#d9534f)' : ln.k === 'new' ? 'var(--dsw-alias-state-success-primary,#2e9e44)' : 'var(--dsw-alias-label-tertiary,#888)' } }, (ln.k === 'old' ? '- ' : ln.k === 'new' ? '+ ' : '') + ln.t)))\n )\n }))\n }\n }\n return React.createElement('div', { key: e.at + e.path, style: { border: '1px solid var(--dsw-alias-border-l1,#333)', borderRadius: 8, overflow: 'hidden' } },\n React.createElement('div', { style: { display: 'flex', gap: 8, alignItems: 'center', padding: '6px 8px', background: 'var(--dsw-alias-bg-layer-1,transparent)', cursor: 'pointer', flexWrap: 'wrap' }, onClick: () => { if (open) { setArchivePath(null); setArchiveDetail(null) } else { setArchivePath(e.path); loadArchiveDetail(e.path) } } },\n React.createElement('span', { style: { flex: 1, fontSize: 12, color: 'var(--dsw-alias-label-primary,#ddd)', wordBreak: 'break-all' } }, e.path),\n (e.batch != null ? React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, '批次 ' + e.batch) : null),\n (e.reason ? React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-state-warn-primary,#b7791f)' } }, e.reason) : null),\n React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, new Date(e.at).toLocaleString()),\n React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, '采纳 ' + e.summary.accepted + ' · 拒绝 ' + e.summary.rejected + (e.summary.superseded ? ' · 覆盖 ' + e.summary.superseded : '')),\n React.createElement('button', { onClick: (ev) => {\n ev.stopPropagation()\n if (e.batch == null) return\n if (!window.confirm('将文件恢复到批次 ' + e.batch + ' 之前的状态?(当前活跃差异将一并归档)')) return\n rpc('edrv.rollback', { sessionId, path: e.path, batch: e.batch }).then((res) => {\n if (res && res.ok) {\n setError(null); window.dispatchEvent(new CustomEvent('edrv:refresh'))\n setArchivePath(null); setArchiveDetail(null); loadArchives()\n } else setError(res?.error ? String(res.error) : '回滚失败')\n }).catch((err) => setError('回滚异常:' + String(err)))\n }, style: btn(false) }, '回滚')),\n detailEl)\n })\n body = React.createElement('div', { className: 'edrv-launch-arch' }, inner)\n }\n }\n\n return React.createElement('div', { className: 'edrv-launch', 'data-edrv-launch': '1' },\n React.createElement('div', { className: 'edrv-launch-head' },\n React.createElement('span', { style: { fontSize: 12, fontWeight: 600, color: 'var(--dsw-alias-label-primary,#eee)', marginRight: 4 } }, '差异'),\n React.createElement('button', { className: 'edrv-launch-tab' + (tab === 'pending' ? ' on' : ''), onClick: () => setTab('pending') }, '待处理' + (sum.totalFiles ? ' (' + sum.totalFiles + ')' : '')),\n React.createElement('button', { className: 'edrv-launch-tab' + (tab === 'archive' ? ' on' : ''), onClick: () => setTab('archive') }, '归档'),\n React.createElement('span', { style: { flex: 1 } }),\n (error ? React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-state-error-primary,#d9534f)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: '40%' } }, '错误:' + String(error)) : null),\n React.createElement('button', { onClick: onClose, style: btn(false) }, '✕ 关闭')),\n React.createElement('div', { className: 'edrv-launch-body' }, body))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — EditorView:中央 VSCode 式文件编辑器(编排层)。\n * 迁移自原 src/client/index.ts 的 EditorView,语义不改;差异自绘已抽到 monaco/diffRender。\n * 职责:页签/QuickOpen/Monaco 编辑器/差异审查(DiffBox/Launcher/Badge 事件装配)/状态栏/自动保存。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { dbg, rpc } from '../rpc.js'\nimport { emitRefresh } from '../events.js'\nimport { langOf, loadMonaco } from '../monaco/loader.js'\nimport { createDiffRenderer } from '../monaco/diffRender.js'\nimport { ST, callIdAttr, noopHunk, summarize } from '../state/records.js'\nimport { diffRegions } from '../state/regions.js'\nimport { QuickOpen } from './QuickOpen.js'\nimport { DiffBox } from './DiffBox.js'\nimport { DiffBarEmpty } from './DiffBarEmpty.js'\nimport { DiffLauncher } from './DiffLauncher.js'\n\n/**\n * 中央编辑区:文件页签(脏点/关闭/打开路径)+ Ctrl+P 搜索 + Monaco 编辑器 +\n * 底部差异条(DiffBox/空态)+ 全局差异下拉(DiffLauncher)+ 状态栏。\n * @param props.sessionId 会话 id\n * @param props.schedule 延时调度(ctx.timeout)\n */\nexport function EditorView(props) {\n const sessionId = props?.sessionId\n const schedule = props.schedule\n const [monaco, setMonaco] = React.useState(null)\n const [monacoErr, setMonacoErr] = React.useState(null)\n const [records, setRecords] = React.useState({})\n const [tabs, setTabs] = React.useState([])\n const [active, setActive] = React.useState(null)\n const [dirtyMap, setDirtyMap] = React.useState({})\n const [content, setContent] = React.useState(null)\n const [status, setStatus] = React.useState('')\n const [error, setError] = React.useState(null)\n const [loadError, setLoadError] = React.useState(null)\n const [loadStage, setLoadStage] = React.useState({ progress: 0, message: '准备加载编辑器…' })\n const [openInput, setOpenInput] = React.useState(false)\n const [pathDraft, setPathDraft] = React.useState('')\n const [cursor, setCursor] = React.useState('')\n const [launcherOpen, setLauncherOpen] = React.useState(false)\n const [launcherTab, setLauncherTab] = React.useState('pending')\n const [hoverAct, setHoverAct] = React.useState(null) // { region, top } 编辑区 hover 差异块的 Keep/Undo 浮层\n const [diffIdx, setDiffIdx] = React.useState(0) // 当前文件内差异位置(x/x 显示)\n const [fileIdx, setFileIdx] = React.useState(0) // 全局差异文件位置(x/x 文件 显示)\n const editorRef = React.useRef(null)\n const monacoRef = React.useRef(null)\n const modelsRef = React.useRef(new Map())\n const saveTimerRef = React.useRef(null)\n const loadSeqRef = React.useRef(0)\n const programmaticRef = React.useRef(false)\n const bootRef = React.useRef(false)\n const pendingFocusRef = React.useRef(null) // { path, region } 内容加载后跳转\n const hoverRegionsRef = React.useRef([]) // 当前 pending 区域镜像(稳定回调读取)\n const lineRegionMapRef = React.useRef(new Map()) // 行 → 区域 映射(hover 命中)\n const hoverKeyRef = React.useRef(null) // 当前 hover 区域 key(区域不变不重渲染)\n const hoverTopRef = React.useRef(null) // 当前 hover 浮窗 top(滚动后位置变化才重定位)\n const hoverRightRef = React.useRef(null) // 浮窗右侧避让 Monaco 缩略栏\n const hideTimerRef = React.useRef(null) // 延迟隐藏计时器(防闪烁)\n const hoverEditorRef = React.useRef(false) // 鼠标是否仍在编辑器命中区\n const hoverPanelRef = React.useRef(false) // 鼠标是否已进入 Keep/Undo 浮层\n const batchBusyRef = React.useRef(false) // 批量 Keep All/Undo All 防重入\n const diffRendererRef = React.useRef(null)\n if (!diffRendererRef.current) diffRendererRef.current = createDiffRenderer((sid, t) => dbg(sid, t))\n\n const currentRecords = React.useMemo(() => {\n const list = []\n for (const rec of Object.values(records)) if (rec.path === active && rec.archived !== true) list.push(rec)\n return list\n }, [records, active])\n\n const regions = React.useMemo(() => diffRegions(currentRecords, content).filter((r) => !r.superseded), [currentRecords, content])\n // useMemo 稳定引用:否则 hover 等重渲染会让 view zone effect 反复重建(- 号闪烁)\n const pendingRegions = React.useMemo(() => regions.filter((r) => r.status === ST.PENDING && !r.stale), [regions])\n const staleRegions = React.useMemo(() => regions.filter((r) => r.status === ST.PENDING && r.stale), [regions])\n hoverRegionsRef.current = pendingRegions\n // 行 → 差异区域 映射(hover O(1) 命中;每行归属其区域)\n const lineRegionMap = React.useMemo(() => {\n const map = new Map()\n for (const r of pendingRegions) {\n if (r.start === undefined || r.end === undefined) continue\n const last = Math.max(r.start, r.end - 1)\n for (let ln = r.start; ln <= last; ln++) if (!map.has(ln)) map.set(ln, r)\n }\n return map\n }, [pendingRegions])\n lineRegionMapRef.current = lineRegionMap\n const sum = React.useMemo(() => summarize(Object.values(records)), [records])\n\n const addTab = (path, select) => {\n setTabs((prev) => {\n if (prev.some((t) => t.path === path)) return prev\n return prev.concat([{ path }])\n })\n if (select) setActive(path)\n }\n\n const closeTab = (path) => {\n flushSave()\n setTabs((prev) => {\n const idx = prev.findIndex((t) => t.path === path)\n if (idx < 0) return prev\n const next = prev.filter((t) => t.path !== path)\n if (active === path) setActive(next[idx] ? next[idx].path : (next[idx - 1] ? next[idx - 1].path : null))\n return next\n })\n }\n\n const refreshRecords = () => {\n if (!sessionId) return\n rpc('edrv.list', { sessionId }).then((res) => {\n if (!res || !res.ok || !Array.isArray(res.records)) return\n const map = {}\n for (const r of res.records) {\n if (r.archived === true) continue\n map[r.callId] = r\n }\n setRecords(map)\n }).catch((e) => setError('list异常:' + String(e)))\n }\n\n const loadContent = (path, sid) => {\n const seq = ++loadSeqRef.current\n setLoadError(null)\n setLoadStage({ progress: monaco ? 72 : 12, message: '读取文件内容…' })\n rpc('edrv.read', { sessionId: sid, path }).then((res) => {\n if (seq !== loadSeqRef.current || path !== active) return\n if (res && res.ok) {\n setContent(res.content)\n setLoadStage((prev) => ({ progress: Math.max(84, prev.progress), message: '文件已读取,准备创建编辑器…' }))\n setStatus('已加载')\n } else {\n const message = res?.error ? String(res.error) : '读取失败'\n setLoadError(message)\n setError(message)\n setStatus('读取失败')\n }\n }).catch((e) => {\n if (seq !== loadSeqRef.current) return\n const message = 'read异常:' + String(e)\n setLoadError(message)\n setError(message)\n setStatus('读取失败')\n })\n }\n\n // 挂载轮询 + 事件订阅\n React.useEffect(() => {\n if (!sessionId) return\n refreshRecords()\n const t = setInterval(refreshRecords, 5000)\n const onRefresh = () => refreshRecords()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => { clearInterval(t); window.removeEventListener('edrv:refresh', onRefresh) }\n }, [sessionId])\n\n React.useEffect(() => {\n const onOpen = (e) => {\n const p = e?.detail?.path\n if (p) addTab(p, true)\n }\n const onShowLauncher = () => setLauncherOpen(true)\n window.addEventListener('edrv:open-editor', onOpen)\n window.addEventListener('edrv:show-launcher', onShowLauncher)\n return () => {\n window.removeEventListener('edrv:open-editor', onOpen)\n window.removeEventListener('edrv:show-launcher', onShowLauncher)\n }\n }, [sessionId])\n\n // localStorage v2 恢复页签\n React.useEffect(() => {\n if (bootRef.current || !sessionId) return\n bootRef.current = true\n try {\n const raw = localStorage.getItem('edrv.editor.v2.' + String(sessionId))\n if (raw) {\n const saved = JSON.parse(raw)\n if (Array.isArray(saved.tabs) && saved.tabs.length) {\n setTabs(saved.tabs.map((p) => ({ path: p })))\n if (typeof saved.active === 'string') setActive(saved.active)\n }\n }\n } catch (e) { /* 损坏忽略 */ }\n }, [sessionId])\n\n React.useEffect(() => {\n if (!sessionId) return\n try { localStorage.setItem('edrv.editor.v2.' + String(sessionId), JSON.stringify({ tabs: tabs.map((t) => t.path), active })) }\n catch (e) { /* 忽略 */ }\n }, [tabs, active, sessionId])\n\n React.useEffect(() => {\n if (!active) return\n setContent(null)\n setLoadError(null)\n setLoadStage({ progress: 10, message: '准备读取文件…' })\n setStatus('加载中…')\n loadContent(active, sessionId)\n }, [active, sessionId])\n\n React.useEffect(() => {\n if (monaco || monacoErr) return\n let alive = true\n const onProgress = (stage) => {\n if (!alive) return\n const progress = stage.phase === 'ready' ? 70 : Math.round(10 + stage.progress * 0.6)\n setLoadStage((prev) => ({ progress: Math.max(prev.progress, progress), message: stage.message }))\n }\n loadMonaco(onProgress).then((m) => { if (alive) setMonaco(m) }).catch((e) => {\n if (alive) {\n setMonacoErr(String(e?.message ?? e))\n setStatus('Monaco 不可用')\n }\n })\n return () => { alive = false }\n }, [monaco, monacoErr])\n\n monacoRef.current = monaco\n\n const getModel = (path, text) => {\n const cache = modelsRef.current\n let model = cache.get(path)\n if (!model) {\n model = window.monaco.editor.createModel(text ?? '', langOf(path), window.monaco.Uri.parse('edrv:///' + encodeURI(path)))\n cache.set(path, model)\n } else if (text !== undefined && model.getValue() !== text) {\n programmaticRef.current = true\n model.setValue(text)\n programmaticRef.current = false\n }\n return model\n }\n\n const flushSave = () => {\n if (saveTimerRef.current) { saveTimerRef.current(); saveTimerRef.current = null }\n }\n\n const doSave = (silent) => {\n const ed = editorRef.current\n if (!active || !ed) return\n const text = ed.getValue()\n if (!silent) setStatus('保存中…')\n rpc('edrv.save', { sessionId, path: active, content: text }).then((res) => {\n if (res && res.ok) {\n setStatus('已保存 ' + new Date().toTimeString().slice(0, 8))\n setContent(text)\n setDirtyMap((d) => Object.assign({}, d, { [active]: false }))\n refreshRecords()\n emitRefresh()\n } else { setStatus('保存失败'); setError(res?.error ? String(res.error) : '保存失败') }\n }).catch((e) => { setStatus('保存失败'); setError('保存异常:' + String(e)) })\n }\n\n const onEdit = () => {\n const ed = editorRef.current\n if (!ed || !active) return\n setDirtyMap((d) => Object.assign({}, d, { [active]: true }))\n setStatus('编辑中…')\n if (saveTimerRef.current) saveTimerRef.current()\n saveTimerRef.current = schedule(() => doSave(true), 700)\n }\n\n // model 同步(当前内容)\n React.useEffect(() => {\n if (!monaco || !editorRef.current || !active || content === null) return\n const ed = editorRef.current\n const model = getModel(active, content)\n if (ed.getModel() !== model) ed.setModel(model)\n setLoadStage((prev) => ({ progress: Math.max(96, prev.progress), message: '创建编辑器视图…' }))\n }, [monaco, active, content])\n\n // 行内差异自绘(decorations / view zones / minus overlay)→ diffRenderer\n React.useEffect(() => {\n if (!monaco || !editorRef.current || !active || content === null) return\n diffRendererRef.current.render(monaco, editorRef.current, pendingRegions, sessionId)\n setLoadStage({ progress: 100, message: '编辑器已就绪' })\n }, [monaco, active, content, pendingRegions])\n\n React.useEffect(() => () => {\n flushSave()\n diffRendererRef.current?.dispose?.()\n if (editorRef.current) { editorRef.current.dispose(); editorRef.current = null }\n for (const m of modelsRef.current.values()) m.dispose()\n modelsRef.current.clear()\n const root = editorRef.current && editorRef.current.getDomNode ? editorRef.current.getDomNode() : null\n if (root) {\n const ov = root.querySelector('.edrv-minus-overlay')\n if (ov) ov.remove()\n }\n }, [])\n\n // 普通 Monaco 编辑器(可编辑、单列行号)+ 自绘行内差异(decoration 绿底+ / view zone 删除块)\n const ensureEditor = React.useCallback((node) => {\n if (!node) {\n if (editorRef.current) { editorRef.current.dispose(); editorRef.current = null }\n return\n }\n if (editorRef.current || !monacoRef.current) return\n const m = monacoRef.current\n const ed = m.editor.create(node, {\n value: '',\n language: 'plaintext',\n theme: 'vs',\n fontFamily: 'var(--ds-font-family-code, ui-monospace, monospace)',\n fontSize: 13,\n lineHeight: 20,\n minimap: { enabled: true, scale: 1 },\n glyphMargin: true,\n lineDecorationsWidth: 16,\n automaticLayout: true,\n scrollBeyondLastLine: false,\n wordWrap: 'off',\n tabSize: 2,\n renderWhitespace: 'selection',\n smoothScrolling: true,\n cursorBlinking: 'smooth',\n padding: { top: 8 },\n })\n ed.addCommand(m.KeyMod.CtrlCmd | m.KeyCode.KeyS, () => { flushSave(); doSave(false) })\n ed.onDidChangeModelContent(() => {\n if (!ed.getModel() || programmaticRef.current) return\n onEdit()\n })\n ed.onDidChangeCursorPosition((e) => {\n setCursor('Ln ' + e.position.lineNumber + ', Col ' + e.position.column)\n })\n // hover 差异块 → 浮出 Keep/Undo(req:鼠标移到编辑区差异块时显示)\n // 防闪烁:① 区域不变不 setState(浮窗锚定差异块起始行,不跟随鼠标);② 延迟隐藏;\n // ③ 浮窗自身 onMouseEnter 取消隐藏计时(鼠标在浮窗与编辑器间移动不闪)。\n const hideSoon = () => {\n if (hoverEditorRef.current || hoverPanelRef.current || hideTimerRef.current) return\n hideTimerRef.current = setTimeout(() => {\n hideTimerRef.current = null\n if (hoverEditorRef.current || hoverPanelRef.current) return\n hoverKeyRef.current = null\n hoverTopRef.current = null\n setHoverAct(null)\n }, 180)\n }\n ed.onMouseMove((e) => {\n hoverEditorRef.current = true\n const line = e?.target?.position?.lineNumber\n const map = lineRegionMapRef.current\n if (!line || !map.size) { hoverEditorRef.current = false; hideSoon(); return }\n const hit = map.get(line)\n if (!hit) { hoverEditorRef.current = false; hideSoon(); return }\n const key = callIdAttr(hit.callId, hit.idx)\n const top = Math.max(0, ed.getTopForLineNumber(Math.max(1, hit.start)) - ed.getScrollTop())\n const layout = ed.getLayoutInfo()\n const minimapLeft = layout.minimap?.minimapLeft || 0\n const right = minimapLeft > 0 ? Math.max(12, layout.width - minimapLeft + 8) : Math.max(12, layout.verticalScrollbarWidth + 8)\n if (hoverKeyRef.current === key && hoverTopRef.current === top && hoverRightRef.current === right) return // 同区域同位置不重复更新\n hoverKeyRef.current = key\n hoverTopRef.current = top\n hoverRightRef.current = right\n if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }\n setHoverAct({ region: hit, top, right })\n })\n editorRef.current = ed\n }, [])\n\n // 打开文件后的差异聚焦跳转(内容/差异就绪后执行一次)\n React.useEffect(() => {\n const pf = pendingFocusRef.current\n if (!pf || pf.path !== active || content === null) return\n const target = pf.region || pendingRegions[0]\n const ed = editorRef.current\n if (!target || !ed) return\n pendingFocusRef.current = null\n ed.revealLineInCenter(Math.max(1, target.start ?? 1))\n ed.setPosition({ lineNumber: Math.max(1, target.start ?? 1), column: 1 })\n ed.focus()\n }, [active, content, pendingRegions])\n\n const jumpTo = (region) => {\n if (editorRef.current) {\n editorRef.current.revealLineInCenter(Math.max(1, region?.start ?? 1))\n editorRef.current.setPosition({ lineNumber: Math.max(1, region?.start ?? 1), column: 1 })\n editorRef.current.focus()\n } else {\n pendingFocusRef.current = { path: active, region }\n }\n }\n\n // 索引校正:差异/文件被处理后 pending 列表变化,clamp 到有效范围\n React.useEffect(() => {\n if (diffIdx >= pendingRegions.length && pendingRegions.length > 0) setDiffIdx(pendingRegions.length - 1)\n else if (pendingRegions.length === 0) setDiffIdx(0)\n }, [pendingRegions.length])\n React.useEffect(() => {\n const i = sum.pendingFiles.findIndex((f) => f.path === active)\n if (i >= 0) { if (i !== fileIdx) setFileIdx(i) }\n }, [sum.pendingFiles, active])\n\n // 上下箭头:当前文件内差异切换(x/x)\n const gotoDiff = (delta) => {\n if (!pendingRegions.length) return\n const next = (diffIdx + delta + pendingRegions.length) % pendingRegions.length\n setDiffIdx(next)\n jumpTo(pendingRegions[next])\n }\n // 左右箭头:全局差异文件切换(x/x 文件),打开并跳转\n const gotoFile = (delta) => {\n if (!sum.pendingFiles.length) return\n const next = (fileIdx + delta + sum.pendingFiles.length) % sum.pendingFiles.length\n setFileIdx(next)\n openFile(sum.pendingFiles[next].path, true)\n }\n\n const reloadFile = () => {\n if (!active) return\n loadContent(active, sessionId)\n refreshRecords()\n }\n\n /**\n * 关闭当前差异浮窗并清理 hover 锚点。\n * @author ddj 2026年08月21号\n */\n const dismissHover = () => {\n hoverKeyRef.current = null\n hoverTopRef.current = null\n hoverRightRef.current = null\n hoverEditorRef.current = false\n hoverPanelRef.current = false\n if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }\n setHoverAct(null)\n }\n\n /**\n * 对单个差异区域执行采纳/不采纳。\n * @author ddj 2026年08月20号\n * @param region 差异区域(callId/idx/create)\n * @param reject true=不采纳(回滚),false=采纳\n * @param silent 批量时抑制中间 reload/报错,由批量方统一收尾\n * @returns Promise<boolean> 是否成功\n */\n const actHunk = (region, reject, silent) => {\n const method = reject ? 'edrv.reject' : 'edrv.accept'\n return rpc(method, { sessionId, callId: region.callId, scope: region.create ? 'call' : 'hunk', hunkIndex: region.idx }).then((res) => {\n if (res && res.ok) {\n setRecords((prev) => Object.assign({}, prev, { [region.callId]: res.record }))\n if (!silent) { reloadFile(); emitRefresh() }\n return true\n }\n if (!silent) setError(res?.error ? String(res.error) : '操作失败')\n return false\n }).catch((e) => {\n if (!silent) setError('操作异常:' + String(e))\n return false\n })\n }\n\n const acceptFile = () => { for (const r of pendingRegions) actHunk(r, false) }\n const undoFile = () => { for (const r of [...pendingRegions].reverse()) actHunk(r, true) }\n\n // 所有差异文件的待处理 hunk 列表(二级菜单 Keep All / Undo All 用)\n const allPending = React.useMemo(() => {\n const out = []\n for (const rec of Object.values(records)) {\n if (rec.superseded === true) continue\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (let i = 0; i < hunks.length; i++) {\n const st = perHunk.length ? perHunk[i] : rec.decisions.call\n if (st === 'pending' && !noopHunk(rec, hunks[i])) out.push({ callId: rec.callId, idx: i, create: rec.create === true, at: rec.at })\n }\n }\n return out\n }, [records])\n\n /**\n * 批量处理所有差异文件:采纳全部 / 不采纳全部。不采纳按 at 降序(新改先回滚)串行执行。\n * @author ddj 2026年08月20号\n * @param reject true=全部不采纳(回滚),false=全部采纳\n */\n const actAllPending = (reject) => {\n if (batchBusyRef.current || !allPending.length) return\n batchBusyRef.current = true\n const list = reject ? [...allPending].sort((a, b) => (a.at < b.at ? 1 : a.at > b.at ? -1 : b.idx - a.idx)) : allPending\n let ok = 0, fail = 0\n const run = async () => {\n for (const r of list) {\n if (await actHunk(r, reject, true)) ok++\n else fail++\n }\n batchBusyRef.current = false\n reloadFile()\n emitRefresh()\n setStatus((reject ? '已不采纳 ' : '已采纳 ') + ok + ' 处差异' + (fail ? ',' + fail + ' 处失败' : ''))\n if (fail) setError(fail + ' 处差异处理失败(可能已被后续修改影响),可刷新后重试')\n }\n run()\n }\n const acceptAllFiles = () => actAllPending(false)\n const undoAllFiles = () => actAllPending(true)\n const rollbackFile = () => {\n if (!active) return\n if (!window.confirm('回滚当前文件到修改前状态?(相关差异将归档)')) return\n rpc('edrv.rollback', { sessionId, path: active }).then((res) => {\n if (res && res.ok) {\n setStatus('已回滚'); reloadFile()\n emitRefresh()\n } else setError(res?.error ? String(res.error) : '回滚失败')\n }).catch((e) => setError('回滚异常:' + String(e)))\n }\n\n const openFile = (path, focusDiff) => {\n if (!path) return\n addTab(path, true)\n if (focusDiff) pendingFocusRef.current = { path, region: null }\n }\n\n const openPath = () => {\n const p = (pathDraft || '').trim()\n if (!p) return\n setStatus('打开中…')\n rpc('edrv.read', { sessionId, path: p }).then((res) => {\n if (res && res.ok) {\n openFile(p, false)\n setOpenInput(false); setPathDraft(''); setStatus('已打开'); setError(null)\n } else { setStatus('打开失败'); setError(res?.error ? String(res.error) : '打开失败') }\n }).catch((e) => { setStatus('打开失败'); setError('打开异常:' + String(e)) })\n }\n\n const tabsEl = React.createElement('div', { className: 'edrv-tabs', style: { flex: '1 1 auto', minWidth: 0 } },\n tabs.map((t) => React.createElement('div', {\n key: t.path,\n className: 'edrv-tab' + (t.path === active ? ' edrv-tab-active' : ''),\n title: t.path,\n onClick: () => { if (t.path !== active) { flushSave(); setActive(t.path) } },\n },\n React.createElement('span', { style: { overflow: 'hidden', textOverflow: 'ellipsis', maxWidth: 180 } }, t.path.split(/[\\\\/]/).pop() || t.path),\n (dirtyMap[t.path] ? React.createElement('span', { className: 'edrv-tab-dot' }) : null),\n React.createElement('span', { className: 'edrv-tab-x', onClick: (e) => { e.stopPropagation(); closeTab(t.path) } }, '×'))),\n (openInput\n ? React.createElement('input', { className: 'edrv-path-input', autoFocus: true, placeholder: '输入工作区相对/绝对路径,回车打开', value: pathDraft, onChange: (e) => setPathDraft(e.target.value), onKeyDown: (e) => { if (e.key === 'Enter') openPath(); if (e.key === 'Escape') setOpenInput(false) } })\n : React.createElement('button', { className: 'edrv-tab-add', title: '打开文件(输入路径)', onClick: () => setOpenInput(true) }, '+')))\n\n const pathBar = React.createElement('div', { className: 'edrv-pathbar', title: active || '' },\n React.createElement('span', { className: 'edrv-pb-name' }, active ? String(active).split(/[\\\\/]/).pop() : '未打开文件'),\n React.createElement('span', { className: 'edrv-pb-full' }, active || '使用右上搜索框 (Ctrl+P) 打开文件'))\n\n const tabRow = React.createElement('div', { style: { display: 'flex', alignItems: 'center', background: 'var(--dsw-alias-bg-layer-1,transparent)', flexShrink: 0 } },\n tabsEl,\n React.createElement(QuickOpen, { sessionId, onOpen: (p) => openFile(p, false) }))\n\n const statusBar = React.createElement('div', { className: 'edrv-statusbar' },\n React.createElement('span', null, '编辑'),\n React.createElement('span', null, active ? langOf(active) : ''),\n React.createElement('span', null, cursor),\n (status ? React.createElement('span', null, status) : null),\n React.createElement('span', { style: { flex: 1 } }),\n (sum.totalFiles > 0\n ? React.createElement('button', { className: 'edrv-diffchip', title: '打开差异总览/归档', onClick: () => setLauncherOpen((o) => !o) }, '⚠ 差异 ' + sum.totalFiles + ' 文件')\n : null),\n React.createElement('button', { className: 'edrv-chip-btn', title: '刷新', onClick: reloadFile }, '⟳'))\n\n const otherFiles = sum.pendingFiles.filter((f) => f.path !== active)\n\n /**\n * 渲染编辑器/文件加载进度面板。\n * @author ddj 2026年08月22号\n * @param message 当前加载阶段\n * @param progress 阶段进度\n * @param retry 可选重试回调\n * @returns 加载面板 React 元素\n */\n const loadingBody = (message, progress, retry) => React.createElement('div', { className: 'edrv-empty edrv-loading', 'aria-live': 'polite' },\n React.createElement('div', { className: 'edrv-loading-title' }, message),\n React.createElement('div', {\n className: 'edrv-progress',\n role: 'progressbar',\n 'aria-label': '编辑器加载进度',\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': progress,\n }, React.createElement('div', { className: 'edrv-progress-value', style: { width: Math.max(0, Math.min(100, progress)) + '%' } })),\n React.createElement('div', { className: 'edrv-loading-percent' }, Math.round(progress) + '%'),\n retry ? React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', onClick: retry }, '重试') : null)\n\n let body\n if (!monaco && !monacoErr) {\n body = loadingBody(loadStage.message, loadStage.progress)\n } else if (monacoErr) {\n body = React.createElement('div', { className: 'edrv-empty' },\n React.createElement('div', null, 'Monaco 编辑器加载失败:' + String(monacoErr)),\n React.createElement('div', { style: { fontSize: 11 } }, '请确认插件包 assets/vendor/monaco 完整(/edrv/vendor 路由可达)'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', onClick: () => { setMonacoErr(null); setLoadStage({ progress: 0, message: '准备重试 Monaco…' }) } }, '重试'))\n } else if (!active) {\n body = React.createElement('div', { className: 'edrv-empty' },\n React.createElement('div', null, '暂无打开的文件'),\n React.createElement('div', { style: { fontSize: 12 } }, '使用右上搜索框 (Ctrl+P) 打开工作区文件;agent 修改文件后顶部会出现差异角标'))\n } else if (content === null && loadError) {\n body = loadingBody('文件加载失败:' + loadError, 0, () => {\n setLoadError(null)\n setContent(null)\n setLoadStage({ progress: 10, message: '重新读取文件…' })\n loadContent(active, sessionId)\n })\n } else if (content === null) {\n body = loadingBody(loadStage.message || '读取文件内容…', loadStage.progress)\n } else {\n body = React.createElement('div', { className: 'edrv-monaco-host' },\n React.createElement('div', { ref: ensureEditor }))\n }\n\n const hoverEl = (hoverAct && !launcherOpen)\n ? React.createElement('div', {\n className: 'edrv-hoveract',\n style: { top: hoverAct.top, right: hoverAct.right ?? 12 },\n onMouseEnter: () => { hoverPanelRef.current = true; if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },\n onMouseMove: () => { hoverPanelRef.current = true; if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },\n onMouseLeave: () => {\n hoverPanelRef.current = false\n if (hoverEditorRef.current || hideTimerRef.current) return\n hideTimerRef.current = setTimeout(() => {\n hideTimerRef.current = null\n if (hoverEditorRef.current || hoverPanelRef.current) return\n hoverKeyRef.current = null\n hoverTopRef.current = null\n setHoverAct(null)\n }, 420)\n },\n },\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', onClick: () => { dismissHover(); actHunk(hoverAct.region, false) } }, '✓ Keep'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-undo', onClick: () => { dismissHover(); actHunk(hoverAct.region, true) } }, '↩ Undo'))\n : null\n\n const overlay = launcherOpen\n ? React.createElement(React.Fragment, null,\n React.createElement('div', { style: { position: 'fixed', inset: 0, zIndex: 30 }, onClick: () => setLauncherOpen(false) }),\n React.createElement(DiffLauncher, { sessionId, sum, tab: launcherTab, onClose: () => setLauncherOpen(false), onOpenFile: (p) => { openFile(p, true); setLauncherOpen(false) } }))\n : (pendingRegions.length > 0\n ? React.createElement(DiffBox, {\n pendingRegions, staleRegions,\n onAct: actHunk,\n onAcceptFile: acceptFile,\n onUndoFile: undoFile,\n onAcceptAllFiles: acceptAllFiles,\n onUndoAllFiles: undoAllFiles,\n allPendingCount: allPending.length,\n onRollback: rollbackFile,\n onJump: jumpTo,\n otherFiles,\n onOpenOther: (p) => openFile(p, true),\n onOpenLauncher: (tab) => { setLauncherTab(tab || 'pending'); setLauncherOpen(true) },\n onRefresh: reloadFile,\n activePath: active,\n diffIdx, diffTotal: pendingRegions.length,\n fileIdx, fileTotal: sum.pendingFiles.length,\n onPrevDiff: () => gotoDiff(-1), onNextDiff: () => gotoDiff(1),\n onPrevFile: () => gotoFile(-1), onNextFile: () => gotoFile(1),\n })\n : (sum.pendingFiles.length > 0\n ? React.createElement(DiffBarEmpty, {\n sum, active, staleCount: staleRegions.length,\n onNextFile: () => { if (sum.pendingFiles.length) openFile(sum.pendingFiles[0].path, true) },\n onOpenLauncher: (tab) => { setLauncherTab(tab || 'pending'); setLauncherOpen(true) },\n onRefresh: reloadFile,\n })\n : null))\n\n return React.createElement('div', { 'data-edrv-view': '1', style: { height: '100%', minHeight: 0, display: 'flex', flexDirection: 'column', background: 'var(--dsw-alias-bg-base,transparent)', overflow: 'hidden' } },\n pathBar,\n tabRow,\n React.createElement('div', { style: { position: 'relative', flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' } },\n body,\n hoverEl,\n overlay),\n statusBar)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffBadge:header 差异角标(仅工作区有差异时显示)。\n * 迁移自原 src/client/index.ts 的 DiffBadge,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { openEditorView, emitShowLauncher } from '../events.js'\nimport { summarize } from '../state/records.js'\n\n/**\n * 会话 header 差异角标:5s 轮询 edrv.list,有差异时显示数字徽章,点击打开编辑区并拉起 DiffLauncher。\n */\nexport function DiffBadge(props) {\n const sessionId = props?.sessionId\n const [n, setN] = React.useState(0)\n const seq = React.useRef(0)\n\n const load = React.useCallback(() => {\n if (!sessionId) return\n const s = ++seq.current\n rpc('edrv.list', { sessionId }).then((res) => {\n if (s !== seq.current || !res || !res.ok || !Array.isArray(res.records)) return\n setN(summarize(res.records).totalFiles)\n }).catch(() => {})\n }, [sessionId])\n\n React.useEffect(() => {\n load()\n const t = setInterval(load, 5000)\n const onRefresh = () => load()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => { clearInterval(t); window.removeEventListener('edrv:refresh', onRefresh) }\n }, [load])\n\n if (!n) return null\n\n const click = () => {\n openEditorView(null)\n setTimeout(() => { emitShowLauncher() }, 120)\n }\n\n return React.createElement('button', {\n onClick: click,\n title: n + ' 个文件有差异,点击在编辑区查看',\n style: { position: 'relative', display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 30, height: 30, padding: 0, background: 'transparent', border: 'none', borderRadius: 6, cursor: 'pointer' },\n },\n React.createElement('img', { src: '/edrv/assets/compare-select.png', alt: '差异', style: { width: 22, height: 22, display: 'block' } }),\n React.createElement('span', { style: { position: 'absolute', top: 1, right: 0, minWidth: 15, height: 15, padding: '0 3px', borderRadius: 8, background: 'var(--dsw-alias-state-warn-primary,#d97706)', color: '#fff', fontSize: 10, lineHeight: '15px', textAlign: 'center', fontWeight: 700, boxSizing: 'border-box' } }, String(n)))\n}\n","/**\n * dsh-vscode-mode client — 兼容层:设置桥选择 / slot 安全注册 / openPath 链式补丁 / 外部插件常量。\n * 纯逻辑与薄 ctx 胶水,node 环境可单测(不依赖 DOM)。\n * 作者 ddj 2026年08月24号\n */\n\n/** 本插件包名(与 host compat.PLUGIN_NAME 对应)。 */\nexport const PLUGIN_NAME = 'dsh-vscode-mode'\n/** 外部侧栏插件名(dsh-web-ui-all 家族的文件打开能力提供方)。 */\nexport const SIDEBAR_PLUGIN = 'dsh-better-sidebar'\n\n/** 设置 scope 的跨组件上下文形状(与官方 settingsScope 绑定的最小面)。 */\nexport interface SettingsScopeLike {\n getSnapshot: () => { status?: string; value?: { fileOpenTool?: unknown }; writable?: boolean }\n subscribe: (listener: () => void) => () => void\n set: (field: string, value: unknown) => Promise<void>\n}\n\n/**\n * 设置桥三级优先:webUiSettings(linxin666 兼容桥)→ settingsScope(官方)→ 无。\n * 桥绑定抛错时降级到下一级,不让单个桥异常拖垮设置装配。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 激活的桥名称与绑定 scope\n */\nexport function pickSettingsBinder(ctx: { get: (name: string) => unknown }): { service: string; scope: SettingsScopeLike | undefined } {\n for (const service of ['webUiSettings', 'settingsScope']) {\n try {\n const binder = ctx.get(service) as { bind?: (spec: { namespace: string }) => SettingsScopeLike } | undefined\n const scope = binder?.bind?.({ namespace: PLUGIN_NAME })\n if (scope) return { service, scope }\n } catch {\n /* 桥异常时降级到下一级 */\n }\n }\n return { service: 'none', scope: undefined }\n}\n\n/** slot 注册描述(对齐 ctx.slots.register 的形状)。 */\nexport interface SlotSpec {\n name: string\n id: string\n order?: number\n label?: string\n inject?: (sessionId: string) => object\n}\n\n/**\n * 跨版本 slot 安全注册:封装 ctx.slots.inject 等待声明模式(新老 DSH 通用),\n * 服务缺失或注册抛错时降级为警告,不让单条 slot 拖垮装配。\n * 注意:方法必须挂在服务对象上调用(slots.register 是依赖 this.records 的类方法,\n * 解构后 this 丢失会静默失败),故禁止解构。\n * @author ddj 2026年08月24号\n * @param ctx 客户端上下文(slots 服务)\n * @param spec slot 描述\n * @param render 渲染函数\n */\nexport function registerSlotSafely(ctx: { slots?: { inject?: (name: string, register: () => unknown) => unknown; register?: (...args: unknown[]) => unknown } }, spec: SlotSpec, render: (props: unknown) => unknown): void {\n const slots = ctx?.slots as { inject: (name: string, register: () => unknown) => unknown; register: (...args: unknown[]) => unknown } | undefined\n if (!slots || typeof slots.inject !== 'function' || typeof slots.register !== 'function') {\n console.warn('[' + PLUGIN_NAME + '] slots 服务不可用,跳过 slot ' + spec.name)\n return\n }\n try {\n slots.inject(spec.name, () => slots.register(spec, render))\n } catch (error) {\n console.warn('[' + PLUGIN_NAME + '] slot ' + spec.name + ' 注册失败(' + String(error) + '),已跳过')\n }\n}\n\n/**\n * 链式补丁对象方法:保存原实现、装入包装实现,dispose 恢复。\n * 恢复带归属校验(仅当当前实现仍是本包装时还原),多插件补丁按栈序互不踩踏。\n * @author ddj 2026年08月24号\n * @param owner 目标对象\n * @param key 方法名\n * @param wrapper 包装实现(original 为补丁前的实现)\n * @returns 恢复函数(幂等)\n */\nexport function patchMethod<T extends object, K extends keyof T>(\n owner: T,\n key: K,\n wrapper: (original: T[K], ...args: never[]) => unknown,\n): () => void {\n const original = owner[key]\n const patched = ((...args: never[]) => wrapper(original, ...args)) as T[K]\n owner[key] = patched\n return () => {\n if (owner[key] === patched) owner[key] = original\n }\n}\n","/**\n * dsh-vscode-mode client — 文件打开器注册表与自动选择。\n * @author ddj 2026年08月24号\n */\nimport { SIDEBAR_PLUGIN } from './compat.js'\n\nexport const AUTO_OPEN_TOOL = 'auto'\nexport const SYSTEM_OPEN_TOOL = 'system'\nexport const VSCODE_OPEN_TOOL = 'dsh-vscode-mode'\nexport const SIDEBAR_OPEN_TOOL = SIDEBAR_PLUGIN\n\nexport interface FileOpenContext {\n sessionId?: string\n cwd?: string\n}\n\nexport interface FileOpener {\n id: string\n label: string\n description?: string\n priority?: number\n isAvailable?: () => boolean\n open: (path: string, context: FileOpenContext) => void | Promise<void>\n}\n\nexport interface FileOpenerRegistry {\n register(opener: FileOpener): () => void\n registerFileOpener(opener: FileOpener): () => void\n list(): readonly FileOpener[]\n subscribe(listener: () => void): () => void\n get(id: string): FileOpener | undefined\n}\n\n/**\n * 写入外部打开器并触发注册表通知。\n * @author ddj 2026年08月24号\n * @param entries 打开器存储\n * @param notify 变更通知\n * @param opener 打开器\n */\nfunction registryRegister(entries: Map<string, FileOpener>, notify: () => void, opener: FileOpener): void {\n if (!opener.id || typeof opener.open !== 'function') throw new TypeError('文件打开器必须提供 id 和 open')\n entries.set(opener.id, opener)\n notify()\n}\n\n/**\n * 创建生命周期独立的文件打开器注册表。\n * @author ddj 2026年08月24号\n * @returns 文件打开器注册表\n */\nexport function createFileOpenerRegistry(): FileOpenerRegistry {\n const entries = new Map<string, FileOpener>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) listener()\n }\n const list = (): readonly FileOpener[] => [...entries.values()].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n return {\n register(opener: FileOpener): () => void {\n registryRegister(entries, notify, opener)\n return () => {\n if (entries.get(opener.id) !== opener) return\n entries.delete(opener.id)\n notify()\n }\n },\n registerFileOpener(opener: FileOpener): () => void {\n registryRegister(entries, notify, opener)\n return () => {\n if (entries.get(opener.id) !== opener) return\n entries.delete(opener.id)\n notify()\n }\n },\n list,\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n get: (id: string) => entries.get(id),\n }\n}\n\n/**\n * 检查打开器当前是否可用。\n * @author ddj 2026年08月24号\n * @param opener 待检查打开器\n * @returns 是否可用\n */\nexport function isAvailable(opener: FileOpener): boolean {\n try {\n return opener.isAvailable ? opener.isAvailable() : true\n } catch {\n return false\n }\n}\n\n/**\n * 返回当前可展示的文件打开器。\n * @author ddj 2026年08月24号\n * @param registry 文件打开器注册表\n * @returns 可用打开器列表\n */\nexport function availableOpeners(registry: FileOpenerRegistry): FileOpener[] {\n return registry.list().filter(isAvailable)\n}\n\n/**\n * 按设置选择打开器,不可用时回退自动优先级。\n * @author ddj 2026年08月24号\n * @param registry 文件打开器注册表\n * @param selected 用户选择的打开器 id\n * @returns 选中的打开器\n */\nexport function selectOpener(\n registry: FileOpenerRegistry,\n selected: string,\n): FileOpener | undefined {\n if (selected !== AUTO_OPEN_TOOL) {\n const requested = registry.get(selected)\n if (requested && isAvailable(requested)) return requested\n }\n return availableOpeners(registry)[0]\n}\n\n/**\n * 结构化探测 dsh-better-sidebar 的文件打开能力。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 侧边栏打开器或 undefined\n */\nexport function scanSidebar(ctx: { get: (name: string) => unknown }): FileOpener | undefined {\n try {\n const service = ctx.get('betterSidebar') as {\n openFile?: (scope: { sessionId: string; cwd?: string }, path: string, title?: string) => void\n isTabEnabled?: (id: string) => boolean\n features?: readonly string[]\n getSnapshot?: () => { state?: unknown }\n } | undefined\n if (!service || typeof service.openFile !== 'function') return undefined\n const advertised = service.features?.includes('openFile') ?? true\n if (!advertised) return undefined\n const canOpen = typeof service.isTabEnabled !== 'function' || service.isTabEnabled('editor')\n if (!canOpen) return undefined\n return {\n id: SIDEBAR_OPEN_TOOL,\n label: 'dsh-better-sidebar',\n description: '在 dsh-web-ui-all 侧边栏编辑器中打开',\n priority: 80,\n isAvailable: () => typeof service.openFile === 'function'\n && (service.features?.includes('openFile') ?? true)\n && (typeof service.isTabEnabled !== 'function' || service.isTabEnabled('editor')),\n open: (path, context) => {\n if (!context.sessionId) throw new Error('当前没有活动会话')\n service.openFile!({ sessionId: context.sessionId, cwd: context.cwd }, path, baseName(path))\n },\n }\n } catch {\n return undefined\n }\n}\n\n/**\n * 从路径提取文件名。\n * @author ddj 2026年08月24号\n * @param path 文件路径\n * @returns 文件名\n */\nexport function baseName(path: string): string {\n const normalized = path.replace(/\\\\/g, '/')\n return normalized.slice(normalized.lastIndexOf('/') + 1) || path\n}\n","/**\n * dsh-vscode-mode client — 设置 scope 的跨组件上下文。\n * 绑定逻辑(webUiSettings 兼容桥 → 官方 settingsScope 降级)统一由 compat 层提供。\n * 作者 ddj 2026年08月24号\n */\nimport React from 'react'\nimport { pickSettingsBinder, type SettingsScopeLike } from './compat.js'\n\nexport type { SettingsScopeLike }\n\nexport const SettingsContext = React.createContext<SettingsScopeLike | undefined>(undefined)\n\n/**\n * 从 Cordis 服务绑定 VSCodeMode 设置 scope(兼容桥优先,官方次之)。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 设置 scope 或 undefined\n */\nexport function getSettingsScope(ctx: { get: (name: string) => unknown }): SettingsScopeLike | undefined {\n return pickSettingsBinder(ctx).scope\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — VSCodeMode 设置区内的 MCP 管理。\n * 子 Tab:我的 MCP(profile 全局)/ 项目 MCP(各项目 .mcp.json)/ MCP 市场(占位)。\n * 作者 ddj 2026年08月22号\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport type { MpcProject, MpcServer } from '../../shared/mcp.js'\nimport '../styles/mcp.css'\nimport { availableOpeners, AUTO_OPEN_TOOL } from '../fileOpeners.js'\nimport { SettingsContext } from '../settingsContext.js'\n\nconst EMPTY = { serverName: '', transport: 'stdio', command: '', args: '', cwd: '', url: '', headers: '' }\n\n/** 将表单草稿转换为 Host MCP 配置。 */\nfunction configOf(draft) {\n const config = { serverName: draft.serverName.trim(), transport: draft.transport }\n if (draft.transport === 'stdio') {\n config.command = draft.command.trim()\n config.args = draft.args.split(/\\r?\\n|\\s+/).filter(Boolean)\n if (draft.cwd.trim()) config.cwd = draft.cwd.trim()\n } else {\n config.url = draft.url.trim()\n config.headers = parsePairs(draft.headers)\n }\n return config\n}\n\n/** 解析每行 key=value 的表单字段。 */\nfunction parsePairs(text) {\n return Object.fromEntries(text.split(/\\r?\\n/).map((line) => line.trim()).filter(Boolean).map((line) => {\n const idx = line.indexOf('=')\n return idx > 0 ? [line.slice(0, idx).trim(), line.slice(idx + 1).trim()] : [line, '']\n }))\n}\n\n/** 服务状态文案。 */\nfunction statusOf(server) {\n return server.status === 'connected' ? '在线' : server.status === 'connecting' ? '连接中' : server.status === 'disabled' ? '已禁用' : '错误'\n}\n\n/** MCP 服务卡片(全局与项目共用)。 */\nfunction ServerCard({ server, onRefresh, onToggle, onRemove }) {\n return React.createElement('article', { className: 'vsm-mcp-card' },\n React.createElement('div', { className: 'vsm-mcp-card-head' },\n React.createElement('div', { className: 'vsm-mcp-title' }, React.createElement('span', { className: 'vsm-mcp-dot ' + (server.enabled ? server.status : 'disabled') }), server.serverName),\n React.createElement('div', { className: 'vsm-mcp-actions' },\n React.createElement('button', { onClick: () => onRefresh(server.id), title: '刷新连接' }, '↻'),\n React.createElement('button', { className: 'vsm-danger', onClick: () => onRemove(server.id), title: '删除 MCP' }, '⌫'),\n React.createElement('button', { className: 'vsm-switch ' + (server.enabled ? 'on' : ''), onClick: () => onToggle(server), 'aria-label': server.enabled ? '禁用' : '启用' }, server.enabled ? '●' : '○'),\n ),\n ),\n React.createElement('div', { className: 'vsm-mcp-meta' }, statusOf(server), ' · ', server.toolCount, ' 个工具 · ', server.transport),\n server.error && React.createElement('div', { className: 'vsm-mcp-error' }, server.error),\n React.createElement('div', { className: 'vsm-mcp-tools' }, server.tools.map((tool) => React.createElement('span', { key: tool.name, className: 'vsm-mcp-chip', title: tool.description || tool.name }, tool.name))),\n )\n}\n\n/** 按项目标题或路径过滤,大小写不敏感。 */\nexport function filterProjects(projects, query) {\n const needle = String(query ?? '').trim().toLowerCase()\n if (!needle) return projects\n return projects.filter((project) => `${project.title} ${project.workspacePath}`.toLowerCase().includes(needle))\n}\n\n/** 带搜索的项目组合框。 */\nfunction ProjectPicker({ projects, value, onChange }) {\n const [open, setOpen] = React.useState(false)\n const [query, setQuery] = React.useState('')\n const [highlight, setHighlight] = React.useState(0)\n const rootRef = React.useRef(null)\n const selected = projects.find((project) => project.workspacePath === value)\n const filtered = React.useMemo(() => filterProjects(projects, query), [projects, query])\n\n React.useEffect(() => {\n const close = (event) => {\n if (!rootRef.current?.contains(event.target)) setOpen(false)\n }\n document.addEventListener('mousedown', close)\n return () => document.removeEventListener('mousedown', close)\n }, [])\n\n const choose = (project) => {\n onChange(project.workspacePath)\n setQuery('')\n setOpen(false)\n }\n const move = (delta) => setHighlight((old) => Math.max(0, Math.min(Math.max(0, filtered.length - 1), old + delta)))\n const keyDown = (event) => {\n if (event.key === 'ArrowDown') { event.preventDefault(); move(1) }\n else if (event.key === 'ArrowUp') { event.preventDefault(); move(-1) }\n else if (event.key === 'Enter' && filtered[highlight]) { event.preventDefault(); choose(filtered[highlight]) }\n else if (event.key === 'Escape') { event.preventDefault(); setOpen(false) }\n }\n return React.createElement('div', { className: 'vsm-project-picker', ref: rootRef },\n React.createElement('button', { className: 'vsm-project-picker-trigger', role: 'combobox', 'aria-expanded': open, onClick: () => setOpen((old) => !old) },\n React.createElement('span', { className: 'vsm-project-picker-label' }, selected?.title || '选择项目', selected && React.createElement('small', null, selected.workspacePath)),\n React.createElement('span', { className: 'vsm-project-picker-arrow' }, open ? '⌃' : '⌄'),\n ),\n open && React.createElement('div', { className: 'vsm-project-picker-menu' },\n React.createElement('input', { autoFocus: true, className: 'vsm-project-picker-search', value: query, placeholder: '搜索项目名称或路径…', onChange: (event) => { setQuery(event.target.value); setHighlight(0) }, onKeyDown: keyDown }),\n React.createElement('div', { className: 'vsm-project-picker-options', role: 'listbox' }, filtered.length ? filtered.map((project, index) => React.createElement('button', { key: project.workspacePath, role: 'option', 'aria-selected': project.workspacePath === value, className: 'vsm-project-option ' + (index === highlight ? 'highlight' : '') + (project.workspacePath === value ? ' selected' : ''), onMouseEnter: () => setHighlight(index), onClick: () => choose(project) }, React.createElement('span', null, project.title), React.createElement('small', null, project.workspacePath, ' · ', project.servers.length, ' 个 MCP'))) : React.createElement('div', { className: 'vsm-project-picker-empty' }, '没有匹配的项目')),\n ),\n )\n}\n\n/** 单个项目的 MCP 分组。 */\nfunction ProjectGroup({ project, busy, onAdd, onRefresh, onToggle, onRemove }) {\n const head = React.createElement('div', { className: 'vsm-project-head' },\n React.createElement('div', { className: 'vsm-project-title' }, React.createElement('span', { className: 'vsm-project-icon' }, '▣'), React.createElement('div', null, React.createElement('span', { className: 'vsm-project-name' }, project.title), React.createElement('span', { className: 'vsm-project-path' }, project.workspacePath))),\n React.createElement('button', { className: 'vsm-primary vsm-small', onClick: () => onAdd(project) }, '+ 添加 MCP'),\n )\n let body\n if (project.missingDir) body = React.createElement('div', { className: 'vsm-project-empty' }, '项目目录已不存在,无法管理 MCP')\n else if (project.fileError) body = React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, project.fileError)\n else if (!project.servers.length) body = React.createElement('div', { className: 'vsm-project-empty' }, '此项目未配置 MCP')\n else body = project.servers.map((server) => React.createElement(ServerCard, { key: server.serverName, server, onRefresh: (id) => onRefresh(project, server, id), onToggle: () => onToggle(project, server), onRemove: (id) => onRemove(project, server, id) }))\n return React.createElement('section', { className: 'vsm-project' }, head, body)\n}\n\n/** 通用设置:选择当前对话文件链接的打开器 + 开发形态开关。 */\nfunction GeneralSettings({ registry }) {\n const [tool, setTool] = React.useState(AUTO_OPEN_TOOL)\n const [busy, setBusy] = React.useState(false)\n const [error, setError] = React.useState('')\n const [devForm, setDevForm] = React.useState(null)\n const [devBusy, setDevBusy] = React.useState(false)\n const [devMessage, setDevMessage] = React.useState('')\n const settings = React.useContext(SettingsContext)\n const snapshot = settings?.getSnapshot?.()\n const loading = !snapshot || snapshot.status === 'loading'\n const unavailable = snapshot?.status === 'unavailable' || !settings\n const notReady = snapshot?.status !== 'ready'\n React.useEffect(() => {\n const onChange = () => {\n const next = settings?.getSnapshot?.().value?.fileOpenTool\n if (typeof next === 'string') setTool(next)\n }\n onChange()\n return settings?.subscribe?.(onChange)\n }, [settings])\n React.useEffect(() => {\n rpc('vscode.devFormGet', {}).then((result) => {\n if (result.ok) setDevForm(result.devForm)\n }).catch(() => { /* 开发形态查询失败静默 */ })\n }, [])\n const save = (value) => {\n setTool(value); setBusy(true); setError('')\n if (!settings?.set) { setError('设置服务不可用'); setBusy(false); return }\n settings.set('fileOpenTool', value).catch((e) => setError(String(e))).finally(() => setBusy(false))\n }\n const closeDevForm = () => {\n if (!window.confirm('关闭开发形态:插件将切换为正式版安装(版本依赖 + 删除工作区链接),pnpm 装配后需重启 DSH 生效。确认关闭?')) return\n setDevBusy(true)\n setDevMessage('')\n rpc('vscode.devFormSet', { enabled: false }).then((result) => {\n if (!result.ok) { setDevMessage('关闭失败:' + String(result.error)); return }\n setDevForm(result.devForm)\n setDevMessage(result.restart ? '已切换为正式版,重启 DSH 后生效。' : '已关闭开发形态。')\n }).catch((e) => setDevMessage('关闭失败:' + String(e))).finally(() => setDevBusy(false))\n }\n const options = [{ id: AUTO_OPEN_TOOL, label: '自动选择', description: '按当前已注册工具自动选择' }, ...availableOpeners(registry).map((item) => ({ id: item.id, label: item.label, description: item.description }))]\n const currentOption = options.some((item) => item.id === tool) ? tool : AUTO_OPEN_TOOL\n const devFormRow = devForm?.enabled ? React.createElement('div', { className: 'vsm-general-row' },\n React.createElement('span', null, '开发形态', React.createElement('small', { className: 'vsm-devform-note' }, '工作区链接安装:' + devForm.path)),\n React.createElement('div', { className: 'vsm-devform-actions' },\n devMessage && React.createElement('small', { className: 'vsm-devform-msg' }, devMessage),\n React.createElement('button', { className: 'vsm-devform-close', disabled: devBusy, onClick: closeDevForm }, devBusy ? '切换中…' : '关闭开发形态'),\n ),\n ) : null\n return React.createElement('section', { className: 'vsm-general-page' },\n React.createElement('h2', null, '通用'),\n React.createElement('p', null, '配置 DSH 对话中文件链接的打开工具。工具由当前运行时自动扫描。'),\n unavailable && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, '设置服务暂不可用,当前使用自动选择。'),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n React.createElement('label', { className: 'vsm-general-row' }, React.createElement('span', null, '文件链接使用工具'), React.createElement('select', { value: currentOption, disabled: loading || unavailable || notReady || busy || snapshot?.writable === false, onChange: (event) => save(event.target.value) }, options.map((item) => React.createElement('option', { key: item.id, value: item.id }, item.label))), loading && React.createElement('small', null, '读取中…')),\n devFormRow,\n )\n}\n\n/** 兼容性小节:host 报告(RPC compat)+ 客户端本地适配项。 */\nfunction CompatSection({ getSummary }) {\n const [report, setReport] = React.useState(null)\n const [error, setError] = React.useState('')\n React.useEffect(() => {\n let alive = true\n rpc('compat', {}).then((result) => {\n if (!alive) return\n if (!result.ok) setError(String(result.error))\n else setReport(result.report)\n }).catch((e) => { if (alive) setError(String(e)) })\n return () => { alive = false }\n }, [])\n const renderItems = (list) => (list ?? []).map((item) => React.createElement('div', { key: item.name, className: 'vsm-compat-item ' + (item.active ? 'ok' : 'warn') },\n React.createElement('span', { className: 'vsm-compat-name' }, item.name),\n React.createElement('span', { className: 'vsm-compat-note' }, item.note ?? (item.active ? '正常' : '未生效')),\n ))\n const warnings = report?.warnings ?? []\n const devForm = report?.devForm\n return React.createElement('section', { className: 'vsm-general-page' },\n React.createElement('h2', null, '兼容性'),\n React.createElement('p', null, '检测与其他插件 / DSH 版本的适配状态与已知问题。' + (report?.pluginVersion ? '(插件版本 ' + report.pluginVersion + ')' : '')),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n devForm?.enabled && React.createElement(React.Fragment, null,\n React.createElement('h3', { className: 'vsm-compat-h3' }, '开发形态'),\n React.createElement('div', { className: 'vsm-compat-item ok' }, React.createElement('span', { className: 'vsm-compat-name' }, '开发形态开启(工作区链接安装)'), React.createElement('span', { className: 'vsm-compat-note' }, devForm.path)),\n ),\n React.createElement('h3', { className: 'vsm-compat-h3' }, '外部插件与服务'),\n renderItems(report?.external),\n React.createElement('h3', { className: 'vsm-compat-h3' }, '客户端适配'),\n renderItems(getSummary?.() ?? []),\n React.createElement('h3', { className: 'vsm-compat-h3' }, '护栏'),\n renderItems(report?.guards),\n React.createElement('h3', { className: 'vsm-compat-h3' }, '警告'),\n warnings.length ? warnings.map((w, index) => React.createElement('div', { key: index, className: 'vsm-mcp-error vsm-mcp-banner' }, w)) : React.createElement('div', { className: 'vsm-compat-item ok' }, React.createElement('span', { className: 'vsm-compat-name' }, '未检测到兼容性问题'), React.createElement('span', { className: 'vsm-compat-note' }, '')),\n )\n}\n\n/** MCP 管理主面板。 */\nexport function McpSettings(props) {\n const openerRegistry = props?.openerRegistry ?? { list: () => [] }\n const compatSummary = props?.compatSummary ?? (() => [])\n const [servers, setServers] = React.useState<MpcServer[]>([])\n const [projects, setProjects] = React.useState<MpcProject[]>([])\n const [loading, setLoading] = React.useState(true)\n const [busy, setBusy] = React.useState('')\n const [error, setError] = React.useState('')\n const [tab, setTab] = React.useState('general')\n const [draft, setDraft] = React.useState(EMPTY)\n const [showForm, setShowForm] = React.useState(false)\n const [projectForm, setProjectForm] = React.useState(null)\n const [selectedPath, setSelectedPath] = React.useState('')\n\n React.useEffect(() => {\n if (!projects.length) {\n setSelectedPath('')\n return\n }\n if (!projects.some((project) => project.workspacePath === selectedPath)) setSelectedPath(projects[0].workspacePath)\n }, [projects, selectedPath])\n\n const loadAll = React.useCallback(() => {\n setLoading(true)\n setError('')\n Promise.all([rpc('mcp.list', {}), rpc('mcp.projects', {})]).then(([list, prj]) => {\n if (!list.ok) throw new Error(list.error)\n if (!prj.ok) throw new Error(prj.error)\n setServers(list.servers)\n setProjects(prj.projects)\n }).catch((e) => setError(String(e))).finally(() => setLoading(false))\n }, [])\n\n React.useEffect(loadAll, [loadAll])\n\n const finish = (result) => {\n if (!result.ok) throw new Error(result.error)\n return result\n }\n\n const action = (label, id, method, args, patch) => {\n setBusy(id)\n setError('')\n return rpc(method, args).then(finish).then((result) => {\n if (patch) patch(result)\n }).catch((e) => setError(String(e))).finally(() => setBusy('')).then(() => label)\n }\n\n const refreshGlobal = (id) => action('refresh', id, 'mcp.refresh', { id }, (r) => setServers((old) => old.map((s) => s.id === id ? r.server : s)))\n const toggleGlobal = (s) => action('toggle', s.id, 'mcp.toggle', { id: s.id, enabled: !s.enabled }, (r) => setServers((old) => old.map((x) => x.id === s.id ? r.server : x)))\n const removeGlobal = (s) => window.confirm('确认删除此 MCP 服务?') && action('remove', s.id, 'mcp.remove', { id: s.id }, (r) => setServers((old) => old.filter((x) => x.id !== s.id)))\n\n const replaceProject = (workspacePath) => (result) => setProjects((old) => old.map((p) => p.workspacePath === workspacePath ? result.project : p))\n const projectAction = (workspacePath, serverName, method, args, patch) => {\n setBusy(workspacePath + ':' + serverName)\n setError('')\n return rpc(method, args).then(finish).then((result) => {\n if (patch) patch(result)\n }).catch((e) => setError(String(e))).finally(() => setBusy(''))\n }\n\n const refreshProject = (p, s) => projectAction(p.workspacePath, s.serverName, 'mcp.projectRefresh', { workspacePath: p.workspacePath, serverName: s.serverName }, replaceProject(p.workspacePath))\n const toggleProject = (p, s) => projectAction(p.workspacePath, s.serverName, 'mcp.projectToggle', { workspacePath: p.workspacePath, serverName: s.serverName, enabled: !s.enabled }, replaceProject(p.workspacePath))\n const removeProject = (p, s) => window.confirm('确认删除此项目的 MCP「' + s.serverName + '」?') && projectAction(p.workspacePath, s.serverName, 'mcp.projectRemove', { workspacePath: p.workspacePath, serverName: s.serverName }, replaceProject(p.workspacePath))\n\n const saveGlobal = () => {\n setBusy('save')\n setError('')\n rpc('mcp.save', { config: configOf(draft) }).then(finish).then((result) => {\n setServers((old) => old.some((s) => s.id === result.server.id) ? old.map((s) => s.id === result.server.id ? result.server : s) : old.concat(result.server))\n setDraft(EMPTY)\n setShowForm(false)\n }).catch((e) => setError(String(e))).finally(() => setBusy(''))\n }\n\n const saveProject = () => {\n if (!projectForm) return\n setBusy('project-save')\n setError('')\n const config = configOf(draft)\n rpc('mcp.projectSave', { workspacePath: projectForm.workspacePath, serverName: config.serverName, config }).then(finish).then((result) => {\n setProjects((old) => old.map((p) => p.workspacePath === projectForm.workspacePath ? result.project : p))\n setDraft(EMPTY)\n setProjectForm(null)\n }).catch((e) => setError(String(e))).finally(() => setBusy(''))\n }\n\n const edit = (key, value) => setDraft((old) => ({ ...old, [key]: value }))\n const marketBody = React.createElement('div', { className: 'vsm-mcp-empty' }, 'MCP 市场暂未接入')\n const selectedProject = projects.find((project) => project.workspacePath === selectedPath)\n const projectBody = projects.length ? React.createElement(React.Fragment, null,\n React.createElement(ProjectPicker, { projects, value: selectedPath, onChange: setSelectedPath }),\n selectedProject ? React.createElement(ProjectGroup, { project: selectedProject, busy, onAdd: (project) => { setDraft(EMPTY); setProjectForm({ workspacePath: project.workspacePath, title: project.title }) }, onRefresh: refreshProject, onToggle: toggleProject, onRemove: removeProject }) : React.createElement('div', { className: 'vsm-mcp-empty' }, '请选择项目'),\n ) : React.createElement('div', { className: 'vsm-mcp-empty' }, '还没有项目')\n let body\n if (loading) body = React.createElement('div', { className: 'vsm-mcp-empty' }, '正在读取 MCP 服务…')\n else if (tab === 'general') body = React.createElement(GeneralSettings, { registry: openerRegistry })\n else if (tab === 'mine') body = React.createElement('div', null, servers.length ? servers.map((s) => React.createElement(ServerCard, { key: s.id, server: s, onRefresh: refreshGlobal, onToggle: toggleGlobal, onRemove: removeGlobal })) : React.createElement('div', { className: 'vsm-mcp-empty' }, '还没有配置全局 MCP'))\n else if (tab === 'projects') body = projectBody\n else if (tab === 'compat') body = React.createElement(CompatSection, { getSummary: compatSummary })\n else body = marketBody\n const form = showForm ? React.createElement(McpForm, { title: '添加全局 MCP', draft, busy, edit, save: saveGlobal, close: () => setShowForm(false) }) : projectForm ? React.createElement(McpForm, { title: '添加项目 MCP · ' + projectForm.title, draft, busy, edit, save: saveProject, close: () => setProjectForm(null) }) : null\n return React.createElement('section', { className: 'vsm-mcp-page' },\n React.createElement('header', { className: 'vsm-mcp-header' }, React.createElement('div', null, React.createElement('h2', null, 'VSCodeMode'), React.createElement('p', null, '管理当前 profile 与各项目的 Model Context Protocol 服务。')), React.createElement('button', { className: 'vsm-primary', onClick: () => { setDraft(EMPTY); setShowForm(true) } }, '+ 添加全局 MCP')),\n React.createElement('nav', { className: 'vsm-mcp-tabs' }, React.createElement('button', { className: tab === 'general' ? 'active' : '', onClick: () => setTab('general') }, '通用'), React.createElement('button', { className: tab === 'mine' ? 'active' : '', onClick: () => setTab('mine') }, '我的 MCP'), React.createElement('button', { className: tab === 'projects' ? 'active' : '', onClick: () => setTab('projects') }, '项目 MCP'), React.createElement('button', { className: tab === 'market' ? 'active' : '', onClick: () => setTab('market') }, 'MCP 市场'), React.createElement('button', { className: tab === 'compat' ? 'active' : '', onClick: () => setTab('compat') }, '兼容性')),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n body,\n form,\n )\n}\n\n/** MCP 新增表单(全局/项目共用)。 */\nfunction McpForm({ title, draft, busy, edit, save, close }) {\n const input = (key, placeholder) => React.createElement('input', { value: draft[key], onChange: (e) => edit(key, e.target.value), placeholder })\n const fields = draft.transport === 'stdio' ? React.createElement(React.Fragment, null, React.createElement('label', null, '命令', input('command', 'npx')), React.createElement('label', null, '参数(空格或换行分隔)', React.createElement('textarea', { value: draft.args, onChange: (e) => edit('args', e.target.value) })), React.createElement('label', null, '工作目录(可选)', input('cwd', ''))) : React.createElement(React.Fragment, null, React.createElement('label', null, 'URL', input('url', 'http://localhost:3000/mcp')), React.createElement('label', null, '请求头(每行 key=value)', React.createElement('textarea', { value: draft.headers, onChange: (e) => edit('headers', e.target.value) })))\n return React.createElement('div', { className: 'vsm-mcp-modal' }, React.createElement('div', { className: 'vsm-mcp-dialog' }, React.createElement('h3', null, title), React.createElement('label', null, '名称', input('serverName', '例如 codegraph')), React.createElement('label', null, '传输方式', React.createElement('select', { value: draft.transport, onChange: (e) => edit('transport', e.target.value) }, React.createElement('option', { value: 'stdio' }, 'stdio'), React.createElement('option', { value: 'streamable-http' }, 'streamable-http'))), fields, React.createElement('div', { className: 'vsm-mcp-dialog-actions' }, React.createElement('button', { onClick: close }, '取消'), React.createElement('button', { className: 'vsm-primary', disabled: busy === 'save' || busy === 'project-save', onClick: save }, '保存并连接'))))\n}\n","/**\n * dsh-vscode-mode client — DSH 对话文件链接的统一打开路由。\n * openPath 补丁经 compat.patchMethod 安装(链式恢复,多插件补丁互不踩踏)。\n * 作者 ddj 2026年08月24号\n */\nimport { patchMethod } from './compat.js'\nimport { openEditorView } from './events.js'\nimport { AUTO_OPEN_TOOL, VSCODE_OPEN_TOOL, type FileOpenContext, type FileOpenerRegistry, isAvailable, selectOpener } from './fileOpeners.js'\n\nexport interface OpenPathRouterOptions {\n workspaces: { openPath: (path: string) => Promise<void> }\n registry: FileOpenerRegistry\n selected: () => string\n context: () => FileOpenContext\n logger?: (message: string) => void\n}\n\n/**\n * 安装可卸载的 workspaces.openPath 路由。\n * @author ddj 2026年08月24号\n * @param options 路由依赖\n * @returns 恢复原方法的 disposer\n */\nexport function installOpenPathRouter(options: OpenPathRouterOptions): () => void {\n const open = async (original: (path: string) => Promise<void>, path: string): Promise<void> => {\n const context = options.context()\n const opener = selectOpener(options.registry, options.selected())\n if (!opener || !isAvailable(opener)) return original.call(options.workspaces, path)\n try {\n await opener.open(path, context)\n } catch (error) {\n options.logger?.('文件打开器 ' + opener.id + ' 失败,回退系统打开: ' + String(error))\n if (opener.id !== 'system') await original.call(options.workspaces, path)\n else throw error\n }\n }\n return patchMethod(options.workspaces, 'openPath', open as never)\n}\n\n/**\n * 创建 VSCodeMode 内置文件打开器。\n * @author ddj 2026年08月24号\n * @returns VSCodeMode 打开器\n */\nexport function vscodeOpener(): { id: string; label: string; priority: number; open: (path: string) => void } {\n return { id: VSCODE_OPEN_TOOL, label: 'VSCodeMode', priority: 100, open: (path) => openEditorView(path) }\n}\n\n/**\n * 规范化设置中的打开器 id。\n * @author ddj 2026年08月24号\n * @param value 原始设置值\n * @returns 可路由的打开器 id\n */\nexport function autoValue(value: unknown): string {\n return typeof value === 'string' && value.trim() ? value.trim() : AUTO_OPEN_TOOL\n}\n","/**\n * dsh-vscode-mode client — 浏览器半入口:slot 注册 + 装配。\n * 挂点:conversation.view「文件编辑」页签(中央 Monaco 编辑器)+ header 差异角标。\n * 与 Host 通信:同源 fetch('/edrv/rpc')(shared/rpc 契约)。\n *\n * ⚠️ 跨版本 slot 装配(2026-08-21):新版 DSH 的 slots 系统要求 slot 必须由父 entry\n * 的 children table 先声明,直接 `ctx.slots.register({name:'conversation.view'})` 在\n * 声明未就绪时抛 `slot ... is not declared (a parent entry's children table must declare it)`。\n * 正确写法 = `ctx.slots.inject(name, () => ctx.slots.register(...))`:声明存在时同步\n * 执行,否则等待声明(官方 ui-conversation 自身即此模式);旧版(rc.8 及更早)同样支持,\n * 故跨版本兼容。slot 名未变:conversation.view / conversation.session.header.utilities。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport './styles/editor.css'\nimport { EditorView } from './ui/EditorView.js'\nimport { DiffBadge } from './ui/DiffBadge.js'\nimport { McpSettings } from './ui/McpSettings.js'\nimport { rpc } from './rpc.js'\nimport { createFileOpenerRegistry, scanSidebar, type FileOpenContext } from './fileOpeners.js'\nimport type { FileOpenerRegistry } from './fileOpeners.js'\nimport { installOpenPathRouter, vscodeOpener, autoValue } from './openPathRouter.js'\nimport { SettingsContext } from './settingsContext.js'\nimport { SIDEBAR_PLUGIN, pickSettingsBinder, registerSlotSafely } from './compat.js'\nimport type { CompatAdapter } from '../shared/compat.js'\n\nexport const inject = ['slots', 'timer', 'locale', 'connection', 'remote', 'workspaces', 'sessions', 'settingsScope', 'webUiSettings']\n\n/**\n * 装配客户端:注册中央编辑区视图与 header 差异角标。\n * @author ddj 2026年08月20号\n * @param ctx 客户端根上下文(slots + timer 服务)\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function apply(ctx: any): void {\n const schedule = (fn: () => void, ms: number) => ctx.timeout(fn, ms)\n const registry: FileOpenerRegistry = createFileOpenerRegistry()\n const workspaces = ctx.get('workspaces')\n const sessions = ctx.get('sessions')\n const originalOpenPath = workspaces?.openPath\n const binder = pickSettingsBinder(ctx)\n const settings = binder.scope\n let selected = autoValue('auto')\n\n /** 客户端侧兼容摘要(与 host 报告合并展示;惰性求值保证 HMR 后仍新鲜)。 */\n const compatSummary = (): CompatAdapter[] => [\n { name: '设置桥', active: settings !== undefined, note: settings !== undefined ? '使用 ' + binder.service + ' 桥' : '未绑定设置服务(fileOpenTool 持久化不可用)' },\n { name: '文件打开路由(workspaces.openPath)', active: Boolean(workspaces?.openPath), note: 'vscode 打开器优先,失败回退系统打开' },\n { name: '侧边栏打开器(' + SIDEBAR_PLUGIN + ')', active: registry.get(SIDEBAR_PLUGIN) !== undefined, note: registry.get(SIDEBAR_PLUGIN) !== undefined ? '已注册(优先级 80)' : '未检测到侧边栏打开能力' },\n ]\n\n ctx.provide('fileOpeners', registry)\n ctx.effect(() => registry.register(vscodeOpener()), 'vscode-mode: file opener')\n ctx.effect(() => registry.register({\n id: 'system', label: '系统默认应用', priority: 0,\n open: (path: string) => originalOpenPath.call(workspaces, path),\n }), 'vscode-mode: system file opener')\n ctx.effect(() => {\n const sidebar = scanSidebar(ctx)\n return sidebar ? registry.register(sidebar) : undefined\n }, 'vscode-mode: sidebar file opener')\n ctx.effect(() => {\n if (!settings) return undefined\n const sync = (): void => {\n const snapshot = settings.getSnapshot()\n if (snapshot.status === 'loading') return\n selected = autoValue(snapshot.value?.fileOpenTool)\n window.dispatchEvent(new CustomEvent('edrv:file-open-tool-change', { detail: { value: selected } }))\n }\n sync()\n return settings.subscribe(sync)\n }, 'vscode-mode: file opener setting sync')\n if (workspaces?.openPath) {\n ctx.effect(() => installOpenPathRouter({\n workspaces,\n registry,\n selected: () => selected,\n context: () => {\n const current = sessions?.list?.getSnapshot?.()\n const sessionId = current?.current\n const summary = sessionId ? current?.byId?.[sessionId] : undefined\n return { sessionId, cwd: summary?.cwd } as FileOpenContext\n },\n logger: (message: string) => console.warn('[dsh-vscode-mode] ' + message),\n }), 'vscode-mode: file link routing')\n }\n\n // 中央「文件编辑」页签:类 VSCode 编辑器(顶部=文件页签+搜索框,差异 UI=文件底部圆角悬浮框)\n registerSlotSafely(ctx, {\n name: 'conversation.view',\n id: 'edrv-editor',\n order: 5,\n label: '文件编辑',\n inject: (sessionId: string) => ({ sessionId }),\n }, (props: unknown) => React.createElement(EditorView, Object.assign({}, props, { schedule })))\n\n // header 差异角标:仅当前工作区存在差异时渲染\n registerSlotSafely(ctx, { name: 'conversation.session.header.utilities', id: 'edrv-diff-badge', order: 90, label: '差异' },\n (props: unknown) => React.createElement(DiffBadge, Object.assign({}, props)))\n\n // 设置页中的 VSCodeMode 专属页签,MCP 管理作为该页签的内部子 Tab。\n registerSlotSafely(ctx, {\n name: 'settings.section',\n id: 'vscode-mode',\n order: 30,\n label: 'VSCodeMode',\n }, () => React.createElement(SettingsContext.Provider, { value: settings }, React.createElement(McpSettings, { openerRegistry: registry, compatSummary })))\n}"],"mappings":"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"}
|