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