dsh-vscode-mode 0.1.6 → 0.1.7

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
@@ -1136,7 +1136,10 @@ window.__ModuleLoader__.load({
1136
1136
  const lineRegionMapRef = react.default.useRef(/* @__PURE__ */ new Map());
1137
1137
  const hoverKeyRef = react.default.useRef(null);
1138
1138
  const hoverTopRef = react.default.useRef(null);
1139
+ const hoverRightRef = react.default.useRef(null);
1139
1140
  const hideTimerRef = react.default.useRef(null);
1141
+ const hoverEditorRef = react.default.useRef(false);
1142
+ const hoverPanelRef = react.default.useRef(false);
1140
1143
  const batchBusyRef = react.default.useRef(false);
1141
1144
  const diffRendererRef = react.default.useRef(null);
1142
1145
  if (!diffRendererRef.current) diffRendererRef.current = createDiffRenderer((sid, t) => dbg(sid, t));
@@ -1408,41 +1411,49 @@ window.__ModuleLoader__.load({
1408
1411
  setCursor("Ln " + e.position.lineNumber + ", Col " + e.position.column);
1409
1412
  });
1410
1413
  const hideSoon = () => {
1411
- if (hideTimerRef.current) return;
1414
+ if (hoverEditorRef.current || hoverPanelRef.current || hideTimerRef.current) return;
1412
1415
  hideTimerRef.current = setTimeout(() => {
1413
1416
  hideTimerRef.current = null;
1417
+ if (hoverEditorRef.current || hoverPanelRef.current) return;
1414
1418
  hoverKeyRef.current = null;
1415
1419
  hoverTopRef.current = null;
1416
1420
  setHoverAct(null);
1417
1421
  }, 180);
1418
1422
  };
1419
1423
  ed.onMouseMove((e) => {
1424
+ hoverEditorRef.current = true;
1420
1425
  const line = e?.target?.position?.lineNumber;
1421
1426
  const map = lineRegionMapRef.current;
1422
1427
  if (!line || !map.size) {
1428
+ hoverEditorRef.current = false;
1423
1429
  hideSoon();
1424
1430
  return;
1425
1431
  }
1426
1432
  const hit = map.get(line);
1427
1433
  if (!hit) {
1434
+ hoverEditorRef.current = false;
1428
1435
  hideSoon();
1429
1436
  return;
1430
1437
  }
1431
1438
  const key = callIdAttr(hit.callId, hit.idx);
1432
1439
  const top = Math.max(0, ed.getTopForLineNumber(Math.max(1, hit.start)) - ed.getScrollTop());
1433
- if (hoverKeyRef.current === key && hoverTopRef.current === top) return;
1440
+ const layout = ed.getLayoutInfo();
1441
+ const minimapLeft = layout.minimap?.minimapLeft || 0;
1442
+ const right = minimapLeft > 0 ? Math.max(12, layout.width - minimapLeft + 8) : Math.max(12, layout.verticalScrollbarWidth + 8);
1443
+ if (hoverKeyRef.current === key && hoverTopRef.current === top && hoverRightRef.current === right) return;
1434
1444
  hoverKeyRef.current = key;
1435
1445
  hoverTopRef.current = top;
1446
+ hoverRightRef.current = right;
1436
1447
  if (hideTimerRef.current) {
1437
1448
  clearTimeout(hideTimerRef.current);
1438
1449
  hideTimerRef.current = null;
1439
1450
  }
1440
1451
  setHoverAct({
1441
1452
  region: hit,
1442
- top
1453
+ top,
1454
+ right
1443
1455
  });
1444
1456
  });
1445
- ed.onMouseLeave(hideSoon);
1446
1457
  editorRef.current = ed;
1447
1458
  }, []);
1448
1459
  react.default.useEffect(() => {
@@ -1504,6 +1515,22 @@ window.__ModuleLoader__.load({
1504
1515
  refreshRecords();
1505
1516
  };
1506
1517
  /**
1518
+ * 关闭当前差异浮窗并清理 hover 锚点。
1519
+ * @author ddj 2026年08月21号
1520
+ */
1521
+ const dismissHover = () => {
1522
+ hoverKeyRef.current = null;
1523
+ hoverTopRef.current = null;
1524
+ hoverRightRef.current = null;
1525
+ hoverEditorRef.current = false;
1526
+ hoverPanelRef.current = false;
1527
+ if (hideTimerRef.current) {
1528
+ clearTimeout(hideTimerRef.current);
1529
+ hideTimerRef.current = null;
1530
+ }
1531
+ setHoverAct(null);
1532
+ };
1533
+ /**
1507
1534
  * 对单个差异区域执行采纳/不采纳。
1508
1535
  * @author ddj 2026年08月20号
1509
1536
  * @param region 差异区域(callId/idx/create)
@@ -1696,29 +1723,45 @@ window.__ModuleLoader__.load({
1696
1723
  className: "edrv-hoveract",
1697
1724
  style: {
1698
1725
  top: hoverAct.top,
1699
- right: 12
1726
+ right: hoverAct.right ?? 12
1700
1727
  },
1701
1728
  onMouseEnter: () => {
1729
+ hoverPanelRef.current = true;
1730
+ if (hideTimerRef.current) {
1731
+ clearTimeout(hideTimerRef.current);
1732
+ hideTimerRef.current = null;
1733
+ }
1734
+ },
1735
+ onMouseMove: () => {
1736
+ hoverPanelRef.current = true;
1702
1737
  if (hideTimerRef.current) {
1703
1738
  clearTimeout(hideTimerRef.current);
1704
1739
  hideTimerRef.current = null;
1705
1740
  }
1706
1741
  },
1707
1742
  onMouseLeave: () => {
1708
- const t = setTimeout(() => {
1743
+ hoverPanelRef.current = false;
1744
+ if (hoverEditorRef.current || hideTimerRef.current) return;
1745
+ hideTimerRef.current = setTimeout(() => {
1709
1746
  hideTimerRef.current = null;
1747
+ if (hoverEditorRef.current || hoverPanelRef.current) return;
1710
1748
  hoverKeyRef.current = null;
1711
1749
  hoverTopRef.current = null;
1712
1750
  setHoverAct(null);
1713
- }, 180);
1714
- hideTimerRef.current = t;
1751
+ }, 420);
1715
1752
  }
1716
1753
  }, react.default.createElement("button", {
1717
1754
  className: "edrv-pill edrv-pill-keep",
1718
- onClick: () => actHunk(hoverAct.region, false)
1755
+ onClick: () => {
1756
+ dismissHover();
1757
+ actHunk(hoverAct.region, false);
1758
+ }
1719
1759
  }, "✓ Keep"), react.default.createElement("button", {
1720
1760
  className: "edrv-pill edrv-pill-undo",
1721
- onClick: () => actHunk(hoverAct.region, true)
1761
+ onClick: () => {
1762
+ dismissHover();
1763
+ actHunk(hoverAct.region, true);
1764
+ }
1722
1765
  }, "↩ Undo")) : null;
1723
1766
  const overlay = launcherOpen ? react.default.createElement(react.default.Fragment, null, react.default.createElement("div", {
1724
1767
  style: {
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 *\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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"}
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 hoverRightRef = React.useRef(null) // 浮窗右侧避让 Monaco 缩略栏\n const hideTimerRef = React.useRef(null) // 延迟隐藏计时器(防闪烁)\n const hoverEditorRef = React.useRef(false) // 鼠标是否仍在编辑器命中区\n const hoverPanelRef = React.useRef(false) // 鼠标是否已进入 Keep/Undo 浮层\n const batchBusyRef = React.useRef(false) // 批量 Keep All/Undo All 防重入\n const diffRendererRef = React.useRef(null)\n if (!diffRendererRef.current) diffRendererRef.current = createDiffRenderer((sid, t) => dbg(sid, t))\n\n const currentRecords = React.useMemo(() => {\n const list = []\n for (const rec of Object.values(records)) if (rec.path === active) 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 (hoverEditorRef.current || hoverPanelRef.current || hideTimerRef.current) return\n hideTimerRef.current = setTimeout(() => {\n hideTimerRef.current = null\n if (hoverEditorRef.current || hoverPanelRef.current) return\n hoverKeyRef.current = null\n hoverTopRef.current = null\n setHoverAct(null)\n }, 180)\n }\n ed.onMouseMove((e) => {\n hoverEditorRef.current = true\n const line = e?.target?.position?.lineNumber\n const map = lineRegionMapRef.current\n if (!line || !map.size) { hoverEditorRef.current = false; hideSoon(); return }\n const hit = map.get(line)\n if (!hit) { hoverEditorRef.current = false; hideSoon(); return }\n const key = callIdAttr(hit.callId, hit.idx)\n const top = Math.max(0, ed.getTopForLineNumber(Math.max(1, hit.start)) - ed.getScrollTop())\n const layout = ed.getLayoutInfo()\n const minimapLeft = layout.minimap?.minimapLeft || 0\n const right = minimapLeft > 0 ? Math.max(12, layout.width - minimapLeft + 8) : Math.max(12, layout.verticalScrollbarWidth + 8)\n if (hoverKeyRef.current === key && hoverTopRef.current === top && hoverRightRef.current === right) return // 同区域同位置不重复更新\n hoverKeyRef.current = key\n hoverTopRef.current = top\n hoverRightRef.current = right\n if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }\n setHoverAct({ region: hit, top, right })\n })\n editorRef.current = ed\n }, [])\n\n // 打开文件后的差异聚焦跳转(内容/差异就绪后执行一次)\n React.useEffect(() => {\n const pf = pendingFocusRef.current\n if (!pf || pf.path !== active || content === null) return\n const target = pf.region || pendingRegions[0]\n const ed = editorRef.current\n if (!target || !ed) return\n pendingFocusRef.current = null\n ed.revealLineInCenter(Math.max(1, target.start ?? 1))\n ed.setPosition({ lineNumber: Math.max(1, target.start ?? 1), column: 1 })\n ed.focus()\n }, [active, content, pendingRegions])\n\n const jumpTo = (region) => {\n if (editorRef.current) {\n editorRef.current.revealLineInCenter(Math.max(1, region?.start ?? 1))\n editorRef.current.setPosition({ lineNumber: Math.max(1, region?.start ?? 1), column: 1 })\n editorRef.current.focus()\n } else {\n pendingFocusRef.current = { path: active, region }\n }\n }\n\n // 索引校正:差异/文件被处理后 pending 列表变化,clamp 到有效范围\n React.useEffect(() => {\n if (diffIdx >= pendingRegions.length && pendingRegions.length > 0) setDiffIdx(pendingRegions.length - 1)\n else if (pendingRegions.length === 0) setDiffIdx(0)\n }, [pendingRegions.length])\n React.useEffect(() => {\n const i = sum.pendingFiles.findIndex((f) => f.path === active)\n if (i >= 0) { if (i !== fileIdx) setFileIdx(i) }\n }, [sum.pendingFiles, active])\n\n // 上下箭头:当前文件内差异切换(x/x)\n const gotoDiff = (delta) => {\n if (!pendingRegions.length) return\n const next = (diffIdx + delta + pendingRegions.length) % pendingRegions.length\n setDiffIdx(next)\n jumpTo(pendingRegions[next])\n }\n // 左右箭头:全局差异文件切换(x/x 文件),打开并跳转\n const gotoFile = (delta) => {\n if (!sum.pendingFiles.length) return\n const next = (fileIdx + delta + sum.pendingFiles.length) % sum.pendingFiles.length\n setFileIdx(next)\n openFile(sum.pendingFiles[next].path, true)\n }\n\n const reloadFile = () => {\n if (!active) return\n loadContent(active, sessionId)\n refreshRecords()\n }\n\n /**\n * 关闭当前差异浮窗并清理 hover 锚点。\n * @author ddj 2026年08月21号\n */\n const dismissHover = () => {\n hoverKeyRef.current = null\n hoverTopRef.current = null\n hoverRightRef.current = null\n hoverEditorRef.current = false\n hoverPanelRef.current = false\n if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }\n setHoverAct(null)\n }\n\n /**\n * 对单个差异区域执行采纳/不采纳。\n * @author ddj 2026年08月20号\n * @param region 差异区域(callId/idx/create)\n * @param reject true=不采纳(回滚),false=采纳\n * @param silent 批量时抑制中间 reload/报错,由批量方统一收尾\n * @returns Promise<boolean> 是否成功\n */\n const actHunk = (region, reject, silent) => {\n const method = reject ? 'edrv.reject' : 'edrv.accept'\n return rpc(method, { sessionId, callId: region.callId, scope: region.create ? 'call' : 'hunk', hunkIndex: region.idx }).then((res) => {\n if (res && res.ok) {\n setRecords((prev) => Object.assign({}, prev, { [region.callId]: res.record }))\n if (!silent) { reloadFile(); emitRefresh() }\n return true\n }\n if (!silent) setError(res?.error ? String(res.error) : '操作失败')\n return false\n }).catch((e) => {\n if (!silent) setError('操作异常:' + String(e))\n return false\n })\n }\n\n const acceptFile = () => { for (const r of pendingRegions) actHunk(r, false) }\n const undoFile = () => { for (const r of [...pendingRegions].reverse()) actHunk(r, true) }\n\n // 所有差异文件的待处理 hunk 列表(二级菜单 Keep All / Undo All 用)\n const allPending = React.useMemo(() => {\n const out = []\n for (const rec of Object.values(records)) {\n if (rec.superseded === true) continue\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (let i = 0; i < hunks.length; i++) {\n const st = perHunk.length ? perHunk[i] : rec.decisions.call\n if (st === 'pending' && !noopHunk(rec, hunks[i])) out.push({ callId: rec.callId, idx: i, create: rec.create === true, at: rec.at })\n }\n }\n return out\n }, [records])\n\n /**\n * 批量处理所有差异文件:采纳全部 / 不采纳全部。不采纳按 at 降序(新改先回滚)串行执行。\n * @author ddj 2026年08月20号\n * @param reject true=全部不采纳(回滚),false=全部采纳\n */\n const actAllPending = (reject) => {\n if (batchBusyRef.current || !allPending.length) return\n batchBusyRef.current = true\n const list = reject ? [...allPending].sort((a, b) => (a.at < b.at ? 1 : a.at > b.at ? -1 : b.idx - a.idx)) : allPending\n let ok = 0, fail = 0\n const run = async () => {\n for (const r of list) {\n if (await actHunk(r, reject, true)) ok++\n else fail++\n }\n batchBusyRef.current = false\n reloadFile()\n emitRefresh()\n setStatus((reject ? '已不采纳 ' : '已采纳 ') + ok + ' 处差异' + (fail ? ',' + fail + ' 处失败' : ''))\n if (fail) setError(fail + ' 处差异处理失败(可能已被后续修改影响),可刷新后重试')\n }\n run()\n }\n const acceptAllFiles = () => actAllPending(false)\n const undoAllFiles = () => actAllPending(true)\n const rollbackFile = () => {\n if (!active) return\n if (!window.confirm('回滚当前文件到修改前状态?(相关差异将归档)')) return\n rpc('edrv.rollback', { sessionId, path: active }).then((res) => {\n if (res && res.ok) {\n setStatus('已回滚'); reloadFile()\n emitRefresh()\n } else setError(res?.error ? String(res.error) : '回滚失败')\n }).catch((e) => setError('回滚异常:' + String(e)))\n }\n\n const openFile = (path, focusDiff) => {\n if (!path) return\n addTab(path, true)\n if (focusDiff) pendingFocusRef.current = { path, region: null }\n }\n\n const openPath = () => {\n const p = (pathDraft || '').trim()\n if (!p) return\n setStatus('打开中…')\n rpc('edrv.read', { sessionId, path: p }).then((res) => {\n if (res && res.ok) {\n openFile(p, false)\n setOpenInput(false); setPathDraft(''); setStatus('已打开'); setError(null)\n } else { setStatus('打开失败'); setError(res?.error ? String(res.error) : '打开失败') }\n }).catch((e) => { setStatus('打开失败'); setError('打开异常:' + String(e)) })\n }\n\n const tabsEl = React.createElement('div', { className: 'edrv-tabs', style: { flex: '1 1 auto', minWidth: 0 } },\n tabs.map((t) => React.createElement('div', {\n key: t.path,\n className: 'edrv-tab' + (t.path === active ? ' edrv-tab-active' : ''),\n title: t.path,\n onClick: () => { if (t.path !== active) { flushSave(); setActive(t.path) } },\n },\n React.createElement('span', { style: { overflow: 'hidden', textOverflow: 'ellipsis', maxWidth: 180 } }, t.path.split(/[\\\\/]/).pop() || t.path),\n (dirtyMap[t.path] ? React.createElement('span', { className: 'edrv-tab-dot' }) : null),\n React.createElement('span', { className: 'edrv-tab-x', onClick: (e) => { e.stopPropagation(); closeTab(t.path) } }, '×'))),\n (openInput\n ? React.createElement('input', { className: 'edrv-path-input', autoFocus: true, placeholder: '输入工作区相对/绝对路径,回车打开', value: pathDraft, onChange: (e) => setPathDraft(e.target.value), onKeyDown: (e) => { if (e.key === 'Enter') openPath(); if (e.key === 'Escape') setOpenInput(false) } })\n : React.createElement('button', { className: 'edrv-tab-add', title: '打开文件(输入路径)', onClick: () => setOpenInput(true) }, '+')))\n\n const pathBar = React.createElement('div', { className: 'edrv-pathbar', title: active || '' },\n React.createElement('span', { className: 'edrv-pb-name' }, active ? String(active).split(/[\\\\/]/).pop() : '未打开文件'),\n React.createElement('span', { className: 'edrv-pb-full' }, active || '使用右上搜索框 (Ctrl+P) 打开文件'))\n\n const tabRow = React.createElement('div', { style: { display: 'flex', alignItems: 'center', background: 'var(--dsw-alias-bg-layer-1,transparent)', flexShrink: 0 } },\n tabsEl,\n React.createElement(QuickOpen, { sessionId, onOpen: (p) => openFile(p, false) }))\n\n const statusBar = React.createElement('div', { className: 'edrv-statusbar' },\n React.createElement('span', null, '编辑'),\n React.createElement('span', null, active ? langOf(active) : ''),\n React.createElement('span', null, cursor),\n (status ? React.createElement('span', null, status) : null),\n React.createElement('span', { style: { flex: 1 } }),\n (sum.totalFiles > 0\n ? React.createElement('button', { className: 'edrv-diffchip', title: '打开差异总览/归档', onClick: () => setLauncherOpen((o) => !o) }, '⚠ 差异 ' + sum.totalFiles + ' 文件')\n : null),\n React.createElement('button', { className: 'edrv-chip-btn', title: '刷新', onClick: reloadFile }, '⟳'))\n\n const otherFiles = sum.pendingFiles.filter((f) => f.path !== active)\n\n 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: hoverAct.right ?? 12 },\n onMouseEnter: () => { hoverPanelRef.current = true; if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },\n onMouseMove: () => { hoverPanelRef.current = true; if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },\n onMouseLeave: () => {\n hoverPanelRef.current = false\n if (hoverEditorRef.current || hideTimerRef.current) return\n hideTimerRef.current = setTimeout(() => {\n hideTimerRef.current = null\n if (hoverEditorRef.current || hoverPanelRef.current) return\n hoverKeyRef.current = null\n hoverTopRef.current = null\n setHoverAct(null)\n }, 420)\n },\n },\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', onClick: () => { dismissHover(); actHunk(hoverAct.region, false) } }, '✓ Keep'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-undo', onClick: () => { dismissHover(); actHunk(hoverAct.region, true) } }, '↩ Undo'))\n : null\n\n const overlay = launcherOpen\n ? React.createElement(React.Fragment, null,\n React.createElement('div', { style: { position: 'fixed', inset: 0, zIndex: 30 }, onClick: () => setLauncherOpen(false) }),\n React.createElement(DiffLauncher, { sessionId, sum, tab: launcherTab, onClose: () => setLauncherOpen(false), onOpenFile: (p) => { openFile(p, true); setLauncherOpen(false) } }))\n : (pendingRegions.length > 0\n ? React.createElement(DiffBox, {\n pendingRegions, staleRegions,\n onAct: actHunk,\n onAcceptFile: acceptFile,\n onUndoFile: undoFile,\n onAcceptAllFiles: acceptAllFiles,\n onUndoAllFiles: undoAllFiles,\n allPendingCount: allPending.length,\n onRollback: rollbackFile,\n onJump: jumpTo,\n otherFiles,\n onOpenOther: (p) => openFile(p, true),\n onOpenLauncher: (tab) => { setLauncherTab(tab || 'pending'); setLauncherOpen(true) },\n onRefresh: reloadFile,\n activePath: active,\n diffIdx, diffTotal: pendingRegions.length,\n fileIdx, fileTotal: sum.pendingFiles.length,\n onPrevDiff: () => gotoDiff(-1), onNextDiff: () => gotoDiff(1),\n onPrevFile: () => gotoFile(-1), onNextFile: () => gotoFile(1),\n })\n : (sum.pendingFiles.length > 0\n ? React.createElement(DiffBarEmpty, {\n sum, active, staleCount: staleRegions.length,\n onNextFile: () => { if (sum.pendingFiles.length) openFile(sum.pendingFiles[0].path, true) },\n onOpenLauncher: (tab) => { setLauncherTab(tab || 'pending'); setLauncherOpen(true) },\n onRefresh: reloadFile,\n })\n : null))\n\n return React.createElement('div', { 'data-edrv-view': '1', style: { height: '100%', minHeight: 0, display: 'flex', flexDirection: 'column', background: 'var(--dsw-alias-bg-base,transparent)', overflow: 'hidden' } },\n pathBar,\n tabRow,\n React.createElement('div', { style: { position: 'relative', flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' } },\n body,\n hoverEl,\n overlay),\n statusBar)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffBadge:header 差异角标(仅工作区有差异时显示)。\n * 迁移自原 src/client/index.ts 的 DiffBadge,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { openEditorView, emitShowLauncher } from '../events.js'\nimport { summarize } from '../state/records.js'\n\n/**\n * 会话 header 差异角标:5s 轮询 edrv.list,有差异时显示数字徽章,点击打开编辑区并拉起 DiffLauncher。\n */\nexport function DiffBadge(props) {\n const sessionId = props?.sessionId\n const [n, setN] = React.useState(0)\n const seq = React.useRef(0)\n\n const load = React.useCallback(() => {\n if (!sessionId) return\n const s = ++seq.current\n rpc('edrv.list', { sessionId }).then((res) => {\n if (s !== seq.current || !res || !res.ok || !Array.isArray(res.records)) return\n setN(summarize(res.records).totalFiles)\n }).catch(() => {})\n }, [sessionId])\n\n React.useEffect(() => {\n load()\n const t = setInterval(load, 5000)\n const onRefresh = () => load()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => { clearInterval(t); window.removeEventListener('edrv:refresh', onRefresh) }\n }, [load])\n\n if (!n) return null\n\n const click = () => {\n openEditorView(null)\n setTimeout(() => { emitShowLauncher() }, 120)\n }\n\n return React.createElement('button', {\n onClick: click,\n title: n + ' 个文件有差异,点击在编辑区查看',\n style: { position: 'relative', display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 30, height: 30, padding: 0, background: 'transparent', border: 'none', borderRadius: 6, cursor: 'pointer' },\n },\n React.createElement('img', { src: '/edrv/assets/compare-select.png', alt: '差异', style: { width: 22, height: 22, display: 'block' } }),\n React.createElement('span', { style: { position: 'absolute', top: 1, right: 0, minWidth: 15, height: 15, padding: '0 3px', borderRadius: 8, background: 'var(--dsw-alias-state-warn-primary,#d97706)', color: '#fff', fontSize: 10, lineHeight: '15px', textAlign: 'center', fontWeight: 700, boxSizing: 'border-box' } }, String(n)))\n}\n","/**\n * dsh-vscode-mode client — 浏览器半入口:slot 注册 + 装配。\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.6",
3
+ "version": "0.1.7",
4
4
  "description": "DSH 上的类 VSCode 编码体验:Monaco 中央编辑器(文件页签/QuickOpen/状态栏)+ Agent 编辑差异审查(整文件差异/采纳/拒绝/归档/回滚),状态持久化到工作区旁车",
5
5
  "keywords": [
6
6
  "dsh",
@@ -55,7 +55,10 @@ export function EditorView(props) {
55
55
  const lineRegionMapRef = React.useRef(new Map()) // 行 → 区域 映射(hover 命中)
56
56
  const hoverKeyRef = React.useRef(null) // 当前 hover 区域 key(区域不变不重渲染)
57
57
  const hoverTopRef = React.useRef(null) // 当前 hover 浮窗 top(滚动后位置变化才重定位)
58
+ const hoverRightRef = React.useRef(null) // 浮窗右侧避让 Monaco 缩略栏
58
59
  const hideTimerRef = React.useRef(null) // 延迟隐藏计时器(防闪烁)
60
+ const hoverEditorRef = React.useRef(false) // 鼠标是否仍在编辑器命中区
61
+ const hoverPanelRef = React.useRef(false) // 鼠标是否已进入 Keep/Undo 浮层
59
62
  const batchBusyRef = React.useRef(false) // 批量 Keep All/Undo All 防重入
60
63
  const diffRendererRef = React.useRef(null)
61
64
  if (!diffRendererRef.current) diffRendererRef.current = createDiffRenderer((sid, t) => dbg(sid, t))
@@ -292,29 +295,34 @@ export function EditorView(props) {
292
295
  // 防闪烁:① 区域不变不 setState(浮窗锚定差异块起始行,不跟随鼠标);② 延迟隐藏;
293
296
  // ③ 浮窗自身 onMouseEnter 取消隐藏计时(鼠标在浮窗与编辑器间移动不闪)。
294
297
  const hideSoon = () => {
295
- if (hideTimerRef.current) return
298
+ if (hoverEditorRef.current || hoverPanelRef.current || hideTimerRef.current) return
296
299
  hideTimerRef.current = setTimeout(() => {
297
300
  hideTimerRef.current = null
301
+ if (hoverEditorRef.current || hoverPanelRef.current) return
298
302
  hoverKeyRef.current = null
299
303
  hoverTopRef.current = null
300
304
  setHoverAct(null)
301
305
  }, 180)
302
306
  }
303
307
  ed.onMouseMove((e) => {
308
+ hoverEditorRef.current = true
304
309
  const line = e?.target?.position?.lineNumber
305
310
  const map = lineRegionMapRef.current
306
- if (!line || !map.size) { hideSoon(); return }
311
+ if (!line || !map.size) { hoverEditorRef.current = false; hideSoon(); return }
307
312
  const hit = map.get(line)
308
- if (!hit) { hideSoon(); return }
313
+ if (!hit) { hoverEditorRef.current = false; hideSoon(); return }
309
314
  const key = callIdAttr(hit.callId, hit.idx)
310
315
  const top = Math.max(0, ed.getTopForLineNumber(Math.max(1, hit.start)) - ed.getScrollTop())
311
- if (hoverKeyRef.current === key && hoverTopRef.current === top) return // 同区域同位置不重复更新
316
+ const layout = ed.getLayoutInfo()
317
+ const minimapLeft = layout.minimap?.minimapLeft || 0
318
+ const right = minimapLeft > 0 ? Math.max(12, layout.width - minimapLeft + 8) : Math.max(12, layout.verticalScrollbarWidth + 8)
319
+ if (hoverKeyRef.current === key && hoverTopRef.current === top && hoverRightRef.current === right) return // 同区域同位置不重复更新
312
320
  hoverKeyRef.current = key
313
321
  hoverTopRef.current = top
322
+ hoverRightRef.current = right
314
323
  if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }
315
- setHoverAct({ region: hit, top })
324
+ setHoverAct({ region: hit, top, right })
316
325
  })
317
- ed.onMouseLeave(hideSoon)
318
326
  editorRef.current = ed
319
327
  }, [])
320
328
 
@@ -372,6 +380,20 @@ export function EditorView(props) {
372
380
  refreshRecords()
373
381
  }
374
382
 
383
+ /**
384
+ * 关闭当前差异浮窗并清理 hover 锚点。
385
+ * @author ddj 2026年08月21号
386
+ */
387
+ const dismissHover = () => {
388
+ hoverKeyRef.current = null
389
+ hoverTopRef.current = null
390
+ hoverRightRef.current = null
391
+ hoverEditorRef.current = false
392
+ hoverPanelRef.current = false
393
+ if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }
394
+ setHoverAct(null)
395
+ }
396
+
375
397
  /**
376
398
  * 对单个差异区域执行采纳/不采纳。
377
399
  * @author ddj 2026年08月20号
@@ -524,12 +546,23 @@ export function EditorView(props) {
524
546
  const hoverEl = (hoverAct && !launcherOpen)
525
547
  ? React.createElement('div', {
526
548
  className: 'edrv-hoveract',
527
- style: { top: hoverAct.top, right: 12 },
528
- onMouseEnter: () => { if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },
529
- onMouseLeave: () => { const t = setTimeout(() => { hideTimerRef.current = null; hoverKeyRef.current = null; hoverTopRef.current = null; setHoverAct(null) }, 180); hideTimerRef.current = t },
549
+ style: { top: hoverAct.top, right: hoverAct.right ?? 12 },
550
+ onMouseEnter: () => { hoverPanelRef.current = true; if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },
551
+ onMouseMove: () => { hoverPanelRef.current = true; if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },
552
+ onMouseLeave: () => {
553
+ hoverPanelRef.current = false
554
+ if (hoverEditorRef.current || hideTimerRef.current) return
555
+ hideTimerRef.current = setTimeout(() => {
556
+ hideTimerRef.current = null
557
+ if (hoverEditorRef.current || hoverPanelRef.current) return
558
+ hoverKeyRef.current = null
559
+ hoverTopRef.current = null
560
+ setHoverAct(null)
561
+ }, 420)
562
+ },
530
563
  },
531
- React.createElement('button', { className: 'edrv-pill edrv-pill-keep', onClick: () => actHunk(hoverAct.region, false) }, '✓ Keep'),
532
- React.createElement('button', { className: 'edrv-pill edrv-pill-undo', onClick: () => actHunk(hoverAct.region, true) }, '↩ Undo'))
564
+ React.createElement('button', { className: 'edrv-pill edrv-pill-keep', onClick: () => { dismissHover(); actHunk(hoverAct.region, false) } }, '✓ Keep'),
565
+ React.createElement('button', { className: 'edrv-pill edrv-pill-undo', onClick: () => { dismissHover(); actHunk(hoverAct.region, true) } }, '↩ Undo'))
533
566
  : null
534
567
 
535
568
  const overlay = launcherOpen