dsh-vscode-mode 0.1.5 → 0.1.6

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/lib/client.js CHANGED
@@ -1880,6 +1880,13 @@ window.__ModuleLoader__.load({
1880
1880
  * dsh-vscode-mode client — 浏览器半入口:slot 注册 + 装配。
1881
1881
  * 挂点:conversation.view「文件编辑」页签(中央 Monaco 编辑器)+ header 差异角标。
1882
1882
  * 与 Host 通信:同源 fetch('/edrv/rpc')(shared/rpc 契约)。
1883
+ *
1884
+ * ⚠️ 跨版本 slot 装配(2026-08-21):新版 DSH 的 slots 系统要求 slot 必须由父 entry
1885
+ * 的 children table 先声明,直接 `ctx.slots.register({name:'conversation.view'})` 在
1886
+ * 声明未就绪时抛 `slot ... is not declared (a parent entry's children table must declare it)`。
1887
+ * 正确写法 = `ctx.slots.inject(name, () => ctx.slots.register(...))`:声明存在时同步
1888
+ * 执行,否则等待声明(官方 ui-conversation 自身即此模式);旧版(rc.8 及更早)同样支持,
1889
+ * 故跨版本兼容。slot 名未变:conversation.view / conversation.session.header.utilities。
1883
1890
  * 作者 ddj 2026-08-20
1884
1891
  */
1885
1892
  const inject = ["slots", "timer"];
@@ -1890,19 +1897,19 @@ window.__ModuleLoader__.load({
1890
1897
  */
1891
1898
  function apply(ctx) {
1892
1899
  const schedule = (fn, ms) => ctx.timeout(fn, ms);
1893
- ctx.slots.register({
1900
+ ctx.slots.inject("conversation.view", () => ctx.slots.register({
1894
1901
  name: "conversation.view",
1895
1902
  id: "edrv-editor",
1896
1903
  order: 5,
1897
1904
  label: "文件编辑",
1898
1905
  inject: (sessionId) => ({ sessionId })
1899
- }, (props) => react.default.createElement(EditorView, Object.assign({}, props, { schedule })));
1900
- ctx.slots.register({
1906
+ }, (props) => react.default.createElement(EditorView, Object.assign({}, props, { schedule }))));
1907
+ ctx.slots.inject("conversation.session.header.utilities", () => ctx.slots.register({
1901
1908
  name: "conversation.session.header.utilities",
1902
1909
  id: "edrv-diff-badge",
1903
1910
  order: 90,
1904
1911
  label: "差异"
1905
- }, (props) => react.default.createElement(DiffBadge, Object.assign({}, props)));
1912
+ }, (props) => react.default.createElement(DiffBadge, Object.assign({}, props))));
1906
1913
  }
1907
1914
  //#endregion
1908
1915
  exports.apply = apply;
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["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/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/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'\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}\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}\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\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() {\n if (!monacoPromise) {\n monacoPromise = new Promise((resolve, reject) => {\n const boot = () => {\n try {\n window.require.config({ paths: { vs: MONACO_BASE } })\n window.require(['vs/editor/editor.main'], () => resolve(window.monaco), (err) => {\n monacoPromise = null\n reject(new Error('Monaco 模块加载失败:' + String(err)))\n })\n } catch (error) {\n monacoPromise = null\n reject(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 = () => { monacoPromise = null; reject(new Error('Monaco loader 加载失败')) }\n document.head.appendChild(s)\n }\n })\n }\n return monacoPromise\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.create && 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 left = li ? li.decorationsLeft : 0\n const width = li && li.decorationsWidth > 0 ? li.decorationsWidth : 16\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 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 for (const item of items) {\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 client — 记录/差异状态纯函数(可单测)。\n * 迁移自原 src/client/index.ts 前段,语义一字不改。\n * 作者 ddj 2026-08-20\n */\nimport type { CallHunk, Hunk, RecordView } from '../../shared/types.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.toolName === 'edit' && rec.callHunk ? rec.callHunk : 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) 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 { 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 let n = 0\n for (let i = 0; i < index; i++) if (text.charCodeAt(i) === 10) n++\n return n\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 = content.split('\\n')\n for (const rec of records) {\n for (let i = 0; i < rec.hunks.length; i++) {\n const h: Hunk = rec.hunks[i]\n if (noopHunk(rec, h)) continue // 空差异(old===new)无实际变化,跳过\n const status = statusAt(rec, i)\n if (rec.create) {\n regions.push({ callId: rec.callId, idx: i, start: 1, end: lines.length, oldLines: [], newLines: lines.slice(), whole: true, status, create: true, rec, superseded: rec.superseded === true })\n continue\n }\n const precise = rec.toolName === 'edit' && rec.callHunk ? rec.callHunk : h\n const newText = precise.newText ?? ''\n const at = content.indexOf(newText)\n if (at < 0) {\n regions.push({ callId: rec.callId, idx: i, stale: true, status, create: false, oldLines: [], newLines: [], rec, superseded: rec.superseded === true })\n continue\n }\n const start = countLinesBefore(content, at) + 1\n const oldLines = precise.oldText === null ? [] : precise.oldText.split('\\n')\n const newLines = newText.split('\\n')\n const trimmed = trimCommonLines(oldLines, newLines)\n const regionStart = start + trimmed.shift\n regions.push({ callId: rec.callId, idx: i, 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' }, 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 [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 hideTimerRef = React.useRef(null) // 延迟隐藏计时器(防闪烁)\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) 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) map[r.callId] = r\n setRecords(map)\n }).catch((e) => setError('list异常:' + String(e)))\n }\n\n const loadContent = (path, sid) => {\n const seq = ++loadSeqRef.current\n rpc('edrv.read', { sessionId: sid, path }).then((res) => {\n if (seq !== loadSeqRef.current || path !== active) return\n if (res && res.ok) { setContent(res.content); setStatus('已加载') }\n else { setError(res?.error ? String(res.error) : '读取失败'); setStatus('读取失败') }\n }).catch((e) => { if (seq === loadSeqRef.current) { setError('read异常:' + String(e)); setStatus('读取失败') } })\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); setStatus('加载中…')\n loadContent(active, sessionId)\n }, [active, sessionId])\n\n React.useEffect(() => {\n if (monaco || monacoErr) return\n let alive = true\n loadMonaco().then((m) => { if (alive) setMonaco(m) }).catch((e) => { if (alive) { setMonacoErr(String(e?.message ?? e)); setStatus('Monaco 不可用') } })\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 }, [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 }, [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 (hideTimerRef.current) return\n hideTimerRef.current = setTimeout(() => {\n hideTimerRef.current = null\n hoverKeyRef.current = null\n hoverTopRef.current = null\n setHoverAct(null)\n }, 180)\n }\n ed.onMouseMove((e) => {\n const line = e?.target?.position?.lineNumber\n const map = lineRegionMapRef.current\n if (!line || !map.size) { hideSoon(); return }\n const hit = map.get(line)\n if (!hit) { 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 if (hoverKeyRef.current === key && hoverTopRef.current === top) return // 同区域同位置不重复更新\n hoverKeyRef.current = key\n hoverTopRef.current = top\n if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }\n setHoverAct({ region: hit, top })\n })\n ed.onMouseLeave(hideSoon)\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 * 对单个差异区域执行采纳/不采纳。\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 let body\n if (!monaco && !monacoErr) {\n body = React.createElement('div', { className: 'edrv-empty' }, '正在加载 Monaco 编辑器…')\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 } 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) {\n body = React.createElement('div', { className: 'edrv-empty' }, '加载中…')\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: 12 },\n onMouseEnter: () => { if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },\n onMouseLeave: () => { const t = setTimeout(() => { hideTimerRef.current = null; hoverKeyRef.current = null; hoverTopRef.current = null; setHoverAct(null) }, 180); hideTimerRef.current = t },\n },\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', onClick: () => actHunk(hoverAct.region, false) }, '✓ Keep'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-undo', onClick: () => 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 注册 + 装配。\n * 挂点:conversation.view「文件编辑」页签(中央 Monaco 编辑器)+ header 差异角标。\n * 与 Host 通信:同源 fetch('/edrv/rpc')(shared/rpc 契约)。\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'\n\nexport const inject = ['slots', 'timer']\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\n // 中央「文件编辑」页签:类 VSCode 编辑器(顶部=文件页签+搜索框,差异 UI=文件底部圆角悬浮框)\n ctx.slots.register({\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 ctx.slots.register(\n { name: 'conversation.session.header.utilities', id: 'edrv-diff-badge', order: 90, label: '差异' },\n (props: unknown) => React.createElement(DiffBadge, Object.assign({}, props)),\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["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/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/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'\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}\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}\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\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() {\n if (!monacoPromise) {\n monacoPromise = new Promise((resolve, reject) => {\n const boot = () => {\n try {\n window.require.config({ paths: { vs: MONACO_BASE } })\n window.require(['vs/editor/editor.main'], () => resolve(window.monaco), (err) => {\n monacoPromise = null\n reject(new Error('Monaco 模块加载失败:' + String(err)))\n })\n } catch (error) {\n monacoPromise = null\n reject(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 = () => { monacoPromise = null; reject(new Error('Monaco loader 加载失败')) }\n document.head.appendChild(s)\n }\n })\n }\n return monacoPromise\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.create && 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 left = li ? li.decorationsLeft : 0\n const width = li && li.decorationsWidth > 0 ? li.decorationsWidth : 16\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 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 for (const item of items) {\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 client — 记录/差异状态纯函数(可单测)。\n * 迁移自原 src/client/index.ts 前段,语义一字不改。\n * 作者 ddj 2026-08-20\n */\nimport type { CallHunk, Hunk, RecordView } from '../../shared/types.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.toolName === 'edit' && rec.callHunk ? rec.callHunk : 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) 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 { 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 let n = 0\n for (let i = 0; i < index; i++) if (text.charCodeAt(i) === 10) n++\n return n\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 = content.split('\\n')\n for (const rec of records) {\n for (let i = 0; i < rec.hunks.length; i++) {\n const h: Hunk = rec.hunks[i]\n if (noopHunk(rec, h)) continue // 空差异(old===new)无实际变化,跳过\n const status = statusAt(rec, i)\n if (rec.create) {\n regions.push({ callId: rec.callId, idx: i, start: 1, end: lines.length, oldLines: [], newLines: lines.slice(), whole: true, status, create: true, rec, superseded: rec.superseded === true })\n continue\n }\n const precise = rec.toolName === 'edit' && rec.callHunk ? rec.callHunk : h\n const newText = precise.newText ?? ''\n const at = content.indexOf(newText)\n if (at < 0) {\n regions.push({ callId: rec.callId, idx: i, stale: true, status, create: false, oldLines: [], newLines: [], rec, superseded: rec.superseded === true })\n continue\n }\n const start = countLinesBefore(content, at) + 1\n const oldLines = precise.oldText === null ? [] : precise.oldText.split('\\n')\n const newLines = newText.split('\\n')\n const trimmed = trimCommonLines(oldLines, newLines)\n const regionStart = start + trimmed.shift\n regions.push({ callId: rec.callId, idx: i, 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' }, 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 [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 hideTimerRef = React.useRef(null) // 延迟隐藏计时器(防闪烁)\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) 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) map[r.callId] = r\n setRecords(map)\n }).catch((e) => setError('list异常:' + String(e)))\n }\n\n const loadContent = (path, sid) => {\n const seq = ++loadSeqRef.current\n rpc('edrv.read', { sessionId: sid, path }).then((res) => {\n if (seq !== loadSeqRef.current || path !== active) return\n if (res && res.ok) { setContent(res.content); setStatus('已加载') }\n else { setError(res?.error ? String(res.error) : '读取失败'); setStatus('读取失败') }\n }).catch((e) => { if (seq === loadSeqRef.current) { setError('read异常:' + String(e)); setStatus('读取失败') } })\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); setStatus('加载中…')\n loadContent(active, sessionId)\n }, [active, sessionId])\n\n React.useEffect(() => {\n if (monaco || monacoErr) return\n let alive = true\n loadMonaco().then((m) => { if (alive) setMonaco(m) }).catch((e) => { if (alive) { setMonacoErr(String(e?.message ?? e)); setStatus('Monaco 不可用') } })\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 }, [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 }, [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 (hideTimerRef.current) return\n hideTimerRef.current = setTimeout(() => {\n hideTimerRef.current = null\n hoverKeyRef.current = null\n hoverTopRef.current = null\n setHoverAct(null)\n }, 180)\n }\n ed.onMouseMove((e) => {\n const line = e?.target?.position?.lineNumber\n const map = lineRegionMapRef.current\n if (!line || !map.size) { hideSoon(); return }\n const hit = map.get(line)\n if (!hit) { 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 if (hoverKeyRef.current === key && hoverTopRef.current === top) return // 同区域同位置不重复更新\n hoverKeyRef.current = key\n hoverTopRef.current = top\n if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }\n setHoverAct({ region: hit, top })\n })\n ed.onMouseLeave(hideSoon)\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 * 对单个差异区域执行采纳/不采纳。\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 let body\n if (!monaco && !monacoErr) {\n body = React.createElement('div', { className: 'edrv-empty' }, '正在加载 Monaco 编辑器…')\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 } 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) {\n body = React.createElement('div', { className: 'edrv-empty' }, '加载中…')\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: 12 },\n onMouseEnter: () => { if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },\n onMouseLeave: () => { const t = setTimeout(() => { hideTimerRef.current = null; hoverKeyRef.current = null; hoverTopRef.current = null; setHoverAct(null) }, 180); hideTimerRef.current = t },\n },\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', onClick: () => actHunk(hoverAct.region, false) }, '✓ Keep'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-undo', onClick: () => 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 注册 + 装配。\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'\n\nexport const inject = ['slots', 'timer']\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\n // 中央「文件编辑」页签:类 VSCode 编辑器(顶部=文件页签+搜索框,差异 UI=文件底部圆角悬浮框)\n ctx.slots.inject('conversation.view', () => ctx.slots.register({\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 ctx.slots.inject('conversation.session.header.utilities', () => ctx.slots.register(\n { name: 'conversation.session.header.utilities', id: 'edrv-diff-badge', order: 90, label: '差异' },\n (props: unknown) => React.createElement(DiffBadge, Object.assign({}, props)),\n ))\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-vscode-mode",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "DSH 上的类 VSCode 编码体验:Monaco 中央编辑器(文件页签/QuickOpen/状态栏)+ Agent 编辑差异审查(整文件差异/采纳/拒绝/归档/回滚),状态持久化到工作区旁车",
5
5
  "keywords": [
6
6
  "dsh",
@@ -2,6 +2,13 @@
2
2
  * dsh-vscode-mode client — 浏览器半入口:slot 注册 + 装配。
3
3
  * 挂点:conversation.view「文件编辑」页签(中央 Monaco 编辑器)+ header 差异角标。
4
4
  * 与 Host 通信:同源 fetch('/edrv/rpc')(shared/rpc 契约)。
5
+ *
6
+ * ⚠️ 跨版本 slot 装配(2026-08-21):新版 DSH 的 slots 系统要求 slot 必须由父 entry
7
+ * 的 children table 先声明,直接 `ctx.slots.register({name:'conversation.view'})` 在
8
+ * 声明未就绪时抛 `slot ... is not declared (a parent entry's children table must declare it)`。
9
+ * 正确写法 = `ctx.slots.inject(name, () => ctx.slots.register(...))`:声明存在时同步
10
+ * 执行,否则等待声明(官方 ui-conversation 自身即此模式);旧版(rc.8 及更早)同样支持,
11
+ * 故跨版本兼容。slot 名未变:conversation.view / conversation.session.header.utilities。
5
12
  * 作者 ddj 2026-08-20
6
13
  */
7
14
  import React from 'react'
@@ -21,17 +28,17 @@ export function apply(ctx: any): void {
21
28
  const schedule = (fn: () => void, ms: number) => ctx.timeout(fn, ms)
22
29
 
23
30
  // 中央「文件编辑」页签:类 VSCode 编辑器(顶部=文件页签+搜索框,差异 UI=文件底部圆角悬浮框)
24
- ctx.slots.register({
31
+ ctx.slots.inject('conversation.view', () => ctx.slots.register({
25
32
  name: 'conversation.view',
26
33
  id: 'edrv-editor',
27
34
  order: 5,
28
35
  label: '文件编辑',
29
36
  inject: (sessionId: string) => ({ sessionId }),
30
- }, (props: unknown) => React.createElement(EditorView, Object.assign({}, props, { schedule })))
37
+ }, (props: unknown) => React.createElement(EditorView, Object.assign({}, props, { schedule }))))
31
38
 
32
39
  // header 差异角标:仅当前工作区存在差异时渲染
33
- ctx.slots.register(
40
+ ctx.slots.inject('conversation.session.header.utilities', () => ctx.slots.register(
34
41
  { name: 'conversation.session.header.utilities', id: 'edrv-diff-badge', order: 90, label: '差异' },
35
42
  (props: unknown) => React.createElement(DiffBadge, Object.assign({}, props)),
36
- )
43
+ ))
37
44
  }