dsh-vscode-mode 0.1.43 → 0.1.44
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 +105 -65
- package/lib/client.js.map +1 -1
- package/package.json +1 -1
- package/src/client/monaco/lsp/providers.ts +129 -62
- package/src/client/styles/editor.css +0 -6
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["React","listeners","React","React","React","React","KEY_PREFIX","React","React","React","React","React","React","React","React","React","React","React","React","createPortal","KEY_PREFIX","React","React","React","React","React","React"],"sources":["../src/shared/rpc.ts","../src/client/rpc.ts","../src/client/sidebarBridge.ts","../src/client/events.ts","../src/client/monaco/theme.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/shared/keybindings.ts","../src/client/keybindings.ts","../src/client/ui/QuickOpen.ts","../src/client/ui/shared.ts","../src/client/ui/DiffLauncher.ts","../src/client/sidebar/SidebarView.ts","../src/client/diffDockStore.ts","../src/client/diffDock.ts","../src/client/editorLayout.ts","../src/client/fileReveal.ts","../src/client/paths.ts","../src/client/state/viewStateCache.ts","../src/shared/lsp.ts","../src/client/monaco/lsp/lspClient.ts","../src/client/monaco/lsp/providers.ts","../src/client/monaco/lsp/index.ts","../src/client/ui/EditorView.ts","../src/client/ui/DiffBadge.ts","../src/client/ui/PerfSizeBadge.ts","../src/client/ui/DiffBox.ts","../src/client/ui/ConversationDiffDock.ts","../src/client/compat.ts","../src/client/fileOpeners.ts","../src/client/settingsContext.ts","../src/client/ui/KeybindingsPanel.ts","../src/client/ui/LspSettings.ts","../src/client/state/workspaceFoldCache.ts","../src/client/ui/PerfSettings.ts","../src/client/ui/McpSettings.ts","../src/client/openPathRouter.ts","../src/client/ui/SideEditorTab.ts","../src/client/addToConversation.ts","../src/client/sidebar/registry.ts","../src/client/ui/menuPosition.ts","../src/client/ui/ContextMenu.ts","../src/client/sidebar/contextMenu.ts","../src/client/state/explorerCache.ts","../src/client/state/explorerEntriesCache.ts","../src/client/sidebar/panels/FileExplorer.ts","../src/client/sidebar/panels/SearchPanel.ts","../src/client/sidebar/panels/index.ts","../src/client/sidebar/menuItems.ts","../src/client/outline/parse.ts","../src/client/outline/sources.ts","../src/client/outline/OutlinePanel.tsx","../src/client/outline/index.ts","../src/client/outline/lspSource.ts","../src/client/index.ts"],"sourcesContent":["/**\n * dsh-vscode-mode RPC contract — method names, per-method request/ok payloads,\n * and the typed handler map shared by the host dispatcher and the client\n * fetch wrapper. 载荷形状与历史实现一字不差,仅把隐式约定类型化。\n *\n * Purity rule: no node/react imports (same as types.ts).\n * 作者 ddj 2026-08-20\n */\nimport type {\n ArchiveBatch,\n ArchiveEntry,\n RecordView,\n StaleHunk,\n} from './types.js'\nimport type { MpcConfig, MpcProject, MpcProjectSaveInput, MpcServer } from './mcp.js'\nimport type { CompatReport, DevFormInfo } from './compat.js'\nimport type { LspExtInfo, LspExtUpdate, LspHover, LspLocation, LspMarketItem, LspPosition, LspSemanticTokens, LspServerStatus, LspSymbol } from './lsp.js'\n\n/** webServer 精确路由。 */\nexport const RPC_PATH = '/edrv/rpc'\n\n/** 决策作用域:call=整条记录,hunk=单个差异块。 */\nexport type RpcScope = 'call' | 'hunk'\n\n/** 目录树单项(edrv.listDir 返回;path 相对工作区根,'/' 分隔)。 */\nexport interface TreeEntry {\n name: string\n path: string\n type: 'file' | 'directory' | 'other'\n size?: number\n}\n\n/** 内容搜索单条命中(edrv.searchContent 返回;path 相对工作区根,列为 1-based UTF-16)。 */\nexport interface SearchContentMatch {\n path: string\n line: number\n startColumn: number\n endColumn: number\n text: string\n}\n\n// --region 会话性能管理(edrv.perf.*)\n/** 一个已持久化会话的体积/活跃信息(edrv.perf.inventory 每行)。 */\nexport interface PerfSession {\n sessionId: string\n workspaceKey: string\n bytes: number\n mtime: number\n active: boolean\n}\n\n/** 一个工作区的会话聚合(edrv.perf.inventory)。 */\nexport interface PerfWorkspace {\n workspaceKey: string\n sessionCount: number\n totalBytes: number\n minMtime: number\n maxMtime: number\n}\n\n/** 会话盘点汇总。 */\nexport interface PerfTotals {\n workspaces: number\n sessions: number\n totalBytes: number\n}\n\n/** 一次移出/恢复操作中的单个会话条目。 */\nexport interface PerfMoveItem {\n workspaceKey: string\n sessionId: string\n bytes: number\n}\n\n/** 一次移出操作的失败项。 */\nexport interface PerfMoveFailure {\n workspaceKey: string\n sessionId: string\n error: string\n}\n\n/** 侧车摘要(edrv.perf.sidecarSummary):紧凑关键字段,不整份读 sidecar 进对话。 */\nexport interface SidecarPerfSummary {\n active: number\n pendingByFile: { path: string; pending: number }[]\n archiveBytes: number\n}\n// --endregion\n\n/** 一条批量决策项(decideBatch 的 items 元素,与 accept/reject 单条参数同构)。 */\nexport interface DecideItem {\n callId: string\n scope?: RpcScope\n hunkIndex?: number\n decision: 'accepted' | 'rejected'\n}\n\n/** 批量决策逐项结果。 */\nexport interface DecideResult {\n callId: string\n ok: boolean\n error?: string\n record?: RecordView\n}\n\n/** 每个方法的请求参数(sessionId 为公共可选字段)。 */\nexport interface RpcRequestMap {\n 'edrv.list': { sessionId?: string; callIds?: string[]; skipStale?: boolean }\n 'edrv.accept': { sessionId?: string; callId: string; scope?: RpcScope; hunkIndex?: number }\n 'edrv.reject': { sessionId?: string; callId: string; scope?: RpcScope; hunkIndex?: number }\n 'edrv.decideBatch': { sessionId?: string; items: DecideItem[] }\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 'edrv.searchContent': { sessionId?: string; query: string; matchCase?: boolean; wholeWord?: boolean; regex?: boolean; maxResults?: number; include?: string[]; exclude?: string[] }\n 'edrv.listDir': { sessionId?: string; path: string; force?: boolean }\n 'edrv.revealInExplorer': { sessionId?: string; path: string }\n 'mcp.list': {}\n 'mcp.save': { config: MpcConfig }\n 'mcp.remove': { id: string }\n 'mcp.toggle': { id: string; enabled: boolean }\n 'mcp.refresh': { id: string }\n 'mcp.projects': {}\n 'mcp.projectSave': MpcProjectSaveInput\n 'mcp.projectRemove': { workspacePath: string; serverName: string }\n 'mcp.projectToggle': { workspacePath: string; serverName: string; enabled: boolean }\n 'mcp.projectRefresh': { workspacePath: string; serverName: string }\n 'vscode.fileOpenSettingsGet': {}\n 'vscode.fileOpenSettingsUpdate': { fileOpenTool: string; expectedRevision?: number }\n 'vscode.devFormGet': {}\n 'vscode.devFormSet': { enabled: boolean; path?: string }\n 'compat': {}\n 'edrv.lsp.status': { sessionId?: string }\n 'edrv.lsp.sync': { sessionId?: string; path: string; text: string; version: number }\n 'edrv.lsp.close': { sessionId?: string; path: string }\n 'edrv.lsp.definition': { sessionId?: string; path: string; position: LspPosition }\n 'edrv.lsp.references': { sessionId?: string; path: string; position: LspPosition; includeDeclaration?: boolean }\n 'edrv.lsp.documentSymbol': { sessionId?: string; path: string }\n 'edrv.lsp.workspaceSymbol': { sessionId?: string; query: string }\n 'edrv.lsp.hover': { sessionId?: string; path: string; position: LspPosition }\n 'edrv.lsp.semanticTokens': { sessionId?: string; path: string }\n 'edrv.lsp.redetect': { languageId: string }\n 'edrv.lsp.configGet': {}\n 'edrv.lsp.configUpdate': { languageId: string; enabled?: boolean; command?: string; path?: string }\n 'edrv.lsp.ext.list': {}\n 'edrv.lsp.ext.install': { vsixPath?: string; namespace?: string; name?: string; version?: string }\n 'edrv.lsp.ext.uninstall': { id: string }\n 'edrv.lsp.ext.update': { id: string }\n 'edrv.lsp.ext.updates': {}\n 'edrv.lsp.ext.market': { query: string; size?: number }\n 'edrv.perf.inventory': { sessionId?: string }\n 'edrv.perf.sessionSize': { sessionId?: string; cwd: string }\n 'edrv.perf.movePlan': { workspaceKey?: string; sessionIds?: string[]; minBytes?: number; olderThanDays?: number }\n 'edrv.perf.moveOut': { workspaceKey: string; sessionIds: string[]; dryRun?: boolean }\n 'edrv.perf.restore': { workspaceKey: string; sessionId: string }\n 'edrv.perf.purgeArchive': { olderThanDays: number }\n 'edrv.perf.sidecarSummary': { sessionId?: string }\n 'edrv.perf.configGet': {}\n 'edrv.perf.configApply': {}\n 'edrv.perf.configUndo': {}\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.decideBatch': { results: DecideResult[] }\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 'edrv.searchContent': { matches: SearchContentMatch[]; truncated: boolean; warning?: string }\n 'edrv.listDir': { root: string; path: string; entries: TreeEntry[] }\n 'edrv.revealInExplorer': { revealed: string }\n 'mcp.list': { servers: MpcServer[] }\n 'mcp.save': { server: MpcServer }\n 'mcp.remove': object\n 'mcp.toggle': { server: MpcServer }\n 'mcp.refresh': { server: MpcServer }\n 'mcp.projects': { projects: MpcProject[] }\n 'mcp.projectSave': { project: MpcProject }\n 'mcp.projectRemove': { project: MpcProject }\n 'mcp.projectToggle': { project: MpcProject }\n 'mcp.projectRefresh': { project: MpcProject }\n 'vscode.fileOpenSettingsGet': { fileOpenTool: string; revision?: number }\n 'vscode.fileOpenSettingsUpdate': { fileOpenTool: string; revision?: number }\n 'vscode.devFormGet': { devForm: DevFormInfo }\n 'vscode.devFormSet': { devForm: DevFormInfo; restart: boolean }\n 'compat': { report: CompatReport }\n 'edrv.lsp.status': { servers: LspServerStatus[] }\n 'edrv.lsp.sync': object\n 'edrv.lsp.close': object\n 'edrv.lsp.definition': { locations: LspLocation[]; truncated?: boolean }\n 'edrv.lsp.references': { locations: LspLocation[]; truncated?: boolean }\n 'edrv.lsp.documentSymbol': { symbols: LspSymbol[] }\n 'edrv.lsp.workspaceSymbol': { symbols: LspSymbol[]; truncated?: boolean }\n 'edrv.lsp.hover': { hover?: LspHover }\n 'edrv.lsp.semanticTokens': { tokens?: LspSemanticTokens }\n 'edrv.lsp.redetect': { servers: LspServerStatus[] }\n 'edrv.lsp.configGet': { config: Record<string, unknown> }\n 'edrv.lsp.configUpdate': { config: Record<string, unknown>; servers?: LspServerStatus[] }\n 'edrv.lsp.ext.list': { extensions: LspExtInfo[] }\n 'edrv.lsp.ext.install': { extension: LspExtInfo; updated?: boolean }\n 'edrv.lsp.ext.uninstall': object\n 'edrv.lsp.ext.update': { extension: LspExtInfo; updated: boolean }\n 'edrv.lsp.ext.updates': { updates: LspExtUpdate[] }\n 'edrv.lsp.ext.market': { extensions: LspMarketItem[] }\n 'edrv.perf.inventory': { workspaces: PerfWorkspace[]; sessions: PerfSession[]; totals: PerfTotals; activeIds: string[] }\n 'edrv.perf.sessionSize': { bytes: number; exists: boolean }\n 'edrv.perf.movePlan': { items: PerfMoveItem[]; reclaimedBytes: number }\n 'edrv.perf.moveOut': { moved: PerfMoveItem[]; failures: PerfMoveFailure[]; reclaimedBytes: number }\n 'edrv.perf.restore': { restored: boolean; error?: string }\n 'edrv.perf.purgeArchive': { removed: number; reclaimedBytes: number }\n 'edrv.perf.sidecarSummary': SidecarPerfSummary\n 'edrv.perf.configGet': { profileDir?: string; patchPath?: string; applied: boolean; block: string; backup?: string }\n 'edrv.perf.configApply': { applied: boolean; backup: string; restart: boolean }\n 'edrv.perf.configUndo': { restored: boolean; error?: string; backup?: string }\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/**\n * 诊断日志开关(默认关):diff 渲染热路径每条日志 = 1 次 RPC 往返 +\n * host 端 debug 文件全量读改写(上限 512KB),高频渲染下开销可观。\n * 排查问题时在浏览器控制台执行 localStorage.setItem('edrv.debug','1') 后刷新开启。\n * @author ddj 2026年08月26号\n */\nconst DEBUG = (() => {\n try { return localStorage.getItem('edrv.debug') === '1' } catch (e) { return false }\n})()\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 * 诊断日志:开关关闭时直接返回(零 RPC 零落盘);开启时走 host edrv.debug 落盘。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @param text 日志文本\n */\nexport function dbg(sessionId: string | undefined, text: string): void {\n if (!DEBUG) return\n try {\n rpc('edrv.debug', { sessionId, text }).catch(() => {})\n } catch (e) { /* 日志失败忽略 */ }\n}\n","/**\n * dsh-vscode-mode client — 侧边栏编辑区桥:可选探测 dsh-better-sidebar 的\n * ctx.betterSidebar 服务,并注册「文件编辑」Tab(单实例)。\n * 可选依赖模式:服务缺失时调用方回退到中央页签形态;本模块不注册任何东西。\n * 纯逻辑(探测/初始打开解析/角标计数)可单测,DOM/事件仅存在于 install 路径。\n * 作者 ddj 2026年08月25号\n */\n\nimport React from 'react'\n\n/** betterSidebar 服务名(ctx.get 用;不要加进 inject——缺失会让插件停靠等待)。 */\nexport const BETTER_SIDEBAR_SERVICE = 'betterSidebar'\n/** 本插件在侧边栏注册的 Tab 类型 id(亦是 SidebarTab.type)。 */\nexport const SIDE_TAB_ID = 'edrv-editor'\n/** 侧边栏 Tab 标题。 */\nexport const SIDE_TAB_TITLE = '文件编辑'\n/** 推荐安装命令(提示条/兼容性报告共用)。 */\nexport const SIDEBAR_INSTALL_CMD = 'dsh plugin --profile web add dsh-better-sidebar'\n\n/** Tab 元数据(openTab 种子随 Tab 持久化,创建路径用它恢复初始打开)。 */\nexport interface SideEditorMeta {\n /** 待打开的工作区相对/绝对路径。 */\n openPath?: string\n /** 打开后聚焦首个差异。 */\n focusDiff?: boolean\n}\n\n/**\n * betterSidebar 服务的最小结构面(结构性探测,不 import 第三方类型)。\n */\nexport interface SidebarServiceLike {\n registerTab: (descriptor: unknown) => () => void\n openTab: (seed: { type: string; title?: string; path?: string; meta?: unknown }, scope?: { sessionId: string; cwd?: string }) => void\n isTabEnabled?: (id: string) => boolean\n features?: readonly string[]\n}\n\n/**\n * 解析 Tab 挂载时的初始打开请求(创建路径读 tab.path/meta,聚焦路径走窗口事件)。\n * @author ddj 2026年08月25号\n * @param tab 侧边栏 Tab(path/meta 为可选字段)\n * @returns 待打开路径与是否聚焦差异\n */\nexport function resolveInitialOpen(tab: { path?: string; meta?: unknown } | null | undefined): { path: string | null; focusDiff: boolean } {\n const meta = (tab?.meta ?? {}) as SideEditorMeta\n const path = typeof tab?.path === 'string' && tab.path ? tab.path : (typeof meta?.openPath === 'string' ? meta.openPath : null)\n return { path: path || null, focusDiff: meta?.focusDiff === true }\n}\n\n/** 会话级待处理差异文件数缓存(Tab 角标同步读取;EditorView 侧栏形态写入)。 */\nconst sidePending = new Map<string, number>()\n\n/**\n * 写入会话的待处理差异文件数(0 视为清除,不显示角标)。\n * @author ddj 2026年08月25号\n * @param sessionId 会话 id\n * @param count 待处理差异文件数\n */\nexport function setSidePending(sessionId: string, count: number): void {\n if (!sessionId) return\n const value = Number.isFinite(count) ? Math.max(0, Math.floor(count)) : 0\n if (value > 0) sidePending.set(sessionId, value)\n else sidePending.delete(sessionId)\n}\n\n/**\n * 读取会话的待处理差异文件数(角标用)。\n * @author ddj 2026年08月25号\n * @param sessionId 会话 id\n * @returns 非负计数\n */\nexport function getSidePending(sessionId?: string): number {\n if (!sessionId) return 0\n return sidePending.get(sessionId) ?? 0\n}\n\n/** 模块级侧栏打开路由(events.ts 优先走它;未注册 = 旧页签形态)。 */\nlet ensureSideEditor: ((path: string | null, focusDiff: boolean) => boolean) | null = null\n\n/** 待消费的初始打开(Tab 组件尚未挂载时暂存;按会话匹配,挂载时取走)。 */\nlet pendingOpen: { sessionId: string; path: string | null; focusDiff: boolean } | null = null\n/** Tab 组件当前是否有挂载实例(有则直接投递窗口事件,无则暂存待消费)。 */\nlet sideEditorMounted = false\n\n/**\n * 注册/撤销侧栏打开路由。\n * @author ddj 2026年08月25号\n * @param fn 路由函数或 null\n */\nexport function setEnsureSideEditor(fn: ((path: string | null, focusDiff: boolean) => boolean) | null): void {\n ensureSideEditor = fn\n}\n\n/**\n * 标记侧栏编辑器组件挂载状态(SideEditorTab 挂载/卸载时调用)。\n * @author ddj 2026年08月25号\n * @param mounted 是否已挂载\n */\nexport function setSideEditorMounted(mounted: boolean): void {\n sideEditorMounted = mounted\n}\n\n/**\n * 暂存指定会话的待消费初始打开(Tab 组件未挂载时由 install 路径调用)。\n * @author ddj 2026年08月25号\n * @param sessionId 会话 id\n * @param path 待打开路径(可空)\n * @param focusDiff 是否聚焦首个差异\n */\nexport function stagePendingSideOpen(sessionId: string, path: string | null, focusDiff: boolean): void {\n if (!sessionId) return\n pendingOpen = { sessionId, path: path || null, focusDiff: focusDiff === true }\n}\n\n/**\n * 取走指定会话的待消费初始打开(SideEditorTab 挂载时读取;不存在返回 null)。\n * @author ddj 2026年08月25号\n * @param sessionId 会话 id\n * @returns 待打开请求或 null\n */\nexport function takePendingSideOpen(sessionId?: string): { path: string | null; focusDiff: boolean } | null {\n if (!pendingOpen || !sessionId || pendingOpen.sessionId !== sessionId) return null\n const value = { path: pendingOpen.path, focusDiff: pendingOpen.focusDiff }\n pendingOpen = null\n return value\n}\n\n/**\n * 打开/聚焦侧栏编辑器(打开路径可选;返回是否已被侧栏形态接管)。\n * @author ddj 2026年08月25号\n * @param path 待打开路径(可空)\n * @param focusDiff 是否聚焦首个差异\n * @returns 是否路由成功\n */\nexport function routeSideEditor(path: string | null, focusDiff: boolean): boolean {\n if (typeof ensureSideEditor !== 'function') return false\n try {\n return ensureSideEditor(path, focusDiff) === true\n } catch (error) {\n console.warn('[dsh-vscode-mode] 侧栏编辑器打开失败(' + String(error) + '),已回退')\n return false\n }\n}\n\n/**\n * 结构化探测 betterSidebar 服务(可选依赖:缺失/降级返回 undefined)。\n * @author ddj 2026年08月25号\n * @param ctx 客户端服务上下文\n * @returns 服务结构面或 undefined\n */\nexport function detectSidebarService(ctx: { get: (name: string) => unknown }): SidebarServiceLike | undefined {\n try {\n const service = ctx.get(BETTER_SIDEBAR_SERVICE) as SidebarServiceLike | undefined\n if (!service || typeof service.registerTab !== 'function' || typeof service.openTab !== 'function') return undefined\n return service\n } catch {\n return undefined\n }\n}\n\n/**\n * 注册侧边栏「文件编辑」Tab 并接管打开路由。\n * Tab 被用户在 better-sidebar 设置里禁用时,打开路由降级为回退回调(中央页签)。\n * @author ddj 2026年08月25号\n * @param options 装配参数(组件依赖 + 活动会话解析 + 回退注册)\n * @returns 卸载器(反注册 Tab + 撤销路由)\n */\nexport function installSideEditor(options: {\n service: SidebarServiceLike\n renderTab: (props: Record<string, unknown>) => unknown\n activeSession: () => { sessionId?: string; cwd?: string } | undefined\n registerLegacyFallback: () => void\n}): () => void {\n const { service, renderTab, activeSession, registerLegacyFallback } = options\n let fallbackInstalled = false\n const open = (path: string | null, focusDiff: boolean): boolean => {\n if (typeof service.isTabEnabled === 'function' && !service.isTabEnabled(SIDE_TAB_ID)) {\n if (!fallbackInstalled) {\n fallbackInstalled = true\n try { registerLegacyFallback() } catch (error) { console.warn('[dsh-vscode-mode] 回退注册失败(' + String(error) + ')') }\n }\n return false\n }\n const scope = activeSession()\n const sessionId = scope?.sessionId\n if (!sessionId) return false\n try {\n service.openTab({\n type: SIDE_TAB_ID,\n title: SIDE_TAB_TITLE,\n ...(path ? { path } : {}),\n meta: { openPath: path || undefined, focusDiff },\n }, { sessionId, cwd: scope?.cwd })\n } catch (error) {\n console.warn('[dsh-vscode-mode] openTab 失败(' + String(error) + ')')\n return false\n }\n if (sideEditorMounted) {\n // 已挂载:窗口事件直达 EditorView 监听器\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path, focusDiff } }))\n } else {\n // 未挂载(面板折叠卸载/首次创建):暂存待消费,挂载时由 SideEditorTab 取走\n stagePendingSideOpen(sessionId, path, focusDiff)\n }\n return true\n }\n let tabDisposer: (() => void) | null = null\n try {\n tabDisposer = service.registerTab({\n id: SIDE_TAB_ID,\n title: SIDE_TAB_TITLE,\n icon: codeIcon,\n single: true,\n badge: (_ctx: unknown, scope: { sessionId?: string }) => getSidePending(scope?.sessionId) || null,\n component: renderTab,\n })\n } catch (error) {\n console.warn('[dsh-vscode-mode] 侧边栏 Tab 注册失败(' + String(error) + ')')\n // 注册失败 = 侧栏形态不可用:立即回退中央页签,不接管打开路由\n if (!fallbackInstalled) {\n fallbackInstalled = true\n try { registerLegacyFallback() } catch (inner) { console.warn('[dsh-vscode-mode] 回退注册失败(' + String(inner) + ')') }\n }\n return () => {}\n }\n setEnsureSideEditor(open)\n return () => {\n if (typeof tabDisposer === 'function') tabDisposer()\n setEnsureSideEditor(null)\n }\n}\n\n/**\n * 侧边栏 Tab 图标(内联 SVG 代码括号,不依赖图标包)。\n * @author ddj 2026年08月25号\n * @param size 边长(px)\n * @returns 图标元素\n */\nfunction codeIcon(size: number): unknown {\n return React.createElement('svg', {\n width: size, height: size, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true, focusable: false,\n },\n React.createElement('path', {\n d: 'M5.5 4.5 2.5 8l3 3.5M10.5 4.5 13.5 8l-3 3.5',\n stroke: 'currentColor', strokeWidth: 1.4, strokeLinecap: 'round', strokeLinejoin: 'round',\n }))\n}\n","/**\n * dsh-vscode-mode client — 跨组件/跨 slot 的窗口事件助手。\n * 迁移自原 src/client/index.ts 的 openEditorView 与事件派发,语义不改;\n * 侧边栏形态(sidebarBridge 已注册路由)优先,否则回退 DOM 页签点击。\n * 作者 ddj 2026-08-20\n */\nimport { routeSideEditor } from './sidebarBridge.js'\n\n/**\n * 选择中央「文件编辑」页签(DOM 级,无需 store actions)。仅旧页签形态使用。\n * @author ddj 2026年08月26号\n */\nfunction selectEditorTab(): void {\n const tabs = Array.from(document.querySelectorAll('div[role=\"tablist\"] button[role=\"tab\"]'))\n for (const tab of tabs) {\n if (tab.textContent && tab.textContent.includes('文件编辑')) {\n (tab as HTMLButtonElement).click()\n break\n }\n }\n}\n\n/**\n * 打开「文件编辑」:侧边栏形态路由优先,旧形态回退中央页签。\n * @author ddj 2026年08月26号\n * @param path 要打开的路径(可空)\n */\nexport function openEditorView(path: string | null): void {\n if (routeSideEditor(path ?? null, false)) return\n selectEditorTab()\n const target = path ?? null\n setTimeout(() => {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path: target } }))\n }, 80)\n}\n\n/**\n * 打开文件编辑页并聚焦指定文件的首个差异(侧边栏形态自动展开面板)。\n * @author ddj 2026年08月26号\n * @param path 待聚焦的差异文件路径\n */\nexport function openDiffView(path: string): void {\n if (routeSideEditor(path, true)) return\n selectEditorTab()\n setTimeout(() => {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', {\n detail: { path, focusDiff: true },\n }))\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/**\n * 打开指定路径并定位到行列(LSP 跳转目标)。\n * @author ddj 2026年08月27号\n * @param path 目标路径\n * @param line 目标行(1-based,可空)\n * @param column 目标列(1-based,可空)\n */\nexport function emitOpenAt(path: string, line?: number, column?: number): void {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path, line, column } }))\n}\n\n/**\n * 拉起 DiffLauncher。\n * @author ddj 2026年08月26号\n * @param tab 可选的目标页签\n */\nexport function emitShowLauncher(tab?: 'pending' | 'archive'): void {\n window.dispatchEvent(new CustomEvent('edrv:show-launcher', { detail: { tab } }))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — Monaco 语法分色主题(rich token 配色)。\n * 编辑器原先硬编码 'vs'(内置基础主题),token 分色层次少;\n * 这里定义 edrv-dark / edrv-light 两套完整 token 配色(对齐 VSCode Dark+ 语义分层),\n * 并随 DSH 明暗主题自动切换(跟随文档根 data 主题属性 / prefers-color-scheme)。\n * 作者 ddj 2026-08-28\n */\n\nexport const EDRV_DARK = 'edrv-dark'\nexport const EDRV_LIGHT = 'edrv-light'\nexport const EDRV_FALLBACK = 'vs'\n\n/** 语法分色(语义分层:关键字/字符串/数字/注释/函数/变量/类型/运算符/正则/标签/属性…)。 */\nconst DARK_RULES = [\n { token: '', foreground: 'd4d4d4', background: '1e1e1e' },\n { token: 'comment', foreground: '6a9955', fontStyle: 'italic' },\n { token: 'comment.doc', foreground: '7ca97c', fontStyle: 'italic' },\n { token: 'keyword', foreground: 'c586c0' },\n { token: 'keyword.control', foreground: 'c586c0' },\n { token: 'keyword.operator', foreground: 'd4d4d4' },\n { token: 'keyword.json', foreground: '9cdcfe' },\n { token: 'string', foreground: 'ce9178' },\n { token: 'string.escape', foreground: 'd7ba7d' },\n { token: 'string.key.json', foreground: '9cdcfe' },\n { token: 'string.value.json', foreground: 'ce9178' },\n { token: 'string.yaml', foreground: 'ce9178' },\n { token: 'number', foreground: 'b5cea8' },\n { token: 'number.hex', foreground: 'b5cea8' },\n { token: 'regexp', foreground: 'd16969' },\n { token: 'type', foreground: '4ec9b0' },\n { token: 'type.identifier', foreground: '4ec9b0' },\n { token: 'identifier', foreground: 'd4d4d4' },\n { token: 'variable', foreground: '9cdcfe' },\n { token: 'variable.global', foreground: 'ff6699' },\n { token: 'variable.local', foreground: '9cdcfe' },\n { token: 'variable.mutable', foreground: '9cdcfe' },\n { token: 'variable.predefined', foreground: '4fc1ff' },\n { token: 'variable.parameter', foreground: '00bfae' },\n { token: 'parameter', foreground: '00bfae' },\n { token: 'function', foreground: 'dcdcaa' },\n { token: 'method', foreground: 'dcdcaa' },\n { token: 'property', foreground: '9cdcfe' },\n { token: 'function.identifier', foreground: 'dcdcaa' },\n { token: 'member', foreground: 'dcdcaa' },\n { token: 'constant', foreground: '4fc1ff' },\n { token: 'constant.numeric', foreground: 'b5cea8' },\n { token: 'constant.language', foreground: '569cd6' },\n { token: 'tag', foreground: '569cd6' },\n { token: 'tag.xml', foreground: '569cd6' },\n { token: 'metatag', foreground: '808080' },\n { token: 'attribute.name', foreground: '9cdcfe' },\n { token: 'attribute.value', foreground: 'ce9178' },\n { token: 'delimiter', foreground: 'd4d4d4' },\n { token: 'delimiter.bracket', foreground: 'ffd700' },\n { token: 'delimiter.html', foreground: '808080' },\n { token: 'operator', foreground: 'd4d4d4' },\n { token: 'namespace', foreground: '4ec9b0' },\n { token: 'class', foreground: '4ec9b0' },\n { token: 'interface', foreground: '4ec9b0' },\n { token: 'enum', foreground: '4ec9b0' },\n { token: 'struct', foreground: '4ec9b0' },\n { token: 'annotation', foreground: 'dcdcaa' },\n { token: 'punctuation', foreground: 'd4d4d4' },\n { token: 'invalid', foreground: 'f44747' },\n]\n\nconst LIGHT_RULES = [\n { token: '', foreground: '1e1e1e', background: 'ffffff' },\n { token: 'comment', foreground: '008000', fontStyle: 'italic' },\n { token: 'comment.doc', foreground: '2e7d32', fontStyle: 'italic' },\n { token: 'keyword', foreground: '0000ff' },\n { token: 'keyword.control', foreground: 'af00db' },\n { token: 'keyword.operator', foreground: '1e1e1e' },\n { token: 'keyword.json', foreground: '0451a5' },\n { token: 'string', foreground: 'a31515' },\n { token: 'string.escape', foreground: 'ee0000' },\n { token: 'string.key.json', foreground: '0451a5' },\n { token: 'string.value.json', foreground: 'a31515' },\n { token: 'string.yaml', foreground: 'a31515' },\n { token: 'number', foreground: '098658' },\n { token: 'number.hex', foreground: '098658' },\n { token: 'regexp', foreground: '811f3f' },\n { token: 'type', foreground: '267f99' },\n { token: 'type.identifier', foreground: '267f99' },\n { token: 'identifier', foreground: '1e1e1e' },\n { token: 'variable', foreground: '001080' },\n { token: 'variable.global', foreground: 'c2185b' },\n { token: 'variable.local', foreground: '001080' },\n { token: 'variable.mutable', foreground: '001080' },\n { token: 'variable.predefined', foreground: '001080' },\n { token: 'variable.parameter', foreground: '008577' },\n { token: 'parameter', foreground: '008577' },\n { token: 'function', foreground: '795e26' },\n { token: 'method', foreground: '795e26' },\n { token: 'function.identifier', foreground: '795e26' },\n { token: 'member', foreground: '795e26' },\n { token: 'property', foreground: '001080' },\n { token: 'constant', foreground: '0070c1' },\n { token: 'constant.numeric', foreground: '098658' },\n { token: 'constant.language', foreground: '0000ff' },\n { token: 'tag', foreground: '800000' },\n { token: 'tag.xml', foreground: '800000' },\n { token: 'metatag', foreground: '6b6b6b' },\n { token: 'attribute.name', foreground: 'e50000' },\n { token: 'attribute.value', foreground: '0451a5' },\n { token: 'delimiter', foreground: '1e1e1e' },\n { token: 'delimiter.bracket', foreground: 'b46400' },\n { token: 'delimiter.html', foreground: '800000' },\n { token: 'operator', foreground: '1e1e1e' },\n { token: 'namespace', foreground: '267f99' },\n { token: 'class', foreground: '267f99' },\n { token: 'interface', foreground: '267f99' },\n { token: 'enum', foreground: '267f99' },\n { token: 'struct', foreground: '267f99' },\n { token: 'annotation', foreground: '795e26' },\n { token: 'punctuation', foreground: '1e1e1e' },\n { token: 'invalid', foreground: 'cd3131' },\n]\n\n/** 编辑器 UI 配色(与语法配色同套,保证 gutter/minimap/selection 一致)。 */\nconst DARK_COLORS = {\n 'editor.background': '#1e1e1e',\n 'editor.foreground': '#d4d4d4',\n 'editorLineNumber.foreground': '#6e7681',\n 'editorLineNumber.activeForeground': '#c6c6c6',\n 'editor.selectionBackground': '#264f78',\n 'editor.inactiveSelectionBackground': '#3a3d41',\n 'editor.lineHighlightBackground': '#2a2d2e',\n 'editorCursor.foreground': '#aeafad',\n 'editorIndentGuide.background1': '#404040',\n 'editorIndentGuide.activeBackground1': '#707070',\n 'editorWidget.background': '#252526',\n 'editorHoverWidget.background': '#252526',\n 'editorGutter.background': '#1e1e1e',\n 'minimap.background': '#1e1e1e',\n 'scrollbarSlider.background': '#79797966',\n 'scrollbarSlider.hoverBackground': '#646464b3',\n 'scrollbarSlider.activeBackground': '#bfbfbf66',\n}\n\nconst LIGHT_COLORS = {\n 'editor.background': '#ffffff',\n 'editor.foreground': '#1e1e1e',\n 'editorLineNumber.foreground': '#6c6c6c',\n 'editorLineNumber.activeForeground': '#171184',\n 'editor.selectionBackground': '#add6ff',\n 'editor.inactiveSelectionBackground': '#e5ebf1',\n 'editor.lineHighlightBackground': '#f0f0f0',\n 'editorCursor.foreground': '#000000',\n 'editorIndentGuide.background1': '#d3d3d3',\n 'editorIndentGuide.activeBackground1': '#939393',\n 'editorWidget.background': '#f3f3f3',\n 'editorHoverWidget.background': '#f3f3f3',\n 'editorGutter.background': '#ffffff',\n 'minimap.background': '#ffffff',\n 'scrollbarSlider.background': '#64646466',\n 'scrollbarSlider.hoverBackground': '#646464b3',\n 'scrollbarSlider.activeBackground': '#00000099',\n}\n\n/**\n * 注册 edrv 双套主题(幂等;Monaco 未加载时静默跳过)。\n * @author ddj 2026年08月28号\n * @param monaco Monaco 实例(window.monaco)\n */\nexport function registerThemes(monaco) {\n if (!monaco?.editor?.defineTheme) return\n try {\n monaco.editor.defineTheme(EDRV_DARK, {\n base: 'vs-dark',\n inherit: true,\n rules: DARK_RULES,\n colors: DARK_COLORS,\n })\n monaco.editor.defineTheme(EDRV_LIGHT, {\n base: 'vs',\n inherit: true,\n rules: LIGHT_RULES,\n colors: LIGHT_COLORS,\n })\n } catch (error) {\n /* 主题注册失败保留内置 vs */\n }\n}\n\n/**\n * 探测当前 DSH 明暗(文档根 data 主题属性 → prefers-color-scheme → 暗)。\n * @author ddj 2026年08月28号\n * @returns 'dark' | 'light'\n */\nexport function detectColorScheme() {\n try {\n const attr = document.documentElement?.getAttribute?.('data-theme')\n ?? document.body?.getAttribute?.('data-theme')\n const value = String(attr ?? '').toLowerCase()\n if (value.includes('light') || value.includes('catppuccin-latte')) return 'light'\n if (value.includes('dark') || value.includes('frappe') || value.includes('macchiato') || value.includes('mocha')) return 'dark'\n if (typeof window.matchMedia === 'function') {\n return window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark'\n }\n } catch (error) {\n /* 探测失败回落暗色 */\n }\n return 'dark'\n}\n\n/**\n * 主题名:按当前明暗返回已注册主题(未注册回落 vs)。\n * @author ddj 2026年08月28号\n * @returns 主题 id\n */\nexport function themeNameOf() {\n return detectColorScheme() === 'light' ? EDRV_LIGHT : EDRV_DARK\n}\n\n/**\n * 应用主题到 Monaco(全局切换;新建编辑器也用该主题)。\n * @author ddj 2026年08月28号\n * @param monaco Monaco 实例\n */\nexport function applyTheme(monaco) {\n if (!monaco?.editor?.setTheme) return\n try {\n monaco.editor.setTheme(themeNameOf())\n } catch (error) {\n /* setTheme 失败忽略 */\n }\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 */\nimport { applyTheme, registerThemes } from './theme.js'\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 // 工程/配置文件(拿到正确语法分色,而非 plaintext)\n csproj: 'xml', props: 'xml', targets: 'xml', plist: 'xml',\n lua51: 'lua', luac: 'lua',\n gitattributes: 'ini', editorconfig: 'ini', env: 'ini', properties: 'ini',\n json5: 'jsonc', log: 'plaintext', txt: 'plaintext',\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 // 分色主题注册 + 应用(rich token 配色,替掉内置基础 vs 的少层次着色)\n try {\n registerThemes(window.monaco)\n applyTheme(window.monaco)\n } catch (error) { /* 主题失败不阻塞编辑器 */ }\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 /** 上次已渲染的差异指纹(callId:idx@start-end:oldLen/newLen 串):内容未变时跳过重建。 */\n let lastKey = null\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 // 空渲染且无残留(5s 轮询 setRecords 常触发):无需清理时直接跳过,\n // 不打 begin 日志、不做无谓 DOM 操作;有 zone/decoration 残留时仍需走清理。\n if (!pendingRegions.length && viewZoneIds.length === 0 && decorations.length === 0) return\n const renderT0 = Date.now()\n const callIdAttr = (callId, idx) => String(callId) + ':' + String(idx)\n // 指纹相同 = 内容未变(轮询/引用空转/重复点击触发的重渲染):残留 DOM 已在位,\n // 直接跳过整轮重建(view zones 拆建 / overlay DOM / 50ms 校正),消除同区域重复渲染成本。\n const key = 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 if (key === lastKey) return\n lastKey = key\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","/**\n * dsh-vscode-mode shared — 快捷键命令目录与默认键位(双面契约)。\n * 纯数据模块:host(settings schema 默认值)与 client(执行匹配/设置页)共用。\n * 键位格式:修饰符 + 主键,`+` 连接,如 `Ctrl+Shift+F`;空串 = 未绑定。\n * 作者 ddj 2026年08月26号\n */\n\n/** 命令 id → 默认键位。命令目录以此为准,新增命令只需加一项。 */\nexport const KEYBINDING_DEFAULTS: Record<string, string> = {\n 'edrv.save': 'Ctrl+S',\n 'edrv.quickOpen': 'Ctrl+P',\n 'edrv.toggleSidebar': 'Ctrl+B',\n 'edrv.searchInFiles': 'Ctrl+Shift+F',\n}\n\n/**\n * 返回默认键位的独立副本(调用方修改不污染目录)。\n * @author ddj 2026年08月26号\n * @returns 默认键位映射\n */\nexport function defaultKeybindings(): Record<string, string> {\n return { ...KEYBINDING_DEFAULTS }\n}\n\n/**\n * 规整外部键位数据:只保留已知命令 id 且为字符串的值,未知 id 丢弃。\n * 防止用户文档/旧版本写入的未知命令污染执行匹配。\n * @author ddj 2026年08月26号\n * @param raw 原始设置值\n * @returns 规整后的键位映射(缺省项不补默认值,由调用方按需合并)\n */\nexport function normalizeKeybindings(raw: unknown): Record<string, string> {\n const out: Record<string, string> = {}\n if (!raw || typeof raw !== 'object') return out\n for (const [id, chord] of Object.entries(raw as Record<string, unknown>)) {\n if (id in KEYBINDING_DEFAULTS && typeof chord === 'string') out[id] = chord\n }\n return out\n}\n","/**\n * dsh-vscode-mode client — 快捷键配置模块(解析/匹配/状态同步)。\n * 纯逻辑(parseChord/formatChord/matchEvent/chordFromEvent/normalizeKey)不依赖 DOM,可单测;\n * 模块状态由 settings 订阅驱动(client/index.ts 调 keybindingsApply)。\n * 键位语义:Ctrl 与 Cmd 互认(延续现有 Ctrl+P/Ctrl+B 捕获行为)。\n * 作者 ddj 2026年08月26号\n */\nimport React from 'react'\nimport { KEYBINDING_DEFAULTS, normalizeKeybindings } from '../shared/keybindings.js'\n\n/** 解析后的键位(修饰符 + 规范化主键)。 */\nexport interface Binding {\n ctrl: boolean\n shift: boolean\n alt: boolean\n meta: boolean\n key: string\n}\n\n/** 命令目录(设置页展示标签;执行按目录序先匹配先执行,冲突键位确定性)。 */\nexport const COMMANDS: Array<{ id: string; label: string }> = [\n { id: 'edrv.save', label: '保存文件' },\n { id: 'edrv.quickOpen', label: '快速打开文件' },\n { id: 'edrv.toggleSidebar', label: '切换侧边栏' },\n { id: 'edrv.searchInFiles', label: '在工作区中搜索' },\n]\n\nconst MODIFIERS: Record<string, 'ctrl' | 'shift' | 'alt' | 'meta'> = {\n ctrl: 'ctrl', cmd: 'meta', meta: 'meta', shift: 'shift', alt: 'alt',\n}\n\nlet current: Record<string, string> = { ...KEYBINDING_DEFAULTS }\nlet parsed: Record<string, Binding | null> = {}\nconst listeners = new Set<() => void>()\n\n/**\n * 应用设置快照(与默认值合并;未知 id 丢弃;空对象 = 全部默认)。\n * @author ddj 2026年08月26号\n * @param raw 设置 scope 的 keybindings 字段\n */\nexport function keybindingsApply(raw: unknown): void {\n current = { ...KEYBINDING_DEFAULTS, ...normalizeKeybindings(raw) }\n parsed = {}\n for (const id of Object.keys(current)) parsed[id] = parseChord(current[id])\n for (const listener of listeners) {\n try { listener() } catch { /* 监听器异常不影响其他订阅 */ }\n }\n}\n\n/**\n * 订阅键位配置变化。\n * @author ddj 2026年08月26号\n * @param listener 变化回调\n * @returns 取消订阅函数\n */\nexport function subscribeKeybindings(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n}\n\n/**\n * 当前键位弦(未绑定/空 → null)。\n * @author ddj 2026年08月26号\n * @param id 命令 id\n * @returns 键位弦或 null\n */\nexport function chordOf(id: string): string | null {\n const chord = current[id]\n return typeof chord === 'string' && chord.trim() !== '' ? chord : null\n}\n\n/**\n * 当前命令的解析键位(未绑定/非法 → null)。\n * @author ddj 2026年08月26号\n * @param id 命令 id\n * @returns 解析键位或 null\n */\nexport function bindingOf(id: string): Binding | null {\n return parsed[id] ?? null\n}\n\n/**\n * 主键规范化:小写字母大写、空格归一为 Space,其余原样(与事件 e.key 对照)。\n * @author ddj 2026年08月26号\n * @param key 事件主键\n * @returns 规范化主键\n */\nexport function normalizeKey(key: string): string {\n const value = String(key ?? '')\n if (value === ' ') return 'Space'\n if (value.length === 1 && value >= 'a' && value <= 'z') return value.toUpperCase()\n return value\n}\n\n/**\n * 解析键位弦(如 `Ctrl+Shift+F`;纯修饰键/重复主键/空 → null)。\n * @author ddj 2026年08月26号\n * @param chord 键位弦\n * @returns 解析键位或 null\n */\nexport function parseChord(chord: string): Binding | null {\n const parts = String(chord ?? '').split('+').map((part) => part.trim()).filter(Boolean)\n if (!parts.length) return null\n const binding: Binding = { ctrl: false, shift: false, alt: false, meta: false, key: '' }\n for (const part of parts) {\n const modifier = MODIFIERS[part.toLocaleLowerCase('en-US')]\n if (modifier) {\n binding[modifier] = true\n continue\n }\n if (binding.key) return null\n binding.key = normalizeKey(part)\n }\n return binding.key ? binding : null\n}\n\n/**\n * 格式化键位(Ctrl/Cmd/Shift/Alt + 主键;meta 显示 Cmd)。\n * @author ddj 2026年08月26号\n * @param binding 解析键位\n * @returns 键位弦\n */\nexport function formatChord(binding: Binding): string {\n const parts: string[] = []\n if (binding.ctrl) parts.push('Ctrl')\n if (binding.meta) parts.push('Cmd')\n if (binding.shift) parts.push('Shift')\n if (binding.alt) parts.push('Alt')\n parts.push(binding.key)\n return parts.join('+')\n}\n\n/**\n * 事件是否命中键位(Ctrl 与 Cmd 互认)。\n * @author ddj 2026年08月26号\n * @param e 键盘事件(鸭子类型,便于单测)\n * @param binding 解析键位(null = 未绑定,永不命中)\n * @returns 是否命中\n */\nexport function matchEvent(e: { ctrlKey?: boolean; metaKey?: boolean; shiftKey?: boolean; altKey?: boolean; key?: string }, binding: Binding | null): boolean {\n if (!binding) return false\n if ((e.ctrlKey || e.metaKey) !== (binding.ctrl || binding.meta)) return false\n if (Boolean(e.shiftKey) !== binding.shift) return false\n if (Boolean(e.altKey) !== binding.alt) return false\n return normalizeKey(e.key ?? '') === binding.key\n}\n\n/**\n * 从键盘事件构造键位弦(纯修饰键 → null,供设置页录制)。\n * @author ddj 2026年08月26号\n * @param e 键盘事件\n * @returns 键位弦或 null\n */\nexport function chordFromEvent(e: { ctrlKey?: boolean; metaKey?: boolean; shiftKey?: boolean; altKey?: boolean; key?: string }): string | null {\n const key = normalizeKey(e.key ?? '')\n if (!key || key === 'Control' || key === 'Shift' || key === 'Alt' || key === 'Meta') return null\n return formatChord({ ctrl: Boolean(e.ctrlKey), shift: Boolean(e.shiftKey), alt: Boolean(e.altKey), meta: Boolean(e.metaKey), key })\n}\n\n/**\n * 键位版本 hook:配置变化时返回新版本(tooltip/占位文案随键位刷新)。\n * @author ddj 2026年08月26号\n * @returns 当前版本号\n */\nexport function useKeybindingsVersion(): number {\n const [version, setVersion] = React.useState(0)\n React.useEffect(() => subscribeKeybindings(() => setVersion((v) => v + 1)), [])\n return version\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — QuickOpen:顶部搜索框(Ctrl+P 打开文件)。\n * 快捷键随配置(edrv.quickOpen),占位文案同步当前键位。\n * 迁移自原 src/client/index.ts 的 QuickOpen,语义不改。\n * 作者 ddj 2026-08-20 / 2026-08-26\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { bindingOf, chordOf, matchEvent, useKeybindingsVersion } from '../keybindings.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 useKeybindingsVersion() // 键位变化时刷新占位文案\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 (matchEvent(e, bindingOf('edrv.quickOpen'))) {\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: '搜索文件 (' + (chordOf('edrv.quickOpen') ?? '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 — 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 — 侧边栏容器(活动栏 + 面板区 + 拖拽调宽)。\n * 面板列表来自注册表(活动栏图标/徽标/激活态),渲染当前激活面板的 render(ctx);\n * 右侧手柄拖拽调宽(clamp 180–560),底部按钮收起侧边栏。\n * 作者 ddj 2026-08-26\n */\nimport React from 'react'\nimport type { SidebarCtx } from './types.js'\n\nconst W_MIN = 180\nconst W_MAX = 560\n\n/**\n * 侧边栏容器。\n * @param props.registry 面板注册表(list() 提供面板顺序)\n * @param props.ctx 面板共享上下文\n * @param props.activePanel 当前激活面板 id\n * @param props.onActive 激活面板变化回调\n * @param props.width 面板区宽度\n * @param props.onWidth 宽度变化回调\n * @param props.onHide 收起侧边栏回调\n */\nexport function SidebarView(props) {\n const panels = props.registry?.list?.() ?? []\n const ctx = props.ctx\n const activePanel = props.activePanel\n const onActive = props.onActive\n const width = props.width\n const onWidth = props.onWidth\n const onHide = props.onHide\n\n const active = panels.find((p) => p.id === activePanel) || panels[0]\n\n const onPointerDown = (e) => {\n e.preventDefault()\n const startX = e.clientX\n const startW = width\n const onMove = (ev) => {\n const w = Math.max(W_MIN, Math.min(W_MAX, startW + (ev.clientX - startX)))\n onWidth(w)\n }\n const onUp = () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n }\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n }\n\n const rail = React.createElement('div', { className: 'edrv-rail' },\n React.createElement('div', { style: { flex: 1, display: 'flex', flexDirection: 'column', gap: 2 } },\n panels.map((p) => {\n const count = typeof p.badge === 'function' ? p.badge(ctx) : null\n return React.createElement('button', {\n key: p.id,\n className: 'edrv-rail-btn' + (active && p.id === active.id ? ' edrv-rail-on' : ''),\n title: p.title,\n onClick: () => onActive(p.id),\n },\n React.createElement('span', { className: 'edrv-rail-icon' }, p.icon),\n count > 0\n ? React.createElement('span', { className: 'edrv-rail-badge' }, String(count))\n : null)\n })),\n React.createElement('button', { className: 'edrv-rail-btn', title: '隐藏侧边栏 (Ctrl+B)', onClick: onHide }, '◀'))\n\n return React.createElement('div', { className: 'edrv-sidebar', style: { width } },\n rail,\n React.createElement('div', { className: 'edrv-side-body' },\n active ? active.render(ctx) : null),\n React.createElement('div', { className: 'edrv-side-resize', onPointerDown: onPointerDown }))\n}\n","/**\n * dsh-vscode-mode client — 会话级差异 dock store。\n * EditorView 发布当前编辑上下文,conversation.input.dock 唯一读取并渲染。\n * 作者 ddj 2026年08月26号\n */\n\n/** 差异 dock 的显示形态。 */\nexport type DiffDockMode = 'chat' | 'editor' | 'editor-empty'\n\n/**\n * 跨 slot 传递的差异 dock 快照。\n * 操作回调随快照一起更新,避免 dock 持有已卸载编辑器的旧闭包。\n */\nexport interface DiffDockSnapshot {\n mode: DiffDockMode\n [key: string]: unknown\n}\n\ntype DiffDockListener = () => void\ntype DiffDockSource = object\n\nconst values = new Map<string, DiffDockSnapshot>()\nconst sources = new Map<string, DiffDockSource>()\nconst listeners = new Map<string, Set<DiffDockListener>>()\n\n/** 通知指定会话的 dock 订阅者。 */\nfunction notifyDiff(sessionId: string): void {\n for (const listener of listeners.get(sessionId) ?? []) listener()\n}\n\n/**\n * 发布指定会话的最新编辑器差异上下文。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @param snapshot 完整 DiffBox 操作上下文\n * @param source 发布者令牌,用于卸载时防止误清理新实例\n */\nexport function publishDiffDock(sessionId: string, snapshot: DiffDockSnapshot, source?: DiffDockSource): void {\n values.set(sessionId, snapshot)\n if (source) sources.set(sessionId, source)\n else sources.delete(sessionId)\n notifyDiff(sessionId)\n}\n\n/**\n * 清除指定会话的差异上下文。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @param source 可选发布者令牌;不匹配时忽略清理\n */\nexport function clearDiffDock(sessionId: string, source?: DiffDockSource): void {\n if (source && sources.get(sessionId) !== source) return\n values.delete(sessionId)\n sources.delete(sessionId)\n notifyDiff(sessionId)\n}\n\n/**\n * 读取指定会话的最新上下文。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @returns 最新上下文或 null\n */\nexport function readDiffDock(sessionId?: string): DiffDockSnapshot | null {\n if (!sessionId) return null\n return values.get(sessionId) ?? null\n}\n\n/**\n * 订阅指定会话的上下文变化。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @param listener 变化回调\n * @returns 取消订阅函数\n */\nexport function subscribeDiffDock(sessionId: string, listener: DiffDockListener): () => void {\n let bucket = listeners.get(sessionId)\n if (!bucket) {\n bucket = new Set()\n listeners.set(sessionId, bucket)\n }\n bucket.add(listener)\n return () => {\n bucket!.delete(listener)\n if (!bucket!.size) listeners.delete(sessionId)\n }\n}\n","/**\n * dsh-vscode-mode client — 对话差异 dock 纯函数。\n * 只负责差异文件轮转和文案,状态查询仍由组件复用现有 edrv.list/summarize。\n * 作者 ddj 2026-08-26\n */\n\n/**\n * 从稳定差异文件列表中取下一个路径,并返回下一次索引。\n * @author ddj 2026年08月26号\n * @param paths 待处理差异文件路径\n * @param index 当前轮转索引\n * @returns 下一个路径与归一化后的下一索引\n */\nexport function nextDiffPath(paths: string[], index: number): { path: string | null; index: number } {\n if (!paths.length) return { path: null, index: 0 }\n const current = Number.isFinite(index) ? Math.max(0, Math.floor(index)) : 0\n const at = current % paths.length\n return { path: paths[at] ?? null, index: (at + 1) % paths.length }\n}\n\n/**\n * 生成对话差异 dock 的单按钮文案。\n * @author ddj 2026年08月26号\n * @param count 待处理差异文件数量\n * @returns 展示文案\n */\nexport function diffDockText(count: number): string {\n return '差异 ' + Math.max(0, Math.floor(count)) + ' 个文件 · 查看下一个'\n}\n\n/**\n * 根据活动文件决定编辑页 dock 形态,加载期间保持 editor 结构稳定。\n * @author ddj 2026年08月26号\n * @param activePath 当前活动文件路径\n * @returns 编辑态或无文件空态\n */\nexport function editorDockMode(activePath: string | null | undefined): 'editor' | 'editor-empty' {\n return activePath ? 'editor' : 'editor-empty'\n}\n\n/**\n * 获取切换文件期间稳定展示的文件内差异数量。\n * @author ddj 2026年08月26号\n * @param ready 当前文件内容是否已加载完成\n * @param actualTotal 内容就绪后的精确差异数\n * @param fallbackTotal 内容加载期间的文件摘要差异数\n * @returns 非负整数差异数\n */\nexport function displayDiffTotal(ready: boolean, actualTotal: number, fallbackTotal: number): number {\n const value = ready ? actualTotal : fallbackTotal\n return Number.isFinite(value) ? Math.max(0, Math.floor(value)) : 0\n}\n","/**\n * dsh-vscode-mode client — 编辑区与原生 composer 的几何边界计算。\n * @author ddj 2026年08月26号\n */\n\n/**\n * 计算编辑根节点在当前会话滚动区内、composer 上方可使用的高度。\n * @author ddj 2026年08月26号\n * @param rootTop 编辑根节点顶边\n * @param scrollBottom 会话滚动区可视底边\n * @param composerTop composer 顶边;缺失时回退滚动区底边\n * @returns 非负可用高度\n */\nexport function editorHeight(rootTop: number, scrollBottom: number, composerTop?: number): number {\n const root = Number.isFinite(rootTop) ? rootTop : 0\n const scroll = Number.isFinite(scrollBottom) ? scrollBottom : root\n const composer = Number.isFinite(composerTop) ? composerTop as number : scroll\n return Math.max(0, Math.min(scroll, composer) - root)\n}\n","/**\n * dsh-vscode-mode client — 「在文件浏览器中打开」RPC 包装(树菜单与 Monaco 右键共用)。\n * 归一化为 { ok, error? },不抛异常;无会话/异常降级返回错误文案。\n * 作者 ddj 2026-08-27\n */\nimport { rpc } from './rpc.js'\n\nexport interface RevealOutcome {\n ok: boolean\n error?: string\n}\n\n/**\n * 请求 host 在 OS 文件浏览器中打开/定位路径。\n * @author ddj 2026年08月27号\n * @param sessionId 会话 id(可空)\n * @param path 工作区相对路径('' = 根目录)\n * @returns 成功或失败原因\n */\nexport async function revealInExplorer(sessionId: string | undefined, path: string): Promise<RevealOutcome> {\n if (!sessionId) return { ok: false, error: '无活动会话' }\n try {\n const res = await rpc('edrv.revealInExplorer', { sessionId, path })\n return res.ok ? { ok: true } : { ok: false, error: res.error }\n } catch (error) {\n return { ok: false, error: '打开异常:' + String(error) }\n }\n}\n","/**\n * dsh-vscode-mode client — 浏览器端缓存键/路径统一出口(PathConst)。\n * 统一 localStorage 键前缀(各缓存模块/编辑区/搜索面板共用),避免内联散落;\n * 键带 schema 版本号,未来版本递增时经 sweepLegacyKeys 自动清旧。\n * 浏览器不涉 ~/.dsh 文件系统,这里只管键名 + shared 路由常量。\n * 作者 ddj 2026-09-01\n */\n\n/** localStorage 键前缀表(按功能隔离;均按会话拼接)。 */\nexport const CACHE_KEY = {\n /** 展开状态(explorerCache v1,当前使用)。 */\n expanded: 'edrv.cache.explorer.v1.',\n /** 目录条目 SWR 缓存(explorerEntriesCache v2,当前使用)。 */\n entries: 'edrv.cache.entries.v2.',\n /** 编辑区视图状态(viewStateCache v1)。 */\n viewstate: 'edrv.cache.viewstate.v1.',\n /** 编辑器页签/活动文件(EditorView v2)。 */\n editor: 'edrv.editor.v2.',\n /** 侧边栏状态(EditorView;按布局 side/central 追加段)。 */\n sidebar: 'edrv.sidebar.',\n /** 搜索面板条件(SearchPanel v1)。 */\n search: 'edrv.search.v1.',\n /** 侧边栏提示已关闭标记(全局,无会话)。 */\n sideHint: 'edrv.side-hint-dismissed',\n /** 「性能优化」页工作区栏目展开状态(workspaceFoldCache v1,全局不按会话)。 */\n workspaceFold: 'edrv.ws-fold.v1.',\n} as const\n\n/** 按前缀拼会话键(侧边栏/编辑器等需要布局段时自行拼接后传入)。 */\nexport function cacheKey(prefix: string, sessionId: string): string {\n return prefix + sessionId\n}\n\n/** 旧版本键清理入口:未来前缀版本递增时在此登记旧前缀并清空(当前无实际旧键)。 */\nexport function sweepLegacyKeys(): void {\n // 例:entries v2 取代 v1 时 → localStorage.removeItem('edrv.cache.entries.v1.' + sid)\n // 当前各功能均为现役版本,无待清旧键。\n}\n","/**\n * dsh-vscode-mode client — 编辑器视图状态持久化(纯函数,可单测)。\n * 对齐 VSCode workbench.editor.restoreViewState:恢复每个文件的光标/滚动/折叠位置。\n * 视图状态 = Monaco editor.saveViewState() 返回值(JSON 可序列化),按 path 存储。\n * 键前缀统一走 paths.ts PathConst(CACHE_KEY.viewstate)。\n * 作者 ddj 2026-08-28\n */\nimport { CACHE_KEY } from '../paths.js'\n\n/** localStorage 键前缀(按会话隔离)。 */\nconst KEY_PREFIX = CACHE_KEY.viewstate\n\n/** 视图状态条目容量上限。 */\nexport const VIEWSTATE_CAP = 50\n\n/** 视图状态序列化体积上限(单条目,防止超大选区/折叠数据撑爆配额)。 */\nexport const VIEWSTATE_BYTES_CAP = 64 * 1024\n\n/**\n * 判断对象是否为合法的 Monaco view state(保守形状校验,非深校验)。\n * @author ddj 2026年08月28号\n * @param value 待校验对象\n * @returns 是否可接受\n */\nexport function isViewStateLike(value: unknown): boolean {\n if (!value || typeof value !== 'object') return false\n const v = value as Record<string, unknown>\n // 至少含光标状态与视口滚动信息之一;无内容时拒绝(空对象无恢复价值)\n return Array.isArray(v.cursorState) || typeof v.viewState === 'object'\n || Array.isArray(v.contributionsState)\n}\n\n/**\n * 序列化视图状态映射(path → viewState)。\n * @author ddj 2026年08月28号\n * @param states path → viewState 映射\n * @returns JSON 字符串\n */\nexport function serializeViewStates(states: Record<string, unknown>): string {\n return JSON.stringify({ v: 1, states })\n}\n\n/**\n * 解析视图状态文本;损坏/格式不符 → null。\n * @author ddj 2026年08月28号\n * @param text localStorage 原文\n * @returns path → viewState 映射,非法返回 null\n */\nexport function parseViewStates(text: string | null): Record<string, unknown> | null {\n if (!text) return null\n try {\n const data = JSON.parse(text)\n if (!data || typeof data !== 'object') return null\n const states = (data as Record<string, unknown>).states\n if (!states || typeof states !== 'object' || Array.isArray(states)) return null\n const out: Record<string, unknown> = {}\n for (const [path, state] of Object.entries(states)) {\n if (typeof path !== 'string' || !path) continue\n if (!isViewStateLike(state)) continue\n out[path] = state\n }\n return out\n } catch (error) {\n return null\n }\n}\n\n/**\n * 把新视图状态并入既有映射:同 path 覆盖、按写入顺序裁剪到容量上限。\n * @author ddj 2026年08月28号\n * @param states 既有映射\n * @param path 文件路径\n * @param state 视图状态\n * @returns 新映射(容量裁剪后)\n */\nexport function upsertViewState(\n states: Record<string, unknown>,\n path: string,\n state: unknown,\n): Record<string, unknown> {\n if (!path || !isViewStateLike(state)) return states\n try {\n if (JSON.stringify(state).length > VIEWSTATE_BYTES_CAP) return states\n } catch (error) {\n return states\n }\n const next = Object.assign({}, states)\n delete next[path] // 先删后加,保证该 path 排到最末(近似 LRU:最新写入)\n next[path] = state\n const keys = Object.keys(next)\n if (keys.length > VIEWSTATE_CAP) {\n for (const k of keys.slice(0, keys.length - VIEWSTATE_CAP)) delete next[k]\n }\n return next\n}\n\n/**\n * 读取某会话的视图状态缓存(localStorage 不可用 → 空映射)。\n * @author ddj 2026年08月28号\n * @param sessionId 会话 id\n * @returns path → viewState 映射\n */\nexport function viewStatesLoad(sessionId: string): Record<string, unknown> {\n try {\n return parseViewStates(window.localStorage.getItem(KEY_PREFIX + String(sessionId))) ?? {}\n } catch (error) {\n return {}\n }\n}\n\n/**\n * 写入某会话的视图状态缓存(损坏/配额满 → 忽略)。\n * @author ddj 2026年08月28号\n * @param sessionId 会话 id\n * @param states path → viewState 映射\n */\nexport function viewStatesSave(sessionId: string, states: Record<string, unknown>): void {\n try {\n window.localStorage.setItem(KEY_PREFIX + String(sessionId), serializeViewStates(states))\n } catch (error) { /* 配额满/隐私模式忽略 */ }\n}\n","/**\n * dsh-vscode-mode shared — 语言服务器 RPC 契约(双面,禁 node/react)。\n * LSP 请求/响应的 JSON 载荷形状 + 纯函数辅助(Monaco↔LSP 坐标换算等)。\n * 只描述\"过 RPC 的载荷\",宿主与语言服务器之间的帧级交互在 host 侧 src/lsp/ 内。\n * 作者 ddj 2026-08-27\n */\n\n/** LSP Position(0-based:line 行号从 0,character UTF-16 列从 0)。 */\nexport interface LspPosition {\n line: number\n character: number\n}\n\n/** LSP Range(start/end 均 0-based,包含 start、排除 end)。 */\nexport interface LspRange {\n start: LspPosition\n end: LspPosition\n}\n\n/** LSP Location:uri 为 file:// 绝对路径;root 用于还原为工作区相对路径。 */\nexport interface LspLocation {\n uri: string\n range: LspRange\n root?: string\n}\n\n/** 跳转结果(definition 常返回 LocationLink,归一化为 targetUri + targetRange + 可选 originSelectionRange)。 */\nexport interface LspLocationLink {\n targetUri: string\n targetRange: LspRange\n targetSelectionRange: LspRange\n originSelectionRange?: LspRange\n}\n\n/** 归一化后的符号(documentSymbol/workspaceSymbol 统一形状)。kind 为 LSP SymbolKind 数值。 */\nexport interface LspSymbol {\n name: string\n kind: number\n range: LspRange\n selectionRange: LspRange\n detail?: string\n containerName?: string\n children?: LspSymbol[]\n}\n\n/** hover 内容(markdown/纯文本行数组)。 */\nexport interface LspHover {\n contents: string[]\n range?: LspRange\n}\n\n/** LSP semantic token 标准类型(host 归一化后,client 与 Monaco 共用)。 */\nexport const LSP_SEMANTIC_TOKEN_TYPES = [\n 'namespace', 'type', 'class', 'enum', 'interface', 'struct', 'typeParameter',\n 'parameter', 'variable', 'property', 'enumMember', 'event', 'function', 'method',\n 'macro', 'label', 'comment', 'string', 'keyword', 'number', 'regexp', 'operator',\n 'decorator',\n] as const\n\n/** LSP semantic token 标准修饰符(host 归一化后,client 与 Monaco 共用)。 */\nexport const LSP_SEMANTIC_TOKEN_MODIFIERS = [\n 'declaration', 'definition', 'readonly', 'static', 'deprecated', 'abstract',\n 'async', 'modification', 'documentation', 'defaultLibrary', 'global', 'local', 'mutable',\n] as const\n\n/** 归一化后的 LSP semanticTokens/full 结果(data 使用 LSP delta 编码)。 */\nexport interface LspSemanticTokens {\n data: number[]\n resultId?: string\n}\n\n/** LSP 服务器能力子集:本插件会用到的方法。 */\nexport interface LspServerCapabilities {\n definition: boolean\n references: boolean\n documentSymbol: boolean\n workspaceSymbol: boolean\n hover: boolean\n semanticTokens: boolean\n semanticTokenTypes?: string[]\n semanticTokenModifiers?: string[]\n}\n\n/** 服务器进程/会话状态。 */\nexport type LspServerPhase =\n | 'idle' // 未启动(惰性)\n | 'starting' // 启动中(initialize 握手)\n | 'ready' // 就绪\n | 'indexing' // 工作区索引中\n | 'unavailable' // 连续失败,停止自动重启\n | 'stopped' // 已停止(禁用/卸载/会话结束)\n\n/** 单语言服务器状态(edrv.lsp.status 载荷元素)。 */\nexport interface LspServerStatus {\n languageId: string\n source: 'extension' | 'discover' | 'manual' | 'none'\n phase: LspServerPhase\n version?: string\n reason?: string // unavailable/不可用原因(缺 dotnet、找不到服务器等)\n progress?: number // LSP 工作区解析进度(0–100,未知时省略)\n progressMessage?: string\n root?: string // 绑定工作区根(相对显示)\n providerName?: string // provider 名称(如 EmmyLua / LuaLS)\n}\n\n/**\n * Monaco 位置(1-based lineNumber/column)→ LSP Position(0-based)。\n * @author ddj 2026年08月27号\n * @param lineNumber Monaco 行(≥1)\n * @param column Monaco 列(≥1)\n * @returns LSP 0-based position\n */\nexport function monoToLsp(lineNumber: number, column: number): LspPosition {\n return { line: Math.max(0, lineNumber - 1), character: Math.max(0, column - 1) }\n}\n\n/**\n * LSP Position(0-based)→ Monaco 位置(1-based)。\n * @author ddj 2026年08月27号\n * @param pos LSP position\n * @returns { lineNumber, column }(均 ≥1)\n */\nexport function lspToMono(pos: LspPosition): { lineNumber: number; column: number } {\n return { lineNumber: Math.max(1, pos.line + 1), column: Math.max(1, pos.character + 1) }\n}\n\n/** file:// URI → 路径(仅做规范化解码;Windows file:///C:/... 保留)。 */\nexport function fileUriToPath(uri: string): string {\n if (!uri) return ''\n const rest = uri.replace(/^file:\\/\\//, '')\n const decoded = decodeURIComponent(rest)\n return decoded.replace(/^\\/([A-Za-z]:)/, '$1') // file:///C:/x → C:/x\n}\n\n/** 已装扩展信息(edrv.lsp.ext.list 载荷元素)。 */\nexport interface LspExtInfo {\n id: string // publisher.name\n namespace: string\n name: string\n version: string\n displayName?: string\n description?: string\n}\n\n/** Open VSX 市场搜索结果项(edrv.lsp.ext.market 载荷元素)。 */\nexport interface LspMarketItem {\n namespace: string\n name: string\n id: string\n version: string\n displayName?: string\n description?: string\n download?: string\n}\n\n/** 有更新的已装扩展(edrv.lsp.ext.updates 载荷元素)。 */\nexport interface LspExtUpdate {\n id: string\n current: string\n latest: string\n displayName?: string\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — LSP 会话与文档同步(模块级单例)。\n * 跟踪当前会话 + Monaco 打开文档(model 事件驱动),去抖推送 edrv.lsp.sync;\n * 并提供 definition/references/documentSymbol/hover/status 的 RPC 薄封装。\n * 作者 ddj 2026-08-27\n */\nimport { rpc } from '../../rpc.js'\nimport { monoToLsp } from '../../../shared/lsp.js'\n\n/** edrv:// 模型 URI → 工作区相对/绝对路径(与 host 侧 path 对齐)。 */\nexport function pathOfModel(model) {\n if (!model || !model.uri) return null\n const uri = model.uri\n if (uri.scheme !== 'edrv') return null\n const raw = uri.path ?? ''\n try {\n const decoded = decodeURIComponent(String(raw).replace(/^\\//, ''))\n return decoded || null\n } catch (error) {\n return String(raw).replace(/^\\//, '') || null\n }\n}\n\nconst SYNC_DEBOUNCE_MS = 250\n\nlet sessionId\nconst syncTimers = new Map()\nlet statusCache = { servers: [], at: 0 }\nlet progressListeners = new Set()\nlet ready = false\n\n/** 设置当前会话(切换会话时清理旧文档跟踪由 host 端 session/disposed 兜底)。 */\nexport function setLspSession(id) {\n if (sessionId === id) return\n sessionId = id\n void refreshStatus()\n}\n\nexport function lspSessionId() {\n return sessionId\n}\n\n/** 订阅 LSP 状态变化(服务器进度/启动状态)。 */\nexport function onLspProgress(listener) {\n if (typeof listener !== 'function') return () => {}\n progressListeners.add(listener)\n return () => progressListeners.delete(listener)\n}\n\n/** 发布当前 server 状态给编辑器底部状态区。 */\nfunction publishProgress() {\n for (const listener of progressListeners) {\n try { listener(statusCache.servers) } catch (error) { /* UI listener failure ignored */ }\n }\n}\n\n/** 立即同步某文档到 host(首次打开/查询前保证服务器已认识该文档)。 */\nexport async function syncDoc(path, text, immediate = false) {\n if (!path || typeof text !== 'string') return\n if (immediate) {\n clearPending(path)\n await rpc('edrv.lsp.sync', { sessionId, path, text, version: Date.now() }).catch(() => {})\n return\n }\n clearPending(path)\n syncTimers.set(path, setTimeout(() => {\n syncTimers.delete(path)\n rpc('edrv.lsp.sync', { sessionId, path, text, version: Date.now() }).catch(() => {})\n }, SYNC_DEBOUNCE_MS))\n}\n\nfunction clearPending(path) {\n const timer = syncTimers.get(path)\n if (timer) { clearTimeout(timer); syncTimers.delete(path) }\n}\n\n/** 文档关闭:停止去抖并通知 host。 */\nexport function closeDoc(path) {\n clearPending(path)\n void rpc('edrv.lsp.close', { sessionId, path }).catch(() => {})\n}\n\n/** 立即推送 + 查询定义;返回 [{ uri, range }](uri 已转 edrv://)。 */\nexport async function findDefinition(path, text, position) {\n await syncDoc(path, text, true)\n const res = await rpc('edrv.lsp.definition', { sessionId, path, position: monoToLsp(position.lineNumber, position.column) }).catch(() => null)\n if (!res || !res.ok || !Array.isArray(res.locations)) return []\n return res.locations.map(toClientLocation)\n}\n\n/** 立即推送 + 查询引用。 */\nexport async function findReferences(path, text, position, includeDeclaration = false) {\n await syncDoc(path, text, true)\n const res = await rpc('edrv.lsp.references', { sessionId, path, position: monoToLsp(position.lineNumber, position.column), includeDeclaration }).catch(() => null)\n if (!res || !res.ok || !Array.isArray(res.locations)) return []\n return res.locations.map(toClientLocation)\n}\n\n/** 查询大纲符号(documentSymbol)。 */\nexport async function fetchDocumentSymbols(path, text) {\n await syncDoc(path, text, true)\n const res = await rpc('edrv.lsp.documentSymbol', { sessionId, path }).catch(() => null)\n if (!res || !res.ok || !Array.isArray(res.symbols)) return []\n return res.symbols\n}\n\n/** 查询 hover 内容。 */\nexport async function fetchHover(path, text, position) {\n await syncDoc(path, text, true)\n const res = await rpc('edrv.lsp.hover', { sessionId, path, position: monoToLsp(position.lineNumber, position.column) }).catch(() => null)\n if (!res || !res.ok) return null\n return res.hover || null\n}\n\n/** 查询当前文档的 semantic tokens(host 已归一化 legend 与 delta data)。 */\nexport async function fetchSemanticTokens(path, text) {\n await syncDoc(path, text, true)\n const res = await rpc('edrv.lsp.semanticTokens', { sessionId, path }).catch(() => null)\n if (!res || !res.ok || !res.tokens || !Array.isArray(res.tokens.data)) return null\n return res.tokens\n}\n\n/** 拉取服务器状态(带 5s 缓存)。 */\nexport async function refreshStatus(force = false) {\n if (!force && Date.now() - statusCache.at < 1500) return statusCache.servers\n const res = await rpc('edrv.lsp.status', { sessionId }).catch(() => null)\n const servers = res && res.ok && Array.isArray(res.servers) ? res.servers : []\n statusCache = { servers, at: Date.now() }\n ready = true\n publishProgress()\n return servers\n}\n\nexport function lspReady() {\n return ready\n}\n\n/** 当前会话某语言服务器状态(就绪/索引中/不可用)。 */\nexport function lspStatusFor(languageId) {\n const servers = statusCache.servers\n const match = servers.find((s) => s.languageId === languageId && s.root)\n return match || servers.find((s) => s.languageId === languageId)\n}\n\n/** file:// 或已转 edrv:// 的 LSP location → Monaco Location(edrv:// uri + 1-based range)。 */\nfunction toClientLocation(loc) {\n const range = loc.range || {}\n const start = range.start || {}\n const end = range.end || {}\n return {\n uri: window.monaco.Uri.parse(toEdrvUri(loc.uri, loc.root)),\n range: new window.monaco.Range(\n Math.max(1, (start.line ?? 0) + 1),\n Math.max(1, (start.character ?? 0) + 1),\n Math.max(1, (end.line ?? 0) + 1),\n Math.max(1, (end.character ?? 0) + 1),\n ),\n // 保留原始 LSP uri/root:后续跳转不能把 Monaco edrv Uri 当作磁盘路径\n lspUri: loc.uri,\n lspRoot: loc.root,\n lspRange: loc.range,\n }\n}\n\n/** file:// URI(或裸路径)→ edrv:// 相对路径(去掉盘符/根,与编辑器模型路径一致)。 */\nexport function toEdrvUri(uri, root) {\n if (!uri) return ''\n if (uri.startsWith('edrv://')) return uri\n const path = relativeLspPath(uri, root)\n return 'edrv:///' + encodeURI(path)\n}\n\n/** 将 LSP 目标解析为当前工作区相对路径(跨文件跳转与 model URI 对齐)。 */\nexport function targetOpenPath(loc) {\n return relativeLspPath(loc?.lspUri ?? loc?.uri, loc?.lspRoot ?? loc?.root)\n}\n\n/**\n * 归一化 Location 的 uri → 工作区路径(剥离 scheme,不补盘符)。\n * 三种输入形态(缺一即导致 scheme 泄漏进文件路径 → 跳转\"文件不存在\"):\n * - Monaco Uri 对象(toClientLocation 产物,scheme=edrv)→ 取 .path(已是工作区相对路径)\n * - 'edrv:///x' 字符串 → 取路径部分\n * - 'file:///D:/x' → 去 authority 空段保留盘符\n * @author ddj 2026年08月28号\n * @param uri Monaco Uri 对象 / file:// 或 edrv:// URI / 裸路径\n * @returns / 分隔的路径(edrv 相对路径 或 带盘符绝对路径)\n */\nexport function lspUriToAbs(uri) {\n if (!uri) return ''\n const isObject = typeof uri === 'object'\n // Monaco Uri 对象:优先取其 path(已剥离 scheme)\n const raw = isObject && typeof uri.path === 'string' ? uri.path : String(uri)\n let path = raw\n if (path.startsWith('file://')) {\n try { path = decodeURIComponent(path.replace(/^file:\\/\\/\\/?/, '')) } catch (error) { path = path.replace(/^file:\\/\\/\\/?/, '') }\n // file:///D:/x → D:/x(去 authority 空段保留盘符);/home/x 保留前导 /(Unix 绝对路径)\n return path.replace(/\\\\/g, '/').replace(/^\\/([A-Za-z]:)/, '$1')\n }\n if (path.startsWith('edrv://')) {\n try { path = decodeURIComponent(path.replace(/^edrv:\\/\\/\\/?/, '')) } catch (error) { path = path.replace(/^edrv:\\/\\/\\/?/, '') }\n }\n // edrv Uri(对象或字符串)→ 工作区相对路径:必须剥前导 /,否则 host 按绝对路径解析丢 cwd\n if (isObject ? uri.scheme === 'edrv' : raw.startsWith('edrv://')) {\n return path.replace(/\\\\/g, '/').replace(/^\\/+/, '')\n }\n return path.replace(/\\\\/g, '/').replace(/^\\/([A-Za-z]:)/, '$1')\n}\n\n/**\n * file URI/裸路径 → root 下的 / 分隔相对路径。\n * root 匹配返回工作区相对路径;root 不匹配返回完整绝对路径(保留盘符),\n * 供 edrv.read 按绝对路径解析(原先错误剥掉首个 / 导致跳转\"文件不存在\")。\n * @author ddj 2026年08月28号\n * @param uri file:// URI 或裸路径\n * @param root 工作区根(可选)\n * @returns 可 edrv.read 的路径\n */\nfunction relativeLspPath(uri, root) {\n if (!uri) return ''\n const path = lspUriToAbs(uri)\n const normalizedRoot = root ? String(root).replace(/\\\\/g, '/').replace(/^\\/([A-Za-z]:)/, '$1').replace(/\\/+$/, '') : ''\n const lowerPath = path.toLowerCase()\n const lowerRoot = normalizedRoot.toLowerCase()\n if (normalizedRoot && (lowerPath === lowerRoot || lowerPath.startsWith(lowerRoot + '/'))) {\n return path.slice(normalizedRoot.length).replace(/^\\/+/, '')\n }\n return path\n}\n\n/** 目标行/列(0-based LSP → 1-based Monaco)。 */\nexport function targetMonoPosition(loc) {\n // 优先使用原始 LSP range(0-based);无原始值时兼容 Monaco Range(1-based)\n const lspRange = loc?.lspRange\n if (lspRange?.start) {\n return {\n line: Math.max(1, (lspRange.start.line ?? 0) + 1),\n column: Math.max(1, (lspRange.start.character ?? 0) + 1),\n }\n }\n const range = loc?.range ?? {}\n return {\n line: Math.max(1, range.startLineNumber ?? 1),\n column: Math.max(1, range.startColumn ?? 1),\n }\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — Monaco LSP provider 注册 + 跳转/引用命令。\n * 数据层:Definition/Reference/DocumentSymbol/Hover provider(同一文件内跳转 Monaco 原生可用)。\n * 交互层:edrv.goToDefinition(F12)/ edrv.findReferences(Shift+F12 / 右键),跨文件跳转自研\n * (target 经 openFileAt 打开并定位),引用结果用轻量浮动面板展示(点击跳转)。\n * 作者 ddj 2026-08-27\n */\nimport {\n pathOfModel, syncDoc, closeDoc, findDefinition, findReferences,\n fetchDocumentSymbols, fetchHover, fetchSemanticTokens,\n targetOpenPath, targetMonoPosition, lspStatusFor, refreshStatus,\n} from './lspClient.js'\nimport { LSP_SEMANTIC_TOKEN_MODIFIERS, LSP_SEMANTIC_TOKEN_TYPES } from '../../../shared/lsp.js'\n\nconst LSP_LANGS = ['lua', 'csharp']\nconst SEMANTIC_LEGEND = {\n tokenTypes: [...LSP_SEMANTIC_TOKEN_TYPES],\n tokenModifiers: [...LSP_SEMANTIC_TOKEN_MODIFIERS],\n}\nlet registered = false\nconst disposables = []\nlet overlayEl = null\n\n/** 目标文件打开并定位(复用现有 openFileAt 的 edrv:open-editor 事件通道)。 */\nfunction openAt(path, line, column) {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path, line, column } }))\n}\n\nfunction jumpToLocation(loc) {\n const path = targetOpenPath(loc)\n const pos = targetMonoPosition(loc)\n openAt(path, pos.line, pos.column)\n}\n\n/** 注册全部 Monaco LSP provider 与文档跟踪(幂等)。 */\nexport function registerLspProviders(monaco) {\n if (registered) return\n registered = true\n\n // —— 文档跟踪:model 生命周期 → host 文档同步(含未保存编辑)——\n const attachModel = (model) => {\n if (!model || model.uri.scheme !== 'edrv') return\n const path = pathOfModel(model)\n if (!path) return\n const contentDisposer = model.onDidChangeContent(() => syncDoc(path, model.getValue()))\n const disposeDisposer = model.onWillDispose(() => {\n closeDoc(path)\n contentDisposer.dispose()\n })\n disposables.push(contentDisposer, disposeDisposer)\n syncDoc(path, model.getValue(), true)\n }\n disposables.push(monaco.editor.onDidCreateModel(attachModel))\n for (const model of monaco.editor.getModels()) attachModel(model)\n\n // —— 重新检测事件:保存配置/切换启用/手动重检测后,把已打开模型重新同步给 host ——\n // (host 已重置该语言 server,下一次 sync 会按最新配置重新 acquire,无需重开文件)\n const onRedetect = (event) => {\n const languageId = event?.detail?.languageId\n if (!languageId) return\n for (const model of monaco.editor.getModels()) {\n const path = pathOfModel(model)\n if (!path) continue\n if (model.getLanguageId && model.getLanguageId() !== languageId) continue\n void syncDoc(path, model.getValue(), true)\n }\n void refreshStatus(true)\n }\n window.addEventListener('edrv:lsp-redetect', onRedetect)\n disposables.push(() => window.removeEventListener('edrv:lsp-redetect', onRedetect))\n\n // —— 数据 provider ——\n disposables.push(\n monaco.languages.registerDefinitionProvider(LSP_LANGS, {\n provideDefinition: (model, position, token) => {\n const path = pathOfModel(model)\n if (!path) return []\n return findDefinition(path, model.getValue(), position)\n },\n }),\n monaco.languages.registerReferenceProvider(LSP_LANGS, {\n provideReferences: (model, position, context, token) => {\n const path = pathOfModel(model)\n if (!path) return []\n return findReferences(path, model.getValue(), position, Boolean(context?.includeDeclaration))\n },\n }),\n monaco.languages.registerDocumentSymbolProvider(LSP_LANGS, {\n provideDocumentSymbols: async (model, token) => {\n const path = pathOfModel(model)\n if (!path) return []\n const symbols = await fetchDocumentSymbols(path, model.getValue())\n return symbols.map(toMonacoSymbol)\n },\n }),\n monaco.languages.registerHoverProvider(LSP_LANGS, {\n provideHover: async (model, position, token) => {\n const path = pathOfModel(model)\n if (!path) return null\n const hover = await fetchHover(path, model.getValue(), position)\n if (!hover || !hover.contents || !hover.contents.length) return null\n const range = hover.range\n ? new monaco.Range(hover.range.start.line + 1, hover.range.start.character + 1, hover.range.end.line + 1, hover.range.end.character + 1)\n : null\n return {\n contents: hover.contents.map((text) => ({ value: text })),\n range: range || undefined,\n }\n },\n }),\n monaco.languages.registerDocumentSemanticTokensProvider(LSP_LANGS, {\n getLegend: () => SEMANTIC_LEGEND,\n provideDocumentSemanticTokens: async (model, token) => {\n const path = pathOfModel(model)\n if (!path || token?.isCancellationRequested) return { data: new Uint32Array() }\n const result = await fetchSemanticTokens(path, model.getValue())\n if (!result || token?.isCancellationRequested) return { data: new Uint32Array() }\n return { data: Uint32Array.from(result.data) }\n },\n releaseDocumentSemanticTokens: () => {},\n }),\n )\n}\n\n/** LSP SymbolInfo(host 归一化后)→ Monaco DocumentSymbol。 */\nfunction toMonacoSymbol(symbol) {\n const range = symbol.range || {}\n const sel = symbol.selectionRange || range\n const s = (p) => ({ lineNumber: Math.max(1, (p.line ?? 0) + 1), column: Math.max(1, (p.character ?? 0) + 1) })\n const out = {\n name: symbol.name,\n detail: symbol.detail || '',\n kind: symbol.kind ?? 0,\n tags: [],\n range: new window.monaco.Range(s(range.start).lineNumber, s(range.start).column, s(range.end).lineNumber, s(range.end).column),\n selectionRange: new window.monaco.Range(s(sel.start).lineNumber, s(sel.start).column, s(sel.end).lineNumber, s(sel.end).column),\n }\n if (Array.isArray(symbol.children) && symbol.children.length) {\n out.children = symbol.children.map(toMonacoSymbol)\n }\n return out\n}\n\n/** 定义查询并跳转;nativeReveal 仅供 F12 保留 Monaco 原生 reveal。 */\nasync function goToDefinition(ed, position, nativeReveal = false) {\n const model = ed.getModel()\n const path = pathOfModel(model)\n if (!path || !position) return\n const locations = await findDefinition(path, model.getValue(), position)\n if (!locations.length) {\n setStatus('未找到定义')\n return\n }\n const first = locations[0]\n if (nativeReveal && targetOpenPath(first) === path) {\n const action = ed.getAction('editor.action.revealDefinition')\n if (action) {\n await action.run()\n return\n }\n }\n jumpToLocation(first)\n}\n\n/** F12 / 右键「转到定义」:查询定义并跳转(首个目标)。 */\nexport async function runGoToDefinition(ed) {\n await goToDefinition(ed, ed.getPosition(), true)\n}\n\n/** Ctrl+鼠标点击定义:使用点击位置查询,避免依赖当前光标位置。 */\nexport async function gotoDefinitionAt(ed, position) {\n await goToDefinition(ed, position)\n}\n\n/** 给一个 Monaco 编辑器绑定 Ctrl/Cmd+鼠标定义跳转(幂等)。 */\nexport function bindLspEditor(ed) {\n if (!ed || ed.__edrvLspClick) return\n ed.__edrvLspClick = true\n const disposable = ed.onMouseDown((event) => {\n const native = event?.event\n const position = event?.target?.position\n const button = native?.button ?? event?.button\n const ctrl = native?.ctrlKey ?? event?.ctrlKey\n const meta = native?.metaKey ?? event?.metaKey\n const isLeftButton = button === 0 || native?.leftButton === true\n if (!native || !position || !isLeftButton || (!ctrl && !meta)) return\n native.preventDefault?.()\n native.stopPropagation?.()\n void gotoDefinitionAt(ed, position)\n })\n disposables.push(disposable)\n}\n\n/** Shift+F12 / 右键「查找所有引用」:查询引用并展示浮动面板。 */\nexport async function runFindReferences(ed) {\n const model = ed.getModel()\n const path = pathOfModel(model)\n const position = ed.getPosition()\n if (!path || !position) return\n const locations = await findReferences(path, model.getValue(), position, false)\n showReferencesOverlay(ed, path, position, locations)\n}\n\n/** 引用结果浮动面板(轻量 DOM,点击跳转;Esc/失焦关闭)。 */\nfunction showReferencesOverlay(ed, path, position, locations) {\n hideReferencesOverlay()\n if (!locations.length) {\n setStatus('未找到引用')\n return\n }\n const root = ed.getDomNode()\n if (!root) return\n const el = document.createElement('div')\n el.className = 'edrv-refs'\n const header = document.createElement('div')\n header.className = 'edrv-refs-head'\n header.textContent = '引用 ' + locations.length + ' 处'\n el.appendChild(header)\n const list = document.createElement('div')\n list.className = 'edrv-refs-list'\n for (const loc of locations) {\n const row = document.createElement('div')\n row.className = 'edrv-refs-row'\n const pos = targetMonoPosition(loc)\n const rel = targetOpenPath(loc)\n const name = String(rel).split('/').pop() || rel\n row.textContent = name + ':' + pos.line + ':' + pos.column\n row.title = rel + ':' + pos.line\n row.addEventListener('click', () => {\n hideReferencesOverlay()\n jumpToLocation(loc)\n })\n list.appendChild(row)\n }\n el.appendChild(list)\n root.appendChild(el)\n overlayEl = el\n const onKey = (e) => { if (e.key === 'Escape') hideReferencesOverlay() }\n window.addEventListener('keydown', onKey)\n el.addEventListener('click', (e) => { if (e.target === el) hideReferencesOverlay() })\n el._onKey = onKey\n}\n\nexport function hideReferencesOverlay() {\n if (overlayEl) {\n window.removeEventListener('keydown', overlayEl._onKey)\n overlayEl.remove()\n overlayEl = null\n }\n}\n\n/** 编辑器状态栏提示(复用 EditorView 的 status 通道)。 */\nfunction setStatus(text) {\n window.dispatchEvent(new CustomEvent('edrv:status', { detail: { text } }))\n}\n\n/** 当前会话与语言就绪状态(供编辑器状态点)。 */\nexport function lspStatusDot(languageId) {\n const status = lspStatusFor(languageId)\n return status ? status.phase : 'none'\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — LSP 装配编排。\n * setupLsp(monaco):注册 Monaco provider 与文档跟踪(幂等);调用方在 Monaco 加载后调用。\n * setSession(id):会话切换时同步(provider 与文档同步共用)。\n * 作者 ddj 2026-08-27\n */\nimport { registerLspProviders, hideReferencesOverlay } from './providers.js'\nimport { setLspSession, refreshStatus, lspStatusFor, onLspProgress } from './lspClient.js'\n\nlet monacoRef = null\n\n/** Monaco 加载后装配(幂等;重复调用仅刷新会话)。 */\nexport function setupLsp(monaco) {\n monacoRef = monaco\n registerLspProviders(monaco)\n}\n\n/** 会话切换:更新 host 侧文档归属 + 刷新状态。 */\nexport function setSession(sessionId) {\n setLspSession(sessionId)\n void refreshStatus(true)\n}\n\n/** 编辑器卸载时清理浮动面板。 */\nexport function disposeLspOverlay() {\n hideReferencesOverlay()\n}\n\nexport { lspStatusFor, refreshStatus, onLspProgress }\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 { applyTheme, registerThemes, themeNameOf } from '../monaco/theme.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 { DiffLauncher } from './DiffLauncher.js'\nimport { SidebarView } from '../sidebar/SidebarView.js'\nimport { clearDiffDock, publishDiffDock } from '../diffDockStore.js'\nimport { displayDiffTotal, editorDockMode } from '../diffDock.js'\nimport { editorHeight } from '../editorLayout.js'\nimport { revealInExplorer as revealPathInExplorer } from '../fileReveal.js'\nimport { setSidePending, SIDEBAR_INSTALL_CMD } from '../sidebarBridge.js'\nimport { upsertViewState, viewStatesLoad, viewStatesSave } from '../state/viewStateCache.js'\nimport { bindingOf, chordOf, matchEvent, useKeybindingsVersion } from '../keybindings.js'\nimport { CACHE_KEY } from '../paths.js'\nimport { bindLspEditor, runGoToDefinition, runFindReferences, hideReferencesOverlay } from '../monaco/lsp/providers.js'\nimport { onLspProgress, refreshStatus } from '../monaco/lsp/index.js'\n\n/**\n * 中央编辑区:文件页签(脏点/关闭/打开路径)+ Ctrl+P 搜索 + Monaco 编辑器 +\n * 底部差异条(DiffBox/空态)+ 全局差异下拉(DiffLauncher)+ 状态栏。\n * @param props.sessionId 会话 id\n * @param props.schedule 延时调度(ctx.timeout)\n * @param props.layout 布局形态:'tab'(中央页签,默认)| 'side'(侧边栏面板)\n * @param props.sideHint 旧页签形态下显示侧边栏引导(安装命令)\n */\nexport function EditorView(props) {\n const sessionId = props?.sessionId\n const schedule = props.schedule\n const addToConversation = props.addToConversation\n const layout = props?.layout === 'side' ? 'side' : 'tab'\n const sideHint = props?.sideHint\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 [contentPath, setContentPath] = React.useState(null)\n const [status, setStatus] = React.useState('')\n const [lspServers, setLspServers] = 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 [tabMenu, setTabMenu] = React.useState(null) // Tab 右键菜单 { x,y,path }(编辑区右键走 Monaco 原生菜单,无此浮层)\n const [sidebarOn, setSidebarOn] = React.useState(layout !== 'side') // 侧边栏显隐(侧栏形态默认收起)\n const [sidebarW, setSidebarW] = React.useState(240) // 侧边栏宽度\n const [activePanel, setActivePanel] = React.useState('explorer') // 激活面板 id\n const [focusRequest, setFocusRequest] = React.useState(0) // 外部差异聚焦请求版本\n const kbVersion = useKeybindingsVersion() // 快捷键配置版本(tooltip 文案随键位刷新)\n const [hintDismissed, setHintDismissed] = React.useState(() => {\n try { return localStorage.getItem(CACHE_KEY.sideHint) === '1' } catch { return false }\n }) // 侧边栏引导条是否已关闭\n const editorRef = React.useRef(null)\n const viewRootRef = React.useRef(null)\n const monacoRef = React.useRef(null)\n const modelsRef = React.useRef(new Map())\n // 视图状态缓存(path → Monaco viewState;重启后恢复光标/滚动/折叠位置)\n const viewStatesRef = React.useRef({})\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 menuHandlersRef = React.useRef(null) // 右键菜单动作的最新闭包(Monaco addAction 空依赖回调读取)\n const doSaveRef = React.useRef(null) // 保存动作的最新闭包(窗口级保存监听读取)\n const diffRendererRef = React.useRef(null)\n const layoutRef = React.useRef(layout) // ensureEditor 空依赖闭包读取的稳定布局\n layoutRef.current = layout\n if (!diffRendererRef.current) diffRendererRef.current = createDiffRenderer((sid, t) => dbg(sid, t))\n\n const currentRecords = React.useMemo(() => {\n const list = []\n for (const rec of Object.values(records)) if (rec.path === active && rec.archived !== true) list.push(rec)\n return list\n }, [records, active])\n\n const contentReady = content !== null && contentPath === active\n const regions = React.useMemo(() => diffRegions(currentRecords, contentReady ? content : null).filter((r) => !r.superseded), [currentRecords, content, contentPath, active])\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 /**\n * 保存当前活动文件的视图状态(光标/滚动/折叠)到会话缓存。\n * @author ddj 2026年08月28号\n * @param path 要保存的文件路径(缺省 = 当前 active)\n */\n const saveViewState = (path) => {\n const ed = editorRef.current\n const target = path ?? active\n if (!ed || !target) return\n try {\n const state = ed.saveViewState()\n if (!state) return\n viewStatesRef.current = upsertViewState(viewStatesRef.current, target, state)\n viewStatesSave(sessionId, viewStatesRef.current)\n } catch (e) { /* 视图状态保存失败忽略 */ }\n }\n\n /**\n * 恢复指定文件的视图状态(内容就绪、setModel 后调用;恢复后即消费删除)。\n * @author ddj 2026年08月28号\n * @param path 文件路径\n */\n const restoreViewState = (path) => {\n const ed = editorRef.current\n if (!ed || !path) return\n const saved = viewStatesRef.current[path]\n if (!saved) return\n const next = Object.assign({}, viewStatesRef.current)\n delete next[path]\n viewStatesRef.current = next\n try { ed.restoreViewState(saved) } catch (e) { /* 恢复失败忽略(行号越界自动兜底) */ }\n }\n\n const closeTab = (path) => {\n flushSave()\n if (path === active) saveViewState(path)\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 /**\n * 轮询去重:前后记录内容一致时返回原引用,React 跳过重渲染,\n * 阻断 5s 轮询 → memo 链 → diff 重渲染/日志 的空转。\n * @author ddj 2026年08月26号\n * @param prev 当前 records\n * @param next 轮询新结果\n * @returns 内容一致返回 true\n */\n const sameRecords = (prev, next) => {\n const pk = Object.keys(prev)\n const nk = Object.keys(next)\n if (pk.length !== nk.length) return false\n for (const k of pk) {\n if (!(k in next)) return false\n if (JSON.stringify(prev[k]) !== JSON.stringify(next[k])) return false\n }\n return true\n }\n\n const refreshRecords = (skipStale) => {\n if (!sessionId) return\n rpc('edrv.list', { sessionId, ...(skipStale ? { skipStale: true } : {}) }).then((res) => {\n if (!res || !res.ok || !Array.isArray(res.records)) return\n const map = {}\n for (const r of res.records) {\n if (r.archived === true) continue\n map[r.callId] = r\n }\n setRecords((prev) => (sameRecords(prev, map) ? prev : map))\n }).catch((e) => setError('list异常:' + String(e)))\n }\n\n /**\n * 加载文件内容(对齐 VSCode model 复用:会话内已打开的 model 直接秒显,\n * 后台静默 RPC 校验防陈旧;首次打开走原读取流程)。\n * @author ddj 2026年08月28号\n * @param path 文件路径\n * @param sid 会话 id\n * @param force 强制走 RPC(reloadFile 用,跳过 model 复用)\n */\n const loadContent = (path, sid, force) => {\n const seq = ++loadSeqRef.current\n const cachedModel = force ? null : modelsRef.current.get(path)\n if (cachedModel) {\n // model 命中:直接显示其内容(切 tab 零等待),后台静默校验\n setContent(cachedModel.getValue())\n setContentPath(path)\n setLoadStage((prev) => ({ progress: Math.max(84, prev.progress), message: '文件已读取,准备创建编辑器…' }))\n setStatus('已加载')\n rpc('edrv.read', { sessionId: sid, path }).then((res) => {\n if (seq !== loadSeqRef.current || path !== active) return\n if (res && res.ok && res.content !== cachedModel.getValue()) {\n saveViewState(path) // 内容更新前保留当前视图位置\n setContent(res.content)\n setStatus('已加载')\n }\n }).catch(() => { /* 校验失败保留缓存内容 */ })\n return\n }\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 setContentPath(path)\n setLoadStage((prev) => ({ progress: Math.max(84, prev.progress), message: '文件已读取,准备创建编辑器…' }))\n setStatus('已加载')\n } else {\n const base = res?.error ? String(res.error) : '读取失败'\n // 带出 host 解析后的真实路径:跳转失败时一眼看出是路径解析错还是目标不存在\n const message = res?.resolvedPath ? base + ':' + String(res.resolvedPath) : base\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 publishLsp = (servers) => setLspServers(Array.isArray(servers) ? servers : [])\n const unsubscribe = onLspProgress(publishLsp)\n void refreshStatus(true).then(publishLsp)\n const timer = setInterval(() => { void refreshStatus(true).then(publishLsp) }, 1500)\n return () => { unsubscribe(); clearInterval(timer) }\n }, [sessionId])\n\n React.useEffect(() => {\n const onOpen = (e) => {\n const p = e?.detail?.path\n if (!p) return\n if (e?.detail?.focusDiff === true) {\n pendingFocusRef.current = { path: p, region: null }\n setFocusRequest((value) => value + 1)\n addTab(p, true)\n return\n }\n if (e?.detail?.line != null) {\n // LSP/搜索跳转:打开并定位到行列\n openFileAt(p, e?.detail?.line, e?.detail?.column)\n return\n }\n addTab(p, true)\n }\n const onShowLauncher = (event) => {\n const tab = event?.detail?.tab\n if (tab === 'pending' || tab === 'archive') setLauncherTab(tab)\n setLauncherOpen(true)\n }\n window.addEventListener('edrv:open-editor', onOpen)\n window.addEventListener('edrv:show-launcher', onShowLauncher)\n const onStatus = (e) => { if (e?.detail?.text) setStatus(e.detail.text) }\n window.addEventListener('edrv:status', onStatus)\n return () => {\n window.removeEventListener('edrv:open-editor', onOpen)\n window.removeEventListener('edrv:show-launcher', onShowLauncher)\n window.removeEventListener('edrv:status', onStatus)\n }\n }, [sessionId])\n\n // 对话输入区的唯一差异 dock 读取此会话快照;编辑器卸载时只清理自己的发布者令牌。\n const dockSourceRef = React.useRef({})\n React.useEffect(() => () => {\n clearDiffDock(sessionId, dockSourceRef.current)\n if (layout === 'side') setSidePending(sessionId, 0)\n }, [sessionId])\n\n // DSH composer 保持原生布局;编辑区只读取几何边界并同步自己的高度。\n // 侧栏形态:面板容器自带高度,跳过 composer 几何同步(面板内无会话滚动区)。\n React.useLayoutEffect(() => {\n if (layout === 'side') return\n const root = viewRootRef.current\n const scroll = root?.closest?.('[data-conversation-scroll]')\n if (!root || !scroll) return\n let seat = null\n let frame = null\n let resizeObserver = null\n const update = () => {\n frame = null\n const rootRect = root.getBoundingClientRect()\n const scrollRect = scroll.getBoundingClientRect()\n const seatRect = seat?.getBoundingClientRect?.()\n const height = editorHeight(rootRect.top, scrollRect.bottom, seatRect?.top)\n root.style.setProperty('--edrv-editor-height', height + 'px')\n }\n const scheduleUpdate = () => {\n if (frame !== null) return\n frame = requestAnimationFrame(update)\n }\n const attachSeat = () => {\n const next = scroll.querySelector?.('[data-composer-seat]')\n if (next === seat) {\n scheduleUpdate()\n return\n }\n resizeObserver?.disconnect()\n seat = next\n resizeObserver = null\n if (seat && typeof ResizeObserver === 'function') {\n resizeObserver = new ResizeObserver(scheduleUpdate)\n resizeObserver.observe(seat)\n }\n scheduleUpdate()\n }\n attachSeat()\n const mutationObserver = typeof MutationObserver === 'function'\n ? new MutationObserver(attachSeat)\n : null\n mutationObserver?.observe(scroll, { childList: true })\n const scrollObserver = typeof ResizeObserver === 'function' ? new ResizeObserver(scheduleUpdate) : null\n scrollObserver?.observe(scroll)\n window.addEventListener('resize', scheduleUpdate)\n scheduleUpdate()\n return () => {\n if (frame !== null) cancelAnimationFrame(frame)\n resizeObserver?.disconnect()\n scrollObserver?.disconnect()\n mutationObserver?.disconnect()\n window.removeEventListener('resize', scheduleUpdate)\n root.style.removeProperty('--edrv-editor-height')\n }\n }, [sessionId, layout])\n\n // localStorage v2 恢复页签\n React.useEffect(() => {\n if (bootRef.current || !sessionId) return\n bootRef.current = true\n viewStatesRef.current = viewStatesLoad(sessionId)\n try {\n const raw = localStorage.getItem(CACHE_KEY.editor + 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(CACHE_KEY.editor + String(sessionId), JSON.stringify({ tabs: tabs.map((t) => t.path), active })) }\n catch (e) { /* 忽略 */ }\n }, [tabs, active, sessionId])\n\n // 侧边栏状态:恢复(显隐/宽度/激活面板);侧栏形态独立键(默认收起,不共享页签形态偏好)\n const sidebarKey = CACHE_KEY.sidebar + (layout === 'side' ? 'side.' : '') + String(sessionId)\n React.useEffect(() => {\n if (!sessionId) return\n try {\n const raw = localStorage.getItem(sidebarKey)\n if (raw) {\n const saved = JSON.parse(raw)\n if (typeof saved.on === 'boolean') setSidebarOn(saved.on)\n if (typeof saved.width === 'number') setSidebarW(Math.max(180, Math.min(560, saved.width)))\n if (typeof saved.panel === 'string') setActivePanel(saved.panel)\n }\n } catch (e) { /* 损坏忽略 */ }\n }, [sessionId, sidebarKey])\n\n // 侧边栏状态持久化\n React.useEffect(() => {\n if (!sessionId) return\n try { localStorage.setItem(sidebarKey, JSON.stringify({ on: sidebarOn, width: sidebarW, panel: activePanel })) }\n catch (e) { /* 忽略 */ }\n }, [sidebarOn, sidebarW, activePanel, sessionId, sidebarKey])\n\n // 切换侧边栏(capture 抢占,避免与 DSH 全局冲突;键位随快捷键配置)\n React.useEffect(() => {\n const onKey = (e) => {\n if (!matchEvent(e, bindingOf('edrv.toggleSidebar'))) return\n e.preventDefault(); e.stopPropagation()\n setSidebarOn((v) => !v)\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n // 保存文件(窗口级):编辑器有活动模型才拦截执行,无文件时放行(浏览器默认行为)\n React.useEffect(() => {\n const onKey = (e) => {\n if (!matchEvent(e, bindingOf('edrv.save'))) return\n if (!editorRef.current?.getModel?.()) return\n e.preventDefault(); e.stopPropagation()\n flushSave()\n doSaveRef.current(false)\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n // Ctrl+Shift+F 全局搜索:展开侧边栏 + 激活搜索页签,随后聚焦搜索输入框\n React.useEffect(() => {\n const onKey = (e) => {\n if (!matchEvent(e, bindingOf('edrv.searchInFiles'))) return\n e.preventDefault(); e.stopPropagation()\n setSidebarOn(true)\n setActivePanel('search')\n setTimeout(() => window.dispatchEvent(new CustomEvent('edrv:search-focus')), 0)\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n // 文件 → 待处理差异数 映射(侧边栏角标)\n const pendingByPath = React.useMemo(() => {\n const out = {}\n for (const f of sum.files) if (f.pending > 0) out[f.path] = f.pending\n return out\n }, [sum])\n\n React.useEffect(() => {\n if (!active) return\n setContent(null)\n setContentPath(null)\n setLoadError(null)\n setLoadStage({ progress: 10, message: '准备读取文件…' })\n setStatus('加载中…')\n loadContent(active, sessionId)\n }, [active, sessionId])\n\n // Tab 右键菜单打开时 Esc 关闭\n React.useEffect(() => {\n if (!tabMenu) return\n const onKey = (e) => { if (e.key === 'Escape') dismissMenus() }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [tabMenu])\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 // 分色主题:Monaco 就绪后注册(幂等)+ 应用;DSH 明暗切换时跟随重刷。\n React.useEffect(() => {\n if (!monaco) return\n registerThemes(monaco)\n applyTheme(monaco)\n if (typeof window.matchMedia !== 'function') return\n const query = window.matchMedia('(prefers-color-scheme: dark)')\n const onChange = () => applyTheme(monaco)\n if (typeof query.addEventListener === 'function') {\n query.addEventListener('change', onChange)\n return () => query.removeEventListener('change', onChange)\n }\n query.addListener(onChange)\n return () => query.removeListener(onChange)\n }, [monaco])\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 setContentPath(active)\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 doSaveRef.current = doSave\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 restoreViewState(active)\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 saveViewState(active)\n diffRendererRef.current?.dispose?.()\n hideReferencesOverlay()\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 side = layoutRef.current === 'side'\n const ed = m.editor.create(node, {\n value: '',\n language: 'plaintext',\n theme: themeNameOf(),\n fontFamily: 'var(--ds-font-family-code, ui-monospace, monospace)',\n fontSize: 13,\n lineHeight: 20,\n minimap: { enabled: !side, 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: side ? 6 : 8 },\n })\n // 保存改由窗口级快捷键监听执行(键位可配置;见上方 edrv.save 监听)\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 // 编辑区右键 → 注入 Monaco 原生 context menu(与 Go to Definition 等同菜单,避免分离浮层)。\n // 有选区时额外显示「选中内容」项:context key edrvSelection 由光标选区变化驱动。\n // 路径/选区在点击时从 model/editor 实时读取(不依赖闭包里的过期 active)。\n const menuHandlers = () => menuHandlersRef.current\n const pathOf = (edx) => {\n const model = edx?.getModel?.()\n const uriPath = model?.uri?.path\n return uriPath ? decodeURIComponent(String(uriPath).replace(/^\\//, '')) : null\n }\n const selectionOf = (edx) => {\n const s = edx?.getSelection?.()\n if (!s) return null\n if (s.startLineNumber === s.endLineNumber && s.startColumn === s.endColumn) return null\n return { startLine: s.startLineNumber, endLine: s.endLineNumber }\n }\n const selKey = ed.createContextKey('edrvSelection', false)\n ed.onDidChangeCursorSelection((e) => {\n const s = e?.selection\n selKey.set(!!(s && (s.startLineNumber !== s.endLineNumber || s.startColumn !== s.endColumn)))\n })\n ed.addAction({\n id: 'edrv.addFileRef', label: '添加文件到对话', contextMenuGroupId: '1_edrv',\n precondition: 'editorTextFocus',\n run: (edx) => menuHandlers()?.addRefToChat(pathOf(edx)),\n })\n ed.addAction({\n id: 'edrv.addSelectionRef', label: '添加选中内容为引用', contextMenuGroupId: '1_edrv',\n precondition: 'edrvSelection',\n run: (edx) => {\n const s = selectionOf(edx)\n const p = pathOf(edx)\n if (s && p) menuHandlers()?.addRefToChat(p, { startLine: s.startLine, endLine: s.endLine })\n },\n })\n // 在 OS 文件浏览器中打开/定位当前活动文件(与文件管理栏右键菜单同源能力)。\n ed.addAction({\n id: 'edrv.revealInExplorer', label: '在文件浏览器中打开', contextMenuGroupId: '1_edrv',\n precondition: 'editorTextFocus',\n run: (edx) => menuHandlers()?.openInExplorer(pathOf(edx)),\n })\n // 语言智能(LSP):转到定义 / 查找所有引用(右键 + F12/Shift+F12 键位)。\n ed.addAction({\n id: 'edrv.goToDefinition', label: '转到定义', contextMenuGroupId: '1_edrv',\n keybindings: m.KeyMod.CtrlCmd | m.KeyCode.F12,\n precondition: 'editorTextFocus',\n run: (edx) => { void runGoToDefinition(edx) },\n })\n ed.addAction({\n id: 'edrv.findReferences', label: '查找所有引用', contextMenuGroupId: '1_edrv',\n keybindings: m.KeyMod.Shift | m.KeyCode.F12,\n precondition: 'editorTextFocus',\n run: (edx) => { void runFindReferences(edx) },\n })\n ed.addCommand(m.KeyCode.F12, () => { void runGoToDefinition(ed) })\n bindLspEditor(ed)\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 ed = editorRef.current\n if (!ed) return\n if (pf.line != null) {\n // 搜索命中跳转:直接定位到行/列(不依赖差异区域)\n pendingFocusRef.current = null\n ed.revealLineInCenter(Math.max(1, pf.line))\n ed.setPosition({ lineNumber: Math.max(1, pf.line), column: Math.max(1, pf.column ?? 1) })\n ed.focus()\n return\n }\n const target = pf.region || pendingRegions[0]\n if (!target) 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, focusRequest])\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 openNextFile = () => {\n if (!sum.pendingFiles.length) return\n if (sum.pendingFiles.some((file) => file.path === active)) gotoFile(1)\n else openFile(sum.pendingFiles[0].path, true)\n }\n\n const reloadFile = (skipStale) => {\n if (!active) return\n loadContent(active, sessionId, true)\n refreshRecords(skipStale === true)\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 /**\n * 批量采纳/不采纳:一次 RPC 处理多个差异(Keep 整文件 / Keep All / Undo All)。\n * 单次 setRecords 合并全部结果,避免逐条往返读写整个 sidecar。\n * @author ddj 2026年08月25号\n * @param items 决策项数组(callId/scope/hunkIndex/decision)\n * @returns Promise<{ok:number; fail:number}> 成功/失败计数\n */\n const actMany = (items) => {\n if (!items.length) return Promise.resolve({ ok: 0, fail: 0 })\n return rpc('edrv.decideBatch', { sessionId, items }).then((res) => {\n if (!res || !res.ok || !Array.isArray(res.results)) {\n setError(res?.error ? String(res.error) : '批量处理失败')\n return { ok: 0, fail: items.length }\n }\n let ok = 0\n let fail = 0\n const next = {}\n for (const item of res.results) {\n if (item && item.ok) {\n ok++\n if (item.record) next[item.callId] = item.record\n } else {\n fail++\n }\n }\n // 合并结果无变化(批量全部失败/重复点击)时不 setRecords:避免 records 换引用\n // → pendingRegions 换引用 → diff 全量重渲染(内容相同,纯空转)\n if (Object.keys(next).length) setRecords((prev) => Object.assign({}, prev, next))\n return { ok, fail }\n }).catch((e) => {\n setError('批量处理异常:' + String(e))\n return { ok: 0, fail: items.length }\n })\n }\n\n /**\n * 决策项构造(与单条 actHunk 的 scope 语义一致:create 记录走 call 作用域)。\n * @author ddj 2026年08月25号\n * @param r 差异区域/待处理项(callId/idx/create)\n * @param reject true=不采纳\n * @returns decideBatch items 元素\n */\n const itemOf = (r, reject) => ({ callId: r.callId, scope: r.create ? 'call' : 'hunk', hunkIndex: r.idx, decision: reject ? 'rejected' : 'accepted' })\n\n const acceptFile = () => {\n if (batchBusyRef.current || !pendingRegions.length) return\n batchBusyRef.current = true\n actMany(pendingRegions.map((r) => itemOf(r, false))).then(({ ok, fail }) => {\n batchBusyRef.current = false\n reloadFile(true)\n emitRefresh()\n setStatus('已采纳 ' + ok + ' 处差异' + (fail ? ',' + fail + ' 处失败' : ''))\n if (fail) setError(fail + ' 处差异处理失败(可能已被后续修改影响),可刷新后重试')\n }).catch(() => { batchBusyRef.current = false })\n }\n const undoFile = () => {\n if (batchBusyRef.current || !pendingRegions.length) return\n batchBusyRef.current = true\n actMany([...pendingRegions].reverse().map((r) => itemOf(r, true))).then(({ ok, fail }) => {\n batchBusyRef.current = false\n reloadFile(true)\n emitRefresh()\n setStatus('已不采纳 ' + ok + ' 处差异' + (fail ? ',' + fail + ' 处失败' : ''))\n if (fail) setError(fail + ' 处差异处理失败(可能已被后续修改影响),可刷新后重试')\n }).catch(() => { batchBusyRef.current = false })\n }\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 降序(新改先回滚)排序后一次 RPC。\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 actMany(list.map((r) => itemOf(r, reject))).then(({ ok, fail }) => {\n batchBusyRef.current = false\n reloadFile(true)\n emitRefresh()\n setStatus((reject ? '已不采纳 ' : '已采纳 ') + ok + ' 处差异' + (fail ? ',' + fail + ' 处失败' : ''))\n if (fail) setError(fail + ' 处差异处理失败(可能已被后续修改影响),可刷新后重试')\n }).catch(() => { batchBusyRef.current = false })\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 /**\n * 关闭 Tab 右键菜单。\n * @author ddj 2026年08月25号\n */\n const dismissMenus = () => {\n setTabMenu(null)\n }\n\n /** 把「添加到对话」返回状态映射为状态栏文案。\n * @author ddj 2026年08月25号 */\n const statusOfAdd = (outcome, okText) => {\n if (outcome === 'ok') return okText\n if (outcome === 'busy') return okText + '(输入框忙,已降级纯文本)'\n return '无法添加到对话(无会话或输入框不可用)'\n }\n\n /** 添加文件/选中区引用到对话(异步,状态栏反馈)。 */\n const addRefToChat = (path, range) => {\n if (!path) { setStatus('无活动文件'); return }\n if (!addToConversation) { setStatus('添加到对话不可用'); return }\n addToConversation.appendReference(sessionId, path, range).then((o) => setStatus(statusOfAdd(o, '已添加文件引用')))\n }\n\n /**\n * 在 OS 文件浏览器中打开/定位路径(Monaco 右键菜单用,状态栏反馈)。\n * @author ddj 2026年08月27号\n * @param path 工作区相对路径(可能为 null)\n */\n const openInExplorer = (path) => {\n if (!path) { setStatus('无活动文件'); return }\n if (!sessionId) { setStatus('无活动会话'); return }\n setStatus('正在打开文件浏览器…')\n revealPathInExplorer(sessionId, path).then((outcome) => {\n setStatus(outcome.ok ? '已在文件浏览器中打开' : '打开失败')\n if (!outcome.ok && outcome.error) setError(outcome.error)\n })\n }\n\n // 供 Monaco 原生右键菜单 addAction 读取的最新动作闭包(空依赖回调不随渲染重建)\n menuHandlersRef.current = { addRefToChat, openInExplorer }\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 /**\n * 打开文件并跳转到指定行列(搜索面板命中跳转)。\n * @author ddj 2026年08月26号\n * @param path 文件路径\n * @param line 目标行(缺省仅打开不跳转)\n * @param column 目标列(缺省 1)\n */\n const openFileAt = (path, line, column) => {\n if (!path) return\n addTab(path, true)\n pendingFocusRef.current = { path, region: null, line: line ?? null, column: column ?? 1 }\n setFocusRequest((value) => value + 1)\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(); saveViewState(active); setActive(t.path) } },\n onContextMenu: (e) => {\n e.preventDefault()\n e.stopPropagation()\n setTabMenu({ x: e.clientX, y: e.clientY, path: t.path })\n },\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 || '使用右上搜索框 (' + (chordOf('edrv.quickOpen') ?? 'Ctrl+P') + ') 打开文件'),\n (active && langOf(active) ? React.createElement('span', { className: 'edrv-pb-meta' }, langOf(active)) : null),\n (cursor ? React.createElement('span', { className: 'edrv-pb-meta' }, cursor) : null),\n (status ? React.createElement('span', { className: 'edrv-pb-meta edrv-pb-status' }, status) : null))\n\n const lspLanguage = active ? langOf(active) : ''\n const lspServer = lspServers.find((item) => item.languageId === lspLanguage)\n const lspPhaseText = { idle: '未启动', starting: '启动中', ready: '已就绪', indexing: '解析中', unavailable: '不可用', stopped: '已停止' }\n const lspSourceText = { extension: '扩展', discover: '自动发现', manual: '手动配置', none: '未配置' }\n const lspLabel = lspServer\n ? 'LSP ' + lspLanguage + ' · ' + (lspPhaseText[lspServer.phase] ?? lspServer.phase) + ' · ' + (lspSourceText[lspServer.source] ?? lspServer.source)\n : 'LSP ' + lspLanguage + ' · 未启动'\n const lspProgress = typeof lspServer?.progress === 'number' ? Math.round(lspServer.progress) : null\n const lspFooter = (lspLanguage === 'lua' || lspLanguage === 'csharp')\n ? React.createElement('div', { className: 'edrv-statusbar', title: lspServer?.progressMessage || lspLabel },\n React.createElement('span', { className: 'edrv-lsp-status-dot ' + (lspServer?.phase === 'ready' ? 'ready' : lspServer?.phase === 'indexing' || lspServer?.phase === 'starting' ? 'busy' : 'idle') }),\n React.createElement('span', { className: 'edrv-sp-lsp' }, lspLabel),\n lspServer?.progressMessage ? React.createElement('span', { className: 'edrv-sp-progress-message' }, lspServer.progressMessage) : null,\n lspProgress !== null ? React.createElement('span', { className: 'edrv-sp-progress' }, lspProgress + '%') : null)\n : null\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 (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' + (sidebarOn ? ' edrv-chip-on' : ''), title: '切换侧边栏 (' + (chordOf('edrv.toggleSidebar') ?? 'Ctrl+B') + ')', onClick: () => setSidebarOn((v) => !v) }, '☰'),\n React.createElement('button', { className: 'edrv-chip-btn', title: '刷新', onClick: reloadFile }, '⟳'),\n React.createElement(QuickOpen, { sessionId, onOpen: (p) => openFile(p, false) }))\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 } }, '使用右上搜索框 (' + (chordOf('edrv.quickOpen') ?? 'Ctrl+P') + ') 打开工作区文件;agent 修改文件后顶部会出现差异角标'))\n } else if (content === null && loadError) {\n body = loadingBody('文件加载失败:' + loadError, 0, () => {\n setLoadError(null)\n setContent(null)\n setContentPath(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 /** 组装差异 dock 快照(发布给 conversation.input.dock 的唯一 DiffBox 实例)。 */\n const buildDockSnapshot = () => ({\n mode: editorDockMode(active),\n pendingRegions,\n 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: (path) => openFile(path, true),\n onOpenLauncher: (tab) => { setLauncherTab(tab || 'pending'); setLauncherOpen(true) },\n onRefresh: reloadFile,\n activePath: active,\n diffIdx: contentReady ? diffIdx : 0,\n diffTotal: displayDiffTotal(contentReady, pendingRegions.length, sum.files.find((file) => file.path === active)?.pending ?? 0),\n fileIdx,\n fileTotal: sum.pendingFiles.length,\n onPrevDiff: () => gotoDiff(-1),\n onNextDiff: () => gotoDiff(1),\n onPrevFile: () => gotoFile(-1),\n onNextFile: () => gotoFile(1),\n onOpenNextFile: openNextFile,\n })\n\n React.useEffect(() => {\n if (!sessionId) return\n publishDiffDock(sessionId, buildDockSnapshot(), dockSourceRef.current)\n // 侧栏形态同步 Tab 角标计数(仅本形态写入;页签形态清零避免残留)\n if (layout === 'side') setSidePending(sessionId, sum.totalFiles)\n else setSidePending(sessionId, 0)\n })\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 : null\n\n // Tab 右键菜单浮层:全屏遮罩(点击/右键关闭)+ 菜单(固定定位,clamp 防越界)。\n // 编辑区右键走 Monaco 原生 context menu(editor.addAction),不在此渲染浮层。\n /**\n * 计算右键菜单固定定位(clamp 防越出视口)。\n * @author ddj 2026年08月25号\n */\n const menuPos = (x, y) => ({\n left: Math.max(4, Math.min(x, (window.innerWidth || 800) - 224)),\n top: Math.max(4, Math.min(y, (window.innerHeight || 600) - 176)),\n })\n const menuBackdrop = tabMenu\n ? React.createElement('div', {\n style: { position: 'fixed', inset: 0, zIndex: 70 },\n onClick: dismissMenus,\n onContextMenu: (e) => { e.preventDefault(); dismissMenus() },\n })\n : null\n const tabMenuEl = tabMenu\n ? React.createElement('div', { className: 'edrv-ctxmenu', style: menuPos(tabMenu.x, tabMenu.y) },\n React.createElement('button', { className: 'edrv-ctxmenu-item', onClick: () => { addRefToChat(tabMenu.path); dismissMenus() } }, '添加文件到对话'),\n React.createElement('div', { className: 'edrv-ctxmenu-sep' }),\n React.createElement('button', { className: 'edrv-ctxmenu-item edrv-ctxmenu-danger', onClick: () => { closeTab(tabMenu.path); dismissMenus() } }, '关闭标签页'))\n : null\n\n const sidebarPanels = props.sidebarPanels\n const sidebarCtx = {\n sessionId,\n openFile: (p) => openFile(p, false),\n openFileAt,\n activePath: active,\n pendingByPath,\n sum: { totalFiles: sum.totalFiles, files: sum.files },\n refreshRecords: () => refreshRecords(),\n editor: () => editorRef.current,\n outlineSources: props.outlineSources,\n fileMenuItems: props.fileMenuItems,\n notify: (message) => setStatus(message),\n }\n\n // 主编辑列(侧边栏右侧):pathBar + tabRow + 编辑/差异区(底部整条留给 DSH 对话输入栏)\n const editorArea = React.createElement('div', { className: 'edrv-editor-area' },\n body,\n hoverEl,\n overlay)\n // 侧边栏引导条(仅旧页签形态且未装 betterSidebar 时显示;可复制安装命令、可关闭)\n const dismissHint = () => {\n setHintDismissed(true)\n try { localStorage.setItem(CACHE_KEY.sideHint, '1') } catch (e) { /* 忽略 */ }\n }\n const copyInstallCmd = () => {\n if (navigator.clipboard?.writeText) navigator.clipboard.writeText(SIDEBAR_INSTALL_CMD).catch(() => {})\n }\n const sideHintEl = (layout === 'tab' && sideHint && !hintDismissed)\n ? React.createElement('div', { className: 'edrv-side-hint' },\n React.createElement('span', { className: 'edrv-side-hint-text' }, '安装 dsh-better-sidebar 后可启用侧边栏编辑(对话+编辑同屏):'),\n React.createElement('code', { className: 'edrv-side-hint-cmd' }, SIDEBAR_INSTALL_CMD),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '复制安装命令', onClick: copyInstallCmd }, '复制命令'),\n React.createElement('button', { className: 'edrv-side-hint-close', title: '关闭提示', 'aria-label': '关闭提示', onClick: dismissHint }, '×'))\n : null\n const mainCol = React.createElement('div', { className: 'edrv-main-col', style: { flex: 1, minWidth: 0, minHeight: 0, display: 'flex', flexDirection: 'column', overflow: 'hidden' } },\n pathBar,\n tabRow,\n sideHintEl,\n editorArea,\n lspFooter)\n // 编辑器根节点按 composer 顶部边界动态限高,底部对话区域继续由 DSH 原生渲染。\n // 侧栏形态由面板容器给高(100%),不做 composer 几何同步。\n const editorRow = React.createElement('div', { className: 'edrv-editor-row' },\n (sidebarOn && sidebarPanels\n ? React.createElement(SidebarView, {\n registry: sidebarPanels,\n ctx: sidebarCtx,\n activePanel,\n onActive: setActivePanel,\n width: sidebarW,\n onWidth: setSidebarW,\n onHide: () => setSidebarOn(false),\n })\n : null),\n mainCol)\n\n const baseStyle = { minHeight: 0, display: 'flex', flexDirection: 'column', background: 'var(--dsw-alias-bg-base,transparent)', overflow: 'hidden' }\n const rootEl = layout === 'side'\n ? React.createElement('div', { ref: viewRootRef, 'data-edrv-view': '1', 'data-edrv-layout': 'side', className: 'edrv-view-side', style: Object.assign({}, baseStyle, { height: '100%' }) },\n editorRow,\n menuBackdrop,\n tabMenuEl)\n : React.createElement('div', { ref: viewRootRef, 'data-edrv-view': '1', style: Object.assign({}, baseStyle, { height: 'var(--edrv-editor-height, 100%)', maxHeight: 'var(--edrv-editor-height, 100%)' }) },\n editorRow,\n menuBackdrop,\n tabMenuEl)\n return rootEl\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 [summary, setSummary] = React.useState(null)\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 setSummary(summarize(res.records))\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 const n = summary?.totalFiles ?? 0\n if (!n) return null\n\n const click = () => {\n // 侧栏形态:带首个待处理文件路径(内容打开自动展开面板);旧形态行为不变\n openEditorView(summary?.pendingFiles?.[0]?.path ?? 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 — PerfSizeBadge:对话 header 会话体积指示器。\n * 5s 轮询当前会话持久化体积(host 仅 stat,近零成本),≥1MB 显示、超阈值变色,\n * 引导\"一次任务一个短会话\":会话过大时建议 /compact 或新开会话。\n * 作者 ddj 2026-09-02\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\n\n/** 软阈值:≥ 此值琥珀色(默认 2MB)。 */\nconst SOFT = 2 * 1024 * 1024\n/** 硬阈值:≥ 此值红色(默认 8MB)。 */\nconst HARD = 8 * 1024 * 1024\n/** 显示下限:≥ 1MB 才显示(太小无提示价值)。 */\nconst SHOW_MIN = 1024 * 1024\n\n/**\n * 会话 header 体积徽章(挂 conversation.session.header.utilities)。\n * @author ddj 2026年09月02号\n * @param props { sessionId, sessions }(sessions 供 cwd 解析)\n */\nexport function PerfSizeBadge(props) {\n const sessionId = props?.sessionId\n const sessions = props?.sessions\n const [size, setSize] = React.useState(null)\n const seq = React.useRef(0)\n\n const load = React.useCallback(() => {\n if (!sessionId) return\n const cwd = sessions?.list?.getSnapshot?.()?.byId?.[sessionId]?.cwd\n if (!cwd) return\n const s = ++seq.current\n rpc('edrv.perf.sessionSize', { sessionId, cwd }).then((res) => {\n if (s !== seq.current || !res || !res.ok) return\n setSize(res.exists ? res.bytes : 0)\n }).catch(() => {})\n }, [sessionId, sessions])\n\n React.useEffect(() => {\n load()\n const t = setInterval(load, 5000)\n return () => { clearInterval(t) }\n }, [load])\n\n if (!size || size < SHOW_MIN) return null\n const label = size >= 1024 * 1024 ? (size / (1024 * 1024)).toFixed(1) + 'MB' : Math.round(size / 1024) + 'KB'\n const color = size >= HARD ? '#dc2626' : size >= SOFT ? '#d97706' : 'var(--dsw-text-3,#6b7280)'\n const tip = '当前会话已持久化 ' + label + '(启动回放约放大 10×,占内存)。过大建议 /compact 或新开会话。'\n return React.createElement('span', {\n style: { display: 'inline-flex', alignItems: 'center', height: 30, padding: '0 8px', fontSize: 11, color, borderRadius: 6, cursor: 'default', whiteSpace: 'nowrap', gap: 4, lineHeight: '30px' },\n title: tip,\n }, '会话 ' + label)\n}\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 { diffDockText } from '../diffDock.js'\nimport { badgeOf } from './shared.js'\n\n/**\n * 折叠控制使用任务栏同尺寸的 chevron 轮廓,避免依赖未声明的运行时图标包。\n * @author ddj 2026年08月25号\n * @param open 是否已展开\n * @returns 14×14 的装饰性 chevron SVG\n */\nfunction chevronOf(open) {\n const path = open ? 'M3.25 5.25 7 9l3.75-3.75' : 'M3.25 8.75 7 5l3.75 3.75'\n return React.createElement('svg', {\n width: 14,\n height: 14,\n viewBox: '0 0 14 14',\n fill: 'none',\n 'aria-hidden': true,\n focusable: false,\n }, React.createElement('path', {\n d: path,\n stroke: 'currentColor',\n strokeWidth: 1.2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }))\n}\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 = 0, onRollback, onJump, otherFiles = [], onOpenOther, onOpenLauncher, onRefresh, activePath,\n diffIdx = 0, diffTotal = 0, fileIdx = 0, fileTotal = 0, onPrevDiff, onNextDiff, onPrevFile, onNextFile,\n mode = 'editor', onOpenNextFile, dock = false,\n } = props\n const [expanded, setExpanded] = React.useState(false)\n const [detailsOpen, setDetailsOpen] = React.useState(false)\n const detailsId = React.useId()\n const canAct = pendingRegions.length > 0\n\n const base = String(activePath || '').split(/[\\\\/]/).pop() || ''\n\n if (mode === 'chat' || mode === 'editor-empty') {\n return React.createElement('div', { className: 'edrv-diffbar edrv-diffbar-dock', 'data-edrv-diffbox': '1', 'data-edrv-diff-mode': mode },\n React.createElement('div', { className: 'edrv-diffbar-row edrv-diffbar-dock-row' },\n React.createElement('button', {\n type: 'button',\n className: 'edrv-diffbar-dock-button',\n title: '切换到下一个差异文件',\n 'aria-label': diffDockText(fileTotal),\n onClick: onOpenNextFile,\n }, diffDockText(fileTotal))))\n }\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 details = detailsOpen\n ? React.createElement('div', { className: 'edrv-diff-details', id: detailsId },\n React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !allPendingCount, onClick: onAcceptAllFiles }, '✓ Keep All(全部文件采纳)'),\n React.createElement('button', { className: 'edrv-diffmenu-item danger', disabled: !allPendingCount, onClick: onUndoAllFiles }, '↩ Undo All(全部文件不采纳)'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => onOpenLauncher('pending') }, '🗂 差异总览'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => onOpenLauncher('archive') }, '📁 归档'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !canAct, onClick: onRollback }, '⟲ 回滚文件'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: onRefresh }, '⟳ 刷新'))\n : null\n\n return React.createElement('div', { className: 'edrv-diffbar edrv-diffbar-dock', 'data-edrv-diffbox': '1', 'data-edrv-diff-mode': 'editor' },\n React.createElement('div', { className: 'edrv-diffbar-row edrv-diffbar-editor-row' },\n React.createElement('div', { className: 'edrv-diffbar-editor-content' },\n React.createElement('div', { className: 'edrv-diffbar-nav' },\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异', disabled: !canAct, onClick: onPrevDiff }, '↑'),\n React.createElement('span', { className: 'edrv-diffbar-count edrv-diffbar-progress', 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('div', { className: 'edrv-diffbar-files' },\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 edrv-diffbar-progress', 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 edrv-diffbar-summary', title: activePath || '' }, base)),\n\n React.createElement('div', { className: 'edrv-diffbar-actions' },\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', {\n className: 'edrv-pill edrv-pill-ghost edrv-diff-details-toggle',\n title: detailsOpen ? '收起差异操作' : '展开差异操作',\n 'aria-label': detailsOpen ? '收起差异操作' : '展开差异操作',\n 'aria-expanded': detailsOpen,\n 'aria-controls': detailsId,\n onClick: () => setDetailsOpen((value) => !value),\n }, chevronOf(detailsOpen))))),\n bodyEl,\n details)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 会话级差异 dock。\n * conversation.input.dock 是唯一实例:普通对话显示摘要,文件编辑页显示完整操作条。\n * 作者 ddj 2026-08-26\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { openDiffView } from '../events.js'\nimport { summarize } from '../state/records.js'\nimport { nextDiffPath } from '../diffDock.js'\nimport { readDiffDock, subscribeDiffDock } from '../diffDockStore.js'\nimport { DiffBox } from './DiffBox.js'\n\nconst nextIndexBySession = new Map()\n\n/**\n * 对话输入框上方的唯一差异 dock。\n * @author ddj 2026年08月26号\n * @param props DSH 注入的会话属性\n * @returns 差异 dock React 元素或 null\n */\nexport function ConversationDiffDock(props) {\n const sessionId = props?.sessionId\n const [summary, setSummary] = React.useState(null)\n const [, setStoreRevision] = React.useState(0)\n const seq = React.useRef(0)\n\n const load = React.useCallback(() => {\n if (!sessionId) return\n const current = ++seq.current\n rpc('edrv.list', { sessionId }).then((res) => {\n if (current !== seq.current || !res || !res.ok || !Array.isArray(res.records)) return\n setSummary(summarize(res.records))\n }).catch(() => {})\n }, [sessionId])\n\n React.useEffect(() => {\n load()\n const timer = setInterval(load, 5000)\n const onRefresh = () => load()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => {\n clearInterval(timer)\n window.removeEventListener('edrv:refresh', onRefresh)\n }\n }, [load])\n\n React.useEffect(() => {\n if (!sessionId) return undefined\n const sync = () => setStoreRevision((value) => value + 1)\n sync()\n return subscribeDiffDock(sessionId, sync)\n }, [sessionId])\n\n const renderDock = (content, key) => React.createElement('div', {\n key,\n className: 'edrv-diff-dock-shell',\n 'data-edrv-diff-dock-shell': '1',\n }, content)\n\n const editorSnapshot = readDiffDock(sessionId)\n if (editorSnapshot) {\n if (editorSnapshot.mode === 'editor-empty' && !editorSnapshot.fileTotal) return null\n return renderDock(React.createElement(DiffBox, Object.assign({}, editorSnapshot, { dock: true })), sessionId)\n }\n\n if (!sessionId || !summary?.pendingFiles?.length) return null\n\n const paths = summary.pendingFiles.map((file) => file.path)\n const click = () => {\n const current = nextIndexBySession.get(sessionId) ?? 0\n const next = nextDiffPath(paths, current)\n nextIndexBySession.set(sessionId, next.index)\n if (next.path) openDiffView(next.path)\n }\n\n return renderDock(React.createElement(DiffBox, {\n mode: 'chat',\n dock: true,\n fileTotal: paths.length,\n onOpenNextFile: click,\n }), sessionId || 'chat')\n}\n","/**\n * dsh-vscode-mode client — 兼容层:设置桥选择 / slot 安全注册 / openPath 链式补丁 / 外部插件常量。\n * 纯逻辑与薄 ctx 胶水,node 环境可单测(不依赖 DOM)。\n * 作者 ddj 2026年08月24号\n */\n\n/** 本插件包名(与 host compat.PLUGIN_NAME 对应)。 */\nexport const PLUGIN_NAME = 'dsh-vscode-mode'\n/** 外部侧栏插件名(dsh-web-ui-all 家族的文件打开能力提供方)。 */\nexport const SIDEBAR_PLUGIN = 'dsh-better-sidebar'\n\n/** 设置 scope 的跨组件上下文形状(与官方 settingsScope 绑定的最小面)。 */\nexport interface SettingsScopeLike {\n getSnapshot: () => { status?: string; value?: { fileOpenTool?: unknown; keybindings?: Record<string, string> }; writable?: boolean }\n subscribe: (listener: () => void) => () => void\n set: (field: string, value: unknown) => Promise<void>\n}\n\n/**\n * 设置桥三级优先:webUiSettings(linxin666 兼容桥)→ settingsScope(官方)→ 无。\n * 桥绑定抛错时降级到下一级,不让单个桥异常拖垮设置装配。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 激活的桥名称与绑定 scope\n */\nexport function pickSettingsBinder(ctx: { get: (name: string) => unknown }): { service: string; scope: SettingsScopeLike | undefined } {\n for (const service of ['webUiSettings', 'settingsScope']) {\n try {\n const binder = ctx.get(service) as { bind?: (spec: { namespace: string }) => SettingsScopeLike } | undefined\n const scope = binder?.bind?.({ namespace: PLUGIN_NAME })\n if (scope) return { service, scope }\n } catch {\n /* 桥异常时降级到下一级 */\n }\n }\n return { service: 'none', scope: undefined }\n}\n\n/** slot 注册描述(对齐 ctx.slots.register 的形状)。 */\nexport interface SlotSpec {\n name: string\n id: string\n order?: number\n label?: string\n inject?: (sessionId: string) => object\n}\n\n/**\n * 跨版本 slot 安全注册:封装 ctx.slots.inject 等待声明模式(新老 DSH 通用),\n * 服务缺失或注册抛错时降级为警告,不让单条 slot 拖垮装配。\n * 注意:方法必须挂在服务对象上调用(slots.register 是依赖 this.records 的类方法,\n * 解构后 this 丢失会静默失败),故禁止解构。\n * @author ddj 2026年08月24号\n * @param ctx 客户端上下文(slots 服务)\n * @param spec slot 描述\n * @param render 渲染函数\n * @returns 注销函数(未注册返回 null;形态切换时用于卸载旧 slot)\n */\nexport function registerSlotSafely(ctx: { slots?: { inject?: (name: string, register: () => unknown) => unknown; register?: (...args: unknown[]) => unknown } }, spec: SlotSpec, render: (props: unknown) => unknown): (() => void) | null {\n const slots = ctx?.slots as { inject: (name: string, register: () => unknown) => unknown; register: (...args: unknown[]) => unknown } | undefined\n if (!slots || typeof slots.inject !== 'function' || typeof slots.register !== 'function') {\n console.warn('[' + PLUGIN_NAME + '] slots 服务不可用,跳过 slot ' + spec.name)\n return null\n }\n try {\n const disposer = slots.inject(spec.name, () => slots.register(spec, render))\n return typeof disposer === 'function' ? disposer as () => void : null\n } catch (error) {\n console.warn('[' + PLUGIN_NAME + '] slot ' + spec.name + ' 注册失败(' + String(error) + '),已跳过')\n return null\n }\n}\n\n/**\n * 链式补丁对象方法:保存原实现、装入包装实现,dispose 恢复。\n * 恢复带归属校验(仅当当前实现仍是本包装时还原),多插件补丁按栈序互不踩踏。\n * @author ddj 2026年08月24号\n * @param owner 目标对象\n * @param key 方法名\n * @param wrapper 包装实现(original 为补丁前的实现)\n * @returns 恢复函数(幂等)\n */\nexport function patchMethod<T extends object, K extends keyof T>(\n owner: T,\n key: K,\n wrapper: (original: T[K], ...args: never[]) => unknown,\n): () => void {\n const original = owner[key]\n const patched = ((...args: never[]) => wrapper(original, ...args)) as T[K]\n owner[key] = patched\n return () => {\n if (owner[key] === patched) owner[key] = original\n }\n}\n","/**\n * dsh-vscode-mode client — 文件打开器注册表与自动选择。\n * @author ddj 2026年08月24号\n */\nimport { SIDEBAR_PLUGIN } from './compat.js'\n\nexport const AUTO_OPEN_TOOL = 'auto'\nexport const SYSTEM_OPEN_TOOL = 'system'\nexport const VSCODE_OPEN_TOOL = 'dsh-vscode-mode'\nexport const SIDEBAR_OPEN_TOOL = SIDEBAR_PLUGIN\n\nexport interface FileOpenContext {\n sessionId?: string\n cwd?: string\n}\n\nexport interface FileOpener {\n id: string\n label: string\n description?: string\n priority?: number\n isAvailable?: () => boolean\n open: (path: string, context: FileOpenContext) => void | Promise<void>\n}\n\nexport interface FileOpenerRegistry {\n register(opener: FileOpener): () => void\n registerFileOpener(opener: FileOpener): () => void\n list(): readonly FileOpener[]\n subscribe(listener: () => void): () => void\n get(id: string): FileOpener | undefined\n}\n\n/**\n * 写入外部打开器并触发注册表通知。\n * @author ddj 2026年08月24号\n * @param entries 打开器存储\n * @param notify 变更通知\n * @param opener 打开器\n */\nfunction registryRegister(entries: Map<string, FileOpener>, notify: () => void, opener: FileOpener): void {\n if (!opener.id || typeof opener.open !== 'function') throw new TypeError('文件打开器必须提供 id 和 open')\n entries.set(opener.id, opener)\n notify()\n}\n\n/**\n * 创建生命周期独立的文件打开器注册表。\n * @author ddj 2026年08月24号\n * @returns 文件打开器注册表\n */\nexport function createFileOpenerRegistry(): FileOpenerRegistry {\n const entries = new Map<string, FileOpener>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) listener()\n }\n const list = (): readonly FileOpener[] => [...entries.values()].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n return {\n register(opener: FileOpener): () => void {\n registryRegister(entries, notify, opener)\n return () => {\n if (entries.get(opener.id) !== opener) return\n entries.delete(opener.id)\n notify()\n }\n },\n registerFileOpener(opener: FileOpener): () => void {\n registryRegister(entries, notify, opener)\n return () => {\n if (entries.get(opener.id) !== opener) return\n entries.delete(opener.id)\n notify()\n }\n },\n list,\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n get: (id: string) => entries.get(id),\n }\n}\n\n/**\n * 检查打开器当前是否可用。\n * @author ddj 2026年08月24号\n * @param opener 待检查打开器\n * @returns 是否可用\n */\nexport function isAvailable(opener: FileOpener): boolean {\n try {\n return opener.isAvailable ? opener.isAvailable() : true\n } catch {\n return false\n }\n}\n\n/**\n * 返回当前可展示的文件打开器。\n * @author ddj 2026年08月24号\n * @param registry 文件打开器注册表\n * @returns 可用打开器列表\n */\nexport function availableOpeners(registry: FileOpenerRegistry): FileOpener[] {\n return registry.list().filter(isAvailable)\n}\n\n/**\n * 按设置选择打开器,不可用时回退自动优先级。\n * @author ddj 2026年08月24号\n * @param registry 文件打开器注册表\n * @param selected 用户选择的打开器 id\n * @returns 选中的打开器\n */\nexport function selectOpener(\n registry: FileOpenerRegistry,\n selected: string,\n): FileOpener | undefined {\n if (selected !== AUTO_OPEN_TOOL) {\n const requested = registry.get(selected)\n if (requested && isAvailable(requested)) return requested\n }\n return availableOpeners(registry)[0]\n}\n\n/**\n * 结构化探测 dsh-better-sidebar 的文件打开能力。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 侧边栏打开器或 undefined\n */\nexport function scanSidebar(ctx: { get: (name: string) => unknown }): FileOpener | undefined {\n try {\n const service = ctx.get('betterSidebar') as {\n openFile?: (scope: { sessionId: string; cwd?: string }, path: string, title?: string) => void\n isTabEnabled?: (id: string) => boolean\n features?: readonly string[]\n getSnapshot?: () => { state?: unknown }\n } | undefined\n if (!service || typeof service.openFile !== 'function') return undefined\n const advertised = service.features?.includes('openFile') ?? true\n if (!advertised) return undefined\n const canOpen = typeof service.isTabEnabled !== 'function' || service.isTabEnabled('editor')\n if (!canOpen) return undefined\n return {\n id: SIDEBAR_OPEN_TOOL,\n label: 'dsh-better-sidebar',\n description: '在 dsh-web-ui-all 侧边栏编辑器中打开',\n priority: 80,\n isAvailable: () => typeof service.openFile === 'function'\n && (service.features?.includes('openFile') ?? true)\n && (typeof service.isTabEnabled !== 'function' || service.isTabEnabled('editor')),\n open: (path, context) => {\n if (!context.sessionId) throw new Error('当前没有活动会话')\n service.openFile!({ sessionId: context.sessionId, cwd: context.cwd }, path, baseName(path))\n },\n }\n } catch {\n return undefined\n }\n}\n\n/**\n * 从路径提取文件名。\n * @author ddj 2026年08月24号\n * @param path 文件路径\n * @returns 文件名\n */\nexport function baseName(path: string): string {\n const normalized = path.replace(/\\\\/g, '/')\n return normalized.slice(normalized.lastIndexOf('/') + 1) || path\n}\n","/**\n * dsh-vscode-mode client — 设置 scope 的跨组件上下文。\n * 绑定逻辑(webUiSettings 兼容桥 → 官方 settingsScope 降级)统一由 compat 层提供。\n * 作者 ddj 2026年08月24号\n */\nimport React from 'react'\nimport { pickSettingsBinder, type SettingsScopeLike } from './compat.js'\n\nexport type { SettingsScopeLike }\n\nexport const SettingsContext = React.createContext<SettingsScopeLike | undefined>(undefined)\n\n/**\n * 从 Cordis 服务绑定 VSCodeMode 设置 scope(兼容桥优先,官方次之)。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 设置 scope 或 undefined\n */\nexport function getSettingsScope(ctx: { get: (name: string) => unknown }): SettingsScopeLike | undefined {\n return pickSettingsBinder(ctx).scope\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — VSCodeMode 设置区「快捷键」管理页。\n * 命令目录来自 client/keybindings 的 COMMANDS;当前键位读 SettingsContext scope;\n * 编辑:行内录制(捕获下一次组合键),Esc 取消、Backspace/Delete 清空(未绑定);\n * 草稿 + 显式保存(scope.set('keybindings', draft));行级恢复 + 页级「恢复默认」;\n * 冲突键位(两命令同键位)标红警告;scope 外部变更且无未保存修改时回同步草稿。\n * 作者 ddj 2026-08-26\n */\nimport React from 'react'\nimport { SettingsContext } from '../settingsContext.js'\nimport { COMMANDS, chordFromEvent, parseChord } from '../keybindings.js'\nimport { defaultKeybindings, KEYBINDING_DEFAULTS, normalizeKeybindings } from '../../shared/keybindings.js'\n\n/**\n * 草稿化:默认值 + 设置值合并,空串归一为 null(未绑定)。\n * @param raw 设置 scope 的 keybindings 字段\n * @returns 草稿映射(id → 键位弦或 null)\n */\nexport function draftOf(raw) {\n const merged = { ...defaultKeybindings(), ...normalizeKeybindings(raw) }\n const out = {}\n for (const [id, chord] of Object.entries(merged)) out[id] = chord === '' ? null : chord\n return out\n}\n\n/**\n * 存库化:null(未绑定)转空串。\n * @param draft 草稿映射\n * @returns 可存储的键位映射\n */\nexport function storeOf(draft) {\n const out = {}\n for (const [id, chord] of Object.entries(draft)) out[id] = chord === null ? '' : chord\n return out\n}\n\n/**\n * 冲突检测:同一键位被多个命令占用 → 返回冲突命令 id 集合。\n * @param draft 草稿映射\n * @returns 冲突命令 id 集合\n */\nexport function conflictsOf(draft) {\n const byChord = new Map()\n for (const [id, chord] of Object.entries(draft)) {\n if (!chord) continue\n const list = byChord.get(chord) ?? []\n list.push(id)\n byChord.set(chord, list)\n }\n const out = new Set()\n for (const list of byChord.values()) {\n if (list.length > 1) for (const id of list) out.add(id)\n }\n return out\n}\n\n/**\n * 快捷键管理页主体。\n */\nexport function KeybindingsPanel() {\n const settings = React.useContext(SettingsContext)\n const snapshot = settings?.getSnapshot?.()\n const unavailable = !settings || snapshot?.status === 'unavailable'\n const notReady = snapshot?.status !== 'ready'\n const [draft, setDraft] = React.useState(() => draftOf(snapshot?.value?.keybindings))\n const [recording, setRecording] = React.useState(null) // 正在录制的命令 id\n const [dirty, setDirty] = React.useState(false)\n const [busy, setBusy] = React.useState(false)\n const [error, setError] = React.useState('')\n const [message, setMessage] = React.useState('')\n const dirtyRef = React.useRef(false)\n dirtyRef.current = dirty\n const lastKeyRef = React.useRef(JSON.stringify(draft)) // 草稿内容指纹(内容未变不 setState,防外部快照引用不稳导致循环)\n const snapshotValue = snapshot?.value?.keybindings\n\n // scope 外部变更(如重置/其他端写入)且无未保存修改时回同步草稿\n React.useEffect(() => {\n if (dirtyRef.current) return\n const next = draftOf(snapshotValue)\n const key = JSON.stringify(next)\n if (key === lastKeyRef.current) return\n lastKeyRef.current = key\n setDraft(next)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [snapshotValue])\n\n // 录制态:窗口捕获下一次组合键(preventDefault 防浏览器默认动作)\n React.useEffect(() => {\n if (!recording) return\n const onKey = (e) => {\n e.preventDefault()\n e.stopPropagation()\n if (e.key === 'Escape') { setRecording(null); return }\n if (e.key === 'Backspace' || e.key === 'Delete') {\n setDraft((prev) => Object.assign({}, prev, { [recording]: null }))\n setRecording(null)\n setDirty(true)\n return\n }\n const chord = chordFromEvent(e)\n if (!chord) return\n setDraft((prev) => Object.assign({}, prev, { [recording]: chord }))\n setRecording(null)\n setDirty(true)\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [recording])\n\n const conflicts = conflictsOf(draft)\n const save = () => {\n if (!settings?.set) { setError('设置服务不可用'); return }\n setBusy(true)\n setError('')\n setMessage('')\n settings.set('keybindings', storeOf(draft)).then(() => {\n setDirty(false)\n lastKeyRef.current = JSON.stringify(draft)\n setMessage('已保存')\n }).catch((e) => setError(String(e))).finally(() => setBusy(false))\n }\n\n /**\n * 恢复全部默认(确认后直接保存,一步到位)。\n */\n const resetAll = () => {\n if (!settings?.set) { setError('设置服务不可用'); return }\n if (!window.confirm('恢复全部快捷键为默认值?')) return\n setBusy(true)\n setError('')\n setMessage('')\n settings.set('keybindings', { ...defaultKeybindings() }).then(() => {\n const next = draftOf({})\n setDraft(next)\n lastKeyRef.current = JSON.stringify(next)\n setDirty(false)\n setMessage('已恢复默认')\n }).catch((e) => setError(String(e))).finally(() => setBusy(false))\n }\n\n /** 行级恢复该项默认值(进草稿,随保存提交)。 */\n const resetRow = (id) => {\n setDraft((prev) => Object.assign({}, prev, { [id]: KEYBINDING_DEFAULTS[id] ?? null }))\n setDirty(true)\n }\n\n const rows = COMMANDS.map((command) => {\n const chord = draft[command.id] ?? null\n const conflict = chord !== null && conflicts.has(command.id)\n const invalid = chord !== null && parseChord(chord) === null\n const recordingRow = recording === command.id\n let display\n if (recordingRow) {\n display = React.createElement('span', { className: 'vsm-kb-rec' }, '按下组合键…(Esc 取消 / Backspace 清除)')\n } else {\n display = React.createElement('kbd', { className: 'vsm-kb-key' + (conflict ? ' warn' : '') + (invalid ? ' invalid' : '') },\n chord ?? '未绑定')\n }\n return React.createElement('div', { key: command.id, className: 'vsm-kb-row' + (recordingRow ? ' rec' : '') },\n React.createElement('div', { className: 'vsm-kb-label' },\n React.createElement('span', null, command.label),\n conflict && React.createElement('small', { className: 'vsm-kb-warn' }, '与另一命令冲突'),\n invalid && React.createElement('small', { className: 'vsm-kb-warn' }, '键位格式无效')),\n display,\n React.createElement('div', { className: 'vsm-kb-actions' },\n recordingRow\n ? React.createElement('button', { onClick: () => setRecording(null) }, '取消')\n : React.createElement(React.Fragment, null,\n React.createElement('button', { disabled: unavailable || notReady || busy || snapshot?.writable === false, onClick: () => { setRecording(command.id); setMessage('') } }, '编辑'),\n React.createElement('button', { disabled: busy, onClick: () => resetRow(command.id) }, '恢复')),\n ))\n })\n\n return React.createElement('section', { className: 'vsm-general-page' },\n React.createElement('h2', null, '快捷键'),\n React.createElement('p', null, '配置编辑器视图的快捷键(保存 / 快速打开 / 侧边栏 / 搜索)。修改即时写入配置,重新聚焦编辑器后生效。'),\n unavailable && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, '设置服务暂不可用,当前使用默认键位。'),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n message && React.createElement('div', { className: 'vsm-kb-message' }, message),\n React.createElement('section', { className: 'vsm-panel' },\n React.createElement('h3', { className: 'vsm-panel-title' }, '编辑器键位'),\n React.createElement('div', { className: 'vsm-panel-body' }, React.createElement('div', { className: 'vsm-kb-list' }, rows)),\n React.createElement('div', { className: 'vsm-panel-body vsm-kb-actionsbar' },\n React.createElement('span', { className: 'vsm-kb-dirty' }, dirty ? '有未保存的修改' : ''),\n React.createElement('button', { className: 'vsm-primary vsm-small', disabled: unavailable || notReady || busy || snapshot?.writable === false || !dirty, onClick: save }, busy ? '保存中…' : '保存'),\n React.createElement('button', { className: 'vsm-small', disabled: unavailable || notReady || busy || snapshot?.writable === false, onClick: resetAll }, '恢复默认')),\n ),\n )\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 「语言服务器」设置子 Tab。\n * 四视图:服务器(状态 + 每语言启用/命令/路径)|已安装(卸载/更新)|市场(Open VSX 搜索/安装 + 本地 vsix)|更新。\n * 状态经 edrv.lsp.status,配置经 edrv.lsp.configGet/Update,扩展经 edrv.lsp.ext.*。\n * 作者 ddj 2026-08-27\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport '../styles/mcp.css'\n\nconst LANGUAGES = [\n { id: 'lua', label: 'Lua(EmmyLua / LuaLS)', hint: '优先使用已安装 EmmyLua;未安装时回退 LuaLS 或 PATH 中的 lua-language-server' },\n { id: 'csharp', label: 'C#(Roslyn / OmniSharp)', hint: '需 dotnet + ms-dotnettools.csharp 的 .roslyn 服务器,或手动指定' },\n]\n\nconst PHASE_LABEL = {\n idle: '未启动', starting: '启动中', ready: '就绪', indexing: '索引中', unavailable: '不可用', stopped: '已停止',\n}\nconst SOURCE_LABEL = { extension: '扩展', discover: '自动发现', manual: '手动配置', none: '未配置' }\nconst TABS = [\n { id: 'servers', label: '服务器' },\n { id: 'installed', label: '已安装' },\n { id: 'market', label: '市场' },\n { id: 'updates', label: '更新' },\n]\n\n/** 语言卡片:状态 + 启用开关 + 命令/路径配置 + 重新检测。 */\nfunction LangCard({ lang, config, status, busy, onToggle, onSave, onRedetect }) {\n const [pathDraft, setPathDraft] = React.useState(config?.path ?? '')\n const [commandDraft, setCommandDraft] = React.useState(config?.command ?? '')\n React.useEffect(() => { setPathDraft(config?.path ?? ''); setCommandDraft(config?.command ?? '') }, [config?.path, config?.command])\n const phase = status?.phase ?? 'idle'\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' },\n React.createElement('span', { className: 'vsm-mcp-dot ' + (phase === 'ready' || phase === 'indexing' ? 'connected' : phase === 'unavailable' ? 'error' : 'disabled') }),\n lang.label),\n React.createElement('div', { className: 'vsm-mcp-actions' },\n React.createElement('button', { className: 'vsm-switch ' + (config?.enabled !== false ? 'on' : ''), onClick: () => onToggle(lang.id, config?.enabled !== false ? false : true), 'aria-label': '启用/禁用' }, config?.enabled !== false ? '●' : '○'))),\n React.createElement('div', { className: 'vsm-mcp-meta' },\n PHASE_LABEL[phase] ?? phase, ' · ', SOURCE_LABEL[status?.source] ?? status?.source,\n status?.providerName ? ' · ' + status.providerName : '',\n status?.version ? ' · v' + status.version : '',\n (phase === 'ready' && status?.root) ? ' · ' + String(status.root).split(/[\\\\/]/).pop() : ''),\n status?.reason ? React.createElement('div', { className: 'vsm-mcp-error' }, status.reason) : null,\n React.createElement('div', { className: 'vsm-lsp-form' },\n React.createElement('label', null, React.createElement('span', null, '可执行文件路径(绝对路径,优先)'), React.createElement('input', { value: pathDraft, placeholder: '如 C:/.../lua-language-server.exe', onChange: (e) => setPathDraft(e.target.value) })),\n React.createElement('label', null, React.createElement('span', null, '命令名(PATH 内查找)'), React.createElement('input', { value: commandDraft, placeholder: '如 lua-language-server', onChange: (e) => setCommandDraft(e.target.value) })),\n React.createElement('button', { className: 'vsm-primary', disabled: busy === lang.id, onClick: () => onSave(lang.id, pathDraft, commandDraft) }, busy === lang.id ? '保存中…' : '保存配置'),\n React.createElement('button', { className: 'vsm-primary vsm-small', disabled: busy === lang.id, onClick: () => onRedetect(lang.id), title: '清缓存并重新选择语言服务器(EmmyLua / LuaLS)' }, busy === lang.id ? '检测中…' : '重新检测')),\n React.createElement('div', { className: 'vsm-lsp-hint' }, lang.hint))\n}\n\n/** 已装扩展卡片:清单 + 卸载/更新。 */\nfunction InstalledCard({ ext, busy, onUninstall, onUpdate }) {\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' },\n React.createElement('span', { className: 'vsm-mcp-dot connected' }),\n React.createElement('span', null, ext.displayName || ext.name),\n React.createElement('span', { className: 'vsm-ext-ver' }, ext.id + ' · v' + ext.version)),\n React.createElement('div', { className: 'vsm-mcp-actions' },\n React.createElement('button', { className: 'vsm-primary vsm-small', disabled: busy === ext.id, onClick: () => onUpdate(ext) }, '更新'),\n React.createElement('button', { className: 'vsm-danger vsm-small', disabled: busy === ext.id, onClick: () => onUninstall(ext) }, '卸载'))),\n ext.description ? React.createElement('div', { className: 'vsm-lsp-hint' }, ext.description) : null)\n}\n\n/** 市场条目卡片:安装/已装态。 */\nfunction MarketCard({ item, installed, busy, onInstall }) {\n const has = installed.some((e) => e.id === item.id)\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' },\n React.createElement('span', { className: 'vsm-mcp-dot ' + (has ? 'connected' : 'disabled') }),\n React.createElement('span', null, item.displayName || item.name),\n React.createElement('span', { className: 'vsm-ext-ver' }, item.id + ' · v' + item.version)),\n React.createElement('div', { className: 'vsm-mcp-actions' },\n React.createElement('button', { className: 'vsm-primary vsm-small', disabled: has || busy === item.id, onClick: () => onInstall(item) }, has ? '已安装' : '安装'))),\n item.description ? React.createElement('div', { className: 'vsm-lsp-hint' }, item.description) : null)\n}\n\n/**\n * 语言服务器设置页:服务器状态/配置 + VSIX 扩展(安装/更新/卸载三视图)。\n * @author ddj 2026年08月27号\n */\nexport function LspSettings() {\n const [tab, setTab] = React.useState('servers')\n const [config, setConfig] = React.useState({})\n const [servers, setServers] = React.useState([])\n const [installed, setInstalled] = React.useState([])\n const [updates, setUpdates] = React.useState([])\n const [market, setMarket] = React.useState([])\n const [query, setQuery] = React.useState('')\n const [vsixPath, setVsixPath] = React.useState('')\n const [busy, setBusy] = React.useState('')\n const [error, setError] = React.useState('')\n const [loading, setLoading] = React.useState(true)\n\n const refreshServers = React.useCallback(() => {\n Promise.all([rpc('edrv.lsp.configGet', {}), rpc('edrv.lsp.status', {})])\n .then(([cfg, st]) => {\n if (cfg?.ok) setConfig(cfg.config ?? {})\n if (st?.ok) setServers(st.servers ?? [])\n setError('')\n })\n .catch((e) => setError(String(e)))\n }, [])\n\n const refreshExt = React.useCallback(() => {\n Promise.all([rpc('edrv.lsp.ext.list', {}), rpc('edrv.lsp.ext.updates', {})])\n .then(([l, u]) => {\n if (l?.ok) setInstalled(l.extensions ?? [])\n if (u?.ok) setUpdates(u.updates ?? [])\n setError('')\n })\n .catch((e) => setError(String(e)))\n }, [])\n\n const refresh = React.useCallback(() => {\n setLoading(true)\n Promise.all([refreshServers(), refreshExt()]).finally(() => setLoading(false))\n }, [refreshServers, refreshExt])\n\n React.useEffect(() => { refresh() }, [refresh])\n\n const switchTab = (next) => {\n setTab(next)\n setError('')\n if (next === 'market' && !query) setQuery('lua language server')\n if (next === 'installed' || next === 'updates') void refreshExt()\n if (next === 'servers') void refreshServers()\n }\n\n /** 合并 redetect/configUpdate 返回的服务器状态:只替换该语言条目。 */\n const mergeServers = (languageId, list) => {\n setServers((prev) => Array.isArray(list)\n ? [...prev.filter((s) => s.languageId !== languageId), ...list]\n : prev)\n }\n\n /** 重检测后通知编辑器:与 host 重新同步已打开的模型(触发重新 acquire)。 */\n const notifyResync = (languageId) => {\n window.dispatchEvent(new CustomEvent('edrv:lsp-redetect', { detail: { languageId } }))\n }\n\n const saveLang = (languageId, path, command) => {\n setBusy(languageId)\n setError('')\n rpc('edrv.lsp.configUpdate', { languageId, path, command })\n .then((res) => {\n if (!res?.ok) { setError(res?.error ?? '保存失败'); return }\n setConfig(res.config ?? {})\n mergeServers(languageId, res.servers)\n notifyResync(languageId) // 保存后自动重新检测 + 同步模型\n })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n const toggleLang = (languageId, enabled) => {\n setBusy(languageId)\n rpc('edrv.lsp.configUpdate', { languageId, enabled })\n .then((res) => {\n if (!res?.ok) { setError(res?.error ?? '切换失败'); return }\n setConfig(res.config ?? {})\n mergeServers(languageId, res.servers)\n notifyResync(languageId) // 切换启用状态后自动重新检测 + 同步模型\n })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n const redetectLang = (languageId) => {\n setBusy(languageId)\n setError('')\n rpc('edrv.lsp.redetect', { languageId })\n .then((res) => {\n if (!res?.ok) { setError(res?.error ?? '重新检测失败'); return }\n mergeServers(languageId, res.servers)\n notifyResync(languageId)\n })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n const searchMarket = () => {\n if (!query.trim()) return\n setBusy('__market')\n setError('')\n rpc('edrv.lsp.ext.market', { query: query.trim(), size: 12 })\n .then((res) => {\n if (res?.ok) setMarket(res.extensions ?? [])\n else setError(res?.error ?? '搜索失败')\n })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n const installMarket = (item) => {\n setBusy(item.id)\n setError('')\n rpc('edrv.lsp.ext.install', { namespace: item.namespace, name: item.name })\n .then((res) => {\n if (!res?.ok) { setError(res?.error ?? '安装失败'); return }\n void refreshExt()\n })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n const installLocal = () => {\n if (!vsixPath.trim()) return\n setBusy('__vsix')\n setError('')\n rpc('edrv.lsp.ext.install', { vsixPath: vsixPath.trim() })\n .then((res) => {\n if (!res?.ok) { setError(res?.error ?? '安装失败'); return }\n setVsixPath('')\n void refreshExt()\n })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n const uninstallExt = (ext) => {\n if (!window.confirm('卸载扩展 ' + ext.id + '?')) return\n setBusy(ext.id)\n setError('')\n rpc('edrv.lsp.ext.uninstall', { id: ext.id })\n .then((res) => {\n if (!res?.ok) setError(res?.error ?? '卸载失败')\n void refreshExt()\n })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n const updateExt = (ext) => {\n setBusy(ext.id)\n setError('')\n rpc('edrv.lsp.ext.update', { id: ext.id })\n .then((res) => {\n if (!res?.ok) setError(res?.error ?? '更新失败')\n void refreshExt()\n })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n if (loading) return React.createElement('div', { className: 'vsm-mcp-empty' }, '正在读取语言服务器状态…')\n const nav = React.createElement('nav', { className: 'vsm-mcp-tabs' },\n TABS.map((t) => React.createElement('button', { key: t.id, className: tab === t.id ? 'active' : '', onClick: () => switchTab(t.id) }, t.label)))\n const header = React.createElement('div', { className: 'vsm-mcp-header' },\n React.createElement('div', null,\n React.createElement('h2', null, '语言服务器(LSP)'),\n React.createElement('p', null, '代码索引 / 引用查找 / 动态跳转;可安装 VSIX 语言服务器扩展(Open VSX 市场 / 本地 .vsix)。')),\n React.createElement('button', { className: 'vsm-primary', onClick: refresh }, '↻ 刷新'))\n const banner = error ? React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error) : null\n\n /** 线框面板容器:标题 + 内容体。 */\n const panel = (title, children) => React.createElement('section', { className: 'vsm-panel' },\n React.createElement('h3', { className: 'vsm-panel-title' }, title),\n React.createElement('div', { className: 'vsm-panel-body' }, children),\n )\n\n let body = null\n if (tab === 'servers') {\n body = panel('语言服务器', React.createElement(React.Fragment, null,\n LANGUAGES.map((lang) => React.createElement(LangCard, {\n key: lang.id, lang,\n config: config[lang.id] ?? {},\n status: servers.find((s) => s.languageId === lang.id),\n busy, onToggle: toggleLang, onSave: saveLang, onRedetect: redetectLang,\n })),\n React.createElement('div', { className: 'vsm-lsp-hint' }, '提示:打开 Lua/C# 文件即自动(惰性)启动对应语言服务器;未配置时编辑器功能不受影响,大纲回退内置解析。')))\n } else if (tab === 'installed') {\n body = panel('已安装扩展', React.createElement(React.Fragment, null,\n React.createElement('div', { className: 'vsm-lsp-hint' }, '已安装的语言服务器扩展(存于 ~/.dsh/dsh-vscode-mode/extensions/)。语言服务器被自动发现为「扩展」源。'),\n installed.length ? installed.map((ext) => React.createElement(InstalledCard, { key: ext.id, ext, busy, onUninstall: uninstallExt, onUpdate: updateExt }))\n : React.createElement('div', { className: 'vsm-mcp-empty' }, '还没有安装扩展(去「市场」或指定本地 .vsix)')))\n } else if (tab === 'market') {\n body = panel('扩展市场', React.createElement(React.Fragment, null,\n React.createElement('div', { className: 'vsm-lsp-form' },\n React.createElement('label', null, React.createElement('span', null, '搜索 Open VSX 市场'), React.createElement('input', { value: query, placeholder: '如 sumneko.lua / lua language server', onChange: (e) => setQuery(e.target.value), onKeyDown: (e) => { if (e.key === 'Enter') searchMarket() } })),\n React.createElement('button', { className: 'vsm-primary', disabled: busy === '__market', onClick: searchMarket }, busy === '__market' ? '搜索中…' : '搜索')),\n React.createElement('div', { className: 'vsm-lsp-form' },\n React.createElement('label', null, React.createElement('span', null, '安装本地 .vsix 文件(服务器绝对路径)'), React.createElement('input', { value: vsixPath, placeholder: '如 C:/Downloads/sumneko.lua-3.19.1.vsix', onChange: (e) => setVsixPath(e.target.value) })),\n React.createElement('button', { className: 'vsm-primary', disabled: busy === '__vsix', onClick: installLocal }, busy === '__vsix' ? '安装中…' : '安装本地 .vsix')),\n React.createElement('div', { className: 'vsm-lsp-hint' }, '市场安装会下载并解包 VSIX 到扩展目录;含语言服务器(如 sumneko.lua)的扩展会被自动发现。'),\n market.map((item) => React.createElement(MarketCard, { key: item.id, item, installed, busy, onInstall: installMarket }))))\n } else {\n body = panel('可用更新', React.createElement(React.Fragment, null,\n React.createElement('div', { className: 'vsm-lsp-hint' }, '已装扩展与 Open VSX 最新版的差异。'),\n updates.length ? updates.map((u) => React.createElement('article', { key: u.id, className: 'vsm-mcp-card' },\n React.createElement('div', { className: 'vsm-mcp-card-head' },\n React.createElement('div', { className: 'vsm-mcp-title' },\n React.createElement('span', { className: 'vsm-mcp-dot error' }),\n React.createElement('span', null, u.displayName || u.id),\n React.createElement('span', { className: 'vsm-ext-ver' }, 'v' + u.current + ' → v' + u.latest)),\n React.createElement('div', { className: 'vsm-mcp-actions' },\n React.createElement('button', { className: 'vsm-primary vsm-small', disabled: busy === u.id, onClick: () => updateExt(u) }, busy === u.id ? '更新中…' : '更新')))))\n : React.createElement('div', { className: 'vsm-mcp-empty' }, '全部已是最新')))\n }\n return React.createElement('div', null, header, nav, banner, body)\n}\n","/**\n * dsh-vscode-mode client — 「性能优化」页工作区栏目展开状态持久化(纯函数,可单测)。\n * 只持久化「已展开」的工作区键集合(默认全部折叠),对齐 explorerCache 的做法:\n * 不缓存会话条目本身,条目由 edrv.perf.inventory 实时返回。\n * 键前缀统一走 paths.ts PathConst(CACHE_KEY.workspaceFold)。\n * 作者 ddj 2026-09-02\n */\nimport { CACHE_KEY } from '../paths.js'\n\n/** localStorage 键(全局,不按会话隔离)。 */\nconst STORE_KEY = CACHE_KEY.workspaceFold\n\n/** 展开键容量上限:超出丢弃尾部,防止无限增长撑爆配额。 */\nexport const FOLD_CAP = 300\n\n/**\n * 归一化工作区键:仅去首尾空白(工作区键非文件系统路径,不做斜杠转换)。\n * @author ddj 2026年09月02号\n * @param key 工作区标识\n * @returns 归一化键,空值返回 ''\n */\nexport function normalizeFoldKey(key: string | undefined | null): string {\n return String(key ?? '').trim()\n}\n\n/**\n * 裁剪展开键集:去重、丢弃空值、超容量丢弃尾部(保持传入顺序)。\n * @author ddj 2026年09月02号\n * @param expanded 原始展开键集合\n * @returns 规范化后的键数组\n */\nexport function sanitizeFolded(expanded: unknown): string[] {\n if (!Array.isArray(expanded)) return []\n const seen = new Set<string>()\n const out: string[] = []\n for (const item of expanded) {\n const key = normalizeFoldKey(typeof item === 'string' ? item : '')\n if (!key || seen.has(key)) continue\n seen.add(key)\n out.push(key)\n if (out.length >= FOLD_CAP) break\n }\n return out\n}\n\n/**\n * 序列化展开状态(JSON,带 schema 版本号)。\n * @author ddj 2026年09月02号\n * @param expanded 已展开的项目键集合\n * @returns JSON 字符串\n */\nexport function serializeFold(expanded: string[]): string {\n return JSON.stringify({ v: 1, expanded: sanitizeFolded(expanded) })\n}\n\n/**\n * 解析缓存文本;损坏/格式不符 → 空集合。\n * @author ddj 2026年09月02号\n * @param text localStorage 原文\n * @returns 已展开键集合\n */\nexport function parseFold(text: string | null): string[] {\n if (!text) return []\n try {\n const data = JSON.parse(text)\n if (!data || typeof data !== 'object') return []\n return sanitizeFolded(data.expanded)\n } catch (error) {\n return []\n }\n}\n\n/**\n * 读取展开状态(localStorage 不可用 → 空集合)。\n * @author ddj 2026年09月02号\n * @returns 已展开键集合\n */\nexport function foldLoad(): string[] {\n try {\n return parseFold(window.localStorage.getItem(STORE_KEY))\n } catch (error) {\n return []\n }\n}\n\n/**\n * 写入展开状态(配额满/隐私模式失败静默)。\n * @author ddj 2026年09月02号\n * @param expanded 已展开键集合\n */\nexport function foldSave(expanded: string[]): void {\n try {\n window.localStorage.setItem(STORE_KEY, serializeFold(expanded))\n } catch (error) { /* 配额满/隐私模式忽略 */ }\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — PerfSettings:「性能优化」设置子页(会话卫生 + 压缩调优)。\n * - 会话盘点:全工作区/每会话体积、活跃标记,按体积排序;\n * - 移出到归档(先规划→确认→执行→可恢复)与归档清除;\n * - DSH 内置压缩调优:写 profile patch(compaction-basic / tool-result-pruner 更低阈值,\n * 带备份与撤销,需重启生效);\n * - 侧车摘要用法提示(agent/脚本取关键字段,不整份读 .dsh-edit-review.json)。\n * 作者 ddj 2026-09-02\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { foldLoad, foldSave, normalizeFoldKey } from '../state/workspaceFoldCache.js'\nimport '../styles/mcp.css'\n\n/** 字节数人类可读。 */\nfunction formatBytes(n) {\n if (!n) return '0B'\n if (n >= 1024 * 1024) return (n / (1024 * 1024)).toFixed(1) + 'MB'\n if (n >= 1024) return (n / 1024).toFixed(0) + 'KB'\n return n + 'B'\n}\n\n/** 会话行 key:workspaceKey \\u0000 sessionId。 */\nconst keyOf = (ws, id) => ws + '\\u0000' + id\n\n/** 工作区列表每页条数。 */\nconst PAGE_SIZE = 7\n\n/**\n * 计算分页(纯函数,可单测)。\n * 作者 ddj 2026年09月02号\n * @param total 总条数\n * @param pageSize 每页条数\n * @param page 当前页码(1 起)\n * @returns 归一化后的分页信息(page 被夹到有效范围)\n */\nexport function paginate(total, pageSize, page) {\n const size = Math.max(1, Math.floor(pageSize) || 1)\n const pages = Math.max(1, Math.ceil(total / size))\n const current = Math.min(Math.max(1, Math.floor(page) || 1), pages)\n const start = (current - 1) * size\n return { page: current, pages, pageSize: size, start, end: Math.min(start + size, total), total }\n}\n\n/**\n * 取当前页切片(纯函数,可单测)。\n * 作者 ddj 2026年09月02号\n * @param items 全量列表\n * @param page 当前页码(1 起)\n * @param pageSize 每页条数\n * @returns 当前页子数组\n */\nexport function pageSlice(items, page, pageSize) {\n const list = items ?? []\n const { start, end } = paginate(list.length, pageSize, page)\n return list.slice(start, end)\n}\n\n/** 单行会话。 */\nfunction SessionRow({ row, checked, disabled, onToggle }) {\n const age = Math.max(0, (Date.now() - row.mtime) / (24 * 3600 * 1000))\n const when = age < 1 ? Math.round(age * 24) + 'h' : Math.round(age) + 'd'\n return React.createElement('label', { className: 'vsm-perf-row' },\n React.createElement('input', { type: 'checkbox', checked, disabled, onChange: onToggle }),\n React.createElement('span', { className: 'vsm-perf-cell vsm-perf-id', title: row.sessionId }, row.sessionId),\n React.createElement('span', { className: 'vsm-perf-cell vsm-perf-size ' + (row.bytes >= 1024 * 1024 ? 'big' : '') }, formatBytes(row.bytes)),\n React.createElement('span', { className: 'vsm-perf-cell vsm-perf-mtime', title: new Date(row.mtime).toLocaleString() }, when),\n row.active ? React.createElement('span', { className: 'vsm-perf-cell vsm-perf-active' }, '活跃') : null,\n )\n}\n\n/**\n * 工作区列表分页器:顶部文案 + 上一页/下一页交互。\n * 作者 ddj 2026年09月02号\n * @param {object} info paginate() 的分页信息\n * @param {Function} onPrev 上一页回调\n * @param {Function} onNext 下一页回调\n */\nfunction WorkspacePager({ info, onPrev, onNext }) {\n const { page, pages, start, end, total } = info\n return React.createElement('div', { className: 'vsm-perf-pager' },\n React.createElement('span', { className: 'vsm-perf-pager-text' },\n total ? `第 ${start + 1}–${end} 个 / 共 ${total} 个工作区(第 ${page}/${pages} 页)` : '暂无工作区',\n ),\n React.createElement('div', { className: 'vsm-perf-pager-actions' },\n React.createElement('button', { className: 'vsm-secondary vsm-small', onClick: onPrev, disabled: page <= 1 }, '‹ 上一页'),\n React.createElement('button', { className: 'vsm-secondary vsm-small', onClick: onNext, disabled: page >= pages }, '下一页 ›'),\n ),\n )\n}\n\n/**\n * 工作区栏目(可展开/折叠),内含该工作区的会话行。\n * 作者 ddj 2026年09月02号\n * @param {object} ws 工作区汇总(workspaceKey / totalBytes)\n * @param {object[]} rows 该工作区的会话行\n * @param {boolean} expanded 是否展开\n * @param {Function} onToggleFold 展开/折叠切换回调\n * @param {object} selected 已选会话键集合\n * @param {boolean} locked 会话勾选是否禁用(移出执行中)\n * @param {Function} onToggleRow 单行勾选回调\n */\nfunction WorkspaceBlock({ ws, rows, expanded, onToggleFold, selected, locked, onToggleRow }) {\n const head = React.createElement('div', { className: 'vsm-perf-ws-head', role: 'button', tabIndex: 0, 'aria-expanded': expanded, onClick: onToggleFold, onKeyDown: (event) => {\n if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); onToggleFold() }\n } },\n React.createElement('span', { className: 'vsm-perf-ws-caret ' + (expanded ? 'open' : '') }, '▸'),\n React.createElement('span', { className: 'vsm-perf-ws-name', title: ws.workspaceKey }, ws.workspaceKey),\n React.createElement('span', { className: 'vsm-perf-ws-meta' }, rows.length + ' 会话 · ' + formatBytes(ws.totalBytes)),\n )\n if (!expanded) return React.createElement('div', { className: 'vsm-perf-ws' }, head)\n const body = rows.length ? rows.map((row) => React.createElement(SessionRow, {\n key: keyOf(row.workspaceKey, row.sessionId),\n row,\n checked: !!selected[keyOf(row.workspaceKey, row.sessionId)],\n disabled: row.active || locked,\n onToggle: () => onToggleRow(keyOf(row.workspaceKey, row.sessionId)),\n })) : React.createElement('div', { className: 'vsm-mcp-empty' }, '无会话')\n return React.createElement('div', { className: 'vsm-perf-ws expanded' }, head, React.createElement('div', { className: 'vsm-perf-rows' }, body))\n}\n\n/**\n * 会话卫生 + 压缩调优设置子页。\n * @author ddj 2026年09月02号\n */\nexport function PerfSettings() {\n const [inv, setInv] = React.useState(null)\n const [error, setError] = React.useState('')\n const [busy, setBusy] = React.useState('')\n const [selected, setSelected] = React.useState({})\n const [confirm, setConfirm] = React.useState(null)\n const [moved, setMoved] = React.useState(null)\n const [config, setConfig] = React.useState(null)\n const [expanded, setExpanded] = React.useState(() => foldLoad())\n const [page, setPage] = React.useState(1)\n\n React.useEffect(() => { foldSave(expanded) }, [expanded])\n\n /** 数据变化后把越界页码夹回有效范围。 */\n const workspaces = inv?.workspaces ?? []\n const pageInfo = paginate(workspaces.length, PAGE_SIZE, page)\n React.useEffect(() => {\n if (page !== pageInfo.page) setPage(pageInfo.page)\n }, [page, pageInfo.page])\n\n /** 切换某工作区栏目的展开/折叠(默认全折叠)。 */\n const toggleFold = (key) => setExpanded((old) => old.includes(key) ? old.filter((item) => item !== key) : old.concat(key))\n\n /** 切换单会话勾选。 */\n const toggleRow = (k) => setSelected((old) => { const next = { ...old }; if (next[k]) delete next[k]; else next[k] = true; return next })\n\n const load = React.useCallback(() => {\n setError('')\n Promise.all([rpc('edrv.perf.inventory', {}), rpc('edrv.perf.configGet', {})]).then(([i, c]) => {\n if (!i.ok) throw new Error(i.error)\n if (!c.ok) throw new Error(c.error)\n setInv(i)\n setConfig(c)\n }).catch((e) => setError(String(e)))\n }, [])\n\n React.useEffect(load, [load])\n\n const action = (id, method, args, patch) => {\n setBusy(id)\n setError('')\n return rpc(method, args).then((res) => {\n if (!res.ok) throw new Error(res.error)\n if (patch) patch(res)\n return res\n }).catch((e) => setError(String(e))).finally(() => setBusy(''))\n }\n\n /** 圈选 ≥ 1MB 的非活跃会话。 */\n const selectBig = () => {\n if (!inv) return\n const next = {}\n for (const s of inv.sessions) {\n if (s.bytes >= 1024 * 1024 && !s.active) next[keyOf(s.workspaceKey, s.sessionId)] = true\n }\n setSelected(next)\n }\n\n /** 清空选择。 */\n const clearSel = () => setSelected({})\n\n /** 规划移出所选(跨工作区按 sessionIds 一次规划)。 */\n const planMove = () => {\n const sessionIds = Object.keys(selected).map((k) => k.slice(k.indexOf('\\u0000') + 1))\n if (!sessionIds.length) return\n action('plan', 'edrv.perf.movePlan', { sessionIds }).then((res) => {\n if (res.items?.length) setConfirm(res)\n else setError('所选会话没有可移出的项(活跃会话已排除)')\n })\n }\n\n /** 确认移出:按工作区分组逐组执行,成功后刷新并记录可恢复项。 */\n const doMove = () => {\n const grouped = {}\n for (const item of confirm.items) {\n const list = grouped[item.workspaceKey] ?? (grouped[item.workspaceKey] = [])\n list.push(item.sessionId)\n }\n const jobs = Object.entries(grouped).map(([ws, sessionIds]) => rpc('edrv.perf.moveOut', { workspaceKey: ws, sessionIds }))\n Promise.all(jobs).then((results) => {\n const allMoved = []\n const failures = []\n for (const res of results) {\n if (!res.ok) { failures.push(res.error); continue }\n allMoved.push(...(res.moved ?? []))\n failures.push(...(res.failures ?? []).map((f) => f.sessionId + ': ' + f.error))\n }\n setMoved({ moved: allMoved, failures, reclaimedBytes: allMoved.reduce((s, i) => s + i.bytes, 0) })\n setConfirm(null)\n setSelected({})\n load()\n }).catch((e) => setError(String(e)))\n }\n\n /** 恢复单个已移出会话。 */\n const doRestore = (item) => {\n action('restore', 'edrv.perf.restore', { workspaceKey: item.workspaceKey, sessionId: item.sessionId }).then(() => {\n setMoved((old) => old ? { ...old, moved: old.moved.filter((m) => !(m.workspaceKey === item.workspaceKey && m.sessionId === item.sessionId)) } : old)\n load()\n })\n }\n\n /** 清除归档区早于 N 天的会话(破坏性)。 */\n const doPurge = () => {\n if (!window.confirm('确认永久删除归档区中 30 天前的会话?此操作不可恢复(仅归档区,不影响当前 sessions)。')) return\n action('purge', 'edrv.perf.purgeArchive', { olderThanDays: 30 }).then((res) => {\n setError('已清除 ' + (res.removed ?? 0) + ' 个归档会话,释放 ' + formatBytes(res.reclaimedBytes ?? 0))\n })\n }\n\n /** 应用压缩调优到 profile patch。 */\n const applyConfig = () => {\n action('apply', 'edrv.perf.configApply', {}).then((res) => {\n setError('已写入压缩调优配置(备份 ' + res.backup + '),重启 DSH 后生效')\n load()\n })\n }\n\n /** 撤销压缩调优。 */\n const undoConfig = () => {\n action('undo', 'edrv.perf.configUndo', {}).then(() => {\n setError('已撤销压缩调优配置(恢复备份)')\n load()\n })\n }\n\n const totals = inv?.totals\n const summaryCards = totals ? React.createElement('div', { className: 'vsm-perf-cards' },\n React.createElement('div', { className: 'vsm-perf-card' }, React.createElement('span', null, '工作区'), React.createElement('b', null, String(totals.workspaces))),\n React.createElement('div', { className: 'vsm-perf-card' }, React.createElement('span', null, '会话数'), React.createElement('b', null, String(totals.sessions))),\n React.createElement('div', { className: 'vsm-perf-card' }, React.createElement('span', null, '压缩态总体积'), React.createElement('b', { className: totals.totalBytes >= 50 * 1024 * 1024 ? 'big' : '' }, formatBytes(totals.totalBytes))),\n ) : null\n\n const visible = pageSlice(workspaces, pageInfo.page, PAGE_SIZE)\n const workspacePager = workspaces.length > PAGE_SIZE ? React.createElement(WorkspacePager, {\n info: pageInfo,\n onPrev: () => setPage((old) => Math.max(1, old - 1)),\n onNext: () => setPage((old) => Math.min(pageInfo.pages, old + 1)),\n }) : null\n const workspaceBlocks = workspaces.length ? React.createElement('div', { className: 'vsm-perf-ws-list' }, visible.map((ws) => {\n const key = normalizeFoldKey(ws.workspaceKey)\n return React.createElement(WorkspaceBlock, {\n key: ws.workspaceKey,\n ws,\n rows: inv.sessions.filter((s) => s.workspaceKey === ws.workspaceKey),\n expanded: expanded.includes(key),\n onToggleFold: () => toggleFold(key),\n selected,\n locked: busy === 'move',\n onToggleRow: toggleRow,\n })\n })) : null\n\n const selCount = Object.keys(selected).length\n const confirmBody = confirm ? React.createElement('div', { className: 'vsm-perf-modal' },\n React.createElement('div', { className: 'vsm-perf-modal-card' },\n React.createElement('h3', null, '确认移出 ' + confirm.items.length + ' 个会话?'),\n React.createElement('p', { className: 'vsm-perf-modal-note' }, '将从 ~/.dsh/sessions 移出到 ~/.dsh/sessions-archive(可逆,重启后不再回放,释放 ' + formatBytes(confirm.reclaimedBytes) + ')。活跃会话已排除。'),\n React.createElement('ul', { className: 'vsm-perf-modal-list' }, confirm.items.slice(0, 20).map((item) => React.createElement('li', { key: item.workspaceKey + item.sessionId }, item.workspaceKey + ' / ' + item.sessionId + '(' + formatBytes(item.bytes) + ')'))),\n confirm.items.length > 20 ? React.createElement('div', { className: 'vsm-perf-modal-more' }, '…等 ' + confirm.items.length + ' 个') : null,\n React.createElement('div', { className: 'vsm-perf-modal-actions' },\n React.createElement('button', { className: 'vsm-primary', onClick: doMove, disabled: busy === 'move' }, busy === 'move' ? '执行中…' : '确认移出'),\n React.createElement('button', { className: 'vsm-secondary', onClick: () => setConfirm(null) }, '取消'),\n ),\n ),\n ) : null\n\n const movedBody = moved?.moved?.length ? React.createElement('section', { className: 'vsm-panel' },\n React.createElement('h3', { className: 'vsm-panel-title' }, '已移出 ' + moved.moved.length + ' 个会话(释放 ' + formatBytes(moved.reclaimedBytes) + ')'),\n React.createElement('div', { className: 'vsm-panel-body' },\n React.createElement('div', { className: 'vsm-perf-rows' }, moved.moved.map((item) => React.createElement('div', { key: item.workspaceKey + item.sessionId, className: 'vsm-perf-row' },\n React.createElement('span', { className: 'vsm-perf-cell vsm-perf-id' }, item.sessionId),\n React.createElement('span', { className: 'vsm-perf-cell vsm-perf-size' }, formatBytes(item.bytes)),\n React.createElement('button', { className: 'vsm-secondary vsm-small', onClick: () => doRestore(item), disabled: busy === 'restore' }, '恢复'),\n ))),\n moved.failures?.length ? React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, '失败:' + moved.failures.join(';')) : null,\n ),\n ) : null\n\n const configBody = config ? React.createElement('section', { className: 'vsm-panel' },\n React.createElement('h3', { className: 'vsm-panel-title' }, 'DSH 内置压缩调优'),\n React.createElement('div', { className: 'vsm-panel-body' },\n React.createElement('p', null, '调低 compaction-basic / tool-result-pruner 触发阈值,让长循环会话更早压缩,降低模型可见上下文压力(减少 token 与防 context overflow)。'),\n React.createElement('p', { className: 'vsm-perf-note' }, '注意:压缩只追加 compaction 事件,不重写已持久化会话日志(append-only),因此不会缩小已存在的会话文件——存量瘦身请用上方「移出到归档」。packChunks 已默认开启,无需配置。'),\n React.createElement('div', { className: 'vsm-perf-config-state' },\n React.createElement('span', { className: 'vsm-perf-cell' }, '状态:' + (config.applied ? '已应用' : '未应用')),\n config.applied ? React.createElement('button', { className: 'vsm-secondary vsm-small', onClick: undoConfig, disabled: busy === 'undo' }, '撤销') : React.createElement('button', { className: 'vsm-primary vsm-small', onClick: applyConfig, disabled: busy === 'apply' }, '应用建议配置(需重启)'),\n ),\n React.createElement('pre', { className: 'vsm-perf-block' }, config.block),\n ),\n ) : null\n\n const guideBody = React.createElement('section', { className: 'vsm-panel' },\n React.createElement('h3', { className: 'vsm-panel-title' }, '侧车摘要(agent/脚本取关键字段,不整份读 sidecar)'),\n React.createElement('div', { className: 'vsm-panel-body' },\n React.createElement('p', null, '工作区根目录的 .dsh-edit-review.json(可能数 MB)只应通过摘要接口读取,禁止 agent 整份 read/write 进对话:'),\n React.createElement('pre', { className: 'vsm-perf-block' },\n \"curl -s -X POST http://127.0.0.1:3080/edrv/rpc -H 'content-type: application/json' -d '{\\\"method\\\":\\\"edrv.perf.sidecarSummary\\\",\\\"args\\\":{}}'\\n# 差异记录列表(含每文件 pending 摘要):edrv.list\\n# 历史归档:edrv.archiveList / edrv.archiveRead\"),\n ),\n )\n\n return React.createElement('section', { className: 'vsm-perf-page' },\n React.createElement('h2', null, '会话性能'),\n React.createElement('p', null, 'DSH 启动会回放 ~/.dsh/sessions 全部会话(V8 展开约 10×),体积越大内存越吃紧。定期把巨型/旧会话移出到归档可显著降低启动内存。'),\n error ? React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error) : null,\n summaryCards,\n React.createElement('section', { className: 'vsm-panel' },\n React.createElement('h3', { className: 'vsm-panel-title' }, '会话盘点'),\n React.createElement('div', { className: 'vsm-panel-body' },\n React.createElement('div', { className: 'vsm-perf-toolbar' },\n React.createElement('button', { className: 'vsm-secondary vsm-small', onClick: selectBig }, '圈选 ≥1MB 非活跃'),\n React.createElement('button', { className: 'vsm-secondary vsm-small', onClick: clearSel, disabled: !selCount }, '清空选择'),\n React.createElement('span', { className: 'vsm-perf-selcount' }, '已选 ' + selCount + ' 个'),\n React.createElement('button', { className: 'vsm-primary vsm-small', onClick: planMove, disabled: !selCount || busy === 'plan' }, busy === 'plan' ? '规划中…' : '移出所选'),\n React.createElement('button', { className: 'vsm-secondary vsm-small', onClick: doPurge, disabled: busy === 'purge' }, '清除归档(>30天)'),\n React.createElement('button', { className: 'vsm-secondary vsm-small', onClick: load, disabled: busy === 'load' }, '⟳ 刷新'),\n ),\n workspacePager,\n workspaceBlocks,\n ),\n ),\n movedBody,\n configBody,\n guideBody,\n confirmBody,\n )\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — VSCodeMode 设置区:通用 / 快捷键 / MCP 管理 / 语言服务器 / 性能优化 / 兼容性。\n * MCP 管理 Tab 下含三个子页签:我的 MCP(profile 全局)/ 项目 MCP(各项目 .mcp.json)/ MCP 市场(占位)。\n * 作者 ddj 2026年08月22号 / 2026年08月26号 / 2026年08月27号\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport type { MpcProject, MpcServer } from '../../shared/mcp.js'\nimport '../styles/mcp.css'\nimport { availableOpeners, AUTO_OPEN_TOOL } from '../fileOpeners.js'\nimport { SettingsContext } from '../settingsContext.js'\nimport { KeybindingsPanel } from './KeybindingsPanel.js'\nimport { LspSettings } from './LspSettings.js'\nimport { PerfSettings } from './PerfSettings.js'\n\nconst EMPTY = { serverName: '', transport: 'stdio', command: '', args: '', cwd: '', url: '', headers: '' }\n\n/** 将表单草稿转换为 Host MCP 配置。 */\nfunction configOf(draft) {\n const config = { serverName: draft.serverName.trim(), transport: draft.transport }\n if (draft.transport === 'stdio') {\n config.command = draft.command.trim()\n config.args = draft.args.split(/\\r?\\n|\\s+/).filter(Boolean)\n if (draft.cwd.trim()) config.cwd = draft.cwd.trim()\n } else {\n config.url = draft.url.trim()\n config.headers = parsePairs(draft.headers)\n }\n return config\n}\n\n/** 解析每行 key=value 的表单字段。 */\nfunction parsePairs(text) {\n return Object.fromEntries(text.split(/\\r?\\n/).map((line) => line.trim()).filter(Boolean).map((line) => {\n const idx = line.indexOf('=')\n return idx > 0 ? [line.slice(0, idx).trim(), line.slice(idx + 1).trim()] : [line, '']\n }))\n}\n\n/** 服务状态文案。 */\nfunction statusOf(server) {\n return server.status === 'connected' ? '在线' : server.status === 'connecting' ? '连接中' : server.status === 'disabled' ? '已禁用' : '错误'\n}\n\n/** MCP 服务卡片(全局与项目共用)。 */\nfunction ServerCard({ server, onRefresh, onToggle, onRemove }) {\n return React.createElement('article', { className: 'vsm-mcp-card' },\n React.createElement('div', { className: 'vsm-mcp-card-head' },\n React.createElement('div', { className: 'vsm-mcp-title' }, React.createElement('span', { className: 'vsm-mcp-dot ' + (server.enabled ? server.status : 'disabled') }), server.serverName),\n React.createElement('div', { className: 'vsm-mcp-actions' },\n React.createElement('button', { onClick: () => onRefresh(server.id), title: '刷新连接' }, '↻'),\n React.createElement('button', { className: 'vsm-danger', onClick: () => onRemove(server.id), title: '删除 MCP' }, '⌫'),\n React.createElement('button', { className: 'vsm-switch ' + (server.enabled ? 'on' : ''), onClick: () => onToggle(server), 'aria-label': server.enabled ? '禁用' : '启用' }, server.enabled ? '●' : '○'),\n ),\n ),\n React.createElement('div', { className: 'vsm-mcp-meta' }, statusOf(server), ' · ', server.toolCount, ' 个工具 · ', server.transport),\n server.error && React.createElement('div', { className: 'vsm-mcp-error' }, server.error),\n React.createElement('div', { className: 'vsm-mcp-tools' }, server.tools.map((tool) => React.createElement('span', { key: tool.name, className: 'vsm-mcp-chip', title: tool.description || tool.name }, tool.name))),\n )\n}\n\n/** 按项目标题或路径过滤,大小写不敏感。 */\nexport function filterProjects(projects, query) {\n const needle = String(query ?? '').trim().toLowerCase()\n if (!needle) return projects\n return projects.filter((project) => `${project.title} ${project.workspacePath}`.toLowerCase().includes(needle))\n}\n\n/** 带搜索的项目组合框。 */\nfunction ProjectPicker({ projects, value, onChange }) {\n const [open, setOpen] = React.useState(false)\n const [query, setQuery] = React.useState('')\n const [highlight, setHighlight] = React.useState(0)\n const rootRef = React.useRef(null)\n const selected = projects.find((project) => project.workspacePath === value)\n const filtered = React.useMemo(() => filterProjects(projects, query), [projects, query])\n\n React.useEffect(() => {\n const close = (event) => {\n if (!rootRef.current?.contains(event.target)) setOpen(false)\n }\n document.addEventListener('mousedown', close)\n return () => document.removeEventListener('mousedown', close)\n }, [])\n\n const choose = (project) => {\n onChange(project.workspacePath)\n setQuery('')\n setOpen(false)\n }\n const move = (delta) => setHighlight((old) => Math.max(0, Math.min(Math.max(0, filtered.length - 1), old + delta)))\n const keyDown = (event) => {\n if (event.key === 'ArrowDown') { event.preventDefault(); move(1) }\n else if (event.key === 'ArrowUp') { event.preventDefault(); move(-1) }\n else if (event.key === 'Enter' && filtered[highlight]) { event.preventDefault(); choose(filtered[highlight]) }\n else if (event.key === 'Escape') { event.preventDefault(); setOpen(false) }\n }\n return React.createElement('div', { className: 'vsm-project-picker', ref: rootRef },\n React.createElement('button', { className: 'vsm-project-picker-trigger', role: 'combobox', 'aria-expanded': open, onClick: () => setOpen((old) => !old) },\n React.createElement('span', { className: 'vsm-project-picker-label' }, selected?.title || '选择项目', selected && React.createElement('small', null, selected.workspacePath)),\n React.createElement('span', { className: 'vsm-project-picker-arrow' }, open ? '⌃' : '⌄'),\n ),\n open && React.createElement('div', { className: 'vsm-project-picker-menu' },\n React.createElement('input', { autoFocus: true, className: 'vsm-project-picker-search', value: query, placeholder: '搜索项目名称或路径…', onChange: (event) => { setQuery(event.target.value); setHighlight(0) }, onKeyDown: keyDown }),\n React.createElement('div', { className: 'vsm-project-picker-options', role: 'listbox' }, filtered.length ? filtered.map((project, index) => React.createElement('button', { key: project.workspacePath, role: 'option', 'aria-selected': project.workspacePath === value, className: 'vsm-project-option ' + (index === highlight ? 'highlight' : '') + (project.workspacePath === value ? ' selected' : ''), onMouseEnter: () => setHighlight(index), onClick: () => choose(project) }, React.createElement('span', null, project.title), React.createElement('small', null, project.workspacePath, ' · ', project.servers.length, ' 个 MCP'))) : React.createElement('div', { className: 'vsm-project-picker-empty' }, '没有匹配的项目')),\n ),\n )\n}\n\n/** 单个项目的 MCP 分组。 */\nfunction ProjectGroup({ project, busy, onAdd, onRefresh, onToggle, onRemove }) {\n const head = React.createElement('div', { className: 'vsm-project-head' },\n React.createElement('div', { className: 'vsm-project-title' }, React.createElement('span', { className: 'vsm-project-icon' }, '▣'), React.createElement('div', null, React.createElement('span', { className: 'vsm-project-name' }, project.title), React.createElement('span', { className: 'vsm-project-path' }, project.workspacePath))),\n React.createElement('button', { className: 'vsm-primary vsm-small', onClick: () => onAdd(project) }, '+ 添加 MCP'),\n )\n let body\n if (project.missingDir) body = React.createElement('div', { className: 'vsm-project-empty' }, '项目目录已不存在,无法管理 MCP')\n else if (project.fileError) body = React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, project.fileError)\n else if (!project.servers.length) body = React.createElement('div', { className: 'vsm-project-empty' }, '此项目未配置 MCP')\n else body = project.servers.map((server) => React.createElement(ServerCard, { key: server.serverName, server, onRefresh: (id) => onRefresh(project, server, id), onToggle: () => onToggle(project, server), onRemove: (id) => onRemove(project, server, id) }))\n return React.createElement('section', { className: 'vsm-project' }, head, body)\n}\n\n/** 通用设置:选择当前对话文件链接的打开器 + 开发形态开关。 */\nfunction GeneralSettings({ registry }) {\n const [tool, setTool] = React.useState(AUTO_OPEN_TOOL)\n const [busy, setBusy] = React.useState(false)\n const [error, setError] = React.useState('')\n const [devForm, setDevForm] = React.useState(null)\n const [devBusy, setDevBusy] = React.useState(false)\n const [devMessage, setDevMessage] = React.useState('')\n const settings = React.useContext(SettingsContext)\n const snapshot = settings?.getSnapshot?.()\n const loading = !snapshot || snapshot.status === 'loading'\n const unavailable = snapshot?.status === 'unavailable' || !settings\n const notReady = snapshot?.status !== 'ready'\n React.useEffect(() => {\n const onChange = () => {\n const next = settings?.getSnapshot?.().value?.fileOpenTool\n if (typeof next === 'string') setTool(next)\n }\n onChange()\n return settings?.subscribe?.(onChange)\n }, [settings])\n React.useEffect(() => {\n rpc('vscode.devFormGet', {}).then((result) => {\n if (result.ok) setDevForm(result.devForm)\n }).catch(() => { /* 开发形态查询失败静默 */ })\n }, [])\n const save = (value) => {\n setTool(value); setBusy(true); setError('')\n if (!settings?.set) { setError('设置服务不可用'); setBusy(false); return }\n settings.set('fileOpenTool', value).catch((e) => setError(String(e))).finally(() => setBusy(false))\n }\n const closeDevForm = () => {\n if (!window.confirm('关闭开发形态:插件将切换为正式版安装(版本依赖 + 删除工作区链接),pnpm 装配后需重启 DSH 生效。确认关闭?')) return\n setDevBusy(true)\n setDevMessage('')\n rpc('vscode.devFormSet', { enabled: false }).then((result) => {\n if (!result.ok) { setDevMessage('关闭失败:' + String(result.error)); return }\n setDevForm(result.devForm)\n setDevMessage(result.restart ? '已切换为正式版,重启 DSH 后生效。' : '已关闭开发形态。')\n }).catch((e) => setDevMessage('关闭失败:' + String(e))).finally(() => setDevBusy(false))\n }\n const options = [{ id: AUTO_OPEN_TOOL, label: '自动选择', description: '按当前已注册工具自动选择' }, ...availableOpeners(registry).map((item) => ({ id: item.id, label: item.label, description: item.description }))]\n const currentOption = options.some((item) => item.id === tool) ? tool : AUTO_OPEN_TOOL\n const devFormRow = devForm?.enabled ? React.createElement('div', { className: 'vsm-general-row' },\n React.createElement('span', null, '开发形态', React.createElement('small', { className: 'vsm-devform-note' }, '工作区链接安装:' + devForm.path)),\n React.createElement('div', { className: 'vsm-devform-actions' },\n devMessage && React.createElement('small', { className: 'vsm-devform-msg' }, devMessage),\n React.createElement('button', { className: 'vsm-devform-close', disabled: devBusy, onClick: closeDevForm }, devBusy ? '切换中…' : '关闭开发形态'),\n ),\n ) : null\n return React.createElement('section', { className: 'vsm-general-page' },\n React.createElement('h2', null, '通用'),\n React.createElement('p', null, '配置 DSH 对话中文件链接的打开工具。工具由当前运行时自动扫描。'),\n unavailable && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, '设置服务暂不可用,当前使用自动选择。'),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n React.createElement('section', { className: 'vsm-panel' },\n React.createElement('h3', { className: 'vsm-panel-title' }, '文件与安装'),\n React.createElement('div', { className: 'vsm-panel-body' },\n React.createElement('label', { className: 'vsm-general-row' }, React.createElement('span', null, '文件链接使用工具'), React.createElement('select', { value: currentOption, disabled: loading || unavailable || notReady || busy || snapshot?.writable === false, onChange: (event) => save(event.target.value) }, options.map((item) => React.createElement('option', { key: item.id, value: item.id }, item.label))), loading && React.createElement('small', null, '读取中…')),\n devFormRow,\n ),\n ),\n )\n}\n\n/** 兼容性小节:host 报告(RPC compat)+ 客户端本地适配项。 */\nfunction CompatSection({ getSummary }) {\n const [report, setReport] = React.useState(null)\n const [error, setError] = React.useState('')\n React.useEffect(() => {\n let alive = true\n rpc('compat', {}).then((result) => {\n if (!alive) return\n if (!result.ok) setError(String(result.error))\n else setReport(result.report)\n }).catch((e) => { if (alive) setError(String(e)) })\n return () => { alive = false }\n }, [])\n const renderItems = (list) => (list ?? []).map((item) => React.createElement('div', { key: item.name, className: 'vsm-compat-item ' + (item.active ? 'ok' : 'warn') },\n React.createElement('span', { className: 'vsm-compat-name' }, item.name),\n React.createElement('span', { className: 'vsm-compat-note' }, item.note ?? (item.active ? '正常' : '未生效')),\n ))\n /** 兼容性分组面板:标题 + 线框内容区。 */\n const group = (title, children) => React.createElement('section', { className: 'vsm-panel' },\n React.createElement('h3', { className: 'vsm-panel-title' }, title),\n React.createElement('div', { className: 'vsm-panel-body' }, children),\n )\n const warnings = report?.warnings ?? []\n const devForm = report?.devForm\n const versionText = report?.dshVersion\n ? '(DSH ' + report.dshVersion + ' · 插件 ' + (report?.pluginVersion ?? '') + ')'\n : report?.pluginVersion ? '(插件版本 ' + report.pluginVersion + ')' : ''\n return React.createElement('section', { className: 'vsm-general-page' },\n React.createElement('h2', null, '兼容性'),\n React.createElement('p', null, '检测与其他插件 / DSH 版本的适配状态与已知问题。' + versionText),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n devForm?.enabled && group('开发形态', React.createElement('div', { className: 'vsm-compat-item ok' }, React.createElement('span', { className: 'vsm-compat-name' }, '开发形态开启(工作区链接安装)'), React.createElement('span', { className: 'vsm-compat-note' }, devForm.path))),\n group('版本适配', renderItems(report?.adapters)),\n group('外部插件与服务', renderItems(report?.external)),\n group('客户端适配', renderItems(getSummary?.() ?? [])),\n group('护栏', renderItems(report?.guards)),\n group('警告', warnings.length ? warnings.map((w, index) => React.createElement('div', { key: index, className: 'vsm-mcp-error vsm-mcp-banner' }, w)) : React.createElement('div', { className: 'vsm-compat-item ok' }, React.createElement('span', { className: 'vsm-compat-name' }, '未检测到兼容性问题'), React.createElement('span', { className: 'vsm-compat-note' }, ''))),\n )\n}\n\n/** MCP 管理子页签定义(我的 / 项目 / 市场)。 */\nconst MCP_TABS = [\n { id: 'mine', label: '我的 MCP' },\n { id: 'projects', label: '项目 MCP' },\n { id: 'market', label: 'MCP 市场' },\n]\n\n/**\n * MCP 管理面板:顶层「MCP 管理」Tab 下的三个子页签容器。\n * 作者 ddj 2026年08月27号\n * @param {object[]} servers 全局 MCP 服务列表\n * @param {object[]} projects 项目及其项目级 MCP 列表\n * @param {string} busy 正在执行的操作标识\n * @param {object} draft 新增表单草稿\n * @param {Function} edit 草稿字段变更回调\n * @param {Function} resetDraft 清空草稿回调\n */\nfunction McpManagePanel({ servers, projects, busy, draft, edit, resetDraft, refreshGlobal, toggleGlobal, removeGlobal, refreshProject, toggleProject, removeProject, saveGlobal, saveProject }) {\n const [mcpTab, setMcpTab] = React.useState('mine')\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 closeGlobalForm = () => setShowForm(false)\n const closeProjectForm = () => setProjectForm(null)\n const addProject = (project) => {\n resetDraft?.()\n setProjectForm({ workspacePath: project.workspacePath, title: project.title })\n }\n\n const selectedProject = projects.find((project) => project.workspacePath === selectedPath)\n const mineBody = servers.length\n ? servers.map((s) => React.createElement(ServerCard, { key: s.id, server: s, onRefresh: refreshGlobal, onToggle: toggleGlobal, onRemove: removeGlobal }))\n : React.createElement('div', { className: 'vsm-mcp-empty' }, '还没有配置全局 MCP')\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: addProject, onRefresh: refreshProject, onToggle: toggleProject, onRemove: removeProject }) : React.createElement('div', { className: 'vsm-mcp-empty' }, '请选择项目'),\n ) : React.createElement('div', { className: 'vsm-mcp-empty' }, '还没有项目')\n\n let body\n if (mcpTab === 'projects') body = projectBody\n else if (mcpTab === 'market') body = React.createElement('div', { className: 'vsm-mcp-empty' }, 'MCP 市场暂未接入')\n else body = mineBody\n\n const form = showForm\n ? React.createElement(McpForm, { title: '添加全局 MCP', draft, busy, edit, save: () => saveGlobal(closeGlobalForm), close: closeGlobalForm })\n : projectForm\n ? React.createElement(McpForm, { title: '添加项目 MCP · ' + projectForm.title, draft, busy, edit, save: () => saveProject(projectForm.workspacePath, closeProjectForm), close: closeProjectForm })\n : null\n return React.createElement(React.Fragment, null,\n React.createElement('div', { className: 'vsm-mcp-subhead' },\n React.createElement('nav', { className: 'vsm-mcp-subtabs' }, MCP_TABS.map((item) => React.createElement('button', { key: item.id, className: mcpTab === item.id ? 'active' : '', onClick: () => setMcpTab(item.id) }, item.label))),\n React.createElement('button', { className: 'vsm-primary vsm-small', onClick: () => { resetDraft?.(); setShowForm(true) } }, '+ 添加全局 MCP'),\n ),\n body,\n form,\n )\n}\n\n/** MCP 管理主面板。 */\nexport function McpSettings(props) {\n const openerRegistry = props?.openerRegistry ?? { list: () => [] }\n const compatSummary = props?.compatSummary ?? (() => [])\n const [servers, setServers] = React.useState<MpcServer[]>([])\n const [projects, setProjects] = React.useState<MpcProject[]>([])\n const [loading, setLoading] = React.useState(true)\n const [busy, setBusy] = React.useState('')\n const [error, setError] = React.useState('')\n const [tab, setTab] = React.useState('general')\n const [draft, setDraft] = React.useState(EMPTY)\n\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 /**\n * 保存全局 MCP:成功后由回调关闭子面板。\n * 作者 ddj 2026年08月27号\n * @param {Function} close 关闭新增表单回调\n */\n const saveGlobal = (close) => {\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 close()\n }).catch((e) => setError(String(e))).finally(() => setBusy(''))\n }\n\n /**\n * 保存项目 MCP:成功后由回调关闭子面板。\n * 作者 ddj 2026年08月27号\n * @param {string} workspacePath 目标项目路径\n * @param {Function} close 关闭新增表单回调\n */\n const saveProject = (workspacePath, close) => {\n setBusy('project-save')\n setError('')\n const config = configOf(draft)\n rpc('mcp.projectSave', { workspacePath, serverName: config.serverName, config }).then(finish).then((result) => {\n setProjects((old) => old.map((p) => p.workspacePath === workspacePath ? result.project : p))\n setDraft(EMPTY)\n close()\n }).catch((e) => setError(String(e))).finally(() => setBusy(''))\n }\n\n const edit = (key, value) => setDraft((old) => ({ ...old, [key]: value }))\n const resetDraft = () => setDraft(EMPTY)\n let body\n if (loading) body = React.createElement('div', { className: 'vsm-mcp-empty' }, '正在读取 MCP 服务…')\n else if (tab === 'general') body = React.createElement(GeneralSettings, { registry: openerRegistry })\n else if (tab === 'keys') body = React.createElement(KeybindingsPanel, null)\n else if (tab === 'mcp') body = React.createElement(McpManagePanel, { servers, projects, busy, draft, edit, resetDraft,\n saveGlobal: (close) => saveGlobal(close), saveProject: (workspacePath, close) => saveProject(workspacePath, close),\n refreshGlobal, toggleGlobal, removeGlobal, refreshProject, toggleProject, removeProject })\n else if (tab === 'compat') body = React.createElement(CompatSection, { getSummary: compatSummary })\n else if (tab === 'lsp') body = React.createElement(LspSettings, null)\n else body = React.createElement(PerfSettings, 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 服务。'))),\n React.createElement('nav', { className: 'vsm-mcp-tabs' }, React.createElement('button', { className: tab === 'general' ? 'active' : '', onClick: () => setTab('general') }, '通用'), React.createElement('button', { className: tab === 'keys' ? 'active' : '', onClick: () => setTab('keys') }, '快捷键'), React.createElement('button', { className: tab === 'mcp' ? 'active' : '', onClick: () => setTab('mcp') }, 'MCP 管理'), React.createElement('button', { className: tab === 'lsp' ? 'active' : '', onClick: () => setTab('lsp') }, '语言服务器'), React.createElement('button', { className: tab === 'perf' ? 'active' : '', onClick: () => setTab('perf') }, '性能优化'), React.createElement('button', { className: tab === 'compat' ? 'active' : '', onClick: () => setTab('compat') }, '兼容性')),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n body,\n )\n}\n\n/** MCP 新增表单(全局/项目共用)。 */\nfunction McpForm({ title, draft, busy, edit, save, close }) {\n const input = (key, placeholder) => React.createElement('input', { value: draft[key], onChange: (e) => edit(key, e.target.value), placeholder })\n const fields = draft.transport === 'stdio' ? React.createElement(React.Fragment, null, React.createElement('label', null, '命令', input('command', 'npx')), React.createElement('label', null, '参数(空格或换行分隔)', React.createElement('textarea', { value: draft.args, onChange: (e) => edit('args', e.target.value) })), React.createElement('label', null, '工作目录(可选)', input('cwd', ''))) : React.createElement(React.Fragment, null, React.createElement('label', null, 'URL', input('url', 'http://localhost:3000/mcp')), React.createElement('label', null, '请求头(每行 key=value)', React.createElement('textarea', { value: draft.headers, onChange: (e) => edit('headers', e.target.value) })))\n return React.createElement('div', { className: 'vsm-mcp-modal' }, React.createElement('div', { className: 'vsm-mcp-dialog' }, React.createElement('h3', null, title), React.createElement('label', null, '名称', input('serverName', '例如 codegraph')), React.createElement('label', null, '传输方式', React.createElement('select', { value: draft.transport, onChange: (e) => edit('transport', e.target.value) }, React.createElement('option', { value: 'stdio' }, 'stdio'), React.createElement('option', { value: 'streamable-http' }, 'streamable-http'))), fields, React.createElement('div', { className: 'vsm-mcp-dialog-actions' }, React.createElement('button', { onClick: close }, '取消'), React.createElement('button', { className: 'vsm-primary', disabled: busy === 'save' || busy === 'project-save', onClick: save }, '保存并连接'))))\n}\n","/**\n * dsh-vscode-mode client — DSH 对话文件链接的统一打开路由。\n * openPath 补丁经 compat.patchMethod 安装(链式恢复,多插件补丁互不踩踏)。\n * 作者 ddj 2026年08月24号\n */\nimport { patchMethod } from './compat.js'\nimport { openEditorView } from './events.js'\nimport { AUTO_OPEN_TOOL, VSCODE_OPEN_TOOL, type FileOpenContext, type FileOpenerRegistry, isAvailable, selectOpener } from './fileOpeners.js'\n\nexport interface OpenPathRouterOptions {\n workspaces: { openPath: (path: string) => Promise<void> }\n registry: FileOpenerRegistry\n selected: () => string\n context: () => FileOpenContext\n logger?: (message: string) => void\n}\n\n/**\n * 安装可卸载的 workspaces.openPath 路由。\n * @author ddj 2026年08月24号\n * @param options 路由依赖\n * @returns 恢复原方法的 disposer\n */\nexport function installOpenPathRouter(options: OpenPathRouterOptions): () => void {\n const open = async (original: (path: string) => Promise<void>, path: string): Promise<void> => {\n const context = options.context()\n const opener = selectOpener(options.registry, options.selected())\n if (!opener || !isAvailable(opener)) return original.call(options.workspaces, path)\n try {\n await opener.open(path, context)\n } catch (error) {\n options.logger?.('文件打开器 ' + opener.id + ' 失败,回退系统打开: ' + String(error))\n if (opener.id !== 'system') await original.call(options.workspaces, path)\n else throw error\n }\n }\n return patchMethod(options.workspaces, 'openPath', open as never)\n}\n\n/**\n * 创建 VSCodeMode 内置文件打开器。\n * @author ddj 2026年08月24号\n * @returns VSCodeMode 打开器\n */\nexport function vscodeOpener(): { id: string; label: string; priority: number; open: (path: string) => void } {\n return { id: VSCODE_OPEN_TOOL, label: 'VSCodeMode', priority: 100, open: (path) => openEditorView(path) }\n}\n\n/**\n * 规范化设置中的打开器 id。\n * @author ddj 2026年08月24号\n * @param value 原始设置值\n * @returns 可路由的打开器 id\n */\nexport function autoValue(value: unknown): string {\n return typeof value === 'string' && value.trim() ? value.trim() : AUTO_OPEN_TOOL\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — SideEditorTab:betterSidebar「文件编辑」Tab 的组件包装。\n * 把 TabComponentProps(scope/tab/visible)映射为 EditorView 侧栏形态 props,\n * 并按会话 key 保证切会话状态干净重建;创建种子的初始打开在挂载后投递一次。\n * 作者 ddj 2026年08月25号\n */\nimport React from 'react'\nimport { EditorView } from './EditorView.js'\nimport { resolveInitialOpen, setSideEditorMounted, takePendingSideOpen } from '../sidebarBridge.js'\n\n/**\n * 侧边栏 Tab 组件(TabDescriptor.component 装配)。\n * @param props TabComponentProps(scope.sessionId、tab.path/meta 等)\n * @returns EditorView 侧栏形态\n */\nexport function SideEditorTab(props) {\n const sessionId = props?.scope?.sessionId\n const initial = React.useMemo(() => resolveInitialOpen(props?.tab), [props?.tab])\n const dispatchedRef = React.useRef(false)\n\n React.useEffect(() => {\n setSideEditorMounted(true)\n return () => setSideEditorMounted(false)\n }, [])\n\n React.useEffect(() => {\n if (dispatchedRef.current) return\n dispatchedRef.current = true\n // 待消费打开(挂载前暂存的聚焦请求)优先于创建种子;两者都走同事件,EditorView 幂等处理\n const pending = takePendingSideOpen(sessionId)\n const request = pending ?? initial\n window.dispatchEvent(new CustomEvent('edrv:open-editor', {\n detail: { path: request?.path ?? null, focusDiff: request?.focusDiff === true },\n }))\n }, [initial.path, initial.focusDiff, sessionId])\n\n return React.createElement(EditorView, {\n key: sessionId,\n sessionId,\n layout: 'side',\n schedule: props?.schedule,\n addToConversation: props?.addToConversation,\n sidebarPanels: props?.sidebarPanels,\n outlineSources: props?.outlineSources,\n fileMenuItems: props?.fileMenuItems,\n })\n}\n","/**\n * dsh-vscode-mode client — 把文件/选中内容注入会话对话输入框(composer draft)。\n * 复用 DSH 官方输入门面:ctx.conversation.input.for(sessions.scope(sessionId)) → SessionInput。\n * 引用 chip:insertReference(reference source,发送时序列化为 @path 文本);忙态降级为纯文本 setDraft。\n * 纯函数部分 node 可单测。\n * 作者 ddj 2026-08-25\n */\n\n/** 文件引用可选的行区间(选中内容用)。 */\nexport interface RefRange {\n startLine: number\n endLine: number\n}\n\n/** 引用动作的返回状态。 */\nexport type AddOutcome = 'ok' | 'busy' | 'unavailable'\n\n/** DSH reference source 名(dsh-client-ui-reference 注册的 @file/@session 统一源)。 */\nconst REF_SOURCE = 'reference'\n\n/**\n * 生成 DSH @file 语法引用串:cwd 相对化、\\ → /、含空白时按 @\"path\" 语法加引号。\n * cwd 外/无法相对化的路径回退原路径。\n * @author ddj 2026年08月25号\n * @param path 打开的文件路径(相对 cwd 或绝对)\n * @param cwd 会话工作区目录(可选)\n * @returns 引用串(如 @src/index.ts 或 @\"a b.ts\")\n */\nexport function mentionOf(path: string, cwd: string | undefined): string {\n const raw = String(path)\n let rel = raw\n if (cwd) {\n const base = String(cwd).replace(/[\\\\/]+$/, '')\n const up = raw.replace(/\\\\/g, '/')\n const baseUp = base.replace(/\\\\/g, '/')\n if (up.startsWith(baseUp + '/')) rel = up.slice(baseUp.length + 1)\n else if (up === baseUp) rel = ''\n }\n rel = rel.replace(/\\\\/g, '/').replace(/^\\.\\//, '')\n if (!rel) rel = raw.replace(/\\\\/g, '/')\n if (/[\\u0000-\\u001f\\u007f-\\u009f\"]/u.test(rel)) return '@' + raw\n return /\\s/u.test(rel) ? `@\"${rel}\"` : `@${rel}`\n}\n\n/** 引用标签:文件名 + 可选行区间(chip 内展示,不带 @ 前缀)。\n * @author ddj 2026年08月25号 */\nexport function labelOf(path: string, range: RefRange | undefined): string {\n const base = String(path).split(/[\\\\/]/).pop() || String(path)\n if (!range || range.endLine < range.startLine) return base\n return range.startLine === range.endLine\n ? `${base} L${range.startLine}`\n : `${base} L${range.startLine}-${range.endLine}`\n}\n\n/** 引用 ref:引用串 + 可选行区间(序列化直出,agent 据此读取对应片段)。\n * @author ddj 2026年08月25号 */\nexport function refOf(mention: string, range: RefRange | undefined): string {\n if (!range || range.endLine < range.startLine) return mention\n return range.startLine === range.endLine\n ? `${mention} L${range.startLine}`\n : `${mention} L${range.startLine}-${range.endLine}`\n}\n\n/** 构造 DSH 文件引用插入载荷(source=reference,发送序列化为 mention(+range) 文本)。 */\nexport function buildFileRef(\n path: string,\n cwd: string | undefined,\n range?: RefRange,\n): { reference: ReferenceInsertLike; mention: string } {\n const mention = mentionOf(path, cwd)\n return {\n mention,\n reference: {\n source: REF_SOURCE,\n ref: refOf(mention, range),\n label: labelOf(path, range),\n appearance: 'file',\n clipboardText: mention,\n },\n }\n}\n\n/** 输入门面最小形状(运行时来自 ctx.conversation.input,避免引入新类型依赖)。 */\nexport interface InputLike {\n state: { getSnapshot: () => { draft: string; draftRev: number } }\n insertReference: (ref: ReferenceInsertLike, span: TokenSpanLike) => boolean\n setDraft: (text: string) => void\n notify: (level: 'info' | 'error', text: string) => void\n}\n\n/** ReferenceInsert 结构形状(与 dsh-client-ui-input-trigger 类型一致)。 */\nexport interface ReferenceInsertLike {\n source: string\n ref: string\n label: string\n appearance?: 'session' | 'file' | 'folder'\n clipboardText: string\n}\n\n/** TokenSpan 结构形状(start/end 为草稿字符偏移,draftRev 为 CAS 版本)。 */\nexport interface TokenSpanLike {\n start: number\n end: number\n draftRev: number\n}\n\n/** ctx 依赖的最小面(sessions.scope + conversation.input)。 */\nexport interface CtxLike {\n get: (name: string) => unknown\n}\n\n/** 注入器产物:给 EditorView 用的动作集合。 */\nexport interface AddToConversation {\n /** 追加文件引用 chip(@path [Lstart-end]);忙态自动降级纯文本。 */\n appendReference(sessionId: string | undefined, path: string, range?: RefRange): Promise<AddOutcome>\n}\n\n/**\n * 解析会话输入门面;缺失时返回 undefined(动作侧守卫降级)。\n * @author ddj 2026年08月25号\n * @param ctx 客户端服务上下文\n * @param sessionId 会话 id\n * @returns SessionInput 或 undefined\n */\nexport function inputFor(ctx: CtxLike, sessionId: string | undefined): InputLike | undefined {\n if (!sessionId) return undefined\n try {\n const sessions = ctx.get('sessions') as { scope?: (id: string) => unknown } | undefined\n const conversation = ctx.get('conversation') as { input?: { for: (actx: unknown) => unknown } } | undefined\n const actx = sessions?.scope?.(sessionId)\n const shell = actx && conversation?.input?.for?.(actx)\n return (shell && typeof (shell as InputLike).setDraft === 'function') ? shell as InputLike : undefined\n } catch {\n return undefined\n }\n}\n\n/** 取当前草稿长度与版本;无输入门面时返回 null。\n * @author ddj 2026年08月25号 */\nfunction draftCursor(input: InputLike | undefined): { draft: string; draftRev: number } | null {\n try {\n const s = input?.state?.getSnapshot?.()\n if (!s) return null\n return { draft: String(s.draft ?? ''), draftRev: Number(s.draftRev ?? 0) }\n } catch {\n return null\n }\n}\n\n/** 从 sessions 列表快照读会话工作区目录(与 index.ts 既有读取方式一致)。\n * @author ddj 2026年08月25号 */\nfunction cwdOf(ctx: CtxLike, sessionId: string | undefined): string | undefined {\n if (!sessionId) return undefined\n try {\n const sessions = ctx.get('sessions') as\n | { list?: { getSnapshot?: () => { byId?: Record<string, { cwd?: string }> } } }\n | undefined\n return sessions?.list?.getSnapshot?.()?.byId?.[sessionId]?.cwd\n } catch {\n return undefined\n }\n}\n\n/** 写入成功后的 composer 内联提示(门面可用时;失败静默)。\n * @author ddj 2026年08月25号 */\nfunction notify(input: InputLike, text: string): void {\n try {\n input.notify?.('info', text)\n } catch {\n /* 提示失败忽略 */\n }\n}\n\n/** 输入门面插入引用(拦截异常视作未应用,走降级)。\n * @author ddj 2026年08月25号 */\nfunction safeInsert(input: InputLike, reference: ReferenceInsertLike, span: TokenSpanLike): boolean {\n try {\n return input.insertReference(reference, span) === true\n } catch {\n return false\n }\n}\n\n/**\n * 创建「添加到对话」动作集(apply 阶段构建一次,随 props 传给 EditorView)。\n * @author ddj 2026年08月25号\n * @param ctx 客户端服务上下文(sessions + conversation)\n * @returns 动作集\n */\nexport function createAddToConversation(ctx: CtxLike): AddToConversation {\n const appendReference: AddToConversation['appendReference'] = async (sessionId, path, range) => {\n const input = inputFor(ctx, sessionId)\n if (!input) return 'unavailable'\n const cur = draftCursor(input)\n if (!cur) return 'unavailable'\n const { reference, mention } = buildFileRef(path, cwdOf(ctx, sessionId), range)\n const span: TokenSpanLike = { start: cur.draft.length, end: cur.draft.length, draftRev: cur.draftRev }\n const ok = safeInsert(input, reference, span)\n if (!ok) {\n // 忙态(adjudicating/submitting)或 CAS 失败:降级纯文本追加,保证动作有落点。\n const gap = cur.draft.length > 0 && !/\\s$/.test(cur.draft) ? ' ' : ''\n input.setDraft(cur.draft + gap + mention + ' ')\n notify(input, '已添加文件引用 ' + mention)\n return 'busy'\n }\n notify(input, '已添加文件引用 ' + mention)\n return 'ok'\n }\n\n return { appendReference }\n}\n","/**\n * dsh-vscode-mode client — 侧边栏面板注册表。\n * 镜像 fileOpeners.ts 的注册表模式:create + register(返回注销) + list + subscribe,\n * 由 client/index.ts `ctx.provide('edrvSidebarPanels', registry)` 对外暴露(第三方可注册)。\n * 作者 ddj 2026-08-26\n */\nimport type { SidebarPanelDef } from './types.js'\n\nexport interface SidebarPanelRegistry {\n register(panel: SidebarPanelDef): () => void\n list(): readonly SidebarPanelDef[]\n subscribe(listener: () => void): () => void\n get(id: string): SidebarPanelDef | undefined\n}\n\n/** 校验面板定义并写入注册表(缺 id/render 抛 TypeError)。 */\nfunction panelRegister(entries: Map<string, SidebarPanelDef>, notify: () => void, panel: SidebarPanelDef): void {\n if (!panel.id || typeof panel.render !== 'function') throw new TypeError('侧边栏面板必须提供 id 和 render')\n entries.set(panel.id, panel)\n notify()\n}\n\n/**\n * 创建生命周期独立的面板注册表。\n * @author ddj 2026年08月26号\n * @returns 面板注册表\n */\nexport function createSidebarPanelRegistry(): SidebarPanelRegistry {\n const entries = new Map<string, SidebarPanelDef>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) listener()\n }\n const list = (): readonly SidebarPanelDef[] =>\n [...entries.values()].sort((a, b) => (a.order ?? 100) - (b.order ?? 100))\n return {\n register(panel: SidebarPanelDef): () => void {\n panelRegister(entries, notify, panel)\n return () => {\n if (entries.get(panel.id) !== panel) return\n entries.delete(panel.id)\n notify()\n }\n },\n list,\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n get: (id: string) => entries.get(id),\n }\n}\n","/**\n * dsh-vscode-mode client — 右键菜单 viewport 定位纯函数。\n * 将目标行锚点与视口边界计算从 React 渲染层拆出,便于复用和单测。\n * 作者 ddj 2026-08-28\n */\n\nexport interface MenuPosition {\n left: number\n top: number\n}\n\nexport interface MenuAnchorRect {\n top: number\n right: number\n width: number\n height: number\n}\n\n/**\n * 将菜单坐标限制在 viewport 内。\n * @author ddj 2026年08月28号\n * @param x 期望的 viewport x 坐标\n * @param y 期望的 viewport y 坐标\n * @param viewportWidth viewport 宽度\n * @param viewportHeight viewport 高度\n * @param menuWidth 菜单估算宽度\n * @param menuHeight 菜单估算高度\n * @returns 限制后的菜单位置\n */\nexport function clampMenuPosition(\n x: number,\n y: number,\n viewportWidth: number,\n viewportHeight: number,\n menuWidth: number,\n menuHeight: number,\n): MenuPosition {\n const maxLeft = Math.max(4, viewportWidth - menuWidth)\n const maxTop = Math.max(4, viewportHeight - menuHeight)\n return {\n left: Math.max(4, Math.min(x, maxLeft)),\n top: Math.max(4, Math.min(y, maxTop)),\n }\n}\n\n/**\n * 将文件树行右键菜单锚定到目标行右侧;无法测量时回退到鼠标坐标。\n * @author ddj 2026年08月28号\n * @param rect 目标行的布局矩形\n * @param fallbackX 鼠标 viewport x 坐标\n * @param fallbackY 鼠标 viewport y 坐标\n * @returns 菜单初始位置\n */\nexport function rowMenuPosition(\n rect: MenuAnchorRect | null | undefined,\n fallbackX: number,\n fallbackY: number,\n): MenuPosition {\n if (!rect || rect.width <= 0 || rect.height <= 0) {\n return { left: fallbackX, top: fallbackY }\n }\n return { left: rect.right + 4, top: rect.top }\n}\n","/**\n * dsh-vscode-mode client — 通用浮动右键菜单(createElement 风格、类型化)。\n * 非阻塞式关闭:window capture 监听(点击菜单外/右键菜单外/Esc 关闭),\n * 不拦截菜单外事件,允许同一事件内由发起方切换/重开菜单。\n * 条目支持 danger/disabled/separator,复用既有 edrv-ctxmenu* 样式类。\n * 作者 ddj 2026-08-27\n */\nimport React from 'react'\nimport { createPortal } from 'react-dom'\nimport { clampMenuPosition } from './menuPosition.js'\n\n/** 单条菜单项(展示层形状;业务侧由 buildTreeMenu 映射而来)。 */\nexport interface ContextMenuEntry {\n id: string\n label: string\n danger?: boolean\n disabled?: boolean\n /** 前置分隔线。 */\n separator?: boolean\n onClick?: () => void\n}\n\nexport interface ContextMenuProps {\n x: number\n y: number\n entries: ContextMenuEntry[]\n onClose: () => void\n}\n\n/** 菜单估算宽高(clamp 防越出视口,与 EditorView menuPos 常量对齐)。 */\nconst MENU_W = 224\nconst MENU_H = 176\n\n/**\n * 浮动右键菜单。\n * @param props.x 视口 x 坐标\n * @param props.y 视口 y 坐标\n * @param props.entries 菜单项列表\n * @param props.onClose 关闭回调(backdrop 点击/右键/Esc/点击项后触发)\n */\nexport function ContextMenu(props: ContextMenuProps): React.ReactElement {\n const { x, y, entries, onClose } = props\n const menuRef = React.useRef<HTMLDivElement | null>(null)\n\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') onClose()\n }\n const onPointerDown = (e: PointerEvent): void => {\n if (e.button !== 0) return\n if (menuRef.current && menuRef.current.contains(e.target as Node)) return\n onClose()\n }\n const onContextMenu = (e: MouseEvent): void => {\n if (menuRef.current && menuRef.current.contains(e.target as Node)) {\n e.preventDefault()\n }\n onClose()\n }\n window.addEventListener('keydown', onKey, true)\n window.addEventListener('pointerdown', onPointerDown, true)\n window.addEventListener('contextmenu', onContextMenu, true)\n return () => {\n window.removeEventListener('keydown', onKey, true)\n window.removeEventListener('pointerdown', onPointerDown, true)\n window.removeEventListener('contextmenu', onContextMenu, true)\n }\n }, [onClose])\n\n const safeX = Number.isFinite(x) ? x : 4\n const safeY = Number.isFinite(y) ? y : 4\n const position = clampMenuPosition(\n safeX,\n safeY,\n window.innerWidth || 800,\n window.innerHeight || 600,\n MENU_W,\n MENU_H,\n )\n\n const children: React.ReactNode[] = []\n for (const entry of entries) {\n if (entry.separator) {\n children.push(React.createElement('div', { key: 'sep-' + entry.id, className: 'edrv-ctxmenu-sep' }))\n continue\n }\n const cls = 'edrv-ctxmenu-item'\n + (entry.danger ? ' edrv-ctxmenu-danger' : '')\n + (entry.disabled ? ' edrv-ctxmenu-disabled' : '')\n children.push(React.createElement('button', {\n key: entry.id,\n className: cls,\n disabled: entry.disabled,\n onClick: () => {\n if (!entry.disabled) {\n entry.onClick?.()\n onClose()\n }\n },\n }, entry.label))\n }\n\n const overlay = React.createElement('div', { 'data-edrv-view': '1' },\n React.createElement('div', { className: 'edrv-ctxmenu', ref: menuRef, style: position }, ...children))\n\n return typeof document === 'undefined' ? overlay : createPortal(overlay, document.body)\n}\n","/**\n * dsh-vscode-mode client — 文件管理右键菜单框架(类型 + 注册表 + 纯构建函数)。\n * 镜像 sidebar/registry.ts 的注册表模式:create + register(返回注销) + list + subscribe,\n * 由 client/index.ts `ctx.provide('edrvFileContextMenuItems', registry)` 对外暴露(第三方可注册)。\n * 新增菜单项只需 register 一条 TreeMenuItem,面板在右键打开时经 buildTreeMenu 过滤/排序。\n * 本模块不触 React/浏览器,可单测。\n * 作者 ddj 2026-08-27\n */\nimport type { TreeEntry } from '../../shared/rpc.js'\nimport type { SidebarCtx } from './types.js'\n\n/** 右键目标(树行/面板空白区,path 相对工作区根,'' 表示根目录)。 */\nexport interface TreeMenuTarget {\n path: string\n type: TreeEntry['type']\n}\n\n/** 一条右键菜单项定义。 */\nexport interface TreeMenuItem {\n id: string\n label: string\n /** 排序:数值越小越靠前(缺省 100)。 */\n order?: number\n /** 红色警示样式(如删除类操作)。 */\n danger?: boolean\n /** 置灰不可点(如无权限/目标不支持时)。 */\n disabled?: boolean\n /** 前置分隔线。 */\n separator?: boolean\n /** 显隐守卫:返回 false 则不显示。 */\n visible?: (target: TreeMenuTarget, ctx: SidebarCtx) => boolean\n run: (target: TreeMenuTarget, ctx: SidebarCtx) => void\n}\n\n/** 右键菜单项注册表(生命周期独立,可注册/注销/订阅)。 */\nexport interface TreeMenuRegistry {\n register(item: TreeMenuItem): () => void\n list(): readonly TreeMenuItem[]\n subscribe(listener: () => void): () => void\n get(id: string): TreeMenuItem | undefined\n}\n\n/** 校验菜单项并写入注册表(缺 id/run/label 抛 TypeError)。 */\nfunction itemRegister(entries: Map<string, TreeMenuItem>, notify: () => void, item: TreeMenuItem): void {\n if (!item.id || typeof item.run !== 'function' || !item.label) {\n throw new TypeError('文件右键菜单项必须提供 id、label 和 run')\n }\n entries.set(item.id, item)\n notify()\n}\n\n/**\n * 创建生命周期独立的右键菜单项注册表。\n * @author ddj 2026年08月27号\n * @returns 菜单项注册表\n */\nexport function createTreeMenuRegistry(): TreeMenuRegistry {\n const entries = new Map<string, TreeMenuItem>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) listener()\n }\n const list = (): readonly TreeMenuItem[] =>\n [...entries.values()].sort((a, b) => (a.order ?? 100) - (b.order ?? 100))\n return {\n register(item: TreeMenuItem): () => void {\n itemRegister(entries, notify, item)\n return () => {\n if (entries.get(item.id) !== item) return\n entries.delete(item.id)\n notify()\n }\n },\n list,\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n get: (id: string) => entries.get(id),\n }\n}\n\n/**\n * 按目标构建当前可见菜单项(visible 过滤 + order 排序)。\n * @author ddj 2026年08月27号\n * @param registry 菜单项注册表\n * @param target 右键目标\n * @param ctx 面板共享上下文\n * @returns 可见菜单项(已排序)\n */\nexport function buildTreeMenu(registry: TreeMenuRegistry | undefined, target: TreeMenuTarget, ctx: SidebarCtx): TreeMenuItem[] {\n if (!registry) return []\n const out: TreeMenuItem[] = []\n for (const item of registry.list()) {\n if (typeof item.visible === 'function' && !item.visible(target, ctx)) continue\n out.push(item)\n }\n return out\n}\n","/**\n * dsh-vscode-mode client — 资源管理栏展开状态持久化(纯函数,可单测)。\n * 对齐 VSCode:只持久化展开路径集合,不缓存目录条目数据(条目实时 listDir)。\n * 键前缀统一走 paths.ts PathConst(CACHE_KEY.expanded)。\n * 作者 ddj 2026-08-28\n */\nimport { CACHE_KEY } from '../paths.js'\n\n/** localStorage 键前缀(按会话隔离)。 */\nconst KEY_PREFIX = CACHE_KEY.expanded\n\n/** 展开路径容量上限:超出丢弃最旧(按写入顺序近似 LRU)。 */\nexport const EXPANDED_CAP = 500\n\n/** 展开状态缓存内容。 */\nexport interface ExplorerCacheData {\n root: string | null\n expanded: string[]\n}\n\n/**\n * 归一化展开路径:去空白、反斜杠→斜杠、去首尾斜杠,`..` 段拒绝。\n * @author ddj 2026年08月28号\n * @param rel 目录相对路径('' = 根)\n * @returns 归一化路径,非法返回 null\n */\nexport function normalizeExpanded(rel: string | undefined | null): string | null {\n const s = String(rel ?? '').trim().replace(/\\\\/g, '/').replace(/^\\/+|\\/+$/g, '')\n if (!s) return ''\n const segs = s.split('/').filter((seg) => seg !== '.')\n if (!segs.length) return ''\n for (const seg of segs) {\n if (seg === '..') return null\n }\n return segs.join('/')\n}\n\n/**\n * 裁剪展开路径集:去重、丢弃非法路径、超容量丢弃尾部(保持传入顺序)。\n * @author ddj 2026年08月28号\n * @param expanded 原始展开路径集合\n * @returns 规范化后的路径数组\n */\nexport function sanitizeExpanded(expanded: unknown): string[] {\n if (!Array.isArray(expanded)) return []\n const seen = new Set<string>()\n const out: string[] = []\n for (const item of expanded) {\n const rel = normalizeExpanded(typeof item === 'string' ? item : null)\n if (rel === null || seen.has(rel)) continue\n seen.add(rel)\n out.push(rel)\n if (out.length >= EXPANDED_CAP) break\n }\n return out\n}\n\n/**\n * 序列化缓存数据(JSON;root 为 null 时省略,减小体积)。\n * @author ddj 2026年08月28号\n * @param data 缓存数据\n * @returns JSON 字符串\n */\nexport function serializeExplorer(data: ExplorerCacheData): string {\n const payload = data.root === null || data.root === undefined\n ? { v: 1, expanded: data.expanded }\n : { v: 1, root: data.root, expanded: data.expanded }\n return JSON.stringify(payload)\n}\n\n/**\n * 解析缓存文本;损坏/格式不符 → null。\n * @author ddj 2026年08月28号\n * @param text localStorage 原文\n * @returns 解析后的缓存数据,非法返回 null\n */\nexport function parseExplorer(text: string | null): ExplorerCacheData | null {\n if (!text) return null\n try {\n const data = JSON.parse(text)\n if (!data || typeof data !== 'object') return null\n const root = typeof data.root === 'string' && data.root ? data.root : null\n const expanded = sanitizeExpanded(data.expanded)\n return { root, expanded }\n } catch (error) {\n return null\n }\n}\n\n/**\n * 读取某会话的展开状态缓存(localStorage 不可用 → null)。\n * @author ddj 2026年08月28号\n * @param sessionId 会话 id\n * @returns 缓存数据或 null\n */\nexport function explorerLoad(sessionId: string): ExplorerCacheData | null {\n try {\n return parseExplorer(window.localStorage.getItem(KEY_PREFIX + String(sessionId)))\n } catch (error) {\n return null\n }\n}\n\n/**\n * 写入某会话的展开状态缓存(损坏/配额满 → 忽略)。\n * @author ddj 2026年08月28号\n * @param sessionId 会话 id\n * @param data 缓存数据\n */\nexport function explorerSave(sessionId: string, data: ExplorerCacheData): void {\n try {\n window.localStorage.setItem(KEY_PREFIX + String(sessionId), serializeExplorer(data))\n } catch (error) { /* 配额满/隐私模式忽略 */ }\n}\n","/**\n * dsh-vscode-mode client — 资源管理栏目录条目缓存(SWR:旧数据即时渲染 + 后台刷新)。\n * 与 explorerCache(展开状态持久化)互补:本文件只缓存目录条目数据,键按会话隔离。\n * 纯函数(序列化/解析/裁剪)导出可单测;内存镜像 Map 同步读避免每次渲染 parse\n * localStorage,落盘 300ms 防抖;配额满/隐私模式 try/catch 降级纯内存。\n * 作者 ddj 2026-08-31\n */\nimport type { TreeEntry } from '../../shared/rpc.js'\nimport { CACHE_KEY } from '../paths.js'\n\n// --region 常量\nconst KEY_PREFIX = CACHE_KEY.entries\n/** 缓存目录上限(超出按 ts 逐出最旧,保活热门目录)。 */\nexport const CACHE_MAX_DIRS = 300\n/** 单目录条目缓存上限(即时渲染用,刷新补齐全量)。 */\nexport const CACHE_DIR_ENTRIES = 500\n/** 新鲜度窗口:预取去重用(展示不受限,永远可用缓存渲染)。 */\nexport const CACHE_FRESH_MS = 30_000\n/** 落盘防抖。 */\nexport const CACHE_SAVE_DEBOUNCE_MS = 300\n// --endregion\n\n/** 单目录缓存条目。 */\nexport interface CachedDir {\n ts: number\n entries: TreeEntry[]\n}\n\n/** 缓存数据(v2:与 v1 展开状态缓存分离)。 */\nexport interface EntriesCacheData {\n v: 2\n root: string | null\n dirs: Record<string, CachedDir>\n}\n\n/** 裁剪到上限(目录按 ts 逐出最旧;单目录条目截断)。 */\nexport function entriesTrim(data: EntriesCacheData, maxDirs = CACHE_MAX_DIRS, maxEntries = CACHE_DIR_ENTRIES): EntriesCacheData {\n const dirs: Record<string, CachedDir> = {}\n const sorted = Object.entries(data.dirs).sort((a, b) => b[1].ts - a[1].ts)\n for (const [rel, dir] of sorted) {\n if (Object.keys(dirs).length >= maxDirs) break\n dirs[rel] = { ts: dir.ts, entries: dir.entries.length > maxEntries ? dir.entries.slice(0, maxEntries) : dir.entries }\n }\n return { v: 2, root: data.root, dirs }\n}\n\n/** 序列化缓存数据。 */\nexport function entriesSerialize(data: EntriesCacheData): string {\n return JSON.stringify(data)\n}\n\n/** 解析缓存文本;损坏/格式不符 → null。 */\nexport function entriesParse(text: string | null): EntriesCacheData | null {\n if (!text) return null\n try {\n const raw = JSON.parse(text) as { v?: unknown; root?: unknown; dirs?: unknown }\n if (!raw || raw.v !== 2 || !raw.dirs || typeof raw.dirs !== 'object') return null\n const dirs: Record<string, CachedDir> = {}\n for (const [rel, d] of Object.entries(raw.dirs)) {\n if (!d || typeof d !== 'object') continue\n const dir = d as { ts?: unknown; entries?: unknown }\n if (!Array.isArray(dir.entries)) continue\n const entries: TreeEntry[] = []\n for (const e of dir.entries) {\n if (!e || typeof e !== 'object') continue\n const item = e as { name?: unknown; path?: unknown; type?: unknown }\n if (typeof item.name !== 'string' || typeof item.path !== 'string') continue\n const type = item.type === 'directory' ? 'directory' : item.type === 'file' ? 'file' : 'other'\n entries.push({ name: item.name, path: item.path, type })\n }\n if (!entries.length) continue\n dirs[rel] = { ts: typeof dir.ts === 'number' ? dir.ts : 0, entries }\n }\n return { v: 2, root: typeof raw.root === 'string' ? raw.root : null, dirs }\n } catch (error) {\n return null\n }\n}\n\n// --region 内存镜像 + 防抖落盘\n/** sessionId → 缓存镜像(同步读,避免每次渲染 parse)。 */\nconst mirrors = new Map<string, EntriesCacheData>()\n/** sessionId → 落盘防抖计时器。 */\nconst saveTimers = new Map<string, ReturnType<typeof setTimeout>>()\n/** 单调时钟:连续 put 的 ts 严格递增(同毫秒不并列,逐出顺序可预期)。 */\nlet clock = 0\n\n/** 取下一时间戳(不小于真实时间且严格递增)。 */\nfunction nextTs(): number {\n clock = Math.max(Date.now(), clock + 1)\n return clock\n}\n\n/** localStorage 读取(不可用 → null)。 */\nfunction readRaw(sessionId: string): string | null {\n try {\n return window.localStorage.getItem(KEY_PREFIX + sessionId)\n } catch (error) {\n return null\n }\n}\n\n/** localStorage 写入(配额/隐私模式失败静默)。 */\nfunction writeRaw(sessionId: string, text: string): void {\n try {\n window.localStorage.setItem(KEY_PREFIX + sessionId, text)\n } catch (error) { /* 配额满/隐私模式忽略 */ }\n}\n\n/** 取(或建)会话缓存镜像。 */\nfunction mirrorOf(sessionId: string): EntriesCacheData {\n const existing = mirrors.get(sessionId)\n if (existing) return existing\n const data = entriesParse(readRaw(sessionId)) ?? { v: 2, root: null, dirs: {} }\n mirrors.set(sessionId, data)\n return data\n}\n\n/** 调度防抖落盘(重置已有计时器)。 */\nfunction scheduleSave(sessionId: string): void {\n const prev = saveTimers.get(sessionId)\n if (prev) clearTimeout(prev)\n saveTimers.set(sessionId, setTimeout(() => {\n saveTimers.delete(sessionId)\n const data = mirrors.get(sessionId)\n if (data) writeRaw(sessionId, entriesSerialize(entriesTrim(data)))\n }, CACHE_SAVE_DEBOUNCE_MS))\n}\n// --endregion\n\n/**\n * 读某目录缓存条目(无 → null;展示不受新鲜度限制)。\n * @author ddj 2026年08月31号\n * @param sessionId 会话 id\n * @param rel 目录相对路径('' = 根)\n * @returns 缓存条目或 null\n */\nexport function entriesCacheGet(sessionId: string | undefined, rel: string): TreeEntry[] | null {\n if (!sessionId) return null\n const dir = mirrorOf(sessionId).dirs[rel]\n if (!dir || !dir.entries.length) return null\n return dir.entries\n}\n\n/**\n * 某目录缓存是否新鲜(预取去重用)。\n * @author ddj 2026年08月31号\n * @param sessionId 会话 id\n * @param rel 目录相对路径\n * @returns 新鲜返回 true\n */\nexport function entriesCacheIsFresh(sessionId: string | undefined, rel: string): boolean {\n if (!sessionId) return false\n const dir = mirrorOf(sessionId).dirs[rel]\n return Boolean(dir && Date.now() - dir.ts < CACHE_FRESH_MS)\n}\n\n/**\n * 写入某目录缓存条目(内存镜像 + 防抖落盘;单目录条目截断)。\n * @author ddj 2026年08月31号\n * @param sessionId 会话 id\n * @param rel 目录相对路径\n * @param entries 目录条目\n */\nexport function entriesCachePut(sessionId: string | undefined, rel: string, entries: TreeEntry[]): void {\n if (!sessionId) return\n const data = mirrorOf(sessionId)\n data.dirs[rel] = { ts: nextTs(), entries: entries.slice(0, CACHE_DIR_ENTRIES) }\n const trimmed = entriesTrim(data)\n data.dirs = trimmed.dirs\n scheduleSave(sessionId)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏「文件管理」面板(懒加载目录树 + SWR 缓存)。\n * 展开目录立即渲染(dirs 内存态 → 本地条目缓存兜底),后台刷新(edrv.listDir 走\n * host 树索引,命中近乎零成本);挂载/切会话从缓存即时恢复展开树;⟳/edrv:refresh\n * 保留旧条目强制后台重列(force);每次用户发起加载后预取 ≤4 个子目录(排除重型\n * 目录、缓存新鲜跳过、不级联);10s 轻量跟随已展开目录(命中索引,RPC 近零成本)。\n * 差异角标/右键菜单/展开状态持久化行为不变。\n * 作者 ddj 2026-08-26 / 2026-08-27 / 2026-08-31\n */\nimport React from 'react'\nimport { rpc } from '../../rpc.js'\nimport { ContextMenu } from '../../ui/ContextMenu.js'\nimport { rowMenuPosition } from '../../ui/menuPosition.js'\nimport { buildTreeMenu } from '../contextMenu.js'\nimport { explorerLoad, explorerSave } from '../../state/explorerCache.js'\nimport { entriesCacheGet, entriesCacheIsFresh, entriesCachePut } from '../../state/explorerEntriesCache.js'\nimport type { SidebarCtx } from '../types.js'\n\nconst DIR_CAP = 4000\nconst SAVE_DEBOUNCE_MS = 300\nconst FOLLOW_INTERVAL_MS = 10_000\nconst PREFETCH_MAX = 4\nconst PREFETCH_EXCLUDED = new Set(['node_modules', '.git', '.hg', '.svn', '.pnpm', '.pnpm-store'])\n\n/**\n * 目录树面板主体(SWR:有缓存先渲染,无缓存才显示加载态;加载总在后台)。\n * @param props.ctx 面板共享上下文(sessionId/openFile/activePath/pendingByPath/fileMenuItems/notify)\n */\nexport function FileExplorer(props) {\n const ctx = props?.ctx\n const sessionId = ctx?.sessionId\n const openFile = ctx?.openFile\n const activePath = ctx?.activePath ?? null\n const pendingByPath = ctx?.pendingByPath ?? {}\n const [root, setRoot] = React.useState(null)\n const [dirs, setDirs] = React.useState({}) // rel → 最新条目(本会话内存态)\n const [expanded, setExpanded] = React.useState({})\n const [loading, setLoading] = React.useState({})\n const [errors, setErrors] = React.useState({}) // rel → 错误文案(仅无任何数据时展示)\n const [menu, setMenu] = React.useState(null) // 右键菜单 { x, y, target }\n // 各状态 ref 镜像:定时器/监听用最新闭包\n const tokensRef = React.useRef({})\n const expandedRef = React.useRef({})\n expandedRef.current = expanded\n const loadingRef = React.useRef({})\n loadingRef.current = loading\n const dirsRef = React.useRef({})\n dirsRef.current = dirs\n const saveTimerRef = React.useRef(null)\n const loadDirRef = React.useRef(null)\n const refreshRef = React.useRef(null)\n\n /** 渲染取数:内存态 → 本地条目缓存 → null(显示加载态)。 */\n const entriesOf = (rel) => dirsRef.current[rel] ?? entriesCacheGet(sessionId, rel) ?? null\n\n /** 预取子目录:≤4 个、排除重型目录、缓存新鲜跳过、已加载跳过、不级联。 */\n const prefetchDirs = (rel, entries) => {\n const want = []\n for (const e of entries) {\n if (e.type !== 'directory') continue\n if (PREFETCH_EXCLUDED.has(e.name)) continue\n if (entriesCacheIsFresh(sessionId, e.path)) continue\n if (dirsRef.current[e.path] !== undefined) continue\n want.push(e.path)\n if (want.length >= PREFETCH_MAX) break\n }\n for (const sub of want) void loadDir(sub, {})\n }\n\n /**\n * 后台加载目录:token 守卫防乱序;force 跳过索引命中强制实列;\n * 非 force 且已在途时跳过(避免轮询打断用户展开的响应)。\n */\n const loadDir = (rel, opts) => {\n const force = opts?.force === true\n const doPrefetch = opts?.prefetch === true\n if (!force && loadingRef.current[rel]) return\n const token = (tokensRef.current[rel] || 0) + 1\n tokensRef.current[rel] = token\n setLoading((prev) => Object.assign({}, prev, { [rel]: true }))\n setErrors((prev) => {\n const next = Object.assign({}, prev)\n delete next[rel]\n return next\n })\n const args = { sessionId, path: rel }\n if (force) args.force = true\n rpc('edrv.listDir', args).then((res) => {\n if (tokensRef.current[rel] !== token) return\n if (res && res.ok && Array.isArray(res.entries)) {\n setDirs((prev) => Object.assign({}, prev, { [rel]: res.entries }))\n if (res.root) setRoot((prev) => prev || res.root)\n entriesCachePut(sessionId, rel, res.entries)\n if (doPrefetch) prefetchDirs(rel, res.entries)\n } else {\n // 有可渲染数据时静默(旧数据可能过期但可用);全无数据才报错\n if (!entriesOf(rel)) {\n setErrors((prev) => Object.assign({}, prev, { [rel]: res?.error ? String(res.error) : '读取目录失败' }))\n }\n }\n }).catch((e) => {\n if (tokensRef.current[rel] !== token) return\n if (!entriesOf(rel)) {\n setErrors((prev) => Object.assign({}, prev, { [rel]: '读取目录异常:' + String(e) }))\n }\n }).finally(() => {\n if (tokensRef.current[rel] !== token) return\n setLoading((prev) => {\n const next = Object.assign({}, prev)\n delete next[rel]\n return next\n })\n })\n }\n loadDirRef.current = loadDir\n\n const toggle = (rel) => {\n if (expanded[rel] === true) {\n setExpanded((prev) => Object.assign({}, prev, { [rel]: false }))\n return\n }\n setExpanded((prev) => Object.assign({}, prev, { [rel]: true }))\n void loadDir(rel, { prefetch: true })\n }\n\n const refresh = () => {\n const keep = Object.keys(expandedRef.current).filter((k) => expandedRef.current[k] === true)\n tokensRef.current = {}\n setMenu(null)\n setErrors({})\n // SWR:保留旧条目不清空,后台强制重列(force 跳过索引)\n setLoading({})\n if (keep.length) {\n const next = {}\n for (const rel of keep) next[rel] = true\n setExpanded(next)\n for (const rel of keep) void loadDir(rel, { force: true, prefetch: true })\n } else {\n setExpanded({})\n }\n void loadDir('', { force: true, prefetch: true })\n }\n refreshRef.current = refresh\n\n React.useEffect(() => {\n tokensRef.current = {}\n setDirs({})\n setExpanded({})\n setLoading({})\n setErrors({})\n setMenu(null)\n setRoot(null)\n // 恢复上次展开状态(对齐 VSCode:持久化展开路径,条目缓存即时渲染、后台刷新)\n const cached = sessionId ? explorerLoad(sessionId) : null\n const restored = cached?.expanded ?? []\n if (cached?.root) setRoot(cached.root)\n if (restored.length) {\n const next = {}\n for (const rel of restored) next[rel] = true\n setExpanded(next)\n }\n void loadDir('', { prefetch: true })\n for (const rel of restored) {\n if (rel) void loadDir(rel, { prefetch: true })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sessionId])\n\n // 展开状态防抖写回 localStorage(重启后恢复展开结构)\n React.useEffect(() => {\n if (saveTimerRef.current) { clearTimeout(saveTimerRef.current); saveTimerRef.current = null }\n if (!sessionId) return\n saveTimerRef.current = setTimeout(() => {\n saveTimerRef.current = null\n const expandedList = Object.keys(expanded).filter((k) => expanded[k] === true)\n explorerSave(sessionId, { root, expanded: expandedList })\n }, SAVE_DEBOUNCE_MS)\n return () => {\n if (saveTimerRef.current) { clearTimeout(saveTimerRef.current); saveTimerRef.current = null }\n }\n }, [expanded, root, sessionId])\n\n // edrv:refresh(差异决策/回滚后):保留旧条目,强制后台重列\n React.useEffect(() => {\n const onRefresh = () => refreshRef.current?.()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => window.removeEventListener('edrv:refresh', onRefresh)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // 10s 轻量跟随:已展开目录后台刷新(命中 host 索引,近零成本),树跟随 agent 写入\n React.useEffect(() => {\n if (!sessionId) return\n const timer = setInterval(() => {\n const open = Object.keys(expandedRef.current).filter((k) => expandedRef.current[k] === true)\n if (!open.length) return\n for (const rel of open) loadDirRef.current?.(rel, {})\n }, FOLLOW_INTERVAL_MS)\n return () => clearInterval(timer)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sessionId])\n\n const rootName = root ? String(root).split(/[\\\\/]/).pop() || root : ''\n\n const rowEl = (e, depth, isDir, isOpen) => {\n const pending = isDir ? 0 : (pendingByPath[e.path] ?? 0)\n const active = !isDir && e.path === activePath\n const contextTarget = Boolean(menu && menuEntries.length && menu.target.path === e.path)\n const dim = e.type === 'other'\n return React.createElement('div', {\n key: e.path,\n className: 'edrv-tree-row'\n + (active ? ' edrv-tree-active' : '')\n + (contextTarget ? ' edrv-tree-context' : ''),\n title: e.path,\n style: { paddingLeft: 6 + depth * 14 },\n onClick: () => { if (isDir) toggle(e.path); else openFile(e.path) },\n onContextMenu: (ev) => {\n ev.preventDefault()\n ev.stopPropagation()\n const rect = ev.currentTarget?.getBoundingClientRect?.()\n const position = rowMenuPosition(rect, ev.clientX, ev.clientY)\n setMenu({ x: position.left, y: position.top, target: { path: e.path, type: e.type } })\n },\n },\n React.createElement('span', { className: 'edrv-tree-chev' },\n isDir ? (isOpen ? '▾' : '▸') : ''),\n React.createElement('span', { className: 'edrv-tree-name' + (dim ? ' edrv-tree-dim' : '') },\n isDir ? (isOpen ? '📂' : '📁') : '📄', ' ', e.name),\n (pending > 0\n ? React.createElement('span', { className: 'edrv-tree-badge' }, String(pending))\n : null))\n }\n\n const rowsOf = (rel, depth) => {\n const entries = entriesOf(rel)\n if (!entries) {\n return [React.createElement('div', { key: rel + ':loading', className: 'edrv-tree-loading', style: { paddingLeft: 6 + depth * 14 } },\n loading[rel] ? '加载中…' : '无法加载')]\n }\n const rows = []\n const cap = entries.length\n for (let i = 0; i < cap; i++) {\n const e = entries[i]\n const isDir = e.type === 'directory'\n const isOpen = expanded[e.path] === true\n rows.push(rowEl(e, depth, isDir, isOpen))\n if (isDir && isOpen) rows.push(...rowsOf(e.path, depth + 1))\n }\n if (cap >= DIR_CAP) {\n rows.push(React.createElement('div', { key: rel + ':cap', className: 'edrv-tree-loading', style: { paddingLeft: 6 + depth * 14 } },\n '目录条目过多,仅显示前 ' + DIR_CAP + ' 项'))\n }\n return rows\n }\n\n // 面板区右键(空白处)→ 工作区根目录菜单;行内右键已在 rowEl 阻止冒泡。\n const onPanelContext = (ev) => {\n ev.preventDefault()\n ev.stopPropagation()\n if (!ev.currentTarget.contains(ev.target)) return\n setMenu({ x: ev.clientX, y: ev.clientY, target: { path: '', type: 'directory' } })\n }\n // 当前右键目标的可视菜单项(构建时过滤/排序,registry 变化下次打开生效)。\n const menuEntries = menu\n ? buildTreeMenu(ctx?.fileMenuItems, menu.target, ctx).map((item) => ({\n id: item.id,\n label: item.label,\n danger: item.danger,\n disabled: item.disabled,\n separator: item.separator,\n onClick: () => item.run(menu.target, ctx),\n }))\n : []\n\n const errorList = Object.entries(errors)\n const errorText = errorList.length ? errorList[0][1] : null\n\n return React.createElement('div', { className: 'edrv-side-panel', onContextMenu: onPanelContext },\n React.createElement('div', { className: 'edrv-side-head' },\n React.createElement('span', { className: 'edrv-side-title' }, '资源管理器'),\n React.createElement('span', { className: 'edrv-side-root', title: root || '' }, rootName),\n React.createElement('span', { style: { flex: 1 } }),\n React.createElement('button', { className: 'edrv-side-btn', title: '刷新目录树', onClick: refresh }, '⟳')),\n React.createElement('div', { className: 'edrv-tree' },\n (errorText\n ? React.createElement('div', { className: 'edrv-tree-error' },\n React.createElement('span', null, String(errorText)),\n React.createElement('button', { className: 'edrv-side-btn', onClick: () => refresh() }, '重试'))\n : null),\n rowsOf('', 0)),\n (menu && menuEntries.length\n ? React.createElement(ContextMenu, { x: menu.x, y: menu.y, entries: menuEntries, onClose: () => setMenu(null) })\n : null))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏「搜索」面板(VSCode 搜索视图形态)。\n * 内容搜索:edrv.searchContent RPC;结果按文件分组展示命中行(行号 + 高亮 + 文件计数),\n * 点击经 ctx.openFileAt 打开文件并跳转行列。\n * 选项:大小写/全词/正则;折叠区(⚙ 齿轮展开):包含的文件(📖 toggle = 仅当前打开文件)\n * 与排除的文件(⚙ toggle = 启用排除),模式为逗号分隔 rg glob;无搜索按钮,防抖 + 回车触发。\n * 作者 ddj 2026-08-26\n */\nimport React from 'react'\nimport { rpc } from '../../rpc.js'\nimport type { SidebarCtx } from '../types.js'\nimport { CACHE_KEY } from '../../paths.js'\n\nconst DEBOUNCE_MS = 250\nconst INCLUDE_PLACEHOLDER = '例如 *.ts, src/**/include'\n\n/**\n * 逗号切分 glob 列表(trim + 去空)。\n * @param text 用户输入的逗号分隔模式\n * @returns glob 数组\n */\nexport function splitGlobs(text) {\n return String(text ?? '').split(',').map((item) => item.trim()).filter(Boolean)\n}\n\n/**\n * 命中行文本三段切分(before/命中/after,列为 1-based UTF-16)。\n * @param text 行文本\n * @param start 起始列\n * @param end 结束列\n * @returns 三段文本\n */\nfunction splitHit(text, start, end) {\n const s = Math.max(0, (start | 0) - 1)\n const e = Math.max(s, end | 0)\n return { before: String(text).slice(0, s), hit: String(text).slice(s, e), after: String(text).slice(e) }\n}\n\n/**\n * 搜索面板主体。\n * @param props.ctx 面板共享上下文(sessionId/openFileAt/activePath)\n */\nexport function SearchPanel(props) {\n const ctx = props?.ctx\n const sessionId = ctx?.sessionId\n const openFileAt = ctx?.openFileAt ?? (() => {})\n const activePath = ctx?.activePath ?? null\n const [query, setQuery] = React.useState('')\n const [matchCase, setMatchCase] = React.useState(false)\n const [wholeWord, setWholeWord] = React.useState(false)\n const [regex, setRegex] = React.useState(false)\n const [includeText, setIncludeText] = React.useState('')\n const [excludeText, setExcludeText] = React.useState('')\n const [onlyActive, setOnlyActive] = React.useState(false)\n const [excludeOn, setExcludeOn] = React.useState(false)\n const [sectionOpen, setSectionOpen] = React.useState(false)\n const [status, setStatus] = React.useState('idle') // idle | searching | done | error\n const [error, setError] = React.useState('')\n const [warning, setWarning] = React.useState('') // rg 遍历错误时的部分结果提示(结果照常展示)\n const [matches, setMatches] = React.useState(null)\n const [truncated, setTruncated] = React.useState(false)\n const [collapsed, setCollapsed] = React.useState({})\n const seqRef = React.useRef(0)\n const timerRef = React.useRef(null)\n const inputRef = React.useRef(null)\n const queryRef = React.useRef('')\n queryRef.current = query\n const activePathRef = React.useRef(activePath)\n activePathRef.current = activePath\n // 请求参数 ref:防抖/立即重搜闭包统一读最新值,避免陈旧选项\n const requestRef = React.useRef({ matchCase, wholeWord, regex, include: [], exclude: [] })\n requestRef.current = {\n matchCase, wholeWord, regex,\n include: onlyActive ? (activePath ? [activePath] : []) : splitGlobs(includeText),\n exclude: excludeOn ? splitGlobs(excludeText) : [],\n }\n\n // 按会话恢复上次查询、选项与过滤模式(VSCode 记忆搜索词)\n React.useEffect(() => {\n if (!sessionId) return\n try {\n const saved = JSON.parse(localStorage.getItem(CACHE_KEY.search + String(sessionId)) || 'null')\n if (saved && typeof saved === 'object') {\n if (typeof saved.query === 'string') setQuery(saved.query)\n if (typeof saved.matchCase === 'boolean') setMatchCase(saved.matchCase)\n if (typeof saved.wholeWord === 'boolean') setWholeWord(saved.wholeWord)\n if (typeof saved.regex === 'boolean') setRegex(saved.regex)\n if (typeof saved.includeText === 'string') setIncludeText(saved.includeText)\n if (typeof saved.excludeText === 'string') setExcludeText(saved.excludeText)\n if (typeof saved.onlyActive === 'boolean') setOnlyActive(saved.onlyActive)\n if (typeof saved.excludeOn === 'boolean') setExcludeOn(saved.excludeOn)\n if (typeof saved.sectionOpen === 'boolean') setSectionOpen(saved.sectionOpen)\n }\n } catch (e) { /* 损坏忽略 */ }\n }, [sessionId])\n\n // 查询/选项/过滤变化 → 持久化\n React.useEffect(() => {\n if (!sessionId) return\n try {\n localStorage.setItem(CACHE_KEY.search + String(sessionId), JSON.stringify({\n query, matchCase, wholeWord, regex, includeText, excludeText, onlyActive, excludeOn, sectionOpen,\n }))\n } catch (e) { /* 忽略 */ }\n }, [sessionId, query, matchCase, wholeWord, regex, includeText, excludeText, onlyActive, excludeOn, sectionOpen])\n\n /**\n * 执行内容搜索(请求参数从 ref 读最新值)。\n * @param text 搜索词\n */\n const runSearch = (text) => {\n const s = ++seqRef.current\n const clean = String(text ?? '').trim()\n if (clean.length < 2) { setMatches(null); setStatus('idle'); return }\n const req = requestRef.current\n setStatus('searching')\n setError('')\n setWarning('')\n rpc('edrv.searchContent', {\n sessionId, query: clean,\n matchCase: req.matchCase, wholeWord: req.wholeWord, regex: req.regex,\n include: req.include, exclude: req.exclude,\n }).then((res) => {\n if (s !== seqRef.current) return\n if (res && res.ok) {\n setMatches(Array.isArray(res.matches) ? res.matches : [])\n setTruncated(res.truncated === true)\n setWarning(res?.warning ? String(res.warning) : '')\n setStatus('done')\n } else {\n setError(res?.error ? String(res.error) : '搜索失败')\n setMatches(null)\n setStatus('error')\n }\n }).catch((e) => {\n if (s !== seqRef.current) return\n setError('搜索异常:' + String(e))\n setMatches(null)\n setStatus('error')\n })\n }\n\n /**\n * 输入变化:防抖触发搜索。\n * @param value 新输入\n */\n const onChange = (value) => {\n setQuery(value)\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => runSearch(value), DEBOUNCE_MS)\n }\n\n /**\n * 输入框通用防抖重搜(包含/排除模式输入)。\n * @param setter 状态写入函数\n * @param value 新值\n */\n const onChangeDebounced = (setter, value) => {\n setter(value)\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => runSearch(queryRef.current), DEBOUNCE_MS)\n }\n\n /**\n * 立即重搜(查询 ≥2 字符时);先同步 ref 避免本次调用读到旧请求参数。\n * @param next 新的请求参数字段\n */\n const rerun = (next) => {\n requestRef.current = Object.assign({}, requestRef.current, next)\n if (timerRef.current) clearTimeout(timerRef.current)\n if (String(queryRef.current).trim().length >= 2) runSearch(queryRef.current)\n }\n\n /** 选项开关切换(大小写/全词/正则/书本/设置):更新状态 + 立即重搜。 */\n const toggleOpt = (key, value) => {\n if (key === 'matchCase') setMatchCase(value)\n if (key === 'wholeWord') setWholeWord(value)\n if (key === 'regex') setRegex(value)\n if (key === 'onlyActive') setOnlyActive(value)\n if (key === 'excludeOn') setExcludeOn(value)\n const base = { matchCase, wholeWord, regex, onlyActive, excludeOn }\n base[key] = value\n rerun({\n matchCase: base.matchCase, wholeWord: base.wholeWord, regex: base.regex,\n include: base.onlyActive ? (activePathRef.current ? [activePathRef.current] : []) : splitGlobs(includeText),\n exclude: base.excludeOn ? splitGlobs(excludeText) : [],\n })\n }\n\n // Ctrl+Shift+F 重复触发时聚焦输入框(EditorView 派发 edrv:search-focus)\n React.useEffect(() => {\n const onFocus = () => inputRef.current?.focus?.()\n window.addEventListener('edrv:search-focus', onFocus)\n return () => window.removeEventListener('edrv:search-focus', onFocus)\n }, [])\n\n // 结果按文件分组(保持 rg 输出顺序)\n const groups = React.useMemo(() => {\n if (!Array.isArray(matches)) return []\n const map = new Map()\n for (const m of matches) {\n let list = map.get(m.path)\n if (!list) { list = []; map.set(m.path, list) }\n list.push(m)\n }\n return [...map.entries()].map(([path, list]) => ({ path, count: list.length, matches: list }))\n }, [matches])\n\n const totalFiles = groups.length\n const totalMatches = Array.isArray(matches) ? matches.length : 0\n const toggleGroup = (path) => setCollapsed((prev) => Object.assign({}, prev, { [path]: prev[path] === true ? false : true }))\n\n const optsBar = React.createElement('div', { className: 'edrv-search-opts' },\n React.createElement('button', { className: 'edrv-search-opt' + (matchCase ? ' on' : ''), title: '区分大小写', 'aria-pressed': matchCase, onClick: () => toggleOpt('matchCase', !matchCase) }, 'Aa'),\n React.createElement('button', { className: 'edrv-search-opt' + (wholeWord ? ' on' : ''), title: '全字匹配', 'aria-pressed': wholeWord, onClick: () => toggleOpt('wholeWord', !wholeWord) }, 'Ab'),\n React.createElement('button', { className: 'edrv-search-opt' + (regex ? ' on' : ''), title: '使用正则表达式', 'aria-pressed': regex, onClick: () => toggleOpt('regex', !regex) }, '.*'),\n React.createElement('span', { className: 'edrv-search-spacer' }),\n React.createElement('button', { className: 'edrv-search-opt' + (sectionOpen ? ' on' : ''), title: sectionOpen ? '收起文件过滤' : '文件过滤(包含/排除)', 'aria-pressed': sectionOpen, onClick: () => setSectionOpen((v) => !v) }, '⚙'))\n\n const filterRows = sectionOpen\n ? React.createElement('div', { className: 'edrv-search-rows' },\n React.createElement('div', { className: 'edrv-search-row' },\n React.createElement('input', {\n className: 'edrv-search-field' + (onlyActive ? ' dim' : ''), placeholder: INCLUDE_PLACEHOLDER,\n value: includeText, disabled: onlyActive,\n title: onlyActive ? '已启用「仅当前打开文件」,忽略此输入' : '',\n onChange: (e) => onChangeDebounced(setIncludeText, e.target.value),\n }),\n React.createElement('button', {\n className: 'edrv-search-toggle' + (onlyActive ? ' on' : ''), title: activePath ? '仅在当前打开的文件中搜索' : '无打开的文件(需先打开文件)',\n 'aria-pressed': onlyActive, disabled: !activePath,\n onClick: () => toggleOpt('onlyActive', !onlyActive),\n }, '📖')),\n React.createElement('div', { className: 'edrv-search-row' },\n React.createElement('input', {\n className: 'edrv-search-field' + (excludeOn ? '' : ' dim'), placeholder: INCLUDE_PLACEHOLDER,\n value: excludeText, disabled: !excludeOn,\n title: excludeOn ? '' : '排除功能未启用,先点击右侧按钮开启',\n onChange: (e) => onChangeDebounced(setExcludeText, e.target.value),\n }),\n React.createElement('button', {\n className: 'edrv-search-toggle' + (excludeOn ? ' on' : ''), title: '启用排除文件(忽略下方模式的命中)',\n 'aria-pressed': excludeOn,\n onClick: () => toggleOpt('excludeOn', !excludeOn),\n }, '⚙')))\n : null\n\n const summary = status === 'done'\n ? React.createElement('div', { className: 'edrv-search-summary' },\n totalFiles > 0\n ? totalFiles + ' 个文件 · ' + totalMatches + ' 处匹配' + (truncated ? '(已截断)' : '')\n : '无匹配结果')\n : null\n\n const warnBanner = warning\n ? React.createElement('div', { className: 'edrv-search-warn', title: warning }, warning)\n : null\n\n const body = (() => {\n if (status === 'searching') return React.createElement('div', { className: 'edrv-search-empty' }, '搜索中…')\n if (status === 'error') return React.createElement('div', { className: 'edrv-search-error' }, error)\n if (status === 'done' && !groups.length) return React.createElement('div', { className: 'edrv-search-empty' }, '无匹配结果')\n if (status !== 'done') return React.createElement('div', { className: 'edrv-search-empty' }, '输入至少 2 个字符开始搜索')\n return React.createElement('div', { className: 'edrv-search-results' },\n groups.map((group) => {\n const open = collapsed[group.path] !== true\n return React.createElement('div', { key: group.path, className: 'edrv-search-group' },\n React.createElement('div', { className: 'edrv-search-file', title: group.path, onClick: () => toggleGroup(group.path) },\n React.createElement('span', { className: 'edrv-search-chev' }, open ? '▾' : '▸'),\n React.createElement('span', { className: 'edrv-search-fname' }, String(group.path).split(/[\\\\/]/).pop() || group.path),\n React.createElement('span', { className: 'edrv-search-fdir' }, String(group.path).split(/[\\\\/]/).slice(0, -1).join('/')),\n React.createElement('span', { className: 'edrv-search-fcount' }, group.count)),\n open ? group.matches.map((m, i) => {\n const parts = splitHit(m.text, m.startColumn, m.endColumn)\n return React.createElement('div', { key: m.path + ':' + m.line + ':' + i, className: 'edrv-search-line' + (i % 2 ? ' alt' : ''), title: group.path + ':' + m.line, onClick: () => openFileAt(m.path, m.line, m.startColumn) },\n React.createElement('span', { className: 'edrv-search-ln' }, m.line),\n React.createElement('span', { className: 'edrv-search-text' },\n React.createElement('span', null, parts.before),\n React.createElement('mark', { className: 'edrv-search-hit' }, parts.hit),\n React.createElement('span', null, parts.after)))\n }) : null)\n }))\n })()\n\n return React.createElement('div', { className: 'edrv-search-panel' },\n React.createElement('div', { className: 'edrv-search-qrow' },\n React.createElement('input', {\n ref: inputRef, className: 'edrv-search-input', autoFocus: true, autoComplete: 'off', spellCheck: false,\n placeholder: '搜索',\n value: query,\n onChange: (e) => onChange(e.target.value),\n onKeyDown: (e) => {\n if (e.key === 'Enter') { if (timerRef.current) clearTimeout(timerRef.current); runSearch(queryRef.current) }\n if (e.key === 'Escape') inputRef.current?.blur?.()\n },\n })),\n optsBar,\n filterRows,\n summary,\n warnBanner,\n body)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏面板定义(文件管理 + 搜索)。\n * 作者 ddj 2026-08-26 / 2026-08-26\n */\nimport React from 'react'\nimport { FileExplorer } from './FileExplorer.js'\nimport { SearchPanel } from './SearchPanel.js'\nimport type { SidebarPanelDef, SidebarCtx } from '../types.js'\n\n/**\n * 构造文件管理面板定义。\n * @author ddj 2026年08月26号\n * @returns 面板定义(含活动栏徽标 = 差异文件总数)\n */\nexport function createFilePanel(): SidebarPanelDef {\n return {\n id: 'explorer',\n title: '文件管理',\n icon: '📁',\n order: 10,\n badge: (ctx: SidebarCtx) => (ctx.sum && ctx.sum.totalFiles > 0 ? ctx.sum.totalFiles : null),\n render: (ctx: SidebarCtx) => React.createElement(FileExplorer, { ctx }),\n }\n}\n\n/**\n * 构造搜索面板定义。\n * @author ddj 2026年08月30号\n * @returns 面板定义(无徽标;活动栏图标 🔍)\n */\nexport function createSearchPanel(): SidebarPanelDef {\n return {\n id: 'search',\n title: '搜索',\n icon: '🔍',\n order: 15,\n render: (ctx: SidebarCtx) => React.createElement(SearchPanel, { ctx }),\n }\n}\n","/**\n * dsh-vscode-mode client — 文件管理右键菜单内置项。\n * 首个内置项:「在文件浏览器中打开」(文件→OS Explorer 定位选中、目录→打开目录)。\n * 反馈统一走 ctx.notify(由 EditorView 提供,落到编辑区路径栏状态)。\n * 作者 ddj 2026-08-27\n */\nimport { revealInExplorer } from '../fileReveal.js'\nimport type { TreeMenuItem } from './contextMenu.js'\n\n/**\n * 构造内置右键菜单项列表(后续内置项直接追加)。\n * @author ddj 2026年08月27号\n * @returns 内置菜单项数组\n */\nexport function createDefaultFileMenuItems(): TreeMenuItem[] {\n return [\n {\n id: 'reveal-in-explorer',\n label: '在文件浏览器中打开',\n order: 0,\n run: (target, ctx) => {\n void revealInExplorer(ctx.sessionId, target.path).then((outcome) => {\n ctx.notify?.(outcome.ok ? '已在文件浏览器中打开' : '打开失败:' + (outcome.error ?? '未知错误'))\n })\n },\n },\n ]\n}\n","/**\n * dsh-vscode-mode client — 大纲兜底解析器(纯函数,无 DOM/Monaco 依赖,node 可测)。\n * 覆盖无内置 document symbol provider 的语言:markdown/mdx、python、shell、powershell、\n * lua、go、rust、yaml、ini(toml)、花括号语言(c/cpp/csharp/java/php/ruby/kotlin/swift/dart)。\n * TS/JS/JSON/CSS/HTML 有 Monaco 原生 provider,不走这里。\n * 作者 ddj 2026-08-27\n */\nimport type { OutlineSymbol } from './types.js'\n\n/** monaco SymbolKind 数值常量(与 LSP SymbolKind 一致,面板渲染按此分组)。 */\nexport const SK = {\n File: 0, Module: 1, Namespace: 2, Package: 3, Class: 4, Method: 5,\n Property: 6, Field: 7, Constructor: 8, Enum: 9, Interface: 10,\n Function: 11, Variable: 12, Constant: 13, String: 14, Number: 15,\n Boolean: 16, Array: 17, Object: 18, Key: 19, Null: 20, EnumMember: 21,\n Struct: 22, Event: 23, Operator: 24, TypeParameter: 25,\n} as const\n\n/** 花括号语言的泛型函数名排除集(避免误把控制流/关键字当符号)。 */\nconst BRACE_KW = new Set([\n 'if', 'for', 'while', 'switch', 'catch', 'foreach', 'using', 'with', 'when',\n 'match', 'return', 'new', 'in', 'of', 'do', 'else', 'elif', 'then', 'yield',\n 'await', 'typeof', 'instanceof', 'case', 'default', 'try', 'finally', 'throw',\n])\n\n/** 花括号语言的类型关键字 → SymbolKind。 */\nconst BRACE_TYPE_KIND: Record<string, number> = {\n class: SK.Class, struct: SK.Struct, interface: SK.Interface, enum: SK.Enum,\n namespace: SK.Namespace, module: SK.Module, trait: SK.Interface, record: SK.Class,\n}\n\n/** 按文档序(先序)补齐每个符号的 endLine:叶子取“下一个符号起行 - 1”,容器取末子 endLine。 */\nfunction computeEnds(symbols: OutlineSymbol[], lastLine: number): void {\n const order: OutlineSymbol[] = []\n const collect = (list: OutlineSymbol[]): void => {\n for (const s of list) {\n order.push(s)\n if (s.children && s.children.length) collect(s.children)\n }\n }\n collect(symbols)\n for (let i = order.length - 1; i >= 0; i--) {\n const s = order[i]\n const kids = s.children ?? []\n if (kids.length) {\n s.endLine = Math.max(s.startLine, kids[kids.length - 1].endLine)\n } else {\n const next = order[i + 1]\n const end = next ? Math.max(s.startLine, next.startLine - 1) : lastLine\n s.endLine = Math.max(s.startLine, Math.min(end, lastLine))\n }\n }\n}\n\n/** 构造单行符号(起始行=跳转行=所在行;detail 为截断后的声明文本)。 */\nfunction mk(lineIndex: number, name: string, kind: number, raw: string): OutlineSymbol {\n const detail = raw.trim().replace(/\\s+/g, ' ').slice(0, 80)\n const line = lineIndex + 1\n const out: OutlineSymbol = { name, kind, startLine: line, endLine: line, selectLine: line }\n if (detail && detail !== name) out.detail = detail\n return out\n}\n\n/** Markdown/mdx:`#` 级标题,层级嵌套。 */\nfunction parseMarkdown(text: string): OutlineSymbol[] {\n const roots: OutlineSymbol[] = []\n const stack: Array<{ level: number; item: OutlineSymbol }> = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const m = /^(\\#{1,6})\\s+(.+?)\\s*#*\\s*$/.exec(lines[i])\n if (!m) continue\n const item: OutlineSymbol = {\n name: m[2].trim(), kind: SK.Namespace,\n startLine: i + 1, endLine: i + 1, selectLine: i + 1, children: [],\n }\n while (stack.length && stack[stack.length - 1].level >= m[1].length) stack.pop()\n const parent = stack.length ? stack[stack.length - 1].item : null\n ;(parent ? parent.children : roots)!.push(item)\n stack.push({ level: m[1].length, item })\n }\n computeEnds(roots, lines.length)\n return roots\n}\n\n/** Python:def/class 按缩进栈嵌套。 */\nfunction parsePython(text: string): OutlineSymbol[] {\n const roots: OutlineSymbol[] = []\n const stack: Array<{ indent: number; item: OutlineSymbol }> = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const m = /^([ \\t]*)(?:class|def)\\s+([A-Za-z_]\\w*)\\s*[(:]/.exec(lines[i])\n if (!m) continue\n const indent = m[1].replace(/\\t/g, ' ').length\n const isClass = /class\\s/.test(lines[i])\n const item: OutlineSymbol = {\n name: m[2], kind: isClass ? SK.Class : SK.Function,\n startLine: i + 1, endLine: i + 1, selectLine: i + 1, children: [],\n }\n while (stack.length && stack[stack.length - 1].indent >= indent) stack.pop()\n const parent = stack.length ? stack[stack.length - 1].item : null\n ;(parent ? parent.children : roots)!.push(item)\n stack.push({ indent, item })\n }\n computeEnds(roots, lines.length)\n return roots\n}\n\n/** Shell:`name() {` 函数。 */\nfunction parseShell(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const m = /^[ \\t]*([A-Za-z_][A-Za-z0-9_]*)[ \\t]*\\(\\)[ \\t]*\\{/.exec(lines[i])\n if (m) out.push(mk(i, m[1], SK.Function, lines[i]))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** PowerShell:`function Name {` / `filter Name {`。 */\nfunction parsePwsh(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const m = /^[ \\t]*(?:function|filter)[ \\t]+([\\w.-]+)/.exec(lines[i])\n if (m) out.push(mk(i, m[1], SK.Function, lines[i]))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** Lua:`function Foo:bar` / `M.bar = class|function` + EmmyLua 注解(---@class/@alias/@enum/@field)。 */\nfunction parseLua(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n /** 当前注解类(收拢紧随的 ---@field 为字段子节点)。 */\n let pendingClass: OutlineSymbol | null = null\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n // EmmyLua 注解(---@):class/alias/enum 进大纲根,field 收给当前类\n const am = /^[ \\t]*---@(class|alias|enum|field|type)\\s+([^\\r\\n]+)/.exec(line)\n if (am) {\n const tag = am[1]\n const rest = am[2].trim()\n const name = (rest.match(/^([A-Za-z_][\\w]*)/) || [])[1] ?? ''\n if (tag === 'class') {\n if (name) {\n const item = mk(i, name, SK.Class, line)\n item.children = []\n out.push(item)\n pendingClass = item\n } else pendingClass = null\n } else if (tag === 'alias') {\n if (name) out.push(mk(i, name, SK.TypeParameter, line))\n pendingClass = null\n } else if (tag === 'enum') {\n if (name) out.push(mk(i, name, SK.Enum, line))\n pendingClass = null\n } else if (tag === 'field') {\n if (name && pendingClass) {\n pendingClass.children!.push(mk(i, name, SK.Field, line))\n }\n } else if (tag === 'type') {\n pendingClass = null\n }\n continue\n }\n if (/^\\s*--/.test(line)) continue\n const fm = /^[ \\t]*(?:local[ \\t]+)?function[ \\t]+([A-Za-z_][\\w.:]*)/.exec(line)\n if (fm) { out.push(mk(i, fm[1], SK.Function, line)); continue }\n const cm = /^[ \\t]*([A-Za-z_][\\w.]*)[ \\t]*=[ \\t]*(?:class|function)\\b/.exec(line)\n if (cm) out.push(mk(i, cm[1], /class\\b/.test(line) ? SK.Class : SK.Function, line))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** Go:func(含 receiver)/ type。 */\nfunction parseGo(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const fm = /^[ \\t]*func[ \\t]+(?:\\([^)]*\\)[ \\t]*)?([A-Za-z_]\\w*)/.exec(lines[i])\n if (fm) { out.push(mk(i, fm[1], SK.Function, lines[i])); continue }\n const tm = /^[ \\t]*type[ \\t]+([A-Za-z_]\\w*)/.exec(lines[i])\n if (tm) out.push(mk(i, tm[1], SK.Struct, lines[i]))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** Rust:fn/struct/enum/trait/impl/mod/type。 */\nfunction parseRust(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n const kindOf: Record<string, number> = {\n fn: SK.Function, struct: SK.Struct, enum: SK.Enum, trait: SK.Interface,\n impl: SK.Module, mod: SK.Module, type: SK.TypeParameter,\n }\n for (let i = 0; i < lines.length; i++) {\n const m = /^[ \\t]*(?:pub(?:\\([^)]*\\))?[ \\t]+)?(fn|struct|enum|trait|impl|mod|type)[ \\t]+([A-Za-z_]\\w*)/.exec(lines[i])\n if (m && kindOf[m[1]]) out.push(mk(i, m[2], kindOf[m[1]], lines[i]))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** YAML:仅顶层键。 */\nfunction parseYaml(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n if (!line.trim() || /^\\s/.test(line) || /^\\s*[#-]/.test(line)) continue\n const m = /^([A-Za-z0-9_.\\-]+)\\s*:/.exec(line)\n if (m) out.push(mk(i, m[1], SK.Key, line))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** INI/TOML:`[section]` + `key=value`。 */\nfunction parseIni(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n if (!line.trim() || /^\\s*[;#]/.test(line)) continue\n const sm = /^\\[([^\\]]+)\\]/.exec(line)\n if (sm) { out.push(mk(i, sm[1], SK.Namespace, line)); continue }\n const km = /^([A-Za-z0-9_.\\-]+)\\s*[=:]/.exec(line.trim())\n if (km) out.push(mk(i, km[1], SK.Key, line))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** 花括号语言(C 族/JVM/.NET):类型声明 + 泛型函数扫描(扁平,best-effort)。 */\nfunction parseBrace(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n const typeRe = /^[ \\t]*(?:(?:public|private|protected|internal|static|final|abstract|sealed|readonly|export|declare|async|open|extern|virtual|override|const|global|pub|local)\\s+)*(class|struct|interface|enum|namespace|module|trait|record)\\s+([A-Za-z_]\\w*)/\n // 泛型函数:允许任意“字词型”返回类型/修饰符前缀(含 :: 限定名),名字后跟 ( 且不以 ; 结尾\n const funcRe = /^[ \\t]*(?:[\\w<>,*&\\[\\].:]+\\s+)*([A-Za-z_]\\w*)\\s*(?:<[^>]*>)?\\s*\\(/\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n const t = line.trim()\n if (!t || /^\\s*\\*/.test(line)) continue\n const tm = typeRe.exec(line)\n if (tm) { out.push(mk(i, tm[2], BRACE_TYPE_KIND[tm[1]] ?? SK.Class, line)); continue }\n const fm = funcRe.exec(line)\n if (!fm) continue\n if (BRACE_KW.has(fm[1]) || /;\\s*$/.test(t)) continue\n out.push(mk(i, fm[1], SK.Function, line))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/**\n * 按 Monaco languageId 解析大纲符号(纯函数)。\n * @author ddj 2026年08月27号\n * @param languageId Monaco 语言 id\n * @param text 文件全文\n * @returns 归一化大纲符号树\n */\nexport function parseOutline(languageId: string, text: string): OutlineSymbol[] {\n switch (languageId) {\n case 'markdown':\n case 'mdx':\n return parseMarkdown(text)\n case 'python':\n return parsePython(text)\n case 'shell':\n return parseShell(text)\n case 'powershell':\n return parsePwsh(text)\n case 'lua':\n return parseLua(text)\n case 'go':\n return parseGo(text)\n case 'rust':\n return parseRust(text)\n case 'yaml':\n return parseYaml(text)\n case 'ini':\n return parseIni(text)\n case 'c':\n case 'cpp':\n case 'csharp':\n case 'java':\n case 'php':\n case 'ruby':\n case 'kotlin':\n case 'swift':\n case 'dart':\n return parseBrace(text)\n default:\n return []\n }\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 大纲源注册表 + 内置数据源(monaco / fallback)。\n * 解析规则:按优先级降序遍历源,首个非空结果生效;全空 → 空态。\n * monaco 源吃 Monaco 原生 document symbol provider(ts/json/css/html 与未来\n * 第三方注册的 provider);fallback 源兜底无内置提供方的语言(parse.ts)。\n * 注册表对外 provide 为 edrvOutlineSources,第三方语言插件可注册更高优先级源。\n * 作者 ddj 2026-08-27\n */\nimport type { OutlineSourceRegistry, OutlineSource, OutlineSourceInput, OutlineSymbol } from './types.js'\nimport { parseOutline } from './parse.js'\n\n/** Monaco 原生有 document symbol provider 的语言(无需 fallback)。 */\nexport const OUTLINE_MONACO_LANGS = new Set([\n 'typescript', 'javascript', 'json', 'jsonc', 'css', 'scss', 'less', 'html',\n])\n\n/** 无内置 provider、由 parse.ts 兜底的语言。 */\nexport const OUTLINE_FALLBACK_LANGS = new Set([\n 'markdown', 'mdx', 'python', 'shell', 'powershell', 'lua', 'go', 'rust',\n 'yaml', 'ini', 'c', 'cpp', 'csharp', 'java', 'php', 'ruby', 'kotlin',\n 'swift', 'dart',\n])\n\n/**\n * 创建生命周期独立的大纲源注册表。\n * @author ddj 2026年08月27号\n * @returns 大纲源注册表\n */\nexport function createOutlineSourceRegistry(): OutlineSourceRegistry {\n const entries = new Map<string, OutlineSource>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) listener()\n }\n const list = (): readonly OutlineSource[] =>\n [...entries.values()].sort((a, b) => (b.priority - a.priority) || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))\n return {\n register(source: OutlineSource): () => void {\n if (!source || !source.id || typeof source.get !== 'function') throw new TypeError('大纲源必须提供 id 与 get')\n entries.set(source.id, source)\n notify()\n return () => {\n if (entries.get(source.id) !== source) return\n entries.delete(source.id)\n notify()\n }\n },\n list,\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n get: (id: string) => entries.get(id),\n }\n}\n\n/** 归一化 Monaco OutlineElement(getTopLevelSymbols 产物)→ OutlineSymbol。 */\nfunction normalizeMonaco(el): OutlineSymbol | null {\n if (!el || typeof el.name !== 'string') return null\n const range = el.range || {}\n const sel = el.selectionRange || range\n const startLine = Math.max(1, Number(sel.startLineNumber ?? range.startLineNumber ?? 1))\n const endLine = Math.max(1, Number(range.endLineNumber ?? startLine))\n const out: OutlineSymbol = {\n name: el.name,\n kind: typeof el.kind === 'number' ? el.kind : 0,\n startLine: Math.max(1, Number(range.startLineNumber ?? startLine)),\n endLine,\n selectLine: startLine,\n }\n if (typeof el.detail === 'string' && el.detail) out.detail = el.detail\n if (Array.isArray(el.children) && el.children.length) {\n const kids = el.children.map(normalizeMonaco).filter(Boolean)\n if (kids.length) out.children = kids\n }\n return out\n}\n\n/**\n * 按优先级解析大纲符号:首个非空结果生效(出错源跳过,落入下一优先级)。\n * @author ddj 2026年08月27号\n * @param sources 大纲源注册表\n * @param input 当前快照(languageId/model/editor/monaco)\n * @returns 归一化符号树(无符号时为空数组)\n */\nexport async function resolveOutline(sources: OutlineSourceRegistry, input: OutlineSourceInput): Promise<OutlineSymbol[]> {\n for (const source of sources.list()) {\n let supports = false\n try { supports = source.provides(input.languageId) } catch { supports = false }\n if (!supports) continue\n let items: OutlineSymbol[] | null = null\n try { items = await source.get(input) } catch { items = null }\n if (items && items.length) return items\n }\n return []\n}\n\n/**\n * 注册内置大纲源(monaco=50 / fallback=30)。\n * @author ddj 2026年08月27号\n * @param registry 目标注册表\n * @returns 注销函数(同时注销全部内置源)\n */\nexport function registerBuiltinOutlineSources(registry: OutlineSourceRegistry): () => void {\n const disposers = [\n registry.register({\n id: 'monaco',\n priority: 50,\n provides: () => true,\n async get(input: OutlineSourceInput): Promise<OutlineSymbol[]> {\n const ed = input.editor\n const model = input.model\n const cmd = ed?._commandService\n if (!cmd || typeof cmd.executeCommand !== 'function') return []\n const uri = model?.uri\n if (!uri) return []\n const list = await cmd.executeCommand('_executeDocumentSymbolProvider', uri)\n return Array.isArray(list) ? list.map(normalizeMonaco).filter(Boolean) : []\n },\n }),\n registry.register({\n id: 'fallback',\n priority: 30,\n provides: (languageId: string) => OUTLINE_FALLBACK_LANGS.has(languageId),\n async get(input: OutlineSourceInput): Promise<OutlineSymbol[]> {\n const model = input.model\n if (!model || typeof model.getValue !== 'function') return []\n return parseOutline(input.languageId, model.getValue())\n },\n }),\n ]\n return () => { for (const dispose of disposers) dispose() }\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏「大纲」面板。\n * 数据源经 resolveOutline(源注册表,优先级降序、首个非空生效)解析当前活动文件符号:\n * monaco 源吃原生 document symbol provider,fallback 源兜底无内置提供方的语言。\n * 交互:点击符号跳转编辑器、▸/▾ 折叠、光标所在符号高亮、空/加载/错误态。\n * 作者 ddj 2026-08-27\n */\nimport React from 'react'\nimport { resolveOutline } from './sources.js'\nimport type { SidebarCtx } from '../sidebar/types.js'\n\n/** 渲染符号数上限(防超大文件卡顿,超出显示截断提示)。 */\nconst RENDER_CAP = 800\n\n/** kind 分组元信息(字形 + 样式类)。 */\nconst KIND_GROUPS = {\n func: { glyph: 'ƒ', cls: 'edrv-ol-func' },\n type: { glyph: 'C', cls: 'edrv-ol-type' },\n data: { glyph: '•', cls: 'edrv-ol-data' },\n ns: { glyph: '▤', cls: 'edrv-ol-ns' },\n key: { glyph: '·', cls: 'edrv-ol-key' },\n}\n\n/** SymbolKind 数值 → 分组(File0..Package3=ns;Class4/Enum9/Interface10/Struct22/TypeParameter25=type;Method5/Constructor8/Function11=func;Key19/EnumMember21=key)。 */\nfunction kindMeta(kind) {\n const k = kind | 0\n if (k <= 3) return KIND_GROUPS.ns\n if (k === 4 || k === 9 || k === 10 || k === 22 || k === 25) return KIND_GROUPS.type\n if (k === 5 || k === 8 || k === 11) return KIND_GROUPS.func\n if (k === 19 || k === 21) return KIND_GROUPS.key\n return KIND_GROUPS.data\n}\n\n/**\n * 大纲面板主体。\n * @param props.ctx 面板共享上下文(editor/outlineSources/activePath)\n */\nexport function OutlinePanel(props) {\n const ctx = props?.ctx\n const activePath = ctx?.activePath ?? null\n const [symbols, setSymbols] = React.useState(null)\n const [error, setError] = React.useState(null)\n const [collapsed, setCollapsed] = React.useState({})\n const [cursorLine, setCursorLine] = React.useState(null)\n const seqRef = React.useRef(0)\n // ref 镜像:refresh 稳定([]),监听器只挂一次,避免 EditorView 每渲染重建 ctx 造成抖动\n const ctxRef = React.useRef(ctx)\n ctxRef.current = ctx\n const activeRef = React.useRef(activePath)\n activeRef.current = activePath\n const sourcesRef = React.useRef(ctx?.outlineSources)\n sourcesRef.current = ctx?.outlineSources\n\n const refresh = React.useCallback(() => {\n const c = ctxRef.current\n const ed = c?.editor?.()\n const model = ed?.getModel?.()\n const seq = ++seqRef.current\n if (!ed || !model) { setSymbols(null); setError(null); return }\n const uriPath = model?.uri?.path\n const modelPath = uriPath ? decodeURIComponent(String(uriPath).replace(/^\\//, '')) : null\n const active = activeRef.current\n if (active && modelPath !== active) { setSymbols(null); setError(null); return }\n const sources = sourcesRef.current\n if (!sources) { setSymbols([]); setError(null); return }\n setError(null)\n resolveOutline(sources, { languageId: model.getLanguageId(), path: modelPath, model, editor: ed, monaco: window.monaco })\n .then((list) => { if (seq === seqRef.current) setSymbols(list || []) })\n .catch((e) => { if (seq === seqRef.current) { setError(String(e?.message ?? e)); setSymbols(null) } })\n }, [])\n\n // 编辑器监听:模型切换/内容编辑(防抖)/光标移动 + edrv:refresh;\n // 编辑器未就绪时轮询等待(避免面板先于 Monaco 挂载后永久停在加载态)\n React.useEffect(() => {\n const disposers = []\n let debounceTimer = null\n let waitTimer = null\n const attach = () => {\n const ed = ctxRef.current?.editor?.()\n if (!ed) return false\n let contentDisposable = null\n const subContent = (model) => {\n if (contentDisposable) { contentDisposable.dispose(); contentDisposable = null }\n contentDisposable = model?.onDidChangeContent?.(() => {\n if (debounceTimer) clearTimeout(debounceTimer)\n debounceTimer = setTimeout(() => { debounceTimer = null; refresh() }, 300)\n }) ?? null\n }\n const onModel = () => { subContent(ed.getModel?.()); refresh() }\n const onCursor = (e) => setCursorLine(e?.position?.lineNumber ?? null)\n subContent(ed.getModel?.())\n const subs = [\n ed.onDidChangeModel?.(onModel),\n ed.onDidChangeCursorPosition?.(onCursor),\n { dispose: () => { if (contentDisposable) contentDisposable.dispose() } },\n ]\n for (const s of subs) if (s) disposers.push(s)\n refresh()\n return true\n }\n const onRefresh = () => refresh()\n window.addEventListener('edrv:refresh', onRefresh)\n if (!attach()) {\n waitTimer = setInterval(() => { if (attach()) { clearInterval(waitTimer); waitTimer = null } }, 400)\n }\n return () => {\n if (debounceTimer) clearTimeout(debounceTimer)\n if (waitTimer) clearInterval(waitTimer)\n for (const d of disposers) if (d?.dispose) d.dispose()\n window.removeEventListener('edrv:refresh', onRefresh)\n }\n }, [refresh])\n\n // 活动文件变化 → 重拉\n React.useEffect(() => { refresh() }, [refresh, activePath])\n\n const jump = (sym) => {\n const ed = ctxRef.current?.editor?.()\n if (!ed) return\n const line = Math.max(1, sym?.selectLine ?? sym?.startLine ?? 1)\n ed.revealLineInCenter(line)\n ed.setPosition({ lineNumber: line, column: 1 })\n ed.focus()\n }\n\n const toggleCollapse = (key) => {\n setCollapsed((prev) => Object.assign({}, prev, { [key]: prev[key] === true ? false : true }))\n }\n\n const allKeys = React.useMemo(() => {\n const keys = []\n const walk = (list, prefix) => {\n for (let i = 0; i < list.length; i++) {\n const key = prefix ? prefix + '/' + i : String(i)\n const sym = list[i]\n if (sym.children && sym.children.length) { keys.push(key); walk(sym.children, key) }\n }\n }\n walk(symbols || [], '')\n return keys\n }, [symbols])\n\n const setAll = (value) => {\n const next = {}\n for (const key of allKeys) next[key] = value\n setCollapsed(next)\n }\n\n const renderTree = (list, depth, prefix) => {\n const rows = []\n const cap = Math.min(list.length, RENDER_CAP)\n for (let i = 0; i < cap; i++) {\n const sym = list[i]\n const key = prefix ? prefix + '/' + i : String(i)\n const kids = sym.children && sym.children.length ? sym.children : null\n const isCollapsed = collapsed[key] === true\n const meta = kindMeta(sym.kind)\n const active = cursorLine != null && sym.startLine <= cursorLine && cursorLine <= sym.endLine\n rows.push(React.createElement('div', {\n key,\n className: 'edrv-tree-row' + (active ? ' edrv-tree-active' : ''),\n title: sym.detail || sym.name,\n style: { paddingLeft: 6 + depth * 14 },\n onClick: () => jump(sym),\n },\n React.createElement('span', {\n className: 'edrv-tree-chev',\n onClick: (e) => { e.stopPropagation(); toggleCollapse(key) },\n }, kids ? (isCollapsed ? '▸' : '▾') : ''),\n React.createElement('span', { className: 'edrv-outline-kind ' + meta.cls }, meta.glyph),\n React.createElement('span', { className: 'edrv-tree-name' }, sym.name),\n (sym.detail ? React.createElement('span', { className: 'edrv-outline-detail' }, sym.detail) : null),\n React.createElement('span', { className: 'edrv-outline-ln' }, String(sym.selectLine ?? sym.startLine ?? ''))))\n if (kids && !isCollapsed) rows.push(...renderTree(kids, depth + 1, key))\n }\n if (list.length > RENDER_CAP) {\n rows.push(React.createElement('div', { key: 'cap', className: 'edrv-tree-loading' }, '符号过多,仅显示前 ' + RENDER_CAP + ' 个'))\n }\n return rows\n }\n\n const basename = activePath ? String(activePath).split(/[\\\\/]/).pop() || activePath : ''\n\n let body\n if (error) {\n body = React.createElement('div', { className: 'edrv-tree' },\n React.createElement('div', { className: 'edrv-tree-error' },\n React.createElement('span', null, String(error)),\n React.createElement('button', { className: 'edrv-side-btn', onClick: refresh }, '重试')))\n } else if (!activePath) {\n body = React.createElement('div', { className: 'edrv-tree' },\n React.createElement('div', { className: 'edrv-tree-loading' }, '未打开文件'))\n } else if (symbols === null) {\n body = React.createElement('div', { className: 'edrv-tree' },\n React.createElement('div', { className: 'edrv-tree-loading' }, '加载中…'))\n } else if (symbols.length === 0) {\n body = React.createElement('div', { className: 'edrv-tree' },\n React.createElement('div', { className: 'edrv-tree-loading' }, '该语言暂不支持大纲或文件无符号'))\n } else {\n body = React.createElement('div', { className: 'edrv-tree' }, ...renderTree(symbols, 0, ''))\n }\n\n return React.createElement('div', { className: 'edrv-side-panel' },\n React.createElement('div', { className: 'edrv-side-head' },\n React.createElement('span', { className: 'edrv-side-title' }, '大纲'),\n React.createElement('span', { className: 'edrv-side-root', title: activePath || '' }, basename),\n React.createElement('span', { style: { flex: 1 } }),\n React.createElement('button', { className: 'edrv-side-btn', title: '折叠全部', disabled: !(symbols && symbols.length), onClick: () => setAll(true) }, '−'),\n React.createElement('button', { className: 'edrv-side-btn', title: '展开全部', disabled: !(symbols && symbols.length), onClick: () => setAll(false) }, '+'),\n React.createElement('button', { className: 'edrv-side-btn', title: '刷新大纲', onClick: refresh }, '⟳')),\n body)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 「大纲」面板定义(注册表一项)。\n * 数据源解析复用 outline/sources 的源注册表(ctx.outlineSources 注入)。\n * 作者 ddj 2026-08-27\n */\nimport React from 'react'\nimport { OutlinePanel } from './OutlinePanel.js'\nimport type { SidebarPanelDef, SidebarCtx } from '../sidebar/types.js'\n\n/**\n * 构造大纲面板定义。\n * @author ddj 2026年08月27号\n * @returns 面板定义(无徽标;活动栏图标 📜)\n */\nexport function createOutlinePanel(): SidebarPanelDef {\n return {\n id: 'outline',\n title: '大纲',\n icon: '📜',\n order: 20,\n render: (ctx: SidebarCtx) => React.createElement(OutlinePanel, { ctx }),\n }\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 大纲「lsp」源:经 host LSP documentSymbol 解析(优先于 monaco/fallback)。\n * LSP 服务器未就绪时返回 [] → resolveOutline 自动落入下一优先级(fallback 兜底),不阻塞面板。\n * 作者 ddj 2026-08-27\n */\nimport type { OutlineSource, OutlineSourceInput, OutlineSymbol } from './types.js'\nimport { fetchDocumentSymbols } from '../monaco/lsp/lspClient.js'\n\nexport const LSP_OUTLINE_PRIORITY = 60\n\n/** LSP 大纲源:lua/csharp 等有 host 服务器能力的语言。 */\nexport function createLspOutlineSource(): OutlineSource {\n return {\n id: 'lsp',\n priority: LSP_OUTLINE_PRIORITY,\n provides: (languageId: string) => languageId === 'lua' || languageId === 'csharp',\n async get(input: OutlineSourceInput): Promise<OutlineSymbol[]> {\n const model = input.model\n if (!model || typeof model.getValue !== 'function') return []\n const path = input.path || (model.uri && model.uri.path ? decodeURIComponent(String(model.uri.path).replace(/^\\//, '')) : null)\n if (!path) return []\n const symbols = await fetchDocumentSymbols(path, model.getValue())\n return (Array.isArray(symbols) ? symbols : []).map(toOutline).filter(Boolean)\n },\n }\n}\n\n/** LSP SymbolInfo(host 归一化,0-based range)→ 大纲 OutlineSymbol(1-based)。 */\nfunction toOutline(symbol) {\n if (!symbol || typeof symbol.name !== 'string') return null\n const range = symbol.range || {}\n const sel = symbol.selectionRange || range\n const start = range.start || {}\n const select = sel.start || {}\n const out = {\n name: symbol.name,\n kind: typeof symbol.kind === 'number' ? symbol.kind : 0,\n startLine: Math.max(1, (start.line ?? 0) + 1),\n endLine: Math.max(1, ((range.end?.line ?? start.line) ?? 0) + 1),\n selectLine: Math.max(1, (select.line ?? start.line ?? 0) + 1),\n }\n if (typeof symbol.detail === 'string' && symbol.detail) out.detail = symbol.detail\n if (Array.isArray(symbol.children) && symbol.children.length) {\n const kids = symbol.children.map(toOutline).filter(Boolean)\n if (kids.length) out.children = kids\n }\n return out\n}\n","/**\n * dsh-vscode-mode client — 浏览器半入口:slot 注册 + 装配。\n * 挂点:betterSidebar「文件编辑」Tab(侧边栏形态,对话+编辑同屏;未装 dsh-better-sidebar 时\n * 回退 conversation.view 中央页签)+ conversation.input.dock 差异条 + 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 * conversation.input.dock。\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 { PerfSizeBadge } from './ui/PerfSizeBadge.js'\nimport { ConversationDiffDock } from './ui/ConversationDiffDock.js'\nimport { McpSettings } from './ui/McpSettings.js'\nimport { rpc } from './rpc.js'\nimport { loadMonaco } from './monaco/loader.js'\nimport { createFileOpenerRegistry, scanSidebar, type FileOpenContext } from './fileOpeners.js'\nimport type { FileOpenerRegistry } from './fileOpeners.js'\nimport { installOpenPathRouter, vscodeOpener, autoValue } from './openPathRouter.js'\nimport { SettingsContext } from './settingsContext.js'\nimport { SIDEBAR_PLUGIN, pickSettingsBinder, registerSlotSafely } from './compat.js'\nimport { detectSidebarService, installSideEditor, setEnsureSideEditor, SIDEBAR_INSTALL_CMD } from './sidebarBridge.js'\nimport { SideEditorTab } from './ui/SideEditorTab.js'\nimport { createAddToConversation } from './addToConversation.js'\nimport { createSidebarPanelRegistry } from './sidebar/registry.js'\nimport { createFilePanel } from './sidebar/panels/index.js'\nimport { createSearchPanel } from './sidebar/panels/index.js'\nimport { createTreeMenuRegistry } from './sidebar/contextMenu.js'\nimport { createDefaultFileMenuItems } from './sidebar/menuItems.js'\nimport { createOutlinePanel } from './outline/index.js'\nimport { createOutlineSourceRegistry, registerBuiltinOutlineSources } from './outline/sources.js'\nimport { createLspOutlineSource } from './outline/lspSource.js'\nimport { keybindingsApply } from './keybindings.js'\nimport { setupLsp, setSession } from './monaco/lsp/index.js'\nimport type { CompatAdapter } from '../shared/compat.js'\n\n// ⚠️ inject 只列必需服务:webUiSettings 是 @linxin666/dsh-client-ui-web-ui-settings 提供的\n// 可选兼容桥(非官方服务),列入 inject 会让未装该桥的部署启动时 entry 永久 pending,\n// web boot 直接失败('1 entry did not activate')。兼容层用 ctx.get 运行时探测 + 降级,不靠 inject。\nexport const inject = ['slots', 'timer', 'locale', 'connection', 'remote', 'workspaces', 'sessions', 'conversation', 'settingsScope']\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 const registry: FileOpenerRegistry = createFileOpenerRegistry()\n const workspaces = ctx.get('workspaces')\n const sessions = ctx.get('sessions')\n\n // Monaco 加载时机:不再 DSH 启动即预热,改为进入会话界面(sessions.list.current 出现)后再后台加载,\n // 用户点开「文件编辑」页签即用;空闲时仍由 EditorView 挂载兜底加载。\n // 模块级 promise 去重,重复触发只首次真正加载;requestIdleCallback 让出会话首屏带宽,缺省回退延时调度;\n // 预热失败静默吞掉(loader 失败会重置 promise,页签打开时仍走原有加载/重试路径)。\n const monacoList = sessions?.list\n if (typeof window !== 'undefined' && monacoList && typeof monacoList.subscribe === 'function') {\n const list = monacoList as { getSnapshot: () => { current?: unknown }; subscribe: (listener: () => void) => () => void }\n const schedulePreload = () => {\n const preload = () => loadMonaco(() => {}).then((m: unknown) => setupLsp(m)).catch(() => {})\n if (typeof window.requestIdleCallback === 'function') window.requestIdleCallback(preload, { timeout: 2000 })\n else schedule(preload, 300)\n }\n const onSessionEnter = () => {\n const current = list.getSnapshot()?.current\n if (!current) return\n setSession(current)\n schedulePreload()\n }\n ctx.effect(() => list.subscribe(onSessionEnter), 'vscode-mode: monaco session trigger')\n onSessionEnter()\n }\n // 会话切换 → LSP 文档归属更新 + 状态刷新\n if (monacoList && typeof monacoList.subscribe === 'function') {\n const list = monacoList as { getSnapshot: () => { current?: string }; subscribe: (listener: () => void) => () => void }\n ctx.effect(() => list.subscribe(() => {\n setSession(list.getSnapshot()?.current)\n }), 'vscode-mode: lsp session sync')\n }\n const originalOpenPath = workspaces?.openPath\n const binder = pickSettingsBinder(ctx)\n const settings = binder.scope\n let selected = autoValue('auto')\n /** 可选探测 betterSidebar 服务(不进 inject:缺失会让插件停靠等待,杀死回退路径)。 */\n let sideService = detectSidebarService(ctx)\n /** 「添加到对话」动作集:编辑区/Tab 右键菜单注入文件引用与代码块(conversation 服务缺失时各动作安全降级)。 */\n const addToConversation = createAddToConversation(ctx)\n\n /** 客户端侧兼容摘要(与 host 报告合并展示;惰性求值保证 HMR 后仍新鲜)。 */\n const compatSummary = (): CompatAdapter[] => [\n { name: '设置桥', active: settings !== undefined, note: settings !== undefined ? '使用 ' + binder.service + ' 桥' : '未绑定设置服务(fileOpenTool 持久化不可用)' },\n { name: '文件打开路由(workspaces.openPath)', active: Boolean(workspaces?.openPath), note: 'vscode 打开器优先,失败回退系统打开' },\n { name: '侧边栏打开器(' + SIDEBAR_PLUGIN + ')', active: registry.get(SIDEBAR_PLUGIN) !== undefined, note: registry.get(SIDEBAR_PLUGIN) !== undefined ? '已注册(优先级 80)' : '未检测到侧边栏打开能力' },\n { name: '侧边栏编辑区(' + SIDEBAR_PLUGIN + ')', active: sideService !== undefined, note: sideService !== undefined ? '编辑区=侧边栏 Tab(对话+编辑同屏)' : '未检测到;安装 dsh-better-sidebar 后刷新启用侧边栏形态(' + SIDEBAR_INSTALL_CMD + ')' },\n ]\n\n ctx.provide('fileOpeners', registry)\n ctx.effect(() => registry.register(vscodeOpener()), 'vscode-mode: file opener')\n\n // 侧边栏面板注册表(对外 provide,供本插件/第三方注册面板;文件管理为面板 #1)\n const sidebarPanels = createSidebarPanelRegistry()\n ctx.provide('edrvSidebarPanels', sidebarPanels)\n ctx.effect(() => sidebarPanels.register(createFilePanel()), 'vscode-mode: sidebar panel')\n // 搜索面板:活动栏「搜索」页签(Ctrl+Shift+F 唤起,VSCode 搜索视图形态)\n ctx.effect(() => sidebarPanels.register(createSearchPanel()), 'vscode-mode: sidebar panel search')\n // 文件右键菜单项注册表(对外 provide,供本插件/第三方注册;内置「在文件浏览器中打开」)\n const fileMenuItems = createTreeMenuRegistry()\n ctx.provide('edrvFileContextMenuItems', fileMenuItems)\n for (const item of createDefaultFileMenuItems()) {\n ctx.effect(() => fileMenuItems.register(item), 'vscode-mode: file context menu item ' + item.id)\n }\n // 大纲源注册表(公开预留口):第三方语言插件(LSP/VSIX 等)注册更高优先级源即可覆盖兜底\n const outlineSources = createOutlineSourceRegistry()\n ctx.provide('edrvOutlineSources', outlineSources)\n ctx.effect(() => registerBuiltinOutlineSources(outlineSources), 'vscode-mode: outline sources')\n // LSP 大纲源(priority 60):lua/csharp 有 host 服务器时优先生效,否则自动落入 fallback\n ctx.effect(() => outlineSources.register(createLspOutlineSource()), 'vscode-mode: outline lsp source')\n ctx.effect(() => sidebarPanels.register(createOutlinePanel()), 'vscode-mode: sidebar panel outline')\n ctx.effect(() => registry.register({\n id: 'system', label: '系统默认应用', priority: 0,\n open: (path: string) => originalOpenPath.call(workspaces, path),\n }), 'vscode-mode: system file opener')\n ctx.effect(() => {\n const sidebar = scanSidebar(ctx)\n return sidebar ? registry.register(sidebar) : undefined\n }, 'vscode-mode: sidebar file opener')\n ctx.effect(() => {\n if (!settings) return undefined\n const sync = (): void => {\n const snapshot = settings.getSnapshot()\n if (snapshot.status === 'loading') return\n selected = autoValue(snapshot.value?.fileOpenTool)\n window.dispatchEvent(new CustomEvent('edrv:file-open-tool-change', { detail: { value: selected } }))\n }\n sync()\n return settings.subscribe(sync)\n }, 'vscode-mode: file opener setting sync')\n // 快捷键配置同步:设置提交后立即刷新键位匹配(编辑器/QuickOpen 按事件时读取)\n ctx.effect(() => {\n if (!settings) return undefined\n const sync = (): void => {\n const snapshot = settings.getSnapshot()\n if (snapshot.status === 'loading') return\n keybindingsApply(snapshot.value?.keybindings)\n }\n sync()\n return settings.subscribe(sync)\n }, 'vscode-mode: keybindings setting sync')\n if (workspaces?.openPath) {\n ctx.effect(() => installOpenPathRouter({\n workspaces,\n registry,\n selected: () => selected,\n context: () => {\n const current = sessions?.list?.getSnapshot?.()\n const sessionId = current?.current\n const summary = sessionId ? current?.byId?.[sessionId] : undefined\n return { sessionId, cwd: summary?.cwd } as FileOpenContext\n },\n logger: (message: string) => console.warn('[dsh-vscode-mode] ' + message),\n }), 'vscode-mode: file link routing')\n }\n\n // 中央「文件编辑」页签(旧形态回退):类 VSCode 编辑器;侧边栏形态可用时编辑器住 betterSidebar Tab,\n // 本页签不注册(避免双实例:Monaco×2 + diff dock 每会话单源抢占)。\n const registerLegacyTab = (): (() => void) | null => {\n return registerSlotSafely(ctx, {\n name: 'conversation.view',\n id: 'edrv-editor',\n order: 5,\n label: '文件编辑',\n inject: (sessionId: string) => ({ sessionId }),\n }, (props: unknown) => React.createElement(EditorView, Object.assign({}, props, { layout: 'tab', sideHint: SIDEBAR_INSTALL_CMD, schedule, addToConversation, sidebarPanels, outlineSources, fileMenuItems })))\n }\n\n // 侧边栏/中央页签两形态互斥切换:sideDisposer(侧边栏 Tab)与 legacyDisposer(中央页签)只保留其一。\n // ⚠️ betterSidebar 服务由 dsh-better-sidebar 的 client bundle(1MB+)在页面加载时提供,本插件\n // bundle 较小往往先执行完启动检测——一次性探测会误报「未检测到」并永久停在中央页签形态(实测\n // 竞态:better-sidebar 已装,但「文件编辑」Tab 未注册)。故启动后按 2s 间隔重试(窗口 ~30s),\n // 命中即自动切换侧边栏形态;始终未命中则保持中央页签回退。\n let sideDisposer: (() => void) | null = null\n let legacyDisposer: (() => void) | null = null\n const applySideForm = (): void => {\n if (sideService) {\n if (sideDisposer !== null) return\n if (legacyDisposer !== null) { legacyDisposer(); legacyDisposer = null }\n sideDisposer = ctx.effect(() => installSideEditor({\n service: sideService as NonNullable<typeof sideService>,\n renderTab: (props: Record<string, unknown>) => React.createElement(SideEditorTab, Object.assign({}, props, { schedule, addToConversation, sidebarPanels, outlineSources, fileMenuItems })),\n activeSession: () => {\n const snapshot = sessions?.list?.getSnapshot?.() as { current?: string; byId?: Record<string, { cwd?: string }> } | undefined\n const sessionId = snapshot?.current\n if (!sessionId) return undefined\n return { sessionId, cwd: snapshot?.byId?.[sessionId]?.cwd }\n },\n registerLegacyFallback: registerLegacyTab,\n }), 'vscode-mode: sidebar editor tab')\n } else {\n if (legacyDisposer !== null) return\n if (sideDisposer !== null) { sideDisposer(); sideDisposer = null }\n setEnsureSideEditor(null)\n legacyDisposer = registerLegacyTab()\n }\n }\n applySideForm()\n let sideRetries = 0\n const retrySideService = (): void => {\n if (sideService !== undefined || sideRetries >= 15) return\n sideRetries += 1\n schedule(() => {\n if (sideService !== undefined) return\n sideService = detectSidebarService(ctx)\n if (sideService !== undefined) {\n console.info('[dsh-vscode-mode] 检测到 ' + SIDEBAR_PLUGIN + ',切换侧边栏编辑形态')\n applySideForm()\n } else {\n retrySideService()\n }\n }, 2000)\n }\n retrySideService()\n\n // 对话输入框上方差异 dock:普通对话显示单文案按钮,文件编辑页由 EditorView 隐藏\n registerSlotSafely(ctx, {\n name: 'conversation.input.dock',\n id: 'edrv-diff-dock',\n order: 30,\n label: '差异',\n inject: (sessionId: string) => ({ sessionId }),\n }, (props: unknown) => React.createElement(ConversationDiffDock, Object.assign({}, props)))\n\n // header 差异角标:仅当前工作区存在差异时渲染\n registerSlotSafely(ctx, { name: 'conversation.session.header.utilities', id: 'edrv-diff-badge', order: 90, label: '差异' },\n (props: unknown) => React.createElement(DiffBadge, Object.assign({}, props)))\n\n // header 会话体积指示器:当前会话持久化体积,超阈值提示新开会话(性能优化)\n registerSlotSafely(ctx, { name: 'conversation.session.header.utilities', id: 'edrv-perf-size', order: 89, label: '会话体积' },\n (props: unknown) => React.createElement(PerfSizeBadge, Object.assign({}, props, { sessions })))\n\n // 设置页中的 VSCodeMode 专属页签,MCP 管理作为该页签的内部子 Tab。\n registerSlotSafely(ctx, {\n name: 'settings.section',\n id: 'vscode-mode',\n order: 30,\n label: 'VSCodeMode',\n }, () => React.createElement(SettingsContext.Provider, { value: settings }, React.createElement(McpSettings, { openerRegistry: registry, compatSummary })))\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["React","listeners","React","React","React","React","KEY_PREFIX","React","React","React","React","React","React","React","React","React","React","React","React","createPortal","KEY_PREFIX","React","React","React","React","React","React"],"sources":["../src/shared/rpc.ts","../src/client/rpc.ts","../src/client/sidebarBridge.ts","../src/client/events.ts","../src/client/monaco/theme.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/shared/keybindings.ts","../src/client/keybindings.ts","../src/client/ui/QuickOpen.ts","../src/client/ui/shared.ts","../src/client/ui/DiffLauncher.ts","../src/client/sidebar/SidebarView.ts","../src/client/diffDockStore.ts","../src/client/diffDock.ts","../src/client/editorLayout.ts","../src/client/fileReveal.ts","../src/client/paths.ts","../src/client/state/viewStateCache.ts","../src/shared/lsp.ts","../src/client/monaco/lsp/lspClient.ts","../src/client/monaco/lsp/providers.ts","../src/client/monaco/lsp/index.ts","../src/client/ui/EditorView.ts","../src/client/ui/DiffBadge.ts","../src/client/ui/PerfSizeBadge.ts","../src/client/ui/DiffBox.ts","../src/client/ui/ConversationDiffDock.ts","../src/client/compat.ts","../src/client/fileOpeners.ts","../src/client/settingsContext.ts","../src/client/ui/KeybindingsPanel.ts","../src/client/ui/LspSettings.ts","../src/client/state/workspaceFoldCache.ts","../src/client/ui/PerfSettings.ts","../src/client/ui/McpSettings.ts","../src/client/openPathRouter.ts","../src/client/ui/SideEditorTab.ts","../src/client/addToConversation.ts","../src/client/sidebar/registry.ts","../src/client/ui/menuPosition.ts","../src/client/ui/ContextMenu.ts","../src/client/sidebar/contextMenu.ts","../src/client/state/explorerCache.ts","../src/client/state/explorerEntriesCache.ts","../src/client/sidebar/panels/FileExplorer.ts","../src/client/sidebar/panels/SearchPanel.ts","../src/client/sidebar/panels/index.ts","../src/client/sidebar/menuItems.ts","../src/client/outline/parse.ts","../src/client/outline/sources.ts","../src/client/outline/OutlinePanel.tsx","../src/client/outline/index.ts","../src/client/outline/lspSource.ts","../src/client/index.ts"],"sourcesContent":["/**\n * dsh-vscode-mode RPC contract — method names, per-method request/ok payloads,\n * and the typed handler map shared by the host dispatcher and the client\n * fetch wrapper. 载荷形状与历史实现一字不差,仅把隐式约定类型化。\n *\n * Purity rule: no node/react imports (same as types.ts).\n * 作者 ddj 2026-08-20\n */\nimport type {\n ArchiveBatch,\n ArchiveEntry,\n RecordView,\n StaleHunk,\n} from './types.js'\nimport type { MpcConfig, MpcProject, MpcProjectSaveInput, MpcServer } from './mcp.js'\nimport type { CompatReport, DevFormInfo } from './compat.js'\nimport type { LspExtInfo, LspExtUpdate, LspHover, LspLocation, LspMarketItem, LspPosition, LspSemanticTokens, LspServerStatus, LspSymbol } from './lsp.js'\n\n/** webServer 精确路由。 */\nexport const RPC_PATH = '/edrv/rpc'\n\n/** 决策作用域:call=整条记录,hunk=单个差异块。 */\nexport type RpcScope = 'call' | 'hunk'\n\n/** 目录树单项(edrv.listDir 返回;path 相对工作区根,'/' 分隔)。 */\nexport interface TreeEntry {\n name: string\n path: string\n type: 'file' | 'directory' | 'other'\n size?: number\n}\n\n/** 内容搜索单条命中(edrv.searchContent 返回;path 相对工作区根,列为 1-based UTF-16)。 */\nexport interface SearchContentMatch {\n path: string\n line: number\n startColumn: number\n endColumn: number\n text: string\n}\n\n// --region 会话性能管理(edrv.perf.*)\n/** 一个已持久化会话的体积/活跃信息(edrv.perf.inventory 每行)。 */\nexport interface PerfSession {\n sessionId: string\n workspaceKey: string\n bytes: number\n mtime: number\n active: boolean\n}\n\n/** 一个工作区的会话聚合(edrv.perf.inventory)。 */\nexport interface PerfWorkspace {\n workspaceKey: string\n sessionCount: number\n totalBytes: number\n minMtime: number\n maxMtime: number\n}\n\n/** 会话盘点汇总。 */\nexport interface PerfTotals {\n workspaces: number\n sessions: number\n totalBytes: number\n}\n\n/** 一次移出/恢复操作中的单个会话条目。 */\nexport interface PerfMoveItem {\n workspaceKey: string\n sessionId: string\n bytes: number\n}\n\n/** 一次移出操作的失败项。 */\nexport interface PerfMoveFailure {\n workspaceKey: string\n sessionId: string\n error: string\n}\n\n/** 侧车摘要(edrv.perf.sidecarSummary):紧凑关键字段,不整份读 sidecar 进对话。 */\nexport interface SidecarPerfSummary {\n active: number\n pendingByFile: { path: string; pending: number }[]\n archiveBytes: number\n}\n// --endregion\n\n/** 一条批量决策项(decideBatch 的 items 元素,与 accept/reject 单条参数同构)。 */\nexport interface DecideItem {\n callId: string\n scope?: RpcScope\n hunkIndex?: number\n decision: 'accepted' | 'rejected'\n}\n\n/** 批量决策逐项结果。 */\nexport interface DecideResult {\n callId: string\n ok: boolean\n error?: string\n record?: RecordView\n}\n\n/** 每个方法的请求参数(sessionId 为公共可选字段)。 */\nexport interface RpcRequestMap {\n 'edrv.list': { sessionId?: string; callIds?: string[]; skipStale?: boolean }\n 'edrv.accept': { sessionId?: string; callId: string; scope?: RpcScope; hunkIndex?: number }\n 'edrv.reject': { sessionId?: string; callId: string; scope?: RpcScope; hunkIndex?: number }\n 'edrv.decideBatch': { sessionId?: string; items: DecideItem[] }\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 'edrv.searchContent': { sessionId?: string; query: string; matchCase?: boolean; wholeWord?: boolean; regex?: boolean; maxResults?: number; include?: string[]; exclude?: string[] }\n 'edrv.listDir': { sessionId?: string; path: string; force?: boolean }\n 'edrv.revealInExplorer': { sessionId?: string; path: string }\n 'mcp.list': {}\n 'mcp.save': { config: MpcConfig }\n 'mcp.remove': { id: string }\n 'mcp.toggle': { id: string; enabled: boolean }\n 'mcp.refresh': { id: string }\n 'mcp.projects': {}\n 'mcp.projectSave': MpcProjectSaveInput\n 'mcp.projectRemove': { workspacePath: string; serverName: string }\n 'mcp.projectToggle': { workspacePath: string; serverName: string; enabled: boolean }\n 'mcp.projectRefresh': { workspacePath: string; serverName: string }\n 'vscode.fileOpenSettingsGet': {}\n 'vscode.fileOpenSettingsUpdate': { fileOpenTool: string; expectedRevision?: number }\n 'vscode.devFormGet': {}\n 'vscode.devFormSet': { enabled: boolean; path?: string }\n 'compat': {}\n 'edrv.lsp.status': { sessionId?: string }\n 'edrv.lsp.sync': { sessionId?: string; path: string; text: string; version: number }\n 'edrv.lsp.close': { sessionId?: string; path: string }\n 'edrv.lsp.definition': { sessionId?: string; path: string; position: LspPosition }\n 'edrv.lsp.references': { sessionId?: string; path: string; position: LspPosition; includeDeclaration?: boolean }\n 'edrv.lsp.documentSymbol': { sessionId?: string; path: string }\n 'edrv.lsp.workspaceSymbol': { sessionId?: string; query: string }\n 'edrv.lsp.hover': { sessionId?: string; path: string; position: LspPosition }\n 'edrv.lsp.semanticTokens': { sessionId?: string; path: string }\n 'edrv.lsp.redetect': { languageId: string }\n 'edrv.lsp.configGet': {}\n 'edrv.lsp.configUpdate': { languageId: string; enabled?: boolean; command?: string; path?: string }\n 'edrv.lsp.ext.list': {}\n 'edrv.lsp.ext.install': { vsixPath?: string; namespace?: string; name?: string; version?: string }\n 'edrv.lsp.ext.uninstall': { id: string }\n 'edrv.lsp.ext.update': { id: string }\n 'edrv.lsp.ext.updates': {}\n 'edrv.lsp.ext.market': { query: string; size?: number }\n 'edrv.perf.inventory': { sessionId?: string }\n 'edrv.perf.sessionSize': { sessionId?: string; cwd: string }\n 'edrv.perf.movePlan': { workspaceKey?: string; sessionIds?: string[]; minBytes?: number; olderThanDays?: number }\n 'edrv.perf.moveOut': { workspaceKey: string; sessionIds: string[]; dryRun?: boolean }\n 'edrv.perf.restore': { workspaceKey: string; sessionId: string }\n 'edrv.perf.purgeArchive': { olderThanDays: number }\n 'edrv.perf.sidecarSummary': { sessionId?: string }\n 'edrv.perf.configGet': {}\n 'edrv.perf.configApply': {}\n 'edrv.perf.configUndo': {}\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.decideBatch': { results: DecideResult[] }\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 'edrv.searchContent': { matches: SearchContentMatch[]; truncated: boolean; warning?: string }\n 'edrv.listDir': { root: string; path: string; entries: TreeEntry[] }\n 'edrv.revealInExplorer': { revealed: string }\n 'mcp.list': { servers: MpcServer[] }\n 'mcp.save': { server: MpcServer }\n 'mcp.remove': object\n 'mcp.toggle': { server: MpcServer }\n 'mcp.refresh': { server: MpcServer }\n 'mcp.projects': { projects: MpcProject[] }\n 'mcp.projectSave': { project: MpcProject }\n 'mcp.projectRemove': { project: MpcProject }\n 'mcp.projectToggle': { project: MpcProject }\n 'mcp.projectRefresh': { project: MpcProject }\n 'vscode.fileOpenSettingsGet': { fileOpenTool: string; revision?: number }\n 'vscode.fileOpenSettingsUpdate': { fileOpenTool: string; revision?: number }\n 'vscode.devFormGet': { devForm: DevFormInfo }\n 'vscode.devFormSet': { devForm: DevFormInfo; restart: boolean }\n 'compat': { report: CompatReport }\n 'edrv.lsp.status': { servers: LspServerStatus[] }\n 'edrv.lsp.sync': object\n 'edrv.lsp.close': object\n 'edrv.lsp.definition': { locations: LspLocation[]; truncated?: boolean }\n 'edrv.lsp.references': { locations: LspLocation[]; truncated?: boolean }\n 'edrv.lsp.documentSymbol': { symbols: LspSymbol[] }\n 'edrv.lsp.workspaceSymbol': { symbols: LspSymbol[]; truncated?: boolean }\n 'edrv.lsp.hover': { hover?: LspHover }\n 'edrv.lsp.semanticTokens': { tokens?: LspSemanticTokens }\n 'edrv.lsp.redetect': { servers: LspServerStatus[] }\n 'edrv.lsp.configGet': { config: Record<string, unknown> }\n 'edrv.lsp.configUpdate': { config: Record<string, unknown>; servers?: LspServerStatus[] }\n 'edrv.lsp.ext.list': { extensions: LspExtInfo[] }\n 'edrv.lsp.ext.install': { extension: LspExtInfo; updated?: boolean }\n 'edrv.lsp.ext.uninstall': object\n 'edrv.lsp.ext.update': { extension: LspExtInfo; updated: boolean }\n 'edrv.lsp.ext.updates': { updates: LspExtUpdate[] }\n 'edrv.lsp.ext.market': { extensions: LspMarketItem[] }\n 'edrv.perf.inventory': { workspaces: PerfWorkspace[]; sessions: PerfSession[]; totals: PerfTotals; activeIds: string[] }\n 'edrv.perf.sessionSize': { bytes: number; exists: boolean }\n 'edrv.perf.movePlan': { items: PerfMoveItem[]; reclaimedBytes: number }\n 'edrv.perf.moveOut': { moved: PerfMoveItem[]; failures: PerfMoveFailure[]; reclaimedBytes: number }\n 'edrv.perf.restore': { restored: boolean; error?: string }\n 'edrv.perf.purgeArchive': { removed: number; reclaimedBytes: number }\n 'edrv.perf.sidecarSummary': SidecarPerfSummary\n 'edrv.perf.configGet': { profileDir?: string; patchPath?: string; applied: boolean; block: string; backup?: string }\n 'edrv.perf.configApply': { applied: boolean; backup: string; restart: boolean }\n 'edrv.perf.configUndo': { restored: boolean; error?: string; backup?: string }\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/**\n * 诊断日志开关(默认关):diff 渲染热路径每条日志 = 1 次 RPC 往返 +\n * host 端 debug 文件全量读改写(上限 512KB),高频渲染下开销可观。\n * 排查问题时在浏览器控制台执行 localStorage.setItem('edrv.debug','1') 后刷新开启。\n * @author ddj 2026年08月26号\n */\nconst DEBUG = (() => {\n try { return localStorage.getItem('edrv.debug') === '1' } catch (e) { return false }\n})()\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 * 诊断日志:开关关闭时直接返回(零 RPC 零落盘);开启时走 host edrv.debug 落盘。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @param text 日志文本\n */\nexport function dbg(sessionId: string | undefined, text: string): void {\n if (!DEBUG) return\n try {\n rpc('edrv.debug', { sessionId, text }).catch(() => {})\n } catch (e) { /* 日志失败忽略 */ }\n}\n","/**\n * dsh-vscode-mode client — 侧边栏编辑区桥:可选探测 dsh-better-sidebar 的\n * ctx.betterSidebar 服务,并注册「文件编辑」Tab(单实例)。\n * 可选依赖模式:服务缺失时调用方回退到中央页签形态;本模块不注册任何东西。\n * 纯逻辑(探测/初始打开解析/角标计数)可单测,DOM/事件仅存在于 install 路径。\n * 作者 ddj 2026年08月25号\n */\n\nimport React from 'react'\n\n/** betterSidebar 服务名(ctx.get 用;不要加进 inject——缺失会让插件停靠等待)。 */\nexport const BETTER_SIDEBAR_SERVICE = 'betterSidebar'\n/** 本插件在侧边栏注册的 Tab 类型 id(亦是 SidebarTab.type)。 */\nexport const SIDE_TAB_ID = 'edrv-editor'\n/** 侧边栏 Tab 标题。 */\nexport const SIDE_TAB_TITLE = '文件编辑'\n/** 推荐安装命令(提示条/兼容性报告共用)。 */\nexport const SIDEBAR_INSTALL_CMD = 'dsh plugin --profile web add dsh-better-sidebar'\n\n/** Tab 元数据(openTab 种子随 Tab 持久化,创建路径用它恢复初始打开)。 */\nexport interface SideEditorMeta {\n /** 待打开的工作区相对/绝对路径。 */\n openPath?: string\n /** 打开后聚焦首个差异。 */\n focusDiff?: boolean\n}\n\n/**\n * betterSidebar 服务的最小结构面(结构性探测,不 import 第三方类型)。\n */\nexport interface SidebarServiceLike {\n registerTab: (descriptor: unknown) => () => void\n openTab: (seed: { type: string; title?: string; path?: string; meta?: unknown }, scope?: { sessionId: string; cwd?: string }) => void\n isTabEnabled?: (id: string) => boolean\n features?: readonly string[]\n}\n\n/**\n * 解析 Tab 挂载时的初始打开请求(创建路径读 tab.path/meta,聚焦路径走窗口事件)。\n * @author ddj 2026年08月25号\n * @param tab 侧边栏 Tab(path/meta 为可选字段)\n * @returns 待打开路径与是否聚焦差异\n */\nexport function resolveInitialOpen(tab: { path?: string; meta?: unknown } | null | undefined): { path: string | null; focusDiff: boolean } {\n const meta = (tab?.meta ?? {}) as SideEditorMeta\n const path = typeof tab?.path === 'string' && tab.path ? tab.path : (typeof meta?.openPath === 'string' ? meta.openPath : null)\n return { path: path || null, focusDiff: meta?.focusDiff === true }\n}\n\n/** 会话级待处理差异文件数缓存(Tab 角标同步读取;EditorView 侧栏形态写入)。 */\nconst sidePending = new Map<string, number>()\n\n/**\n * 写入会话的待处理差异文件数(0 视为清除,不显示角标)。\n * @author ddj 2026年08月25号\n * @param sessionId 会话 id\n * @param count 待处理差异文件数\n */\nexport function setSidePending(sessionId: string, count: number): void {\n if (!sessionId) return\n const value = Number.isFinite(count) ? Math.max(0, Math.floor(count)) : 0\n if (value > 0) sidePending.set(sessionId, value)\n else sidePending.delete(sessionId)\n}\n\n/**\n * 读取会话的待处理差异文件数(角标用)。\n * @author ddj 2026年08月25号\n * @param sessionId 会话 id\n * @returns 非负计数\n */\nexport function getSidePending(sessionId?: string): number {\n if (!sessionId) return 0\n return sidePending.get(sessionId) ?? 0\n}\n\n/** 模块级侧栏打开路由(events.ts 优先走它;未注册 = 旧页签形态)。 */\nlet ensureSideEditor: ((path: string | null, focusDiff: boolean) => boolean) | null = null\n\n/** 待消费的初始打开(Tab 组件尚未挂载时暂存;按会话匹配,挂载时取走)。 */\nlet pendingOpen: { sessionId: string; path: string | null; focusDiff: boolean } | null = null\n/** Tab 组件当前是否有挂载实例(有则直接投递窗口事件,无则暂存待消费)。 */\nlet sideEditorMounted = false\n\n/**\n * 注册/撤销侧栏打开路由。\n * @author ddj 2026年08月25号\n * @param fn 路由函数或 null\n */\nexport function setEnsureSideEditor(fn: ((path: string | null, focusDiff: boolean) => boolean) | null): void {\n ensureSideEditor = fn\n}\n\n/**\n * 标记侧栏编辑器组件挂载状态(SideEditorTab 挂载/卸载时调用)。\n * @author ddj 2026年08月25号\n * @param mounted 是否已挂载\n */\nexport function setSideEditorMounted(mounted: boolean): void {\n sideEditorMounted = mounted\n}\n\n/**\n * 暂存指定会话的待消费初始打开(Tab 组件未挂载时由 install 路径调用)。\n * @author ddj 2026年08月25号\n * @param sessionId 会话 id\n * @param path 待打开路径(可空)\n * @param focusDiff 是否聚焦首个差异\n */\nexport function stagePendingSideOpen(sessionId: string, path: string | null, focusDiff: boolean): void {\n if (!sessionId) return\n pendingOpen = { sessionId, path: path || null, focusDiff: focusDiff === true }\n}\n\n/**\n * 取走指定会话的待消费初始打开(SideEditorTab 挂载时读取;不存在返回 null)。\n * @author ddj 2026年08月25号\n * @param sessionId 会话 id\n * @returns 待打开请求或 null\n */\nexport function takePendingSideOpen(sessionId?: string): { path: string | null; focusDiff: boolean } | null {\n if (!pendingOpen || !sessionId || pendingOpen.sessionId !== sessionId) return null\n const value = { path: pendingOpen.path, focusDiff: pendingOpen.focusDiff }\n pendingOpen = null\n return value\n}\n\n/**\n * 打开/聚焦侧栏编辑器(打开路径可选;返回是否已被侧栏形态接管)。\n * @author ddj 2026年08月25号\n * @param path 待打开路径(可空)\n * @param focusDiff 是否聚焦首个差异\n * @returns 是否路由成功\n */\nexport function routeSideEditor(path: string | null, focusDiff: boolean): boolean {\n if (typeof ensureSideEditor !== 'function') return false\n try {\n return ensureSideEditor(path, focusDiff) === true\n } catch (error) {\n console.warn('[dsh-vscode-mode] 侧栏编辑器打开失败(' + String(error) + '),已回退')\n return false\n }\n}\n\n/**\n * 结构化探测 betterSidebar 服务(可选依赖:缺失/降级返回 undefined)。\n * @author ddj 2026年08月25号\n * @param ctx 客户端服务上下文\n * @returns 服务结构面或 undefined\n */\nexport function detectSidebarService(ctx: { get: (name: string) => unknown }): SidebarServiceLike | undefined {\n try {\n const service = ctx.get(BETTER_SIDEBAR_SERVICE) as SidebarServiceLike | undefined\n if (!service || typeof service.registerTab !== 'function' || typeof service.openTab !== 'function') return undefined\n return service\n } catch {\n return undefined\n }\n}\n\n/**\n * 注册侧边栏「文件编辑」Tab 并接管打开路由。\n * Tab 被用户在 better-sidebar 设置里禁用时,打开路由降级为回退回调(中央页签)。\n * @author ddj 2026年08月25号\n * @param options 装配参数(组件依赖 + 活动会话解析 + 回退注册)\n * @returns 卸载器(反注册 Tab + 撤销路由)\n */\nexport function installSideEditor(options: {\n service: SidebarServiceLike\n renderTab: (props: Record<string, unknown>) => unknown\n activeSession: () => { sessionId?: string; cwd?: string } | undefined\n registerLegacyFallback: () => void\n}): () => void {\n const { service, renderTab, activeSession, registerLegacyFallback } = options\n let fallbackInstalled = false\n const open = (path: string | null, focusDiff: boolean): boolean => {\n if (typeof service.isTabEnabled === 'function' && !service.isTabEnabled(SIDE_TAB_ID)) {\n if (!fallbackInstalled) {\n fallbackInstalled = true\n try { registerLegacyFallback() } catch (error) { console.warn('[dsh-vscode-mode] 回退注册失败(' + String(error) + ')') }\n }\n return false\n }\n const scope = activeSession()\n const sessionId = scope?.sessionId\n if (!sessionId) return false\n try {\n service.openTab({\n type: SIDE_TAB_ID,\n title: SIDE_TAB_TITLE,\n ...(path ? { path } : {}),\n meta: { openPath: path || undefined, focusDiff },\n }, { sessionId, cwd: scope?.cwd })\n } catch (error) {\n console.warn('[dsh-vscode-mode] openTab 失败(' + String(error) + ')')\n return false\n }\n if (sideEditorMounted) {\n // 已挂载:窗口事件直达 EditorView 监听器\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path, focusDiff } }))\n } else {\n // 未挂载(面板折叠卸载/首次创建):暂存待消费,挂载时由 SideEditorTab 取走\n stagePendingSideOpen(sessionId, path, focusDiff)\n }\n return true\n }\n let tabDisposer: (() => void) | null = null\n try {\n tabDisposer = service.registerTab({\n id: SIDE_TAB_ID,\n title: SIDE_TAB_TITLE,\n icon: codeIcon,\n single: true,\n badge: (_ctx: unknown, scope: { sessionId?: string }) => getSidePending(scope?.sessionId) || null,\n component: renderTab,\n })\n } catch (error) {\n console.warn('[dsh-vscode-mode] 侧边栏 Tab 注册失败(' + String(error) + ')')\n // 注册失败 = 侧栏形态不可用:立即回退中央页签,不接管打开路由\n if (!fallbackInstalled) {\n fallbackInstalled = true\n try { registerLegacyFallback() } catch (inner) { console.warn('[dsh-vscode-mode] 回退注册失败(' + String(inner) + ')') }\n }\n return () => {}\n }\n setEnsureSideEditor(open)\n return () => {\n if (typeof tabDisposer === 'function') tabDisposer()\n setEnsureSideEditor(null)\n }\n}\n\n/**\n * 侧边栏 Tab 图标(内联 SVG 代码括号,不依赖图标包)。\n * @author ddj 2026年08月25号\n * @param size 边长(px)\n * @returns 图标元素\n */\nfunction codeIcon(size: number): unknown {\n return React.createElement('svg', {\n width: size, height: size, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true, focusable: false,\n },\n React.createElement('path', {\n d: 'M5.5 4.5 2.5 8l3 3.5M10.5 4.5 13.5 8l-3 3.5',\n stroke: 'currentColor', strokeWidth: 1.4, strokeLinecap: 'round', strokeLinejoin: 'round',\n }))\n}\n","/**\n * dsh-vscode-mode client — 跨组件/跨 slot 的窗口事件助手。\n * 迁移自原 src/client/index.ts 的 openEditorView 与事件派发,语义不改;\n * 侧边栏形态(sidebarBridge 已注册路由)优先,否则回退 DOM 页签点击。\n * 作者 ddj 2026-08-20\n */\nimport { routeSideEditor } from './sidebarBridge.js'\n\n/**\n * 选择中央「文件编辑」页签(DOM 级,无需 store actions)。仅旧页签形态使用。\n * @author ddj 2026年08月26号\n */\nfunction selectEditorTab(): void {\n const tabs = Array.from(document.querySelectorAll('div[role=\"tablist\"] button[role=\"tab\"]'))\n for (const tab of tabs) {\n if (tab.textContent && tab.textContent.includes('文件编辑')) {\n (tab as HTMLButtonElement).click()\n break\n }\n }\n}\n\n/**\n * 打开「文件编辑」:侧边栏形态路由优先,旧形态回退中央页签。\n * @author ddj 2026年08月26号\n * @param path 要打开的路径(可空)\n */\nexport function openEditorView(path: string | null): void {\n if (routeSideEditor(path ?? null, false)) return\n selectEditorTab()\n const target = path ?? null\n setTimeout(() => {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path: target } }))\n }, 80)\n}\n\n/**\n * 打开文件编辑页并聚焦指定文件的首个差异(侧边栏形态自动展开面板)。\n * @author ddj 2026年08月26号\n * @param path 待聚焦的差异文件路径\n */\nexport function openDiffView(path: string): void {\n if (routeSideEditor(path, true)) return\n selectEditorTab()\n setTimeout(() => {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', {\n detail: { path, focusDiff: true },\n }))\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/**\n * 打开指定路径并定位到行列(LSP 跳转目标)。\n * @author ddj 2026年08月27号\n * @param path 目标路径\n * @param line 目标行(1-based,可空)\n * @param column 目标列(1-based,可空)\n */\nexport function emitOpenAt(path: string, line?: number, column?: number): void {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path, line, column } }))\n}\n\n/**\n * 拉起 DiffLauncher。\n * @author ddj 2026年08月26号\n * @param tab 可选的目标页签\n */\nexport function emitShowLauncher(tab?: 'pending' | 'archive'): void {\n window.dispatchEvent(new CustomEvent('edrv:show-launcher', { detail: { tab } }))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — Monaco 语法分色主题(rich token 配色)。\n * 编辑器原先硬编码 'vs'(内置基础主题),token 分色层次少;\n * 这里定义 edrv-dark / edrv-light 两套完整 token 配色(对齐 VSCode Dark+ 语义分层),\n * 并随 DSH 明暗主题自动切换(跟随文档根 data 主题属性 / prefers-color-scheme)。\n * 作者 ddj 2026-08-28\n */\n\nexport const EDRV_DARK = 'edrv-dark'\nexport const EDRV_LIGHT = 'edrv-light'\nexport const EDRV_FALLBACK = 'vs'\n\n/** 语法分色(语义分层:关键字/字符串/数字/注释/函数/变量/类型/运算符/正则/标签/属性…)。 */\nconst DARK_RULES = [\n { token: '', foreground: 'd4d4d4', background: '1e1e1e' },\n { token: 'comment', foreground: '6a9955', fontStyle: 'italic' },\n { token: 'comment.doc', foreground: '7ca97c', fontStyle: 'italic' },\n { token: 'keyword', foreground: 'c586c0' },\n { token: 'keyword.control', foreground: 'c586c0' },\n { token: 'keyword.operator', foreground: 'd4d4d4' },\n { token: 'keyword.json', foreground: '9cdcfe' },\n { token: 'string', foreground: 'ce9178' },\n { token: 'string.escape', foreground: 'd7ba7d' },\n { token: 'string.key.json', foreground: '9cdcfe' },\n { token: 'string.value.json', foreground: 'ce9178' },\n { token: 'string.yaml', foreground: 'ce9178' },\n { token: 'number', foreground: 'b5cea8' },\n { token: 'number.hex', foreground: 'b5cea8' },\n { token: 'regexp', foreground: 'd16969' },\n { token: 'type', foreground: '4ec9b0' },\n { token: 'type.identifier', foreground: '4ec9b0' },\n { token: 'identifier', foreground: 'd4d4d4' },\n { token: 'variable', foreground: '9cdcfe' },\n { token: 'variable.global', foreground: 'ff6699' },\n { token: 'variable.local', foreground: '9cdcfe' },\n { token: 'variable.mutable', foreground: '9cdcfe' },\n { token: 'variable.predefined', foreground: '4fc1ff' },\n { token: 'variable.parameter', foreground: '00bfae' },\n { token: 'parameter', foreground: '00bfae' },\n { token: 'function', foreground: 'dcdcaa' },\n { token: 'method', foreground: 'dcdcaa' },\n { token: 'property', foreground: '9cdcfe' },\n { token: 'function.identifier', foreground: 'dcdcaa' },\n { token: 'member', foreground: 'dcdcaa' },\n { token: 'constant', foreground: '4fc1ff' },\n { token: 'constant.numeric', foreground: 'b5cea8' },\n { token: 'constant.language', foreground: '569cd6' },\n { token: 'tag', foreground: '569cd6' },\n { token: 'tag.xml', foreground: '569cd6' },\n { token: 'metatag', foreground: '808080' },\n { token: 'attribute.name', foreground: '9cdcfe' },\n { token: 'attribute.value', foreground: 'ce9178' },\n { token: 'delimiter', foreground: 'd4d4d4' },\n { token: 'delimiter.bracket', foreground: 'ffd700' },\n { token: 'delimiter.html', foreground: '808080' },\n { token: 'operator', foreground: 'd4d4d4' },\n { token: 'namespace', foreground: '4ec9b0' },\n { token: 'class', foreground: '4ec9b0' },\n { token: 'interface', foreground: '4ec9b0' },\n { token: 'enum', foreground: '4ec9b0' },\n { token: 'struct', foreground: '4ec9b0' },\n { token: 'annotation', foreground: 'dcdcaa' },\n { token: 'punctuation', foreground: 'd4d4d4' },\n { token: 'invalid', foreground: 'f44747' },\n]\n\nconst LIGHT_RULES = [\n { token: '', foreground: '1e1e1e', background: 'ffffff' },\n { token: 'comment', foreground: '008000', fontStyle: 'italic' },\n { token: 'comment.doc', foreground: '2e7d32', fontStyle: 'italic' },\n { token: 'keyword', foreground: '0000ff' },\n { token: 'keyword.control', foreground: 'af00db' },\n { token: 'keyword.operator', foreground: '1e1e1e' },\n { token: 'keyword.json', foreground: '0451a5' },\n { token: 'string', foreground: 'a31515' },\n { token: 'string.escape', foreground: 'ee0000' },\n { token: 'string.key.json', foreground: '0451a5' },\n { token: 'string.value.json', foreground: 'a31515' },\n { token: 'string.yaml', foreground: 'a31515' },\n { token: 'number', foreground: '098658' },\n { token: 'number.hex', foreground: '098658' },\n { token: 'regexp', foreground: '811f3f' },\n { token: 'type', foreground: '267f99' },\n { token: 'type.identifier', foreground: '267f99' },\n { token: 'identifier', foreground: '1e1e1e' },\n { token: 'variable', foreground: '001080' },\n { token: 'variable.global', foreground: 'c2185b' },\n { token: 'variable.local', foreground: '001080' },\n { token: 'variable.mutable', foreground: '001080' },\n { token: 'variable.predefined', foreground: '001080' },\n { token: 'variable.parameter', foreground: '008577' },\n { token: 'parameter', foreground: '008577' },\n { token: 'function', foreground: '795e26' },\n { token: 'method', foreground: '795e26' },\n { token: 'function.identifier', foreground: '795e26' },\n { token: 'member', foreground: '795e26' },\n { token: 'property', foreground: '001080' },\n { token: 'constant', foreground: '0070c1' },\n { token: 'constant.numeric', foreground: '098658' },\n { token: 'constant.language', foreground: '0000ff' },\n { token: 'tag', foreground: '800000' },\n { token: 'tag.xml', foreground: '800000' },\n { token: 'metatag', foreground: '6b6b6b' },\n { token: 'attribute.name', foreground: 'e50000' },\n { token: 'attribute.value', foreground: '0451a5' },\n { token: 'delimiter', foreground: '1e1e1e' },\n { token: 'delimiter.bracket', foreground: 'b46400' },\n { token: 'delimiter.html', foreground: '800000' },\n { token: 'operator', foreground: '1e1e1e' },\n { token: 'namespace', foreground: '267f99' },\n { token: 'class', foreground: '267f99' },\n { token: 'interface', foreground: '267f99' },\n { token: 'enum', foreground: '267f99' },\n { token: 'struct', foreground: '267f99' },\n { token: 'annotation', foreground: '795e26' },\n { token: 'punctuation', foreground: '1e1e1e' },\n { token: 'invalid', foreground: 'cd3131' },\n]\n\n/** 编辑器 UI 配色(与语法配色同套,保证 gutter/minimap/selection 一致)。 */\nconst DARK_COLORS = {\n 'editor.background': '#1e1e1e',\n 'editor.foreground': '#d4d4d4',\n 'editorLineNumber.foreground': '#6e7681',\n 'editorLineNumber.activeForeground': '#c6c6c6',\n 'editor.selectionBackground': '#264f78',\n 'editor.inactiveSelectionBackground': '#3a3d41',\n 'editor.lineHighlightBackground': '#2a2d2e',\n 'editorCursor.foreground': '#aeafad',\n 'editorIndentGuide.background1': '#404040',\n 'editorIndentGuide.activeBackground1': '#707070',\n 'editorWidget.background': '#252526',\n 'editorHoverWidget.background': '#252526',\n 'editorGutter.background': '#1e1e1e',\n 'minimap.background': '#1e1e1e',\n 'scrollbarSlider.background': '#79797966',\n 'scrollbarSlider.hoverBackground': '#646464b3',\n 'scrollbarSlider.activeBackground': '#bfbfbf66',\n}\n\nconst LIGHT_COLORS = {\n 'editor.background': '#ffffff',\n 'editor.foreground': '#1e1e1e',\n 'editorLineNumber.foreground': '#6c6c6c',\n 'editorLineNumber.activeForeground': '#171184',\n 'editor.selectionBackground': '#add6ff',\n 'editor.inactiveSelectionBackground': '#e5ebf1',\n 'editor.lineHighlightBackground': '#f0f0f0',\n 'editorCursor.foreground': '#000000',\n 'editorIndentGuide.background1': '#d3d3d3',\n 'editorIndentGuide.activeBackground1': '#939393',\n 'editorWidget.background': '#f3f3f3',\n 'editorHoverWidget.background': '#f3f3f3',\n 'editorGutter.background': '#ffffff',\n 'minimap.background': '#ffffff',\n 'scrollbarSlider.background': '#64646466',\n 'scrollbarSlider.hoverBackground': '#646464b3',\n 'scrollbarSlider.activeBackground': '#00000099',\n}\n\n/**\n * 注册 edrv 双套主题(幂等;Monaco 未加载时静默跳过)。\n * @author ddj 2026年08月28号\n * @param monaco Monaco 实例(window.monaco)\n */\nexport function registerThemes(monaco) {\n if (!monaco?.editor?.defineTheme) return\n try {\n monaco.editor.defineTheme(EDRV_DARK, {\n base: 'vs-dark',\n inherit: true,\n rules: DARK_RULES,\n colors: DARK_COLORS,\n })\n monaco.editor.defineTheme(EDRV_LIGHT, {\n base: 'vs',\n inherit: true,\n rules: LIGHT_RULES,\n colors: LIGHT_COLORS,\n })\n } catch (error) {\n /* 主题注册失败保留内置 vs */\n }\n}\n\n/**\n * 探测当前 DSH 明暗(文档根 data 主题属性 → prefers-color-scheme → 暗)。\n * @author ddj 2026年08月28号\n * @returns 'dark' | 'light'\n */\nexport function detectColorScheme() {\n try {\n const attr = document.documentElement?.getAttribute?.('data-theme')\n ?? document.body?.getAttribute?.('data-theme')\n const value = String(attr ?? '').toLowerCase()\n if (value.includes('light') || value.includes('catppuccin-latte')) return 'light'\n if (value.includes('dark') || value.includes('frappe') || value.includes('macchiato') || value.includes('mocha')) return 'dark'\n if (typeof window.matchMedia === 'function') {\n return window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark'\n }\n } catch (error) {\n /* 探测失败回落暗色 */\n }\n return 'dark'\n}\n\n/**\n * 主题名:按当前明暗返回已注册主题(未注册回落 vs)。\n * @author ddj 2026年08月28号\n * @returns 主题 id\n */\nexport function themeNameOf() {\n return detectColorScheme() === 'light' ? EDRV_LIGHT : EDRV_DARK\n}\n\n/**\n * 应用主题到 Monaco(全局切换;新建编辑器也用该主题)。\n * @author ddj 2026年08月28号\n * @param monaco Monaco 实例\n */\nexport function applyTheme(monaco) {\n if (!monaco?.editor?.setTheme) return\n try {\n monaco.editor.setTheme(themeNameOf())\n } catch (error) {\n /* setTheme 失败忽略 */\n }\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 */\nimport { applyTheme, registerThemes } from './theme.js'\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 // 工程/配置文件(拿到正确语法分色,而非 plaintext)\n csproj: 'xml', props: 'xml', targets: 'xml', plist: 'xml',\n lua51: 'lua', luac: 'lua',\n gitattributes: 'ini', editorconfig: 'ini', env: 'ini', properties: 'ini',\n json5: 'jsonc', log: 'plaintext', txt: 'plaintext',\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 // 分色主题注册 + 应用(rich token 配色,替掉内置基础 vs 的少层次着色)\n try {\n registerThemes(window.monaco)\n applyTheme(window.monaco)\n } catch (error) { /* 主题失败不阻塞编辑器 */ }\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 /** 上次已渲染的差异指纹(callId:idx@start-end:oldLen/newLen 串):内容未变时跳过重建。 */\n let lastKey = null\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 // 空渲染且无残留(5s 轮询 setRecords 常触发):无需清理时直接跳过,\n // 不打 begin 日志、不做无谓 DOM 操作;有 zone/decoration 残留时仍需走清理。\n if (!pendingRegions.length && viewZoneIds.length === 0 && decorations.length === 0) return\n const renderT0 = Date.now()\n const callIdAttr = (callId, idx) => String(callId) + ':' + String(idx)\n // 指纹相同 = 内容未变(轮询/引用空转/重复点击触发的重渲染):残留 DOM 已在位,\n // 直接跳过整轮重建(view zones 拆建 / overlay DOM / 50ms 校正),消除同区域重复渲染成本。\n const key = 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 if (key === lastKey) return\n lastKey = key\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","/**\n * dsh-vscode-mode shared — 快捷键命令目录与默认键位(双面契约)。\n * 纯数据模块:host(settings schema 默认值)与 client(执行匹配/设置页)共用。\n * 键位格式:修饰符 + 主键,`+` 连接,如 `Ctrl+Shift+F`;空串 = 未绑定。\n * 作者 ddj 2026年08月26号\n */\n\n/** 命令 id → 默认键位。命令目录以此为准,新增命令只需加一项。 */\nexport const KEYBINDING_DEFAULTS: Record<string, string> = {\n 'edrv.save': 'Ctrl+S',\n 'edrv.quickOpen': 'Ctrl+P',\n 'edrv.toggleSidebar': 'Ctrl+B',\n 'edrv.searchInFiles': 'Ctrl+Shift+F',\n}\n\n/**\n * 返回默认键位的独立副本(调用方修改不污染目录)。\n * @author ddj 2026年08月26号\n * @returns 默认键位映射\n */\nexport function defaultKeybindings(): Record<string, string> {\n return { ...KEYBINDING_DEFAULTS }\n}\n\n/**\n * 规整外部键位数据:只保留已知命令 id 且为字符串的值,未知 id 丢弃。\n * 防止用户文档/旧版本写入的未知命令污染执行匹配。\n * @author ddj 2026年08月26号\n * @param raw 原始设置值\n * @returns 规整后的键位映射(缺省项不补默认值,由调用方按需合并)\n */\nexport function normalizeKeybindings(raw: unknown): Record<string, string> {\n const out: Record<string, string> = {}\n if (!raw || typeof raw !== 'object') return out\n for (const [id, chord] of Object.entries(raw as Record<string, unknown>)) {\n if (id in KEYBINDING_DEFAULTS && typeof chord === 'string') out[id] = chord\n }\n return out\n}\n","/**\n * dsh-vscode-mode client — 快捷键配置模块(解析/匹配/状态同步)。\n * 纯逻辑(parseChord/formatChord/matchEvent/chordFromEvent/normalizeKey)不依赖 DOM,可单测;\n * 模块状态由 settings 订阅驱动(client/index.ts 调 keybindingsApply)。\n * 键位语义:Ctrl 与 Cmd 互认(延续现有 Ctrl+P/Ctrl+B 捕获行为)。\n * 作者 ddj 2026年08月26号\n */\nimport React from 'react'\nimport { KEYBINDING_DEFAULTS, normalizeKeybindings } from '../shared/keybindings.js'\n\n/** 解析后的键位(修饰符 + 规范化主键)。 */\nexport interface Binding {\n ctrl: boolean\n shift: boolean\n alt: boolean\n meta: boolean\n key: string\n}\n\n/** 命令目录(设置页展示标签;执行按目录序先匹配先执行,冲突键位确定性)。 */\nexport const COMMANDS: Array<{ id: string; label: string }> = [\n { id: 'edrv.save', label: '保存文件' },\n { id: 'edrv.quickOpen', label: '快速打开文件' },\n { id: 'edrv.toggleSidebar', label: '切换侧边栏' },\n { id: 'edrv.searchInFiles', label: '在工作区中搜索' },\n]\n\nconst MODIFIERS: Record<string, 'ctrl' | 'shift' | 'alt' | 'meta'> = {\n ctrl: 'ctrl', cmd: 'meta', meta: 'meta', shift: 'shift', alt: 'alt',\n}\n\nlet current: Record<string, string> = { ...KEYBINDING_DEFAULTS }\nlet parsed: Record<string, Binding | null> = {}\nconst listeners = new Set<() => void>()\n\n/**\n * 应用设置快照(与默认值合并;未知 id 丢弃;空对象 = 全部默认)。\n * @author ddj 2026年08月26号\n * @param raw 设置 scope 的 keybindings 字段\n */\nexport function keybindingsApply(raw: unknown): void {\n current = { ...KEYBINDING_DEFAULTS, ...normalizeKeybindings(raw) }\n parsed = {}\n for (const id of Object.keys(current)) parsed[id] = parseChord(current[id])\n for (const listener of listeners) {\n try { listener() } catch { /* 监听器异常不影响其他订阅 */ }\n }\n}\n\n/**\n * 订阅键位配置变化。\n * @author ddj 2026年08月26号\n * @param listener 变化回调\n * @returns 取消订阅函数\n */\nexport function subscribeKeybindings(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n}\n\n/**\n * 当前键位弦(未绑定/空 → null)。\n * @author ddj 2026年08月26号\n * @param id 命令 id\n * @returns 键位弦或 null\n */\nexport function chordOf(id: string): string | null {\n const chord = current[id]\n return typeof chord === 'string' && chord.trim() !== '' ? chord : null\n}\n\n/**\n * 当前命令的解析键位(未绑定/非法 → null)。\n * @author ddj 2026年08月26号\n * @param id 命令 id\n * @returns 解析键位或 null\n */\nexport function bindingOf(id: string): Binding | null {\n return parsed[id] ?? null\n}\n\n/**\n * 主键规范化:小写字母大写、空格归一为 Space,其余原样(与事件 e.key 对照)。\n * @author ddj 2026年08月26号\n * @param key 事件主键\n * @returns 规范化主键\n */\nexport function normalizeKey(key: string): string {\n const value = String(key ?? '')\n if (value === ' ') return 'Space'\n if (value.length === 1 && value >= 'a' && value <= 'z') return value.toUpperCase()\n return value\n}\n\n/**\n * 解析键位弦(如 `Ctrl+Shift+F`;纯修饰键/重复主键/空 → null)。\n * @author ddj 2026年08月26号\n * @param chord 键位弦\n * @returns 解析键位或 null\n */\nexport function parseChord(chord: string): Binding | null {\n const parts = String(chord ?? '').split('+').map((part) => part.trim()).filter(Boolean)\n if (!parts.length) return null\n const binding: Binding = { ctrl: false, shift: false, alt: false, meta: false, key: '' }\n for (const part of parts) {\n const modifier = MODIFIERS[part.toLocaleLowerCase('en-US')]\n if (modifier) {\n binding[modifier] = true\n continue\n }\n if (binding.key) return null\n binding.key = normalizeKey(part)\n }\n return binding.key ? binding : null\n}\n\n/**\n * 格式化键位(Ctrl/Cmd/Shift/Alt + 主键;meta 显示 Cmd)。\n * @author ddj 2026年08月26号\n * @param binding 解析键位\n * @returns 键位弦\n */\nexport function formatChord(binding: Binding): string {\n const parts: string[] = []\n if (binding.ctrl) parts.push('Ctrl')\n if (binding.meta) parts.push('Cmd')\n if (binding.shift) parts.push('Shift')\n if (binding.alt) parts.push('Alt')\n parts.push(binding.key)\n return parts.join('+')\n}\n\n/**\n * 事件是否命中键位(Ctrl 与 Cmd 互认)。\n * @author ddj 2026年08月26号\n * @param e 键盘事件(鸭子类型,便于单测)\n * @param binding 解析键位(null = 未绑定,永不命中)\n * @returns 是否命中\n */\nexport function matchEvent(e: { ctrlKey?: boolean; metaKey?: boolean; shiftKey?: boolean; altKey?: boolean; key?: string }, binding: Binding | null): boolean {\n if (!binding) return false\n if ((e.ctrlKey || e.metaKey) !== (binding.ctrl || binding.meta)) return false\n if (Boolean(e.shiftKey) !== binding.shift) return false\n if (Boolean(e.altKey) !== binding.alt) return false\n return normalizeKey(e.key ?? '') === binding.key\n}\n\n/**\n * 从键盘事件构造键位弦(纯修饰键 → null,供设置页录制)。\n * @author ddj 2026年08月26号\n * @param e 键盘事件\n * @returns 键位弦或 null\n */\nexport function chordFromEvent(e: { ctrlKey?: boolean; metaKey?: boolean; shiftKey?: boolean; altKey?: boolean; key?: string }): string | null {\n const key = normalizeKey(e.key ?? '')\n if (!key || key === 'Control' || key === 'Shift' || key === 'Alt' || key === 'Meta') return null\n return formatChord({ ctrl: Boolean(e.ctrlKey), shift: Boolean(e.shiftKey), alt: Boolean(e.altKey), meta: Boolean(e.metaKey), key })\n}\n\n/**\n * 键位版本 hook:配置变化时返回新版本(tooltip/占位文案随键位刷新)。\n * @author ddj 2026年08月26号\n * @returns 当前版本号\n */\nexport function useKeybindingsVersion(): number {\n const [version, setVersion] = React.useState(0)\n React.useEffect(() => subscribeKeybindings(() => setVersion((v) => v + 1)), [])\n return version\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — QuickOpen:顶部搜索框(Ctrl+P 打开文件)。\n * 快捷键随配置(edrv.quickOpen),占位文案同步当前键位。\n * 迁移自原 src/client/index.ts 的 QuickOpen,语义不改。\n * 作者 ddj 2026-08-20 / 2026-08-26\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { bindingOf, chordOf, matchEvent, useKeybindingsVersion } from '../keybindings.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 useKeybindingsVersion() // 键位变化时刷新占位文案\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 (matchEvent(e, bindingOf('edrv.quickOpen'))) {\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: '搜索文件 (' + (chordOf('edrv.quickOpen') ?? '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 — 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 — 侧边栏容器(活动栏 + 面板区 + 拖拽调宽)。\n * 面板列表来自注册表(活动栏图标/徽标/激活态),渲染当前激活面板的 render(ctx);\n * 右侧手柄拖拽调宽(clamp 180–560),底部按钮收起侧边栏。\n * 作者 ddj 2026-08-26\n */\nimport React from 'react'\nimport type { SidebarCtx } from './types.js'\n\nconst W_MIN = 180\nconst W_MAX = 560\n\n/**\n * 侧边栏容器。\n * @param props.registry 面板注册表(list() 提供面板顺序)\n * @param props.ctx 面板共享上下文\n * @param props.activePanel 当前激活面板 id\n * @param props.onActive 激活面板变化回调\n * @param props.width 面板区宽度\n * @param props.onWidth 宽度变化回调\n * @param props.onHide 收起侧边栏回调\n */\nexport function SidebarView(props) {\n const panels = props.registry?.list?.() ?? []\n const ctx = props.ctx\n const activePanel = props.activePanel\n const onActive = props.onActive\n const width = props.width\n const onWidth = props.onWidth\n const onHide = props.onHide\n\n const active = panels.find((p) => p.id === activePanel) || panels[0]\n\n const onPointerDown = (e) => {\n e.preventDefault()\n const startX = e.clientX\n const startW = width\n const onMove = (ev) => {\n const w = Math.max(W_MIN, Math.min(W_MAX, startW + (ev.clientX - startX)))\n onWidth(w)\n }\n const onUp = () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n }\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n }\n\n const rail = React.createElement('div', { className: 'edrv-rail' },\n React.createElement('div', { style: { flex: 1, display: 'flex', flexDirection: 'column', gap: 2 } },\n panels.map((p) => {\n const count = typeof p.badge === 'function' ? p.badge(ctx) : null\n return React.createElement('button', {\n key: p.id,\n className: 'edrv-rail-btn' + (active && p.id === active.id ? ' edrv-rail-on' : ''),\n title: p.title,\n onClick: () => onActive(p.id),\n },\n React.createElement('span', { className: 'edrv-rail-icon' }, p.icon),\n count > 0\n ? React.createElement('span', { className: 'edrv-rail-badge' }, String(count))\n : null)\n })),\n React.createElement('button', { className: 'edrv-rail-btn', title: '隐藏侧边栏 (Ctrl+B)', onClick: onHide }, '◀'))\n\n return React.createElement('div', { className: 'edrv-sidebar', style: { width } },\n rail,\n React.createElement('div', { className: 'edrv-side-body' },\n active ? active.render(ctx) : null),\n React.createElement('div', { className: 'edrv-side-resize', onPointerDown: onPointerDown }))\n}\n","/**\n * dsh-vscode-mode client — 会话级差异 dock store。\n * EditorView 发布当前编辑上下文,conversation.input.dock 唯一读取并渲染。\n * 作者 ddj 2026年08月26号\n */\n\n/** 差异 dock 的显示形态。 */\nexport type DiffDockMode = 'chat' | 'editor' | 'editor-empty'\n\n/**\n * 跨 slot 传递的差异 dock 快照。\n * 操作回调随快照一起更新,避免 dock 持有已卸载编辑器的旧闭包。\n */\nexport interface DiffDockSnapshot {\n mode: DiffDockMode\n [key: string]: unknown\n}\n\ntype DiffDockListener = () => void\ntype DiffDockSource = object\n\nconst values = new Map<string, DiffDockSnapshot>()\nconst sources = new Map<string, DiffDockSource>()\nconst listeners = new Map<string, Set<DiffDockListener>>()\n\n/** 通知指定会话的 dock 订阅者。 */\nfunction notifyDiff(sessionId: string): void {\n for (const listener of listeners.get(sessionId) ?? []) listener()\n}\n\n/**\n * 发布指定会话的最新编辑器差异上下文。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @param snapshot 完整 DiffBox 操作上下文\n * @param source 发布者令牌,用于卸载时防止误清理新实例\n */\nexport function publishDiffDock(sessionId: string, snapshot: DiffDockSnapshot, source?: DiffDockSource): void {\n values.set(sessionId, snapshot)\n if (source) sources.set(sessionId, source)\n else sources.delete(sessionId)\n notifyDiff(sessionId)\n}\n\n/**\n * 清除指定会话的差异上下文。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @param source 可选发布者令牌;不匹配时忽略清理\n */\nexport function clearDiffDock(sessionId: string, source?: DiffDockSource): void {\n if (source && sources.get(sessionId) !== source) return\n values.delete(sessionId)\n sources.delete(sessionId)\n notifyDiff(sessionId)\n}\n\n/**\n * 读取指定会话的最新上下文。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @returns 最新上下文或 null\n */\nexport function readDiffDock(sessionId?: string): DiffDockSnapshot | null {\n if (!sessionId) return null\n return values.get(sessionId) ?? null\n}\n\n/**\n * 订阅指定会话的上下文变化。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @param listener 变化回调\n * @returns 取消订阅函数\n */\nexport function subscribeDiffDock(sessionId: string, listener: DiffDockListener): () => void {\n let bucket = listeners.get(sessionId)\n if (!bucket) {\n bucket = new Set()\n listeners.set(sessionId, bucket)\n }\n bucket.add(listener)\n return () => {\n bucket!.delete(listener)\n if (!bucket!.size) listeners.delete(sessionId)\n }\n}\n","/**\n * dsh-vscode-mode client — 对话差异 dock 纯函数。\n * 只负责差异文件轮转和文案,状态查询仍由组件复用现有 edrv.list/summarize。\n * 作者 ddj 2026-08-26\n */\n\n/**\n * 从稳定差异文件列表中取下一个路径,并返回下一次索引。\n * @author ddj 2026年08月26号\n * @param paths 待处理差异文件路径\n * @param index 当前轮转索引\n * @returns 下一个路径与归一化后的下一索引\n */\nexport function nextDiffPath(paths: string[], index: number): { path: string | null; index: number } {\n if (!paths.length) return { path: null, index: 0 }\n const current = Number.isFinite(index) ? Math.max(0, Math.floor(index)) : 0\n const at = current % paths.length\n return { path: paths[at] ?? null, index: (at + 1) % paths.length }\n}\n\n/**\n * 生成对话差异 dock 的单按钮文案。\n * @author ddj 2026年08月26号\n * @param count 待处理差异文件数量\n * @returns 展示文案\n */\nexport function diffDockText(count: number): string {\n return '差异 ' + Math.max(0, Math.floor(count)) + ' 个文件 · 查看下一个'\n}\n\n/**\n * 根据活动文件决定编辑页 dock 形态,加载期间保持 editor 结构稳定。\n * @author ddj 2026年08月26号\n * @param activePath 当前活动文件路径\n * @returns 编辑态或无文件空态\n */\nexport function editorDockMode(activePath: string | null | undefined): 'editor' | 'editor-empty' {\n return activePath ? 'editor' : 'editor-empty'\n}\n\n/**\n * 获取切换文件期间稳定展示的文件内差异数量。\n * @author ddj 2026年08月26号\n * @param ready 当前文件内容是否已加载完成\n * @param actualTotal 内容就绪后的精确差异数\n * @param fallbackTotal 内容加载期间的文件摘要差异数\n * @returns 非负整数差异数\n */\nexport function displayDiffTotal(ready: boolean, actualTotal: number, fallbackTotal: number): number {\n const value = ready ? actualTotal : fallbackTotal\n return Number.isFinite(value) ? Math.max(0, Math.floor(value)) : 0\n}\n","/**\n * dsh-vscode-mode client — 编辑区与原生 composer 的几何边界计算。\n * @author ddj 2026年08月26号\n */\n\n/**\n * 计算编辑根节点在当前会话滚动区内、composer 上方可使用的高度。\n * @author ddj 2026年08月26号\n * @param rootTop 编辑根节点顶边\n * @param scrollBottom 会话滚动区可视底边\n * @param composerTop composer 顶边;缺失时回退滚动区底边\n * @returns 非负可用高度\n */\nexport function editorHeight(rootTop: number, scrollBottom: number, composerTop?: number): number {\n const root = Number.isFinite(rootTop) ? rootTop : 0\n const scroll = Number.isFinite(scrollBottom) ? scrollBottom : root\n const composer = Number.isFinite(composerTop) ? composerTop as number : scroll\n return Math.max(0, Math.min(scroll, composer) - root)\n}\n","/**\n * dsh-vscode-mode client — 「在文件浏览器中打开」RPC 包装(树菜单与 Monaco 右键共用)。\n * 归一化为 { ok, error? },不抛异常;无会话/异常降级返回错误文案。\n * 作者 ddj 2026-08-27\n */\nimport { rpc } from './rpc.js'\n\nexport interface RevealOutcome {\n ok: boolean\n error?: string\n}\n\n/**\n * 请求 host 在 OS 文件浏览器中打开/定位路径。\n * @author ddj 2026年08月27号\n * @param sessionId 会话 id(可空)\n * @param path 工作区相对路径('' = 根目录)\n * @returns 成功或失败原因\n */\nexport async function revealInExplorer(sessionId: string | undefined, path: string): Promise<RevealOutcome> {\n if (!sessionId) return { ok: false, error: '无活动会话' }\n try {\n const res = await rpc('edrv.revealInExplorer', { sessionId, path })\n return res.ok ? { ok: true } : { ok: false, error: res.error }\n } catch (error) {\n return { ok: false, error: '打开异常:' + String(error) }\n }\n}\n","/**\n * dsh-vscode-mode client — 浏览器端缓存键/路径统一出口(PathConst)。\n * 统一 localStorage 键前缀(各缓存模块/编辑区/搜索面板共用),避免内联散落;\n * 键带 schema 版本号,未来版本递增时经 sweepLegacyKeys 自动清旧。\n * 浏览器不涉 ~/.dsh 文件系统,这里只管键名 + shared 路由常量。\n * 作者 ddj 2026-09-01\n */\n\n/** localStorage 键前缀表(按功能隔离;均按会话拼接)。 */\nexport const CACHE_KEY = {\n /** 展开状态(explorerCache v1,当前使用)。 */\n expanded: 'edrv.cache.explorer.v1.',\n /** 目录条目 SWR 缓存(explorerEntriesCache v2,当前使用)。 */\n entries: 'edrv.cache.entries.v2.',\n /** 编辑区视图状态(viewStateCache v1)。 */\n viewstate: 'edrv.cache.viewstate.v1.',\n /** 编辑器页签/活动文件(EditorView v2)。 */\n editor: 'edrv.editor.v2.',\n /** 侧边栏状态(EditorView;按布局 side/central 追加段)。 */\n sidebar: 'edrv.sidebar.',\n /** 搜索面板条件(SearchPanel v1)。 */\n search: 'edrv.search.v1.',\n /** 侧边栏提示已关闭标记(全局,无会话)。 */\n sideHint: 'edrv.side-hint-dismissed',\n /** 「性能优化」页工作区栏目展开状态(workspaceFoldCache v1,全局不按会话)。 */\n workspaceFold: 'edrv.ws-fold.v1.',\n} as const\n\n/** 按前缀拼会话键(侧边栏/编辑器等需要布局段时自行拼接后传入)。 */\nexport function cacheKey(prefix: string, sessionId: string): string {\n return prefix + sessionId\n}\n\n/** 旧版本键清理入口:未来前缀版本递增时在此登记旧前缀并清空(当前无实际旧键)。 */\nexport function sweepLegacyKeys(): void {\n // 例:entries v2 取代 v1 时 → localStorage.removeItem('edrv.cache.entries.v1.' + sid)\n // 当前各功能均为现役版本,无待清旧键。\n}\n","/**\n * dsh-vscode-mode client — 编辑器视图状态持久化(纯函数,可单测)。\n * 对齐 VSCode workbench.editor.restoreViewState:恢复每个文件的光标/滚动/折叠位置。\n * 视图状态 = Monaco editor.saveViewState() 返回值(JSON 可序列化),按 path 存储。\n * 键前缀统一走 paths.ts PathConst(CACHE_KEY.viewstate)。\n * 作者 ddj 2026-08-28\n */\nimport { CACHE_KEY } from '../paths.js'\n\n/** localStorage 键前缀(按会话隔离)。 */\nconst KEY_PREFIX = CACHE_KEY.viewstate\n\n/** 视图状态条目容量上限。 */\nexport const VIEWSTATE_CAP = 50\n\n/** 视图状态序列化体积上限(单条目,防止超大选区/折叠数据撑爆配额)。 */\nexport const VIEWSTATE_BYTES_CAP = 64 * 1024\n\n/**\n * 判断对象是否为合法的 Monaco view state(保守形状校验,非深校验)。\n * @author ddj 2026年08月28号\n * @param value 待校验对象\n * @returns 是否可接受\n */\nexport function isViewStateLike(value: unknown): boolean {\n if (!value || typeof value !== 'object') return false\n const v = value as Record<string, unknown>\n // 至少含光标状态与视口滚动信息之一;无内容时拒绝(空对象无恢复价值)\n return Array.isArray(v.cursorState) || typeof v.viewState === 'object'\n || Array.isArray(v.contributionsState)\n}\n\n/**\n * 序列化视图状态映射(path → viewState)。\n * @author ddj 2026年08月28号\n * @param states path → viewState 映射\n * @returns JSON 字符串\n */\nexport function serializeViewStates(states: Record<string, unknown>): string {\n return JSON.stringify({ v: 1, states })\n}\n\n/**\n * 解析视图状态文本;损坏/格式不符 → null。\n * @author ddj 2026年08月28号\n * @param text localStorage 原文\n * @returns path → viewState 映射,非法返回 null\n */\nexport function parseViewStates(text: string | null): Record<string, unknown> | null {\n if (!text) return null\n try {\n const data = JSON.parse(text)\n if (!data || typeof data !== 'object') return null\n const states = (data as Record<string, unknown>).states\n if (!states || typeof states !== 'object' || Array.isArray(states)) return null\n const out: Record<string, unknown> = {}\n for (const [path, state] of Object.entries(states)) {\n if (typeof path !== 'string' || !path) continue\n if (!isViewStateLike(state)) continue\n out[path] = state\n }\n return out\n } catch (error) {\n return null\n }\n}\n\n/**\n * 把新视图状态并入既有映射:同 path 覆盖、按写入顺序裁剪到容量上限。\n * @author ddj 2026年08月28号\n * @param states 既有映射\n * @param path 文件路径\n * @param state 视图状态\n * @returns 新映射(容量裁剪后)\n */\nexport function upsertViewState(\n states: Record<string, unknown>,\n path: string,\n state: unknown,\n): Record<string, unknown> {\n if (!path || !isViewStateLike(state)) return states\n try {\n if (JSON.stringify(state).length > VIEWSTATE_BYTES_CAP) return states\n } catch (error) {\n return states\n }\n const next = Object.assign({}, states)\n delete next[path] // 先删后加,保证该 path 排到最末(近似 LRU:最新写入)\n next[path] = state\n const keys = Object.keys(next)\n if (keys.length > VIEWSTATE_CAP) {\n for (const k of keys.slice(0, keys.length - VIEWSTATE_CAP)) delete next[k]\n }\n return next\n}\n\n/**\n * 读取某会话的视图状态缓存(localStorage 不可用 → 空映射)。\n * @author ddj 2026年08月28号\n * @param sessionId 会话 id\n * @returns path → viewState 映射\n */\nexport function viewStatesLoad(sessionId: string): Record<string, unknown> {\n try {\n return parseViewStates(window.localStorage.getItem(KEY_PREFIX + String(sessionId))) ?? {}\n } catch (error) {\n return {}\n }\n}\n\n/**\n * 写入某会话的视图状态缓存(损坏/配额满 → 忽略)。\n * @author ddj 2026年08月28号\n * @param sessionId 会话 id\n * @param states path → viewState 映射\n */\nexport function viewStatesSave(sessionId: string, states: Record<string, unknown>): void {\n try {\n window.localStorage.setItem(KEY_PREFIX + String(sessionId), serializeViewStates(states))\n } catch (error) { /* 配额满/隐私模式忽略 */ }\n}\n","/**\n * dsh-vscode-mode shared — 语言服务器 RPC 契约(双面,禁 node/react)。\n * LSP 请求/响应的 JSON 载荷形状 + 纯函数辅助(Monaco↔LSP 坐标换算等)。\n * 只描述\"过 RPC 的载荷\",宿主与语言服务器之间的帧级交互在 host 侧 src/lsp/ 内。\n * 作者 ddj 2026-08-27\n */\n\n/** LSP Position(0-based:line 行号从 0,character UTF-16 列从 0)。 */\nexport interface LspPosition {\n line: number\n character: number\n}\n\n/** LSP Range(start/end 均 0-based,包含 start、排除 end)。 */\nexport interface LspRange {\n start: LspPosition\n end: LspPosition\n}\n\n/** LSP Location:uri 为 file:// 绝对路径;root 用于还原为工作区相对路径。 */\nexport interface LspLocation {\n uri: string\n range: LspRange\n root?: string\n}\n\n/** 跳转结果(definition 常返回 LocationLink,归一化为 targetUri + targetRange + 可选 originSelectionRange)。 */\nexport interface LspLocationLink {\n targetUri: string\n targetRange: LspRange\n targetSelectionRange: LspRange\n originSelectionRange?: LspRange\n}\n\n/** 归一化后的符号(documentSymbol/workspaceSymbol 统一形状)。kind 为 LSP SymbolKind 数值。 */\nexport interface LspSymbol {\n name: string\n kind: number\n range: LspRange\n selectionRange: LspRange\n detail?: string\n containerName?: string\n children?: LspSymbol[]\n}\n\n/** hover 内容(markdown/纯文本行数组)。 */\nexport interface LspHover {\n contents: string[]\n range?: LspRange\n}\n\n/** LSP semantic token 标准类型(host 归一化后,client 与 Monaco 共用)。 */\nexport const LSP_SEMANTIC_TOKEN_TYPES = [\n 'namespace', 'type', 'class', 'enum', 'interface', 'struct', 'typeParameter',\n 'parameter', 'variable', 'property', 'enumMember', 'event', 'function', 'method',\n 'macro', 'label', 'comment', 'string', 'keyword', 'number', 'regexp', 'operator',\n 'decorator',\n] as const\n\n/** LSP semantic token 标准修饰符(host 归一化后,client 与 Monaco 共用)。 */\nexport const LSP_SEMANTIC_TOKEN_MODIFIERS = [\n 'declaration', 'definition', 'readonly', 'static', 'deprecated', 'abstract',\n 'async', 'modification', 'documentation', 'defaultLibrary', 'global', 'local', 'mutable',\n] as const\n\n/** 归一化后的 LSP semanticTokens/full 结果(data 使用 LSP delta 编码)。 */\nexport interface LspSemanticTokens {\n data: number[]\n resultId?: string\n}\n\n/** LSP 服务器能力子集:本插件会用到的方法。 */\nexport interface LspServerCapabilities {\n definition: boolean\n references: boolean\n documentSymbol: boolean\n workspaceSymbol: boolean\n hover: boolean\n semanticTokens: boolean\n semanticTokenTypes?: string[]\n semanticTokenModifiers?: string[]\n}\n\n/** 服务器进程/会话状态。 */\nexport type LspServerPhase =\n | 'idle' // 未启动(惰性)\n | 'starting' // 启动中(initialize 握手)\n | 'ready' // 就绪\n | 'indexing' // 工作区索引中\n | 'unavailable' // 连续失败,停止自动重启\n | 'stopped' // 已停止(禁用/卸载/会话结束)\n\n/** 单语言服务器状态(edrv.lsp.status 载荷元素)。 */\nexport interface LspServerStatus {\n languageId: string\n source: 'extension' | 'discover' | 'manual' | 'none'\n phase: LspServerPhase\n version?: string\n reason?: string // unavailable/不可用原因(缺 dotnet、找不到服务器等)\n progress?: number // LSP 工作区解析进度(0–100,未知时省略)\n progressMessage?: string\n root?: string // 绑定工作区根(相对显示)\n providerName?: string // provider 名称(如 EmmyLua / LuaLS)\n}\n\n/**\n * Monaco 位置(1-based lineNumber/column)→ LSP Position(0-based)。\n * @author ddj 2026年08月27号\n * @param lineNumber Monaco 行(≥1)\n * @param column Monaco 列(≥1)\n * @returns LSP 0-based position\n */\nexport function monoToLsp(lineNumber: number, column: number): LspPosition {\n return { line: Math.max(0, lineNumber - 1), character: Math.max(0, column - 1) }\n}\n\n/**\n * LSP Position(0-based)→ Monaco 位置(1-based)。\n * @author ddj 2026年08月27号\n * @param pos LSP position\n * @returns { lineNumber, column }(均 ≥1)\n */\nexport function lspToMono(pos: LspPosition): { lineNumber: number; column: number } {\n return { lineNumber: Math.max(1, pos.line + 1), column: Math.max(1, pos.character + 1) }\n}\n\n/** file:// URI → 路径(仅做规范化解码;Windows file:///C:/... 保留)。 */\nexport function fileUriToPath(uri: string): string {\n if (!uri) return ''\n const rest = uri.replace(/^file:\\/\\//, '')\n const decoded = decodeURIComponent(rest)\n return decoded.replace(/^\\/([A-Za-z]:)/, '$1') // file:///C:/x → C:/x\n}\n\n/** 已装扩展信息(edrv.lsp.ext.list 载荷元素)。 */\nexport interface LspExtInfo {\n id: string // publisher.name\n namespace: string\n name: string\n version: string\n displayName?: string\n description?: string\n}\n\n/** Open VSX 市场搜索结果项(edrv.lsp.ext.market 载荷元素)。 */\nexport interface LspMarketItem {\n namespace: string\n name: string\n id: string\n version: string\n displayName?: string\n description?: string\n download?: string\n}\n\n/** 有更新的已装扩展(edrv.lsp.ext.updates 载荷元素)。 */\nexport interface LspExtUpdate {\n id: string\n current: string\n latest: string\n displayName?: string\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — LSP 会话与文档同步(模块级单例)。\n * 跟踪当前会话 + Monaco 打开文档(model 事件驱动),去抖推送 edrv.lsp.sync;\n * 并提供 definition/references/documentSymbol/hover/status 的 RPC 薄封装。\n * 作者 ddj 2026-08-27\n */\nimport { rpc } from '../../rpc.js'\nimport { monoToLsp } from '../../../shared/lsp.js'\n\n/** edrv:// 模型 URI → 工作区相对/绝对路径(与 host 侧 path 对齐)。 */\nexport function pathOfModel(model) {\n if (!model || !model.uri) return null\n const uri = model.uri\n if (uri.scheme !== 'edrv') return null\n const raw = uri.path ?? ''\n try {\n const decoded = decodeURIComponent(String(raw).replace(/^\\//, ''))\n return decoded || null\n } catch (error) {\n return String(raw).replace(/^\\//, '') || null\n }\n}\n\nconst SYNC_DEBOUNCE_MS = 250\n\nlet sessionId\nconst syncTimers = new Map()\nlet statusCache = { servers: [], at: 0 }\nlet progressListeners = new Set()\nlet ready = false\n\n/** 设置当前会话(切换会话时清理旧文档跟踪由 host 端 session/disposed 兜底)。 */\nexport function setLspSession(id) {\n if (sessionId === id) return\n sessionId = id\n void refreshStatus()\n}\n\nexport function lspSessionId() {\n return sessionId\n}\n\n/** 订阅 LSP 状态变化(服务器进度/启动状态)。 */\nexport function onLspProgress(listener) {\n if (typeof listener !== 'function') return () => {}\n progressListeners.add(listener)\n return () => progressListeners.delete(listener)\n}\n\n/** 发布当前 server 状态给编辑器底部状态区。 */\nfunction publishProgress() {\n for (const listener of progressListeners) {\n try { listener(statusCache.servers) } catch (error) { /* UI listener failure ignored */ }\n }\n}\n\n/** 立即同步某文档到 host(首次打开/查询前保证服务器已认识该文档)。 */\nexport async function syncDoc(path, text, immediate = false) {\n if (!path || typeof text !== 'string') return\n if (immediate) {\n clearPending(path)\n await rpc('edrv.lsp.sync', { sessionId, path, text, version: Date.now() }).catch(() => {})\n return\n }\n clearPending(path)\n syncTimers.set(path, setTimeout(() => {\n syncTimers.delete(path)\n rpc('edrv.lsp.sync', { sessionId, path, text, version: Date.now() }).catch(() => {})\n }, SYNC_DEBOUNCE_MS))\n}\n\nfunction clearPending(path) {\n const timer = syncTimers.get(path)\n if (timer) { clearTimeout(timer); syncTimers.delete(path) }\n}\n\n/** 文档关闭:停止去抖并通知 host。 */\nexport function closeDoc(path) {\n clearPending(path)\n void rpc('edrv.lsp.close', { sessionId, path }).catch(() => {})\n}\n\n/** 立即推送 + 查询定义;返回 [{ uri, range }](uri 已转 edrv://)。 */\nexport async function findDefinition(path, text, position) {\n await syncDoc(path, text, true)\n const res = await rpc('edrv.lsp.definition', { sessionId, path, position: monoToLsp(position.lineNumber, position.column) }).catch(() => null)\n if (!res || !res.ok || !Array.isArray(res.locations)) return []\n return res.locations.map(toClientLocation)\n}\n\n/** 立即推送 + 查询引用。 */\nexport async function findReferences(path, text, position, includeDeclaration = false) {\n await syncDoc(path, text, true)\n const res = await rpc('edrv.lsp.references', { sessionId, path, position: monoToLsp(position.lineNumber, position.column), includeDeclaration }).catch(() => null)\n if (!res || !res.ok || !Array.isArray(res.locations)) return []\n return res.locations.map(toClientLocation)\n}\n\n/** 查询大纲符号(documentSymbol)。 */\nexport async function fetchDocumentSymbols(path, text) {\n await syncDoc(path, text, true)\n const res = await rpc('edrv.lsp.documentSymbol', { sessionId, path }).catch(() => null)\n if (!res || !res.ok || !Array.isArray(res.symbols)) return []\n return res.symbols\n}\n\n/** 查询 hover 内容。 */\nexport async function fetchHover(path, text, position) {\n await syncDoc(path, text, true)\n const res = await rpc('edrv.lsp.hover', { sessionId, path, position: monoToLsp(position.lineNumber, position.column) }).catch(() => null)\n if (!res || !res.ok) return null\n return res.hover || null\n}\n\n/** 查询当前文档的 semantic tokens(host 已归一化 legend 与 delta data)。 */\nexport async function fetchSemanticTokens(path, text) {\n await syncDoc(path, text, true)\n const res = await rpc('edrv.lsp.semanticTokens', { sessionId, path }).catch(() => null)\n if (!res || !res.ok || !res.tokens || !Array.isArray(res.tokens.data)) return null\n return res.tokens\n}\n\n/** 拉取服务器状态(带 5s 缓存)。 */\nexport async function refreshStatus(force = false) {\n if (!force && Date.now() - statusCache.at < 1500) return statusCache.servers\n const res = await rpc('edrv.lsp.status', { sessionId }).catch(() => null)\n const servers = res && res.ok && Array.isArray(res.servers) ? res.servers : []\n statusCache = { servers, at: Date.now() }\n ready = true\n publishProgress()\n return servers\n}\n\nexport function lspReady() {\n return ready\n}\n\n/** 当前会话某语言服务器状态(就绪/索引中/不可用)。 */\nexport function lspStatusFor(languageId) {\n const servers = statusCache.servers\n const match = servers.find((s) => s.languageId === languageId && s.root)\n return match || servers.find((s) => s.languageId === languageId)\n}\n\n/** file:// 或已转 edrv:// 的 LSP location → Monaco Location(edrv:// uri + 1-based range)。 */\nfunction toClientLocation(loc) {\n const range = loc.range || {}\n const start = range.start || {}\n const end = range.end || {}\n return {\n uri: window.monaco.Uri.parse(toEdrvUri(loc.uri, loc.root)),\n range: new window.monaco.Range(\n Math.max(1, (start.line ?? 0) + 1),\n Math.max(1, (start.character ?? 0) + 1),\n Math.max(1, (end.line ?? 0) + 1),\n Math.max(1, (end.character ?? 0) + 1),\n ),\n // 保留原始 LSP uri/root:后续跳转不能把 Monaco edrv Uri 当作磁盘路径\n lspUri: loc.uri,\n lspRoot: loc.root,\n lspRange: loc.range,\n }\n}\n\n/** file:// URI(或裸路径)→ edrv:// 相对路径(去掉盘符/根,与编辑器模型路径一致)。 */\nexport function toEdrvUri(uri, root) {\n if (!uri) return ''\n if (uri.startsWith('edrv://')) return uri\n const path = relativeLspPath(uri, root)\n return 'edrv:///' + encodeURI(path)\n}\n\n/** 将 LSP 目标解析为当前工作区相对路径(跨文件跳转与 model URI 对齐)。 */\nexport function targetOpenPath(loc) {\n return relativeLspPath(loc?.lspUri ?? loc?.uri, loc?.lspRoot ?? loc?.root)\n}\n\n/**\n * 归一化 Location 的 uri → 工作区路径(剥离 scheme,不补盘符)。\n * 三种输入形态(缺一即导致 scheme 泄漏进文件路径 → 跳转\"文件不存在\"):\n * - Monaco Uri 对象(toClientLocation 产物,scheme=edrv)→ 取 .path(已是工作区相对路径)\n * - 'edrv:///x' 字符串 → 取路径部分\n * - 'file:///D:/x' → 去 authority 空段保留盘符\n * @author ddj 2026年08月28号\n * @param uri Monaco Uri 对象 / file:// 或 edrv:// URI / 裸路径\n * @returns / 分隔的路径(edrv 相对路径 或 带盘符绝对路径)\n */\nexport function lspUriToAbs(uri) {\n if (!uri) return ''\n const isObject = typeof uri === 'object'\n // Monaco Uri 对象:优先取其 path(已剥离 scheme)\n const raw = isObject && typeof uri.path === 'string' ? uri.path : String(uri)\n let path = raw\n if (path.startsWith('file://')) {\n try { path = decodeURIComponent(path.replace(/^file:\\/\\/\\/?/, '')) } catch (error) { path = path.replace(/^file:\\/\\/\\/?/, '') }\n // file:///D:/x → D:/x(去 authority 空段保留盘符);/home/x 保留前导 /(Unix 绝对路径)\n return path.replace(/\\\\/g, '/').replace(/^\\/([A-Za-z]:)/, '$1')\n }\n if (path.startsWith('edrv://')) {\n try { path = decodeURIComponent(path.replace(/^edrv:\\/\\/\\/?/, '')) } catch (error) { path = path.replace(/^edrv:\\/\\/\\/?/, '') }\n }\n // edrv Uri(对象或字符串)→ 工作区相对路径:必须剥前导 /,否则 host 按绝对路径解析丢 cwd\n if (isObject ? uri.scheme === 'edrv' : raw.startsWith('edrv://')) {\n return path.replace(/\\\\/g, '/').replace(/^\\/+/, '')\n }\n return path.replace(/\\\\/g, '/').replace(/^\\/([A-Za-z]:)/, '$1')\n}\n\n/**\n * file URI/裸路径 → root 下的 / 分隔相对路径。\n * root 匹配返回工作区相对路径;root 不匹配返回完整绝对路径(保留盘符),\n * 供 edrv.read 按绝对路径解析(原先错误剥掉首个 / 导致跳转\"文件不存在\")。\n * @author ddj 2026年08月28号\n * @param uri file:// URI 或裸路径\n * @param root 工作区根(可选)\n * @returns 可 edrv.read 的路径\n */\nfunction relativeLspPath(uri, root) {\n if (!uri) return ''\n const path = lspUriToAbs(uri)\n const normalizedRoot = root ? String(root).replace(/\\\\/g, '/').replace(/^\\/([A-Za-z]:)/, '$1').replace(/\\/+$/, '') : ''\n const lowerPath = path.toLowerCase()\n const lowerRoot = normalizedRoot.toLowerCase()\n if (normalizedRoot && (lowerPath === lowerRoot || lowerPath.startsWith(lowerRoot + '/'))) {\n return path.slice(normalizedRoot.length).replace(/^\\/+/, '')\n }\n return path\n}\n\n/** 目标行/列(0-based LSP → 1-based Monaco)。 */\nexport function targetMonoPosition(loc) {\n // 优先使用原始 LSP range(0-based);无原始值时兼容 Monaco Range(1-based)\n const lspRange = loc?.lspRange\n if (lspRange?.start) {\n return {\n line: Math.max(1, (lspRange.start.line ?? 0) + 1),\n column: Math.max(1, (lspRange.start.character ?? 0) + 1),\n }\n }\n const range = loc?.range ?? {}\n return {\n line: Math.max(1, range.startLineNumber ?? 1),\n column: Math.max(1, range.startColumn ?? 1),\n }\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — Monaco LSP provider 注册 + 跳转/引用命令。\n * 数据层:Definition/Reference/DocumentSymbol/Hover provider(同一文件内跳转 Monaco 原生可用)。\n * 交互层:edrv.goToDefinition(F12)/ edrv.findReferences(Shift+F12 / 右键)/ Ctrl+点击引用导航,\n * 跨文件跳转自研(target 经 openFileAt 打开并定位),多条引用走 Monaco 原生 References Peek\n * (左侧代码预览 + 右侧引用列表;registerEditorOpener 接管 edrv:// 点击跳转)。\n * 作者 ddj 2026-08-27\n */\nimport {\n pathOfModel, syncDoc, closeDoc, findDefinition, findReferences,\n fetchDocumentSymbols, fetchHover, fetchSemanticTokens,\n targetOpenPath, targetMonoPosition, lspStatusFor, refreshStatus,\n lspUriToAbs,\n} from './lspClient.js'\nimport { LSP_SEMANTIC_TOKEN_MODIFIERS, LSP_SEMANTIC_TOKEN_TYPES, monoToLsp } from '../../../shared/lsp.js'\n\nconst LSP_LANGS = ['lua', 'csharp']\nconst SEMANTIC_LEGEND = {\n tokenTypes: [...LSP_SEMANTIC_TOKEN_TYPES],\n tokenModifiers: [...LSP_SEMANTIC_TOKEN_MODIFIERS],\n}\nlet registered = false\nconst disposables = []\n\n/** 目标文件打开并定位(复用现有 openFileAt 的 edrv:open-editor 事件通道)。 */\nfunction openAt(path, line, column) {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path, line, column } }))\n}\n\nfunction jumpToLocation(loc) {\n const path = targetOpenPath(loc)\n const pos = targetMonoPosition(loc)\n openAt(path, pos.line, pos.column)\n}\n\n/** 注册全部 Monaco LSP provider 与文档跟踪(幂等)。 */\nexport function registerLspProviders(monaco) {\n if (registered) return\n registered = true\n\n // —— 文档跟踪:model 生命周期 → host 文档同步(含未保存编辑)——\n const attachModel = (model) => {\n if (!model || model.uri.scheme !== 'edrv') return\n const path = pathOfModel(model)\n if (!path) return\n const contentDisposer = model.onDidChangeContent(() => syncDoc(path, model.getValue()))\n const disposeDisposer = model.onWillDispose(() => {\n closeDoc(path)\n contentDisposer.dispose()\n })\n disposables.push(contentDisposer, disposeDisposer)\n syncDoc(path, model.getValue(), true)\n }\n disposables.push(monaco.editor.onDidCreateModel(attachModel))\n for (const model of monaco.editor.getModels()) attachModel(model)\n\n // —— 重新检测事件:保存配置/切换启用/手动重检测后,把已打开模型重新同步给 host ——\n // (host 已重置该语言 server,下一次 sync 会按最新配置重新 acquire,无需重开文件)\n const onRedetect = (event) => {\n const languageId = event?.detail?.languageId\n if (!languageId) return\n for (const model of monaco.editor.getModels()) {\n const path = pathOfModel(model)\n if (!path) continue\n if (model.getLanguageId && model.getLanguageId() !== languageId) continue\n void syncDoc(path, model.getValue(), true)\n }\n void refreshStatus(true)\n }\n window.addEventListener('edrv:lsp-redetect', onRedetect)\n disposables.push(() => window.removeEventListener('edrv:lsp-redetect', onRedetect))\n\n // —— 数据 provider ——\n disposables.push(\n // 原生跳转(peek 参考文献列表点击 / 原生 go to definition 等)的 edrv:// 打开兜底:\n // 目标 uri 由本插件自己定义(edrv:// 工作区相对路径),Monaco 无法自行加载,\n // 必须经事件通道交给 EditorView openFileAt 打开并定位。\n monaco.editor.registerEditorOpener({\n openCodeEditor: (source, resource, selectionOrPosition) => {\n const path = lspUriToAbs(resource)\n if (!path) return false\n const start = selectionOrPosition?.getStartPosition?.() ?? selectionOrPosition\n const line = Math.max(1, start?.lineNumber ?? 1)\n const column = Math.max(1, start?.column ?? 1)\n openAt(path, line, column)\n return true\n },\n }),\n monaco.languages.registerDefinitionProvider(LSP_LANGS, {\n provideDefinition: (model, position, token) => {\n const path = pathOfModel(model)\n if (!path) return []\n return findDefinition(path, model.getValue(), position)\n },\n }),\n monaco.languages.registerReferenceProvider(LSP_LANGS, {\n provideReferences: (model, position, context, token) => {\n const path = pathOfModel(model)\n if (!path) return []\n return findReferences(path, model.getValue(), position, Boolean(context?.includeDeclaration))\n },\n }),\n monaco.languages.registerDocumentSymbolProvider(LSP_LANGS, {\n provideDocumentSymbols: async (model, token) => {\n const path = pathOfModel(model)\n if (!path) return []\n const symbols = await fetchDocumentSymbols(path, model.getValue())\n return symbols.map(toMonacoSymbol)\n },\n }),\n monaco.languages.registerHoverProvider(LSP_LANGS, {\n provideHover: async (model, position, token) => {\n const path = pathOfModel(model)\n if (!path) return null\n const hover = await fetchHover(path, model.getValue(), position)\n if (!hover || !hover.contents || !hover.contents.length) return null\n const range = hover.range\n ? new monaco.Range(hover.range.start.line + 1, hover.range.start.character + 1, hover.range.end.line + 1, hover.range.end.character + 1)\n : null\n return {\n contents: hover.contents.map((text) => ({ value: text })),\n range: range || undefined,\n }\n },\n }),\n monaco.languages.registerDocumentSemanticTokensProvider(LSP_LANGS, {\n getLegend: () => SEMANTIC_LEGEND,\n provideDocumentSemanticTokens: async (model, token) => {\n const path = pathOfModel(model)\n if (!path || token?.isCancellationRequested) return { data: new Uint32Array() }\n const result = await fetchSemanticTokens(path, model.getValue())\n if (!result || token?.isCancellationRequested) return { data: new Uint32Array() }\n return { data: Uint32Array.from(result.data) }\n },\n releaseDocumentSemanticTokens: () => {},\n }),\n )\n}\n\n/** LSP SymbolInfo(host 归一化后)→ Monaco DocumentSymbol。 */\nfunction toMonacoSymbol(symbol) {\n const range = symbol.range || {}\n const sel = symbol.selectionRange || range\n const s = (p) => ({ lineNumber: Math.max(1, (p.line ?? 0) + 1), column: Math.max(1, (p.character ?? 0) + 1) })\n const out = {\n name: symbol.name,\n detail: symbol.detail || '',\n kind: symbol.kind ?? 0,\n tags: [],\n range: new window.monaco.Range(s(range.start).lineNumber, s(range.start).column, s(range.end).lineNumber, s(range.end).column),\n selectionRange: new window.monaco.Range(s(sel.start).lineNumber, s(sel.start).column, s(sel.end).lineNumber, s(sel.end).column),\n }\n if (Array.isArray(symbol.children) && symbol.children.length) {\n out.children = symbol.children.map(toMonacoSymbol)\n }\n return out\n}\n\n/** 定义查询并跳转;nativeReveal 仅供 F12 保留 Monaco 原生 reveal。 */\nasync function goToDefinition(ed, position, nativeReveal = false) {\n const model = ed.getModel()\n const path = pathOfModel(model)\n if (!path || !position) return\n const locations = await findDefinition(path, model.getValue(), position)\n if (!locations.length) {\n setStatus('未找到定义')\n return\n }\n const first = locations[0]\n if (nativeReveal && targetOpenPath(first) === path) {\n const action = ed.getAction('editor.action.revealDefinition')\n if (action) {\n await action.run()\n return\n }\n }\n jumpToLocation(first)\n}\n\n/** F12 / 右键「转到定义」:查询定义并跳转(首个目标)。 */\nexport async function runGoToDefinition(ed) {\n await goToDefinition(ed, ed.getPosition(), true)\n}\n\n/**\n * Ctrl+鼠标点击:查询其它内容对该项的引用并导航。\n * 0 条 → 无特殊效果;1 条 → 直接跳转;多条 → 打开 Monaco 原生 References Peek\n * (左侧代码预览 + 右侧引用列表,点击经 registerEditorOpener 跳转)。\n * @author ddj 2026年09月02号\n * @param ed Monaco 编辑器\n * @param position 点击位置(Monaco 1-based)\n */\nexport async function gotoRefsAt(ed, position) {\n const model = ed.getModel()\n const path = pathOfModel(model)\n if (!path || !position) return\n const all = await findReferences(path, model.getValue(), position, false)\n const others = filterOtherRefs(all, path, position)\n if (!others.length) return\n if (others.length === 1) {\n jumpToLocation(others[0])\n return\n }\n // 计数器就绪:光标移到点击处(原生 Peek 按光标词查询),走原生两栏引用视图\n ed.setPosition(position)\n await triggerReferencePeek(ed)\n}\n\n/**\n * 触发 Monaco 原生 References Peek(左侧代码 + 右侧引用列表,原生点击跳转)。\n * @author ddj 2026年09月02号\n * @param ed Monaco 编辑器\n * @returns 是否成功触发(动作缺失时返回 false)\n */\nexport async function triggerReferencePeek(ed) {\n const action = ed.getAction('editor.action.referenceSearch.trigger')\n if (!action || typeof action.run !== 'function') return false\n await action.run()\n return true\n}\n\n/**\n * 过滤「其它内容」引用:剔除当前点击处自身(同文件且点击位置落入其 range),并按路径+起点去重。\n * @author ddj 2026年09月02号\n * @param locations 引用结果\n * @param path 当前文档路径\n * @param position 点击位置(Monaco 1-based)\n * @returns 过滤后的其它引用\n */\nfunction filterOtherRefs(locations, path, position) {\n const lspPos = monoToLsp(position.lineNumber, position.column)\n const seen = new Set()\n const out = []\n for (const loc of locations) {\n const rel = targetOpenPath(loc)\n if (sameFile(rel, path) && posInRange(lspPos, loc.lspRange)) continue\n const start = loc.lspRange?.start ?? {}\n const key = String(rel).toLowerCase() + ':' + (start.line ?? 0) + ':' + (start.character ?? 0)\n if (seen.has(key)) continue\n seen.add(key)\n out.push(loc)\n }\n return out\n}\n\n/**\n * 两个路径是否指向同一文件(容忍相对/绝对混合与大小写差异)。\n * @author ddj 2026年09月02号\n * @param a 路径 A\n * @param b 路径 B\n * @returns 是否同一文件\n */\nfunction sameFile(a, b) {\n if (!a || !b) return false\n const na = String(a).replace(/\\\\/g, '/').toLowerCase()\n const nb = String(b).replace(/\\\\/g, '/').toLowerCase()\n if (na === nb) return true\n const absA = /^[A-Za-z]:\\//.test(na) || na.startsWith('/')\n const absB = /^[A-Za-z]:\\//.test(nb) || nb.startsWith('/')\n // 同为相对/同为绝对但不等 → 不同文件(避免根目录文件误匹配同名子目录文件)\n if (absA === absB) return false\n // 一方绝对一方相对:绝对路径以相对路径结尾视为同文件\n return absA ? na.endsWith('/' + nb) : nb.endsWith('/' + na)\n}\n\n/**\n * 0-based LSP 位置是否落在 range 内(end 排除;零宽 range 按点匹配)。\n * @author ddj 2026年09月02号\n * @param pos LSP 位置(0-based)\n * @param range LSP range\n * @returns 是否在范围内\n */\nfunction posInRange(pos, range) {\n const start = range?.start\n if (!start) return false\n const end = range?.end ?? start\n if (start.line === end.line && start.character === end.character) {\n return pos.line === start.line && pos.character === start.character\n }\n if (pos.line < start.line || pos.line > end.line) return false\n if (pos.line === start.line && pos.character < start.character) return false\n if (pos.line === end.line && pos.character >= end.character) return false\n return true\n}\n\n/** 给一个 Monaco 编辑器绑定 Ctrl/Cmd+鼠标引用导航(幂等)。 */\nexport function bindLspEditor(ed) {\n if (!ed || ed.__edrvLspClick) return\n ed.__edrvLspClick = true\n const disposable = ed.onMouseDown((event) => {\n const native = event?.event\n const position = event?.target?.position\n const button = native?.button ?? event?.button\n const ctrl = native?.ctrlKey ?? event?.ctrlKey\n const meta = native?.metaKey ?? event?.metaKey\n const isLeftButton = button === 0 || native?.leftButton === true\n if (!native || !position || !isLeftButton || (!ctrl && !meta)) return\n native.preventDefault?.()\n native.stopPropagation?.()\n void gotoRefsAt(ed, position)\n })\n disposables.push(disposable)\n}\n\n/** Shift+F12 / 右键「查找所有引用」:走 Monaco 原生 References Peek(两栏引用视图)。 */\nexport async function runFindReferences(ed) {\n const position = ed.getPosition()\n if (!position) return\n ed.setPosition(position)\n await triggerReferencePeek(ed)\n}\n\n/**\n * 兼容占位(历史导出;自绘引用浮窗已移除,改走 Monaco 原生 Peek)。\n * @author ddj 2026年09月02号\n */\nexport function hideReferencesOverlay() {}\n\n/** 编辑器状态栏提示(复用 EditorView 的 status 通道)。 */\nfunction setStatus(text) {\n window.dispatchEvent(new CustomEvent('edrv:status', { detail: { text } }))\n}\n\n/** 当前会话与语言就绪状态(供编辑器状态点)。 */\nexport function lspStatusDot(languageId) {\n const status = lspStatusFor(languageId)\n return status ? status.phase : 'none'\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — LSP 装配编排。\n * setupLsp(monaco):注册 Monaco provider 与文档跟踪(幂等);调用方在 Monaco 加载后调用。\n * setSession(id):会话切换时同步(provider 与文档同步共用)。\n * 作者 ddj 2026-08-27\n */\nimport { registerLspProviders, hideReferencesOverlay } from './providers.js'\nimport { setLspSession, refreshStatus, lspStatusFor, onLspProgress } from './lspClient.js'\n\nlet monacoRef = null\n\n/** Monaco 加载后装配(幂等;重复调用仅刷新会话)。 */\nexport function setupLsp(monaco) {\n monacoRef = monaco\n registerLspProviders(monaco)\n}\n\n/** 会话切换:更新 host 侧文档归属 + 刷新状态。 */\nexport function setSession(sessionId) {\n setLspSession(sessionId)\n void refreshStatus(true)\n}\n\n/** 编辑器卸载时清理浮动面板。 */\nexport function disposeLspOverlay() {\n hideReferencesOverlay()\n}\n\nexport { lspStatusFor, refreshStatus, onLspProgress }\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 { applyTheme, registerThemes, themeNameOf } from '../monaco/theme.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 { DiffLauncher } from './DiffLauncher.js'\nimport { SidebarView } from '../sidebar/SidebarView.js'\nimport { clearDiffDock, publishDiffDock } from '../diffDockStore.js'\nimport { displayDiffTotal, editorDockMode } from '../diffDock.js'\nimport { editorHeight } from '../editorLayout.js'\nimport { revealInExplorer as revealPathInExplorer } from '../fileReveal.js'\nimport { setSidePending, SIDEBAR_INSTALL_CMD } from '../sidebarBridge.js'\nimport { upsertViewState, viewStatesLoad, viewStatesSave } from '../state/viewStateCache.js'\nimport { bindingOf, chordOf, matchEvent, useKeybindingsVersion } from '../keybindings.js'\nimport { CACHE_KEY } from '../paths.js'\nimport { bindLspEditor, runGoToDefinition, runFindReferences, hideReferencesOverlay } from '../monaco/lsp/providers.js'\nimport { onLspProgress, refreshStatus } from '../monaco/lsp/index.js'\n\n/**\n * 中央编辑区:文件页签(脏点/关闭/打开路径)+ Ctrl+P 搜索 + Monaco 编辑器 +\n * 底部差异条(DiffBox/空态)+ 全局差异下拉(DiffLauncher)+ 状态栏。\n * @param props.sessionId 会话 id\n * @param props.schedule 延时调度(ctx.timeout)\n * @param props.layout 布局形态:'tab'(中央页签,默认)| 'side'(侧边栏面板)\n * @param props.sideHint 旧页签形态下显示侧边栏引导(安装命令)\n */\nexport function EditorView(props) {\n const sessionId = props?.sessionId\n const schedule = props.schedule\n const addToConversation = props.addToConversation\n const layout = props?.layout === 'side' ? 'side' : 'tab'\n const sideHint = props?.sideHint\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 [contentPath, setContentPath] = React.useState(null)\n const [status, setStatus] = React.useState('')\n const [lspServers, setLspServers] = 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 [tabMenu, setTabMenu] = React.useState(null) // Tab 右键菜单 { x,y,path }(编辑区右键走 Monaco 原生菜单,无此浮层)\n const [sidebarOn, setSidebarOn] = React.useState(layout !== 'side') // 侧边栏显隐(侧栏形态默认收起)\n const [sidebarW, setSidebarW] = React.useState(240) // 侧边栏宽度\n const [activePanel, setActivePanel] = React.useState('explorer') // 激活面板 id\n const [focusRequest, setFocusRequest] = React.useState(0) // 外部差异聚焦请求版本\n const kbVersion = useKeybindingsVersion() // 快捷键配置版本(tooltip 文案随键位刷新)\n const [hintDismissed, setHintDismissed] = React.useState(() => {\n try { return localStorage.getItem(CACHE_KEY.sideHint) === '1' } catch { return false }\n }) // 侧边栏引导条是否已关闭\n const editorRef = React.useRef(null)\n const viewRootRef = React.useRef(null)\n const monacoRef = React.useRef(null)\n const modelsRef = React.useRef(new Map())\n // 视图状态缓存(path → Monaco viewState;重启后恢复光标/滚动/折叠位置)\n const viewStatesRef = React.useRef({})\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 menuHandlersRef = React.useRef(null) // 右键菜单动作的最新闭包(Monaco addAction 空依赖回调读取)\n const doSaveRef = React.useRef(null) // 保存动作的最新闭包(窗口级保存监听读取)\n const diffRendererRef = React.useRef(null)\n const layoutRef = React.useRef(layout) // ensureEditor 空依赖闭包读取的稳定布局\n layoutRef.current = layout\n if (!diffRendererRef.current) diffRendererRef.current = createDiffRenderer((sid, t) => dbg(sid, t))\n\n const currentRecords = React.useMemo(() => {\n const list = []\n for (const rec of Object.values(records)) if (rec.path === active && rec.archived !== true) list.push(rec)\n return list\n }, [records, active])\n\n const contentReady = content !== null && contentPath === active\n const regions = React.useMemo(() => diffRegions(currentRecords, contentReady ? content : null).filter((r) => !r.superseded), [currentRecords, content, contentPath, active])\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 /**\n * 保存当前活动文件的视图状态(光标/滚动/折叠)到会话缓存。\n * @author ddj 2026年08月28号\n * @param path 要保存的文件路径(缺省 = 当前 active)\n */\n const saveViewState = (path) => {\n const ed = editorRef.current\n const target = path ?? active\n if (!ed || !target) return\n try {\n const state = ed.saveViewState()\n if (!state) return\n viewStatesRef.current = upsertViewState(viewStatesRef.current, target, state)\n viewStatesSave(sessionId, viewStatesRef.current)\n } catch (e) { /* 视图状态保存失败忽略 */ }\n }\n\n /**\n * 恢复指定文件的视图状态(内容就绪、setModel 后调用;恢复后即消费删除)。\n * @author ddj 2026年08月28号\n * @param path 文件路径\n */\n const restoreViewState = (path) => {\n const ed = editorRef.current\n if (!ed || !path) return\n const saved = viewStatesRef.current[path]\n if (!saved) return\n const next = Object.assign({}, viewStatesRef.current)\n delete next[path]\n viewStatesRef.current = next\n try { ed.restoreViewState(saved) } catch (e) { /* 恢复失败忽略(行号越界自动兜底) */ }\n }\n\n const closeTab = (path) => {\n flushSave()\n if (path === active) saveViewState(path)\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 /**\n * 轮询去重:前后记录内容一致时返回原引用,React 跳过重渲染,\n * 阻断 5s 轮询 → memo 链 → diff 重渲染/日志 的空转。\n * @author ddj 2026年08月26号\n * @param prev 当前 records\n * @param next 轮询新结果\n * @returns 内容一致返回 true\n */\n const sameRecords = (prev, next) => {\n const pk = Object.keys(prev)\n const nk = Object.keys(next)\n if (pk.length !== nk.length) return false\n for (const k of pk) {\n if (!(k in next)) return false\n if (JSON.stringify(prev[k]) !== JSON.stringify(next[k])) return false\n }\n return true\n }\n\n const refreshRecords = (skipStale) => {\n if (!sessionId) return\n rpc('edrv.list', { sessionId, ...(skipStale ? { skipStale: true } : {}) }).then((res) => {\n if (!res || !res.ok || !Array.isArray(res.records)) return\n const map = {}\n for (const r of res.records) {\n if (r.archived === true) continue\n map[r.callId] = r\n }\n setRecords((prev) => (sameRecords(prev, map) ? prev : map))\n }).catch((e) => setError('list异常:' + String(e)))\n }\n\n /**\n * 加载文件内容(对齐 VSCode model 复用:会话内已打开的 model 直接秒显,\n * 后台静默 RPC 校验防陈旧;首次打开走原读取流程)。\n * @author ddj 2026年08月28号\n * @param path 文件路径\n * @param sid 会话 id\n * @param force 强制走 RPC(reloadFile 用,跳过 model 复用)\n */\n const loadContent = (path, sid, force) => {\n const seq = ++loadSeqRef.current\n const cachedModel = force ? null : modelsRef.current.get(path)\n if (cachedModel) {\n // model 命中:直接显示其内容(切 tab 零等待),后台静默校验\n setContent(cachedModel.getValue())\n setContentPath(path)\n setLoadStage((prev) => ({ progress: Math.max(84, prev.progress), message: '文件已读取,准备创建编辑器…' }))\n setStatus('已加载')\n rpc('edrv.read', { sessionId: sid, path }).then((res) => {\n if (seq !== loadSeqRef.current || path !== active) return\n if (res && res.ok && res.content !== cachedModel.getValue()) {\n saveViewState(path) // 内容更新前保留当前视图位置\n setContent(res.content)\n setStatus('已加载')\n }\n }).catch(() => { /* 校验失败保留缓存内容 */ })\n return\n }\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 setContentPath(path)\n setLoadStage((prev) => ({ progress: Math.max(84, prev.progress), message: '文件已读取,准备创建编辑器…' }))\n setStatus('已加载')\n } else {\n const base = res?.error ? String(res.error) : '读取失败'\n // 带出 host 解析后的真实路径:跳转失败时一眼看出是路径解析错还是目标不存在\n const message = res?.resolvedPath ? base + ':' + String(res.resolvedPath) : base\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 publishLsp = (servers) => setLspServers(Array.isArray(servers) ? servers : [])\n const unsubscribe = onLspProgress(publishLsp)\n void refreshStatus(true).then(publishLsp)\n const timer = setInterval(() => { void refreshStatus(true).then(publishLsp) }, 1500)\n return () => { unsubscribe(); clearInterval(timer) }\n }, [sessionId])\n\n React.useEffect(() => {\n const onOpen = (e) => {\n const p = e?.detail?.path\n if (!p) return\n if (e?.detail?.focusDiff === true) {\n pendingFocusRef.current = { path: p, region: null }\n setFocusRequest((value) => value + 1)\n addTab(p, true)\n return\n }\n if (e?.detail?.line != null) {\n // LSP/搜索跳转:打开并定位到行列\n openFileAt(p, e?.detail?.line, e?.detail?.column)\n return\n }\n addTab(p, true)\n }\n const onShowLauncher = (event) => {\n const tab = event?.detail?.tab\n if (tab === 'pending' || tab === 'archive') setLauncherTab(tab)\n setLauncherOpen(true)\n }\n window.addEventListener('edrv:open-editor', onOpen)\n window.addEventListener('edrv:show-launcher', onShowLauncher)\n const onStatus = (e) => { if (e?.detail?.text) setStatus(e.detail.text) }\n window.addEventListener('edrv:status', onStatus)\n return () => {\n window.removeEventListener('edrv:open-editor', onOpen)\n window.removeEventListener('edrv:show-launcher', onShowLauncher)\n window.removeEventListener('edrv:status', onStatus)\n }\n }, [sessionId])\n\n // 对话输入区的唯一差异 dock 读取此会话快照;编辑器卸载时只清理自己的发布者令牌。\n const dockSourceRef = React.useRef({})\n React.useEffect(() => () => {\n clearDiffDock(sessionId, dockSourceRef.current)\n if (layout === 'side') setSidePending(sessionId, 0)\n }, [sessionId])\n\n // DSH composer 保持原生布局;编辑区只读取几何边界并同步自己的高度。\n // 侧栏形态:面板容器自带高度,跳过 composer 几何同步(面板内无会话滚动区)。\n React.useLayoutEffect(() => {\n if (layout === 'side') return\n const root = viewRootRef.current\n const scroll = root?.closest?.('[data-conversation-scroll]')\n if (!root || !scroll) return\n let seat = null\n let frame = null\n let resizeObserver = null\n const update = () => {\n frame = null\n const rootRect = root.getBoundingClientRect()\n const scrollRect = scroll.getBoundingClientRect()\n const seatRect = seat?.getBoundingClientRect?.()\n const height = editorHeight(rootRect.top, scrollRect.bottom, seatRect?.top)\n root.style.setProperty('--edrv-editor-height', height + 'px')\n }\n const scheduleUpdate = () => {\n if (frame !== null) return\n frame = requestAnimationFrame(update)\n }\n const attachSeat = () => {\n const next = scroll.querySelector?.('[data-composer-seat]')\n if (next === seat) {\n scheduleUpdate()\n return\n }\n resizeObserver?.disconnect()\n seat = next\n resizeObserver = null\n if (seat && typeof ResizeObserver === 'function') {\n resizeObserver = new ResizeObserver(scheduleUpdate)\n resizeObserver.observe(seat)\n }\n scheduleUpdate()\n }\n attachSeat()\n const mutationObserver = typeof MutationObserver === 'function'\n ? new MutationObserver(attachSeat)\n : null\n mutationObserver?.observe(scroll, { childList: true })\n const scrollObserver = typeof ResizeObserver === 'function' ? new ResizeObserver(scheduleUpdate) : null\n scrollObserver?.observe(scroll)\n window.addEventListener('resize', scheduleUpdate)\n scheduleUpdate()\n return () => {\n if (frame !== null) cancelAnimationFrame(frame)\n resizeObserver?.disconnect()\n scrollObserver?.disconnect()\n mutationObserver?.disconnect()\n window.removeEventListener('resize', scheduleUpdate)\n root.style.removeProperty('--edrv-editor-height')\n }\n }, [sessionId, layout])\n\n // localStorage v2 恢复页签\n React.useEffect(() => {\n if (bootRef.current || !sessionId) return\n bootRef.current = true\n viewStatesRef.current = viewStatesLoad(sessionId)\n try {\n const raw = localStorage.getItem(CACHE_KEY.editor + 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(CACHE_KEY.editor + String(sessionId), JSON.stringify({ tabs: tabs.map((t) => t.path), active })) }\n catch (e) { /* 忽略 */ }\n }, [tabs, active, sessionId])\n\n // 侧边栏状态:恢复(显隐/宽度/激活面板);侧栏形态独立键(默认收起,不共享页签形态偏好)\n const sidebarKey = CACHE_KEY.sidebar + (layout === 'side' ? 'side.' : '') + String(sessionId)\n React.useEffect(() => {\n if (!sessionId) return\n try {\n const raw = localStorage.getItem(sidebarKey)\n if (raw) {\n const saved = JSON.parse(raw)\n if (typeof saved.on === 'boolean') setSidebarOn(saved.on)\n if (typeof saved.width === 'number') setSidebarW(Math.max(180, Math.min(560, saved.width)))\n if (typeof saved.panel === 'string') setActivePanel(saved.panel)\n }\n } catch (e) { /* 损坏忽略 */ }\n }, [sessionId, sidebarKey])\n\n // 侧边栏状态持久化\n React.useEffect(() => {\n if (!sessionId) return\n try { localStorage.setItem(sidebarKey, JSON.stringify({ on: sidebarOn, width: sidebarW, panel: activePanel })) }\n catch (e) { /* 忽略 */ }\n }, [sidebarOn, sidebarW, activePanel, sessionId, sidebarKey])\n\n // 切换侧边栏(capture 抢占,避免与 DSH 全局冲突;键位随快捷键配置)\n React.useEffect(() => {\n const onKey = (e) => {\n if (!matchEvent(e, bindingOf('edrv.toggleSidebar'))) return\n e.preventDefault(); e.stopPropagation()\n setSidebarOn((v) => !v)\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n // 保存文件(窗口级):编辑器有活动模型才拦截执行,无文件时放行(浏览器默认行为)\n React.useEffect(() => {\n const onKey = (e) => {\n if (!matchEvent(e, bindingOf('edrv.save'))) return\n if (!editorRef.current?.getModel?.()) return\n e.preventDefault(); e.stopPropagation()\n flushSave()\n doSaveRef.current(false)\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n // Ctrl+Shift+F 全局搜索:展开侧边栏 + 激活搜索页签,随后聚焦搜索输入框\n React.useEffect(() => {\n const onKey = (e) => {\n if (!matchEvent(e, bindingOf('edrv.searchInFiles'))) return\n e.preventDefault(); e.stopPropagation()\n setSidebarOn(true)\n setActivePanel('search')\n setTimeout(() => window.dispatchEvent(new CustomEvent('edrv:search-focus')), 0)\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n // 文件 → 待处理差异数 映射(侧边栏角标)\n const pendingByPath = React.useMemo(() => {\n const out = {}\n for (const f of sum.files) if (f.pending > 0) out[f.path] = f.pending\n return out\n }, [sum])\n\n React.useEffect(() => {\n if (!active) return\n setContent(null)\n setContentPath(null)\n setLoadError(null)\n setLoadStage({ progress: 10, message: '准备读取文件…' })\n setStatus('加载中…')\n loadContent(active, sessionId)\n }, [active, sessionId])\n\n // Tab 右键菜单打开时 Esc 关闭\n React.useEffect(() => {\n if (!tabMenu) return\n const onKey = (e) => { if (e.key === 'Escape') dismissMenus() }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [tabMenu])\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 // 分色主题:Monaco 就绪后注册(幂等)+ 应用;DSH 明暗切换时跟随重刷。\n React.useEffect(() => {\n if (!monaco) return\n registerThemes(monaco)\n applyTheme(monaco)\n if (typeof window.matchMedia !== 'function') return\n const query = window.matchMedia('(prefers-color-scheme: dark)')\n const onChange = () => applyTheme(monaco)\n if (typeof query.addEventListener === 'function') {\n query.addEventListener('change', onChange)\n return () => query.removeEventListener('change', onChange)\n }\n query.addListener(onChange)\n return () => query.removeListener(onChange)\n }, [monaco])\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 setContentPath(active)\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 doSaveRef.current = doSave\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 restoreViewState(active)\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 saveViewState(active)\n diffRendererRef.current?.dispose?.()\n hideReferencesOverlay()\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 side = layoutRef.current === 'side'\n const ed = m.editor.create(node, {\n value: '',\n language: 'plaintext',\n theme: themeNameOf(),\n fontFamily: 'var(--ds-font-family-code, ui-monospace, monospace)',\n fontSize: 13,\n lineHeight: 20,\n minimap: { enabled: !side, 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: side ? 6 : 8 },\n })\n // 保存改由窗口级快捷键监听执行(键位可配置;见上方 edrv.save 监听)\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 // 编辑区右键 → 注入 Monaco 原生 context menu(与 Go to Definition 等同菜单,避免分离浮层)。\n // 有选区时额外显示「选中内容」项:context key edrvSelection 由光标选区变化驱动。\n // 路径/选区在点击时从 model/editor 实时读取(不依赖闭包里的过期 active)。\n const menuHandlers = () => menuHandlersRef.current\n const pathOf = (edx) => {\n const model = edx?.getModel?.()\n const uriPath = model?.uri?.path\n return uriPath ? decodeURIComponent(String(uriPath).replace(/^\\//, '')) : null\n }\n const selectionOf = (edx) => {\n const s = edx?.getSelection?.()\n if (!s) return null\n if (s.startLineNumber === s.endLineNumber && s.startColumn === s.endColumn) return null\n return { startLine: s.startLineNumber, endLine: s.endLineNumber }\n }\n const selKey = ed.createContextKey('edrvSelection', false)\n ed.onDidChangeCursorSelection((e) => {\n const s = e?.selection\n selKey.set(!!(s && (s.startLineNumber !== s.endLineNumber || s.startColumn !== s.endColumn)))\n })\n ed.addAction({\n id: 'edrv.addFileRef', label: '添加文件到对话', contextMenuGroupId: '1_edrv',\n precondition: 'editorTextFocus',\n run: (edx) => menuHandlers()?.addRefToChat(pathOf(edx)),\n })\n ed.addAction({\n id: 'edrv.addSelectionRef', label: '添加选中内容为引用', contextMenuGroupId: '1_edrv',\n precondition: 'edrvSelection',\n run: (edx) => {\n const s = selectionOf(edx)\n const p = pathOf(edx)\n if (s && p) menuHandlers()?.addRefToChat(p, { startLine: s.startLine, endLine: s.endLine })\n },\n })\n // 在 OS 文件浏览器中打开/定位当前活动文件(与文件管理栏右键菜单同源能力)。\n ed.addAction({\n id: 'edrv.revealInExplorer', label: '在文件浏览器中打开', contextMenuGroupId: '1_edrv',\n precondition: 'editorTextFocus',\n run: (edx) => menuHandlers()?.openInExplorer(pathOf(edx)),\n })\n // 语言智能(LSP):转到定义 / 查找所有引用(右键 + F12/Shift+F12 键位)。\n ed.addAction({\n id: 'edrv.goToDefinition', label: '转到定义', contextMenuGroupId: '1_edrv',\n keybindings: m.KeyMod.CtrlCmd | m.KeyCode.F12,\n precondition: 'editorTextFocus',\n run: (edx) => { void runGoToDefinition(edx) },\n })\n ed.addAction({\n id: 'edrv.findReferences', label: '查找所有引用', contextMenuGroupId: '1_edrv',\n keybindings: m.KeyMod.Shift | m.KeyCode.F12,\n precondition: 'editorTextFocus',\n run: (edx) => { void runFindReferences(edx) },\n })\n ed.addCommand(m.KeyCode.F12, () => { void runGoToDefinition(ed) })\n bindLspEditor(ed)\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 ed = editorRef.current\n if (!ed) return\n if (pf.line != null) {\n // 搜索命中跳转:直接定位到行/列(不依赖差异区域)\n pendingFocusRef.current = null\n ed.revealLineInCenter(Math.max(1, pf.line))\n ed.setPosition({ lineNumber: Math.max(1, pf.line), column: Math.max(1, pf.column ?? 1) })\n ed.focus()\n return\n }\n const target = pf.region || pendingRegions[0]\n if (!target) 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, focusRequest])\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 openNextFile = () => {\n if (!sum.pendingFiles.length) return\n if (sum.pendingFiles.some((file) => file.path === active)) gotoFile(1)\n else openFile(sum.pendingFiles[0].path, true)\n }\n\n const reloadFile = (skipStale) => {\n if (!active) return\n loadContent(active, sessionId, true)\n refreshRecords(skipStale === true)\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 /**\n * 批量采纳/不采纳:一次 RPC 处理多个差异(Keep 整文件 / Keep All / Undo All)。\n * 单次 setRecords 合并全部结果,避免逐条往返读写整个 sidecar。\n * @author ddj 2026年08月25号\n * @param items 决策项数组(callId/scope/hunkIndex/decision)\n * @returns Promise<{ok:number; fail:number}> 成功/失败计数\n */\n const actMany = (items) => {\n if (!items.length) return Promise.resolve({ ok: 0, fail: 0 })\n return rpc('edrv.decideBatch', { sessionId, items }).then((res) => {\n if (!res || !res.ok || !Array.isArray(res.results)) {\n setError(res?.error ? String(res.error) : '批量处理失败')\n return { ok: 0, fail: items.length }\n }\n let ok = 0\n let fail = 0\n const next = {}\n for (const item of res.results) {\n if (item && item.ok) {\n ok++\n if (item.record) next[item.callId] = item.record\n } else {\n fail++\n }\n }\n // 合并结果无变化(批量全部失败/重复点击)时不 setRecords:避免 records 换引用\n // → pendingRegions 换引用 → diff 全量重渲染(内容相同,纯空转)\n if (Object.keys(next).length) setRecords((prev) => Object.assign({}, prev, next))\n return { ok, fail }\n }).catch((e) => {\n setError('批量处理异常:' + String(e))\n return { ok: 0, fail: items.length }\n })\n }\n\n /**\n * 决策项构造(与单条 actHunk 的 scope 语义一致:create 记录走 call 作用域)。\n * @author ddj 2026年08月25号\n * @param r 差异区域/待处理项(callId/idx/create)\n * @param reject true=不采纳\n * @returns decideBatch items 元素\n */\n const itemOf = (r, reject) => ({ callId: r.callId, scope: r.create ? 'call' : 'hunk', hunkIndex: r.idx, decision: reject ? 'rejected' : 'accepted' })\n\n const acceptFile = () => {\n if (batchBusyRef.current || !pendingRegions.length) return\n batchBusyRef.current = true\n actMany(pendingRegions.map((r) => itemOf(r, false))).then(({ ok, fail }) => {\n batchBusyRef.current = false\n reloadFile(true)\n emitRefresh()\n setStatus('已采纳 ' + ok + ' 处差异' + (fail ? ',' + fail + ' 处失败' : ''))\n if (fail) setError(fail + ' 处差异处理失败(可能已被后续修改影响),可刷新后重试')\n }).catch(() => { batchBusyRef.current = false })\n }\n const undoFile = () => {\n if (batchBusyRef.current || !pendingRegions.length) return\n batchBusyRef.current = true\n actMany([...pendingRegions].reverse().map((r) => itemOf(r, true))).then(({ ok, fail }) => {\n batchBusyRef.current = false\n reloadFile(true)\n emitRefresh()\n setStatus('已不采纳 ' + ok + ' 处差异' + (fail ? ',' + fail + ' 处失败' : ''))\n if (fail) setError(fail + ' 处差异处理失败(可能已被后续修改影响),可刷新后重试')\n }).catch(() => { batchBusyRef.current = false })\n }\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 降序(新改先回滚)排序后一次 RPC。\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 actMany(list.map((r) => itemOf(r, reject))).then(({ ok, fail }) => {\n batchBusyRef.current = false\n reloadFile(true)\n emitRefresh()\n setStatus((reject ? '已不采纳 ' : '已采纳 ') + ok + ' 处差异' + (fail ? ',' + fail + ' 处失败' : ''))\n if (fail) setError(fail + ' 处差异处理失败(可能已被后续修改影响),可刷新后重试')\n }).catch(() => { batchBusyRef.current = false })\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 /**\n * 关闭 Tab 右键菜单。\n * @author ddj 2026年08月25号\n */\n const dismissMenus = () => {\n setTabMenu(null)\n }\n\n /** 把「添加到对话」返回状态映射为状态栏文案。\n * @author ddj 2026年08月25号 */\n const statusOfAdd = (outcome, okText) => {\n if (outcome === 'ok') return okText\n if (outcome === 'busy') return okText + '(输入框忙,已降级纯文本)'\n return '无法添加到对话(无会话或输入框不可用)'\n }\n\n /** 添加文件/选中区引用到对话(异步,状态栏反馈)。 */\n const addRefToChat = (path, range) => {\n if (!path) { setStatus('无活动文件'); return }\n if (!addToConversation) { setStatus('添加到对话不可用'); return }\n addToConversation.appendReference(sessionId, path, range).then((o) => setStatus(statusOfAdd(o, '已添加文件引用')))\n }\n\n /**\n * 在 OS 文件浏览器中打开/定位路径(Monaco 右键菜单用,状态栏反馈)。\n * @author ddj 2026年08月27号\n * @param path 工作区相对路径(可能为 null)\n */\n const openInExplorer = (path) => {\n if (!path) { setStatus('无活动文件'); return }\n if (!sessionId) { setStatus('无活动会话'); return }\n setStatus('正在打开文件浏览器…')\n revealPathInExplorer(sessionId, path).then((outcome) => {\n setStatus(outcome.ok ? '已在文件浏览器中打开' : '打开失败')\n if (!outcome.ok && outcome.error) setError(outcome.error)\n })\n }\n\n // 供 Monaco 原生右键菜单 addAction 读取的最新动作闭包(空依赖回调不随渲染重建)\n menuHandlersRef.current = { addRefToChat, openInExplorer }\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 /**\n * 打开文件并跳转到指定行列(搜索面板命中跳转)。\n * @author ddj 2026年08月26号\n * @param path 文件路径\n * @param line 目标行(缺省仅打开不跳转)\n * @param column 目标列(缺省 1)\n */\n const openFileAt = (path, line, column) => {\n if (!path) return\n addTab(path, true)\n pendingFocusRef.current = { path, region: null, line: line ?? null, column: column ?? 1 }\n setFocusRequest((value) => value + 1)\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(); saveViewState(active); setActive(t.path) } },\n onContextMenu: (e) => {\n e.preventDefault()\n e.stopPropagation()\n setTabMenu({ x: e.clientX, y: e.clientY, path: t.path })\n },\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 || '使用右上搜索框 (' + (chordOf('edrv.quickOpen') ?? 'Ctrl+P') + ') 打开文件'),\n (active && langOf(active) ? React.createElement('span', { className: 'edrv-pb-meta' }, langOf(active)) : null),\n (cursor ? React.createElement('span', { className: 'edrv-pb-meta' }, cursor) : null),\n (status ? React.createElement('span', { className: 'edrv-pb-meta edrv-pb-status' }, status) : null))\n\n const lspLanguage = active ? langOf(active) : ''\n const lspServer = lspServers.find((item) => item.languageId === lspLanguage)\n const lspPhaseText = { idle: '未启动', starting: '启动中', ready: '已就绪', indexing: '解析中', unavailable: '不可用', stopped: '已停止' }\n const lspSourceText = { extension: '扩展', discover: '自动发现', manual: '手动配置', none: '未配置' }\n const lspLabel = lspServer\n ? 'LSP ' + lspLanguage + ' · ' + (lspPhaseText[lspServer.phase] ?? lspServer.phase) + ' · ' + (lspSourceText[lspServer.source] ?? lspServer.source)\n : 'LSP ' + lspLanguage + ' · 未启动'\n const lspProgress = typeof lspServer?.progress === 'number' ? Math.round(lspServer.progress) : null\n const lspFooter = (lspLanguage === 'lua' || lspLanguage === 'csharp')\n ? React.createElement('div', { className: 'edrv-statusbar', title: lspServer?.progressMessage || lspLabel },\n React.createElement('span', { className: 'edrv-lsp-status-dot ' + (lspServer?.phase === 'ready' ? 'ready' : lspServer?.phase === 'indexing' || lspServer?.phase === 'starting' ? 'busy' : 'idle') }),\n React.createElement('span', { className: 'edrv-sp-lsp' }, lspLabel),\n lspServer?.progressMessage ? React.createElement('span', { className: 'edrv-sp-progress-message' }, lspServer.progressMessage) : null,\n lspProgress !== null ? React.createElement('span', { className: 'edrv-sp-progress' }, lspProgress + '%') : null)\n : null\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 (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' + (sidebarOn ? ' edrv-chip-on' : ''), title: '切换侧边栏 (' + (chordOf('edrv.toggleSidebar') ?? 'Ctrl+B') + ')', onClick: () => setSidebarOn((v) => !v) }, '☰'),\n React.createElement('button', { className: 'edrv-chip-btn', title: '刷新', onClick: reloadFile }, '⟳'),\n React.createElement(QuickOpen, { sessionId, onOpen: (p) => openFile(p, false) }))\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 } }, '使用右上搜索框 (' + (chordOf('edrv.quickOpen') ?? 'Ctrl+P') + ') 打开工作区文件;agent 修改文件后顶部会出现差异角标'))\n } else if (content === null && loadError) {\n body = loadingBody('文件加载失败:' + loadError, 0, () => {\n setLoadError(null)\n setContent(null)\n setContentPath(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 /** 组装差异 dock 快照(发布给 conversation.input.dock 的唯一 DiffBox 实例)。 */\n const buildDockSnapshot = () => ({\n mode: editorDockMode(active),\n pendingRegions,\n 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: (path) => openFile(path, true),\n onOpenLauncher: (tab) => { setLauncherTab(tab || 'pending'); setLauncherOpen(true) },\n onRefresh: reloadFile,\n activePath: active,\n diffIdx: contentReady ? diffIdx : 0,\n diffTotal: displayDiffTotal(contentReady, pendingRegions.length, sum.files.find((file) => file.path === active)?.pending ?? 0),\n fileIdx,\n fileTotal: sum.pendingFiles.length,\n onPrevDiff: () => gotoDiff(-1),\n onNextDiff: () => gotoDiff(1),\n onPrevFile: () => gotoFile(-1),\n onNextFile: () => gotoFile(1),\n onOpenNextFile: openNextFile,\n })\n\n React.useEffect(() => {\n if (!sessionId) return\n publishDiffDock(sessionId, buildDockSnapshot(), dockSourceRef.current)\n // 侧栏形态同步 Tab 角标计数(仅本形态写入;页签形态清零避免残留)\n if (layout === 'side') setSidePending(sessionId, sum.totalFiles)\n else setSidePending(sessionId, 0)\n })\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 : null\n\n // Tab 右键菜单浮层:全屏遮罩(点击/右键关闭)+ 菜单(固定定位,clamp 防越界)。\n // 编辑区右键走 Monaco 原生 context menu(editor.addAction),不在此渲染浮层。\n /**\n * 计算右键菜单固定定位(clamp 防越出视口)。\n * @author ddj 2026年08月25号\n */\n const menuPos = (x, y) => ({\n left: Math.max(4, Math.min(x, (window.innerWidth || 800) - 224)),\n top: Math.max(4, Math.min(y, (window.innerHeight || 600) - 176)),\n })\n const menuBackdrop = tabMenu\n ? React.createElement('div', {\n style: { position: 'fixed', inset: 0, zIndex: 70 },\n onClick: dismissMenus,\n onContextMenu: (e) => { e.preventDefault(); dismissMenus() },\n })\n : null\n const tabMenuEl = tabMenu\n ? React.createElement('div', { className: 'edrv-ctxmenu', style: menuPos(tabMenu.x, tabMenu.y) },\n React.createElement('button', { className: 'edrv-ctxmenu-item', onClick: () => { addRefToChat(tabMenu.path); dismissMenus() } }, '添加文件到对话'),\n React.createElement('div', { className: 'edrv-ctxmenu-sep' }),\n React.createElement('button', { className: 'edrv-ctxmenu-item edrv-ctxmenu-danger', onClick: () => { closeTab(tabMenu.path); dismissMenus() } }, '关闭标签页'))\n : null\n\n const sidebarPanels = props.sidebarPanels\n const sidebarCtx = {\n sessionId,\n openFile: (p) => openFile(p, false),\n openFileAt,\n activePath: active,\n pendingByPath,\n sum: { totalFiles: sum.totalFiles, files: sum.files },\n refreshRecords: () => refreshRecords(),\n editor: () => editorRef.current,\n outlineSources: props.outlineSources,\n fileMenuItems: props.fileMenuItems,\n notify: (message) => setStatus(message),\n }\n\n // 主编辑列(侧边栏右侧):pathBar + tabRow + 编辑/差异区(底部整条留给 DSH 对话输入栏)\n const editorArea = React.createElement('div', { className: 'edrv-editor-area' },\n body,\n hoverEl,\n overlay)\n // 侧边栏引导条(仅旧页签形态且未装 betterSidebar 时显示;可复制安装命令、可关闭)\n const dismissHint = () => {\n setHintDismissed(true)\n try { localStorage.setItem(CACHE_KEY.sideHint, '1') } catch (e) { /* 忽略 */ }\n }\n const copyInstallCmd = () => {\n if (navigator.clipboard?.writeText) navigator.clipboard.writeText(SIDEBAR_INSTALL_CMD).catch(() => {})\n }\n const sideHintEl = (layout === 'tab' && sideHint && !hintDismissed)\n ? React.createElement('div', { className: 'edrv-side-hint' },\n React.createElement('span', { className: 'edrv-side-hint-text' }, '安装 dsh-better-sidebar 后可启用侧边栏编辑(对话+编辑同屏):'),\n React.createElement('code', { className: 'edrv-side-hint-cmd' }, SIDEBAR_INSTALL_CMD),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '复制安装命令', onClick: copyInstallCmd }, '复制命令'),\n React.createElement('button', { className: 'edrv-side-hint-close', title: '关闭提示', 'aria-label': '关闭提示', onClick: dismissHint }, '×'))\n : null\n const mainCol = React.createElement('div', { className: 'edrv-main-col', style: { flex: 1, minWidth: 0, minHeight: 0, display: 'flex', flexDirection: 'column', overflow: 'hidden' } },\n pathBar,\n tabRow,\n sideHintEl,\n editorArea,\n lspFooter)\n // 编辑器根节点按 composer 顶部边界动态限高,底部对话区域继续由 DSH 原生渲染。\n // 侧栏形态由面板容器给高(100%),不做 composer 几何同步。\n const editorRow = React.createElement('div', { className: 'edrv-editor-row' },\n (sidebarOn && sidebarPanels\n ? React.createElement(SidebarView, {\n registry: sidebarPanels,\n ctx: sidebarCtx,\n activePanel,\n onActive: setActivePanel,\n width: sidebarW,\n onWidth: setSidebarW,\n onHide: () => setSidebarOn(false),\n })\n : null),\n mainCol)\n\n const baseStyle = { minHeight: 0, display: 'flex', flexDirection: 'column', background: 'var(--dsw-alias-bg-base,transparent)', overflow: 'hidden' }\n const rootEl = layout === 'side'\n ? React.createElement('div', { ref: viewRootRef, 'data-edrv-view': '1', 'data-edrv-layout': 'side', className: 'edrv-view-side', style: Object.assign({}, baseStyle, { height: '100%' }) },\n editorRow,\n menuBackdrop,\n tabMenuEl)\n : React.createElement('div', { ref: viewRootRef, 'data-edrv-view': '1', style: Object.assign({}, baseStyle, { height: 'var(--edrv-editor-height, 100%)', maxHeight: 'var(--edrv-editor-height, 100%)' }) },\n editorRow,\n menuBackdrop,\n tabMenuEl)\n return rootEl\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 [summary, setSummary] = React.useState(null)\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 setSummary(summarize(res.records))\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 const n = summary?.totalFiles ?? 0\n if (!n) return null\n\n const click = () => {\n // 侧栏形态:带首个待处理文件路径(内容打开自动展开面板);旧形态行为不变\n openEditorView(summary?.pendingFiles?.[0]?.path ?? 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 — PerfSizeBadge:对话 header 会话体积指示器。\n * 5s 轮询当前会话持久化体积(host 仅 stat,近零成本),≥1MB 显示、超阈值变色,\n * 引导\"一次任务一个短会话\":会话过大时建议 /compact 或新开会话。\n * 作者 ddj 2026-09-02\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\n\n/** 软阈值:≥ 此值琥珀色(默认 2MB)。 */\nconst SOFT = 2 * 1024 * 1024\n/** 硬阈值:≥ 此值红色(默认 8MB)。 */\nconst HARD = 8 * 1024 * 1024\n/** 显示下限:≥ 1MB 才显示(太小无提示价值)。 */\nconst SHOW_MIN = 1024 * 1024\n\n/**\n * 会话 header 体积徽章(挂 conversation.session.header.utilities)。\n * @author ddj 2026年09月02号\n * @param props { sessionId, sessions }(sessions 供 cwd 解析)\n */\nexport function PerfSizeBadge(props) {\n const sessionId = props?.sessionId\n const sessions = props?.sessions\n const [size, setSize] = React.useState(null)\n const seq = React.useRef(0)\n\n const load = React.useCallback(() => {\n if (!sessionId) return\n const cwd = sessions?.list?.getSnapshot?.()?.byId?.[sessionId]?.cwd\n if (!cwd) return\n const s = ++seq.current\n rpc('edrv.perf.sessionSize', { sessionId, cwd }).then((res) => {\n if (s !== seq.current || !res || !res.ok) return\n setSize(res.exists ? res.bytes : 0)\n }).catch(() => {})\n }, [sessionId, sessions])\n\n React.useEffect(() => {\n load()\n const t = setInterval(load, 5000)\n return () => { clearInterval(t) }\n }, [load])\n\n if (!size || size < SHOW_MIN) return null\n const label = size >= 1024 * 1024 ? (size / (1024 * 1024)).toFixed(1) + 'MB' : Math.round(size / 1024) + 'KB'\n const color = size >= HARD ? '#dc2626' : size >= SOFT ? '#d97706' : 'var(--dsw-text-3,#6b7280)'\n const tip = '当前会话已持久化 ' + label + '(启动回放约放大 10×,占内存)。过大建议 /compact 或新开会话。'\n return React.createElement('span', {\n style: { display: 'inline-flex', alignItems: 'center', height: 30, padding: '0 8px', fontSize: 11, color, borderRadius: 6, cursor: 'default', whiteSpace: 'nowrap', gap: 4, lineHeight: '30px' },\n title: tip,\n }, '会话 ' + label)\n}\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 { diffDockText } from '../diffDock.js'\nimport { badgeOf } from './shared.js'\n\n/**\n * 折叠控制使用任务栏同尺寸的 chevron 轮廓,避免依赖未声明的运行时图标包。\n * @author ddj 2026年08月25号\n * @param open 是否已展开\n * @returns 14×14 的装饰性 chevron SVG\n */\nfunction chevronOf(open) {\n const path = open ? 'M3.25 5.25 7 9l3.75-3.75' : 'M3.25 8.75 7 5l3.75 3.75'\n return React.createElement('svg', {\n width: 14,\n height: 14,\n viewBox: '0 0 14 14',\n fill: 'none',\n 'aria-hidden': true,\n focusable: false,\n }, React.createElement('path', {\n d: path,\n stroke: 'currentColor',\n strokeWidth: 1.2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }))\n}\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 = 0, onRollback, onJump, otherFiles = [], onOpenOther, onOpenLauncher, onRefresh, activePath,\n diffIdx = 0, diffTotal = 0, fileIdx = 0, fileTotal = 0, onPrevDiff, onNextDiff, onPrevFile, onNextFile,\n mode = 'editor', onOpenNextFile, dock = false,\n } = props\n const [expanded, setExpanded] = React.useState(false)\n const [detailsOpen, setDetailsOpen] = React.useState(false)\n const detailsId = React.useId()\n const canAct = pendingRegions.length > 0\n\n const base = String(activePath || '').split(/[\\\\/]/).pop() || ''\n\n if (mode === 'chat' || mode === 'editor-empty') {\n return React.createElement('div', { className: 'edrv-diffbar edrv-diffbar-dock', 'data-edrv-diffbox': '1', 'data-edrv-diff-mode': mode },\n React.createElement('div', { className: 'edrv-diffbar-row edrv-diffbar-dock-row' },\n React.createElement('button', {\n type: 'button',\n className: 'edrv-diffbar-dock-button',\n title: '切换到下一个差异文件',\n 'aria-label': diffDockText(fileTotal),\n onClick: onOpenNextFile,\n }, diffDockText(fileTotal))))\n }\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 details = detailsOpen\n ? React.createElement('div', { className: 'edrv-diff-details', id: detailsId },\n React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !allPendingCount, onClick: onAcceptAllFiles }, '✓ Keep All(全部文件采纳)'),\n React.createElement('button', { className: 'edrv-diffmenu-item danger', disabled: !allPendingCount, onClick: onUndoAllFiles }, '↩ Undo All(全部文件不采纳)'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => onOpenLauncher('pending') }, '🗂 差异总览'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => onOpenLauncher('archive') }, '📁 归档'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !canAct, onClick: onRollback }, '⟲ 回滚文件'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: onRefresh }, '⟳ 刷新'))\n : null\n\n return React.createElement('div', { className: 'edrv-diffbar edrv-diffbar-dock', 'data-edrv-diffbox': '1', 'data-edrv-diff-mode': 'editor' },\n React.createElement('div', { className: 'edrv-diffbar-row edrv-diffbar-editor-row' },\n React.createElement('div', { className: 'edrv-diffbar-editor-content' },\n React.createElement('div', { className: 'edrv-diffbar-nav' },\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异', disabled: !canAct, onClick: onPrevDiff }, '↑'),\n React.createElement('span', { className: 'edrv-diffbar-count edrv-diffbar-progress', 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('div', { className: 'edrv-diffbar-files' },\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 edrv-diffbar-progress', 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 edrv-diffbar-summary', title: activePath || '' }, base)),\n\n React.createElement('div', { className: 'edrv-diffbar-actions' },\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', {\n className: 'edrv-pill edrv-pill-ghost edrv-diff-details-toggle',\n title: detailsOpen ? '收起差异操作' : '展开差异操作',\n 'aria-label': detailsOpen ? '收起差异操作' : '展开差异操作',\n 'aria-expanded': detailsOpen,\n 'aria-controls': detailsId,\n onClick: () => setDetailsOpen((value) => !value),\n }, chevronOf(detailsOpen))))),\n bodyEl,\n details)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 会话级差异 dock。\n * conversation.input.dock 是唯一实例:普通对话显示摘要,文件编辑页显示完整操作条。\n * 作者 ddj 2026-08-26\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { openDiffView } from '../events.js'\nimport { summarize } from '../state/records.js'\nimport { nextDiffPath } from '../diffDock.js'\nimport { readDiffDock, subscribeDiffDock } from '../diffDockStore.js'\nimport { DiffBox } from './DiffBox.js'\n\nconst nextIndexBySession = new Map()\n\n/**\n * 对话输入框上方的唯一差异 dock。\n * @author ddj 2026年08月26号\n * @param props DSH 注入的会话属性\n * @returns 差异 dock React 元素或 null\n */\nexport function ConversationDiffDock(props) {\n const sessionId = props?.sessionId\n const [summary, setSummary] = React.useState(null)\n const [, setStoreRevision] = React.useState(0)\n const seq = React.useRef(0)\n\n const load = React.useCallback(() => {\n if (!sessionId) return\n const current = ++seq.current\n rpc('edrv.list', { sessionId }).then((res) => {\n if (current !== seq.current || !res || !res.ok || !Array.isArray(res.records)) return\n setSummary(summarize(res.records))\n }).catch(() => {})\n }, [sessionId])\n\n React.useEffect(() => {\n load()\n const timer = setInterval(load, 5000)\n const onRefresh = () => load()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => {\n clearInterval(timer)\n window.removeEventListener('edrv:refresh', onRefresh)\n }\n }, [load])\n\n React.useEffect(() => {\n if (!sessionId) return undefined\n const sync = () => setStoreRevision((value) => value + 1)\n sync()\n return subscribeDiffDock(sessionId, sync)\n }, [sessionId])\n\n const renderDock = (content, key) => React.createElement('div', {\n key,\n className: 'edrv-diff-dock-shell',\n 'data-edrv-diff-dock-shell': '1',\n }, content)\n\n const editorSnapshot = readDiffDock(sessionId)\n if (editorSnapshot) {\n if (editorSnapshot.mode === 'editor-empty' && !editorSnapshot.fileTotal) return null\n return renderDock(React.createElement(DiffBox, Object.assign({}, editorSnapshot, { dock: true })), sessionId)\n }\n\n if (!sessionId || !summary?.pendingFiles?.length) return null\n\n const paths = summary.pendingFiles.map((file) => file.path)\n const click = () => {\n const current = nextIndexBySession.get(sessionId) ?? 0\n const next = nextDiffPath(paths, current)\n nextIndexBySession.set(sessionId, next.index)\n if (next.path) openDiffView(next.path)\n }\n\n return renderDock(React.createElement(DiffBox, {\n mode: 'chat',\n dock: true,\n fileTotal: paths.length,\n onOpenNextFile: click,\n }), sessionId || 'chat')\n}\n","/**\n * dsh-vscode-mode client — 兼容层:设置桥选择 / slot 安全注册 / openPath 链式补丁 / 外部插件常量。\n * 纯逻辑与薄 ctx 胶水,node 环境可单测(不依赖 DOM)。\n * 作者 ddj 2026年08月24号\n */\n\n/** 本插件包名(与 host compat.PLUGIN_NAME 对应)。 */\nexport const PLUGIN_NAME = 'dsh-vscode-mode'\n/** 外部侧栏插件名(dsh-web-ui-all 家族的文件打开能力提供方)。 */\nexport const SIDEBAR_PLUGIN = 'dsh-better-sidebar'\n\n/** 设置 scope 的跨组件上下文形状(与官方 settingsScope 绑定的最小面)。 */\nexport interface SettingsScopeLike {\n getSnapshot: () => { status?: string; value?: { fileOpenTool?: unknown; keybindings?: Record<string, string> }; writable?: boolean }\n subscribe: (listener: () => void) => () => void\n set: (field: string, value: unknown) => Promise<void>\n}\n\n/**\n * 设置桥三级优先:webUiSettings(linxin666 兼容桥)→ settingsScope(官方)→ 无。\n * 桥绑定抛错时降级到下一级,不让单个桥异常拖垮设置装配。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 激活的桥名称与绑定 scope\n */\nexport function pickSettingsBinder(ctx: { get: (name: string) => unknown }): { service: string; scope: SettingsScopeLike | undefined } {\n for (const service of ['webUiSettings', 'settingsScope']) {\n try {\n const binder = ctx.get(service) as { bind?: (spec: { namespace: string }) => SettingsScopeLike } | undefined\n const scope = binder?.bind?.({ namespace: PLUGIN_NAME })\n if (scope) return { service, scope }\n } catch {\n /* 桥异常时降级到下一级 */\n }\n }\n return { service: 'none', scope: undefined }\n}\n\n/** slot 注册描述(对齐 ctx.slots.register 的形状)。 */\nexport interface SlotSpec {\n name: string\n id: string\n order?: number\n label?: string\n inject?: (sessionId: string) => object\n}\n\n/**\n * 跨版本 slot 安全注册:封装 ctx.slots.inject 等待声明模式(新老 DSH 通用),\n * 服务缺失或注册抛错时降级为警告,不让单条 slot 拖垮装配。\n * 注意:方法必须挂在服务对象上调用(slots.register 是依赖 this.records 的类方法,\n * 解构后 this 丢失会静默失败),故禁止解构。\n * @author ddj 2026年08月24号\n * @param ctx 客户端上下文(slots 服务)\n * @param spec slot 描述\n * @param render 渲染函数\n * @returns 注销函数(未注册返回 null;形态切换时用于卸载旧 slot)\n */\nexport function registerSlotSafely(ctx: { slots?: { inject?: (name: string, register: () => unknown) => unknown; register?: (...args: unknown[]) => unknown } }, spec: SlotSpec, render: (props: unknown) => unknown): (() => void) | null {\n const slots = ctx?.slots as { inject: (name: string, register: () => unknown) => unknown; register: (...args: unknown[]) => unknown } | undefined\n if (!slots || typeof slots.inject !== 'function' || typeof slots.register !== 'function') {\n console.warn('[' + PLUGIN_NAME + '] slots 服务不可用,跳过 slot ' + spec.name)\n return null\n }\n try {\n const disposer = slots.inject(spec.name, () => slots.register(spec, render))\n return typeof disposer === 'function' ? disposer as () => void : null\n } catch (error) {\n console.warn('[' + PLUGIN_NAME + '] slot ' + spec.name + ' 注册失败(' + String(error) + '),已跳过')\n return null\n }\n}\n\n/**\n * 链式补丁对象方法:保存原实现、装入包装实现,dispose 恢复。\n * 恢复带归属校验(仅当当前实现仍是本包装时还原),多插件补丁按栈序互不踩踏。\n * @author ddj 2026年08月24号\n * @param owner 目标对象\n * @param key 方法名\n * @param wrapper 包装实现(original 为补丁前的实现)\n * @returns 恢复函数(幂等)\n */\nexport function patchMethod<T extends object, K extends keyof T>(\n owner: T,\n key: K,\n wrapper: (original: T[K], ...args: never[]) => unknown,\n): () => void {\n const original = owner[key]\n const patched = ((...args: never[]) => wrapper(original, ...args)) as T[K]\n owner[key] = patched\n return () => {\n if (owner[key] === patched) owner[key] = original\n }\n}\n","/**\n * dsh-vscode-mode client — 文件打开器注册表与自动选择。\n * @author ddj 2026年08月24号\n */\nimport { SIDEBAR_PLUGIN } from './compat.js'\n\nexport const AUTO_OPEN_TOOL = 'auto'\nexport const SYSTEM_OPEN_TOOL = 'system'\nexport const VSCODE_OPEN_TOOL = 'dsh-vscode-mode'\nexport const SIDEBAR_OPEN_TOOL = SIDEBAR_PLUGIN\n\nexport interface FileOpenContext {\n sessionId?: string\n cwd?: string\n}\n\nexport interface FileOpener {\n id: string\n label: string\n description?: string\n priority?: number\n isAvailable?: () => boolean\n open: (path: string, context: FileOpenContext) => void | Promise<void>\n}\n\nexport interface FileOpenerRegistry {\n register(opener: FileOpener): () => void\n registerFileOpener(opener: FileOpener): () => void\n list(): readonly FileOpener[]\n subscribe(listener: () => void): () => void\n get(id: string): FileOpener | undefined\n}\n\n/**\n * 写入外部打开器并触发注册表通知。\n * @author ddj 2026年08月24号\n * @param entries 打开器存储\n * @param notify 变更通知\n * @param opener 打开器\n */\nfunction registryRegister(entries: Map<string, FileOpener>, notify: () => void, opener: FileOpener): void {\n if (!opener.id || typeof opener.open !== 'function') throw new TypeError('文件打开器必须提供 id 和 open')\n entries.set(opener.id, opener)\n notify()\n}\n\n/**\n * 创建生命周期独立的文件打开器注册表。\n * @author ddj 2026年08月24号\n * @returns 文件打开器注册表\n */\nexport function createFileOpenerRegistry(): FileOpenerRegistry {\n const entries = new Map<string, FileOpener>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) listener()\n }\n const list = (): readonly FileOpener[] => [...entries.values()].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n return {\n register(opener: FileOpener): () => void {\n registryRegister(entries, notify, opener)\n return () => {\n if (entries.get(opener.id) !== opener) return\n entries.delete(opener.id)\n notify()\n }\n },\n registerFileOpener(opener: FileOpener): () => void {\n registryRegister(entries, notify, opener)\n return () => {\n if (entries.get(opener.id) !== opener) return\n entries.delete(opener.id)\n notify()\n }\n },\n list,\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n get: (id: string) => entries.get(id),\n }\n}\n\n/**\n * 检查打开器当前是否可用。\n * @author ddj 2026年08月24号\n * @param opener 待检查打开器\n * @returns 是否可用\n */\nexport function isAvailable(opener: FileOpener): boolean {\n try {\n return opener.isAvailable ? opener.isAvailable() : true\n } catch {\n return false\n }\n}\n\n/**\n * 返回当前可展示的文件打开器。\n * @author ddj 2026年08月24号\n * @param registry 文件打开器注册表\n * @returns 可用打开器列表\n */\nexport function availableOpeners(registry: FileOpenerRegistry): FileOpener[] {\n return registry.list().filter(isAvailable)\n}\n\n/**\n * 按设置选择打开器,不可用时回退自动优先级。\n * @author ddj 2026年08月24号\n * @param registry 文件打开器注册表\n * @param selected 用户选择的打开器 id\n * @returns 选中的打开器\n */\nexport function selectOpener(\n registry: FileOpenerRegistry,\n selected: string,\n): FileOpener | undefined {\n if (selected !== AUTO_OPEN_TOOL) {\n const requested = registry.get(selected)\n if (requested && isAvailable(requested)) return requested\n }\n return availableOpeners(registry)[0]\n}\n\n/**\n * 结构化探测 dsh-better-sidebar 的文件打开能力。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 侧边栏打开器或 undefined\n */\nexport function scanSidebar(ctx: { get: (name: string) => unknown }): FileOpener | undefined {\n try {\n const service = ctx.get('betterSidebar') as {\n openFile?: (scope: { sessionId: string; cwd?: string }, path: string, title?: string) => void\n isTabEnabled?: (id: string) => boolean\n features?: readonly string[]\n getSnapshot?: () => { state?: unknown }\n } | undefined\n if (!service || typeof service.openFile !== 'function') return undefined\n const advertised = service.features?.includes('openFile') ?? true\n if (!advertised) return undefined\n const canOpen = typeof service.isTabEnabled !== 'function' || service.isTabEnabled('editor')\n if (!canOpen) return undefined\n return {\n id: SIDEBAR_OPEN_TOOL,\n label: 'dsh-better-sidebar',\n description: '在 dsh-web-ui-all 侧边栏编辑器中打开',\n priority: 80,\n isAvailable: () => typeof service.openFile === 'function'\n && (service.features?.includes('openFile') ?? true)\n && (typeof service.isTabEnabled !== 'function' || service.isTabEnabled('editor')),\n open: (path, context) => {\n if (!context.sessionId) throw new Error('当前没有活动会话')\n service.openFile!({ sessionId: context.sessionId, cwd: context.cwd }, path, baseName(path))\n },\n }\n } catch {\n return undefined\n }\n}\n\n/**\n * 从路径提取文件名。\n * @author ddj 2026年08月24号\n * @param path 文件路径\n * @returns 文件名\n */\nexport function baseName(path: string): string {\n const normalized = path.replace(/\\\\/g, '/')\n return normalized.slice(normalized.lastIndexOf('/') + 1) || path\n}\n","/**\n * dsh-vscode-mode client — 设置 scope 的跨组件上下文。\n * 绑定逻辑(webUiSettings 兼容桥 → 官方 settingsScope 降级)统一由 compat 层提供。\n * 作者 ddj 2026年08月24号\n */\nimport React from 'react'\nimport { pickSettingsBinder, type SettingsScopeLike } from './compat.js'\n\nexport type { SettingsScopeLike }\n\nexport const SettingsContext = React.createContext<SettingsScopeLike | undefined>(undefined)\n\n/**\n * 从 Cordis 服务绑定 VSCodeMode 设置 scope(兼容桥优先,官方次之)。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 设置 scope 或 undefined\n */\nexport function getSettingsScope(ctx: { get: (name: string) => unknown }): SettingsScopeLike | undefined {\n return pickSettingsBinder(ctx).scope\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — VSCodeMode 设置区「快捷键」管理页。\n * 命令目录来自 client/keybindings 的 COMMANDS;当前键位读 SettingsContext scope;\n * 编辑:行内录制(捕获下一次组合键),Esc 取消、Backspace/Delete 清空(未绑定);\n * 草稿 + 显式保存(scope.set('keybindings', draft));行级恢复 + 页级「恢复默认」;\n * 冲突键位(两命令同键位)标红警告;scope 外部变更且无未保存修改时回同步草稿。\n * 作者 ddj 2026-08-26\n */\nimport React from 'react'\nimport { SettingsContext } from '../settingsContext.js'\nimport { COMMANDS, chordFromEvent, parseChord } from '../keybindings.js'\nimport { defaultKeybindings, KEYBINDING_DEFAULTS, normalizeKeybindings } from '../../shared/keybindings.js'\n\n/**\n * 草稿化:默认值 + 设置值合并,空串归一为 null(未绑定)。\n * @param raw 设置 scope 的 keybindings 字段\n * @returns 草稿映射(id → 键位弦或 null)\n */\nexport function draftOf(raw) {\n const merged = { ...defaultKeybindings(), ...normalizeKeybindings(raw) }\n const out = {}\n for (const [id, chord] of Object.entries(merged)) out[id] = chord === '' ? null : chord\n return out\n}\n\n/**\n * 存库化:null(未绑定)转空串。\n * @param draft 草稿映射\n * @returns 可存储的键位映射\n */\nexport function storeOf(draft) {\n const out = {}\n for (const [id, chord] of Object.entries(draft)) out[id] = chord === null ? '' : chord\n return out\n}\n\n/**\n * 冲突检测:同一键位被多个命令占用 → 返回冲突命令 id 集合。\n * @param draft 草稿映射\n * @returns 冲突命令 id 集合\n */\nexport function conflictsOf(draft) {\n const byChord = new Map()\n for (const [id, chord] of Object.entries(draft)) {\n if (!chord) continue\n const list = byChord.get(chord) ?? []\n list.push(id)\n byChord.set(chord, list)\n }\n const out = new Set()\n for (const list of byChord.values()) {\n if (list.length > 1) for (const id of list) out.add(id)\n }\n return out\n}\n\n/**\n * 快捷键管理页主体。\n */\nexport function KeybindingsPanel() {\n const settings = React.useContext(SettingsContext)\n const snapshot = settings?.getSnapshot?.()\n const unavailable = !settings || snapshot?.status === 'unavailable'\n const notReady = snapshot?.status !== 'ready'\n const [draft, setDraft] = React.useState(() => draftOf(snapshot?.value?.keybindings))\n const [recording, setRecording] = React.useState(null) // 正在录制的命令 id\n const [dirty, setDirty] = React.useState(false)\n const [busy, setBusy] = React.useState(false)\n const [error, setError] = React.useState('')\n const [message, setMessage] = React.useState('')\n const dirtyRef = React.useRef(false)\n dirtyRef.current = dirty\n const lastKeyRef = React.useRef(JSON.stringify(draft)) // 草稿内容指纹(内容未变不 setState,防外部快照引用不稳导致循环)\n const snapshotValue = snapshot?.value?.keybindings\n\n // scope 外部变更(如重置/其他端写入)且无未保存修改时回同步草稿\n React.useEffect(() => {\n if (dirtyRef.current) return\n const next = draftOf(snapshotValue)\n const key = JSON.stringify(next)\n if (key === lastKeyRef.current) return\n lastKeyRef.current = key\n setDraft(next)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [snapshotValue])\n\n // 录制态:窗口捕获下一次组合键(preventDefault 防浏览器默认动作)\n React.useEffect(() => {\n if (!recording) return\n const onKey = (e) => {\n e.preventDefault()\n e.stopPropagation()\n if (e.key === 'Escape') { setRecording(null); return }\n if (e.key === 'Backspace' || e.key === 'Delete') {\n setDraft((prev) => Object.assign({}, prev, { [recording]: null }))\n setRecording(null)\n setDirty(true)\n return\n }\n const chord = chordFromEvent(e)\n if (!chord) return\n setDraft((prev) => Object.assign({}, prev, { [recording]: chord }))\n setRecording(null)\n setDirty(true)\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [recording])\n\n const conflicts = conflictsOf(draft)\n const save = () => {\n if (!settings?.set) { setError('设置服务不可用'); return }\n setBusy(true)\n setError('')\n setMessage('')\n settings.set('keybindings', storeOf(draft)).then(() => {\n setDirty(false)\n lastKeyRef.current = JSON.stringify(draft)\n setMessage('已保存')\n }).catch((e) => setError(String(e))).finally(() => setBusy(false))\n }\n\n /**\n * 恢复全部默认(确认后直接保存,一步到位)。\n */\n const resetAll = () => {\n if (!settings?.set) { setError('设置服务不可用'); return }\n if (!window.confirm('恢复全部快捷键为默认值?')) return\n setBusy(true)\n setError('')\n setMessage('')\n settings.set('keybindings', { ...defaultKeybindings() }).then(() => {\n const next = draftOf({})\n setDraft(next)\n lastKeyRef.current = JSON.stringify(next)\n setDirty(false)\n setMessage('已恢复默认')\n }).catch((e) => setError(String(e))).finally(() => setBusy(false))\n }\n\n /** 行级恢复该项默认值(进草稿,随保存提交)。 */\n const resetRow = (id) => {\n setDraft((prev) => Object.assign({}, prev, { [id]: KEYBINDING_DEFAULTS[id] ?? null }))\n setDirty(true)\n }\n\n const rows = COMMANDS.map((command) => {\n const chord = draft[command.id] ?? null\n const conflict = chord !== null && conflicts.has(command.id)\n const invalid = chord !== null && parseChord(chord) === null\n const recordingRow = recording === command.id\n let display\n if (recordingRow) {\n display = React.createElement('span', { className: 'vsm-kb-rec' }, '按下组合键…(Esc 取消 / Backspace 清除)')\n } else {\n display = React.createElement('kbd', { className: 'vsm-kb-key' + (conflict ? ' warn' : '') + (invalid ? ' invalid' : '') },\n chord ?? '未绑定')\n }\n return React.createElement('div', { key: command.id, className: 'vsm-kb-row' + (recordingRow ? ' rec' : '') },\n React.createElement('div', { className: 'vsm-kb-label' },\n React.createElement('span', null, command.label),\n conflict && React.createElement('small', { className: 'vsm-kb-warn' }, '与另一命令冲突'),\n invalid && React.createElement('small', { className: 'vsm-kb-warn' }, '键位格式无效')),\n display,\n React.createElement('div', { className: 'vsm-kb-actions' },\n recordingRow\n ? React.createElement('button', { onClick: () => setRecording(null) }, '取消')\n : React.createElement(React.Fragment, null,\n React.createElement('button', { disabled: unavailable || notReady || busy || snapshot?.writable === false, onClick: () => { setRecording(command.id); setMessage('') } }, '编辑'),\n React.createElement('button', { disabled: busy, onClick: () => resetRow(command.id) }, '恢复')),\n ))\n })\n\n return React.createElement('section', { className: 'vsm-general-page' },\n React.createElement('h2', null, '快捷键'),\n React.createElement('p', null, '配置编辑器视图的快捷键(保存 / 快速打开 / 侧边栏 / 搜索)。修改即时写入配置,重新聚焦编辑器后生效。'),\n unavailable && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, '设置服务暂不可用,当前使用默认键位。'),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n message && React.createElement('div', { className: 'vsm-kb-message' }, message),\n React.createElement('section', { className: 'vsm-panel' },\n React.createElement('h3', { className: 'vsm-panel-title' }, '编辑器键位'),\n React.createElement('div', { className: 'vsm-panel-body' }, React.createElement('div', { className: 'vsm-kb-list' }, rows)),\n React.createElement('div', { className: 'vsm-panel-body vsm-kb-actionsbar' },\n React.createElement('span', { className: 'vsm-kb-dirty' }, dirty ? '有未保存的修改' : ''),\n React.createElement('button', { className: 'vsm-primary vsm-small', disabled: unavailable || notReady || busy || snapshot?.writable === false || !dirty, onClick: save }, busy ? '保存中…' : '保存'),\n React.createElement('button', { className: 'vsm-small', disabled: unavailable || notReady || busy || snapshot?.writable === false, onClick: resetAll }, '恢复默认')),\n ),\n )\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 「语言服务器」设置子 Tab。\n * 四视图:服务器(状态 + 每语言启用/命令/路径)|已安装(卸载/更新)|市场(Open VSX 搜索/安装 + 本地 vsix)|更新。\n * 状态经 edrv.lsp.status,配置经 edrv.lsp.configGet/Update,扩展经 edrv.lsp.ext.*。\n * 作者 ddj 2026-08-27\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport '../styles/mcp.css'\n\nconst LANGUAGES = [\n { id: 'lua', label: 'Lua(EmmyLua / LuaLS)', hint: '优先使用已安装 EmmyLua;未安装时回退 LuaLS 或 PATH 中的 lua-language-server' },\n { id: 'csharp', label: 'C#(Roslyn / OmniSharp)', hint: '需 dotnet + ms-dotnettools.csharp 的 .roslyn 服务器,或手动指定' },\n]\n\nconst PHASE_LABEL = {\n idle: '未启动', starting: '启动中', ready: '就绪', indexing: '索引中', unavailable: '不可用', stopped: '已停止',\n}\nconst SOURCE_LABEL = { extension: '扩展', discover: '自动发现', manual: '手动配置', none: '未配置' }\nconst TABS = [\n { id: 'servers', label: '服务器' },\n { id: 'installed', label: '已安装' },\n { id: 'market', label: '市场' },\n { id: 'updates', label: '更新' },\n]\n\n/** 语言卡片:状态 + 启用开关 + 命令/路径配置 + 重新检测。 */\nfunction LangCard({ lang, config, status, busy, onToggle, onSave, onRedetect }) {\n const [pathDraft, setPathDraft] = React.useState(config?.path ?? '')\n const [commandDraft, setCommandDraft] = React.useState(config?.command ?? '')\n React.useEffect(() => { setPathDraft(config?.path ?? ''); setCommandDraft(config?.command ?? '') }, [config?.path, config?.command])\n const phase = status?.phase ?? 'idle'\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' },\n React.createElement('span', { className: 'vsm-mcp-dot ' + (phase === 'ready' || phase === 'indexing' ? 'connected' : phase === 'unavailable' ? 'error' : 'disabled') }),\n lang.label),\n React.createElement('div', { className: 'vsm-mcp-actions' },\n React.createElement('button', { className: 'vsm-switch ' + (config?.enabled !== false ? 'on' : ''), onClick: () => onToggle(lang.id, config?.enabled !== false ? false : true), 'aria-label': '启用/禁用' }, config?.enabled !== false ? '●' : '○'))),\n React.createElement('div', { className: 'vsm-mcp-meta' },\n PHASE_LABEL[phase] ?? phase, ' · ', SOURCE_LABEL[status?.source] ?? status?.source,\n status?.providerName ? ' · ' + status.providerName : '',\n status?.version ? ' · v' + status.version : '',\n (phase === 'ready' && status?.root) ? ' · ' + String(status.root).split(/[\\\\/]/).pop() : ''),\n status?.reason ? React.createElement('div', { className: 'vsm-mcp-error' }, status.reason) : null,\n React.createElement('div', { className: 'vsm-lsp-form' },\n React.createElement('label', null, React.createElement('span', null, '可执行文件路径(绝对路径,优先)'), React.createElement('input', { value: pathDraft, placeholder: '如 C:/.../lua-language-server.exe', onChange: (e) => setPathDraft(e.target.value) })),\n React.createElement('label', null, React.createElement('span', null, '命令名(PATH 内查找)'), React.createElement('input', { value: commandDraft, placeholder: '如 lua-language-server', onChange: (e) => setCommandDraft(e.target.value) })),\n React.createElement('button', { className: 'vsm-primary', disabled: busy === lang.id, onClick: () => onSave(lang.id, pathDraft, commandDraft) }, busy === lang.id ? '保存中…' : '保存配置'),\n React.createElement('button', { className: 'vsm-primary vsm-small', disabled: busy === lang.id, onClick: () => onRedetect(lang.id), title: '清缓存并重新选择语言服务器(EmmyLua / LuaLS)' }, busy === lang.id ? '检测中…' : '重新检测')),\n React.createElement('div', { className: 'vsm-lsp-hint' }, lang.hint))\n}\n\n/** 已装扩展卡片:清单 + 卸载/更新。 */\nfunction InstalledCard({ ext, busy, onUninstall, onUpdate }) {\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' },\n React.createElement('span', { className: 'vsm-mcp-dot connected' }),\n React.createElement('span', null, ext.displayName || ext.name),\n React.createElement('span', { className: 'vsm-ext-ver' }, ext.id + ' · v' + ext.version)),\n React.createElement('div', { className: 'vsm-mcp-actions' },\n React.createElement('button', { className: 'vsm-primary vsm-small', disabled: busy === ext.id, onClick: () => onUpdate(ext) }, '更新'),\n React.createElement('button', { className: 'vsm-danger vsm-small', disabled: busy === ext.id, onClick: () => onUninstall(ext) }, '卸载'))),\n ext.description ? React.createElement('div', { className: 'vsm-lsp-hint' }, ext.description) : null)\n}\n\n/** 市场条目卡片:安装/已装态。 */\nfunction MarketCard({ item, installed, busy, onInstall }) {\n const has = installed.some((e) => e.id === item.id)\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' },\n React.createElement('span', { className: 'vsm-mcp-dot ' + (has ? 'connected' : 'disabled') }),\n React.createElement('span', null, item.displayName || item.name),\n React.createElement('span', { className: 'vsm-ext-ver' }, item.id + ' · v' + item.version)),\n React.createElement('div', { className: 'vsm-mcp-actions' },\n React.createElement('button', { className: 'vsm-primary vsm-small', disabled: has || busy === item.id, onClick: () => onInstall(item) }, has ? '已安装' : '安装'))),\n item.description ? React.createElement('div', { className: 'vsm-lsp-hint' }, item.description) : null)\n}\n\n/**\n * 语言服务器设置页:服务器状态/配置 + VSIX 扩展(安装/更新/卸载三视图)。\n * @author ddj 2026年08月27号\n */\nexport function LspSettings() {\n const [tab, setTab] = React.useState('servers')\n const [config, setConfig] = React.useState({})\n const [servers, setServers] = React.useState([])\n const [installed, setInstalled] = React.useState([])\n const [updates, setUpdates] = React.useState([])\n const [market, setMarket] = React.useState([])\n const [query, setQuery] = React.useState('')\n const [vsixPath, setVsixPath] = React.useState('')\n const [busy, setBusy] = React.useState('')\n const [error, setError] = React.useState('')\n const [loading, setLoading] = React.useState(true)\n\n const refreshServers = React.useCallback(() => {\n Promise.all([rpc('edrv.lsp.configGet', {}), rpc('edrv.lsp.status', {})])\n .then(([cfg, st]) => {\n if (cfg?.ok) setConfig(cfg.config ?? {})\n if (st?.ok) setServers(st.servers ?? [])\n setError('')\n })\n .catch((e) => setError(String(e)))\n }, [])\n\n const refreshExt = React.useCallback(() => {\n Promise.all([rpc('edrv.lsp.ext.list', {}), rpc('edrv.lsp.ext.updates', {})])\n .then(([l, u]) => {\n if (l?.ok) setInstalled(l.extensions ?? [])\n if (u?.ok) setUpdates(u.updates ?? [])\n setError('')\n })\n .catch((e) => setError(String(e)))\n }, [])\n\n const refresh = React.useCallback(() => {\n setLoading(true)\n Promise.all([refreshServers(), refreshExt()]).finally(() => setLoading(false))\n }, [refreshServers, refreshExt])\n\n React.useEffect(() => { refresh() }, [refresh])\n\n const switchTab = (next) => {\n setTab(next)\n setError('')\n if (next === 'market' && !query) setQuery('lua language server')\n if (next === 'installed' || next === 'updates') void refreshExt()\n if (next === 'servers') void refreshServers()\n }\n\n /** 合并 redetect/configUpdate 返回的服务器状态:只替换该语言条目。 */\n const mergeServers = (languageId, list) => {\n setServers((prev) => Array.isArray(list)\n ? [...prev.filter((s) => s.languageId !== languageId), ...list]\n : prev)\n }\n\n /** 重检测后通知编辑器:与 host 重新同步已打开的模型(触发重新 acquire)。 */\n const notifyResync = (languageId) => {\n window.dispatchEvent(new CustomEvent('edrv:lsp-redetect', { detail: { languageId } }))\n }\n\n const saveLang = (languageId, path, command) => {\n setBusy(languageId)\n setError('')\n rpc('edrv.lsp.configUpdate', { languageId, path, command })\n .then((res) => {\n if (!res?.ok) { setError(res?.error ?? '保存失败'); return }\n setConfig(res.config ?? {})\n mergeServers(languageId, res.servers)\n notifyResync(languageId) // 保存后自动重新检测 + 同步模型\n })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n const toggleLang = (languageId, enabled) => {\n setBusy(languageId)\n rpc('edrv.lsp.configUpdate', { languageId, enabled })\n .then((res) => {\n if (!res?.ok) { setError(res?.error ?? '切换失败'); return }\n setConfig(res.config ?? {})\n mergeServers(languageId, res.servers)\n notifyResync(languageId) // 切换启用状态后自动重新检测 + 同步模型\n })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n const redetectLang = (languageId) => {\n setBusy(languageId)\n setError('')\n rpc('edrv.lsp.redetect', { languageId })\n .then((res) => {\n if (!res?.ok) { setError(res?.error ?? '重新检测失败'); return }\n mergeServers(languageId, res.servers)\n notifyResync(languageId)\n })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n const searchMarket = () => {\n if (!query.trim()) return\n setBusy('__market')\n setError('')\n rpc('edrv.lsp.ext.market', { query: query.trim(), size: 12 })\n .then((res) => {\n if (res?.ok) setMarket(res.extensions ?? [])\n else setError(res?.error ?? '搜索失败')\n })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n const installMarket = (item) => {\n setBusy(item.id)\n setError('')\n rpc('edrv.lsp.ext.install', { namespace: item.namespace, name: item.name })\n .then((res) => {\n if (!res?.ok) { setError(res?.error ?? '安装失败'); return }\n void refreshExt()\n })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n const installLocal = () => {\n if (!vsixPath.trim()) return\n setBusy('__vsix')\n setError('')\n rpc('edrv.lsp.ext.install', { vsixPath: vsixPath.trim() })\n .then((res) => {\n if (!res?.ok) { setError(res?.error ?? '安装失败'); return }\n setVsixPath('')\n void refreshExt()\n })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n const uninstallExt = (ext) => {\n if (!window.confirm('卸载扩展 ' + ext.id + '?')) return\n setBusy(ext.id)\n setError('')\n rpc('edrv.lsp.ext.uninstall', { id: ext.id })\n .then((res) => {\n if (!res?.ok) setError(res?.error ?? '卸载失败')\n void refreshExt()\n })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n const updateExt = (ext) => {\n setBusy(ext.id)\n setError('')\n rpc('edrv.lsp.ext.update', { id: ext.id })\n .then((res) => {\n if (!res?.ok) setError(res?.error ?? '更新失败')\n void refreshExt()\n })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n if (loading) return React.createElement('div', { className: 'vsm-mcp-empty' }, '正在读取语言服务器状态…')\n const nav = React.createElement('nav', { className: 'vsm-mcp-tabs' },\n TABS.map((t) => React.createElement('button', { key: t.id, className: tab === t.id ? 'active' : '', onClick: () => switchTab(t.id) }, t.label)))\n const header = React.createElement('div', { className: 'vsm-mcp-header' },\n React.createElement('div', null,\n React.createElement('h2', null, '语言服务器(LSP)'),\n React.createElement('p', null, '代码索引 / 引用查找 / 动态跳转;可安装 VSIX 语言服务器扩展(Open VSX 市场 / 本地 .vsix)。')),\n React.createElement('button', { className: 'vsm-primary', onClick: refresh }, '↻ 刷新'))\n const banner = error ? React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error) : null\n\n /** 线框面板容器:标题 + 内容体。 */\n const panel = (title, children) => React.createElement('section', { className: 'vsm-panel' },\n React.createElement('h3', { className: 'vsm-panel-title' }, title),\n React.createElement('div', { className: 'vsm-panel-body' }, children),\n )\n\n let body = null\n if (tab === 'servers') {\n body = panel('语言服务器', React.createElement(React.Fragment, null,\n LANGUAGES.map((lang) => React.createElement(LangCard, {\n key: lang.id, lang,\n config: config[lang.id] ?? {},\n status: servers.find((s) => s.languageId === lang.id),\n busy, onToggle: toggleLang, onSave: saveLang, onRedetect: redetectLang,\n })),\n React.createElement('div', { className: 'vsm-lsp-hint' }, '提示:打开 Lua/C# 文件即自动(惰性)启动对应语言服务器;未配置时编辑器功能不受影响,大纲回退内置解析。')))\n } else if (tab === 'installed') {\n body = panel('已安装扩展', React.createElement(React.Fragment, null,\n React.createElement('div', { className: 'vsm-lsp-hint' }, '已安装的语言服务器扩展(存于 ~/.dsh/dsh-vscode-mode/extensions/)。语言服务器被自动发现为「扩展」源。'),\n installed.length ? installed.map((ext) => React.createElement(InstalledCard, { key: ext.id, ext, busy, onUninstall: uninstallExt, onUpdate: updateExt }))\n : React.createElement('div', { className: 'vsm-mcp-empty' }, '还没有安装扩展(去「市场」或指定本地 .vsix)')))\n } else if (tab === 'market') {\n body = panel('扩展市场', React.createElement(React.Fragment, null,\n React.createElement('div', { className: 'vsm-lsp-form' },\n React.createElement('label', null, React.createElement('span', null, '搜索 Open VSX 市场'), React.createElement('input', { value: query, placeholder: '如 sumneko.lua / lua language server', onChange: (e) => setQuery(e.target.value), onKeyDown: (e) => { if (e.key === 'Enter') searchMarket() } })),\n React.createElement('button', { className: 'vsm-primary', disabled: busy === '__market', onClick: searchMarket }, busy === '__market' ? '搜索中…' : '搜索')),\n React.createElement('div', { className: 'vsm-lsp-form' },\n React.createElement('label', null, React.createElement('span', null, '安装本地 .vsix 文件(服务器绝对路径)'), React.createElement('input', { value: vsixPath, placeholder: '如 C:/Downloads/sumneko.lua-3.19.1.vsix', onChange: (e) => setVsixPath(e.target.value) })),\n React.createElement('button', { className: 'vsm-primary', disabled: busy === '__vsix', onClick: installLocal }, busy === '__vsix' ? '安装中…' : '安装本地 .vsix')),\n React.createElement('div', { className: 'vsm-lsp-hint' }, '市场安装会下载并解包 VSIX 到扩展目录;含语言服务器(如 sumneko.lua)的扩展会被自动发现。'),\n market.map((item) => React.createElement(MarketCard, { key: item.id, item, installed, busy, onInstall: installMarket }))))\n } else {\n body = panel('可用更新', React.createElement(React.Fragment, null,\n React.createElement('div', { className: 'vsm-lsp-hint' }, '已装扩展与 Open VSX 最新版的差异。'),\n updates.length ? updates.map((u) => React.createElement('article', { key: u.id, className: 'vsm-mcp-card' },\n React.createElement('div', { className: 'vsm-mcp-card-head' },\n React.createElement('div', { className: 'vsm-mcp-title' },\n React.createElement('span', { className: 'vsm-mcp-dot error' }),\n React.createElement('span', null, u.displayName || u.id),\n React.createElement('span', { className: 'vsm-ext-ver' }, 'v' + u.current + ' → v' + u.latest)),\n React.createElement('div', { className: 'vsm-mcp-actions' },\n React.createElement('button', { className: 'vsm-primary vsm-small', disabled: busy === u.id, onClick: () => updateExt(u) }, busy === u.id ? '更新中…' : '更新')))))\n : React.createElement('div', { className: 'vsm-mcp-empty' }, '全部已是最新')))\n }\n return React.createElement('div', null, header, nav, banner, body)\n}\n","/**\n * dsh-vscode-mode client — 「性能优化」页工作区栏目展开状态持久化(纯函数,可单测)。\n * 只持久化「已展开」的工作区键集合(默认全部折叠),对齐 explorerCache 的做法:\n * 不缓存会话条目本身,条目由 edrv.perf.inventory 实时返回。\n * 键前缀统一走 paths.ts PathConst(CACHE_KEY.workspaceFold)。\n * 作者 ddj 2026-09-02\n */\nimport { CACHE_KEY } from '../paths.js'\n\n/** localStorage 键(全局,不按会话隔离)。 */\nconst STORE_KEY = CACHE_KEY.workspaceFold\n\n/** 展开键容量上限:超出丢弃尾部,防止无限增长撑爆配额。 */\nexport const FOLD_CAP = 300\n\n/**\n * 归一化工作区键:仅去首尾空白(工作区键非文件系统路径,不做斜杠转换)。\n * @author ddj 2026年09月02号\n * @param key 工作区标识\n * @returns 归一化键,空值返回 ''\n */\nexport function normalizeFoldKey(key: string | undefined | null): string {\n return String(key ?? '').trim()\n}\n\n/**\n * 裁剪展开键集:去重、丢弃空值、超容量丢弃尾部(保持传入顺序)。\n * @author ddj 2026年09月02号\n * @param expanded 原始展开键集合\n * @returns 规范化后的键数组\n */\nexport function sanitizeFolded(expanded: unknown): string[] {\n if (!Array.isArray(expanded)) return []\n const seen = new Set<string>()\n const out: string[] = []\n for (const item of expanded) {\n const key = normalizeFoldKey(typeof item === 'string' ? item : '')\n if (!key || seen.has(key)) continue\n seen.add(key)\n out.push(key)\n if (out.length >= FOLD_CAP) break\n }\n return out\n}\n\n/**\n * 序列化展开状态(JSON,带 schema 版本号)。\n * @author ddj 2026年09月02号\n * @param expanded 已展开的项目键集合\n * @returns JSON 字符串\n */\nexport function serializeFold(expanded: string[]): string {\n return JSON.stringify({ v: 1, expanded: sanitizeFolded(expanded) })\n}\n\n/**\n * 解析缓存文本;损坏/格式不符 → 空集合。\n * @author ddj 2026年09月02号\n * @param text localStorage 原文\n * @returns 已展开键集合\n */\nexport function parseFold(text: string | null): string[] {\n if (!text) return []\n try {\n const data = JSON.parse(text)\n if (!data || typeof data !== 'object') return []\n return sanitizeFolded(data.expanded)\n } catch (error) {\n return []\n }\n}\n\n/**\n * 读取展开状态(localStorage 不可用 → 空集合)。\n * @author ddj 2026年09月02号\n * @returns 已展开键集合\n */\nexport function foldLoad(): string[] {\n try {\n return parseFold(window.localStorage.getItem(STORE_KEY))\n } catch (error) {\n return []\n }\n}\n\n/**\n * 写入展开状态(配额满/隐私模式失败静默)。\n * @author ddj 2026年09月02号\n * @param expanded 已展开键集合\n */\nexport function foldSave(expanded: string[]): void {\n try {\n window.localStorage.setItem(STORE_KEY, serializeFold(expanded))\n } catch (error) { /* 配额满/隐私模式忽略 */ }\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — PerfSettings:「性能优化」设置子页(会话卫生 + 压缩调优)。\n * - 会话盘点:全工作区/每会话体积、活跃标记,按体积排序;\n * - 移出到归档(先规划→确认→执行→可恢复)与归档清除;\n * - DSH 内置压缩调优:写 profile patch(compaction-basic / tool-result-pruner 更低阈值,\n * 带备份与撤销,需重启生效);\n * - 侧车摘要用法提示(agent/脚本取关键字段,不整份读 .dsh-edit-review.json)。\n * 作者 ddj 2026-09-02\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { foldLoad, foldSave, normalizeFoldKey } from '../state/workspaceFoldCache.js'\nimport '../styles/mcp.css'\n\n/** 字节数人类可读。 */\nfunction formatBytes(n) {\n if (!n) return '0B'\n if (n >= 1024 * 1024) return (n / (1024 * 1024)).toFixed(1) + 'MB'\n if (n >= 1024) return (n / 1024).toFixed(0) + 'KB'\n return n + 'B'\n}\n\n/** 会话行 key:workspaceKey \\u0000 sessionId。 */\nconst keyOf = (ws, id) => ws + '\\u0000' + id\n\n/** 工作区列表每页条数。 */\nconst PAGE_SIZE = 7\n\n/**\n * 计算分页(纯函数,可单测)。\n * 作者 ddj 2026年09月02号\n * @param total 总条数\n * @param pageSize 每页条数\n * @param page 当前页码(1 起)\n * @returns 归一化后的分页信息(page 被夹到有效范围)\n */\nexport function paginate(total, pageSize, page) {\n const size = Math.max(1, Math.floor(pageSize) || 1)\n const pages = Math.max(1, Math.ceil(total / size))\n const current = Math.min(Math.max(1, Math.floor(page) || 1), pages)\n const start = (current - 1) * size\n return { page: current, pages, pageSize: size, start, end: Math.min(start + size, total), total }\n}\n\n/**\n * 取当前页切片(纯函数,可单测)。\n * 作者 ddj 2026年09月02号\n * @param items 全量列表\n * @param page 当前页码(1 起)\n * @param pageSize 每页条数\n * @returns 当前页子数组\n */\nexport function pageSlice(items, page, pageSize) {\n const list = items ?? []\n const { start, end } = paginate(list.length, pageSize, page)\n return list.slice(start, end)\n}\n\n/** 单行会话。 */\nfunction SessionRow({ row, checked, disabled, onToggle }) {\n const age = Math.max(0, (Date.now() - row.mtime) / (24 * 3600 * 1000))\n const when = age < 1 ? Math.round(age * 24) + 'h' : Math.round(age) + 'd'\n return React.createElement('label', { className: 'vsm-perf-row' },\n React.createElement('input', { type: 'checkbox', checked, disabled, onChange: onToggle }),\n React.createElement('span', { className: 'vsm-perf-cell vsm-perf-id', title: row.sessionId }, row.sessionId),\n React.createElement('span', { className: 'vsm-perf-cell vsm-perf-size ' + (row.bytes >= 1024 * 1024 ? 'big' : '') }, formatBytes(row.bytes)),\n React.createElement('span', { className: 'vsm-perf-cell vsm-perf-mtime', title: new Date(row.mtime).toLocaleString() }, when),\n row.active ? React.createElement('span', { className: 'vsm-perf-cell vsm-perf-active' }, '活跃') : null,\n )\n}\n\n/**\n * 工作区列表分页器:顶部文案 + 上一页/下一页交互。\n * 作者 ddj 2026年09月02号\n * @param {object} info paginate() 的分页信息\n * @param {Function} onPrev 上一页回调\n * @param {Function} onNext 下一页回调\n */\nfunction WorkspacePager({ info, onPrev, onNext }) {\n const { page, pages, start, end, total } = info\n return React.createElement('div', { className: 'vsm-perf-pager' },\n React.createElement('span', { className: 'vsm-perf-pager-text' },\n total ? `第 ${start + 1}–${end} 个 / 共 ${total} 个工作区(第 ${page}/${pages} 页)` : '暂无工作区',\n ),\n React.createElement('div', { className: 'vsm-perf-pager-actions' },\n React.createElement('button', { className: 'vsm-secondary vsm-small', onClick: onPrev, disabled: page <= 1 }, '‹ 上一页'),\n React.createElement('button', { className: 'vsm-secondary vsm-small', onClick: onNext, disabled: page >= pages }, '下一页 ›'),\n ),\n )\n}\n\n/**\n * 工作区栏目(可展开/折叠),内含该工作区的会话行。\n * 作者 ddj 2026年09月02号\n * @param {object} ws 工作区汇总(workspaceKey / totalBytes)\n * @param {object[]} rows 该工作区的会话行\n * @param {boolean} expanded 是否展开\n * @param {Function} onToggleFold 展开/折叠切换回调\n * @param {object} selected 已选会话键集合\n * @param {boolean} locked 会话勾选是否禁用(移出执行中)\n * @param {Function} onToggleRow 单行勾选回调\n */\nfunction WorkspaceBlock({ ws, rows, expanded, onToggleFold, selected, locked, onToggleRow }) {\n const head = React.createElement('div', { className: 'vsm-perf-ws-head', role: 'button', tabIndex: 0, 'aria-expanded': expanded, onClick: onToggleFold, onKeyDown: (event) => {\n if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); onToggleFold() }\n } },\n React.createElement('span', { className: 'vsm-perf-ws-caret ' + (expanded ? 'open' : '') }, '▸'),\n React.createElement('span', { className: 'vsm-perf-ws-name', title: ws.workspaceKey }, ws.workspaceKey),\n React.createElement('span', { className: 'vsm-perf-ws-meta' }, rows.length + ' 会话 · ' + formatBytes(ws.totalBytes)),\n )\n if (!expanded) return React.createElement('div', { className: 'vsm-perf-ws' }, head)\n const body = rows.length ? rows.map((row) => React.createElement(SessionRow, {\n key: keyOf(row.workspaceKey, row.sessionId),\n row,\n checked: !!selected[keyOf(row.workspaceKey, row.sessionId)],\n disabled: row.active || locked,\n onToggle: () => onToggleRow(keyOf(row.workspaceKey, row.sessionId)),\n })) : React.createElement('div', { className: 'vsm-mcp-empty' }, '无会话')\n return React.createElement('div', { className: 'vsm-perf-ws expanded' }, head, React.createElement('div', { className: 'vsm-perf-rows' }, body))\n}\n\n/**\n * 会话卫生 + 压缩调优设置子页。\n * @author ddj 2026年09月02号\n */\nexport function PerfSettings() {\n const [inv, setInv] = React.useState(null)\n const [error, setError] = React.useState('')\n const [busy, setBusy] = React.useState('')\n const [selected, setSelected] = React.useState({})\n const [confirm, setConfirm] = React.useState(null)\n const [moved, setMoved] = React.useState(null)\n const [config, setConfig] = React.useState(null)\n const [expanded, setExpanded] = React.useState(() => foldLoad())\n const [page, setPage] = React.useState(1)\n\n React.useEffect(() => { foldSave(expanded) }, [expanded])\n\n /** 数据变化后把越界页码夹回有效范围。 */\n const workspaces = inv?.workspaces ?? []\n const pageInfo = paginate(workspaces.length, PAGE_SIZE, page)\n React.useEffect(() => {\n if (page !== pageInfo.page) setPage(pageInfo.page)\n }, [page, pageInfo.page])\n\n /** 切换某工作区栏目的展开/折叠(默认全折叠)。 */\n const toggleFold = (key) => setExpanded((old) => old.includes(key) ? old.filter((item) => item !== key) : old.concat(key))\n\n /** 切换单会话勾选。 */\n const toggleRow = (k) => setSelected((old) => { const next = { ...old }; if (next[k]) delete next[k]; else next[k] = true; return next })\n\n const load = React.useCallback(() => {\n setError('')\n Promise.all([rpc('edrv.perf.inventory', {}), rpc('edrv.perf.configGet', {})]).then(([i, c]) => {\n if (!i.ok) throw new Error(i.error)\n if (!c.ok) throw new Error(c.error)\n setInv(i)\n setConfig(c)\n }).catch((e) => setError(String(e)))\n }, [])\n\n React.useEffect(load, [load])\n\n const action = (id, method, args, patch) => {\n setBusy(id)\n setError('')\n return rpc(method, args).then((res) => {\n if (!res.ok) throw new Error(res.error)\n if (patch) patch(res)\n return res\n }).catch((e) => setError(String(e))).finally(() => setBusy(''))\n }\n\n /** 圈选 ≥ 1MB 的非活跃会话。 */\n const selectBig = () => {\n if (!inv) return\n const next = {}\n for (const s of inv.sessions) {\n if (s.bytes >= 1024 * 1024 && !s.active) next[keyOf(s.workspaceKey, s.sessionId)] = true\n }\n setSelected(next)\n }\n\n /** 清空选择。 */\n const clearSel = () => setSelected({})\n\n /** 规划移出所选(跨工作区按 sessionIds 一次规划)。 */\n const planMove = () => {\n const sessionIds = Object.keys(selected).map((k) => k.slice(k.indexOf('\\u0000') + 1))\n if (!sessionIds.length) return\n action('plan', 'edrv.perf.movePlan', { sessionIds }).then((res) => {\n if (res.items?.length) setConfirm(res)\n else setError('所选会话没有可移出的项(活跃会话已排除)')\n })\n }\n\n /** 确认移出:按工作区分组逐组执行,成功后刷新并记录可恢复项。 */\n const doMove = () => {\n const grouped = {}\n for (const item of confirm.items) {\n const list = grouped[item.workspaceKey] ?? (grouped[item.workspaceKey] = [])\n list.push(item.sessionId)\n }\n const jobs = Object.entries(grouped).map(([ws, sessionIds]) => rpc('edrv.perf.moveOut', { workspaceKey: ws, sessionIds }))\n Promise.all(jobs).then((results) => {\n const allMoved = []\n const failures = []\n for (const res of results) {\n if (!res.ok) { failures.push(res.error); continue }\n allMoved.push(...(res.moved ?? []))\n failures.push(...(res.failures ?? []).map((f) => f.sessionId + ': ' + f.error))\n }\n setMoved({ moved: allMoved, failures, reclaimedBytes: allMoved.reduce((s, i) => s + i.bytes, 0) })\n setConfirm(null)\n setSelected({})\n load()\n }).catch((e) => setError(String(e)))\n }\n\n /** 恢复单个已移出会话。 */\n const doRestore = (item) => {\n action('restore', 'edrv.perf.restore', { workspaceKey: item.workspaceKey, sessionId: item.sessionId }).then(() => {\n setMoved((old) => old ? { ...old, moved: old.moved.filter((m) => !(m.workspaceKey === item.workspaceKey && m.sessionId === item.sessionId)) } : old)\n load()\n })\n }\n\n /** 清除归档区早于 N 天的会话(破坏性)。 */\n const doPurge = () => {\n if (!window.confirm('确认永久删除归档区中 30 天前的会话?此操作不可恢复(仅归档区,不影响当前 sessions)。')) return\n action('purge', 'edrv.perf.purgeArchive', { olderThanDays: 30 }).then((res) => {\n setError('已清除 ' + (res.removed ?? 0) + ' 个归档会话,释放 ' + formatBytes(res.reclaimedBytes ?? 0))\n })\n }\n\n /** 应用压缩调优到 profile patch。 */\n const applyConfig = () => {\n action('apply', 'edrv.perf.configApply', {}).then((res) => {\n setError('已写入压缩调优配置(备份 ' + res.backup + '),重启 DSH 后生效')\n load()\n })\n }\n\n /** 撤销压缩调优。 */\n const undoConfig = () => {\n action('undo', 'edrv.perf.configUndo', {}).then(() => {\n setError('已撤销压缩调优配置(恢复备份)')\n load()\n })\n }\n\n const totals = inv?.totals\n const summaryCards = totals ? React.createElement('div', { className: 'vsm-perf-cards' },\n React.createElement('div', { className: 'vsm-perf-card' }, React.createElement('span', null, '工作区'), React.createElement('b', null, String(totals.workspaces))),\n React.createElement('div', { className: 'vsm-perf-card' }, React.createElement('span', null, '会话数'), React.createElement('b', null, String(totals.sessions))),\n React.createElement('div', { className: 'vsm-perf-card' }, React.createElement('span', null, '压缩态总体积'), React.createElement('b', { className: totals.totalBytes >= 50 * 1024 * 1024 ? 'big' : '' }, formatBytes(totals.totalBytes))),\n ) : null\n\n const visible = pageSlice(workspaces, pageInfo.page, PAGE_SIZE)\n const workspacePager = workspaces.length > PAGE_SIZE ? React.createElement(WorkspacePager, {\n info: pageInfo,\n onPrev: () => setPage((old) => Math.max(1, old - 1)),\n onNext: () => setPage((old) => Math.min(pageInfo.pages, old + 1)),\n }) : null\n const workspaceBlocks = workspaces.length ? React.createElement('div', { className: 'vsm-perf-ws-list' }, visible.map((ws) => {\n const key = normalizeFoldKey(ws.workspaceKey)\n return React.createElement(WorkspaceBlock, {\n key: ws.workspaceKey,\n ws,\n rows: inv.sessions.filter((s) => s.workspaceKey === ws.workspaceKey),\n expanded: expanded.includes(key),\n onToggleFold: () => toggleFold(key),\n selected,\n locked: busy === 'move',\n onToggleRow: toggleRow,\n })\n })) : null\n\n const selCount = Object.keys(selected).length\n const confirmBody = confirm ? React.createElement('div', { className: 'vsm-perf-modal' },\n React.createElement('div', { className: 'vsm-perf-modal-card' },\n React.createElement('h3', null, '确认移出 ' + confirm.items.length + ' 个会话?'),\n React.createElement('p', { className: 'vsm-perf-modal-note' }, '将从 ~/.dsh/sessions 移出到 ~/.dsh/sessions-archive(可逆,重启后不再回放,释放 ' + formatBytes(confirm.reclaimedBytes) + ')。活跃会话已排除。'),\n React.createElement('ul', { className: 'vsm-perf-modal-list' }, confirm.items.slice(0, 20).map((item) => React.createElement('li', { key: item.workspaceKey + item.sessionId }, item.workspaceKey + ' / ' + item.sessionId + '(' + formatBytes(item.bytes) + ')'))),\n confirm.items.length > 20 ? React.createElement('div', { className: 'vsm-perf-modal-more' }, '…等 ' + confirm.items.length + ' 个') : null,\n React.createElement('div', { className: 'vsm-perf-modal-actions' },\n React.createElement('button', { className: 'vsm-primary', onClick: doMove, disabled: busy === 'move' }, busy === 'move' ? '执行中…' : '确认移出'),\n React.createElement('button', { className: 'vsm-secondary', onClick: () => setConfirm(null) }, '取消'),\n ),\n ),\n ) : null\n\n const movedBody = moved?.moved?.length ? React.createElement('section', { className: 'vsm-panel' },\n React.createElement('h3', { className: 'vsm-panel-title' }, '已移出 ' + moved.moved.length + ' 个会话(释放 ' + formatBytes(moved.reclaimedBytes) + ')'),\n React.createElement('div', { className: 'vsm-panel-body' },\n React.createElement('div', { className: 'vsm-perf-rows' }, moved.moved.map((item) => React.createElement('div', { key: item.workspaceKey + item.sessionId, className: 'vsm-perf-row' },\n React.createElement('span', { className: 'vsm-perf-cell vsm-perf-id' }, item.sessionId),\n React.createElement('span', { className: 'vsm-perf-cell vsm-perf-size' }, formatBytes(item.bytes)),\n React.createElement('button', { className: 'vsm-secondary vsm-small', onClick: () => doRestore(item), disabled: busy === 'restore' }, '恢复'),\n ))),\n moved.failures?.length ? React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, '失败:' + moved.failures.join(';')) : null,\n ),\n ) : null\n\n const configBody = config ? React.createElement('section', { className: 'vsm-panel' },\n React.createElement('h3', { className: 'vsm-panel-title' }, 'DSH 内置压缩调优'),\n React.createElement('div', { className: 'vsm-panel-body' },\n React.createElement('p', null, '调低 compaction-basic / tool-result-pruner 触发阈值,让长循环会话更早压缩,降低模型可见上下文压力(减少 token 与防 context overflow)。'),\n React.createElement('p', { className: 'vsm-perf-note' }, '注意:压缩只追加 compaction 事件,不重写已持久化会话日志(append-only),因此不会缩小已存在的会话文件——存量瘦身请用上方「移出到归档」。packChunks 已默认开启,无需配置。'),\n React.createElement('div', { className: 'vsm-perf-config-state' },\n React.createElement('span', { className: 'vsm-perf-cell' }, '状态:' + (config.applied ? '已应用' : '未应用')),\n config.applied ? React.createElement('button', { className: 'vsm-secondary vsm-small', onClick: undoConfig, disabled: busy === 'undo' }, '撤销') : React.createElement('button', { className: 'vsm-primary vsm-small', onClick: applyConfig, disabled: busy === 'apply' }, '应用建议配置(需重启)'),\n ),\n React.createElement('pre', { className: 'vsm-perf-block' }, config.block),\n ),\n ) : null\n\n const guideBody = React.createElement('section', { className: 'vsm-panel' },\n React.createElement('h3', { className: 'vsm-panel-title' }, '侧车摘要(agent/脚本取关键字段,不整份读 sidecar)'),\n React.createElement('div', { className: 'vsm-panel-body' },\n React.createElement('p', null, '工作区根目录的 .dsh-edit-review.json(可能数 MB)只应通过摘要接口读取,禁止 agent 整份 read/write 进对话:'),\n React.createElement('pre', { className: 'vsm-perf-block' },\n \"curl -s -X POST http://127.0.0.1:3080/edrv/rpc -H 'content-type: application/json' -d '{\\\"method\\\":\\\"edrv.perf.sidecarSummary\\\",\\\"args\\\":{}}'\\n# 差异记录列表(含每文件 pending 摘要):edrv.list\\n# 历史归档:edrv.archiveList / edrv.archiveRead\"),\n ),\n )\n\n return React.createElement('section', { className: 'vsm-perf-page' },\n React.createElement('h2', null, '会话性能'),\n React.createElement('p', null, 'DSH 启动会回放 ~/.dsh/sessions 全部会话(V8 展开约 10×),体积越大内存越吃紧。定期把巨型/旧会话移出到归档可显著降低启动内存。'),\n error ? React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error) : null,\n summaryCards,\n React.createElement('section', { className: 'vsm-panel' },\n React.createElement('h3', { className: 'vsm-panel-title' }, '会话盘点'),\n React.createElement('div', { className: 'vsm-panel-body' },\n React.createElement('div', { className: 'vsm-perf-toolbar' },\n React.createElement('button', { className: 'vsm-secondary vsm-small', onClick: selectBig }, '圈选 ≥1MB 非活跃'),\n React.createElement('button', { className: 'vsm-secondary vsm-small', onClick: clearSel, disabled: !selCount }, '清空选择'),\n React.createElement('span', { className: 'vsm-perf-selcount' }, '已选 ' + selCount + ' 个'),\n React.createElement('button', { className: 'vsm-primary vsm-small', onClick: planMove, disabled: !selCount || busy === 'plan' }, busy === 'plan' ? '规划中…' : '移出所选'),\n React.createElement('button', { className: 'vsm-secondary vsm-small', onClick: doPurge, disabled: busy === 'purge' }, '清除归档(>30天)'),\n React.createElement('button', { className: 'vsm-secondary vsm-small', onClick: load, disabled: busy === 'load' }, '⟳ 刷新'),\n ),\n workspacePager,\n workspaceBlocks,\n ),\n ),\n movedBody,\n configBody,\n guideBody,\n confirmBody,\n )\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — VSCodeMode 设置区:通用 / 快捷键 / MCP 管理 / 语言服务器 / 性能优化 / 兼容性。\n * MCP 管理 Tab 下含三个子页签:我的 MCP(profile 全局)/ 项目 MCP(各项目 .mcp.json)/ MCP 市场(占位)。\n * 作者 ddj 2026年08月22号 / 2026年08月26号 / 2026年08月27号\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport type { MpcProject, MpcServer } from '../../shared/mcp.js'\nimport '../styles/mcp.css'\nimport { availableOpeners, AUTO_OPEN_TOOL } from '../fileOpeners.js'\nimport { SettingsContext } from '../settingsContext.js'\nimport { KeybindingsPanel } from './KeybindingsPanel.js'\nimport { LspSettings } from './LspSettings.js'\nimport { PerfSettings } from './PerfSettings.js'\n\nconst EMPTY = { serverName: '', transport: 'stdio', command: '', args: '', cwd: '', url: '', headers: '' }\n\n/** 将表单草稿转换为 Host MCP 配置。 */\nfunction configOf(draft) {\n const config = { serverName: draft.serverName.trim(), transport: draft.transport }\n if (draft.transport === 'stdio') {\n config.command = draft.command.trim()\n config.args = draft.args.split(/\\r?\\n|\\s+/).filter(Boolean)\n if (draft.cwd.trim()) config.cwd = draft.cwd.trim()\n } else {\n config.url = draft.url.trim()\n config.headers = parsePairs(draft.headers)\n }\n return config\n}\n\n/** 解析每行 key=value 的表单字段。 */\nfunction parsePairs(text) {\n return Object.fromEntries(text.split(/\\r?\\n/).map((line) => line.trim()).filter(Boolean).map((line) => {\n const idx = line.indexOf('=')\n return idx > 0 ? [line.slice(0, idx).trim(), line.slice(idx + 1).trim()] : [line, '']\n }))\n}\n\n/** 服务状态文案。 */\nfunction statusOf(server) {\n return server.status === 'connected' ? '在线' : server.status === 'connecting' ? '连接中' : server.status === 'disabled' ? '已禁用' : '错误'\n}\n\n/** MCP 服务卡片(全局与项目共用)。 */\nfunction ServerCard({ server, onRefresh, onToggle, onRemove }) {\n return React.createElement('article', { className: 'vsm-mcp-card' },\n React.createElement('div', { className: 'vsm-mcp-card-head' },\n React.createElement('div', { className: 'vsm-mcp-title' }, React.createElement('span', { className: 'vsm-mcp-dot ' + (server.enabled ? server.status : 'disabled') }), server.serverName),\n React.createElement('div', { className: 'vsm-mcp-actions' },\n React.createElement('button', { onClick: () => onRefresh(server.id), title: '刷新连接' }, '↻'),\n React.createElement('button', { className: 'vsm-danger', onClick: () => onRemove(server.id), title: '删除 MCP' }, '⌫'),\n React.createElement('button', { className: 'vsm-switch ' + (server.enabled ? 'on' : ''), onClick: () => onToggle(server), 'aria-label': server.enabled ? '禁用' : '启用' }, server.enabled ? '●' : '○'),\n ),\n ),\n React.createElement('div', { className: 'vsm-mcp-meta' }, statusOf(server), ' · ', server.toolCount, ' 个工具 · ', server.transport),\n server.error && React.createElement('div', { className: 'vsm-mcp-error' }, server.error),\n React.createElement('div', { className: 'vsm-mcp-tools' }, server.tools.map((tool) => React.createElement('span', { key: tool.name, className: 'vsm-mcp-chip', title: tool.description || tool.name }, tool.name))),\n )\n}\n\n/** 按项目标题或路径过滤,大小写不敏感。 */\nexport function filterProjects(projects, query) {\n const needle = String(query ?? '').trim().toLowerCase()\n if (!needle) return projects\n return projects.filter((project) => `${project.title} ${project.workspacePath}`.toLowerCase().includes(needle))\n}\n\n/** 带搜索的项目组合框。 */\nfunction ProjectPicker({ projects, value, onChange }) {\n const [open, setOpen] = React.useState(false)\n const [query, setQuery] = React.useState('')\n const [highlight, setHighlight] = React.useState(0)\n const rootRef = React.useRef(null)\n const selected = projects.find((project) => project.workspacePath === value)\n const filtered = React.useMemo(() => filterProjects(projects, query), [projects, query])\n\n React.useEffect(() => {\n const close = (event) => {\n if (!rootRef.current?.contains(event.target)) setOpen(false)\n }\n document.addEventListener('mousedown', close)\n return () => document.removeEventListener('mousedown', close)\n }, [])\n\n const choose = (project) => {\n onChange(project.workspacePath)\n setQuery('')\n setOpen(false)\n }\n const move = (delta) => setHighlight((old) => Math.max(0, Math.min(Math.max(0, filtered.length - 1), old + delta)))\n const keyDown = (event) => {\n if (event.key === 'ArrowDown') { event.preventDefault(); move(1) }\n else if (event.key === 'ArrowUp') { event.preventDefault(); move(-1) }\n else if (event.key === 'Enter' && filtered[highlight]) { event.preventDefault(); choose(filtered[highlight]) }\n else if (event.key === 'Escape') { event.preventDefault(); setOpen(false) }\n }\n return React.createElement('div', { className: 'vsm-project-picker', ref: rootRef },\n React.createElement('button', { className: 'vsm-project-picker-trigger', role: 'combobox', 'aria-expanded': open, onClick: () => setOpen((old) => !old) },\n React.createElement('span', { className: 'vsm-project-picker-label' }, selected?.title || '选择项目', selected && React.createElement('small', null, selected.workspacePath)),\n React.createElement('span', { className: 'vsm-project-picker-arrow' }, open ? '⌃' : '⌄'),\n ),\n open && React.createElement('div', { className: 'vsm-project-picker-menu' },\n React.createElement('input', { autoFocus: true, className: 'vsm-project-picker-search', value: query, placeholder: '搜索项目名称或路径…', onChange: (event) => { setQuery(event.target.value); setHighlight(0) }, onKeyDown: keyDown }),\n React.createElement('div', { className: 'vsm-project-picker-options', role: 'listbox' }, filtered.length ? filtered.map((project, index) => React.createElement('button', { key: project.workspacePath, role: 'option', 'aria-selected': project.workspacePath === value, className: 'vsm-project-option ' + (index === highlight ? 'highlight' : '') + (project.workspacePath === value ? ' selected' : ''), onMouseEnter: () => setHighlight(index), onClick: () => choose(project) }, React.createElement('span', null, project.title), React.createElement('small', null, project.workspacePath, ' · ', project.servers.length, ' 个 MCP'))) : React.createElement('div', { className: 'vsm-project-picker-empty' }, '没有匹配的项目')),\n ),\n )\n}\n\n/** 单个项目的 MCP 分组。 */\nfunction ProjectGroup({ project, busy, onAdd, onRefresh, onToggle, onRemove }) {\n const head = React.createElement('div', { className: 'vsm-project-head' },\n React.createElement('div', { className: 'vsm-project-title' }, React.createElement('span', { className: 'vsm-project-icon' }, '▣'), React.createElement('div', null, React.createElement('span', { className: 'vsm-project-name' }, project.title), React.createElement('span', { className: 'vsm-project-path' }, project.workspacePath))),\n React.createElement('button', { className: 'vsm-primary vsm-small', onClick: () => onAdd(project) }, '+ 添加 MCP'),\n )\n let body\n if (project.missingDir) body = React.createElement('div', { className: 'vsm-project-empty' }, '项目目录已不存在,无法管理 MCP')\n else if (project.fileError) body = React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, project.fileError)\n else if (!project.servers.length) body = React.createElement('div', { className: 'vsm-project-empty' }, '此项目未配置 MCP')\n else body = project.servers.map((server) => React.createElement(ServerCard, { key: server.serverName, server, onRefresh: (id) => onRefresh(project, server, id), onToggle: () => onToggle(project, server), onRemove: (id) => onRemove(project, server, id) }))\n return React.createElement('section', { className: 'vsm-project' }, head, body)\n}\n\n/** 通用设置:选择当前对话文件链接的打开器 + 开发形态开关。 */\nfunction GeneralSettings({ registry }) {\n const [tool, setTool] = React.useState(AUTO_OPEN_TOOL)\n const [busy, setBusy] = React.useState(false)\n const [error, setError] = React.useState('')\n const [devForm, setDevForm] = React.useState(null)\n const [devBusy, setDevBusy] = React.useState(false)\n const [devMessage, setDevMessage] = React.useState('')\n const settings = React.useContext(SettingsContext)\n const snapshot = settings?.getSnapshot?.()\n const loading = !snapshot || snapshot.status === 'loading'\n const unavailable = snapshot?.status === 'unavailable' || !settings\n const notReady = snapshot?.status !== 'ready'\n React.useEffect(() => {\n const onChange = () => {\n const next = settings?.getSnapshot?.().value?.fileOpenTool\n if (typeof next === 'string') setTool(next)\n }\n onChange()\n return settings?.subscribe?.(onChange)\n }, [settings])\n React.useEffect(() => {\n rpc('vscode.devFormGet', {}).then((result) => {\n if (result.ok) setDevForm(result.devForm)\n }).catch(() => { /* 开发形态查询失败静默 */ })\n }, [])\n const save = (value) => {\n setTool(value); setBusy(true); setError('')\n if (!settings?.set) { setError('设置服务不可用'); setBusy(false); return }\n settings.set('fileOpenTool', value).catch((e) => setError(String(e))).finally(() => setBusy(false))\n }\n const closeDevForm = () => {\n if (!window.confirm('关闭开发形态:插件将切换为正式版安装(版本依赖 + 删除工作区链接),pnpm 装配后需重启 DSH 生效。确认关闭?')) return\n setDevBusy(true)\n setDevMessage('')\n rpc('vscode.devFormSet', { enabled: false }).then((result) => {\n if (!result.ok) { setDevMessage('关闭失败:' + String(result.error)); return }\n setDevForm(result.devForm)\n setDevMessage(result.restart ? '已切换为正式版,重启 DSH 后生效。' : '已关闭开发形态。')\n }).catch((e) => setDevMessage('关闭失败:' + String(e))).finally(() => setDevBusy(false))\n }\n const options = [{ id: AUTO_OPEN_TOOL, label: '自动选择', description: '按当前已注册工具自动选择' }, ...availableOpeners(registry).map((item) => ({ id: item.id, label: item.label, description: item.description }))]\n const currentOption = options.some((item) => item.id === tool) ? tool : AUTO_OPEN_TOOL\n const devFormRow = devForm?.enabled ? React.createElement('div', { className: 'vsm-general-row' },\n React.createElement('span', null, '开发形态', React.createElement('small', { className: 'vsm-devform-note' }, '工作区链接安装:' + devForm.path)),\n React.createElement('div', { className: 'vsm-devform-actions' },\n devMessage && React.createElement('small', { className: 'vsm-devform-msg' }, devMessage),\n React.createElement('button', { className: 'vsm-devform-close', disabled: devBusy, onClick: closeDevForm }, devBusy ? '切换中…' : '关闭开发形态'),\n ),\n ) : null\n return React.createElement('section', { className: 'vsm-general-page' },\n React.createElement('h2', null, '通用'),\n React.createElement('p', null, '配置 DSH 对话中文件链接的打开工具。工具由当前运行时自动扫描。'),\n unavailable && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, '设置服务暂不可用,当前使用自动选择。'),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n React.createElement('section', { className: 'vsm-panel' },\n React.createElement('h3', { className: 'vsm-panel-title' }, '文件与安装'),\n React.createElement('div', { className: 'vsm-panel-body' },\n React.createElement('label', { className: 'vsm-general-row' }, React.createElement('span', null, '文件链接使用工具'), React.createElement('select', { value: currentOption, disabled: loading || unavailable || notReady || busy || snapshot?.writable === false, onChange: (event) => save(event.target.value) }, options.map((item) => React.createElement('option', { key: item.id, value: item.id }, item.label))), loading && React.createElement('small', null, '读取中…')),\n devFormRow,\n ),\n ),\n )\n}\n\n/** 兼容性小节:host 报告(RPC compat)+ 客户端本地适配项。 */\nfunction CompatSection({ getSummary }) {\n const [report, setReport] = React.useState(null)\n const [error, setError] = React.useState('')\n React.useEffect(() => {\n let alive = true\n rpc('compat', {}).then((result) => {\n if (!alive) return\n if (!result.ok) setError(String(result.error))\n else setReport(result.report)\n }).catch((e) => { if (alive) setError(String(e)) })\n return () => { alive = false }\n }, [])\n const renderItems = (list) => (list ?? []).map((item) => React.createElement('div', { key: item.name, className: 'vsm-compat-item ' + (item.active ? 'ok' : 'warn') },\n React.createElement('span', { className: 'vsm-compat-name' }, item.name),\n React.createElement('span', { className: 'vsm-compat-note' }, item.note ?? (item.active ? '正常' : '未生效')),\n ))\n /** 兼容性分组面板:标题 + 线框内容区。 */\n const group = (title, children) => React.createElement('section', { className: 'vsm-panel' },\n React.createElement('h3', { className: 'vsm-panel-title' }, title),\n React.createElement('div', { className: 'vsm-panel-body' }, children),\n )\n const warnings = report?.warnings ?? []\n const devForm = report?.devForm\n const versionText = report?.dshVersion\n ? '(DSH ' + report.dshVersion + ' · 插件 ' + (report?.pluginVersion ?? '') + ')'\n : report?.pluginVersion ? '(插件版本 ' + report.pluginVersion + ')' : ''\n return React.createElement('section', { className: 'vsm-general-page' },\n React.createElement('h2', null, '兼容性'),\n React.createElement('p', null, '检测与其他插件 / DSH 版本的适配状态与已知问题。' + versionText),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n devForm?.enabled && group('开发形态', React.createElement('div', { className: 'vsm-compat-item ok' }, React.createElement('span', { className: 'vsm-compat-name' }, '开发形态开启(工作区链接安装)'), React.createElement('span', { className: 'vsm-compat-note' }, devForm.path))),\n group('版本适配', renderItems(report?.adapters)),\n group('外部插件与服务', renderItems(report?.external)),\n group('客户端适配', renderItems(getSummary?.() ?? [])),\n group('护栏', renderItems(report?.guards)),\n group('警告', warnings.length ? warnings.map((w, index) => React.createElement('div', { key: index, className: 'vsm-mcp-error vsm-mcp-banner' }, w)) : React.createElement('div', { className: 'vsm-compat-item ok' }, React.createElement('span', { className: 'vsm-compat-name' }, '未检测到兼容性问题'), React.createElement('span', { className: 'vsm-compat-note' }, ''))),\n )\n}\n\n/** MCP 管理子页签定义(我的 / 项目 / 市场)。 */\nconst MCP_TABS = [\n { id: 'mine', label: '我的 MCP' },\n { id: 'projects', label: '项目 MCP' },\n { id: 'market', label: 'MCP 市场' },\n]\n\n/**\n * MCP 管理面板:顶层「MCP 管理」Tab 下的三个子页签容器。\n * 作者 ddj 2026年08月27号\n * @param {object[]} servers 全局 MCP 服务列表\n * @param {object[]} projects 项目及其项目级 MCP 列表\n * @param {string} busy 正在执行的操作标识\n * @param {object} draft 新增表单草稿\n * @param {Function} edit 草稿字段变更回调\n * @param {Function} resetDraft 清空草稿回调\n */\nfunction McpManagePanel({ servers, projects, busy, draft, edit, resetDraft, refreshGlobal, toggleGlobal, removeGlobal, refreshProject, toggleProject, removeProject, saveGlobal, saveProject }) {\n const [mcpTab, setMcpTab] = React.useState('mine')\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 closeGlobalForm = () => setShowForm(false)\n const closeProjectForm = () => setProjectForm(null)\n const addProject = (project) => {\n resetDraft?.()\n setProjectForm({ workspacePath: project.workspacePath, title: project.title })\n }\n\n const selectedProject = projects.find((project) => project.workspacePath === selectedPath)\n const mineBody = servers.length\n ? servers.map((s) => React.createElement(ServerCard, { key: s.id, server: s, onRefresh: refreshGlobal, onToggle: toggleGlobal, onRemove: removeGlobal }))\n : React.createElement('div', { className: 'vsm-mcp-empty' }, '还没有配置全局 MCP')\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: addProject, onRefresh: refreshProject, onToggle: toggleProject, onRemove: removeProject }) : React.createElement('div', { className: 'vsm-mcp-empty' }, '请选择项目'),\n ) : React.createElement('div', { className: 'vsm-mcp-empty' }, '还没有项目')\n\n let body\n if (mcpTab === 'projects') body = projectBody\n else if (mcpTab === 'market') body = React.createElement('div', { className: 'vsm-mcp-empty' }, 'MCP 市场暂未接入')\n else body = mineBody\n\n const form = showForm\n ? React.createElement(McpForm, { title: '添加全局 MCP', draft, busy, edit, save: () => saveGlobal(closeGlobalForm), close: closeGlobalForm })\n : projectForm\n ? React.createElement(McpForm, { title: '添加项目 MCP · ' + projectForm.title, draft, busy, edit, save: () => saveProject(projectForm.workspacePath, closeProjectForm), close: closeProjectForm })\n : null\n return React.createElement(React.Fragment, null,\n React.createElement('div', { className: 'vsm-mcp-subhead' },\n React.createElement('nav', { className: 'vsm-mcp-subtabs' }, MCP_TABS.map((item) => React.createElement('button', { key: item.id, className: mcpTab === item.id ? 'active' : '', onClick: () => setMcpTab(item.id) }, item.label))),\n React.createElement('button', { className: 'vsm-primary vsm-small', onClick: () => { resetDraft?.(); setShowForm(true) } }, '+ 添加全局 MCP'),\n ),\n body,\n form,\n )\n}\n\n/** MCP 管理主面板。 */\nexport function McpSettings(props) {\n const openerRegistry = props?.openerRegistry ?? { list: () => [] }\n const compatSummary = props?.compatSummary ?? (() => [])\n const [servers, setServers] = React.useState<MpcServer[]>([])\n const [projects, setProjects] = React.useState<MpcProject[]>([])\n const [loading, setLoading] = React.useState(true)\n const [busy, setBusy] = React.useState('')\n const [error, setError] = React.useState('')\n const [tab, setTab] = React.useState('general')\n const [draft, setDraft] = React.useState(EMPTY)\n\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 /**\n * 保存全局 MCP:成功后由回调关闭子面板。\n * 作者 ddj 2026年08月27号\n * @param {Function} close 关闭新增表单回调\n */\n const saveGlobal = (close) => {\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 close()\n }).catch((e) => setError(String(e))).finally(() => setBusy(''))\n }\n\n /**\n * 保存项目 MCP:成功后由回调关闭子面板。\n * 作者 ddj 2026年08月27号\n * @param {string} workspacePath 目标项目路径\n * @param {Function} close 关闭新增表单回调\n */\n const saveProject = (workspacePath, close) => {\n setBusy('project-save')\n setError('')\n const config = configOf(draft)\n rpc('mcp.projectSave', { workspacePath, serverName: config.serverName, config }).then(finish).then((result) => {\n setProjects((old) => old.map((p) => p.workspacePath === workspacePath ? result.project : p))\n setDraft(EMPTY)\n close()\n }).catch((e) => setError(String(e))).finally(() => setBusy(''))\n }\n\n const edit = (key, value) => setDraft((old) => ({ ...old, [key]: value }))\n const resetDraft = () => setDraft(EMPTY)\n let body\n if (loading) body = React.createElement('div', { className: 'vsm-mcp-empty' }, '正在读取 MCP 服务…')\n else if (tab === 'general') body = React.createElement(GeneralSettings, { registry: openerRegistry })\n else if (tab === 'keys') body = React.createElement(KeybindingsPanel, null)\n else if (tab === 'mcp') body = React.createElement(McpManagePanel, { servers, projects, busy, draft, edit, resetDraft,\n saveGlobal: (close) => saveGlobal(close), saveProject: (workspacePath, close) => saveProject(workspacePath, close),\n refreshGlobal, toggleGlobal, removeGlobal, refreshProject, toggleProject, removeProject })\n else if (tab === 'compat') body = React.createElement(CompatSection, { getSummary: compatSummary })\n else if (tab === 'lsp') body = React.createElement(LspSettings, null)\n else body = React.createElement(PerfSettings, 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 服务。'))),\n React.createElement('nav', { className: 'vsm-mcp-tabs' }, React.createElement('button', { className: tab === 'general' ? 'active' : '', onClick: () => setTab('general') }, '通用'), React.createElement('button', { className: tab === 'keys' ? 'active' : '', onClick: () => setTab('keys') }, '快捷键'), React.createElement('button', { className: tab === 'mcp' ? 'active' : '', onClick: () => setTab('mcp') }, 'MCP 管理'), React.createElement('button', { className: tab === 'lsp' ? 'active' : '', onClick: () => setTab('lsp') }, '语言服务器'), React.createElement('button', { className: tab === 'perf' ? 'active' : '', onClick: () => setTab('perf') }, '性能优化'), React.createElement('button', { className: tab === 'compat' ? 'active' : '', onClick: () => setTab('compat') }, '兼容性')),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n body,\n )\n}\n\n/** MCP 新增表单(全局/项目共用)。 */\nfunction McpForm({ title, draft, busy, edit, save, close }) {\n const input = (key, placeholder) => React.createElement('input', { value: draft[key], onChange: (e) => edit(key, e.target.value), placeholder })\n const fields = draft.transport === 'stdio' ? React.createElement(React.Fragment, null, React.createElement('label', null, '命令', input('command', 'npx')), React.createElement('label', null, '参数(空格或换行分隔)', React.createElement('textarea', { value: draft.args, onChange: (e) => edit('args', e.target.value) })), React.createElement('label', null, '工作目录(可选)', input('cwd', ''))) : React.createElement(React.Fragment, null, React.createElement('label', null, 'URL', input('url', 'http://localhost:3000/mcp')), React.createElement('label', null, '请求头(每行 key=value)', React.createElement('textarea', { value: draft.headers, onChange: (e) => edit('headers', e.target.value) })))\n return React.createElement('div', { className: 'vsm-mcp-modal' }, React.createElement('div', { className: 'vsm-mcp-dialog' }, React.createElement('h3', null, title), React.createElement('label', null, '名称', input('serverName', '例如 codegraph')), React.createElement('label', null, '传输方式', React.createElement('select', { value: draft.transport, onChange: (e) => edit('transport', e.target.value) }, React.createElement('option', { value: 'stdio' }, 'stdio'), React.createElement('option', { value: 'streamable-http' }, 'streamable-http'))), fields, React.createElement('div', { className: 'vsm-mcp-dialog-actions' }, React.createElement('button', { onClick: close }, '取消'), React.createElement('button', { className: 'vsm-primary', disabled: busy === 'save' || busy === 'project-save', onClick: save }, '保存并连接'))))\n}\n","/**\n * dsh-vscode-mode client — DSH 对话文件链接的统一打开路由。\n * openPath 补丁经 compat.patchMethod 安装(链式恢复,多插件补丁互不踩踏)。\n * 作者 ddj 2026年08月24号\n */\nimport { patchMethod } from './compat.js'\nimport { openEditorView } from './events.js'\nimport { AUTO_OPEN_TOOL, VSCODE_OPEN_TOOL, type FileOpenContext, type FileOpenerRegistry, isAvailable, selectOpener } from './fileOpeners.js'\n\nexport interface OpenPathRouterOptions {\n workspaces: { openPath: (path: string) => Promise<void> }\n registry: FileOpenerRegistry\n selected: () => string\n context: () => FileOpenContext\n logger?: (message: string) => void\n}\n\n/**\n * 安装可卸载的 workspaces.openPath 路由。\n * @author ddj 2026年08月24号\n * @param options 路由依赖\n * @returns 恢复原方法的 disposer\n */\nexport function installOpenPathRouter(options: OpenPathRouterOptions): () => void {\n const open = async (original: (path: string) => Promise<void>, path: string): Promise<void> => {\n const context = options.context()\n const opener = selectOpener(options.registry, options.selected())\n if (!opener || !isAvailable(opener)) return original.call(options.workspaces, path)\n try {\n await opener.open(path, context)\n } catch (error) {\n options.logger?.('文件打开器 ' + opener.id + ' 失败,回退系统打开: ' + String(error))\n if (opener.id !== 'system') await original.call(options.workspaces, path)\n else throw error\n }\n }\n return patchMethod(options.workspaces, 'openPath', open as never)\n}\n\n/**\n * 创建 VSCodeMode 内置文件打开器。\n * @author ddj 2026年08月24号\n * @returns VSCodeMode 打开器\n */\nexport function vscodeOpener(): { id: string; label: string; priority: number; open: (path: string) => void } {\n return { id: VSCODE_OPEN_TOOL, label: 'VSCodeMode', priority: 100, open: (path) => openEditorView(path) }\n}\n\n/**\n * 规范化设置中的打开器 id。\n * @author ddj 2026年08月24号\n * @param value 原始设置值\n * @returns 可路由的打开器 id\n */\nexport function autoValue(value: unknown): string {\n return typeof value === 'string' && value.trim() ? value.trim() : AUTO_OPEN_TOOL\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — SideEditorTab:betterSidebar「文件编辑」Tab 的组件包装。\n * 把 TabComponentProps(scope/tab/visible)映射为 EditorView 侧栏形态 props,\n * 并按会话 key 保证切会话状态干净重建;创建种子的初始打开在挂载后投递一次。\n * 作者 ddj 2026年08月25号\n */\nimport React from 'react'\nimport { EditorView } from './EditorView.js'\nimport { resolveInitialOpen, setSideEditorMounted, takePendingSideOpen } from '../sidebarBridge.js'\n\n/**\n * 侧边栏 Tab 组件(TabDescriptor.component 装配)。\n * @param props TabComponentProps(scope.sessionId、tab.path/meta 等)\n * @returns EditorView 侧栏形态\n */\nexport function SideEditorTab(props) {\n const sessionId = props?.scope?.sessionId\n const initial = React.useMemo(() => resolveInitialOpen(props?.tab), [props?.tab])\n const dispatchedRef = React.useRef(false)\n\n React.useEffect(() => {\n setSideEditorMounted(true)\n return () => setSideEditorMounted(false)\n }, [])\n\n React.useEffect(() => {\n if (dispatchedRef.current) return\n dispatchedRef.current = true\n // 待消费打开(挂载前暂存的聚焦请求)优先于创建种子;两者都走同事件,EditorView 幂等处理\n const pending = takePendingSideOpen(sessionId)\n const request = pending ?? initial\n window.dispatchEvent(new CustomEvent('edrv:open-editor', {\n detail: { path: request?.path ?? null, focusDiff: request?.focusDiff === true },\n }))\n }, [initial.path, initial.focusDiff, sessionId])\n\n return React.createElement(EditorView, {\n key: sessionId,\n sessionId,\n layout: 'side',\n schedule: props?.schedule,\n addToConversation: props?.addToConversation,\n sidebarPanels: props?.sidebarPanels,\n outlineSources: props?.outlineSources,\n fileMenuItems: props?.fileMenuItems,\n })\n}\n","/**\n * dsh-vscode-mode client — 把文件/选中内容注入会话对话输入框(composer draft)。\n * 复用 DSH 官方输入门面:ctx.conversation.input.for(sessions.scope(sessionId)) → SessionInput。\n * 引用 chip:insertReference(reference source,发送时序列化为 @path 文本);忙态降级为纯文本 setDraft。\n * 纯函数部分 node 可单测。\n * 作者 ddj 2026-08-25\n */\n\n/** 文件引用可选的行区间(选中内容用)。 */\nexport interface RefRange {\n startLine: number\n endLine: number\n}\n\n/** 引用动作的返回状态。 */\nexport type AddOutcome = 'ok' | 'busy' | 'unavailable'\n\n/** DSH reference source 名(dsh-client-ui-reference 注册的 @file/@session 统一源)。 */\nconst REF_SOURCE = 'reference'\n\n/**\n * 生成 DSH @file 语法引用串:cwd 相对化、\\ → /、含空白时按 @\"path\" 语法加引号。\n * cwd 外/无法相对化的路径回退原路径。\n * @author ddj 2026年08月25号\n * @param path 打开的文件路径(相对 cwd 或绝对)\n * @param cwd 会话工作区目录(可选)\n * @returns 引用串(如 @src/index.ts 或 @\"a b.ts\")\n */\nexport function mentionOf(path: string, cwd: string | undefined): string {\n const raw = String(path)\n let rel = raw\n if (cwd) {\n const base = String(cwd).replace(/[\\\\/]+$/, '')\n const up = raw.replace(/\\\\/g, '/')\n const baseUp = base.replace(/\\\\/g, '/')\n if (up.startsWith(baseUp + '/')) rel = up.slice(baseUp.length + 1)\n else if (up === baseUp) rel = ''\n }\n rel = rel.replace(/\\\\/g, '/').replace(/^\\.\\//, '')\n if (!rel) rel = raw.replace(/\\\\/g, '/')\n if (/[\\u0000-\\u001f\\u007f-\\u009f\"]/u.test(rel)) return '@' + raw\n return /\\s/u.test(rel) ? `@\"${rel}\"` : `@${rel}`\n}\n\n/** 引用标签:文件名 + 可选行区间(chip 内展示,不带 @ 前缀)。\n * @author ddj 2026年08月25号 */\nexport function labelOf(path: string, range: RefRange | undefined): string {\n const base = String(path).split(/[\\\\/]/).pop() || String(path)\n if (!range || range.endLine < range.startLine) return base\n return range.startLine === range.endLine\n ? `${base} L${range.startLine}`\n : `${base} L${range.startLine}-${range.endLine}`\n}\n\n/** 引用 ref:引用串 + 可选行区间(序列化直出,agent 据此读取对应片段)。\n * @author ddj 2026年08月25号 */\nexport function refOf(mention: string, range: RefRange | undefined): string {\n if (!range || range.endLine < range.startLine) return mention\n return range.startLine === range.endLine\n ? `${mention} L${range.startLine}`\n : `${mention} L${range.startLine}-${range.endLine}`\n}\n\n/** 构造 DSH 文件引用插入载荷(source=reference,发送序列化为 mention(+range) 文本)。 */\nexport function buildFileRef(\n path: string,\n cwd: string | undefined,\n range?: RefRange,\n): { reference: ReferenceInsertLike; mention: string } {\n const mention = mentionOf(path, cwd)\n return {\n mention,\n reference: {\n source: REF_SOURCE,\n ref: refOf(mention, range),\n label: labelOf(path, range),\n appearance: 'file',\n clipboardText: mention,\n },\n }\n}\n\n/** 输入门面最小形状(运行时来自 ctx.conversation.input,避免引入新类型依赖)。 */\nexport interface InputLike {\n state: { getSnapshot: () => { draft: string; draftRev: number } }\n insertReference: (ref: ReferenceInsertLike, span: TokenSpanLike) => boolean\n setDraft: (text: string) => void\n notify: (level: 'info' | 'error', text: string) => void\n}\n\n/** ReferenceInsert 结构形状(与 dsh-client-ui-input-trigger 类型一致)。 */\nexport interface ReferenceInsertLike {\n source: string\n ref: string\n label: string\n appearance?: 'session' | 'file' | 'folder'\n clipboardText: string\n}\n\n/** TokenSpan 结构形状(start/end 为草稿字符偏移,draftRev 为 CAS 版本)。 */\nexport interface TokenSpanLike {\n start: number\n end: number\n draftRev: number\n}\n\n/** ctx 依赖的最小面(sessions.scope + conversation.input)。 */\nexport interface CtxLike {\n get: (name: string) => unknown\n}\n\n/** 注入器产物:给 EditorView 用的动作集合。 */\nexport interface AddToConversation {\n /** 追加文件引用 chip(@path [Lstart-end]);忙态自动降级纯文本。 */\n appendReference(sessionId: string | undefined, path: string, range?: RefRange): Promise<AddOutcome>\n}\n\n/**\n * 解析会话输入门面;缺失时返回 undefined(动作侧守卫降级)。\n * @author ddj 2026年08月25号\n * @param ctx 客户端服务上下文\n * @param sessionId 会话 id\n * @returns SessionInput 或 undefined\n */\nexport function inputFor(ctx: CtxLike, sessionId: string | undefined): InputLike | undefined {\n if (!sessionId) return undefined\n try {\n const sessions = ctx.get('sessions') as { scope?: (id: string) => unknown } | undefined\n const conversation = ctx.get('conversation') as { input?: { for: (actx: unknown) => unknown } } | undefined\n const actx = sessions?.scope?.(sessionId)\n const shell = actx && conversation?.input?.for?.(actx)\n return (shell && typeof (shell as InputLike).setDraft === 'function') ? shell as InputLike : undefined\n } catch {\n return undefined\n }\n}\n\n/** 取当前草稿长度与版本;无输入门面时返回 null。\n * @author ddj 2026年08月25号 */\nfunction draftCursor(input: InputLike | undefined): { draft: string; draftRev: number } | null {\n try {\n const s = input?.state?.getSnapshot?.()\n if (!s) return null\n return { draft: String(s.draft ?? ''), draftRev: Number(s.draftRev ?? 0) }\n } catch {\n return null\n }\n}\n\n/** 从 sessions 列表快照读会话工作区目录(与 index.ts 既有读取方式一致)。\n * @author ddj 2026年08月25号 */\nfunction cwdOf(ctx: CtxLike, sessionId: string | undefined): string | undefined {\n if (!sessionId) return undefined\n try {\n const sessions = ctx.get('sessions') as\n | { list?: { getSnapshot?: () => { byId?: Record<string, { cwd?: string }> } } }\n | undefined\n return sessions?.list?.getSnapshot?.()?.byId?.[sessionId]?.cwd\n } catch {\n return undefined\n }\n}\n\n/** 写入成功后的 composer 内联提示(门面可用时;失败静默)。\n * @author ddj 2026年08月25号 */\nfunction notify(input: InputLike, text: string): void {\n try {\n input.notify?.('info', text)\n } catch {\n /* 提示失败忽略 */\n }\n}\n\n/** 输入门面插入引用(拦截异常视作未应用,走降级)。\n * @author ddj 2026年08月25号 */\nfunction safeInsert(input: InputLike, reference: ReferenceInsertLike, span: TokenSpanLike): boolean {\n try {\n return input.insertReference(reference, span) === true\n } catch {\n return false\n }\n}\n\n/**\n * 创建「添加到对话」动作集(apply 阶段构建一次,随 props 传给 EditorView)。\n * @author ddj 2026年08月25号\n * @param ctx 客户端服务上下文(sessions + conversation)\n * @returns 动作集\n */\nexport function createAddToConversation(ctx: CtxLike): AddToConversation {\n const appendReference: AddToConversation['appendReference'] = async (sessionId, path, range) => {\n const input = inputFor(ctx, sessionId)\n if (!input) return 'unavailable'\n const cur = draftCursor(input)\n if (!cur) return 'unavailable'\n const { reference, mention } = buildFileRef(path, cwdOf(ctx, sessionId), range)\n const span: TokenSpanLike = { start: cur.draft.length, end: cur.draft.length, draftRev: cur.draftRev }\n const ok = safeInsert(input, reference, span)\n if (!ok) {\n // 忙态(adjudicating/submitting)或 CAS 失败:降级纯文本追加,保证动作有落点。\n const gap = cur.draft.length > 0 && !/\\s$/.test(cur.draft) ? ' ' : ''\n input.setDraft(cur.draft + gap + mention + ' ')\n notify(input, '已添加文件引用 ' + mention)\n return 'busy'\n }\n notify(input, '已添加文件引用 ' + mention)\n return 'ok'\n }\n\n return { appendReference }\n}\n","/**\n * dsh-vscode-mode client — 侧边栏面板注册表。\n * 镜像 fileOpeners.ts 的注册表模式:create + register(返回注销) + list + subscribe,\n * 由 client/index.ts `ctx.provide('edrvSidebarPanels', registry)` 对外暴露(第三方可注册)。\n * 作者 ddj 2026-08-26\n */\nimport type { SidebarPanelDef } from './types.js'\n\nexport interface SidebarPanelRegistry {\n register(panel: SidebarPanelDef): () => void\n list(): readonly SidebarPanelDef[]\n subscribe(listener: () => void): () => void\n get(id: string): SidebarPanelDef | undefined\n}\n\n/** 校验面板定义并写入注册表(缺 id/render 抛 TypeError)。 */\nfunction panelRegister(entries: Map<string, SidebarPanelDef>, notify: () => void, panel: SidebarPanelDef): void {\n if (!panel.id || typeof panel.render !== 'function') throw new TypeError('侧边栏面板必须提供 id 和 render')\n entries.set(panel.id, panel)\n notify()\n}\n\n/**\n * 创建生命周期独立的面板注册表。\n * @author ddj 2026年08月26号\n * @returns 面板注册表\n */\nexport function createSidebarPanelRegistry(): SidebarPanelRegistry {\n const entries = new Map<string, SidebarPanelDef>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) listener()\n }\n const list = (): readonly SidebarPanelDef[] =>\n [...entries.values()].sort((a, b) => (a.order ?? 100) - (b.order ?? 100))\n return {\n register(panel: SidebarPanelDef): () => void {\n panelRegister(entries, notify, panel)\n return () => {\n if (entries.get(panel.id) !== panel) return\n entries.delete(panel.id)\n notify()\n }\n },\n list,\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n get: (id: string) => entries.get(id),\n }\n}\n","/**\n * dsh-vscode-mode client — 右键菜单 viewport 定位纯函数。\n * 将目标行锚点与视口边界计算从 React 渲染层拆出,便于复用和单测。\n * 作者 ddj 2026-08-28\n */\n\nexport interface MenuPosition {\n left: number\n top: number\n}\n\nexport interface MenuAnchorRect {\n top: number\n right: number\n width: number\n height: number\n}\n\n/**\n * 将菜单坐标限制在 viewport 内。\n * @author ddj 2026年08月28号\n * @param x 期望的 viewport x 坐标\n * @param y 期望的 viewport y 坐标\n * @param viewportWidth viewport 宽度\n * @param viewportHeight viewport 高度\n * @param menuWidth 菜单估算宽度\n * @param menuHeight 菜单估算高度\n * @returns 限制后的菜单位置\n */\nexport function clampMenuPosition(\n x: number,\n y: number,\n viewportWidth: number,\n viewportHeight: number,\n menuWidth: number,\n menuHeight: number,\n): MenuPosition {\n const maxLeft = Math.max(4, viewportWidth - menuWidth)\n const maxTop = Math.max(4, viewportHeight - menuHeight)\n return {\n left: Math.max(4, Math.min(x, maxLeft)),\n top: Math.max(4, Math.min(y, maxTop)),\n }\n}\n\n/**\n * 将文件树行右键菜单锚定到目标行右侧;无法测量时回退到鼠标坐标。\n * @author ddj 2026年08月28号\n * @param rect 目标行的布局矩形\n * @param fallbackX 鼠标 viewport x 坐标\n * @param fallbackY 鼠标 viewport y 坐标\n * @returns 菜单初始位置\n */\nexport function rowMenuPosition(\n rect: MenuAnchorRect | null | undefined,\n fallbackX: number,\n fallbackY: number,\n): MenuPosition {\n if (!rect || rect.width <= 0 || rect.height <= 0) {\n return { left: fallbackX, top: fallbackY }\n }\n return { left: rect.right + 4, top: rect.top }\n}\n","/**\n * dsh-vscode-mode client — 通用浮动右键菜单(createElement 风格、类型化)。\n * 非阻塞式关闭:window capture 监听(点击菜单外/右键菜单外/Esc 关闭),\n * 不拦截菜单外事件,允许同一事件内由发起方切换/重开菜单。\n * 条目支持 danger/disabled/separator,复用既有 edrv-ctxmenu* 样式类。\n * 作者 ddj 2026-08-27\n */\nimport React from 'react'\nimport { createPortal } from 'react-dom'\nimport { clampMenuPosition } from './menuPosition.js'\n\n/** 单条菜单项(展示层形状;业务侧由 buildTreeMenu 映射而来)。 */\nexport interface ContextMenuEntry {\n id: string\n label: string\n danger?: boolean\n disabled?: boolean\n /** 前置分隔线。 */\n separator?: boolean\n onClick?: () => void\n}\n\nexport interface ContextMenuProps {\n x: number\n y: number\n entries: ContextMenuEntry[]\n onClose: () => void\n}\n\n/** 菜单估算宽高(clamp 防越出视口,与 EditorView menuPos 常量对齐)。 */\nconst MENU_W = 224\nconst MENU_H = 176\n\n/**\n * 浮动右键菜单。\n * @param props.x 视口 x 坐标\n * @param props.y 视口 y 坐标\n * @param props.entries 菜单项列表\n * @param props.onClose 关闭回调(backdrop 点击/右键/Esc/点击项后触发)\n */\nexport function ContextMenu(props: ContextMenuProps): React.ReactElement {\n const { x, y, entries, onClose } = props\n const menuRef = React.useRef<HTMLDivElement | null>(null)\n\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') onClose()\n }\n const onPointerDown = (e: PointerEvent): void => {\n if (e.button !== 0) return\n if (menuRef.current && menuRef.current.contains(e.target as Node)) return\n onClose()\n }\n const onContextMenu = (e: MouseEvent): void => {\n if (menuRef.current && menuRef.current.contains(e.target as Node)) {\n e.preventDefault()\n }\n onClose()\n }\n window.addEventListener('keydown', onKey, true)\n window.addEventListener('pointerdown', onPointerDown, true)\n window.addEventListener('contextmenu', onContextMenu, true)\n return () => {\n window.removeEventListener('keydown', onKey, true)\n window.removeEventListener('pointerdown', onPointerDown, true)\n window.removeEventListener('contextmenu', onContextMenu, true)\n }\n }, [onClose])\n\n const safeX = Number.isFinite(x) ? x : 4\n const safeY = Number.isFinite(y) ? y : 4\n const position = clampMenuPosition(\n safeX,\n safeY,\n window.innerWidth || 800,\n window.innerHeight || 600,\n MENU_W,\n MENU_H,\n )\n\n const children: React.ReactNode[] = []\n for (const entry of entries) {\n if (entry.separator) {\n children.push(React.createElement('div', { key: 'sep-' + entry.id, className: 'edrv-ctxmenu-sep' }))\n continue\n }\n const cls = 'edrv-ctxmenu-item'\n + (entry.danger ? ' edrv-ctxmenu-danger' : '')\n + (entry.disabled ? ' edrv-ctxmenu-disabled' : '')\n children.push(React.createElement('button', {\n key: entry.id,\n className: cls,\n disabled: entry.disabled,\n onClick: () => {\n if (!entry.disabled) {\n entry.onClick?.()\n onClose()\n }\n },\n }, entry.label))\n }\n\n const overlay = React.createElement('div', { 'data-edrv-view': '1' },\n React.createElement('div', { className: 'edrv-ctxmenu', ref: menuRef, style: position }, ...children))\n\n return typeof document === 'undefined' ? overlay : createPortal(overlay, document.body)\n}\n","/**\n * dsh-vscode-mode client — 文件管理右键菜单框架(类型 + 注册表 + 纯构建函数)。\n * 镜像 sidebar/registry.ts 的注册表模式:create + register(返回注销) + list + subscribe,\n * 由 client/index.ts `ctx.provide('edrvFileContextMenuItems', registry)` 对外暴露(第三方可注册)。\n * 新增菜单项只需 register 一条 TreeMenuItem,面板在右键打开时经 buildTreeMenu 过滤/排序。\n * 本模块不触 React/浏览器,可单测。\n * 作者 ddj 2026-08-27\n */\nimport type { TreeEntry } from '../../shared/rpc.js'\nimport type { SidebarCtx } from './types.js'\n\n/** 右键目标(树行/面板空白区,path 相对工作区根,'' 表示根目录)。 */\nexport interface TreeMenuTarget {\n path: string\n type: TreeEntry['type']\n}\n\n/** 一条右键菜单项定义。 */\nexport interface TreeMenuItem {\n id: string\n label: string\n /** 排序:数值越小越靠前(缺省 100)。 */\n order?: number\n /** 红色警示样式(如删除类操作)。 */\n danger?: boolean\n /** 置灰不可点(如无权限/目标不支持时)。 */\n disabled?: boolean\n /** 前置分隔线。 */\n separator?: boolean\n /** 显隐守卫:返回 false 则不显示。 */\n visible?: (target: TreeMenuTarget, ctx: SidebarCtx) => boolean\n run: (target: TreeMenuTarget, ctx: SidebarCtx) => void\n}\n\n/** 右键菜单项注册表(生命周期独立,可注册/注销/订阅)。 */\nexport interface TreeMenuRegistry {\n register(item: TreeMenuItem): () => void\n list(): readonly TreeMenuItem[]\n subscribe(listener: () => void): () => void\n get(id: string): TreeMenuItem | undefined\n}\n\n/** 校验菜单项并写入注册表(缺 id/run/label 抛 TypeError)。 */\nfunction itemRegister(entries: Map<string, TreeMenuItem>, notify: () => void, item: TreeMenuItem): void {\n if (!item.id || typeof item.run !== 'function' || !item.label) {\n throw new TypeError('文件右键菜单项必须提供 id、label 和 run')\n }\n entries.set(item.id, item)\n notify()\n}\n\n/**\n * 创建生命周期独立的右键菜单项注册表。\n * @author ddj 2026年08月27号\n * @returns 菜单项注册表\n */\nexport function createTreeMenuRegistry(): TreeMenuRegistry {\n const entries = new Map<string, TreeMenuItem>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) listener()\n }\n const list = (): readonly TreeMenuItem[] =>\n [...entries.values()].sort((a, b) => (a.order ?? 100) - (b.order ?? 100))\n return {\n register(item: TreeMenuItem): () => void {\n itemRegister(entries, notify, item)\n return () => {\n if (entries.get(item.id) !== item) return\n entries.delete(item.id)\n notify()\n }\n },\n list,\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n get: (id: string) => entries.get(id),\n }\n}\n\n/**\n * 按目标构建当前可见菜单项(visible 过滤 + order 排序)。\n * @author ddj 2026年08月27号\n * @param registry 菜单项注册表\n * @param target 右键目标\n * @param ctx 面板共享上下文\n * @returns 可见菜单项(已排序)\n */\nexport function buildTreeMenu(registry: TreeMenuRegistry | undefined, target: TreeMenuTarget, ctx: SidebarCtx): TreeMenuItem[] {\n if (!registry) return []\n const out: TreeMenuItem[] = []\n for (const item of registry.list()) {\n if (typeof item.visible === 'function' && !item.visible(target, ctx)) continue\n out.push(item)\n }\n return out\n}\n","/**\n * dsh-vscode-mode client — 资源管理栏展开状态持久化(纯函数,可单测)。\n * 对齐 VSCode:只持久化展开路径集合,不缓存目录条目数据(条目实时 listDir)。\n * 键前缀统一走 paths.ts PathConst(CACHE_KEY.expanded)。\n * 作者 ddj 2026-08-28\n */\nimport { CACHE_KEY } from '../paths.js'\n\n/** localStorage 键前缀(按会话隔离)。 */\nconst KEY_PREFIX = CACHE_KEY.expanded\n\n/** 展开路径容量上限:超出丢弃最旧(按写入顺序近似 LRU)。 */\nexport const EXPANDED_CAP = 500\n\n/** 展开状态缓存内容。 */\nexport interface ExplorerCacheData {\n root: string | null\n expanded: string[]\n}\n\n/**\n * 归一化展开路径:去空白、反斜杠→斜杠、去首尾斜杠,`..` 段拒绝。\n * @author ddj 2026年08月28号\n * @param rel 目录相对路径('' = 根)\n * @returns 归一化路径,非法返回 null\n */\nexport function normalizeExpanded(rel: string | undefined | null): string | null {\n const s = String(rel ?? '').trim().replace(/\\\\/g, '/').replace(/^\\/+|\\/+$/g, '')\n if (!s) return ''\n const segs = s.split('/').filter((seg) => seg !== '.')\n if (!segs.length) return ''\n for (const seg of segs) {\n if (seg === '..') return null\n }\n return segs.join('/')\n}\n\n/**\n * 裁剪展开路径集:去重、丢弃非法路径、超容量丢弃尾部(保持传入顺序)。\n * @author ddj 2026年08月28号\n * @param expanded 原始展开路径集合\n * @returns 规范化后的路径数组\n */\nexport function sanitizeExpanded(expanded: unknown): string[] {\n if (!Array.isArray(expanded)) return []\n const seen = new Set<string>()\n const out: string[] = []\n for (const item of expanded) {\n const rel = normalizeExpanded(typeof item === 'string' ? item : null)\n if (rel === null || seen.has(rel)) continue\n seen.add(rel)\n out.push(rel)\n if (out.length >= EXPANDED_CAP) break\n }\n return out\n}\n\n/**\n * 序列化缓存数据(JSON;root 为 null 时省略,减小体积)。\n * @author ddj 2026年08月28号\n * @param data 缓存数据\n * @returns JSON 字符串\n */\nexport function serializeExplorer(data: ExplorerCacheData): string {\n const payload = data.root === null || data.root === undefined\n ? { v: 1, expanded: data.expanded }\n : { v: 1, root: data.root, expanded: data.expanded }\n return JSON.stringify(payload)\n}\n\n/**\n * 解析缓存文本;损坏/格式不符 → null。\n * @author ddj 2026年08月28号\n * @param text localStorage 原文\n * @returns 解析后的缓存数据,非法返回 null\n */\nexport function parseExplorer(text: string | null): ExplorerCacheData | null {\n if (!text) return null\n try {\n const data = JSON.parse(text)\n if (!data || typeof data !== 'object') return null\n const root = typeof data.root === 'string' && data.root ? data.root : null\n const expanded = sanitizeExpanded(data.expanded)\n return { root, expanded }\n } catch (error) {\n return null\n }\n}\n\n/**\n * 读取某会话的展开状态缓存(localStorage 不可用 → null)。\n * @author ddj 2026年08月28号\n * @param sessionId 会话 id\n * @returns 缓存数据或 null\n */\nexport function explorerLoad(sessionId: string): ExplorerCacheData | null {\n try {\n return parseExplorer(window.localStorage.getItem(KEY_PREFIX + String(sessionId)))\n } catch (error) {\n return null\n }\n}\n\n/**\n * 写入某会话的展开状态缓存(损坏/配额满 → 忽略)。\n * @author ddj 2026年08月28号\n * @param sessionId 会话 id\n * @param data 缓存数据\n */\nexport function explorerSave(sessionId: string, data: ExplorerCacheData): void {\n try {\n window.localStorage.setItem(KEY_PREFIX + String(sessionId), serializeExplorer(data))\n } catch (error) { /* 配额满/隐私模式忽略 */ }\n}\n","/**\n * dsh-vscode-mode client — 资源管理栏目录条目缓存(SWR:旧数据即时渲染 + 后台刷新)。\n * 与 explorerCache(展开状态持久化)互补:本文件只缓存目录条目数据,键按会话隔离。\n * 纯函数(序列化/解析/裁剪)导出可单测;内存镜像 Map 同步读避免每次渲染 parse\n * localStorage,落盘 300ms 防抖;配额满/隐私模式 try/catch 降级纯内存。\n * 作者 ddj 2026-08-31\n */\nimport type { TreeEntry } from '../../shared/rpc.js'\nimport { CACHE_KEY } from '../paths.js'\n\n// --region 常量\nconst KEY_PREFIX = CACHE_KEY.entries\n/** 缓存目录上限(超出按 ts 逐出最旧,保活热门目录)。 */\nexport const CACHE_MAX_DIRS = 300\n/** 单目录条目缓存上限(即时渲染用,刷新补齐全量)。 */\nexport const CACHE_DIR_ENTRIES = 500\n/** 新鲜度窗口:预取去重用(展示不受限,永远可用缓存渲染)。 */\nexport const CACHE_FRESH_MS = 30_000\n/** 落盘防抖。 */\nexport const CACHE_SAVE_DEBOUNCE_MS = 300\n// --endregion\n\n/** 单目录缓存条目。 */\nexport interface CachedDir {\n ts: number\n entries: TreeEntry[]\n}\n\n/** 缓存数据(v2:与 v1 展开状态缓存分离)。 */\nexport interface EntriesCacheData {\n v: 2\n root: string | null\n dirs: Record<string, CachedDir>\n}\n\n/** 裁剪到上限(目录按 ts 逐出最旧;单目录条目截断)。 */\nexport function entriesTrim(data: EntriesCacheData, maxDirs = CACHE_MAX_DIRS, maxEntries = CACHE_DIR_ENTRIES): EntriesCacheData {\n const dirs: Record<string, CachedDir> = {}\n const sorted = Object.entries(data.dirs).sort((a, b) => b[1].ts - a[1].ts)\n for (const [rel, dir] of sorted) {\n if (Object.keys(dirs).length >= maxDirs) break\n dirs[rel] = { ts: dir.ts, entries: dir.entries.length > maxEntries ? dir.entries.slice(0, maxEntries) : dir.entries }\n }\n return { v: 2, root: data.root, dirs }\n}\n\n/** 序列化缓存数据。 */\nexport function entriesSerialize(data: EntriesCacheData): string {\n return JSON.stringify(data)\n}\n\n/** 解析缓存文本;损坏/格式不符 → null。 */\nexport function entriesParse(text: string | null): EntriesCacheData | null {\n if (!text) return null\n try {\n const raw = JSON.parse(text) as { v?: unknown; root?: unknown; dirs?: unknown }\n if (!raw || raw.v !== 2 || !raw.dirs || typeof raw.dirs !== 'object') return null\n const dirs: Record<string, CachedDir> = {}\n for (const [rel, d] of Object.entries(raw.dirs)) {\n if (!d || typeof d !== 'object') continue\n const dir = d as { ts?: unknown; entries?: unknown }\n if (!Array.isArray(dir.entries)) continue\n const entries: TreeEntry[] = []\n for (const e of dir.entries) {\n if (!e || typeof e !== 'object') continue\n const item = e as { name?: unknown; path?: unknown; type?: unknown }\n if (typeof item.name !== 'string' || typeof item.path !== 'string') continue\n const type = item.type === 'directory' ? 'directory' : item.type === 'file' ? 'file' : 'other'\n entries.push({ name: item.name, path: item.path, type })\n }\n if (!entries.length) continue\n dirs[rel] = { ts: typeof dir.ts === 'number' ? dir.ts : 0, entries }\n }\n return { v: 2, root: typeof raw.root === 'string' ? raw.root : null, dirs }\n } catch (error) {\n return null\n }\n}\n\n// --region 内存镜像 + 防抖落盘\n/** sessionId → 缓存镜像(同步读,避免每次渲染 parse)。 */\nconst mirrors = new Map<string, EntriesCacheData>()\n/** sessionId → 落盘防抖计时器。 */\nconst saveTimers = new Map<string, ReturnType<typeof setTimeout>>()\n/** 单调时钟:连续 put 的 ts 严格递增(同毫秒不并列,逐出顺序可预期)。 */\nlet clock = 0\n\n/** 取下一时间戳(不小于真实时间且严格递增)。 */\nfunction nextTs(): number {\n clock = Math.max(Date.now(), clock + 1)\n return clock\n}\n\n/** localStorage 读取(不可用 → null)。 */\nfunction readRaw(sessionId: string): string | null {\n try {\n return window.localStorage.getItem(KEY_PREFIX + sessionId)\n } catch (error) {\n return null\n }\n}\n\n/** localStorage 写入(配额/隐私模式失败静默)。 */\nfunction writeRaw(sessionId: string, text: string): void {\n try {\n window.localStorage.setItem(KEY_PREFIX + sessionId, text)\n } catch (error) { /* 配额满/隐私模式忽略 */ }\n}\n\n/** 取(或建)会话缓存镜像。 */\nfunction mirrorOf(sessionId: string): EntriesCacheData {\n const existing = mirrors.get(sessionId)\n if (existing) return existing\n const data = entriesParse(readRaw(sessionId)) ?? { v: 2, root: null, dirs: {} }\n mirrors.set(sessionId, data)\n return data\n}\n\n/** 调度防抖落盘(重置已有计时器)。 */\nfunction scheduleSave(sessionId: string): void {\n const prev = saveTimers.get(sessionId)\n if (prev) clearTimeout(prev)\n saveTimers.set(sessionId, setTimeout(() => {\n saveTimers.delete(sessionId)\n const data = mirrors.get(sessionId)\n if (data) writeRaw(sessionId, entriesSerialize(entriesTrim(data)))\n }, CACHE_SAVE_DEBOUNCE_MS))\n}\n// --endregion\n\n/**\n * 读某目录缓存条目(无 → null;展示不受新鲜度限制)。\n * @author ddj 2026年08月31号\n * @param sessionId 会话 id\n * @param rel 目录相对路径('' = 根)\n * @returns 缓存条目或 null\n */\nexport function entriesCacheGet(sessionId: string | undefined, rel: string): TreeEntry[] | null {\n if (!sessionId) return null\n const dir = mirrorOf(sessionId).dirs[rel]\n if (!dir || !dir.entries.length) return null\n return dir.entries\n}\n\n/**\n * 某目录缓存是否新鲜(预取去重用)。\n * @author ddj 2026年08月31号\n * @param sessionId 会话 id\n * @param rel 目录相对路径\n * @returns 新鲜返回 true\n */\nexport function entriesCacheIsFresh(sessionId: string | undefined, rel: string): boolean {\n if (!sessionId) return false\n const dir = mirrorOf(sessionId).dirs[rel]\n return Boolean(dir && Date.now() - dir.ts < CACHE_FRESH_MS)\n}\n\n/**\n * 写入某目录缓存条目(内存镜像 + 防抖落盘;单目录条目截断)。\n * @author ddj 2026年08月31号\n * @param sessionId 会话 id\n * @param rel 目录相对路径\n * @param entries 目录条目\n */\nexport function entriesCachePut(sessionId: string | undefined, rel: string, entries: TreeEntry[]): void {\n if (!sessionId) return\n const data = mirrorOf(sessionId)\n data.dirs[rel] = { ts: nextTs(), entries: entries.slice(0, CACHE_DIR_ENTRIES) }\n const trimmed = entriesTrim(data)\n data.dirs = trimmed.dirs\n scheduleSave(sessionId)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏「文件管理」面板(懒加载目录树 + SWR 缓存)。\n * 展开目录立即渲染(dirs 内存态 → 本地条目缓存兜底),后台刷新(edrv.listDir 走\n * host 树索引,命中近乎零成本);挂载/切会话从缓存即时恢复展开树;⟳/edrv:refresh\n * 保留旧条目强制后台重列(force);每次用户发起加载后预取 ≤4 个子目录(排除重型\n * 目录、缓存新鲜跳过、不级联);10s 轻量跟随已展开目录(命中索引,RPC 近零成本)。\n * 差异角标/右键菜单/展开状态持久化行为不变。\n * 作者 ddj 2026-08-26 / 2026-08-27 / 2026-08-31\n */\nimport React from 'react'\nimport { rpc } from '../../rpc.js'\nimport { ContextMenu } from '../../ui/ContextMenu.js'\nimport { rowMenuPosition } from '../../ui/menuPosition.js'\nimport { buildTreeMenu } from '../contextMenu.js'\nimport { explorerLoad, explorerSave } from '../../state/explorerCache.js'\nimport { entriesCacheGet, entriesCacheIsFresh, entriesCachePut } from '../../state/explorerEntriesCache.js'\nimport type { SidebarCtx } from '../types.js'\n\nconst DIR_CAP = 4000\nconst SAVE_DEBOUNCE_MS = 300\nconst FOLLOW_INTERVAL_MS = 10_000\nconst PREFETCH_MAX = 4\nconst PREFETCH_EXCLUDED = new Set(['node_modules', '.git', '.hg', '.svn', '.pnpm', '.pnpm-store'])\n\n/**\n * 目录树面板主体(SWR:有缓存先渲染,无缓存才显示加载态;加载总在后台)。\n * @param props.ctx 面板共享上下文(sessionId/openFile/activePath/pendingByPath/fileMenuItems/notify)\n */\nexport function FileExplorer(props) {\n const ctx = props?.ctx\n const sessionId = ctx?.sessionId\n const openFile = ctx?.openFile\n const activePath = ctx?.activePath ?? null\n const pendingByPath = ctx?.pendingByPath ?? {}\n const [root, setRoot] = React.useState(null)\n const [dirs, setDirs] = React.useState({}) // rel → 最新条目(本会话内存态)\n const [expanded, setExpanded] = React.useState({})\n const [loading, setLoading] = React.useState({})\n const [errors, setErrors] = React.useState({}) // rel → 错误文案(仅无任何数据时展示)\n const [menu, setMenu] = React.useState(null) // 右键菜单 { x, y, target }\n // 各状态 ref 镜像:定时器/监听用最新闭包\n const tokensRef = React.useRef({})\n const expandedRef = React.useRef({})\n expandedRef.current = expanded\n const loadingRef = React.useRef({})\n loadingRef.current = loading\n const dirsRef = React.useRef({})\n dirsRef.current = dirs\n const saveTimerRef = React.useRef(null)\n const loadDirRef = React.useRef(null)\n const refreshRef = React.useRef(null)\n\n /** 渲染取数:内存态 → 本地条目缓存 → null(显示加载态)。 */\n const entriesOf = (rel) => dirsRef.current[rel] ?? entriesCacheGet(sessionId, rel) ?? null\n\n /** 预取子目录:≤4 个、排除重型目录、缓存新鲜跳过、已加载跳过、不级联。 */\n const prefetchDirs = (rel, entries) => {\n const want = []\n for (const e of entries) {\n if (e.type !== 'directory') continue\n if (PREFETCH_EXCLUDED.has(e.name)) continue\n if (entriesCacheIsFresh(sessionId, e.path)) continue\n if (dirsRef.current[e.path] !== undefined) continue\n want.push(e.path)\n if (want.length >= PREFETCH_MAX) break\n }\n for (const sub of want) void loadDir(sub, {})\n }\n\n /**\n * 后台加载目录:token 守卫防乱序;force 跳过索引命中强制实列;\n * 非 force 且已在途时跳过(避免轮询打断用户展开的响应)。\n */\n const loadDir = (rel, opts) => {\n const force = opts?.force === true\n const doPrefetch = opts?.prefetch === true\n if (!force && loadingRef.current[rel]) return\n const token = (tokensRef.current[rel] || 0) + 1\n tokensRef.current[rel] = token\n setLoading((prev) => Object.assign({}, prev, { [rel]: true }))\n setErrors((prev) => {\n const next = Object.assign({}, prev)\n delete next[rel]\n return next\n })\n const args = { sessionId, path: rel }\n if (force) args.force = true\n rpc('edrv.listDir', args).then((res) => {\n if (tokensRef.current[rel] !== token) return\n if (res && res.ok && Array.isArray(res.entries)) {\n setDirs((prev) => Object.assign({}, prev, { [rel]: res.entries }))\n if (res.root) setRoot((prev) => prev || res.root)\n entriesCachePut(sessionId, rel, res.entries)\n if (doPrefetch) prefetchDirs(rel, res.entries)\n } else {\n // 有可渲染数据时静默(旧数据可能过期但可用);全无数据才报错\n if (!entriesOf(rel)) {\n setErrors((prev) => Object.assign({}, prev, { [rel]: res?.error ? String(res.error) : '读取目录失败' }))\n }\n }\n }).catch((e) => {\n if (tokensRef.current[rel] !== token) return\n if (!entriesOf(rel)) {\n setErrors((prev) => Object.assign({}, prev, { [rel]: '读取目录异常:' + String(e) }))\n }\n }).finally(() => {\n if (tokensRef.current[rel] !== token) return\n setLoading((prev) => {\n const next = Object.assign({}, prev)\n delete next[rel]\n return next\n })\n })\n }\n loadDirRef.current = loadDir\n\n const toggle = (rel) => {\n if (expanded[rel] === true) {\n setExpanded((prev) => Object.assign({}, prev, { [rel]: false }))\n return\n }\n setExpanded((prev) => Object.assign({}, prev, { [rel]: true }))\n void loadDir(rel, { prefetch: true })\n }\n\n const refresh = () => {\n const keep = Object.keys(expandedRef.current).filter((k) => expandedRef.current[k] === true)\n tokensRef.current = {}\n setMenu(null)\n setErrors({})\n // SWR:保留旧条目不清空,后台强制重列(force 跳过索引)\n setLoading({})\n if (keep.length) {\n const next = {}\n for (const rel of keep) next[rel] = true\n setExpanded(next)\n for (const rel of keep) void loadDir(rel, { force: true, prefetch: true })\n } else {\n setExpanded({})\n }\n void loadDir('', { force: true, prefetch: true })\n }\n refreshRef.current = refresh\n\n React.useEffect(() => {\n tokensRef.current = {}\n setDirs({})\n setExpanded({})\n setLoading({})\n setErrors({})\n setMenu(null)\n setRoot(null)\n // 恢复上次展开状态(对齐 VSCode:持久化展开路径,条目缓存即时渲染、后台刷新)\n const cached = sessionId ? explorerLoad(sessionId) : null\n const restored = cached?.expanded ?? []\n if (cached?.root) setRoot(cached.root)\n if (restored.length) {\n const next = {}\n for (const rel of restored) next[rel] = true\n setExpanded(next)\n }\n void loadDir('', { prefetch: true })\n for (const rel of restored) {\n if (rel) void loadDir(rel, { prefetch: true })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sessionId])\n\n // 展开状态防抖写回 localStorage(重启后恢复展开结构)\n React.useEffect(() => {\n if (saveTimerRef.current) { clearTimeout(saveTimerRef.current); saveTimerRef.current = null }\n if (!sessionId) return\n saveTimerRef.current = setTimeout(() => {\n saveTimerRef.current = null\n const expandedList = Object.keys(expanded).filter((k) => expanded[k] === true)\n explorerSave(sessionId, { root, expanded: expandedList })\n }, SAVE_DEBOUNCE_MS)\n return () => {\n if (saveTimerRef.current) { clearTimeout(saveTimerRef.current); saveTimerRef.current = null }\n }\n }, [expanded, root, sessionId])\n\n // edrv:refresh(差异决策/回滚后):保留旧条目,强制后台重列\n React.useEffect(() => {\n const onRefresh = () => refreshRef.current?.()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => window.removeEventListener('edrv:refresh', onRefresh)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // 10s 轻量跟随:已展开目录后台刷新(命中 host 索引,近零成本),树跟随 agent 写入\n React.useEffect(() => {\n if (!sessionId) return\n const timer = setInterval(() => {\n const open = Object.keys(expandedRef.current).filter((k) => expandedRef.current[k] === true)\n if (!open.length) return\n for (const rel of open) loadDirRef.current?.(rel, {})\n }, FOLLOW_INTERVAL_MS)\n return () => clearInterval(timer)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sessionId])\n\n const rootName = root ? String(root).split(/[\\\\/]/).pop() || root : ''\n\n const rowEl = (e, depth, isDir, isOpen) => {\n const pending = isDir ? 0 : (pendingByPath[e.path] ?? 0)\n const active = !isDir && e.path === activePath\n const contextTarget = Boolean(menu && menuEntries.length && menu.target.path === e.path)\n const dim = e.type === 'other'\n return React.createElement('div', {\n key: e.path,\n className: 'edrv-tree-row'\n + (active ? ' edrv-tree-active' : '')\n + (contextTarget ? ' edrv-tree-context' : ''),\n title: e.path,\n style: { paddingLeft: 6 + depth * 14 },\n onClick: () => { if (isDir) toggle(e.path); else openFile(e.path) },\n onContextMenu: (ev) => {\n ev.preventDefault()\n ev.stopPropagation()\n const rect = ev.currentTarget?.getBoundingClientRect?.()\n const position = rowMenuPosition(rect, ev.clientX, ev.clientY)\n setMenu({ x: position.left, y: position.top, target: { path: e.path, type: e.type } })\n },\n },\n React.createElement('span', { className: 'edrv-tree-chev' },\n isDir ? (isOpen ? '▾' : '▸') : ''),\n React.createElement('span', { className: 'edrv-tree-name' + (dim ? ' edrv-tree-dim' : '') },\n isDir ? (isOpen ? '📂' : '📁') : '📄', ' ', e.name),\n (pending > 0\n ? React.createElement('span', { className: 'edrv-tree-badge' }, String(pending))\n : null))\n }\n\n const rowsOf = (rel, depth) => {\n const entries = entriesOf(rel)\n if (!entries) {\n return [React.createElement('div', { key: rel + ':loading', className: 'edrv-tree-loading', style: { paddingLeft: 6 + depth * 14 } },\n loading[rel] ? '加载中…' : '无法加载')]\n }\n const rows = []\n const cap = entries.length\n for (let i = 0; i < cap; i++) {\n const e = entries[i]\n const isDir = e.type === 'directory'\n const isOpen = expanded[e.path] === true\n rows.push(rowEl(e, depth, isDir, isOpen))\n if (isDir && isOpen) rows.push(...rowsOf(e.path, depth + 1))\n }\n if (cap >= DIR_CAP) {\n rows.push(React.createElement('div', { key: rel + ':cap', className: 'edrv-tree-loading', style: { paddingLeft: 6 + depth * 14 } },\n '目录条目过多,仅显示前 ' + DIR_CAP + ' 项'))\n }\n return rows\n }\n\n // 面板区右键(空白处)→ 工作区根目录菜单;行内右键已在 rowEl 阻止冒泡。\n const onPanelContext = (ev) => {\n ev.preventDefault()\n ev.stopPropagation()\n if (!ev.currentTarget.contains(ev.target)) return\n setMenu({ x: ev.clientX, y: ev.clientY, target: { path: '', type: 'directory' } })\n }\n // 当前右键目标的可视菜单项(构建时过滤/排序,registry 变化下次打开生效)。\n const menuEntries = menu\n ? buildTreeMenu(ctx?.fileMenuItems, menu.target, ctx).map((item) => ({\n id: item.id,\n label: item.label,\n danger: item.danger,\n disabled: item.disabled,\n separator: item.separator,\n onClick: () => item.run(menu.target, ctx),\n }))\n : []\n\n const errorList = Object.entries(errors)\n const errorText = errorList.length ? errorList[0][1] : null\n\n return React.createElement('div', { className: 'edrv-side-panel', onContextMenu: onPanelContext },\n React.createElement('div', { className: 'edrv-side-head' },\n React.createElement('span', { className: 'edrv-side-title' }, '资源管理器'),\n React.createElement('span', { className: 'edrv-side-root', title: root || '' }, rootName),\n React.createElement('span', { style: { flex: 1 } }),\n React.createElement('button', { className: 'edrv-side-btn', title: '刷新目录树', onClick: refresh }, '⟳')),\n React.createElement('div', { className: 'edrv-tree' },\n (errorText\n ? React.createElement('div', { className: 'edrv-tree-error' },\n React.createElement('span', null, String(errorText)),\n React.createElement('button', { className: 'edrv-side-btn', onClick: () => refresh() }, '重试'))\n : null),\n rowsOf('', 0)),\n (menu && menuEntries.length\n ? React.createElement(ContextMenu, { x: menu.x, y: menu.y, entries: menuEntries, onClose: () => setMenu(null) })\n : null))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏「搜索」面板(VSCode 搜索视图形态)。\n * 内容搜索:edrv.searchContent RPC;结果按文件分组展示命中行(行号 + 高亮 + 文件计数),\n * 点击经 ctx.openFileAt 打开文件并跳转行列。\n * 选项:大小写/全词/正则;折叠区(⚙ 齿轮展开):包含的文件(📖 toggle = 仅当前打开文件)\n * 与排除的文件(⚙ toggle = 启用排除),模式为逗号分隔 rg glob;无搜索按钮,防抖 + 回车触发。\n * 作者 ddj 2026-08-26\n */\nimport React from 'react'\nimport { rpc } from '../../rpc.js'\nimport type { SidebarCtx } from '../types.js'\nimport { CACHE_KEY } from '../../paths.js'\n\nconst DEBOUNCE_MS = 250\nconst INCLUDE_PLACEHOLDER = '例如 *.ts, src/**/include'\n\n/**\n * 逗号切分 glob 列表(trim + 去空)。\n * @param text 用户输入的逗号分隔模式\n * @returns glob 数组\n */\nexport function splitGlobs(text) {\n return String(text ?? '').split(',').map((item) => item.trim()).filter(Boolean)\n}\n\n/**\n * 命中行文本三段切分(before/命中/after,列为 1-based UTF-16)。\n * @param text 行文本\n * @param start 起始列\n * @param end 结束列\n * @returns 三段文本\n */\nfunction splitHit(text, start, end) {\n const s = Math.max(0, (start | 0) - 1)\n const e = Math.max(s, end | 0)\n return { before: String(text).slice(0, s), hit: String(text).slice(s, e), after: String(text).slice(e) }\n}\n\n/**\n * 搜索面板主体。\n * @param props.ctx 面板共享上下文(sessionId/openFileAt/activePath)\n */\nexport function SearchPanel(props) {\n const ctx = props?.ctx\n const sessionId = ctx?.sessionId\n const openFileAt = ctx?.openFileAt ?? (() => {})\n const activePath = ctx?.activePath ?? null\n const [query, setQuery] = React.useState('')\n const [matchCase, setMatchCase] = React.useState(false)\n const [wholeWord, setWholeWord] = React.useState(false)\n const [regex, setRegex] = React.useState(false)\n const [includeText, setIncludeText] = React.useState('')\n const [excludeText, setExcludeText] = React.useState('')\n const [onlyActive, setOnlyActive] = React.useState(false)\n const [excludeOn, setExcludeOn] = React.useState(false)\n const [sectionOpen, setSectionOpen] = React.useState(false)\n const [status, setStatus] = React.useState('idle') // idle | searching | done | error\n const [error, setError] = React.useState('')\n const [warning, setWarning] = React.useState('') // rg 遍历错误时的部分结果提示(结果照常展示)\n const [matches, setMatches] = React.useState(null)\n const [truncated, setTruncated] = React.useState(false)\n const [collapsed, setCollapsed] = React.useState({})\n const seqRef = React.useRef(0)\n const timerRef = React.useRef(null)\n const inputRef = React.useRef(null)\n const queryRef = React.useRef('')\n queryRef.current = query\n const activePathRef = React.useRef(activePath)\n activePathRef.current = activePath\n // 请求参数 ref:防抖/立即重搜闭包统一读最新值,避免陈旧选项\n const requestRef = React.useRef({ matchCase, wholeWord, regex, include: [], exclude: [] })\n requestRef.current = {\n matchCase, wholeWord, regex,\n include: onlyActive ? (activePath ? [activePath] : []) : splitGlobs(includeText),\n exclude: excludeOn ? splitGlobs(excludeText) : [],\n }\n\n // 按会话恢复上次查询、选项与过滤模式(VSCode 记忆搜索词)\n React.useEffect(() => {\n if (!sessionId) return\n try {\n const saved = JSON.parse(localStorage.getItem(CACHE_KEY.search + String(sessionId)) || 'null')\n if (saved && typeof saved === 'object') {\n if (typeof saved.query === 'string') setQuery(saved.query)\n if (typeof saved.matchCase === 'boolean') setMatchCase(saved.matchCase)\n if (typeof saved.wholeWord === 'boolean') setWholeWord(saved.wholeWord)\n if (typeof saved.regex === 'boolean') setRegex(saved.regex)\n if (typeof saved.includeText === 'string') setIncludeText(saved.includeText)\n if (typeof saved.excludeText === 'string') setExcludeText(saved.excludeText)\n if (typeof saved.onlyActive === 'boolean') setOnlyActive(saved.onlyActive)\n if (typeof saved.excludeOn === 'boolean') setExcludeOn(saved.excludeOn)\n if (typeof saved.sectionOpen === 'boolean') setSectionOpen(saved.sectionOpen)\n }\n } catch (e) { /* 损坏忽略 */ }\n }, [sessionId])\n\n // 查询/选项/过滤变化 → 持久化\n React.useEffect(() => {\n if (!sessionId) return\n try {\n localStorage.setItem(CACHE_KEY.search + String(sessionId), JSON.stringify({\n query, matchCase, wholeWord, regex, includeText, excludeText, onlyActive, excludeOn, sectionOpen,\n }))\n } catch (e) { /* 忽略 */ }\n }, [sessionId, query, matchCase, wholeWord, regex, includeText, excludeText, onlyActive, excludeOn, sectionOpen])\n\n /**\n * 执行内容搜索(请求参数从 ref 读最新值)。\n * @param text 搜索词\n */\n const runSearch = (text) => {\n const s = ++seqRef.current\n const clean = String(text ?? '').trim()\n if (clean.length < 2) { setMatches(null); setStatus('idle'); return }\n const req = requestRef.current\n setStatus('searching')\n setError('')\n setWarning('')\n rpc('edrv.searchContent', {\n sessionId, query: clean,\n matchCase: req.matchCase, wholeWord: req.wholeWord, regex: req.regex,\n include: req.include, exclude: req.exclude,\n }).then((res) => {\n if (s !== seqRef.current) return\n if (res && res.ok) {\n setMatches(Array.isArray(res.matches) ? res.matches : [])\n setTruncated(res.truncated === true)\n setWarning(res?.warning ? String(res.warning) : '')\n setStatus('done')\n } else {\n setError(res?.error ? String(res.error) : '搜索失败')\n setMatches(null)\n setStatus('error')\n }\n }).catch((e) => {\n if (s !== seqRef.current) return\n setError('搜索异常:' + String(e))\n setMatches(null)\n setStatus('error')\n })\n }\n\n /**\n * 输入变化:防抖触发搜索。\n * @param value 新输入\n */\n const onChange = (value) => {\n setQuery(value)\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => runSearch(value), DEBOUNCE_MS)\n }\n\n /**\n * 输入框通用防抖重搜(包含/排除模式输入)。\n * @param setter 状态写入函数\n * @param value 新值\n */\n const onChangeDebounced = (setter, value) => {\n setter(value)\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => runSearch(queryRef.current), DEBOUNCE_MS)\n }\n\n /**\n * 立即重搜(查询 ≥2 字符时);先同步 ref 避免本次调用读到旧请求参数。\n * @param next 新的请求参数字段\n */\n const rerun = (next) => {\n requestRef.current = Object.assign({}, requestRef.current, next)\n if (timerRef.current) clearTimeout(timerRef.current)\n if (String(queryRef.current).trim().length >= 2) runSearch(queryRef.current)\n }\n\n /** 选项开关切换(大小写/全词/正则/书本/设置):更新状态 + 立即重搜。 */\n const toggleOpt = (key, value) => {\n if (key === 'matchCase') setMatchCase(value)\n if (key === 'wholeWord') setWholeWord(value)\n if (key === 'regex') setRegex(value)\n if (key === 'onlyActive') setOnlyActive(value)\n if (key === 'excludeOn') setExcludeOn(value)\n const base = { matchCase, wholeWord, regex, onlyActive, excludeOn }\n base[key] = value\n rerun({\n matchCase: base.matchCase, wholeWord: base.wholeWord, regex: base.regex,\n include: base.onlyActive ? (activePathRef.current ? [activePathRef.current] : []) : splitGlobs(includeText),\n exclude: base.excludeOn ? splitGlobs(excludeText) : [],\n })\n }\n\n // Ctrl+Shift+F 重复触发时聚焦输入框(EditorView 派发 edrv:search-focus)\n React.useEffect(() => {\n const onFocus = () => inputRef.current?.focus?.()\n window.addEventListener('edrv:search-focus', onFocus)\n return () => window.removeEventListener('edrv:search-focus', onFocus)\n }, [])\n\n // 结果按文件分组(保持 rg 输出顺序)\n const groups = React.useMemo(() => {\n if (!Array.isArray(matches)) return []\n const map = new Map()\n for (const m of matches) {\n let list = map.get(m.path)\n if (!list) { list = []; map.set(m.path, list) }\n list.push(m)\n }\n return [...map.entries()].map(([path, list]) => ({ path, count: list.length, matches: list }))\n }, [matches])\n\n const totalFiles = groups.length\n const totalMatches = Array.isArray(matches) ? matches.length : 0\n const toggleGroup = (path) => setCollapsed((prev) => Object.assign({}, prev, { [path]: prev[path] === true ? false : true }))\n\n const optsBar = React.createElement('div', { className: 'edrv-search-opts' },\n React.createElement('button', { className: 'edrv-search-opt' + (matchCase ? ' on' : ''), title: '区分大小写', 'aria-pressed': matchCase, onClick: () => toggleOpt('matchCase', !matchCase) }, 'Aa'),\n React.createElement('button', { className: 'edrv-search-opt' + (wholeWord ? ' on' : ''), title: '全字匹配', 'aria-pressed': wholeWord, onClick: () => toggleOpt('wholeWord', !wholeWord) }, 'Ab'),\n React.createElement('button', { className: 'edrv-search-opt' + (regex ? ' on' : ''), title: '使用正则表达式', 'aria-pressed': regex, onClick: () => toggleOpt('regex', !regex) }, '.*'),\n React.createElement('span', { className: 'edrv-search-spacer' }),\n React.createElement('button', { className: 'edrv-search-opt' + (sectionOpen ? ' on' : ''), title: sectionOpen ? '收起文件过滤' : '文件过滤(包含/排除)', 'aria-pressed': sectionOpen, onClick: () => setSectionOpen((v) => !v) }, '⚙'))\n\n const filterRows = sectionOpen\n ? React.createElement('div', { className: 'edrv-search-rows' },\n React.createElement('div', { className: 'edrv-search-row' },\n React.createElement('input', {\n className: 'edrv-search-field' + (onlyActive ? ' dim' : ''), placeholder: INCLUDE_PLACEHOLDER,\n value: includeText, disabled: onlyActive,\n title: onlyActive ? '已启用「仅当前打开文件」,忽略此输入' : '',\n onChange: (e) => onChangeDebounced(setIncludeText, e.target.value),\n }),\n React.createElement('button', {\n className: 'edrv-search-toggle' + (onlyActive ? ' on' : ''), title: activePath ? '仅在当前打开的文件中搜索' : '无打开的文件(需先打开文件)',\n 'aria-pressed': onlyActive, disabled: !activePath,\n onClick: () => toggleOpt('onlyActive', !onlyActive),\n }, '📖')),\n React.createElement('div', { className: 'edrv-search-row' },\n React.createElement('input', {\n className: 'edrv-search-field' + (excludeOn ? '' : ' dim'), placeholder: INCLUDE_PLACEHOLDER,\n value: excludeText, disabled: !excludeOn,\n title: excludeOn ? '' : '排除功能未启用,先点击右侧按钮开启',\n onChange: (e) => onChangeDebounced(setExcludeText, e.target.value),\n }),\n React.createElement('button', {\n className: 'edrv-search-toggle' + (excludeOn ? ' on' : ''), title: '启用排除文件(忽略下方模式的命中)',\n 'aria-pressed': excludeOn,\n onClick: () => toggleOpt('excludeOn', !excludeOn),\n }, '⚙')))\n : null\n\n const summary = status === 'done'\n ? React.createElement('div', { className: 'edrv-search-summary' },\n totalFiles > 0\n ? totalFiles + ' 个文件 · ' + totalMatches + ' 处匹配' + (truncated ? '(已截断)' : '')\n : '无匹配结果')\n : null\n\n const warnBanner = warning\n ? React.createElement('div', { className: 'edrv-search-warn', title: warning }, warning)\n : null\n\n const body = (() => {\n if (status === 'searching') return React.createElement('div', { className: 'edrv-search-empty' }, '搜索中…')\n if (status === 'error') return React.createElement('div', { className: 'edrv-search-error' }, error)\n if (status === 'done' && !groups.length) return React.createElement('div', { className: 'edrv-search-empty' }, '无匹配结果')\n if (status !== 'done') return React.createElement('div', { className: 'edrv-search-empty' }, '输入至少 2 个字符开始搜索')\n return React.createElement('div', { className: 'edrv-search-results' },\n groups.map((group) => {\n const open = collapsed[group.path] !== true\n return React.createElement('div', { key: group.path, className: 'edrv-search-group' },\n React.createElement('div', { className: 'edrv-search-file', title: group.path, onClick: () => toggleGroup(group.path) },\n React.createElement('span', { className: 'edrv-search-chev' }, open ? '▾' : '▸'),\n React.createElement('span', { className: 'edrv-search-fname' }, String(group.path).split(/[\\\\/]/).pop() || group.path),\n React.createElement('span', { className: 'edrv-search-fdir' }, String(group.path).split(/[\\\\/]/).slice(0, -1).join('/')),\n React.createElement('span', { className: 'edrv-search-fcount' }, group.count)),\n open ? group.matches.map((m, i) => {\n const parts = splitHit(m.text, m.startColumn, m.endColumn)\n return React.createElement('div', { key: m.path + ':' + m.line + ':' + i, className: 'edrv-search-line' + (i % 2 ? ' alt' : ''), title: group.path + ':' + m.line, onClick: () => openFileAt(m.path, m.line, m.startColumn) },\n React.createElement('span', { className: 'edrv-search-ln' }, m.line),\n React.createElement('span', { className: 'edrv-search-text' },\n React.createElement('span', null, parts.before),\n React.createElement('mark', { className: 'edrv-search-hit' }, parts.hit),\n React.createElement('span', null, parts.after)))\n }) : null)\n }))\n })()\n\n return React.createElement('div', { className: 'edrv-search-panel' },\n React.createElement('div', { className: 'edrv-search-qrow' },\n React.createElement('input', {\n ref: inputRef, className: 'edrv-search-input', autoFocus: true, autoComplete: 'off', spellCheck: false,\n placeholder: '搜索',\n value: query,\n onChange: (e) => onChange(e.target.value),\n onKeyDown: (e) => {\n if (e.key === 'Enter') { if (timerRef.current) clearTimeout(timerRef.current); runSearch(queryRef.current) }\n if (e.key === 'Escape') inputRef.current?.blur?.()\n },\n })),\n optsBar,\n filterRows,\n summary,\n warnBanner,\n body)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏面板定义(文件管理 + 搜索)。\n * 作者 ddj 2026-08-26 / 2026-08-26\n */\nimport React from 'react'\nimport { FileExplorer } from './FileExplorer.js'\nimport { SearchPanel } from './SearchPanel.js'\nimport type { SidebarPanelDef, SidebarCtx } from '../types.js'\n\n/**\n * 构造文件管理面板定义。\n * @author ddj 2026年08月26号\n * @returns 面板定义(含活动栏徽标 = 差异文件总数)\n */\nexport function createFilePanel(): SidebarPanelDef {\n return {\n id: 'explorer',\n title: '文件管理',\n icon: '📁',\n order: 10,\n badge: (ctx: SidebarCtx) => (ctx.sum && ctx.sum.totalFiles > 0 ? ctx.sum.totalFiles : null),\n render: (ctx: SidebarCtx) => React.createElement(FileExplorer, { ctx }),\n }\n}\n\n/**\n * 构造搜索面板定义。\n * @author ddj 2026年08月30号\n * @returns 面板定义(无徽标;活动栏图标 🔍)\n */\nexport function createSearchPanel(): SidebarPanelDef {\n return {\n id: 'search',\n title: '搜索',\n icon: '🔍',\n order: 15,\n render: (ctx: SidebarCtx) => React.createElement(SearchPanel, { ctx }),\n }\n}\n","/**\n * dsh-vscode-mode client — 文件管理右键菜单内置项。\n * 首个内置项:「在文件浏览器中打开」(文件→OS Explorer 定位选中、目录→打开目录)。\n * 反馈统一走 ctx.notify(由 EditorView 提供,落到编辑区路径栏状态)。\n * 作者 ddj 2026-08-27\n */\nimport { revealInExplorer } from '../fileReveal.js'\nimport type { TreeMenuItem } from './contextMenu.js'\n\n/**\n * 构造内置右键菜单项列表(后续内置项直接追加)。\n * @author ddj 2026年08月27号\n * @returns 内置菜单项数组\n */\nexport function createDefaultFileMenuItems(): TreeMenuItem[] {\n return [\n {\n id: 'reveal-in-explorer',\n label: '在文件浏览器中打开',\n order: 0,\n run: (target, ctx) => {\n void revealInExplorer(ctx.sessionId, target.path).then((outcome) => {\n ctx.notify?.(outcome.ok ? '已在文件浏览器中打开' : '打开失败:' + (outcome.error ?? '未知错误'))\n })\n },\n },\n ]\n}\n","/**\n * dsh-vscode-mode client — 大纲兜底解析器(纯函数,无 DOM/Monaco 依赖,node 可测)。\n * 覆盖无内置 document symbol provider 的语言:markdown/mdx、python、shell、powershell、\n * lua、go、rust、yaml、ini(toml)、花括号语言(c/cpp/csharp/java/php/ruby/kotlin/swift/dart)。\n * TS/JS/JSON/CSS/HTML 有 Monaco 原生 provider,不走这里。\n * 作者 ddj 2026-08-27\n */\nimport type { OutlineSymbol } from './types.js'\n\n/** monaco SymbolKind 数值常量(与 LSP SymbolKind 一致,面板渲染按此分组)。 */\nexport const SK = {\n File: 0, Module: 1, Namespace: 2, Package: 3, Class: 4, Method: 5,\n Property: 6, Field: 7, Constructor: 8, Enum: 9, Interface: 10,\n Function: 11, Variable: 12, Constant: 13, String: 14, Number: 15,\n Boolean: 16, Array: 17, Object: 18, Key: 19, Null: 20, EnumMember: 21,\n Struct: 22, Event: 23, Operator: 24, TypeParameter: 25,\n} as const\n\n/** 花括号语言的泛型函数名排除集(避免误把控制流/关键字当符号)。 */\nconst BRACE_KW = new Set([\n 'if', 'for', 'while', 'switch', 'catch', 'foreach', 'using', 'with', 'when',\n 'match', 'return', 'new', 'in', 'of', 'do', 'else', 'elif', 'then', 'yield',\n 'await', 'typeof', 'instanceof', 'case', 'default', 'try', 'finally', 'throw',\n])\n\n/** 花括号语言的类型关键字 → SymbolKind。 */\nconst BRACE_TYPE_KIND: Record<string, number> = {\n class: SK.Class, struct: SK.Struct, interface: SK.Interface, enum: SK.Enum,\n namespace: SK.Namespace, module: SK.Module, trait: SK.Interface, record: SK.Class,\n}\n\n/** 按文档序(先序)补齐每个符号的 endLine:叶子取“下一个符号起行 - 1”,容器取末子 endLine。 */\nfunction computeEnds(symbols: OutlineSymbol[], lastLine: number): void {\n const order: OutlineSymbol[] = []\n const collect = (list: OutlineSymbol[]): void => {\n for (const s of list) {\n order.push(s)\n if (s.children && s.children.length) collect(s.children)\n }\n }\n collect(symbols)\n for (let i = order.length - 1; i >= 0; i--) {\n const s = order[i]\n const kids = s.children ?? []\n if (kids.length) {\n s.endLine = Math.max(s.startLine, kids[kids.length - 1].endLine)\n } else {\n const next = order[i + 1]\n const end = next ? Math.max(s.startLine, next.startLine - 1) : lastLine\n s.endLine = Math.max(s.startLine, Math.min(end, lastLine))\n }\n }\n}\n\n/** 构造单行符号(起始行=跳转行=所在行;detail 为截断后的声明文本)。 */\nfunction mk(lineIndex: number, name: string, kind: number, raw: string): OutlineSymbol {\n const detail = raw.trim().replace(/\\s+/g, ' ').slice(0, 80)\n const line = lineIndex + 1\n const out: OutlineSymbol = { name, kind, startLine: line, endLine: line, selectLine: line }\n if (detail && detail !== name) out.detail = detail\n return out\n}\n\n/** Markdown/mdx:`#` 级标题,层级嵌套。 */\nfunction parseMarkdown(text: string): OutlineSymbol[] {\n const roots: OutlineSymbol[] = []\n const stack: Array<{ level: number; item: OutlineSymbol }> = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const m = /^(\\#{1,6})\\s+(.+?)\\s*#*\\s*$/.exec(lines[i])\n if (!m) continue\n const item: OutlineSymbol = {\n name: m[2].trim(), kind: SK.Namespace,\n startLine: i + 1, endLine: i + 1, selectLine: i + 1, children: [],\n }\n while (stack.length && stack[stack.length - 1].level >= m[1].length) stack.pop()\n const parent = stack.length ? stack[stack.length - 1].item : null\n ;(parent ? parent.children : roots)!.push(item)\n stack.push({ level: m[1].length, item })\n }\n computeEnds(roots, lines.length)\n return roots\n}\n\n/** Python:def/class 按缩进栈嵌套。 */\nfunction parsePython(text: string): OutlineSymbol[] {\n const roots: OutlineSymbol[] = []\n const stack: Array<{ indent: number; item: OutlineSymbol }> = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const m = /^([ \\t]*)(?:class|def)\\s+([A-Za-z_]\\w*)\\s*[(:]/.exec(lines[i])\n if (!m) continue\n const indent = m[1].replace(/\\t/g, ' ').length\n const isClass = /class\\s/.test(lines[i])\n const item: OutlineSymbol = {\n name: m[2], kind: isClass ? SK.Class : SK.Function,\n startLine: i + 1, endLine: i + 1, selectLine: i + 1, children: [],\n }\n while (stack.length && stack[stack.length - 1].indent >= indent) stack.pop()\n const parent = stack.length ? stack[stack.length - 1].item : null\n ;(parent ? parent.children : roots)!.push(item)\n stack.push({ indent, item })\n }\n computeEnds(roots, lines.length)\n return roots\n}\n\n/** Shell:`name() {` 函数。 */\nfunction parseShell(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const m = /^[ \\t]*([A-Za-z_][A-Za-z0-9_]*)[ \\t]*\\(\\)[ \\t]*\\{/.exec(lines[i])\n if (m) out.push(mk(i, m[1], SK.Function, lines[i]))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** PowerShell:`function Name {` / `filter Name {`。 */\nfunction parsePwsh(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const m = /^[ \\t]*(?:function|filter)[ \\t]+([\\w.-]+)/.exec(lines[i])\n if (m) out.push(mk(i, m[1], SK.Function, lines[i]))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** Lua:`function Foo:bar` / `M.bar = class|function` + EmmyLua 注解(---@class/@alias/@enum/@field)。 */\nfunction parseLua(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n /** 当前注解类(收拢紧随的 ---@field 为字段子节点)。 */\n let pendingClass: OutlineSymbol | null = null\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n // EmmyLua 注解(---@):class/alias/enum 进大纲根,field 收给当前类\n const am = /^[ \\t]*---@(class|alias|enum|field|type)\\s+([^\\r\\n]+)/.exec(line)\n if (am) {\n const tag = am[1]\n const rest = am[2].trim()\n const name = (rest.match(/^([A-Za-z_][\\w]*)/) || [])[1] ?? ''\n if (tag === 'class') {\n if (name) {\n const item = mk(i, name, SK.Class, line)\n item.children = []\n out.push(item)\n pendingClass = item\n } else pendingClass = null\n } else if (tag === 'alias') {\n if (name) out.push(mk(i, name, SK.TypeParameter, line))\n pendingClass = null\n } else if (tag === 'enum') {\n if (name) out.push(mk(i, name, SK.Enum, line))\n pendingClass = null\n } else if (tag === 'field') {\n if (name && pendingClass) {\n pendingClass.children!.push(mk(i, name, SK.Field, line))\n }\n } else if (tag === 'type') {\n pendingClass = null\n }\n continue\n }\n if (/^\\s*--/.test(line)) continue\n const fm = /^[ \\t]*(?:local[ \\t]+)?function[ \\t]+([A-Za-z_][\\w.:]*)/.exec(line)\n if (fm) { out.push(mk(i, fm[1], SK.Function, line)); continue }\n const cm = /^[ \\t]*([A-Za-z_][\\w.]*)[ \\t]*=[ \\t]*(?:class|function)\\b/.exec(line)\n if (cm) out.push(mk(i, cm[1], /class\\b/.test(line) ? SK.Class : SK.Function, line))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** Go:func(含 receiver)/ type。 */\nfunction parseGo(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const fm = /^[ \\t]*func[ \\t]+(?:\\([^)]*\\)[ \\t]*)?([A-Za-z_]\\w*)/.exec(lines[i])\n if (fm) { out.push(mk(i, fm[1], SK.Function, lines[i])); continue }\n const tm = /^[ \\t]*type[ \\t]+([A-Za-z_]\\w*)/.exec(lines[i])\n if (tm) out.push(mk(i, tm[1], SK.Struct, lines[i]))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** Rust:fn/struct/enum/trait/impl/mod/type。 */\nfunction parseRust(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n const kindOf: Record<string, number> = {\n fn: SK.Function, struct: SK.Struct, enum: SK.Enum, trait: SK.Interface,\n impl: SK.Module, mod: SK.Module, type: SK.TypeParameter,\n }\n for (let i = 0; i < lines.length; i++) {\n const m = /^[ \\t]*(?:pub(?:\\([^)]*\\))?[ \\t]+)?(fn|struct|enum|trait|impl|mod|type)[ \\t]+([A-Za-z_]\\w*)/.exec(lines[i])\n if (m && kindOf[m[1]]) out.push(mk(i, m[2], kindOf[m[1]], lines[i]))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** YAML:仅顶层键。 */\nfunction parseYaml(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n if (!line.trim() || /^\\s/.test(line) || /^\\s*[#-]/.test(line)) continue\n const m = /^([A-Za-z0-9_.\\-]+)\\s*:/.exec(line)\n if (m) out.push(mk(i, m[1], SK.Key, line))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** INI/TOML:`[section]` + `key=value`。 */\nfunction parseIni(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n if (!line.trim() || /^\\s*[;#]/.test(line)) continue\n const sm = /^\\[([^\\]]+)\\]/.exec(line)\n if (sm) { out.push(mk(i, sm[1], SK.Namespace, line)); continue }\n const km = /^([A-Za-z0-9_.\\-]+)\\s*[=:]/.exec(line.trim())\n if (km) out.push(mk(i, km[1], SK.Key, line))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** 花括号语言(C 族/JVM/.NET):类型声明 + 泛型函数扫描(扁平,best-effort)。 */\nfunction parseBrace(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n const typeRe = /^[ \\t]*(?:(?:public|private|protected|internal|static|final|abstract|sealed|readonly|export|declare|async|open|extern|virtual|override|const|global|pub|local)\\s+)*(class|struct|interface|enum|namespace|module|trait|record)\\s+([A-Za-z_]\\w*)/\n // 泛型函数:允许任意“字词型”返回类型/修饰符前缀(含 :: 限定名),名字后跟 ( 且不以 ; 结尾\n const funcRe = /^[ \\t]*(?:[\\w<>,*&\\[\\].:]+\\s+)*([A-Za-z_]\\w*)\\s*(?:<[^>]*>)?\\s*\\(/\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n const t = line.trim()\n if (!t || /^\\s*\\*/.test(line)) continue\n const tm = typeRe.exec(line)\n if (tm) { out.push(mk(i, tm[2], BRACE_TYPE_KIND[tm[1]] ?? SK.Class, line)); continue }\n const fm = funcRe.exec(line)\n if (!fm) continue\n if (BRACE_KW.has(fm[1]) || /;\\s*$/.test(t)) continue\n out.push(mk(i, fm[1], SK.Function, line))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/**\n * 按 Monaco languageId 解析大纲符号(纯函数)。\n * @author ddj 2026年08月27号\n * @param languageId Monaco 语言 id\n * @param text 文件全文\n * @returns 归一化大纲符号树\n */\nexport function parseOutline(languageId: string, text: string): OutlineSymbol[] {\n switch (languageId) {\n case 'markdown':\n case 'mdx':\n return parseMarkdown(text)\n case 'python':\n return parsePython(text)\n case 'shell':\n return parseShell(text)\n case 'powershell':\n return parsePwsh(text)\n case 'lua':\n return parseLua(text)\n case 'go':\n return parseGo(text)\n case 'rust':\n return parseRust(text)\n case 'yaml':\n return parseYaml(text)\n case 'ini':\n return parseIni(text)\n case 'c':\n case 'cpp':\n case 'csharp':\n case 'java':\n case 'php':\n case 'ruby':\n case 'kotlin':\n case 'swift':\n case 'dart':\n return parseBrace(text)\n default:\n return []\n }\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 大纲源注册表 + 内置数据源(monaco / fallback)。\n * 解析规则:按优先级降序遍历源,首个非空结果生效;全空 → 空态。\n * monaco 源吃 Monaco 原生 document symbol provider(ts/json/css/html 与未来\n * 第三方注册的 provider);fallback 源兜底无内置提供方的语言(parse.ts)。\n * 注册表对外 provide 为 edrvOutlineSources,第三方语言插件可注册更高优先级源。\n * 作者 ddj 2026-08-27\n */\nimport type { OutlineSourceRegistry, OutlineSource, OutlineSourceInput, OutlineSymbol } from './types.js'\nimport { parseOutline } from './parse.js'\n\n/** Monaco 原生有 document symbol provider 的语言(无需 fallback)。 */\nexport const OUTLINE_MONACO_LANGS = new Set([\n 'typescript', 'javascript', 'json', 'jsonc', 'css', 'scss', 'less', 'html',\n])\n\n/** 无内置 provider、由 parse.ts 兜底的语言。 */\nexport const OUTLINE_FALLBACK_LANGS = new Set([\n 'markdown', 'mdx', 'python', 'shell', 'powershell', 'lua', 'go', 'rust',\n 'yaml', 'ini', 'c', 'cpp', 'csharp', 'java', 'php', 'ruby', 'kotlin',\n 'swift', 'dart',\n])\n\n/**\n * 创建生命周期独立的大纲源注册表。\n * @author ddj 2026年08月27号\n * @returns 大纲源注册表\n */\nexport function createOutlineSourceRegistry(): OutlineSourceRegistry {\n const entries = new Map<string, OutlineSource>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) listener()\n }\n const list = (): readonly OutlineSource[] =>\n [...entries.values()].sort((a, b) => (b.priority - a.priority) || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))\n return {\n register(source: OutlineSource): () => void {\n if (!source || !source.id || typeof source.get !== 'function') throw new TypeError('大纲源必须提供 id 与 get')\n entries.set(source.id, source)\n notify()\n return () => {\n if (entries.get(source.id) !== source) return\n entries.delete(source.id)\n notify()\n }\n },\n list,\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n get: (id: string) => entries.get(id),\n }\n}\n\n/** 归一化 Monaco OutlineElement(getTopLevelSymbols 产物)→ OutlineSymbol。 */\nfunction normalizeMonaco(el): OutlineSymbol | null {\n if (!el || typeof el.name !== 'string') return null\n const range = el.range || {}\n const sel = el.selectionRange || range\n const startLine = Math.max(1, Number(sel.startLineNumber ?? range.startLineNumber ?? 1))\n const endLine = Math.max(1, Number(range.endLineNumber ?? startLine))\n const out: OutlineSymbol = {\n name: el.name,\n kind: typeof el.kind === 'number' ? el.kind : 0,\n startLine: Math.max(1, Number(range.startLineNumber ?? startLine)),\n endLine,\n selectLine: startLine,\n }\n if (typeof el.detail === 'string' && el.detail) out.detail = el.detail\n if (Array.isArray(el.children) && el.children.length) {\n const kids = el.children.map(normalizeMonaco).filter(Boolean)\n if (kids.length) out.children = kids\n }\n return out\n}\n\n/**\n * 按优先级解析大纲符号:首个非空结果生效(出错源跳过,落入下一优先级)。\n * @author ddj 2026年08月27号\n * @param sources 大纲源注册表\n * @param input 当前快照(languageId/model/editor/monaco)\n * @returns 归一化符号树(无符号时为空数组)\n */\nexport async function resolveOutline(sources: OutlineSourceRegistry, input: OutlineSourceInput): Promise<OutlineSymbol[]> {\n for (const source of sources.list()) {\n let supports = false\n try { supports = source.provides(input.languageId) } catch { supports = false }\n if (!supports) continue\n let items: OutlineSymbol[] | null = null\n try { items = await source.get(input) } catch { items = null }\n if (items && items.length) return items\n }\n return []\n}\n\n/**\n * 注册内置大纲源(monaco=50 / fallback=30)。\n * @author ddj 2026年08月27号\n * @param registry 目标注册表\n * @returns 注销函数(同时注销全部内置源)\n */\nexport function registerBuiltinOutlineSources(registry: OutlineSourceRegistry): () => void {\n const disposers = [\n registry.register({\n id: 'monaco',\n priority: 50,\n provides: () => true,\n async get(input: OutlineSourceInput): Promise<OutlineSymbol[]> {\n const ed = input.editor\n const model = input.model\n const cmd = ed?._commandService\n if (!cmd || typeof cmd.executeCommand !== 'function') return []\n const uri = model?.uri\n if (!uri) return []\n const list = await cmd.executeCommand('_executeDocumentSymbolProvider', uri)\n return Array.isArray(list) ? list.map(normalizeMonaco).filter(Boolean) : []\n },\n }),\n registry.register({\n id: 'fallback',\n priority: 30,\n provides: (languageId: string) => OUTLINE_FALLBACK_LANGS.has(languageId),\n async get(input: OutlineSourceInput): Promise<OutlineSymbol[]> {\n const model = input.model\n if (!model || typeof model.getValue !== 'function') return []\n return parseOutline(input.languageId, model.getValue())\n },\n }),\n ]\n return () => { for (const dispose of disposers) dispose() }\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏「大纲」面板。\n * 数据源经 resolveOutline(源注册表,优先级降序、首个非空生效)解析当前活动文件符号:\n * monaco 源吃原生 document symbol provider,fallback 源兜底无内置提供方的语言。\n * 交互:点击符号跳转编辑器、▸/▾ 折叠、光标所在符号高亮、空/加载/错误态。\n * 作者 ddj 2026-08-27\n */\nimport React from 'react'\nimport { resolveOutline } from './sources.js'\nimport type { SidebarCtx } from '../sidebar/types.js'\n\n/** 渲染符号数上限(防超大文件卡顿,超出显示截断提示)。 */\nconst RENDER_CAP = 800\n\n/** kind 分组元信息(字形 + 样式类)。 */\nconst KIND_GROUPS = {\n func: { glyph: 'ƒ', cls: 'edrv-ol-func' },\n type: { glyph: 'C', cls: 'edrv-ol-type' },\n data: { glyph: '•', cls: 'edrv-ol-data' },\n ns: { glyph: '▤', cls: 'edrv-ol-ns' },\n key: { glyph: '·', cls: 'edrv-ol-key' },\n}\n\n/** SymbolKind 数值 → 分组(File0..Package3=ns;Class4/Enum9/Interface10/Struct22/TypeParameter25=type;Method5/Constructor8/Function11=func;Key19/EnumMember21=key)。 */\nfunction kindMeta(kind) {\n const k = kind | 0\n if (k <= 3) return KIND_GROUPS.ns\n if (k === 4 || k === 9 || k === 10 || k === 22 || k === 25) return KIND_GROUPS.type\n if (k === 5 || k === 8 || k === 11) return KIND_GROUPS.func\n if (k === 19 || k === 21) return KIND_GROUPS.key\n return KIND_GROUPS.data\n}\n\n/**\n * 大纲面板主体。\n * @param props.ctx 面板共享上下文(editor/outlineSources/activePath)\n */\nexport function OutlinePanel(props) {\n const ctx = props?.ctx\n const activePath = ctx?.activePath ?? null\n const [symbols, setSymbols] = React.useState(null)\n const [error, setError] = React.useState(null)\n const [collapsed, setCollapsed] = React.useState({})\n const [cursorLine, setCursorLine] = React.useState(null)\n const seqRef = React.useRef(0)\n // ref 镜像:refresh 稳定([]),监听器只挂一次,避免 EditorView 每渲染重建 ctx 造成抖动\n const ctxRef = React.useRef(ctx)\n ctxRef.current = ctx\n const activeRef = React.useRef(activePath)\n activeRef.current = activePath\n const sourcesRef = React.useRef(ctx?.outlineSources)\n sourcesRef.current = ctx?.outlineSources\n\n const refresh = React.useCallback(() => {\n const c = ctxRef.current\n const ed = c?.editor?.()\n const model = ed?.getModel?.()\n const seq = ++seqRef.current\n if (!ed || !model) { setSymbols(null); setError(null); return }\n const uriPath = model?.uri?.path\n const modelPath = uriPath ? decodeURIComponent(String(uriPath).replace(/^\\//, '')) : null\n const active = activeRef.current\n if (active && modelPath !== active) { setSymbols(null); setError(null); return }\n const sources = sourcesRef.current\n if (!sources) { setSymbols([]); setError(null); return }\n setError(null)\n resolveOutline(sources, { languageId: model.getLanguageId(), path: modelPath, model, editor: ed, monaco: window.monaco })\n .then((list) => { if (seq === seqRef.current) setSymbols(list || []) })\n .catch((e) => { if (seq === seqRef.current) { setError(String(e?.message ?? e)); setSymbols(null) } })\n }, [])\n\n // 编辑器监听:模型切换/内容编辑(防抖)/光标移动 + edrv:refresh;\n // 编辑器未就绪时轮询等待(避免面板先于 Monaco 挂载后永久停在加载态)\n React.useEffect(() => {\n const disposers = []\n let debounceTimer = null\n let waitTimer = null\n const attach = () => {\n const ed = ctxRef.current?.editor?.()\n if (!ed) return false\n let contentDisposable = null\n const subContent = (model) => {\n if (contentDisposable) { contentDisposable.dispose(); contentDisposable = null }\n contentDisposable = model?.onDidChangeContent?.(() => {\n if (debounceTimer) clearTimeout(debounceTimer)\n debounceTimer = setTimeout(() => { debounceTimer = null; refresh() }, 300)\n }) ?? null\n }\n const onModel = () => { subContent(ed.getModel?.()); refresh() }\n const onCursor = (e) => setCursorLine(e?.position?.lineNumber ?? null)\n subContent(ed.getModel?.())\n const subs = [\n ed.onDidChangeModel?.(onModel),\n ed.onDidChangeCursorPosition?.(onCursor),\n { dispose: () => { if (contentDisposable) contentDisposable.dispose() } },\n ]\n for (const s of subs) if (s) disposers.push(s)\n refresh()\n return true\n }\n const onRefresh = () => refresh()\n window.addEventListener('edrv:refresh', onRefresh)\n if (!attach()) {\n waitTimer = setInterval(() => { if (attach()) { clearInterval(waitTimer); waitTimer = null } }, 400)\n }\n return () => {\n if (debounceTimer) clearTimeout(debounceTimer)\n if (waitTimer) clearInterval(waitTimer)\n for (const d of disposers) if (d?.dispose) d.dispose()\n window.removeEventListener('edrv:refresh', onRefresh)\n }\n }, [refresh])\n\n // 活动文件变化 → 重拉\n React.useEffect(() => { refresh() }, [refresh, activePath])\n\n const jump = (sym) => {\n const ed = ctxRef.current?.editor?.()\n if (!ed) return\n const line = Math.max(1, sym?.selectLine ?? sym?.startLine ?? 1)\n ed.revealLineInCenter(line)\n ed.setPosition({ lineNumber: line, column: 1 })\n ed.focus()\n }\n\n const toggleCollapse = (key) => {\n setCollapsed((prev) => Object.assign({}, prev, { [key]: prev[key] === true ? false : true }))\n }\n\n const allKeys = React.useMemo(() => {\n const keys = []\n const walk = (list, prefix) => {\n for (let i = 0; i < list.length; i++) {\n const key = prefix ? prefix + '/' + i : String(i)\n const sym = list[i]\n if (sym.children && sym.children.length) { keys.push(key); walk(sym.children, key) }\n }\n }\n walk(symbols || [], '')\n return keys\n }, [symbols])\n\n const setAll = (value) => {\n const next = {}\n for (const key of allKeys) next[key] = value\n setCollapsed(next)\n }\n\n const renderTree = (list, depth, prefix) => {\n const rows = []\n const cap = Math.min(list.length, RENDER_CAP)\n for (let i = 0; i < cap; i++) {\n const sym = list[i]\n const key = prefix ? prefix + '/' + i : String(i)\n const kids = sym.children && sym.children.length ? sym.children : null\n const isCollapsed = collapsed[key] === true\n const meta = kindMeta(sym.kind)\n const active = cursorLine != null && sym.startLine <= cursorLine && cursorLine <= sym.endLine\n rows.push(React.createElement('div', {\n key,\n className: 'edrv-tree-row' + (active ? ' edrv-tree-active' : ''),\n title: sym.detail || sym.name,\n style: { paddingLeft: 6 + depth * 14 },\n onClick: () => jump(sym),\n },\n React.createElement('span', {\n className: 'edrv-tree-chev',\n onClick: (e) => { e.stopPropagation(); toggleCollapse(key) },\n }, kids ? (isCollapsed ? '▸' : '▾') : ''),\n React.createElement('span', { className: 'edrv-outline-kind ' + meta.cls }, meta.glyph),\n React.createElement('span', { className: 'edrv-tree-name' }, sym.name),\n (sym.detail ? React.createElement('span', { className: 'edrv-outline-detail' }, sym.detail) : null),\n React.createElement('span', { className: 'edrv-outline-ln' }, String(sym.selectLine ?? sym.startLine ?? ''))))\n if (kids && !isCollapsed) rows.push(...renderTree(kids, depth + 1, key))\n }\n if (list.length > RENDER_CAP) {\n rows.push(React.createElement('div', { key: 'cap', className: 'edrv-tree-loading' }, '符号过多,仅显示前 ' + RENDER_CAP + ' 个'))\n }\n return rows\n }\n\n const basename = activePath ? String(activePath).split(/[\\\\/]/).pop() || activePath : ''\n\n let body\n if (error) {\n body = React.createElement('div', { className: 'edrv-tree' },\n React.createElement('div', { className: 'edrv-tree-error' },\n React.createElement('span', null, String(error)),\n React.createElement('button', { className: 'edrv-side-btn', onClick: refresh }, '重试')))\n } else if (!activePath) {\n body = React.createElement('div', { className: 'edrv-tree' },\n React.createElement('div', { className: 'edrv-tree-loading' }, '未打开文件'))\n } else if (symbols === null) {\n body = React.createElement('div', { className: 'edrv-tree' },\n React.createElement('div', { className: 'edrv-tree-loading' }, '加载中…'))\n } else if (symbols.length === 0) {\n body = React.createElement('div', { className: 'edrv-tree' },\n React.createElement('div', { className: 'edrv-tree-loading' }, '该语言暂不支持大纲或文件无符号'))\n } else {\n body = React.createElement('div', { className: 'edrv-tree' }, ...renderTree(symbols, 0, ''))\n }\n\n return React.createElement('div', { className: 'edrv-side-panel' },\n React.createElement('div', { className: 'edrv-side-head' },\n React.createElement('span', { className: 'edrv-side-title' }, '大纲'),\n React.createElement('span', { className: 'edrv-side-root', title: activePath || '' }, basename),\n React.createElement('span', { style: { flex: 1 } }),\n React.createElement('button', { className: 'edrv-side-btn', title: '折叠全部', disabled: !(symbols && symbols.length), onClick: () => setAll(true) }, '−'),\n React.createElement('button', { className: 'edrv-side-btn', title: '展开全部', disabled: !(symbols && symbols.length), onClick: () => setAll(false) }, '+'),\n React.createElement('button', { className: 'edrv-side-btn', title: '刷新大纲', onClick: refresh }, '⟳')),\n body)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 「大纲」面板定义(注册表一项)。\n * 数据源解析复用 outline/sources 的源注册表(ctx.outlineSources 注入)。\n * 作者 ddj 2026-08-27\n */\nimport React from 'react'\nimport { OutlinePanel } from './OutlinePanel.js'\nimport type { SidebarPanelDef, SidebarCtx } from '../sidebar/types.js'\n\n/**\n * 构造大纲面板定义。\n * @author ddj 2026年08月27号\n * @returns 面板定义(无徽标;活动栏图标 📜)\n */\nexport function createOutlinePanel(): SidebarPanelDef {\n return {\n id: 'outline',\n title: '大纲',\n icon: '📜',\n order: 20,\n render: (ctx: SidebarCtx) => React.createElement(OutlinePanel, { ctx }),\n }\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 大纲「lsp」源:经 host LSP documentSymbol 解析(优先于 monaco/fallback)。\n * LSP 服务器未就绪时返回 [] → resolveOutline 自动落入下一优先级(fallback 兜底),不阻塞面板。\n * 作者 ddj 2026-08-27\n */\nimport type { OutlineSource, OutlineSourceInput, OutlineSymbol } from './types.js'\nimport { fetchDocumentSymbols } from '../monaco/lsp/lspClient.js'\n\nexport const LSP_OUTLINE_PRIORITY = 60\n\n/** LSP 大纲源:lua/csharp 等有 host 服务器能力的语言。 */\nexport function createLspOutlineSource(): OutlineSource {\n return {\n id: 'lsp',\n priority: LSP_OUTLINE_PRIORITY,\n provides: (languageId: string) => languageId === 'lua' || languageId === 'csharp',\n async get(input: OutlineSourceInput): Promise<OutlineSymbol[]> {\n const model = input.model\n if (!model || typeof model.getValue !== 'function') return []\n const path = input.path || (model.uri && model.uri.path ? decodeURIComponent(String(model.uri.path).replace(/^\\//, '')) : null)\n if (!path) return []\n const symbols = await fetchDocumentSymbols(path, model.getValue())\n return (Array.isArray(symbols) ? symbols : []).map(toOutline).filter(Boolean)\n },\n }\n}\n\n/** LSP SymbolInfo(host 归一化,0-based range)→ 大纲 OutlineSymbol(1-based)。 */\nfunction toOutline(symbol) {\n if (!symbol || typeof symbol.name !== 'string') return null\n const range = symbol.range || {}\n const sel = symbol.selectionRange || range\n const start = range.start || {}\n const select = sel.start || {}\n const out = {\n name: symbol.name,\n kind: typeof symbol.kind === 'number' ? symbol.kind : 0,\n startLine: Math.max(1, (start.line ?? 0) + 1),\n endLine: Math.max(1, ((range.end?.line ?? start.line) ?? 0) + 1),\n selectLine: Math.max(1, (select.line ?? start.line ?? 0) + 1),\n }\n if (typeof symbol.detail === 'string' && symbol.detail) out.detail = symbol.detail\n if (Array.isArray(symbol.children) && symbol.children.length) {\n const kids = symbol.children.map(toOutline).filter(Boolean)\n if (kids.length) out.children = kids\n }\n return out\n}\n","/**\n * dsh-vscode-mode client — 浏览器半入口:slot 注册 + 装配。\n * 挂点:betterSidebar「文件编辑」Tab(侧边栏形态,对话+编辑同屏;未装 dsh-better-sidebar 时\n * 回退 conversation.view 中央页签)+ conversation.input.dock 差异条 + 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 * conversation.input.dock。\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 { PerfSizeBadge } from './ui/PerfSizeBadge.js'\nimport { ConversationDiffDock } from './ui/ConversationDiffDock.js'\nimport { McpSettings } from './ui/McpSettings.js'\nimport { rpc } from './rpc.js'\nimport { loadMonaco } from './monaco/loader.js'\nimport { createFileOpenerRegistry, scanSidebar, type FileOpenContext } from './fileOpeners.js'\nimport type { FileOpenerRegistry } from './fileOpeners.js'\nimport { installOpenPathRouter, vscodeOpener, autoValue } from './openPathRouter.js'\nimport { SettingsContext } from './settingsContext.js'\nimport { SIDEBAR_PLUGIN, pickSettingsBinder, registerSlotSafely } from './compat.js'\nimport { detectSidebarService, installSideEditor, setEnsureSideEditor, SIDEBAR_INSTALL_CMD } from './sidebarBridge.js'\nimport { SideEditorTab } from './ui/SideEditorTab.js'\nimport { createAddToConversation } from './addToConversation.js'\nimport { createSidebarPanelRegistry } from './sidebar/registry.js'\nimport { createFilePanel } from './sidebar/panels/index.js'\nimport { createSearchPanel } from './sidebar/panels/index.js'\nimport { createTreeMenuRegistry } from './sidebar/contextMenu.js'\nimport { createDefaultFileMenuItems } from './sidebar/menuItems.js'\nimport { createOutlinePanel } from './outline/index.js'\nimport { createOutlineSourceRegistry, registerBuiltinOutlineSources } from './outline/sources.js'\nimport { createLspOutlineSource } from './outline/lspSource.js'\nimport { keybindingsApply } from './keybindings.js'\nimport { setupLsp, setSession } from './monaco/lsp/index.js'\nimport type { CompatAdapter } from '../shared/compat.js'\n\n// ⚠️ inject 只列必需服务:webUiSettings 是 @linxin666/dsh-client-ui-web-ui-settings 提供的\n// 可选兼容桥(非官方服务),列入 inject 会让未装该桥的部署启动时 entry 永久 pending,\n// web boot 直接失败('1 entry did not activate')。兼容层用 ctx.get 运行时探测 + 降级,不靠 inject。\nexport const inject = ['slots', 'timer', 'locale', 'connection', 'remote', 'workspaces', 'sessions', 'conversation', 'settingsScope']\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 const registry: FileOpenerRegistry = createFileOpenerRegistry()\n const workspaces = ctx.get('workspaces')\n const sessions = ctx.get('sessions')\n\n // Monaco 加载时机:不再 DSH 启动即预热,改为进入会话界面(sessions.list.current 出现)后再后台加载,\n // 用户点开「文件编辑」页签即用;空闲时仍由 EditorView 挂载兜底加载。\n // 模块级 promise 去重,重复触发只首次真正加载;requestIdleCallback 让出会话首屏带宽,缺省回退延时调度;\n // 预热失败静默吞掉(loader 失败会重置 promise,页签打开时仍走原有加载/重试路径)。\n const monacoList = sessions?.list\n if (typeof window !== 'undefined' && monacoList && typeof monacoList.subscribe === 'function') {\n const list = monacoList as { getSnapshot: () => { current?: unknown }; subscribe: (listener: () => void) => () => void }\n const schedulePreload = () => {\n const preload = () => loadMonaco(() => {}).then((m: unknown) => setupLsp(m)).catch(() => {})\n if (typeof window.requestIdleCallback === 'function') window.requestIdleCallback(preload, { timeout: 2000 })\n else schedule(preload, 300)\n }\n const onSessionEnter = () => {\n const current = list.getSnapshot()?.current\n if (!current) return\n setSession(current)\n schedulePreload()\n }\n ctx.effect(() => list.subscribe(onSessionEnter), 'vscode-mode: monaco session trigger')\n onSessionEnter()\n }\n // 会话切换 → LSP 文档归属更新 + 状态刷新\n if (monacoList && typeof monacoList.subscribe === 'function') {\n const list = monacoList as { getSnapshot: () => { current?: string }; subscribe: (listener: () => void) => () => void }\n ctx.effect(() => list.subscribe(() => {\n setSession(list.getSnapshot()?.current)\n }), 'vscode-mode: lsp session sync')\n }\n const originalOpenPath = workspaces?.openPath\n const binder = pickSettingsBinder(ctx)\n const settings = binder.scope\n let selected = autoValue('auto')\n /** 可选探测 betterSidebar 服务(不进 inject:缺失会让插件停靠等待,杀死回退路径)。 */\n let sideService = detectSidebarService(ctx)\n /** 「添加到对话」动作集:编辑区/Tab 右键菜单注入文件引用与代码块(conversation 服务缺失时各动作安全降级)。 */\n const addToConversation = createAddToConversation(ctx)\n\n /** 客户端侧兼容摘要(与 host 报告合并展示;惰性求值保证 HMR 后仍新鲜)。 */\n const compatSummary = (): CompatAdapter[] => [\n { name: '设置桥', active: settings !== undefined, note: settings !== undefined ? '使用 ' + binder.service + ' 桥' : '未绑定设置服务(fileOpenTool 持久化不可用)' },\n { name: '文件打开路由(workspaces.openPath)', active: Boolean(workspaces?.openPath), note: 'vscode 打开器优先,失败回退系统打开' },\n { name: '侧边栏打开器(' + SIDEBAR_PLUGIN + ')', active: registry.get(SIDEBAR_PLUGIN) !== undefined, note: registry.get(SIDEBAR_PLUGIN) !== undefined ? '已注册(优先级 80)' : '未检测到侧边栏打开能力' },\n { name: '侧边栏编辑区(' + SIDEBAR_PLUGIN + ')', active: sideService !== undefined, note: sideService !== undefined ? '编辑区=侧边栏 Tab(对话+编辑同屏)' : '未检测到;安装 dsh-better-sidebar 后刷新启用侧边栏形态(' + SIDEBAR_INSTALL_CMD + ')' },\n ]\n\n ctx.provide('fileOpeners', registry)\n ctx.effect(() => registry.register(vscodeOpener()), 'vscode-mode: file opener')\n\n // 侧边栏面板注册表(对外 provide,供本插件/第三方注册面板;文件管理为面板 #1)\n const sidebarPanels = createSidebarPanelRegistry()\n ctx.provide('edrvSidebarPanels', sidebarPanels)\n ctx.effect(() => sidebarPanels.register(createFilePanel()), 'vscode-mode: sidebar panel')\n // 搜索面板:活动栏「搜索」页签(Ctrl+Shift+F 唤起,VSCode 搜索视图形态)\n ctx.effect(() => sidebarPanels.register(createSearchPanel()), 'vscode-mode: sidebar panel search')\n // 文件右键菜单项注册表(对外 provide,供本插件/第三方注册;内置「在文件浏览器中打开」)\n const fileMenuItems = createTreeMenuRegistry()\n ctx.provide('edrvFileContextMenuItems', fileMenuItems)\n for (const item of createDefaultFileMenuItems()) {\n ctx.effect(() => fileMenuItems.register(item), 'vscode-mode: file context menu item ' + item.id)\n }\n // 大纲源注册表(公开预留口):第三方语言插件(LSP/VSIX 等)注册更高优先级源即可覆盖兜底\n const outlineSources = createOutlineSourceRegistry()\n ctx.provide('edrvOutlineSources', outlineSources)\n ctx.effect(() => registerBuiltinOutlineSources(outlineSources), 'vscode-mode: outline sources')\n // LSP 大纲源(priority 60):lua/csharp 有 host 服务器时优先生效,否则自动落入 fallback\n ctx.effect(() => outlineSources.register(createLspOutlineSource()), 'vscode-mode: outline lsp source')\n ctx.effect(() => sidebarPanels.register(createOutlinePanel()), 'vscode-mode: sidebar panel outline')\n ctx.effect(() => registry.register({\n id: 'system', label: '系统默认应用', priority: 0,\n open: (path: string) => originalOpenPath.call(workspaces, path),\n }), 'vscode-mode: system file opener')\n ctx.effect(() => {\n const sidebar = scanSidebar(ctx)\n return sidebar ? registry.register(sidebar) : undefined\n }, 'vscode-mode: sidebar file opener')\n ctx.effect(() => {\n if (!settings) return undefined\n const sync = (): void => {\n const snapshot = settings.getSnapshot()\n if (snapshot.status === 'loading') return\n selected = autoValue(snapshot.value?.fileOpenTool)\n window.dispatchEvent(new CustomEvent('edrv:file-open-tool-change', { detail: { value: selected } }))\n }\n sync()\n return settings.subscribe(sync)\n }, 'vscode-mode: file opener setting sync')\n // 快捷键配置同步:设置提交后立即刷新键位匹配(编辑器/QuickOpen 按事件时读取)\n ctx.effect(() => {\n if (!settings) return undefined\n const sync = (): void => {\n const snapshot = settings.getSnapshot()\n if (snapshot.status === 'loading') return\n keybindingsApply(snapshot.value?.keybindings)\n }\n sync()\n return settings.subscribe(sync)\n }, 'vscode-mode: keybindings setting sync')\n if (workspaces?.openPath) {\n ctx.effect(() => installOpenPathRouter({\n workspaces,\n registry,\n selected: () => selected,\n context: () => {\n const current = sessions?.list?.getSnapshot?.()\n const sessionId = current?.current\n const summary = sessionId ? current?.byId?.[sessionId] : undefined\n return { sessionId, cwd: summary?.cwd } as FileOpenContext\n },\n logger: (message: string) => console.warn('[dsh-vscode-mode] ' + message),\n }), 'vscode-mode: file link routing')\n }\n\n // 中央「文件编辑」页签(旧形态回退):类 VSCode 编辑器;侧边栏形态可用时编辑器住 betterSidebar Tab,\n // 本页签不注册(避免双实例:Monaco×2 + diff dock 每会话单源抢占)。\n const registerLegacyTab = (): (() => void) | null => {\n return registerSlotSafely(ctx, {\n name: 'conversation.view',\n id: 'edrv-editor',\n order: 5,\n label: '文件编辑',\n inject: (sessionId: string) => ({ sessionId }),\n }, (props: unknown) => React.createElement(EditorView, Object.assign({}, props, { layout: 'tab', sideHint: SIDEBAR_INSTALL_CMD, schedule, addToConversation, sidebarPanels, outlineSources, fileMenuItems })))\n }\n\n // 侧边栏/中央页签两形态互斥切换:sideDisposer(侧边栏 Tab)与 legacyDisposer(中央页签)只保留其一。\n // ⚠️ betterSidebar 服务由 dsh-better-sidebar 的 client bundle(1MB+)在页面加载时提供,本插件\n // bundle 较小往往先执行完启动检测——一次性探测会误报「未检测到」并永久停在中央页签形态(实测\n // 竞态:better-sidebar 已装,但「文件编辑」Tab 未注册)。故启动后按 2s 间隔重试(窗口 ~30s),\n // 命中即自动切换侧边栏形态;始终未命中则保持中央页签回退。\n let sideDisposer: (() => void) | null = null\n let legacyDisposer: (() => void) | null = null\n const applySideForm = (): void => {\n if (sideService) {\n if (sideDisposer !== null) return\n if (legacyDisposer !== null) { legacyDisposer(); legacyDisposer = null }\n sideDisposer = ctx.effect(() => installSideEditor({\n service: sideService as NonNullable<typeof sideService>,\n renderTab: (props: Record<string, unknown>) => React.createElement(SideEditorTab, Object.assign({}, props, { schedule, addToConversation, sidebarPanels, outlineSources, fileMenuItems })),\n activeSession: () => {\n const snapshot = sessions?.list?.getSnapshot?.() as { current?: string; byId?: Record<string, { cwd?: string }> } | undefined\n const sessionId = snapshot?.current\n if (!sessionId) return undefined\n return { sessionId, cwd: snapshot?.byId?.[sessionId]?.cwd }\n },\n registerLegacyFallback: registerLegacyTab,\n }), 'vscode-mode: sidebar editor tab')\n } else {\n if (legacyDisposer !== null) return\n if (sideDisposer !== null) { sideDisposer(); sideDisposer = null }\n setEnsureSideEditor(null)\n legacyDisposer = registerLegacyTab()\n }\n }\n applySideForm()\n let sideRetries = 0\n const retrySideService = (): void => {\n if (sideService !== undefined || sideRetries >= 15) return\n sideRetries += 1\n schedule(() => {\n if (sideService !== undefined) return\n sideService = detectSidebarService(ctx)\n if (sideService !== undefined) {\n console.info('[dsh-vscode-mode] 检测到 ' + SIDEBAR_PLUGIN + ',切换侧边栏编辑形态')\n applySideForm()\n } else {\n retrySideService()\n }\n }, 2000)\n }\n retrySideService()\n\n // 对话输入框上方差异 dock:普通对话显示单文案按钮,文件编辑页由 EditorView 隐藏\n registerSlotSafely(ctx, {\n name: 'conversation.input.dock',\n id: 'edrv-diff-dock',\n order: 30,\n label: '差异',\n inject: (sessionId: string) => ({ sessionId }),\n }, (props: unknown) => React.createElement(ConversationDiffDock, Object.assign({}, props)))\n\n // header 差异角标:仅当前工作区存在差异时渲染\n registerSlotSafely(ctx, { name: 'conversation.session.header.utilities', id: 'edrv-diff-badge', order: 90, label: '差异' },\n (props: unknown) => React.createElement(DiffBadge, Object.assign({}, props)))\n\n // header 会话体积指示器:当前会话持久化体积,超阈值提示新开会话(性能优化)\n registerSlotSafely(ctx, { name: 'conversation.session.header.utilities', id: 'edrv-perf-size', order: 89, label: '会话体积' },\n (props: unknown) => React.createElement(PerfSizeBadge, Object.assign({}, props, { sessions })))\n\n // 设置页中的 VSCodeMode 专属页签,MCP 管理作为该页签的内部子 Tab。\n registerSlotSafely(ctx, {\n name: 'settings.section',\n id: 'vscode-mode',\n order: 30,\n label: 'VSCodeMode',\n }, () => React.createElement(SettingsContext.Provider, { value: settings }, React.createElement(McpSettings, { openerRegistry: registry, compatSummary })))\n}"],"mappings":"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"}
|