dsh-vscode-mode 0.1.62 → 0.2.0

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["React","listeners","React","React","React","React","KEY_PREFIX","registered","CACHE_TTL_MS","DEBOUNCE_MS","React","React","React","React","React","markEditorActive","React","React","React","React","React","React","React","React","createRoot","React","React","React","createPortal","KEY_PREFIX","React","React","React","React","React","React","React"],"sources":["../src/shared/rpc.ts","../src/client/rpc.ts","../src/shared/logger.ts","../src/client/log.ts","../src/client/sidebarBridge.ts","../src/client/events.ts","../src/client/monaco/theme.ts","../src/client/monaco/loader.ts","../src/client/imagePreview.ts","../src/client/pdfPreview.ts","../src/client/pdf/pdfLoader.ts","../src/client/pdf/pdfPanel.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/client/state/scopeStore.ts","../src/client/state/modelCache.ts","../src/client/sidebarMin.ts","../src/client/navHistory.ts","../src/client/addToConversation.ts","../src/shared/lsp.ts","../src/client/monaco/lsp/lspClient.ts","../src/client/monaco/lsp/providers.ts","../src/client/monaco/lsp/underline.ts","../src/client/monaco/lsp/index.ts","../src/shared/ai.ts","../src/client/ai/inlineProvider.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/officialSidebar.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/IntegrationSettings.ts","../src/client/ui/AiSettings.ts","../src/client/ui/McpSettings.ts","../src/client/openPathRouter.ts","../src/client/remoteOpenRouter.ts","../src/shared/externalOpen.ts","../src/client/chooseDialog.ts","../src/client/openFlow.ts","../src/client/externalOpen.ts","../src/client/ui/SideEditorTab.ts","../src/client/ui/OfficialSideTab.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/rulesMdc.ts","../src/client/sidebar/panels/RulesPanel.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 { ShellIntegrationStatus, UnityListPayload, UnityProjectEntry } from './integration.js'\nimport type { RuleInfo, RuleProject, RuleRefInput, RuleSaveInput } from './rules.js'\nimport type { LspEnvInstallState, LspExtInfo, LspExtUpdate, LspHover, LspLocation, LspMarketItem, LspPosition, LspSemanticTokens, LspServerStatus, LspSymbol } from './lsp.js'\nimport type { AiConfigPatch, AiConfigView, AiDirectoryView, AiInlineRequest, AiInlineResult } from './ai.js'\n\n/** webServer 精确路由。 */\nexport const RPC_PATH = '/edrv/rpc'\n\n/**\n * 图片扩展名(小写、无点)→ MIME。edrv.read base64 响应与 client 图片预览共用,\n * 收敛在此避免 host/client 两处漂移。\n * @author ddj 2026年09月08号\n */\nexport const IMAGE_MIME: Record<string, string> = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n ico: 'image/x-icon',\n avif: 'image/avif',\n svg: 'image/svg+xml',\n}\n\n/**\n * 路径 → 图片 MIME:按 basename 扩展名小写查 {@link IMAGE_MIME},未命中回退 application/octet-stream。\n * @author ddj 2026年09月08号\n * @param path 文件路径(`/` 或 `\\` 分隔均可)\n * @returns MIME 字符串\n */\nexport function imageMimeOf(path: string): string {\n const base = String(path || '').split(/[\\\\/]/).pop() || ''\n const dot = base.lastIndexOf('.')\n const ext = dot > 0 ? base.slice(dot + 1).toLowerCase() : ''\n return IMAGE_MIME[ext] ?? 'application/octet-stream'\n}\n\n/** PDF 统一 MIME(host base64 响应与 client PDF 面板同源,避免两处漂移)。 */\nexport const PDF_MIME = 'application/pdf'\n\n/**\n * 路径 → 二进制预览 MIME:PDF 特判 {@link PDF_MIME},其余走图片表回退 octet-stream。\n * @author ddj 2026年09月22号\n * @param path 文件路径(`/` 或 `\\` 分隔均可)\n * @returns MIME 字符串\n */\nexport function binaryMimeOf(path: string): string {\n const base = String(path || '').split(/[\\\\/]/).pop() || ''\n const dot = base.lastIndexOf('.')\n if (dot > 0 && base.slice(dot + 1).toLowerCase() === 'pdf') return PDF_MIME\n return imageMimeOf(path)\n}\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; encoding?: 'base64' }\n 'edrv.original': { sessionId?: string; path: string }\n 'edrv.save': { sessionId?: string; path: string; content: string }\n 'edrv.saveBinary': { sessionId?: string; path: string; content: string; encoding: 'base64' }\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; integrationBaseUrl?: string; expectedRevision?: number }\n 'edrv.integration.status': {}\n 'edrv.integration.register': {}\n 'edrv.integration.unregister': {}\n 'edrv.unity.list': {}\n 'edrv.unity.add': { path: string }\n 'edrv.unity.remove': { path: string }\n 'edrv.unity.install': { path: string }\n 'edrv.externalStat': { path: string }\n 'edrv.external.handoff': { paths: string[]; line?: number; column?: number }\n 'edrv.external.pending': {}\n 'edrv.external.pendingState': { token: string; take?: boolean }\n 'vscode.devFormGet': {}\n 'vscode.devFormSet': { enabled: boolean; path?: string }\n 'compat': {}\n 'edrv.lsp.status': { sessionId?: string }\n 'edrv.lsp.detect': {}\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.envInstall': { languageId: string; id: string }\n 'edrv.lsp.envState': {}\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.ai.inline': AiInlineRequest\n 'edrv.ai.models': { force?: boolean }\n 'edrv.ai.configGet': {}\n 'edrv.ai.configUpdate': AiConfigPatch\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 'rules.list': {}\n 'rules.read': RuleRefInput\n 'rules.save': RuleSaveInput\n 'rules.remove': RuleRefInput\n 'rules.toggle': RuleRefInput & { enabled: boolean }\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; encoding?: 'base64'; mime?: string }\n 'edrv.original': { content: string; size: number; stale: StaleHunk[]; fallback: boolean }\n 'edrv.save': object\n 'edrv.saveBinary': 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; integrationBaseUrl: string; revision?: number }\n 'vscode.fileOpenSettingsUpdate': { fileOpenTool: string; integrationBaseUrl: string; revision?: number }\n 'edrv.integration.status': ShellIntegrationStatus\n 'edrv.integration.register': ShellIntegrationStatus\n 'edrv.integration.unregister': ShellIntegrationStatus\n 'edrv.unity.list': UnityListPayload\n 'edrv.unity.add': { project: UnityProjectEntry }\n 'edrv.unity.remove': object\n 'edrv.unity.install': { project: UnityProjectEntry }\n 'edrv.externalStat': { kind: 'file' | 'directory' | 'missing' }\n 'edrv.external.handoff': { clients: number; token: string }\n 'edrv.external.pending': { open: { paths: string[]; line?: number; column?: number } | null }\n 'edrv.external.pendingState': { delivered: boolean }\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.detect': { 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.envInstall': { started: boolean }\n 'edrv.lsp.envState': { states: LspEnvInstallState[] }\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.ai.inline': AiInlineResult\n 'edrv.ai.models': AiDirectoryView\n 'edrv.ai.configGet': AiConfigView\n 'edrv.ai.configUpdate': AiConfigView\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 'rules.list': { user: RuleInfo[]; projects: RuleProject[] }\n 'rules.read': { content: string }\n 'rules.save': { rule: RuleInfo }\n 'rules.remove': object\n 'rules.toggle': { rule: RuleInfo }\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 — 统一日志核心(双面共享,平台中立)。\n * 输出规范:\n * - 格式:`[dsh-vscode-mode][:scope] 消息`;前缀只在模块内部拼接,业务代码禁止手写前缀\n * - 级别语义:debug=诊断明细 / info=装配与路由里程碑 / warn=降级与兼容回退 / error=失败\n * - 出口:host 面经 bindHostLog(ctx) 绑定 ctx.logger(缺失回退 console);client 面固定 console\n * - 诊断文件通道(edrv.debug → ~/.dsh/dsh-vscode-mode/logs/)见 debugLog.ts,与本模块前缀共用\n * 新增日志一律 `import { log } from '../log.js'`(client 为 './log.js')后调 log.debug/info/warn/error;\n * 子域日志用 log.child('scope'),禁止另起 console。\n * 作者 ddj 2026-09-08\n */\n\n/** 插件统一日志前缀(与包安装名一致)。 */\nexport const LOG_PREFIX = '[dsh-vscode-mode]'\n\n/** 日志级别(与 console 方法名对齐)。 */\nexport type LoggerLevel = 'debug' | 'info' | 'warn' | 'error'\n\n/** 日志出口:接收拼好前缀的整行(host 面接 ctx.logger,client 面接 console)。 */\nexport type LoggerSink = (level: LoggerLevel, line: string) => void\n\n/** 默认级别到 console 方法名的映射。 */\nconst CONSOLE_METHODS: Record<LoggerLevel, string> = { debug: 'debug', info: 'info', warn: 'warn', error: 'error' }\n\n/**\n * 默认出口:console(级别直映方法;方法缺失时静默丢弃,不抛错)。\n * @author ddj 2026年09月08号\n * @returns console 出口\n */\nexport function consoleSink(): LoggerSink {\n return (level, line) => {\n const emit = (console as unknown as Record<string, unknown>)[CONSOLE_METHODS[level]]\n if (typeof emit === 'function') (emit as (message: string) => void).call(console, line)\n }\n}\n\n/**\n * DSH host 出口工厂:转接 ctx.logger(方法级可选调用,缺服务/缺方法回退 console)。\n * @author ddj 2026年09月08号\n * @param ctx DSH host 上下文\n * @returns 日志出口\n */\nexport function ctxLogSink(ctx: unknown): LoggerSink {\n const base = consoleSink()\n return (level, line) => {\n const logger = (ctx as { logger?: Record<string, unknown> } | null | undefined)?.logger\n const emit = logger?.[level]\n if (typeof emit === 'function') (emit as (message: string) => void).call(logger, line)\n else base(level, line)\n }\n}\n\n/**\n * 拼一行日志:`[dsh-vscode-mode][:scope] 消息`(scope 为空省略冒号段)。\n * @author ddj 2026年09月08号\n * @param scope 子域(可空)\n * @param message 消息文本\n * @returns 整行文本\n */\nexport function formatLine(scope: string, message: string): string {\n const text = String(message)\n return scope ? LOG_PREFIX + ':' + scope + ' ' + text : LOG_PREFIX + ' ' + text\n}\n\n/** 日志器实例(四级别统一入口 + 换出口/派生子域)。 */\nexport interface PluginLogger {\n debug(message: string): void\n info(message: string): void\n warn(message: string): void\n error(message: string): void\n /** 更换出口(同一实例树共享,host 装配期绑定 ctx.logger 用;client 单例不调用)。 */\n bind(sink: LoggerSink): void\n /** 派生带子域前缀的新实例(共享出口,如 log.child('debug') → `[dsh-vscode-mode:debug]`)。 */\n child(scope: string): PluginLogger\n}\n\n/** 实例树共享的出口状态(bind 换出口对整棵树生效)。 */\ninterface SinkState {\n sink: LoggerSink\n}\n\n/**\n * 日志器工厂(内部):emit 时读共享出口状态,保证父 bind 后子实例跟随。\n * @author ddj 2026年09月08号\n * @param state 共享出口状态\n * @param scope 子域文本(可空)\n * @returns 日志器\n */\nfunction makeLogger(state: SinkState, scope: string): PluginLogger {\n const emit = (level: LoggerLevel, message: string): void => state.sink(level, formatLine(scope, message))\n return {\n debug: (message) => emit('debug', message),\n info: (message) => emit('info', message),\n warn: (message) => emit('warn', message),\n error: (message) => emit('error', message),\n bind(next: LoggerSink): void {\n state.sink = next\n },\n child(next: string): PluginLogger {\n return makeLogger(state, scope ? scope + '.' + next : next)\n },\n }\n}\n\n/**\n * 创建插件日志器(默认 console 出口;host 面单例由 bindHostLog 换到 ctx.logger)。\n * @author ddj 2026年09月08号\n * @param sink 初始出口(缺省 console)\n * @param scope 初始子域(业务方一般经 child 派生,不直接传)\n * @returns 日志器\n */\nexport function createLogger(sink: LoggerSink = consoleSink(), scope = ''): PluginLogger {\n return makeLogger({ sink }, scope)\n}\n","/**\n * dsh-vscode-mode client — 日志单例(全 client 面唯一日志入口)。\n * client 无 ctx.logger 服务,固定 console 出口;格式/级别语义与 host 面一致(shared/logger.ts)。\n * 用法:`import { log } from './log.js'` → `log.debug/info/warn/error(msg)`;子域用 `log.child('scope')`。\n * 作者 ddj 2026-09-08\n */\nimport { createLogger } from '../shared/logger.js'\n\n/** client 面插件日志单例。 */\nexport const log = createLogger()\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'\nimport { log } from './log.js'\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 log.warn('侧栏编辑器打开失败(' + 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) { log.warn('回退注册失败(' + 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 log.warn('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 log.warn('侧边栏 Tab 注册失败(' + String(error) + ')')\n // 注册失败 = 侧栏形态不可用:立即回退中央页签,不接管打开路由\n if (!fallbackInstalled) {\n fallbackInstalled = true\n try { registerLegacyFallback() } catch (inner) { log.warn('回退注册失败(' + 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","/**\n * dsh-vscode-mode client — 图片文件判定与 data URL 组装(编辑区图片预览面板用)。\n * 纯函数、无 DOM 依赖,便于单测;MIME 表收敛在 shared/rpc.ts(host base64 响应同源)。\n * @author ddj 2026年09月08号\n */\nimport { IMAGE_MIME } from '../shared/rpc.js'\n\n/** 可预览的图片扩展名集合(小写、无点)。 */\nconst IMAGE_EXT_SET: Set<string> = new Set(Object.keys(IMAGE_MIME))\n\n/**\n * 判断路径是否为可预览的图片文件(取 basename 扩展名,大小写不敏感)。\n * @author ddj 2026年09月08号\n * @param path 文件路径(`/` 或 `\\` 分隔均可)\n * @returns 是否图片文件\n */\nexport function isImagePath(path: string): boolean {\n const base = String(path || '').split(/[\\\\/]/).pop() || ''\n const dot = base.lastIndexOf('.')\n if (dot <= 0) return false\n return IMAGE_EXT_SET.has(base.slice(dot + 1).toLowerCase())\n}\n\n/**\n * 判断路径是否为 SVG 文件(唯一提供「以文本打开」切换的图片格式)。\n * @author ddj 2026年09月08号\n * @param path 文件路径(`/` 或 `\\` 分隔均可)\n * @returns 是否 SVG\n */\nexport function isSvgPath(path: string): boolean {\n const base = String(path || '').split(/[\\\\/]/).pop() || ''\n const dot = base.lastIndexOf('.')\n return dot > 0 && base.slice(dot + 1).toLowerCase() === 'svg'\n}\n\n/**\n * base64 文本 → 可直接赋给 `<img src>` 的 data URL。\n * @author ddj 2026年09月08号\n * @param base64 base64 文本(不含 data: 前缀)\n * @param mime MIME 类型(host edrv.read base64 响应携带)\n * @returns data URL 字符串\n */\nexport function dataUrlOf(base64: string, mime: string): string {\n return 'data:' + (mime || 'application/octet-stream') + ';base64,' + base64\n}\n","/**\n * dsh-vscode-mode client — PDF 文件判定与 base64 编解码(编辑区 PDF 面板用)。\n * 纯函数、无 DOM 依赖,便于单测;PDF_MIME 收敛在 shared/rpc.ts(host base64 响应同源)。\n * @author ddj 2026年09月22号\n */\nimport { PDF_MIME } from '../shared/rpc.js'\n\nexport { PDF_MIME }\n\n/**\n * 判断路径是否为 PDF 文件(取 basename 扩展名,大小写不敏感)。\n * @author ddj 2026年09月22号\n * @param path 文件路径(`/` 或 `\\` 分隔均可)\n * @returns 是否 PDF 文件\n */\nexport function isPdfPath(path: string): boolean {\n const base = String(path || '').split(/[\\\\/]/).pop() || ''\n const dot = base.lastIndexOf('.')\n return dot > 0 && base.slice(dot + 1).toLowerCase() === 'pdf'\n}\n\n/**\n * base64 文本 → 二进制字节(喂给 pdf.js getDocument 的 data 入参)。\n * @author ddj 2026年09月22号\n * @param base64 base64 文本(不含 data: 前缀,host edrv.read base64 响应携带)\n * @returns 原始字节\n */\nexport function base64ToBytes(base64: string): Uint8Array {\n const bin = atob(String(base64 || ''))\n const bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n return bytes\n}\n\n/**\n * 二进制字节 → base64 文本(编辑保存回传 host 前的编码步骤)。\n * @author ddj 2026年09月22号\n * @param bytes 原始字节\n * @returns base64 文本\n */\nexport function bytesToBase64(bytes: Uint8Array): string {\n let bin = ''\n const chunk = 0x8000\n for (let i = 0; i < bytes.length; i += chunk) {\n bin += String.fromCharCode(...bytes.subarray(i, i + chunk))\n }\n return btoa(bin)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — pdf.js 加载器(vendor 产物离线随包,/edrv/vendor/pdfjs/*)。\n * 加载链:module script 内按序动态 import build/pdf.mjs(自挂 globalThis.pdfjsLib)→\n * web/pdf_viewer.mjs(从 globalThis.pdfjsLib 解构)→ window.__edrvPdfjs handoff。\n * 用 script 注入而非打包内 import():客户端包是 CJS,bundler 会改写动态 import 破坏 URL 语义。\n * 作者 ddj 2026-09-22\n */\n\n/** vendor 根(routes.ts /edrv/vendor 前缀路由分发 assets/vendor/*)。 */\nexport const PDFJS_BASE = '/edrv/vendor/pdfjs'\n/** pdf.js Worker 地址(GlobalWorkerOptions.workerSrc)。 */\nexport const PDFJS_WORKER_SRC = PDFJS_BASE + '/build/pdf.worker.mjs'\n/** CJK 字符映射目录(中文 PDF 渲染必需,尾斜杠固定)。 */\nexport const PDFJS_CMAP_URL = PDFJS_BASE + '/cmaps/'\n/** 标准字体目录(未嵌字体 PDF 兜底,尾斜杠固定)。 */\nexport const PDFJS_FONT_URL = PDFJS_BASE + '/standard_fonts/'\n/** 组件层样式(pdfViewer/textLayer/annotationEditor 布局)。 */\nconst PDFJS_CSS_URL = PDFJS_BASE + '/web/pdf_viewer.css'\n\nlet pdfjsPromise = null\n\n/**\n * 注入 pdf_viewer.css(幂等;vendor 路由带 etag 协商缓存,重复挂载走 304)。\n * @author ddj 2026年09月22号\n */\nfunction ensurePdfCss() {\n if (typeof document === 'undefined') return\n if (document.querySelector('link[data-edrv-pdfjs-css]')) return\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.href = PDFJS_CSS_URL\n link.dataset.edrvPdfjsCss = '1'\n document.head.appendChild(link)\n}\n\n/**\n * 加载 pdf.js(core + viewer 组件层):去重 promise,失败重置允许重试(对齐 monaco loader)。\n * @author ddj 2026年09月22号\n * @returns Promise<{lib, viewer}> lib=build/pdf.mjs(getDocument/GlobalWorkerOptions/编辑器枚举等),viewer=web/pdf_viewer.mjs(PDFViewer/EventBus 等)\n */\nexport function loadPdfjs() {\n if (!pdfjsPromise) {\n pdfjsPromise = new Promise((resolve, reject) => {\n ensurePdfCss()\n const boot = () => {\n const handoff = window.__edrvPdfjs\n if (handoff && handoff.lib && handoff.viewer) {\n try {\n handoff.lib.GlobalWorkerOptions.workerSrc = PDFJS_WORKER_SRC\n } catch (error) { /* worker 配置失败留给 getDocument 报错 */ }\n resolve(handoff)\n return\n }\n reject(new Error('pdf.js 模块加载失败:handoff 缺失'))\n }\n const fail = (error) => {\n pdfjsPromise = null\n reject(error instanceof Error ? error : new Error(String(error)))\n }\n const existing = document.querySelector('script[data-edrv-pdfjs-loader]')\n if (existing) {\n // 前一次注入仍在执行:等 handoff 出现(module 评估完即写入)\n existing.addEventListener('edrv-pdfjs-ready', boot, { once: true })\n if (window.__edrvPdfjs) boot()\n return\n }\n const s = document.createElement('script')\n s.type = 'module'\n s.textContent =\n 'import * as lib from \"' + PDFJS_BASE + '/build/pdf.mjs\";\\n' +\n 'import * as viewer from \"' + PDFJS_BASE + '/web/pdf_viewer.mjs\";\\n' +\n 'window.__edrvPdfjs = { lib, viewer };\\n' +\n 'document.querySelector(\"script[data-edrv-pdfjs-loader]\")?.dispatchEvent(new Event(\"edrv-pdfjs-ready\"));'\n s.dataset.edrvPdfjsLoader = '1'\n s.onload = boot\n s.onerror = () => fail(new Error('pdf.js loader 脚本加载失败(检查 assets/vendor/pdfjs 完整 / /edrv/vendor 路由可达)'))\n document.head.appendChild(s)\n })\n }\n return pdfjsPromise\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — PDF 面板控制器(命令式 DOM,React 只渲染外壳 div)。\n * 浏览:PDFViewer 组件(虚拟化渲染 + 文本层);编辑:内置注释编辑器\n * (FreeText 文本框 / Ink 画笔 / Highlight 高亮),保存经 pdfDocument.saveDocument()\n * → base64 → edrv.saveBinary 回写原文件。接线方式对齐官方 viewer(web/app.js)。\n * 作者 ddj 2026-09-22\n */\nimport { rpc } from '../rpc.js'\nimport { bytesToBase64 } from '../pdfPreview.js'\nimport { loadPdfjs, PDFJS_CMAP_URL, PDFJS_FONT_URL } from './pdfLoader.js'\n\n/** 无障碍占位 l10n:组件内 translate 为 fire-and-forget,stub 避免触发 locale 404。 */\nconst L10N_STUB = {\n get: async (key) => key,\n translate: async () => {},\n getDirection: () => 'ltr',\n}\n\n/**\n * PDF 面板控制器工厂。\n * @author ddj 2026年09月22号\n * @param deps 依赖:sessionId/path(保存回写目标)+ 状态栏回调\n * @returns 控制器:mount/destroy/savePdf/setMode/isDirty\n */\nexport function createPdfPanel(deps) {\n const status = (t) => { try { deps.setStatus(t) } catch { /* 状态栏回调异常忽略 */ } }\n\n let stage = null\n let pageLabel = null\n let eventBus = null\n let busAbort = null\n let editorTypes = null\n let pdfViewer = null\n let pdfDocument = null\n let loadingTask = null\n let modeButtons = null\n let destroyed = false\n let dirty = false\n let saving = false\n\n /** 脏状态上抛(tab 脏点)+ 本地记忆。 */\n const setDirty = (value) => {\n dirty = value\n if (modeButtons) modeButtons.save.classList.toggle('edrv-pdf-dirty', value)\n try { deps.onDirtyChange(value) } catch { /* 脏点回调异常忽略 */ }\n }\n\n /** 页码指示更新(pagechanging/pagesinit 事件)。 */\n const updatePageLabel = () => {\n if (!pageLabel || !pdfViewer) return\n pageLabel.textContent = pdfViewer.currentPageNumber + ' / ' + pdfViewer.pagesCount\n }\n\n /** 编辑模式按钮高亮同步(annotationeditormodechanged 事件;evt.mode 为枚举数值)。 */\n const syncModeButtons = (mode) => {\n if (!modeButtons || !editorTypes) return\n const byValue = { [editorTypes.NONE]: 'none', [editorTypes.FREETEXT]: 'freetext', [editorTypes.INK]: 'ink', [editorTypes.HIGHLIGHT]: 'highlight' }\n const key = byValue[mode] ?? 'none'\n for (const k of Object.keys(modeButtons.modes)) {\n modeButtons.modes[k].classList.toggle('edrv-pdf-mode-on', k === key)\n }\n }\n\n /** 编辑模式符号键 → AnnotationEditorType 数值(版本间枚举值有差异,禁止硬编码)。 */\n const modeValueOf = (key) => {\n if (!editorTypes) return null\n return { none: editorTypes.NONE, freetext: editorTypes.FREETEXT, ink: editorTypes.INK, highlight: editorTypes.HIGHLIGHT }[key] ?? null\n }\n\n /**\n * 切换编辑模式(进入注释编辑器某模式或退出回 NONE)。\n * @author ddj 2026年09月22号\n * @param key 模式符号键:none/freetext/ink/highlight\n */\n const applyMode = (key) => {\n if (!pdfViewer || !pdfDocument) { status('PDF 未就绪'); return }\n const mode = modeValueOf(key)\n if (mode === null) return\n try {\n pdfViewer.annotationEditorMode = { mode }\n status(key === 'none' ? '已退出编辑' : '编辑模式:' + (key === 'freetext' ? '文本框' : key === 'ink' ? '画笔' : '高亮'))\n } catch (error) {\n status('切换编辑模式失败:' + String(error))\n }\n }\n\n /**\n * 保存编辑:saveDocument 导出 → base64 → edrv.saveBinary 回写。\n * @author ddj 2026年09月22号\n * @returns Promise<boolean> 是否成功\n */\n const savePdf = async () => {\n if (saving) return false\n if (!pdfDocument) { status('PDF 未就绪'); return false }\n if (!dirty) { status('PDF 无未保存修改'); return true }\n saving = true\n status('正在保存 PDF…')\n try {\n const data = await pdfDocument.saveDocument()\n const res = await rpc('edrv.saveBinary', { sessionId: deps.sessionId, path: deps.path, content: bytesToBase64(data), encoding: 'base64' })\n if (res && res.ok) {\n setDirty(false)\n try { pdfDocument.annotationStorage.resetModified() } catch { /* 重置失败仅影响下次保存判定 */ }\n status('已保存 ' + new Date().toTimeString().slice(0, 8))\n return true\n }\n status('保存失败')\n try { deps.setError(res?.error ? String(res.error) : '保存失败') } catch { /* 错误回调异常忽略 */ }\n return false\n } catch (error) {\n status('保存失败')\n try { deps.setError('PDF 保存异常:' + String(error)) } catch { /* 错误回调异常忽略 */ }\n return false\n } finally {\n saving = false\n }\n }\n\n /** 工具条 DOM(页码/缩放/编辑模式/保存/刷新)。 */\n const buildToolbar = (root) => {\n const bar = document.createElement('div')\n bar.className = 'edrv-pdf-bar'\n const mkBtn = (text, title, onClick, cls) => {\n const b = document.createElement('button')\n b.className = cls || 'edrv-pill edrv-pill-ghost'\n b.textContent = text\n b.title = title\n b.addEventListener('click', onClick)\n bar.appendChild(b)\n return b\n }\n mkBtn('◀', '上一页', () => { if (pdfViewer) pdfViewer.currentPageNumber = Math.max(1, pdfViewer.currentPageNumber - 1) })\n pageLabel = document.createElement('span')\n pageLabel.className = 'edrv-pdf-page'\n pageLabel.textContent = '…'\n bar.appendChild(pageLabel)\n mkBtn('▶', '下一页', () => { if (pdfViewer) pdfViewer.currentPageNumber = Math.min(pdfViewer.pagesCount, pdfViewer.currentPageNumber + 1) })\n mkBtn('−', '缩小', () => { try { pdfViewer.decreaseScale() } catch { /* 缩放失败忽略 */ } }, 'edrv-pill edrv-pill-ghost edrv-pdf-zoom')\n mkBtn('+', '放大', () => { try { pdfViewer.increaseScale() } catch { /* 缩放失败忽略 */ } }, 'edrv-pill edrv-pill-ghost edrv-pdf-zoom')\n bar.appendChild(document.createElement('span')).className = 'edrv-pdf-sep'\n const modes = {}\n modes.freetext = mkBtn('✎ 文本框', '插入文本框注释', () => applyMode('freetext'))\n modes.ink = mkBtn('🖌 画笔', '手绘画笔注释', () => applyMode('ink'))\n modes.highlight = mkBtn('🖍 高亮', '高亮选中文本', () => applyMode('highlight'))\n modes.none = mkBtn('☐ 选择', '退出编辑模式', () => applyMode('none'))\n modeButtons = { modes, save: null }\n bar.appendChild(document.createElement('span')).className = 'edrv-pdf-sep'\n mkBtn('⟳', '重新加载文件', () => { try { deps.onReload() } catch { /* 刷新回调异常忽略 */ } })\n modeButtons.save = mkBtn('💾 保存', '保存修改到文件 (Ctrl+S)', () => { void savePdf() })\n root.appendChild(bar)\n }\n\n /**\n * 挂载面板并加载 PDF 字节。\n * @author ddj 2026年09月22号\n * @param host React 渲染的外壳 div(挂载后保持引用稳定)\n * @param bytes PDF 原始字节\n * @returns Promise<void> 渲染就绪或失败(失败置 deps.setError)\n */\n const mount = async (host, bytes) => {\n try {\n const pdfjs = await loadPdfjs()\n if (destroyed) return\n editorTypes = pdfjs.lib.AnnotationEditorType\n busAbort = new AbortController()\n const onBus = (name, fn) => eventBus.on(name, fn, { signal: busAbort.signal })\n const root = document.createElement('div')\n root.className = 'edrv-pdf'\n buildToolbar(root)\n stage = document.createElement('div')\n stage.className = 'edrv-pdf-stage'\n const viewerDiv = document.createElement('div')\n viewerDiv.className = 'pdfViewer edrv-pdf-viewer'\n stage.appendChild(viewerDiv)\n root.appendChild(stage)\n host.textContent = ''\n host.appendChild(root)\n\n eventBus = new pdfjs.viewer.EventBus()\n const linkService = new pdfjs.viewer.PDFLinkService({ eventBus })\n pdfViewer = new pdfjs.viewer.PDFViewer({\n container: stage,\n viewer: viewerDiv,\n eventBus,\n linkService,\n l10n: L10N_STUB,\n textLayerMode: 1,\n annotationEditorMode: editorTypes.NONE,\n })\n linkService.setViewer(pdfViewer)\n onBus('pagechanging', updatePageLabel)\n onBus('pagesinit', () => {\n try { pdfViewer.currentScaleValue = 'page-width' } catch { /* 初始缩放失败用默认值 */ }\n updatePageLabel()\n })\n onBus('annotationeditormodechanged', (evt) => syncModeButtons(evt?.mode))\n\n loadingTask = pdfjs.lib.getDocument({ data: bytes, cMapUrl: PDFJS_CMAP_URL, cMapPacked: true, standardFontDataUrl: PDFJS_FONT_URL })\n pdfDocument = await loadingTask.promise\n if (destroyed) { void loadingTask.destroy(); return }\n const storage = pdfDocument.annotationStorage\n storage.onSetModified = () => setDirty(true)\n storage.onResetModified = () => setDirty(false)\n pdfViewer.setDocument(pdfDocument)\n linkService.setDocument(pdfDocument)\n status('PDF 已就绪(' + pdfDocument.numPages + ' 页)')\n } catch (error) {\n if (destroyed) return\n const message = String((error && (error.message || error.name)) || error)\n const friendly = message.includes('password') ? '不支持加密 PDF' : 'PDF 加载失败:' + message\n status('PDF 加载失败')\n try { deps.setError(friendly) } catch { /* 错误回调异常忽略 */ }\n }\n }\n\n /** 是否有未保存修改(EditorView Ctrl+S 分派用)。 */\n const isDirty = () => dirty\n\n /** 销毁:解绑事件、销毁文档与 DOM(重复调用安全)。 */\n const destroy = () => {\n destroyed = true\n try { busAbort?.abort() } catch { /* 已中止 */ }\n try { pdfViewer?.cleanup() } catch { /* 视图已销毁 */ }\n try { void loadingTask?.destroy() } catch { /* 任务已销毁 */ }\n try { void pdfDocument?.destroy() } catch { /* 文档已销毁 */ }\n if (stage?.parentNode) stage.parentNode.removeChild(stage)\n stage = null\n eventBus = null\n busAbort = null\n editorTypes = null\n pdfViewer = null\n pdfDocument = null\n loadingTask = null\n modeButtons = null\n }\n\n return { mount, destroy, savePdf, isDirty }\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/**\n * 差异比较口径归一化:剥离 UTF-8 BOM、统一 CRLF 为 LF。\n * 背景:外部工具(pwsh/编辑器)可能改变 BOM/行尾,导致 after 指纹与 hunk\n * 定位在内容语义未变的情况下误报 conflict,把待确认修改从 UI 排除。\n * @author ddj 2026年09月09号\n */\nexport function normalizeForCompare(text: string): string {\n return text.replace(/^\\uFEFF/, '').replace(/\\r\\n/g, '\\n')\n}\n\n/** 归一化一个 hunk 的两侧文本(与 normalizeForCompare 同口径)。 */\nexport function normalizeHunk(hunk: Hunk): Hunk {\n return {\n oldText: hunk.oldText === null ? null : normalizeForCompare(hunk.oldText),\n newText: normalizeForCompare(hunk.newText),\n }\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) 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, normalizeForCompare, normalizeHunk, 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/**\n * 计算文件内各差异区域(行范围 + old/new + 状态),用于行内绿标注与 DiffBox。\n * 定位统一基于归一化文本(剥 BOM、CRLF→LF):外部工具可能改变行尾/BOM,\n * 与 edit 工具的 LF hunk 口径不一致会导致定位失败(差异被误标 stale)。\n * 行号按 \\n 计数,归一化不改变行号,展示语义不变。\n * @author ddj 2026年09月09号\n */\nexport function diffRegions(records: RecordView[], content: string | null): Region[] {\n const regions: Region[] = []\n if (content === null) return regions\n const normalized = normalizeForCompare(content)\n const lines = splitLines(normalized)\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: normalizeHunk(hunk) })\n }\n const locations = locateHunks(normalized, 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(normalized, 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 * `|` 连接多个候选(任一命中即触发),如 `Alt+ArrowLeft|Ctrl+Alt+-`。\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 'edrv.navigateBack': 'Alt+ArrowLeft|Ctrl+Alt+-',\n 'edrv.navigateForward': 'Alt+ArrowRight|Ctrl+Shift+-',\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/parseChords/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 { id: 'edrv.navigateBack', label: '后退(导航历史)' },\n { id: 'edrv.navigateForward', 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[]> = {}\nconst listeners = new Set<() => void>()\n\n/**\n * 应用设置快照(与默认值合并;未知 id 丢弃;空对象 = 全部默认)。\n * 每个命令可含多候选键位(`|` 分隔),任一命中即触发。\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] = parseChords(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 * 当前命令的解析键位集合(未绑定/非法 → 空数组;含多候选)。\n * @author ddj 2026年08月26号\n * @param id 命令 id\n * @returns 解析键位数组(可能为空)\n */\nexport function bindingsOf(id: string): Binding[] {\n return parsed[id] ?? []\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 * 解析多候选键位弦(`|` 分隔):逐段解析,丢弃非法段,去重。\n * @author ddj 2026年08月26号\n * @param chord 键位弦(如 `Alt+ArrowLeft|Ctrl+Alt+-`)\n * @returns 解析键位数组(纯 `|`/空/非法 → 空数组)\n */\nexport function parseChords(chord: string): Binding[] {\n const out: Binding[] = []\n const seen = new Set<string>()\n for (const part of String(chord ?? '').split('|')) {\n const binding = parseChord(part)\n if (!binding) continue\n const key = formatChord(binding)\n if (seen.has(key)) continue\n seen.add(key)\n out.push(binding)\n }\n return out\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 互认;多候选任一命中即 true)。\n * @author ddj 2026年08月26号\n * @param e 键盘事件(鸭子类型,便于单测)\n * @param bindings 解析键位或键位数组(null/空 = 未绑定,永不命中)\n * @returns 是否命中\n */\nexport function matchEvent(e: { ctrlKey?: boolean; metaKey?: boolean; shiftKey?: boolean; altKey?: boolean; key?: string }, bindings: Binding | Binding[] | null): boolean {\n const list = Array.isArray(bindings) ? bindings : bindings ? [bindings] : []\n for (const binding of list) {\n if (Boolean(e.ctrlKey || e.metaKey) !== (binding.ctrl || binding.meta)) continue\n if (Boolean(e.shiftKey) !== binding.shift) continue\n if (Boolean(e.altKey) !== binding.alt) continue\n if (normalizeKey(e.key ?? '') === binding.key) return true\n }\n return false\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 { bindingsOf, 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, bindingsOf('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 * 面板列表来自注册表(活动栏图标/徽标/激活态);最左侧图标列(活动栏)常显,\n * 右侧详情面板区可拖拽调宽/隐藏:visible=false 时仅保留图标列(宽 = 图标列宽),\n * 点击任一图标重新展开面板(onShow),底部按钮在 ◀ 收起 / ▶ 展开间切换。\n * 拖拽调宽下限 = minWidth prop(通用设置 sidebarMinWidth,默认 300),低于下限直接收起面板区。\n * 作者 ddj 2026-08-26 / 2026-09-04\n */\nimport React from 'react'\nimport type { SidebarCtx } from './types.js'\n\nconst W_MAX = 560\n/** 面板区隐藏时容器的宽度(= 图标列宽,与 editor.css .edrv-rail 对齐)。 */\nconst RAIL_ONLY_W = 44\n/** 隐藏态接缝拖拽条宽度(与 editor.css .edrv-side-resize 对齐)。 */\nconst SEAM_W = 5\n/** 隐藏态拖出面板区的触发阈值(px,拖过即展开并继续实时调宽)。 */\nconst PULL_OUT_THRESHOLD = 12\n\n/**\n * 侧边栏容器。\n * @param props.registry 面板注册表(list() 提供面板顺序)\n * @param props.ctx 面板共享上下文\n * @param props.activePanel 当前激活面板 id\n * @param props.onActive 激活面板变化回调\n * @param props.visible 面板区是否可见(false = 只显示活动栏)\n * @param props.onShow 重新展开面板区回调(活动栏图标点击/底部按钮)\n * @param props.width 面板区宽度\n * @param props.onWidth 宽度变化回调\n * @param props.onHide 收起面板区回调\n * @param props.minWidth 最小宽度(通用设置 sidebarMinWidth;拖拽低于它触发隐藏)\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 visible = props.visible !== false\n const onShow = props.onShow\n const width = props.width\n const onWidth = props.onWidth\n const onHide = props.onHide\n const wMin = Math.max(120, Math.min(W_MAX, Math.round(Number(props.minWidth) || 300)))\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 cleanup = () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n }\n const onUp = () => cleanup()\n const onMove = (ev) => {\n const raw = startW + (ev.clientX - startX)\n // 低于最小宽度:清理监听并直接收起面板区(不夹住)\n if (raw < wMin) {\n cleanup()\n onHide()\n return\n }\n onWidth(Math.min(W_MAX, raw))\n }\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n\n }\n\n /**\n * 隐藏态接缝拖拽:向右拖过阈值把面板区拉出来(以记忆宽度展开),继续拖动实时调宽。\n * @param e pointerdown 事件\n */\n const onSeamPointerDown = (e) => {\n e.preventDefault()\n const startX = e.clientX\n const baseW = Math.max(wMin, Math.min(W_MAX, Math.round(Number(width) || wMin)))\n let expanded = false\n let expandStartX = 0\n const cleanup = () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n }\n const onUp = () => cleanup()\n const onMove = (ev) => {\n if (!expanded) {\n if (ev.clientX - startX < PULL_OUT_THRESHOLD) return\n expanded = true\n expandStartX = ev.clientX\n onShow()\n return\n }\n onWidth(Math.max(wMin, Math.min(W_MAX, baseW + (ev.clientX - expandStartX))))\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' + (visible && active && p.id === active.id ? ' edrv-rail-on' : ''),\n title: p.title,\n onClick: () => {\n onActive(p.id)\n // 面板区隐藏时点击图标 = 展开到该面板(VSCode 活动栏行为)\n if (!visible && typeof onShow === 'function') onShow()\n },\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', {\n className: 'edrv-rail-btn',\n title: (visible ? '隐藏面板区' : '展开面板区') + ' (Ctrl+B)',\n onClick: () => (visible ? onHide() : onShow?.()),\n }, visible ? '◀' : '▶'))\n\n return React.createElement('div', {\n className: 'edrv-sidebar' + (visible ? '' : ' edrv-sidebar-rail-only'),\n // maxWidth 兜底:持久化宽度超过容器可用空间时也不允许布局宽溢出(配合 flex-shrink:1 收缩)\n style: { width: visible ? width : RAIL_ONLY_W + SEAM_W, maxWidth: '100%' },\n },\n rail,\n visible\n ? React.createElement('div', { className: 'edrv-side-body' },\n active ? active.render(ctx) : null)\n : null,\n visible\n ? React.createElement('div', { className: 'edrv-side-resize', onPointerDown: onPointerDown })\n // 隐藏态接缝:悬浮显示拖拽光标与高亮,向右拖把面板区拉出来\n : React.createElement('div', { className: 'edrv-side-resize', title: '拖拽展开面板区', onPointerDown: onSeamPointerDown }))\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 键前缀表(按功能隔离;与 scopeStore 作用域键拼接:工作区优先,无 cwd 回退会话)。 */\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 /** 规则面板 UI 状态(RulesPanel v1:Tab 与项目工作区选择,全局不按会话)。 */\n rules: 'edrv.rules.v1.',\n} as const\n\n/** 按前缀拼作用域键(scopeStore 产出作用域;侧边栏/编辑器等需要布局段时自行拼接后传入)。 */\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 键前缀(按工作区作用域隔离,无 cwd 会话回退会话键)。 */\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 scope 作用域键(scopeStore.workspaceScopeOf 产物)\n * @returns path → viewState 映射\n */\nexport function viewStatesLoad(scope: string): Record<string, unknown> {\n try {\n return parseViewStates(window.localStorage.getItem(KEY_PREFIX + String(scope))) ?? {}\n } catch (error) {\n return {}\n }\n}\n\n/**\n * 写入某作用域的视图状态缓存(损坏/配额满 → 忽略)。\n * @author ddj 2026年08月28号\n * @param scope 作用域键(scopeStore.workspaceScopeOf 产物)\n * @param states path → viewState 映射\n */\nexport function viewStatesSave(scope: string, states: Record<string, unknown>): void {\n try {\n window.localStorage.setItem(KEY_PREFIX + String(scope), serializeViewStates(states))\n } catch (error) { /* 配额满/隐私模式忽略 */ }\n}\n","/**\n * dsh-vscode-mode client — 编辑区状态作用域键(scope key)。\n * 编辑区 UI 状态(页签/展开树/视图状态/侧边栏等)按「工作区」隔离:同一工作区下\n * 切换对话恢复同一份状态,无体感差别;会话没有 cwd 时回退按会话隔离(旧行为)。\n * 另提供旧「会话键」数据到「工作区键」的一次性迁移(只复制不删除,幂等)。\n * 键前缀统一走 paths.ts PathConst(CACHE_KEY),本模块只产出拼接用的作用域串。\n * 作者 ddj 2026-09-09\n */\nimport { CACHE_KEY } from '../paths.js'\n\n// --region 归一化与作用域键\n\n/** Windows 盘符绝对路径(如 D:/ 或 d:\\),大小写不敏感。 */\nconst WIN_DRIVE_RE = /^[a-z]:\\//i\n\n/**\n * 归一化工作区路径:trim、反斜杠→斜杠、去尾部斜杠;\n * Windows 盘符绝对路径整体小写(文件系统大小写不敏感),POSIX 路径保留大小写。\n * @author ddj 2026年09月09号\n * @param cwd 工作区目录(sessions 快照 byId[sessionId].cwd)\n * @returns 归一化路径;空值返回 ''\n */\nexport function normalizeWsPath(cwd: string | undefined | null): string {\n const s = String(cwd ?? '').trim().replace(/\\\\/g, '/').replace(/\\/+$/, '')\n if (!s) return ''\n return WIN_DRIVE_RE.test(s) ? s.toLowerCase() : s\n}\n\n/**\n * 计算编辑区状态作用域键:有 cwd → 'ws:' + 归一化路径(同工作区共享);\n * 无 cwd → 'sid:' + sessionId(回退按会话隔离,对齐旧行为)。\n * @author ddj 2026年09月09号\n * @param cwd 工作区目录(可为 null/undefined)\n * @param sessionId 会话 id(cwd 缺失时的隔离键)\n * @returns 作用域键字符串\n */\nexport function workspaceScopeOf(cwd: string | undefined | null, sessionId: string | undefined): string {\n const ws = normalizeWsPath(cwd)\n if (ws) return 'ws:' + ws\n return 'sid:' + String(sessionId ?? '')\n}\n// --endregion\n\n// --region 旧会话键迁移\n\n/** 参与迁移的 localStorage 键前缀(编辑区全部按会话持久化的旧键)。 */\nconst MIGRATE_PREFIXES: readonly string[] = [\n CACHE_KEY.editor,\n CACHE_KEY.viewstate,\n CACHE_KEY.sidebar + 'side.',\n CACHE_KEY.sidebar,\n CACHE_KEY.search,\n CACHE_KEY.expanded,\n CACHE_KEY.entries,\n]\n\n/** 已迁移过的 scope+sessionId 组合(按 storage 实例分组;每页生命周期只跑一次)。 */\nconst migratedPairs = new WeakMap<object, Set<string>>()\n\n/**\n * 把旧「前缀+sessionId」键的数据一次性复制到「前缀+scope」键(目标已存在则跳过)。\n * 只复制不删除旧键;幂等,可安全重复调用。升级后首个工作区键为空时兜底恢复旧数据。\n * @author ddj 2026年09月09号\n * @param scope 目标作用域键\n * @param sessionId 旧数据所属会话 id\n * @param storage localStorage 注入口(缺省 window.localStorage,测试可传内存桩)\n */\nexport function migrateScopedKeys(scope: string, sessionId: string | undefined, storage?: Storage): void {\n if (!scope || !sessionId) return\n let store: Storage | null = null\n try {\n store = storage ?? window.localStorage\n } catch (error) {\n return\n }\n if (!store) return\n let pairs = migratedPairs.get(store)\n if (!pairs) {\n pairs = new Set()\n migratedPairs.set(store, pairs)\n }\n const pair = scope + '|' + sessionId\n if (pairs.has(pair)) return\n pairs.add(pair)\n const legacy = String(sessionId)\n for (const prefix of MIGRATE_PREFIXES) {\n const target = prefix + scope\n try {\n if (store.getItem(target) !== null) continue\n const raw = store.getItem(prefix + legacy)\n if (raw === null) continue\n store.setItem(target, raw)\n } catch (error) { /* 配额满/隐私模式忽略,不阻塞 */ }\n }\n}\n// --endregion\n","/**\n * dsh-vscode-mode client — Monaco model 跨挂载缓存(按工作区作用域)。\n * 编辑区每会话重挂载会销毁实例,但文件 model(内容)与工作区绑定:\n * 按作用域把 model 缓存在模块级,重挂载后 loadContent 命中缓存同步种出内容,\n * 消除切换对话时的加载闪烁。切换作用域时释放上一作用域未附着编辑器的模型\n * (附着中的仅移出缓存,交由编辑器自身生命周期,防正在显示的模型被销毁)。\n * 纯对象容器逻辑,不依赖 monaco,可单测。\n * 作者 ddj 2026-09-09\n */\n\n// --region 常量与状态\n\n/** 单作用域缓存上限(超出按写入序逐出最旧,近似 LRU)。 */\nexport const MODEL_CACHE_CAP = 40\n\n/** scope →(path → model)缓存表。 */\nconst caches = new Map<string, Map<string, unknown>>()\n/** 当前激活作用域(切换时释放上一个)。 */\nlet activeScope: string | null = null\n// --endregion\n\n/** 模型是否仍附着在某个编辑器实例上(缺方法视为未附着)。 */\nfunction isAttached(model: unknown): boolean {\n const fn = (model as { isAttachedToEditor?: () => boolean } | null)?.isAttachedToEditor\n return typeof fn === 'function' ? fn.call(model) === true : false\n}\n\n/** 释放模型(仅未附着编辑器时真正 dispose;附着中的保留给编辑器自毁)。 */\nfunction disposeIfFree(model: unknown): void {\n if (!model || isAttached(model)) return\n try { (model as { dispose: () => void }).dispose() } catch { /* 已释放/异常忽略 */ }\n}\n\n/**\n * 取(或切)某作用域的 model 缓存:同作用域重复调用复用同一 Map(跨挂载存活);\n * 作用域变化时释放上一作用域的模型(未附着的 dispose,附着中的仅移出缓存)。\n * @author ddj 2026年09月09号\n * @param scope 作用域键(scopeStore.workspaceScopeOf 产物)\n * @returns 该作用域的 path → model Map\n */\nexport function modelsForScope(scope: string): Map<string, unknown> {\n const existing = caches.get(scope)\n if (existing && activeScope === scope) return existing\n if (activeScope !== null && activeScope !== scope) {\n const prev = caches.get(activeScope)\n if (prev) {\n for (const model of prev.values()) disposeIfFree(model)\n prev.clear()\n caches.delete(activeScope)\n }\n }\n activeScope = scope\n if (existing) return existing\n const map = new Map<string, unknown>()\n caches.set(scope, map)\n return map\n}\n\n/**\n * 记入模型并刷新 LRU 序(先删后插保证最新),超上限逐出最旧(未附着才 dispose)。\n * @author ddj 2026年09月09号\n * @param map 作用域缓存 Map\n * @param path 工作区相对路径\n * @param model Monaco model(或测试桩)\n */\nexport function rememberModel(map: Map<string, unknown>, path: string, model: unknown): void {\n if (!path || !model) return\n map.delete(path)\n map.set(path, model)\n while (map.size > MODEL_CACHE_CAP) {\n const oldest = map.keys().next().value\n if (oldest === undefined) break\n const evicted = map.get(oldest)\n map.delete(oldest)\n disposeIfFree(evicted)\n }\n}\n","/**\n * dsh-vscode-mode client — 侧边栏最小宽度共享状态。\n * 设置来源:dsh-vscode-mode 命名空间的 sidebarMinWidth 字段(通用设置页可调);\n * 客户端 settings 订阅经 sidebarMinApply 写入,编辑器/侧边栏容器经 getSidebarMinWidth 读取,\n * 变更时由 client/index.ts 派发 edrv:sidebar-min-width 窗口事件通知编辑器重夹。\n * 作者 ddj 2026年09月04号\n */\n\n/** 默认最小宽度(设置缺失/非法时的兜底值)。 */\nexport const SIDEBAR_MIN_DEFAULT = 300\n/** 最小宽度允许下界(与旧版拖拽下限一致)。 */\nexport const SIDEBAR_MIN_FLOOR = 180\n/** 最小宽度允许上界(与侧边栏最大宽度 W_MAX 一致,避免区间倒挂)。 */\nexport const SIDEBAR_MIN_CEIL = 560\n\nlet currentMin = SIDEBAR_MIN_DEFAULT\n\n/**\n * 归一化最小宽度:非法(NaN/非有限/负数)回退默认,越界夹取到 [180, 560]。\n * @author ddj 2026年09月04号\n * @param value 原始值(设置文档来的任意 JSON 值)\n * @returns 合法最小宽度\n */\nexport function normalizeSidebarMinWidth(value: unknown): number {\n const n = typeof value === 'number' ? value : Number(value)\n if (!Number.isFinite(n) || n <= 0) return SIDEBAR_MIN_DEFAULT\n return Math.max(SIDEBAR_MIN_FLOOR, Math.min(SIDEBAR_MIN_CEIL, Math.round(n)))\n}\n\n/**\n * 应用设置值(client/index.ts 设置订阅同步调用)。\n * @author ddj 2026年09月04号\n * @param value 设置文档中的 sidebarMinWidth\n * @returns 归一化后的生效值\n */\nexport function sidebarMinApply(value: unknown): number {\n currentMin = normalizeSidebarMinWidth(value)\n return currentMin\n}\n\n/**\n * 读取当前生效的最小宽度(编辑器初始/恢复/拖拽夹取共用)。\n * @author ddj 2026年09月04号\n * @returns 当前最小宽度\n */\nexport function getSidebarMinWidth(): number {\n return currentMin\n}\n","/**\n * dsh-vscode-mode client — 编辑器导航历史(后退/前进)纯逻辑。\n * 对齐 VSCode Go Back / Go Forward(navigation history):记录「文件 + 焦点位置」访问轨迹,\n * 后退回到上一处焦点,前进回到下一处,跨文件生效。\n * 数据模型:past(末位 = 当前)+ future 两个栈;record 压栈并清空 future;\n * 与栈顶同 path+line+column 视为同一位置:仅刷新 viewState 快照,不压栈、不清 future。\n * 纯逻辑无 DOM 依赖,可单测;navHistoryFor 提供按工作区作用域的实例仓(跨会话复用)。\n * 作者 ddj 2026年09月04号\n */\n\n/** 导航历史单条记录:文件 + 焦点位置(+ 可选的 viewState 快照用于恢复滚动/折叠)。 */\nexport interface NavEntry {\n /** 工作区相对路径 */\n path: string\n /** 焦点行(1-based) */\n line?: number\n /** 焦点列(1-based) */\n column?: number\n /** 该位置保存的 Monaco viewState(恢复滚动/折叠) */\n viewState?: unknown\n}\n\n/** 导航历史接口。 */\nexport interface NavHistory {\n /** 记录当前位置(压栈 + 清空 future;与栈顶同位置时仅更新 viewState)。 */\n record(entry: NavEntry): void\n /** 后退:返回将要恢复的前一条目;历史不足 2 条 → null。 */\n back(): NavEntry | null\n /** 前进:返回将要恢复的条目;future 空 → null。 */\n forward(): NavEntry | null\n /** 是否可后退。 */\n canBack(): boolean\n /** 是否可前进。 */\n canForward(): boolean\n /** 后退目标条目(不改变状态;不可退 → null)。 */\n peekBack(): NavEntry | null\n /** 前进目标条目(不改变状态;不可进 → null)。 */\n peekForward(): NavEntry | null\n}\n\n/** 后退栈默认容量上限(超出逐出最旧)。 */\nexport const NAV_HISTORY_CAP = 200\n\n/** 工作区历史实例缓存上限(FIFO 逐出最久未用作用域,防长期驻留泄漏)。 */\nexport const NAV_SCOPE_CAP = 6\n\n/** scope → 导航历史实例(同工作区跨会话复用同一份历史)。 */\nconst scopeHistories = new Map<string, NavHistory>()\n\n/** 路径一致(容忍相对路径大小写差异,对齐既有 sameFile 语义常用写法)。 */\nfunction samePath(a: string, b: string): boolean {\n if (a === b) return true\n return String(a).replace(/\\\\/g, '/').toLowerCase() === String(b).replace(/\\\\/g, '/').toLowerCase()\n}\n\n/** 位置一致(无焦点时按 null 归一,`undefined`/`null` 视为相等)。 */\nfunction samePos(a: NavEntry, b: NavEntry): boolean {\n if (!samePath(a.path, b.path)) return false\n return (a.line ?? null) === (b.line ?? null) && (a.column ?? null) === (b.column ?? null)\n}\n\n/**\n * 创建导航历史实例(容量裁剪到 cap)。\n * @author ddj 2026年09月04号\n * @param cap 后退栈容量上限(默认 NAV_HISTORY_CAP)\n * @returns 导航历史实例\n */\nexport function createNavHistory(cap = NAV_HISTORY_CAP): NavHistory {\n const past: NavEntry[] = []\n const future: NavEntry[] = []\n return {\n record(entry: NavEntry): void {\n if (!entry || !entry.path) return\n const top = past[past.length - 1]\n if (top && samePos(top, entry)) {\n // 同一位置:只更新 viewState 快照(滚动/折叠可能变化),栈与 future 不动\n if (top.viewState !== undefined || entry.viewState !== undefined) top.viewState = entry.viewState\n return\n }\n past.push({ path: entry.path, line: entry.line, column: entry.column, viewState: entry.viewState })\n if (past.length > cap) past.splice(0, past.length - cap)\n future.length = 0\n },\n back(): NavEntry | null {\n if (past.length < 2) return null\n const current = past.pop()\n if (!current) return null\n future.push(current)\n return past[past.length - 1]\n },\n forward(): NavEntry | null {\n const entry = future.pop()\n if (!entry) return null\n past.push(entry)\n return entry\n },\n canBack(): boolean {\n return past.length >= 2\n },\n canForward(): boolean {\n return future.length > 0\n },\n peekBack(): NavEntry | null {\n return past.length >= 2 ? past[past.length - 2] : null\n },\n peekForward(): NavEntry | null {\n return future.length ? future[future.length - 1] : null\n },\n }\n}\n\n/**\n * 取(或建)某工作区作用域的导航历史实例:同 scope 跨会话复用同一实例,\n * 后退/前进历史在切换对话后保留(对齐「同一工作区同一编辑区」体感)。\n * 超出 NAV_SCOPE_CAP 时逐出最旧的实例(Map 插入序近似 LRU)。\n * @author ddj 2026年09月09号\n * @param scope 作用域键(scopeStore.workspaceScopeOf 产物)\n * @param cap 后退栈容量上限(透传 createNavHistory)\n * @returns 导航历史实例\n */\nexport function navHistoryFor(scope: string, cap = NAV_HISTORY_CAP): NavHistory {\n const existing = scopeHistories.get(scope)\n if (existing) return existing\n const created = createNavHistory(cap)\n scopeHistories.set(scope, created)\n if (scopeHistories.size > NAV_SCOPE_CAP) {\n const oldest = scopeHistories.keys().next().value\n if (typeof oldest === 'string') scopeHistories.delete(oldest)\n }\n return created\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 均支持)。 */\nexport type RefAppearance = 'file' | 'folder'\n\n/** 把追加引用结果映射为可读文案(ok 用 okText;busy 提示已降级纯文本;unavailable 提示不可用)。\n * @author ddj 2026年09月03号\n * @param outcome 追加结果状态\n * @param okText 成功文案(如「已添加文件引用」/「已添加文件夹引用」)\n * @returns 状态栏/通知用文案\n */\nexport function statusOfAdd(outcome: AddOutcome, okText: string): string {\n if (outcome === 'ok') return okText\n if (outcome === 'busy') return okText + '(输入框忙,已降级纯文本)'\n return '无法添加到对话(无会话或输入框不可用)'\n}\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) 文本)。\n * @param path 目标路径(相对 cwd 或绝对)\n * @param cwd 会话工作区目录(可选)\n * @param range 行区间(可选)\n * @param appearance 引用外观:'file'(默认)| 'folder'\n */\nexport function buildFileRef(\n path: string,\n cwd: string | undefined,\n range?: RefRange,\n appearance: RefAppearance = 'file',\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,\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}\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(\n sessionId: string | undefined,\n path: string,\n range?: RefRange,\n appearance?: RefAppearance,\n ): 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/** 输入门面插入引用(拦截异常视作未应用,走降级)。\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, appearance) => {\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, appearance)\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 return 'busy'\n }\n return 'ok'\n }\n\n return { appendReference }\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/** 语义 token 解码后的绝对范围(LSP 0-based;type 为插件固定 legend 与 type 名)。 */\nexport interface LspSemanticTokenRange {\n start: LspPosition\n end: LspPosition\n type: string\n modifiers: number\n}\n\n/** 语义 token 中可作为\"可导航标识符\"的类型(ctrl+hover 下划线判定用)。 */\nexport const LSP_NAVIGABLE_TOKEN_TYPES: ReadonlySet<string> = new Set([\n 'variable', 'parameter', 'property', 'function', 'method', 'class', 'enum',\n 'struct', 'interface', 'namespace', 'typeParameter', 'enumMember', 'event', 'type',\n])\n\n/**\n * 语义 token 是否属于可导航标识符。\n * @author ddj 2026年09月02号\n * @param type 语义 token 类型名(插件固定 legend)\n * @returns 是否可导航\n */\nexport function isNavigableTokenType(type: string): boolean {\n return LSP_NAVIGABLE_TOKEN_TYPES.has(type)\n}\n\n/**\n * 解码 LSP delta 编码的语义 token 流为绝对范围数组。\n * @author ddj 2026年09月02号\n * @param data 5 元组 delta 流(host normalizeSemanticData 产物,类型索引对应固定 legend)\n * @param types 固定 legend 类型表(缺省 LSP_SEMANTIC_TOKEN_TYPES)\n * @returns 绝对范围列表(保持文档顺序)\n */\nexport function decodeSemanticTokens(\n data: number[],\n types: readonly string[] = LSP_SEMANTIC_TOKEN_TYPES,\n): LspSemanticTokenRange[] {\n const out: LspSemanticTokenRange[] = []\n let line = 0\n let character = 0\n for (let i = 0; i + 4 < data.length; i += 5) {\n const deltaLine = data[i] ?? 0\n const deltaCharacter = data[i + 1] ?? 0\n const length = Math.max(0, data[i + 2] ?? 0)\n const typeIndex = data[i + 3] ?? 0\n const modifiers = data[i + 4] ?? 0\n line += deltaLine\n character = deltaLine === 0 ? character + deltaCharacter : deltaCharacter\n out.push({\n start: { line, character },\n end: { line, character: character + length },\n type: types[typeIndex] ?? 'variable',\n modifiers,\n })\n }\n return out\n}\n\n/** LSP 服务器能力子集:本插件会用到的方法。 */\nexport interface LspServerCapabilities {\n definition: boolean\n declaration: 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.missingEnv 元素,仅含未满足项)。 */\nexport interface LspMissingEnv {\n id: string // 需求标识(如 dotnet-runtime:10,同时是安装器键)\n label: string // 显示名(如 '.NET 运行时 10.0')\n detail?: string // 说明(哪个服务器需要)\n installable: boolean // 支持一键安装\n manualUrl?: string // 官网手动下载地址\n manualLabel?: string\n}\n\n/** 环境安装进行态(edrv.lsp.envState 载荷元素)。 */\nexport interface LspEnvInstallState {\n id: string\n phase: 'idle' | 'downloading' | 'extracting' | 'done' | 'failed'\n message?: string\n}\n\n/** 同语言检测到的候选服务器(candidates 元素;chosen 标记当前选用者)。 */\nexport interface LspCandidate {\n name: string // 显示名(如 EmmyLua / LuaLS / Roslyn)\n version?: string // 扩展清单版本\n path?: string // 服务器入口路径(argv 比对用)\n chosen?: boolean // 是否为当前解析选用的服务器\n}\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 missingEnv?: LspMissingEnv[] // 未满足的环境需求(无则省略)\n candidates?: LspCandidate[] // 同语言检测到的候选服务器(设置页展示用,无则省略)\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) {\n // 0 条「其它」引用:降级查定义(参数/局部变量只被声明时引用为空,定义可经 host 降级链推导)\n const defs = await findDefinition(path, model.getValue(), position)\n const first = defs[0]\n if (!first) return\n const lspPos = monoToLsp(position.lineNumber, position.column)\n if (sameFile(targetOpenPath(first), path) && posInRange(lspPos, first.lspRange)) return // 定义即自身:无其它可跳,保持静默\n jumpToLocation(first)\n return\n }\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 — Ctrl+hover 可导航标识符下划线提示。\n * 背景:内嵌 Monaco 构建(0.42.0-dev)无 linkDetection contrib,原生不产生 ctrl+hover 下划线,\n * 插件自绘:Ctrl/Meta 按住悬停在\"语义 token 标识符\"上时给词加下划线装饰,移出/松开即清除。\n * 数据来源于语义 token(每 model+version 缓存 60s),不做逐词 LSP 查询。\n * 作者 ddj 2026-09-02\n */\nimport { pathOfModel, fetchSemanticTokens } from './lspClient.js'\nimport { decodeSemanticTokens, isNavigableTokenType } from '../../../shared/lsp.js'\n\nconst CACHE_TTL_MS = 60_000\n\n/**\n * 给一个 Monaco 编辑器绑定 Ctrl+hover 下划线提示(幂等)。\n * @author ddj 2026年09月02号\n * @param ed Monaco 编辑器\n * @param monaco Monaco 实例\n */\nexport function bindLspUnderline(ed, monaco) {\n if (!ed || !monaco || ed.__edrvUnderline) return\n ed.__edrvUnderline = true\n let decoIds = []\n let lastKey = null\n let hoverSeq = 0\n let cache = { path: null, version: -1, ranges: null, at: 0 }\n\n const clear = () => {\n if (decoIds.length) {\n ed.deltaDecorations(decoIds, [])\n decoIds = []\n }\n lastKey = null\n }\n\n /** 取当前文档语义 token 范围(模型版本 + TTL 缓存)。 */\n const rangesOf = async (model) => {\n const path = pathOfModel(model)\n const version = model.getVersionId?.() ?? 0\n if (cache.path === path && cache.version === version && cache.ranges && Date.now() - cache.at < CACHE_TTL_MS) {\n return cache.ranges\n }\n const res = await fetchSemanticTokens(path, model.getValue()).catch(() => null)\n const ranges = res && Array.isArray(res.data) ? decodeSemanticTokens(res.data) : []\n cache = { path, version, ranges, at: Date.now() }\n return ranges\n }\n\n ed.onMouseMove((event) => {\n const native = event?.event\n const ctrl = native?.ctrlKey ?? false\n const meta = native?.metaKey ?? false\n if (!ctrl && !meta) {\n clear()\n hoverSeq++\n return\n }\n const pos = event?.target?.position\n const model = ed.getModel()\n if (!pos || !model) {\n clear()\n hoverSeq++\n return\n }\n const word = model.getWordAtPosition(pos)\n if (!word) {\n clear()\n hoverSeq++\n return\n }\n const seq = ++hoverSeq\n const path = pathOfModel(model)\n void rangesOf(model).then((ranges) => {\n if (seq !== hoverSeq) return // 鼠标已移走,忽略过期结果\n const lineIndex = Math.max(0, word.startLineNumber - 1)\n const startCol = Math.max(0, word.startColumn - 1)\n const endCol = Math.max(startCol, word.endColumn - 1)\n const hit = ranges.some((r) => {\n if (r.start.line !== lineIndex) return false\n return isNavigableTokenType(r.type) && r.start.character <= startCol && r.end.character >= endCol\n })\n if (!hit) {\n if (lastKey !== null) clear()\n return\n }\n const key = String(path) + ':' + word.startColumn + ':' + word.endColumn\n if (key === lastKey) return\n lastKey = key\n decoIds = ed.deltaDecorations(decoIds, [{\n range: new monaco.Range(word.startLineNumber, word.startColumn, word.endLineNumber, word.endColumn),\n options: { inlineClassName: 'edrv-nav-underline' },\n }])\n })\n })\n\n ed.onMouseLeave(() => clear())\n ed.onDidBlurEditorText?.(() => clear())\n}\n\n/** 兼容占位(与 providers 的 hideReferencesOverlay 对称,无需真正释放)。 */\nexport function disposeLspUnderline() {}\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","/**\n * dsh-vscode-mode shared — AI 内联补全契约与纯函数(双面,禁 node/react)。\n * 只放\"过 RPC 的载荷形状\"与无副作用变换:窗口裁剪、prompt 拼装、输出清理。\n * host 与语言模型之间的流式交互在 host 侧 src/ai/inline.ts。\n * 作者 ddj\n */\n\n/** 上下文窗口:前缀字符上限(含未保存编辑的当前文档)。 */\nexport const AI_PREFIX_MAX = 2000\n/** 上下文窗口:后缀字符上限(光标之后不参与补全语义的部分)。 */\nexport const AI_SUFFIX_MAX = 500\n/** 触发门槛:前缀至少 4 个字符才请求(省掉空转调用)。 */\nexport const AI_MIN_PREFIX = 4\n/** 单次补全输出上限(token 预算 + 行数双约束,早停兜底)。 */\nexport const AI_MAX_TOKENS = 120\n/** 输出行数上限:超过即截断(ghost text 太长不可用)。 */\nexport const AI_MAX_LINES = 3\n/** 流式早停:已收字符数达到该值即 abort(省尾部延迟)。 */\nexport const AI_EARLY_STOP_CHARS = 300\n/** 补全请求超时(毫秒):codebuddy CLI 网关实测 TTFT 3.5~8.4s 抖动(debug 实证),\n * 12s 内无任何 token 即放弃;token 一到仍按行数/字符早停。 */\nexport const AI_TIMEOUT_MS = 12000\n\n/** client → host 的补全请求载荷。 */\nexport interface AiInlineRequest {\n /** 当前文档工作区相对路径(语言提示用)。 */\n path: string\n /** 光标前文本(client 已裁剪到 AI_PREFIX_MAX)。 */\n prefix: string\n /** 光标后文本(client 已裁剪到 AI_SUFFIX_MAX)。 */\n suffix: string\n}\n\n/** host → client 的补全结果(text 为空 = 无建议)。 */\nexport interface AiInlineResult {\n /** 建议插入文本(已清理:剥围栏/截行数/去重复)。 */\n text: string\n /** 失败原因(ok:false 或 text 为空时的诊断文案,供状态栏展示)。 */\n note?: string\n}\n\n/** 模型目录条目(含该模型的思考档位元数据)。 */\nexport interface AiModelEntry {\n provider: string\n model: string\n name: string\n /** 无 reasoning 元数据 = 空数组(UI 隐藏档位选择器)。 */\n efforts: Array<{ id: string; name: string }>\n /** 模型默认档位 id(无则空)。 */\n defaultEffort: string\n}\n\n/** 模型目录视图(edrv.ai.models 载荷)。 */\nexport interface AiDirectoryView {\n providers: Array<{ id: string; name: string; models: AiModelEntry[] }>\n /** 目录不可用原因(llm 服务缺失等;ok:false 时亦有 error,此为软降级说明)。 */\n note?: string\n}\n\n/** AI 补全配置视图(edrv.ai.configGet 载荷)。 */\nexport interface AiConfigView {\n enabled: boolean\n /** 空 = 自动选首个 provider/model。 */\n provider: string\n /** 空 = 自动选该 provider 首个模型。 */\n model: string\n /** 空 = 跟随模型默认(请求不携带 reasoningEffort)。 */\n effort: string\n}\n\n/** AI 补全配置更新载荷(edrv.ai.configUpdate)。 */\nexport interface AiConfigPatch {\n enabled?: boolean\n provider?: string\n model?: string\n /** 空 = 清除(跟随默认)。 */\n effort?: string\n}\n\n/**\n * 按 AI_PREFIX_MAX/AI_SUFFIX_MAX 裁剪前后缀(client 侧发请求前调用)。\n * @author ddj\n * @param prefix 光标前全文\n * @param suffix 光标后全文\n * @returns 裁剪后的窗口\n */\nexport function trimInlineWindow(prefix: string, suffix: string): { prefix: string; suffix: string } {\n const pre = typeof prefix === 'string' ? prefix : ''\n const suf = typeof suffix === 'string' ? suffix : ''\n return {\n prefix: pre.length > AI_PREFIX_MAX ? pre.slice(pre.length - AI_PREFIX_MAX) : pre,\n suffix: suf.length > AI_SUFFIX_MAX ? suf.slice(0, AI_SUFFIX_MAX) : suf,\n }\n}\n\n/**\n * 是否值得发起补全请求:前缀达标且非纯空白(空行/行首不请求)。\n * @author ddj\n * @param prefix 光标前文本\n * @returns 是否可请求\n */\nexport function inlineWorth(prefix: string): boolean {\n const pre = typeof prefix === 'string' ? prefix : ''\n if (pre.length < AI_MIN_PREFIX) return false\n // 只拦\"整体无内容\"(纯空白);结尾空白(如 `local a = `)是最自然的补全触发\n // 形态,必须放行——原尾字符守卫把这类场景全数拦截(debug 实证 H4)\n return pre.trim().length > 0\n}\n\n/**\n * 拼装补全 user 消息文本:语言/文件名 + 前缀 + 补全点标记 + 后缀。\n * host 侧与单测共用,保证请求形状一致。\n * @author ddj\n * @param req 补全请求(已裁剪)\n * @returns 用户消息文本\n */\nexport function buildInlinePrompt(req: AiInlineRequest): string {\n const name = String(req.path || '').split(/[\\\\/]/).pop() || 'untitled'\n return [\n '文件:' + name,\n '现有代码(光标位于 <CURSOR> 标记处):',\n req.prefix + '<CURSOR>' + req.suffix,\n ].join('\\n')\n}\n\n/** 补全 system 提示词:硬约束输出形态(只给插入文本)。 */\nexport const AI_INLINE_SYSTEM =\n '你是代码自动补全引擎。只输出应插入 <CURSOR> 处的代码文本:' +\n '禁止任何解释、注释性语句、markdown 代码围栏或对原文的复述;' +\n '最多 ' + AI_MAX_LINES + ' 行,从光标处自然衔接前文,不要重复前缀已有内容;' +\n '无法给出高置信度补全时输出空文本。'\n\n/**\n * 清理模型输出:剥 markdown 围栏、剥对 <CURSOR> 标记的复述、按行数截断、去首尾空行。\n * 产出空文本的判定也在这里(纯函数,单测覆盖)。\n * @author ddj\n * @param raw 模型原始输出\n * @param prefix 请求时的前缀(复述检测)\n * @returns 清理后的插入文本(可能为空串)\n */\nexport function cleanInlineText(raw: string, prefix: string): string {\n let text = typeof raw === 'string' ? raw : ''\n if (!text) return ''\n // markdown 围栏剥离(```lang … ``` 或 ```…```)\n const fenced = /^```[^\\n]*\\n([\\s\\S]*?)\\n?```$/.exec(text.trim())\n if (fenced) text = fenced[1] ?? ''\n // 模型复述了标记本身:取标记之后的部分\n const cursorAt = text.indexOf('<CURSOR>')\n if (cursorAt >= 0) text = text.slice(cursorAt + '<CURSOR>'.length)\n // 整体就是前缀结尾片段的复述:剥掉(防\"从行首重抄一遍\"类退化输出)\n const tailPrefix = prefix.length > 0 ? prefix.slice(-40) : ''\n if (tailPrefix && text.startsWith(tailPrefix)) text = text.slice(tailPrefix.length)\n // 行数截断 + 行尾空白清理\n const lines = text.split('\\n').slice(0, AI_MAX_LINES).map((l) => l.replace(/\\s+$/, ''))\n while (lines.length > 0 && lines[0] === '') lines.shift()\n while (lines.length > 0 && lines[lines.length - 1] === '') lines.pop()\n return lines.join('\\n')\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — AI 内联补全(ghost text)provider。\n * 速度设计:内部 150ms 去抖(Monaco 逐键调用 provider,不逐键打 LLM)、\n * 在飞取消(新请求 abort 旧的)+ 序号守卫(过期响应丢弃)、\n * 位置+前缀缓存(dismiss 后同位置重查不重复计费)、前后缀窗口裁剪。\n * 状态经 edrv:ai-status 事件广播给编辑器底部状态栏;\n * 差异审查期间静默(edrv 差异块存在时返回空,不与 Keep/Undo 浮层打架)。\n * 作者 ddj\n */\nimport { rpc } from '../rpc.js'\nimport { RPC_PATH } from '../../shared/rpc.js'\nimport {\n AI_PREFIX_MAX, AI_SUFFIX_MAX, inlineWorth, trimInlineWindow,\n} from '../../shared/ai.js'\n\n/**\n * 广播补全状态给编辑器底部状态栏(EditorView 监听 edrv:ai-status 渲染)。\n * @author ddj\n * @param state busy=请求中 ok=完成(detail.ms 耗时) error=失败(detail.note) idle=就绪 config=开关变化\n * @param detail 附加信息\n */\nfunction emitAiStatus(state, detail) {\n try { window.dispatchEvent(new CustomEvent('edrv:ai-status', { detail: { state, detail } })) } catch { /* 状态广播失败不影响补全 */ }\n}\n\n/** 去抖等待(毫秒):Monaco 逐键调用 provider,静默该时长才真正发 RPC;\n * 网关 TTFT 本身 3.5s+(debug 实证),client 侧去抖压到 150ms 不再叠加明显延迟。 */\nconst DEBOUNCE_MS = 150\n/** 缓存容量上限(LRU 超限即整体清空;键空间小,够用)。 */\nconst CACHE_MAX = 30\n/** 缓存 TTL(毫秒)。 */\nconst CACHE_TTL_MS = 60_000\n\nlet registered = false\nlet seq = 0\nlet inFlight = null\nlet debounceTimer = null\nconst cache = new Map()\n\n/** 上次开关状态(configUpdate 后经事件刷新,关闭时立即静默)。 */\nlet enabled = false\n\n/** 供设置面板保存后同步开关状态(不重载页面即时生效)。 */\nexport function setAiInlineEnabled(value) {\n enabled = value === true\n emitAiStatus('config', { enabled })\n if (!enabled) {\n seq += 1 // 作废在飞响应\n cache.clear()\n }\n}\n\n/** 当前开关(EditorView 装配时决定是否注册)。 */\nexport function aiInlineEnabled() {\n return enabled\n}\n\n/** 初始化开关(启动时从 configGet 拉一次)。 */\nexport async function initAiInlineState() {\n try {\n const res = await rpc('edrv.ai.configGet', {})\n setAiInlineEnabled(res?.ok && res.enabled === true)\n } catch {\n setAiInlineEnabled(false)\n }\n}\n\n/**\n * 缓存键:路径 + 行:列 + 前缀尾 24 字符(同位置不同文本区分)。\n * @author ddj\n */\nfunction cacheKey(path, line, column, prefix) {\n return path + ':' + line + ':' + column + ':' + String(prefix || '').slice(-24)\n}\n\n/**\n * 差异审查期间静默:编辑器上存在 AI 补全应避让的 pending 差异装饰时返回 true。\n * 通过编辑器实例上的 edrv 差异装饰类名判定,缺失视为无差异。\n * @author ddj\n */\nfunction diffPending(editor) {\n try {\n const model = editor?.getModel?.()\n const decos = model?.getAllDecorations?.() ?? []\n return decos.some((d) => String(d?.options?.className || '').includes('edrv-mn-'))\n } catch {\n return false\n }\n}\n\n/**\n * 注册 AI 内联补全 provider(幂等;Monaco 就绪后调用一次)。\n * @author ddj\n * @param monaco window.monaco\n */\nexport function registerAiInline(monaco) {\n if (registered || !monaco?.languages?.registerInlineCompletionsProvider) return\n registered = true\n monaco.languages.registerInlineCompletionsProvider('*', {\n async provideInlineCompletions(model, position, context, token) {\n const t0 = Date.now()\n if (!enabled || token?.isCancellationRequested) return { items: [] }\n const path = decodeURIComponent(String(model?.uri?.path || '').replace(/^\\//, ''))\n if (!path || model.uri.scheme !== 'edrv') return { items: [] }\n const editor = monacoRef?.activeEditor\n if (editor && diffPending(editor)) return { items: [] }\n const offset = model.getOffsetAt(position)\n const value = model.getValue()\n const trimmed = trimInlineWindow(value.slice(0, offset), value.slice(offset))\n if (!inlineWorth(trimmed.prefix)) return { items: [] }\n const key = cacheKey(path, position.lineNumber, position.column, trimmed.prefix)\n const hit = cache.get(key)\n if (hit && Date.now() - hit.at < CACHE_TTL_MS) {\n return hit.items.length ? { items: hit.items } : { items: [] }\n }\n return new Promise((resolve) => {\n // 去抖:登记最新意图,静默 DEBOUNCE_MS 后才发 RPC;期间新请求顶掉旧的\n seq += 1\n const mySeq = seq\n if (inFlight) { try { inFlight.abort() } catch { /* 已结束 */ } inFlight = null }\n if (debounceTimer) clearTimeout(debounceTimer)\n debounceTimer = setTimeout(async () => {\n debounceTimer = null\n if (mySeq !== seq || token?.isCancellationRequested) { resolve({ items: [] }); return }\n const controller = new AbortController()\n inFlight = controller\n emitAiStatus('busy')\n try {\n const res = await fetch(RPC_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ method: 'edrv.ai.inline', args: { path, prefix: trimmed.prefix, suffix: trimmed.suffix } }),\n signal: controller.signal,\n })\n const data = await res.json()\n if (mySeq !== seq || !data?.ok || typeof data.text !== 'string' || !data.text) {\n cache.set(key, { items: [], at: Date.now() })\n if (data?.note) emitAiStatus('error', { note: String(data.note) })\n else emitAiStatus('idle')\n resolve({ items: [] })\n return\n }\n const items = [{ insertText: data.text, range: undefined }]\n cacheSet(key, items)\n emitAiStatus('ok', { ms: Date.now() - t0 })\n resolve({ items })\n } catch (error) {\n emitAiStatus('error', { note: String(error && error.message || error).slice(0, 80) })\n resolve({ items: [] })\n } finally {\n if (inFlight === controller) inFlight = null\n }\n }, DEBOUNCE_MS)\n // 提前取消:token 取消/新请求顶替时清掉待发定时器\n const guard = setInterval(() => {\n if (mySeq !== seq || token?.isCancellationRequested) {\n clearInterval(guard)\n if (debounceTimer) { clearTimeout(debounceTimer); debounceTimer = null }\n resolve({ items: [] })\n } else if (!debounceTimer) {\n clearInterval(guard)\n }\n }, 120)\n })\n },\n freeInlineCompletions() { /* 无资源需释放 */ },\n })\n}\n\n/** 缓存写入(超限整体清空,LRU 简化)。 */\nfunction cacheSet(key, items) {\n if (cache.size >= CACHE_MAX) cache.clear()\n cache.set(key, { items, at: Date.now() })\n}\n\n/** EditorView ref 注入口(差异静默判定用当前编辑器)。 */\nlet monacoRef = null\n\n/** EditorView 装配后调用(注册 provider + 初始化开关)。 */\nexport function setupAiInline(monaco) {\n monacoRef = monaco && { activeEditor: null }\n if (!registered) registerAiInline(monaco)\n void initAiInlineState()\n}\n\n/** EditorView 每次创建/切换编辑器实例时刷新引用。 */\nexport function trackAiEditor(editor) {\n if (monacoRef) monacoRef.activeEditor = editor\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — EditorView:中央 VSCode 式文件编辑器(编排层)。\n * 迁移自原 src/client/index.ts 的 EditorView,语义不改;差异自绘已抽到 monaco/diffRender。\n * 职责:页签/QuickOpen/Monaco 编辑器/差异审查(DiffBox/Launcher/Badge 事件装配)/状态栏/自动保存。\n * 状态作用域:页签/视图状态/侧边栏/展开树等 UI 状态按工作区作用域(cwd)隔离,\n * 同一工作区切换对话恢复同一份状态;无 cwd 会话回退按会话隔离(scopeStore)。\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 { dataUrlOf, isImagePath, isSvgPath } from '../imagePreview.js'\nimport { base64ToBytes, isPdfPath } from '../pdfPreview.js'\nimport { createPdfPanel } from '../pdf/pdfPanel.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 { migrateScopedKeys, workspaceScopeOf } from '../state/scopeStore.js'\nimport { modelsForScope, rememberModel } from '../state/modelCache.js'\nimport { bindingsOf, chordOf, matchEvent, useKeybindingsVersion } from '../keybindings.js'\nimport { getSidebarMinWidth } from '../sidebarMin.js'\nimport { navHistoryFor } from '../navHistory.js'\nimport { statusOfAdd } from '../addToConversation.js'\nimport { CACHE_KEY } from '../paths.js'\nimport { bindLspEditor, runGoToDefinition, runFindReferences, hideReferencesOverlay } from '../monaco/lsp/providers.js'\nimport { bindLspUnderline } from '../monaco/lsp/underline.js'\nimport { onLspProgress, refreshStatus } from '../monaco/lsp/index.js'\nimport { setupAiInline, trackAiEditor, aiInlineEnabled } from '../ai/inlineProvider.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 // 当前会话工作区 cwd(sessions 快照反应式读取;cwd 变化时作用域跟随刷新)\n const sessionsList = props?.sessions?.list\n const cwd = React.useSyncExternalStore(\n React.useCallback((onStoreChange) => (\n typeof sessionsList?.subscribe === 'function' ? sessionsList.subscribe(onStoreChange) : () => {}\n ), [sessionsList]),\n () => sessionsList?.getSnapshot?.()?.byId?.[sessionId]?.cwd ?? null,\n () => null,\n )\n // 状态作用域(scopeStore):同工作区共享一份编辑区状态,无 cwd 回退会话隔离;\n // 迁移放渲染期(useMemo)——子面板恢复 effect 先于父 effect 执行,须先补齐工作区键\n const scope = React.useMemo(() => {\n const s = workspaceScopeOf(cwd, sessionId)\n migrateScopedKeys(s, sessionId)\n return s\n }, [cwd, sessionId])\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 [imageSrc, setImageSrc] = React.useState(null) // 图片预览 data URL(图片 tab 专用,文本 tab 恒为 null)\n const [imgSize, setImgSize] = React.useState(null) // 图片自然尺寸 { w, h }(路径栏 meta)\n const [imgBroken, setImgBroken] = React.useState(false) // 图片解码失败(onError),显示占位与重试\n const svgTextRef = React.useRef(new Set()) // 强制以文本打开的 SVG 路径集合(toggleSvgText 维护)\n const [pdfBytes, setPdfBytes] = React.useState(null) // 当前 PDF tab 的原始字节(null=加载中/非 PDF)\n const pdfB64CacheRef = React.useRef(new Map()) // path → base64(tab 切回免重读;FIFO 上限防内存膨胀)\n const pdfCtlRef = React.useRef(new Map()) // path → PDF 面板控制器(mount 产出,关闭/卸载销毁)\n const pdfHostRef = React.useRef(null) // PDF 面板外壳 div(命令式控制器接管)\n const [status, setStatus] = React.useState('')\n const [lspServers, setLspServers] = React.useState([])\n // AI 补全状态(底部状态栏段):{ state: idle|busy|ok|error, detail, enabled }\n const [aiStatus, setAiStatus] = React.useState({ state: 'idle', detail: null, enabled: false })\n const aiStatusTimer = React.useRef(null)\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(() => getSidebarMinWidth()) // 侧边栏宽度(初值 = 最小宽度,默认 300)\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(null)\n // model 跨挂载缓存(按工作区作用域):重挂载秒显内容,消除切换对话闪烁\n if (!modelsRef.current) modelsRef.current = modelsForScope(scope)\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 restoredScopeRef = React.useRef(null) // 已恢复状态的作用域(cwd 晚到 sid→ws 时允许重恢复)\n const pendingFocusRef = React.useRef(null) // { path, region } 内容加载后跳转\n // 导航历史(后退/前进):跨文件焦点位置;按会话隔离,会话切换重置\n const navRef = React.useRef(null)\n if (!navRef.current) navRef.current = navHistoryFor(scope)\n const navPendingRef = React.useRef(null) // { path,line,column,viewState } 待恢复条目(内容就绪后消费)\n const navCursorTimerRef = React.useRef(null) // 光标位置防抖记录计时器\n const navBackRef = React.useRef(null) // 后退动作最新闭包(窗口级键盘监听读取)\n const navForwardRef = React.useRef(null) // 前进动作最新闭包(窗口级键盘监听读取)\n const [navTick, setNavTick] = React.useState(0) // 历史可用性版本(按钮 disabled 重渲染)\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 onEditRef = React.useRef(null) // 编辑置脏的最新闭包(Monaco 内容变化监听经 ref 调用,防首帧 active=null 陈旧闭包)\n const saveViewStateRef = React.useRef(null) // 视图状态保存的最新闭包(卸载清理读取,避免过期 active)\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 // 当前 tab 是否处于图片预览模式(与 loadContent 的分派条件同源;SVG 文本模式时为 false)\n const isImageActive = !!active && isImagePath(active) && !svgTextRef.current.has(active)\n // 当前 tab 是否为 PDF 面板(与 loadContent 分派条件同源)\n const isPdfActive = !!active && isPdfPath(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(scope, viewStatesRef.current)\n } catch (e) { /* 视图状态保存失败忽略 */ }\n }\n saveViewStateRef.current = saveViewState\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 /**\n * 采集当前焦点条目:路径从编辑器 model 实时读取(避免空依赖闭包读到过期 active),\n * 位置/viewState 从编辑器读取;编辑器或模型未就绪 → null。\n * @author ddj 2026年09月04号\n * @returns 导航历史条目或 null\n */\n const captureNavEntry = () => {\n const ed = editorRef.current\n const model = ed?.getModel?.()\n const uriPath = model?.uri?.path\n if (!ed || !uriPath) return null\n let line = null\n let column = null\n try {\n const pos = ed.getPosition?.()\n if (pos) { line = pos.lineNumber; column = pos.column }\n } catch (e) { /* 位置读取失败降级为仅路径 */ }\n let viewState = null\n try { viewState = ed.saveViewState() } catch (e) { /* 快照失败忽略 */ }\n return { path: decodeURIComponent(String(uriPath).replace(/^\\//, '')), line, column, viewState }\n }\n\n /**\n * 记录当前位置到导航历史(同位置去重由历史模块处理;可用性变化时刷新按钮)。\n * @author ddj 2026年09月04号\n */\n const recordNav = () => {\n const entry = captureNavEntry()\n if (!entry) return\n const wasBack = navRef.current.canBack()\n const wasForward = navRef.current.canForward()\n navRef.current.record(entry)\n if (navRef.current.canBack() !== wasBack || navRef.current.canForward() !== wasForward) {\n setNavTick((v) => v + 1)\n }\n }\n\n /**\n * 跳到历史条目:保存当前视图状态后打开目标文件,内容就绪后恢复焦点。\n * @author ddj 2026年09月04号\n * @param entry 目标历史条目\n */\n const navigateTo = (entry) => {\n if (!entry || !entry.path) return\n flushSave()\n saveViewState(active)\n navPendingRef.current = entry\n addTab(entry.path, true)\n setFocusRequest((value) => value + 1) // 目标已是活动文件时也触发恢复\n }\n\n /**\n * 立即落盘待记录的光标位置(后退/前进前调用:<500ms 内刚移动的光标也算入历史)。\n * @author ddj 2026年09月04号\n */\n const flushNavCursor = () => {\n if (!navCursorTimerRef.current) return\n clearTimeout(navCursorTimerRef.current)\n navCursorTimerRef.current = null\n recordNav()\n }\n\n /**\n * 后退:恢复上一处焦点(跨文件)。\n * @author ddj 2026年09月04号\n */\n const navBack = () => {\n flushNavCursor()\n const entry = navRef.current.back()\n if (!entry) return\n navigateTo(entry)\n setNavTick((v) => v + 1)\n }\n\n /**\n * 前进:恢复下一处焦点(跨文件)。\n * @author ddj 2026年09月04号\n */\n const navForward = () => {\n flushNavCursor()\n const entry = navRef.current.forward()\n if (!entry) return\n navigateTo(entry)\n setNavTick((v) => v + 1)\n }\n navBackRef.current = navBack\n navForwardRef.current = navForward\n\n const closeTab = (path) => {\n flushSave()\n if (path === active) { saveViewState(path); recordNav() }\n // PDF tab 关闭:销毁面板控制器并清缓存(未保存注释随之丢弃,脏点已提示)\n const pdfCtl = pdfCtlRef.current.get(path)\n if (pdfCtl) { pdfCtl.destroy(); pdfCtlRef.current.delete(path) }\n pdfB64CacheRef.current.delete(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 // 图片文件走专用通道:base64 → data URL 预览,不建 Monaco model、不进文本/差异流程\n if (isImagePath(path) && !svgTextRef.current.has(path)) {\n loadImage(path, sid, seq)\n return\n }\n // PDF 文件走专用通道:base64 → PDF 面板(浏览 + 注释编辑),不建 Monaco model\n if (isPdfPath(path)) {\n loadPdf(path, sid, seq, force === true)\n return\n }\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 * 加载图片文件为 data URL(编辑区只读预览);失败走 loadError 面板(重试经 loadContent 分派回此)。\n * @author ddj 2026年09月08号\n * @param path 图片文件路径\n * @param sid 会话 id\n * @param seq 加载序号(过期响应丢弃)\n */\n const loadImage = (path, sid, seq) => {\n setImageSrc(null)\n setImgSize(null)\n setImgBroken(false)\n setLoadStage({ progress: monaco ? 72 : 12, message: '读取图片…' })\n rpc('edrv.read', { sessionId: sid, path, encoding: 'base64' }).then((res) => {\n if (seq !== loadSeqRef.current || path !== active) return\n if (res && res.ok && res.encoding === 'base64') {\n if (!res.mime) {\n setLoadError('host 版本过旧:图片响应缺少 mime')\n setError('host 版本过旧:图片响应缺少 mime')\n setStatus('读取失败')\n return\n }\n setImageSrc(dataUrlOf(res.content, res.mime))\n setLoadStage({ progress: 100, message: '图片已就绪' })\n setStatus('已加载')\n return\n }\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 }).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 * 加载 PDF 文件为原始字节(编辑区 PDF 面板);命中 base64 缓存秒切,force 绕过缓存重读。\n * 面板控制器由 pdf host mount effect 产出(per-path,关闭/卸载销毁)。\n * @author ddj 2026年09月22号\n * @param path PDF 文件路径\n * @param sid 会话 id\n * @param seq 加载序号(过期响应丢弃)\n * @param force true=绕过缓存强制 RPC 重读(刷新按钮)\n */\n const loadPdf = (path, sid, seq, force) => {\n setPdfBytes(null)\n setLoadStage({ progress: monaco ? 72 : 12, message: '读取 PDF…' })\n const cache = pdfB64CacheRef.current\n const hit = !force ? cache.get(path) : undefined\n if (typeof hit === 'string' && hit) {\n // 刷新插入序(Map 按插入序 FIFO 驱逐)后秒切\n cache.delete(path)\n cache.set(path, hit)\n setPdfBytes(base64ToBytes(hit))\n setLoadStage({ progress: 100, message: 'PDF 已就绪' })\n setStatus('已加载')\n return\n }\n rpc('edrv.read', { sessionId: sid, path, encoding: 'base64' }).then((res) => {\n if (seq !== loadSeqRef.current || path !== active) return\n if (res && res.ok && res.encoding === 'base64') {\n cache.set(path, res.content)\n while (cache.size > 6) cache.delete(cache.keys().next().value)\n setPdfBytes(base64ToBytes(res.content))\n setLoadStage({ progress: 100, message: 'PDF 已就绪' })\n setStatus('已加载')\n return\n }\n const base = res?.error ? String(res.error) : '读取失败'\n const message = res?.resolvedPath ? base + ':' + String(res.resolvedPath) : base\n setLoadError(message)\n setError(message)\n setStatus('读取失败')\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 // AI 补全状态事件:busy/ok/error/idle 即时上栏;ok 3s、error 10s 后回落就绪\n React.useEffect(() => {\n const apply = (state, detail) => {\n if (aiStatusTimer.current) { clearTimeout(aiStatusTimer.current); aiStatusTimer.current = null }\n setAiStatus((prev) => ({ state, detail: detail ?? null, enabled: state === 'config' ? detail?.enabled === true : prev.enabled }))\n if (state === 'ok') aiStatusTimer.current = setTimeout(() => setAiStatus((p) => (p.state === 'ok' ? { ...p, state: 'idle' } : p)), 3000)\n else if (state === 'error') aiStatusTimer.current = setTimeout(() => setAiStatus((p) => (p.state === 'error' ? { ...p, state: 'idle' } : p)), 10000)\n }\n const onAiStatus = (e) => { if (e?.detail?.state) apply(e.detail.state, e.detail.detail) }\n const onAiConfig = (e) => apply('config', { enabled: e?.detail?.enabled === true })\n window.addEventListener('edrv:ai-status', onAiStatus)\n window.addEventListener('edrv:ai-config', onAiConfig)\n apply('config', { enabled: aiInlineEnabled() })\n return () => {\n window.removeEventListener('edrv:ai-status', onAiStatus)\n window.removeEventListener('edrv:ai-config', onAiConfig)\n if (aiStatusTimer.current) clearTimeout(aiStatusTimer.current)\n }\n }, [])\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 recordNav()\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 recordNav()\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 恢复页签(按工作区作用域;cwd 晚到 sid→ws 切换时重恢复一次)\n React.useEffect(() => {\n if (!sessionId || restoredScopeRef.current === scope) return\n restoredScopeRef.current = scope\n // model 缓存跟随作用域(切工作区释放旧作用域模型;同工作区跨挂载复用)\n modelsRef.current = modelsForScope(scope)\n viewStatesRef.current = viewStatesLoad(scope)\n try {\n const raw = localStorage.getItem(CACHE_KEY.editor + String(scope))\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, scope])\n\n // 导航历史按工作区作用域隔离:同工作区切换对话保留历史,跨工作区换实例\n React.useEffect(() => {\n navRef.current = navHistoryFor(scope)\n navPendingRef.current = null\n if (navCursorTimerRef.current) { clearTimeout(navCursorTimerRef.current); navCursorTimerRef.current = null }\n setNavTick((v) => v + 1)\n }, [scope])\n\n React.useEffect(() => {\n if (!sessionId) return\n try { localStorage.setItem(CACHE_KEY.editor + String(scope), JSON.stringify({ tabs: tabs.map((t) => t.path), active })) }\n catch (e) { /* 忽略 */ }\n }, [tabs, active, sessionId, scope])\n\n // 侧边栏状态:恢复(显隐/宽度/激活面板);侧栏形态独立键(默认收起,不共享页签形态偏好)\n // 宽度下限来自通用设置 sidebarMinWidth(默认 300),恢复值按其重夹\n const sidebarKey = CACHE_KEY.sidebar + (layout === 'side' ? 'side.' : '') + String(scope)\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(getSidebarMinWidth(), Math.min(560, saved.width)))\n if (typeof saved.panel === 'string') setActivePanel(saved.panel)\n }\n } catch (e) { /* 损坏忽略 */ }\n }, [sessionId, sidebarKey])\n\n // 侧边栏最小宽度设置变更(edrv:sidebar-min-width)→ 更新 minW 并重夹当前宽度\n const [sidebarMinW, setSidebarMinW] = React.useState(() => getSidebarMinWidth())\n React.useEffect(() => {\n const onMinChange = () => {\n setSidebarMinW(getSidebarMinWidth())\n setSidebarW((w) => Math.max(getSidebarMinWidth(), w))\n }\n window.addEventListener('edrv:sidebar-min-width', onMinChange)\n return () => window.removeEventListener('edrv:sidebar-min-width', onMinChange)\n }, [])\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 // 切换侧边栏(capture 抢占,避免与 DSH 全局冲突;键位随快捷键配置)\n React.useEffect(() => {\n const onKey = (e) => {\n if (!matchEvent(e, bindingsOf('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, bindingsOf('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, bindingsOf('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 // 后退/前进:导航历史(跨文件焦点位置;经 ref 读最新闭包,避免空依赖过期)\n React.useEffect(() => {\n const onKey = (e) => {\n if (!matchEvent(e, bindingsOf('edrv.navigateBack'))) return\n e.preventDefault(); e.stopPropagation()\n if (navBackRef.current) navBackRef.current()\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n React.useEffect(() => {\n const onKey = (e) => {\n if (!matchEvent(e, bindingsOf('edrv.navigateForward'))) return\n e.preventDefault(); e.stopPropagation()\n if (navForwardRef.current) navForwardRef.current()\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n // 鼠标侧键后退/前进:Logitech 官方默认「后退/前进」= XButton 鼠标事件(button 3/4),不产生键盘事件。\n // pointerdown 触发导航(preventDefault 后兼容 mousedown 可能不再触发,避免双触发);\n // mousedown 兜底仅取消浏览器历史导航默认动作(MDN:preventDefault mousedown/pointerdown 可抑制)。\n // @author ddj 2026年09月02号\n React.useEffect(() => {\n const onPointer = (e) => {\n if (e?.button !== 3 && e?.button !== 4) return\n e.preventDefault(); e.stopPropagation()\n const ref = e.button === 3 ? navBackRef : navForwardRef\n if (ref.current) ref.current()\n }\n const onMouse = (e) => {\n if (e?.button !== 3 && e?.button !== 4) return\n e.preventDefault(); e.stopPropagation()\n }\n window.addEventListener('pointerdown', onPointer, true)\n window.addEventListener('mousedown', onMouse, true)\n return () => {\n window.removeEventListener('pointerdown', onPointer, true)\n window.removeEventListener('mousedown', onMouse, true)\n }\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 setImageSrc(null)\n setImgSize(null)\n setImgBroken(false)\n setPdfBytes(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) => {\n if (!alive) return\n setMonaco(m)\n // AI 内联补全 provider 注册 + 开关初始化(幂等)\n setupAiInline(m)\n }).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 // 注册表守卫:同 URI 已存在的 model 直接复用(HMR 换 bundle 后防重复创建抛错)\n const uri = window.monaco.Uri.parse('edrv:///' + encodeURI(path))\n model = window.monaco.editor.getModel(uri) || window.monaco.editor.createModel(text ?? '', langOf(path), uri)\n rememberModel(cache, 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 if (!active) return\n // PDF tab:保存委托给面板控制器(saveDocument → base64 → edrv.saveBinary)\n if (isPdfPath(active)) {\n const ctl = pdfCtlRef.current.get(active)\n if (!ctl) { if (!silent) setStatus('PDF 未就绪'); return }\n if (!ctl.isDirty()) { if (!silent) setStatus('PDF 无未保存修改'); return }\n void ctl.savePdf()\n return\n }\n const ed = editorRef.current\n if (!ed) return\n if (isImageActive) { setStatus('图片只读预览'); 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 // @author ddj 2026年09月09号 空依赖监听只持有首帧 onEdit(active 恒 null→提前返回,星号与自动保存从未生效):每次渲染同步最新闭包\n onEditRef.current = onEdit\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 // PDF 面板外壳 ref 回调(div 仅在 PDF 分支渲染,refs 先于 effect 就绪)\n const ensurePdfHost = (node) => { pdfHostRef.current = node }\n\n // PDF 面板装配:控制器挂进外壳 div,切换 tab/卸载即销毁(重开重挂,base64 缓存兜底秒切)\n React.useEffect(() => {\n const host = pdfHostRef.current\n if (!isPdfActive || !pdfBytes || !host) return\n const path = active\n const ctl = createPdfPanel({\n sessionId,\n path,\n setStatus,\n setError,\n onDirtyChange: (d) => setDirtyMap((prev) => Object.assign({}, prev, { [path]: d })),\n onReload: () => loadContent(path, sessionId, true),\n })\n pdfCtlRef.current.set(path, ctl)\n void ctl.mount(host, pdfBytes)\n return () => {\n ctl.destroy()\n if (pdfCtlRef.current.get(path) === ctl) pdfCtlRef.current.delete(path)\n }\n }, [isPdfActive, pdfBytes, active])\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 // 卸载即切作用域/重挂载:先把待记录光标落进历史,再存当前文件视图状态\n //(经 ref 取最新闭包,修正旧实现捕获挂载时 active 的问题)\n flushNavCursor()\n saveViewStateRef.current?.()\n diffRendererRef.current?.dispose?.()\n hideReferencesOverlay()\n if (editorRef.current) { editorRef.current.dispose(); editorRef.current = null }\n // model 不在此销毁:跨挂载缓存按作用域存活(modelCache 切作用域时统一释放)\n for (const ctl of pdfCtlRef.current.values()) ctl.destroy()\n pdfCtlRef.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 // AI 内联补全(ghost text):开关经 edrv.ai.configGet 拉取;provider 见 client/ai/inlineProvider\n inlineSuggest: { enabled: true },\n })\n // 保存改由窗口级快捷键监听执行(键位可配置;见上方 edrv.save 监听)\n ed.onDidChangeModelContent(() => {\n if (!ed.getModel() || programmaticRef.current) return\n onEditRef.current?.()\n })\n ed.onDidChangeCursorPosition((e) => {\n setCursor('Ln ' + e.position.lineNumber + ', Col ' + e.position.column)\n // 导航历史:同文件内光标移动防抖记录(程序化恢复触发的位置与栈顶去重,无副作用)\n if (navCursorTimerRef.current) clearTimeout(navCursorTimerRef.current)\n navCursorTimerRef.current = setTimeout(() => {\n navCursorTimerRef.current = null\n recordNav()\n }, 500)\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 bindLspUnderline(ed, m)\n // AI 补全:编辑器实例登记(差异静默判定用)+ Alt+\\ 手动触发 ghost text\n trackAiEditor(ed)\n ed.addCommand(m.KeyMod.Alt | m.KeyCode.Backslash, () => {\n ed.trigger('edrv-ai', 'editor.action.inlineSuggest.trigger', null)\n })\n // hover 差异块 → 浮出 Keep/Undo(req:鼠标移到编辑区差异块时显示)\n // 防闪烁:① 区域不变不 setState(浮窗锚定差异块起始行,不跟随鼠标);② 延迟隐藏;\n // ③ 浮窗自身 onMouseEnter 取消隐藏计时(鼠标在浮窗与编辑器间移动不闪)。\n const hideSoon = () => {\n if (hoverEditorRef.current || hoverPanelRef.current || hideTimerRef.current) return\n hideTimerRef.current = setTimeout(() => {\n hideTimerRef.current = null\n if (hoverEditorRef.current || hoverPanelRef.current) return\n hoverKeyRef.current = null\n hoverTopRef.current = null\n setHoverAct(null)\n }, 180)\n }\n ed.onMouseMove((e) => {\n hoverEditorRef.current = true\n const line = e?.target?.position?.lineNumber\n const map = lineRegionMapRef.current\n if (!line || !map.size) { hoverEditorRef.current = false; hideSoon(); return }\n const hit = map.get(line)\n if (!hit) { hoverEditorRef.current = false; hideSoon(); return }\n const key = callIdAttr(hit.callId, hit.idx)\n const top = Math.max(0, ed.getTopForLineNumber(Math.max(1, hit.start)) - ed.getScrollTop())\n const layout = ed.getLayoutInfo()\n const minimapLeft = layout.minimap?.minimapLeft || 0\n const right = minimapLeft > 0 ? Math.max(12, layout.width - minimapLeft + 8) : Math.max(12, layout.verticalScrollbarWidth + 8)\n if (hoverKeyRef.current === key && hoverTopRef.current === top && hoverRightRef.current === right) return // 同区域同位置不重复更新\n hoverKeyRef.current = key\n hoverTopRef.current = top\n hoverRightRef.current = right\n if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }\n setHoverAct({ region: hit, top, right })\n })\n editorRef.current = ed\n }, [])\n\n // 打开文件后的跳转(导航历史恢复/差异聚焦/搜索行列跳转,内容就绪后执行一次)\n React.useEffect(() => {\n const ed = editorRef.current\n if (!ed || content === null) return\n // 导航历史恢复优先:viewState 快照恢复滚动/折叠,行列补定位\n const nav = navPendingRef.current\n if (nav && nav.path === active) {\n navPendingRef.current = null\n if (nav.viewState) {\n try { ed.restoreViewState(nav.viewState) } catch (e) { /* 非法快照忽略(行号越界自动兜底) */ }\n }\n if (nav.line != null) {\n ed.revealLineInCenter(Math.max(1, nav.line))\n ed.setPosition({ lineNumber: Math.max(1, nav.line), column: Math.max(1, nav.column ?? 1) })\n }\n ed.focus()\n return\n }\n const pf = pendingFocusRef.current\n if (!pf || pf.path !== active) 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 * SVG 在图片预览与文本编辑间切换(按路径记忆;重载分派随集合状态自动路由)。\n * @author ddj 2026年09月08号\n * @param path SVG 文件路径\n */\n const toggleSvgText = (path) => {\n const next = new Set(svgTextRef.current)\n if (next.has(path)) next.delete(path)\n else next.add(path)\n svgTextRef.current = next\n setContent(null)\n setContentPath(null)\n setImageSrc(null)\n setImgSize(null)\n setImgBroken(false)\n setLoadError(null)\n setStatus(next.has(path) ? '已切换为文本模式' : '已切换为图片预览')\n loadContent(path, sessionId, true)\n }\n\n /**\n * 图片预览面板:工具条(尺寸 meta / SVG 文本切换 / 刷新)+ 棋盘底自适应图片。\n * @author ddj 2026年09月08号\n */\n const imagePanel = () => React.createElement('div', { className: 'edrv-imgview' },\n React.createElement('div', { className: 'edrv-imgview-bar' },\n React.createElement('span', { className: 'edrv-imgview-meta' },\n imgBroken ? '图片无法显示' : (imgSize ? imgSize.w + '×' + imgSize.h : '…')),\n React.createElement('span', { style: { flex: 1 } }),\n (isSvgPath(active) ? React.createElement('button', {\n className: 'edrv-pill edrv-pill-ghost', title: '以文本方式查看/编辑(SVG 为文本格式)',\n onClick: () => toggleSvgText(active),\n }, '以文本打开') : null),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '重新加载图片', onClick: () => reloadFile() }, '⟳ 刷新')),\n React.createElement('div', { className: 'edrv-imgview-stage' },\n (imgBroken\n ? React.createElement('div', { className: 'edrv-imgview-broken' },\n React.createElement('div', null, '图片解码失败,文件可能已损坏'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', onClick: () => reloadFile() }, '重试'))\n : React.createElement('img', {\n className: 'edrv-imgview-img',\n src: imageSrc,\n alt: active || '',\n onLoad: (e) => { setImgBroken(false); setImgSize({ w: e.target.naturalWidth, h: e.target.naturalHeight }) },\n onError: () => setImgBroken(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 /** 添加文件/选中区引用到对话(异步,状态栏反馈;状态文案走共享 statusOfAdd)。 */\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 recordNav()\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 recordNav()\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 // 图片/PDF 文件跳过文本读探测(二进制会被 host 拒绝),直接进 tab 由专用预览接管\n if (isImagePath(p) || isPdfPath(p)) {\n openFile(p, false)\n setOpenInput(false); setPathDraft(''); setStatus('已打开'); setError(null)\n return\n }\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); recordNav(); 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 // 未保存修改页签显示 * 星号(保存成功消失、失败持续);替换原圆点脏标记\n // @author ddj 2026年09月09号\n (dirtyMap[t.path] ? React.createElement('span', { className: 'edrv-tab-star', title: '未保存修改' }, '*') : 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 && !isImageActive && langOf(active) ? React.createElement('span', { className: 'edrv-pb-meta' }, langOf(active)) : null),\n (isImageActive && imgSize ? React.createElement('span', { className: 'edrv-pb-meta' }, imgSize.w + '×' + imgSize.h) : 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 // 状态段行内样式:单行状态栏内的一段;LSP 段弹性占满空闲宽度,把后续段推到行尾\n const lspSegStyle = { display: 'inline-flex', alignItems: 'center', gap: '10px', minWidth: 0, flex: '1 1 auto' }\n const lspSeg = (lspLanguage === 'lua' || lspLanguage === 'csharp')\n ? React.createElement('span', { className: 'edrv-status-seg', style: lspSegStyle, 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 // AI 补全状态段(全语言可用,不随 LSP 语言过滤):就绪/请求中/完成·耗时/失败原因\n const aiEnabled = aiStatus.enabled\n const aiState = aiStatus.state\n const aiDotCls = aiState === 'busy' ? 'busy' : aiState === 'ok' ? 'ready' : aiState === 'error' ? 'idle' : 'ready'\n const aiMsText = aiStatus.detail && aiStatus.detail.ms != null ? (aiStatus.detail.ms / 1000).toFixed(1) + 's' : ''\n const aiNote = aiStatus.detail && aiStatus.detail.note ? String(aiStatus.detail.note) : ''\n const aiLabel = !aiEnabled ? 'AI 补全 · 关'\n : aiState === 'busy' ? 'AI 补全请求中…'\n : aiState === 'ok' ? 'AI 补全完成' + (aiMsText ? ' · ' + aiMsText : '')\n : aiState === 'error' ? 'AI 补全失败 · ' + aiNote.slice(0, 48)\n : 'AI 补全就绪'\n const aiSegStyle = { display: 'inline-flex', alignItems: 'center', gap: '10px', minWidth: 0, flex: '0 0 auto' }\n const aiSeg = (active && aiEnabled !== null)\n ? React.createElement('span', { className: 'edrv-status-seg', style: aiSegStyle, title: aiState === 'error' && aiNote ? aiNote : 'AI 自动补全(设置页「AI 补全」可配置)' },\n React.createElement('span', { className: 'edrv-lsp-status-dot ' + (!aiEnabled ? 'idle' : aiDotCls) }),\n React.createElement('span', { className: 'edrv-sp-lsp' }, aiLabel))\n : null\n\n // 底部状态栏:单行多段——LSP 段居左(弹性吸收空闲宽度),AI 段固定右对齐\n const statusBar = (lspSeg || aiSeg)\n ? React.createElement('div', { className: 'edrv-statusbar' }, lspSeg, aiSeg)\n : null\n\n // 导航历史按钮:目标条目名(tooltip 提示下一步会回到哪个文件)\n const navBackTarget = navRef.current.peekBack()\n const navForwardTarget = navRef.current.peekForward()\n const navNameOf = (entry) => (entry && entry.path ? String(entry.path).split(/[\\\\/]/).pop() : '')\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', {\n className: 'edrv-chip-btn',\n title: '后退(' + (chordOf('edrv.navigateBack') ?? '未绑定') + ')' + (navBackTarget ? ' · ' + navNameOf(navBackTarget) : ''),\n disabled: !navRef.current.canBack(),\n 'aria-label': '后退',\n onClick: navBack,\n }, '←'),\n React.createElement('button', {\n className: 'edrv-chip-btn',\n title: '前进(' + (chordOf('edrv.navigateForward') ?? '未绑定') + ')' + (navForwardTarget ? ' · ' + navNameOf(navForwardTarget) : ''),\n disabled: !navRef.current.canForward(),\n 'aria-label': '前进',\n onClick: navForward,\n }, '→'),\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 (isImageActive && imageSrc) {\n body = imagePanel()\n } else if (isImageActive) {\n body = loadingBody(loadStage.message || '读取图片…', loadStage.progress)\n } else if (isPdfActive && pdfBytes) {\n body = React.createElement('div', { className: 'edrv-pdf-host', ref: ensurePdfHost, key: active })\n } else if (isPdfActive) {\n body = loadingBody(loadStage.message || '读取 PDF…', loadStage.progress)\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 // 当前会话工作区(反应式 cwd;规则面板项目 Tab 自动匹配)\n cwd: cwd ?? null,\n // 状态作用域键(工作区优先,无 cwd 回退会话;面板持久化统一走它)\n scope,\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 addToConversation,\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 0.1.5+ 自带官方右侧侧边栏(升级即用);旧版可安装 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 statusBar)\n // 编辑器根节点按 composer 顶部边界动态限高,底部对话区域继续由 DSH 原生渲染。\n // 侧栏形态由面板容器给高(100%),不做 composer 几何同步。\n const editorRow = React.createElement('div', { className: 'edrv-editor-row' },\n (sidebarPanels\n ? React.createElement(SidebarView, {\n registry: sidebarPanels,\n ctx: sidebarCtx,\n activePanel,\n onActive: setActivePanel,\n visible: sidebarOn,\n onShow: () => setSidebarOn(true),\n width: sidebarW,\n onWidth: setSidebarW,\n onHide: () => setSidebarOn(false),\n minWidth: sidebarMinW,\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 */\nimport { log } from './log.js'\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>; sidebarMinWidth?: unknown }; writable?: boolean }\n subscribe: (listener: () => void) => () => void\n set: (field: string, value: unknown) => Promise<void>\n}\n\n/**\n * 设置桥三级优先:webUiSettings(linxin666 兼容桥)→ settingsScope(官方)→ 无。\n * 桥绑定抛错时降级到下一级,不让单个桥异常拖垮设置装配。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 激活的桥名称与绑定 scope\n */\nexport function pickSettingsBinder(ctx: { get: (name: string) => unknown }): { service: string; scope: SettingsScopeLike | undefined } {\n for (const service of ['webUiSettings', 'settingsScope']) {\n try {\n const binder = ctx.get(service) as { bind?: (spec: { namespace: string }) => SettingsScopeLike } | undefined\n const scope = binder?.bind?.({ namespace: PLUGIN_NAME })\n if (scope) return { service, scope }\n } catch {\n /* 桥异常时降级到下一级 */\n }\n }\n return { service: 'none', scope: undefined }\n}\n\n/** slot 注册描述(对齐 ctx.slots.register 的形状)。 */\nexport interface SlotSpec {\n name: string\n id: string\n order?: number\n label?: string\n inject?: (sessionId: string) => object\n}\n\n/**\n * 跨版本 slot 安全注册:封装 ctx.slots.inject 等待声明模式(新老 DSH 通用),\n * 服务缺失或注册抛错时降级为警告,不让单条 slot 拖垮装配。\n * 注意:方法必须挂在服务对象上调用(slots.register 是依赖 this.records 的类方法,\n * 解构后 this 丢失会静默失败),故禁止解构。\n * @author ddj 2026年08月24号\n * @param ctx 客户端上下文(slots 服务)\n * @param spec slot 描述\n * @param render 渲染函数\n * @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 log.warn('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 log.warn('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/** patchAccessor 的包装实现形状(original 为补丁前的实时实现)。 */\nexport type PatchWrapper = (original: (...args: never[]) => unknown, ...args: never[]) => unknown\n\n/**\n * accessor 感知的链式补丁:DSH 0.1.3+ 的 remote 命名空间方法(如\n * remote.session.openWorkspacePath)是 getter-only accessor(Object.defineProperty\n * 仅定义 get,直接赋值在严格模式下抛 TypeError),须整体替换属性描述符。\n * 新 getter 每次访问现场调用原 getter 取最新一次性函数作 original,天然跟随\n * DSH 内部 methods 表变化;data 属性降级走 patchMethod;属性缺失返回 null。\n * @author ddj 2026年09月08号\n * @param owner 目标对象\n * @param key 属性名\n * @param wrapper 包装实现(original 为补丁前的实时实现)\n * @returns 恢复函数(幂等、带归属校验);属性缺失时返回 null\n */\nexport function patchAccessor(owner: object, key: string, wrapper: PatchWrapper): (() => void) | null {\n const descriptor = Object.getOwnPropertyDescriptor(owner, key)\n if (!descriptor) return null\n if (typeof descriptor.get !== 'function') return patchMethod(owner, key as never, wrapper as never)\n const rawGet = descriptor.get as (this: object) => unknown\n const patchedGet = function (): unknown {\n const original = (...args: never[]) => (rawGet.call(owner) as (...args: never[]) => unknown)(...args)\n return (...args: never[]) => wrapper(original, ...args)\n }\n Object.defineProperty(owner, key, { configurable: true, enumerable: descriptor.enumerable, get: patchedGet })\n return () => {\n const current = Object.getOwnPropertyDescriptor(owner, key)\n if (current?.get === patchedGet) Object.defineProperty(owner, key, descriptor)\n }\n}\n","/**\n * dsh-vscode-mode client — 官方右侧 Sidebar 桥:探测 DSH 0.1.5-alpha.1+ 的\n * ctx.sidebarRightTabs / ctx.sidebarRight 服务,两段式注册「文件编辑」Tab\n * (类型定义进注册表,正文进 keyed slot sidebar.right.pane.tab)。\n * 可选依赖模式:服务缺失时调用方回退 better-sidebar / 中央页签;本模块不注册任何东西。\n * 维护约定:官方侧边栏(DSH 0.1.5+)是侧边栏编辑形态的唯一维护面;\n * dsh-better-sidebar 桥(sidebarBridge.ts)已归档,仅作旧版 DSH 回退,不再新增能力。\n * 纯逻辑(探测/导航参数解析)可单测,注册装配仅存在于 install 路径。\n * 作者 ddj 2026年09月09号\n */\n\nimport { log } from './log.js'\nimport { setEnsureSideEditor } from './sidebarBridge.js'\n\n/** 官方 Tab 类型注册表服务名(ctx.get 用;不进 inject——旧版 DSH 无此包,inject 会停等)。 */\nexport const OFFICIAL_TABS_SERVICE = 'sidebarRightTabs'\n/** 官方导航控制器服务名(ctx.get 用)。 */\nexport const OFFICIAL_SERVICE = 'sidebarRight'\n/** 官方 keyed slot 名(Tab 正文挂点,由官方侧边栏的 rightbar seat 声明)。 */\nexport const OFFICIAL_SLOT_NAME = 'sidebar.right.pane.tab'\n/** 本插件 Tab 类型定义 id(官方约定用包名;正文 slot 的 key 与之相同)。 */\nexport const OFFICIAL_TAB_ID = 'dsh-vscode-mode'\n/** 本插件 Tab 的类型判别符(ctx.sidebarRight.openTab 的 kind)。 */\nexport const OFFICIAL_TAB_KIND = 'edrvEditor'\n/** Tab 标题(与 better-sidebar 形态一致)。 */\nexport const OFFICIAL_TAB_TITLE = '文件编辑'\n/** 官方 file 资源地址前缀(0.1.5+ 聊天文件链接/文件树打开的统一地址语法)。 */\nexport const OFFICIAL_FILE_PREFIX = 'dsh-resource://file/'\n/** file 地址认领的 patterns(extension 档接管官方 textpreview 的 fallback 认领,注销自动回落)。 */\nexport const OFFICIAL_FILE_PATTERN = 'dsh-resource://file/**'\n/** file 资源类型的定义 id(正文 slot 的 key)。 */\nexport const OFFICIAL_FILE_TAB_ID = 'dsh-vscode-mode/file'\n/** file 资源类型的 kind(与页类型 edrvEditor 区分:同 kind 只允许一份 extension)。 */\nexport const OFFICIAL_FILE_KIND = 'edrvEditorFile'\n\n/** 官方 Tab 打开参数(官方运行时不校验的 JSON,正文经 navigation.params 读回)。 */\nexport interface OfficialTabParams {\n openPath?: string\n focusDiff?: boolean\n}\n\n/** sidebarRightTabs 服务的最小结构面(结构性探测,不 import 官方类型)。 */\nexport interface SidebarRightTabsLike {\n register: (definition: unknown) => () => void\n}\n\n/** sidebarRight 服务的最小结构面(openTab 页路由 + openResource 资源路由 + 可选查询/定向打开)。 */\nexport interface SidebarRightServiceLike {\n openTab: (kind: string, options?: { params?: unknown }) => void\n openResource?: (address: string, options?: { params?: unknown }) => void\n /** 挂载会话的激活 Tab(判读编辑 Tab 是否已激活;无 seat 时 undefined)。 */\n active?: () => { kind?: string } | undefined\n /** 向指定会话的停靠面打开页类型(store 未 adopt 时 no-op)。 */\n openTabIn?: (sessionId: string, kind: string, options?: { params?: unknown }) => void\n}\n\n/** slots 服务的最小结构面(等待声明 + 注册)。 */\nexport interface SlotsLike {\n inject: (name: string, register: () => unknown) => unknown\n register: (spec: object, render: unknown) => unknown\n}\n\n/** 探测命中的一对官方服务。 */\nexport interface OfficialSidebar {\n tabs: SidebarRightTabsLike\n service: SidebarRightServiceLike\n}\n\n/**\n * 结构化探测官方右侧 Sidebar 服务(可选依赖:缺失/降级返回 undefined)。\n * 服务仅存在于 DSH 0.1.5-alpha.1+,探测命中 ≡ 版本判定成立。\n * @author ddj 2026年09月09号\n * @param ctx 客户端服务上下文\n * @returns 注册表与控制器对,或 undefined\n */\nexport function detectOfficial(ctx: { get: (name: string) => unknown }): OfficialSidebar | undefined {\n try {\n const tabs = ctx.get(OFFICIAL_TABS_SERVICE) as SidebarRightTabsLike | undefined\n const service = ctx.get(OFFICIAL_SERVICE) as SidebarRightServiceLike | undefined\n if (!tabs || typeof tabs.register !== 'function') return undefined\n if (!service || typeof service.openTab !== 'function') return undefined\n return { tabs, service }\n } catch {\n return undefined\n }\n}\n\n/**\n * 从官方导航参数安全解析打开请求(缺字段/坏类型一律降级为空请求,不抛错)。\n * @author ddj 2026年09月09号\n * @param params openTab 传入的 params(正文经 navigation.params 读回)\n * @returns 待打开路径与是否聚焦首个差异\n */\nexport function resolveNavOpen(params: unknown): { path: string | null; focusDiff: boolean } {\n const value = (params ?? {}) as OfficialTabParams\n const path = typeof value?.openPath === 'string' && value.openPath ? value.openPath : null\n return { path, focusDiff: value?.focusDiff === true }\n}\n\n/** 逐段 component 解码(失败返回 null,对齐官方 parseFileAddress 的容错语义)。 */\nfunction decodeSegment(raw: string | undefined): string | null {\n if (raw === undefined) return null\n try {\n return decodeURIComponent(raw)\n } catch {\n return null\n }\n}\n\n/**\n * 解析官方 file 资源地址(镜像 dsh-util-workspace-path 的 parseFileAddress 语法,不 import 官方包)。\n * session 域:`dsh-resource://file/session/<sessionId>/<逐段编码的相对路径>`;\n * absolute 域:`dsh-resource://file/absolute/<去前导 / 的绝对路径>`(POSIX 补回前导 /,\n * Windows 盘符 `C:/` 原样,UNC 保留空首段 `//server/share`)。\n * @author ddj 2026年09月09号\n * @param address 候选地址\n * @returns 文件路径(session 域附带 sessionId);非 file 地址/畸形/解码失败返回 null\n */\nexport function parseOfficialFileAddress(address: unknown): { path: string; sessionId?: string } | null {\n if (typeof address !== 'string' || !address.startsWith(OFFICIAL_FILE_PREFIX)) return null\n const [scope, ...tail] = address.slice(OFFICIAL_FILE_PREFIX.length).split('/')\n const kind = decodeSegment(scope)\n if (kind === 'session') {\n const sessionId = decodeSegment(tail[0])\n const segments = tail.slice(1).map(decodeSegment)\n if (!sessionId || segments.length === 0 || segments.some((s) => s === null)) return null\n const path = (segments as string[]).join('/')\n return path ? { path, sessionId } : null\n }\n if (kind === 'absolute') {\n const unc = tail[0] === '' && tail.length > 1\n const segments = (unc ? tail.slice(1) : tail).map(decodeSegment)\n if (segments.length === 0 || (segments as string[])[0] === '' || segments.some((s) => s === null)) return null\n const list = segments as string[]\n if (unc) return { path: '//' + list.join('/') }\n if (/^[A-Za-z]:$/.test(list[0])) return { path: list.join('/') }\n return { path: '/' + list.join('/') }\n }\n return null\n}\n\n/**\n * file 地址的 Tab chip 标题:解码后的 basename(解码失败回退原始串切片)。\n * @author ddj 2026年09月09号\n * @param address file 资源地址\n * @returns 标题文本\n */\nexport function officialFileTitle(address: unknown): string {\n const parsed = parseOfficialFileAddress(address)\n const source = parsed?.path ?? (typeof address === 'string' ? address : '')\n const normalized = source.replace(/\\\\/g, '/')\n return normalized.slice(normalized.lastIndexOf('/') + 1) || source\n}\n\n/** component 编码一段(对齐官方 encodeSegment:盘符冒号保持字面)。 */\nfunction encodeSegment(segment: string): string {\n return encodeURIComponent(segment).replace(/%3A/gi, ':')\n}\n\n/**\n * 构造官方 file 资源地址(镜像 fileAddressFor 的分派:绝对路径→absolute 域,相对→session 域)。\n * @author ddj 2026年09月09号\n * @param path 绝对或工作区相对路径(两种分隔符均可)\n * @param sessionId 会话 id(相对路径必需;绝对路径可省)\n * @returns `dsh-resource://file/…` 地址\n * @throws 路径为空,或相对路径缺 sessionId\n */\nexport function buildFileAddress(path: string, sessionId?: string): string {\n const posix = (typeof path === 'string' ? path : '').replace(/\\\\/g, '/')\n if (!posix.trim()) throw new Error('buildFileAddress:路径为空')\n const isAbsolute = posix.startsWith('/') || posix.startsWith('//') || /^[A-Za-z]:[/\\\\]/.test(posix)\n if (isAbsolute) {\n const unc = posix.startsWith('//')\n const body = posix.replace(/^\\/+/, '')\n return OFFICIAL_FILE_PREFIX + 'absolute/' + (unc ? '/' : '') + body.split('/').map(encodeSegment).join('/')\n }\n if (!sessionId) throw new Error('buildFileAddress:相对路径需要会话 id')\n const relative = posix.replace(/^(?:\\.\\/)+/, '').replace(/^\\/+/, '')\n return OFFICIAL_FILE_PREFIX + 'session/' + encodeSegment(sessionId) + '/' + relative.split('/').map(encodeSegment).join('/')\n}\n\n/**\n * 注册官方 Tab 正文(keyed slot,key=定义 id;slots.inject 等待 rightbar seat 声明)。\n * @author ddj 2026年09月09号\n * @param slots slots 服务\n * @param key 正文注册键(= 类型定义 id)\n * @param renderTab 正文组件(包装后的 OfficialSideTab)\n * @returns 注销函数;注册抛错返回 null\n */\nfunction registerBodySlot(slots: SlotsLike, key: string, renderTab: unknown): (() => void) | null {\n try {\n const disposer = slots.inject(OFFICIAL_SLOT_NAME, () => slots.register(\n { name: OFFICIAL_SLOT_NAME, key },\n renderTab,\n ))\n return typeof disposer === 'function' ? (disposer as () => void) : null\n } catch (error) {\n log.warn('官方侧边栏正文 slot 注册失败(' + String(error) + ')')\n return null\n }\n}\n\n/**\n * 注册官方右侧 Sidebar「文件编辑」Tab 并接管打开路由(两段式 + 路由)。\n * 调用方须把返回值挂进 ctx.effect;类型注册抛错时返回 null,由调用方回退旧形态。\n * @author ddj 2026年09月09号\n * @param options 装配参数(探测命中的一对服务 + slots + 正文组件 + guide 文案)\n * @returns 卸载器(反注册类型与正文 + 撤销路由);类型注册失败返回 null\n */\nexport function installOfficial(options: {\n tabs: SidebarRightTabsLike\n service: SidebarRightServiceLike\n slots: SlotsLike\n renderTab: unknown\n guide: { title: () => string; description: () => string }\n}): (() => void) | null {\n const { tabs, service, slots, renderTab, guide } = options\n const open = (path: string | null, focusDiff: boolean): boolean => {\n try {\n // 官方语义:打开即展开侧栏;seat 未挂载(无会话画面)时抛错,降级其他打开器\n service.openTab(OFFICIAL_TAB_KIND, { params: { openPath: path || undefined, focusDiff } })\n } catch (error) {\n log.warn('官方侧边栏打开失败(' + String(error) + ')')\n return false\n }\n return true\n }\n let typeDisposer: (() => void) | null = null\n try {\n // extension 档(默认且最高):与官方内置类型同 kind 时接管,卸载后官方恢复\n typeDisposer = tabs.register({\n id: OFFICIAL_TAB_ID,\n kind: OFFICIAL_TAB_KIND,\n priority: 'extension',\n title: () => OFFICIAL_TAB_TITLE,\n guide: [{ order: 20, title: guide.title, description: guide.description }],\n })\n } catch (error) {\n log.warn('官方侧边栏 Tab 类型注册失败(' + String(error) + '),回退旧形态')\n return null\n }\n setEnsureSideEditor(open)\n const bodyDisposer = registerBodySlot(slots, OFFICIAL_TAB_ID, renderTab)\n return () => {\n if (typeof typeDisposer === 'function') typeDisposer()\n if (typeof bodyDisposer === 'function') bodyDisposer()\n setEnsureSideEditor(null)\n }\n}\n\n/**\n * 注册官方 file 资源地址认领(extension 档接管 `dsh-resource://file/**`,\n * 聊天文件链接/文件树打开改落本插件编辑器;注销后官方 textpreview 自动恢复)。\n * 认领与否由「文件链接使用工具」设置驱动(见 fileOpeners.shouldClaimFiles)。\n * @author ddj 2026年09月09号\n * @param options 装配参数(探测命中的注册表 + slots + 正文组件)\n * @returns 卸载器(反注册类型与正文);类型注册抛错返回 null(回落官方查看器)\n */\nexport function registerOfficialFileClaim(options: {\n tabs: SidebarRightTabsLike\n slots: SlotsLike\n renderTab: unknown\n}): (() => void) | null {\n const { tabs, slots, renderTab } = options\n let typeDisposer: (() => void) | null = null\n try {\n typeDisposer = tabs.register({\n id: OFFICIAL_FILE_TAB_ID,\n kind: OFFICIAL_FILE_KIND,\n patterns: [OFFICIAL_FILE_PATTERN],\n priority: 'extension',\n // 畸形/解码失败地址否决:回落官方 textpreview,不产生白屏 Tab\n canOpen: (address: string) => parseOfficialFileAddress(address) !== null,\n title: (address: string) => officialFileTitle(address),\n })\n } catch (error) {\n log.warn('官方 file 地址认领注册失败(' + String(error) + '),链接走官方查看器')\n return null\n }\n const bodyDisposer = registerBodySlot(slots, OFFICIAL_FILE_TAB_ID, renderTab)\n return () => {\n if (typeof typeDisposer === 'function') typeDisposer()\n if (typeof bodyDisposer === 'function') bodyDisposer()\n }\n}\n\n// --region 编辑 Tab 跨会话自动恢复\n\n/** 编辑 Tab 是否处于激活态(正文挂载 = 激活;模块级,跨会话存活)。 */\nlet editorTabActive = false\n/** 正文挂载纪元(每次挂载自增;延迟判定期间有新挂载则放弃清除)。 */\nlet mountEpoch = 0\n\n/**\n * 标记编辑 Tab 激活并推进挂载纪元(正文挂载时调用)。\n * @author ddj 2026年09月09号\n */\nexport function markEditorMounted(): void {\n mountEpoch += 1\n markEditorActive(true)\n}\n\n/**\n * 直接设置激活标记(正文卸载延迟判定用;测试 also 用作状态编排入口)。\n * @author ddj 2026年09月09号\n * @param active 是否激活\n */\nexport function markEditorActive(active: boolean): void {\n editorTabActive = active\n}\n\n/**\n * 读编辑 Tab 激活标记(会话切换时决定是否自动恢复编辑栏)。\n * @author ddj 2026年09月09号\n * @returns 上次标记的激活状态\n */\nexport function isEditorTabActive(): boolean {\n return editorTabActive\n}\n\n/**\n * 读当前挂载纪元(卸载延迟判定用:纪元已推进 = 有新正文接管,不清标记)。\n * @author ddj 2026年09月09号\n * @returns 当前纪元\n */\nexport function editorMountEpoch(): number {\n return mountEpoch\n}\n\n/**\n * 在挂载会话恢复编辑 Tab:已激活跳过(官方幂等);seat 未就绪抛错时有界重试。\n * openTab 官方语义「打开即展开侧栏」,一次调用同时完成展开 + 激活。\n * @author ddj 2026年09月09号\n * @param service 官方 sidebarRight 服务(缺失/未装配直接返回)\n * @param schedule 延时调度(ctx.timeout;重试节拍)\n * @param attempts 剩余尝试次数(默认 10 次 × 150ms ≈ 1.5s 窗口)\n */\nexport function restoreEditorTab(\n service: SidebarRightServiceLike | undefined | null,\n schedule: (fn: () => void, ms: number) => void,\n attempts = 10,\n): void {\n if (!service || typeof service.openTab !== 'function' || !editorTabActive) return\n try {\n if (service.active?.()?.kind === OFFICIAL_TAB_KIND) return\n service.openTab(OFFICIAL_TAB_KIND, {})\n } catch {\n // seat 未挂载/未绑定(会话面尚未渲染):等一拍再试,放弃后保持现状不阻塞\n if (attempts > 1) schedule(() => restoreEditorTab(service, schedule, attempts - 1), 150)\n }\n}\n// --endregion\n","/**\n * dsh-vscode-mode client — 文件打开器注册表与自动选择。\n * @author ddj 2026年08月24号 / 2026年09月09号\n */\nimport { SIDEBAR_PLUGIN } from './compat.js'\nimport { buildFileAddress } from './officialSidebar.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/** 官方右侧侧边栏打开器 id(「文件链接使用工具」下拉的官方选项;DSH 0.1.5+)。 */\nexport const OFFICIAL_OPEN_TOOL = 'dsh-official-sidebar'\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/** 官方 sidebarRight.openResource 的最小结构面(结构性使用,不 import 官方类型)。 */\nexport interface OfficialOpenResourceService {\n openResource?: (address: string, options?: { params?: unknown }) => void\n}\n\n/**\n * 文件链接是否由本插件认领官方 file 地址:自动/VSCodeMode 档接管(链接进本插件编辑器),\n * 官方侧边栏/system/better-sidebar 档不认领(官方查看器或旧版路由生效)。\n * @author ddj 2026年09月09号\n * @param selected 「文件链接使用工具」当前值\n * @returns 是否认领\n */\nexport function shouldClaimFiles(selected: unknown): boolean {\n return selected === AUTO_OPEN_TOOL || selected === VSCODE_OPEN_TOOL\n}\n\n/**\n * 创建「官方侧边栏」文件打开器(DSH 0.1.5+,经 ctx.sidebarRight.openResource 打开官方查看器)。\n * 仅官方服务探测命中时注册;下拉选项随注册动态出现(McpSettings 动态渲染)。\n * @author ddj 2026年09月09号\n * @param service 官方导航控制器\n * @returns 文件打开器\n */\nexport function officialSidebarOpener(service: OfficialOpenResourceService): FileOpener {\n return {\n id: OFFICIAL_OPEN_TOOL,\n label: '官方侧边栏',\n description: '在 DSH 官方右侧侧边栏查看器中打开(0.1.5+)',\n priority: 90,\n isAvailable: () => typeof service.openResource === 'function',\n open: (path, context) => {\n if (typeof service.openResource !== 'function') throw new Error('官方侧边栏 openResource 能力不可用')\n service.openResource(buildFileAddress(path, context.sessionId))\n },\n }\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, parseChords } 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 && parseChords(chord).length === 0\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.detect(检测结果驱动卡片动态显示),配置经 edrv.lsp.configGet/Update,扩展经 edrv.lsp.ext.*。\n * 作者 ddj 2026-08-27 / 2026-09-03\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport '../styles/mcp.css'\n\n/** 支持语言的展示元数据(卡片显示由检测结果驱动;未知 id 走 langMeta 兜底)。 */\nconst LANG_META = {\n lua: { label: 'Lua(EmmyLua / LuaLS)', hint: '优先使用已安装 EmmyLua;未安装时回退 LuaLS 或 PATH 中的 lua-language-server' },\n csharp: { label: 'C#(Roslyn / DotRush / OmniSharp)', hint: '优先自动发现 ms-dotnettools.csharp / DotRush 扩展(DotRush 需 .NET 10 运行时);也可手动指定' },\n}\n\n/** 语言展示元数据(含未知 id 兜底)。 */\nfunction langMeta(id) {\n return LANG_META[id] || { label: id + '(语言服务器)', hint: '' }\n}\n\n/** 该语言是否已存配置(禁用开关或手动命令/路径)。 */\nfunction hasStoredConfig(cfg) {\n if (!cfg || typeof cfg !== 'object') return false\n if (cfg.enabled === false) return true\n return Boolean((cfg.command && cfg.command.trim()) || (cfg.path && cfg.path.trim()))\n}\n\n/** 该语言是否显示卡片:检测到可用 LSP、已存配置、或存在待安装的缺失环境。 */\nfunction langVisible(status, config) {\n if (!status) return false\n if (status.source && status.source !== 'none') return true\n if (hasStoredConfig(config[status.languageId])) return true\n return Array.isArray(status.missingEnv) && status.missingEnv.length > 0\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 envButtonLabel(req, envStates) {\n const state = (envStates ?? []).find((s) => s.id === req.id)\n if (state?.phase === 'downloading') return '下载中…'\n if (state?.phase === 'extracting') return '安装中…'\n if (state?.phase === 'done') return '已完成'\n if (state?.phase === 'failed') return '重试'\n return '一键安装'\n}\n\n/** 语言卡片:状态 + 缺失环境提示(一键安装/官网下载) + 启用开关 + 命令/路径配置 + 重新检测。 */\nfunction LangCard({ lang, config, status, busy, envStates, onInstallEnv, 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 Array.isArray(status?.candidates) && status.candidates.length > 1\n ? React.createElement('div', { className: 'vsm-lsp-hint' },\n '候选(' + status.candidates.length + '):' + status.candidates.map((c) =>\n c.name + (c.version ? ' v' + c.version : '') + (c.chosen ? '(当前)' : '')).join(' · '))\n : null,\n Array.isArray(status?.missingEnv) && status.missingEnv.length\n ? React.createElement('div', { className: 'vsm-lsp-hint' },\n '缺少运行环境(一键安装后自动生效):',\n status.missingEnv.map((req) => React.createElement('div', { key: req.id, className: 'vsm-mcp-actions' },\n React.createElement('span', null, req.label, req.detail ? '(' + req.detail + ')' : ''),\n req.installable ? React.createElement('button', {\n className: 'vsm-primary vsm-small',\n disabled: busy === 'env:' + req.id,\n onClick: () => onInstallEnv(lang.id, req),\n }, envButtonLabel(req, envStates)) : null,\n req.manualUrl ? React.createElement('a', {\n href: req.manualUrl, target: '_blank', rel: 'noreferrer',\n style: { color: 'inherit', textDecoration: 'underline', alignSelf: 'center' },\n }, req.manualLabel ?? '官网下载') : null)))\n : 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 const [envStates, setEnvStates] = React.useState([])\n const [envLang, setEnvLang] = React.useState('')\n\n const refreshServers = React.useCallback(() => {\n Promise.all([rpc('edrv.lsp.configGet', {}), rpc('edrv.lsp.detect', {})])\n .then(([cfg, det]) => {\n if (cfg?.ok) setConfig(cfg.config ?? {})\n if (det?.ok) setServers(det.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 refreshEnvStates = React.useCallback(() => {\n return rpc('edrv.lsp.envState', {})\n .then((res) => {\n if (res?.ok) setEnvStates(res.states ?? [])\n return res?.states ?? []\n })\n .catch(() => [])\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 = React.useCallback((languageId) => {\n window.dispatchEvent(new CustomEvent('edrv:lsp-redetect', { detail: { languageId } }))\n }, [])\n\n /** 一键安装缺失环境:启动内置安装器(成功后进入轮询,完成自动重同步)。 */\n const installEnv = (languageId, req) => {\n const key = 'env:' + req.id\n setBusy(key)\n setError('')\n setEnvLang(languageId)\n rpc('edrv.lsp.envInstall', { languageId, id: req.id })\n .then((res) => {\n if (!res?.ok) { setError(res?.error ?? '无法启动安装'); return }\n void refreshEnvStates()\n void refreshServers()\n })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n // 环境安装进行中:2s 轮询进度并刷新状态;某项转入 done 时由下方过渡检测重同步\n React.useEffect(() => {\n const states = envStates ?? []\n const installing = states.some((s) => s.phase === 'downloading' || s.phase === 'extracting')\n if (!installing) return\n const timer = setInterval(() => {\n void refreshEnvStates()\n void refreshServers()\n }, 2000)\n return () => clearInterval(timer)\n }, [envStates, refreshEnvStates, refreshServers])\n\n // 环境安装完成过渡检测:刷新状态并通知编辑器重新同步对应语言\n const prevEnvPhases = React.useRef({})\n React.useEffect(() => {\n const states = envStates ?? []\n for (const s of states) {\n const prev = prevEnvPhases.current[s.id]\n if (prev && prev !== 'done' && s.phase === 'done' && envLang) {\n void refreshServers()\n notifyResync(envLang)\n }\n prevEnvPhases.current[s.id] = s.phase\n }\n }, [envStates, envLang, refreshServers, notifyResync])\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 void refreshServers() // 新装 LSP 使对应语言卡片出现\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 void refreshServers() // 新装 LSP 使对应语言卡片出现\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 void refreshServers() // 卸载后对应语言卡片按最新检测隐匿\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 void refreshServers() // 更新后选用版本随之变化\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 // 动态显示:检测结果(detect 全量)驱动卡片可见性;未检出语言灰字列出\n const detected = Array.isArray(servers) ? servers : []\n const visible = detected.filter((s) => langVisible(s, config))\n const hidden = detected.filter((s) => !visible.includes(s))\n body = panel('语言服务器', React.createElement(React.Fragment, null,\n visible.length ? visible.map((status) => {\n const meta = langMeta(status.languageId)\n return React.createElement(LangCard, {\n key: status.languageId, lang: { id: status.languageId, label: meta.label, hint: meta.hint },\n config: config[status.languageId] ?? {},\n status,\n busy, envStates, onInstallEnv: installEnv, onToggle: toggleLang, onSave: saveLang, onRedetect: redetectLang,\n })\n }) : React.createElement('div', { className: 'vsm-mcp-empty' },\n '未检测到已安装的语言服务器;可切换到「市场」搜索安装(如 sumneko.lua),或安装本地 .vsix 后刷新。'),\n hidden.length ? React.createElement('div', { className: 'vsm-lsp-hint' },\n '未检测到:' + hidden.map((s) => langMeta(s.languageId).label).join('、') + ' —— 可在「市场」安装后刷新。') : null,\n React.createElement('div', { className: 'vsm-lsp-hint' }, '提示:打开对应语言的文件即自动(惰性)启动语言服务器;未配置时编辑器功能不受影响,大纲回退内置解析。')))\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 — 「系统集成」设置面板(跨平台)。\n * 右键菜单:Windows=HKCU 三类键(reg)/ Linux=Nautilus 脚本 + Dolphin 服务菜单(文件写入)/\n * macOS=Automator 快速操作(一键复制配方手动创建,自动检测/移除)。\n * 深链基址来自设置 integrationBaseUrl(settings.set 持久化)。\n * Unity 集成:登记项目根 + 一键安装/更新内嵌包到 <项目>/Packages/com.dsh.editor。\n * 作者 ddj 2026-09-07\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { SettingsContext } from '../settingsContext.js'\n\n/** launcher 状态文案。 */\nfunction launcherText(launcher) {\n if (!launcher?.present) return '未安装'\n return launcher.compiled ? '已编译 exe(无闪窗)' : '已安装'\n}\n\n/** 注册条目状态文案(跨平台 entries)。 */\nfunction entriesText(entries) {\n if (!entries?.length) return '本平台无自动注册入口'\n return entries.map((entry) => entry.label + (entry.registered ? ' ✓' : ' ✗')).join(' · ')\n}\n\n/** macOS Automator 快速操作配方(复制到剪贴板,用户按步骤创建)。 */\nfunction automatorRecipe(launcherPath) {\n return [\n 'macOS Finder 快速操作(Automator)配置步骤:',\n '1. Automator → 新建 → 快速操作',\n '2. 「工作流程接收当前」选:文件或文件夹;位于:任何应用程序',\n '3. 添加动作「运行 Shell 脚本」,Shell 选 /bin/bash,传递输入选「作为参数」',\n '4. 脚本内容替换为:',\n ' exec \"' + launcherPath + '\" \"$@\"',\n '5. 保存为:在 DSH 文件编辑中打开',\n '完成后在 Finder 右键 → 快速操作/服务 中出现「在 DSH 文件编辑中打开」。',\n ].join('\\n')\n}\n\n/** 单个 Unity 项目行。 */\nfunction ProjectRow({ project, busy, onInstall, onRemove }) {\n const versionText = project.missingDir\n ? '目录不存在'\n : project.error\n ? project.error\n : project.installedVersion\n ? '已装 v' + project.installedVersion + (project.upToDate ? '(最新)' : '(可更新)')\n : '未安装'\n const installable = !project.missingDir && !project.error\n return React.createElement('div', { className: 'vsm-general-row', key: project.path },\n React.createElement('span', null,\n project.title,\n React.createElement('small', { className: 'vsm-devform-note' }, ' ' + project.path + ' · ' + versionText)),\n React.createElement('div', { className: 'vsm-devform-actions' },\n React.createElement('button', {\n className: 'vsm-primary vsm-small',\n disabled: !installable || busy === 'install:' + project.path,\n title: project.upToDate ? '重新安装(整目录替换)' : '安装/更新到该 Unity 项目',\n onClick: () => onInstall(project.path),\n }, busy === 'install:' + project.path ? '安装中…' : project.installedVersion ? (project.upToDate ? '重装' : '更新') : '安装'),\n React.createElement('button', { disabled: busy === 'remove:' + project.path, onClick: () => onRemove(project.path) }, '移除登记'),\n ),\n )\n}\n\n/** 平台提示条(注册语义差异说明)。 */\nfunction PlatformNote({ platform, registered }) {\n if (platform === 'win32') return null\n const text = platform === 'linux'\n ? 'Linux 注册覆盖 GNOME Files(Nautilus)与 KDE Dolphin 两个主流文件管理器(文件写入即注册,无需管理员);其他文件管理器暂未支持。'\n : 'macOS:点「复制 Automator 配方」按提示创建快速操作(约 1 分钟),创建后此处自动显示 ✓;「移除注册」仅删除引用本插件 launcher 的快速操作。'\n return React.createElement('small', { className: 'vsm-devform-msg' }, text)\n}\n\n/**\n * 系统集成面板(挂在 VSCodeMode 设置「通用」页底部)。\n * @author ddj 2026年09月07号\n */\nexport function IntegrationSettings() {\n const settings = React.useContext(SettingsContext)\n const [status, setStatus] = React.useState(null)\n const [statusError, setStatusError] = React.useState('')\n const [unity, setUnity] = React.useState(null)\n const [error, setError] = React.useState('')\n const [message, setMessage] = React.useState('')\n const [busy, setBusy] = React.useState('')\n const [baseUrl, setBaseUrl] = React.useState('')\n const [baseDraft, setBaseDraft] = React.useState(null)\n const [rootDraft, setRootDraft] = React.useState('')\n\n React.useEffect(() => {\n let alive = true\n Promise.all([rpc('edrv.integration.status', {}), rpc('edrv.unity.list', {})]).then(([st, ul]) => {\n if (!alive) return\n if (st.ok) { setStatus(st); setBaseUrl(st.baseUrl); setStatusError('') } else setStatusError(String(st.error))\n if (ul.ok) setUnity(ul)\n }).catch((e) => { if (alive) setError(String(e)) })\n return () => { alive = false }\n }, [])\n\n const platform = status?.platform ?? ''\n const onWin = platform === 'win32'\n const onLinux = platform === 'linux'\n const onMac = platform === 'darwin'\n const anyRegistered = (status?.entries ?? []).some((entry) => entry.registered && !entry.manual)\n\n const refreshUnity = () => rpc('edrv.unity.list', {}).then((result) => { if (result.ok) setUnity(result) })\n\n /** 注册/移除右键菜单(Windows/Linux;macOS 注册按钮替换为配方复制)。 */\n const runMenu = (key, method, done) => {\n setBusy(key); setError(''); setMessage('')\n rpc(method, {}).then((result) => {\n if (!result.ok) throw new Error(result.error)\n setStatus(result)\n setMessage(done)\n }).catch((e) => setError(String(e?.message ?? e))).finally(() => setBusy(''))\n }\n const register = () => runMenu('register', 'edrv.integration.register',\n onLinux ? '已注册:在 Nautilus / Dolphin 中右键文件或文件夹即可看到「在 DSH 文件编辑中打开」(首次出现可能需重启文件管理器)。' : '右键菜单已注册:右键文件/文件夹 →「在 DSH 文件编辑中打开」。')\n const unregister = () => runMenu('unregister', 'edrv.integration.unregister', '右键菜单注册已移除。')\n\n /** 复制 macOS Automator 配方(含 launcher 实际路径)。 */\n const copyRecipe = () => {\n const text = automatorRecipe(status?.launcher?.path ?? '$HOME/.dsh/dsh-vscode-mode/shell/dsh-open.sh')\n navigator.clipboard?.writeText(text)\n .then(() => setMessage('配方已复制,粘贴到备忘录按步骤操作即可。'))\n .catch(() => setMessage(text))\n }\n\n /** 保存深链基址(settings.set 持久化;已注册时提示重新注册刷新 launcher ini)。 */\n const saveBase = () => {\n const next = String(baseDraft ?? '').trim()\n if (!next) return\n if (!settings?.set) { setError('设置服务不可用'); return }\n setBusy('base'); setError(''); setMessage('')\n settings.set('integrationBaseUrl', next)\n .then(() => { setBaseUrl(next); setMessage('深链基址已保存;如已注册右键菜单,请点「注册」刷新 launcher 配置。') })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n /** 登记 Unity 项目(校验 Assets/ProjectSettings)。 */\n const addProject = () => {\n setBusy('add'); setError(''); setMessage('')\n rpc('edrv.unity.add', { path: rootDraft.trim() }).then((result) => {\n if (!result.ok) throw new Error(result.error)\n setRootDraft('')\n setMessage('项目已登记,点「安装」把包复制进项目 Packages/ 目录。')\n return refreshUnity()\n }).catch((e) => setError(String(e?.message ?? e))).finally(() => setBusy(''))\n }\n\n /** 一键安装/更新(整目录替换内嵌包)。 */\n const installProject = (path) => {\n setBusy('install:' + path); setError(''); setMessage('')\n rpc('edrv.unity.install', { path }).then((result) => {\n if (!result.ok) throw new Error(result.error)\n const project = result.project\n setMessage('已安装/更新:' + project.title + '(v' + project.installedVersion + ')。Unity 已打开时切回窗口即生效。')\n return refreshUnity()\n }).catch((e) => setError(String(e?.message ?? e))).finally(() => setBusy(''))\n }\n\n /** 移除登记(不删除已安装的包目录)。 */\n const removeProject = (path) => {\n if (!window.confirm('移除该项目的登记?(不删除已安装的包目录)')) return\n setBusy('remove:' + path); setError(''); setMessage('')\n rpc('edrv.unity.remove', { path })\n .then(refreshUnity)\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n /** 复制包源路径(手动 Add package from disk 兜底)。 */\n const copySource = () => {\n const text = unity?.sourcePath ?? ''\n if (!text) return\n navigator.clipboard?.writeText(text)\n .then(() => setMessage('已复制包源路径:' + text))\n .catch(() => setMessage('包源路径:' + text))\n }\n\n return 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('p', { style: { margin: '0 0 8px' } },\n '把 DSH 编辑器接入系统入口:文件管理器右键菜单(Windows/Linux/macOS)+ Unity 外部脚本编辑器(UPM 内嵌包,自动发现,无需改 manifest.json)。'),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n message && React.createElement('small', { className: 'vsm-devform-msg' }, message),\n status && !onWin && React.createElement(PlatformNote, { platform, registered: anyRegistered }),\n React.createElement('label', { className: 'vsm-general-row' },\n React.createElement('span', null, 'DSH 服务地址'),\n React.createElement('input', {\n value: baseDraft ?? baseUrl,\n placeholder: 'http://127.0.0.1:3080',\n onChange: (event) => setBaseDraft(event.target.value),\n onKeyDown: (event) => { if (event.key === 'Enter') saveBase() },\n }),\n React.createElement('button', { disabled: busy === 'base' || baseDraft === null, onClick: saveBase }, '保存'),\n ),\n React.createElement('label', { className: 'vsm-general-row' },\n React.createElement('span', null,\n '右键菜单 ',\n React.createElement('small', { className: 'vsm-devform-note' },\n status\n ? entriesText(status.entries) + ' · launcher:' + launcherText(status.launcher)\n : statusError ? '状态获取失败:' + statusError : '读取中…')),\n React.createElement('div', { className: 'vsm-devform-actions' },\n (onWin || onLinux) && React.createElement('button', { className: 'vsm-primary vsm-small', disabled: busy === 'register', onClick: register }, busy === 'register' ? '注册中…' : '注册'),\n onMac && React.createElement('button', { className: 'vsm-primary vsm-small', onClick: copyRecipe }, '复制 Automator 配方'),\n status && React.createElement('button', { disabled: busy === 'unregister' || (!anyRegistered && !onMac), onClick: unregister }, '移除注册'),\n ),\n ),\n React.createElement('div', { className: 'vsm-general-row', style: { alignItems: 'flex-start' } },\n React.createElement('span', null,\n 'Unity 一键安装 ',\n React.createElement('small', { className: 'vsm-devform-note' },\n unity ? '包 v' + (unity.sourceVersion ?? '?') + ' · ' + unity.sourcePath : '读取中…')),\n React.createElement('div', { className: 'vsm-devform-actions' },\n React.createElement('button', { onClick: copySource }, '复制包源路径'),\n ),\n ),\n (unity?.projects ?? []).map((project) => React.createElement(ProjectRow, {\n key: project.path,\n project,\n busy,\n onInstall: installProject,\n onRemove: removeProject,\n })),\n React.createElement('label', { className: 'vsm-general-row' },\n React.createElement('span', null, '添加 Unity 项目'),\n React.createElement('input', {\n value: rootDraft,\n placeholder: '项目根目录(含 Assets 与 ProjectSettings)',\n onChange: (event) => setRootDraft(event.target.value),\n onKeyDown: (event) => { if (event.key === 'Enter') addProject() },\n }),\n React.createElement('button', { className: 'vsm-primary vsm-small', disabled: busy === 'add' || !rootDraft.trim(), onClick: addProject }, busy === 'add' ? '校验中…' : '添加'),\n ),\n React.createElement('small', null, '安装 = 复制到 <项目>/Packages/com.dsh.editor(内嵌包);更新 = 整目录替换;卸载 = 删除该目录。Unity 打开时切回窗口自动刷新生效。插件卸载/重载时会自动清理并恢复右键菜单注册(「移除注册」后不再恢复)。'),\n ),\n )\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — AI 补全设置卡片。\n * 开关 + 模型下拉(edrv.ai.models 目录,按 provider 分组,默认「自动」)+\n * 思考强度下拉(随所选模型的 efforts 元数据动态渲染:无档位隐藏;含「跟随默认」)。\n * 保存走 edrv.ai.configUpdate;保存后广播 edrv:ai-config 事件让 provider 即时生效。\n * 作者 ddj\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { setAiInlineEnabled } from '../ai/inlineProvider.js'\n\n/**\n * AI 补全设置卡片(设置页「AI 补全」Tab 主体)。\n * @author ddj\n */\nexport function AiSettings() {\n const [cfg, setCfg] = React.useState(null)\n const [dir, setDir] = React.useState(null)\n const [note, setNote] = React.useState('')\n const [error, setError] = React.useState('')\n const [busy, setBusy] = React.useState(false)\n\n React.useEffect(() => {\n Promise.all([rpc('edrv.ai.configGet', {}), rpc('edrv.ai.models', {})])\n .then(([c, d]) => {\n if (c.ok) setCfg({ enabled: c.enabled, provider: c.provider, model: c.model, effort: c.effort })\n else setError(c.error || '配置读取失败')\n if (d.ok) setDir(d)\n else setError(d.error || '模型目录读取失败')\n })\n .catch((e) => setError(String(e)))\n }, [])\n\n /** 所选 provider 下的模型条目(自动路由时取首组供档位参考)。 */\n const modelsOf = (provider) => {\n if (!dir?.providers?.length) return []\n if (!provider) return dir.providers[0]?.models ?? []\n return dir.providers.find((p) => p.id === provider)?.models ?? []\n }\n\n /** 档位可选项:模型无 reasoning 元数据 → 空数组(选择器隐藏)。 */\n const efforts = (() => {\n const models = modelsOf(cfg?.provider)\n return models.find((m) => m.model === cfg?.model)?.efforts ?? models[0]?.efforts ?? []\n })()\n\n const save = async (patch) => {\n setBusy(true)\n setError('')\n try {\n const res = await rpc('edrv.ai.configUpdate', patch)\n if (!res.ok) throw new Error(res.error || '保存失败')\n setCfg({ enabled: res.enabled, provider: res.provider, model: res.model, effort: res.effort })\n setAiInlineEnabled(res.enabled)\n setNote('已保存')\n window.dispatchEvent(new CustomEvent('edrv:ai-config', { detail: { enabled: res.enabled } }))\n } catch (e) {\n setError(String(e))\n } finally {\n setBusy(false)\n }\n }\n\n const toggle = () => save({ enabled: !cfg.enabled })\n\n const pickModel = (value) => {\n // 「自动」:provider/model 清空(host 自动取目录首个);档位保留\n if (!value) return save({ provider: '', model: '' })\n const idx = value.indexOf('/')\n const provider = value.slice(0, idx)\n const model = value.slice(idx + 1)\n const efforts = modelsOf(provider).find((m) => m.model === model)?.efforts ?? []\n // 换模型后原档位可能不属于新模型:档位一并清空(跟随默认)\n const keep = efforts.some((e) => e.id === cfg.effort)\n save(keep ? { provider, model } : { provider, model, effort: '' })\n }\n\n if (!cfg) return React.createElement('div', { className: 'vsm-mcp-empty' }, error || '正在读取 AI 补全配置…')\n\n const modelValue = cfg.provider && cfg.model ? cfg.provider + '/' + cfg.model : ''\n return React.createElement('section', { className: 'vsm-lsp-card' },\n React.createElement('h3', null, 'AI 自动补全(实验)'),\n React.createElement('p', { className: 'vsm-lsp-note' }, '编辑停顿后由模型生成内联建议(ghost text),Tab 接受,Alt+\\\\ 手动触发。每次补全是一次模型调用;建议选择非推理模型,且思考强度选「跟随默认」或最低档以获得更快响应。'),\n React.createElement('div', { className: 'vsm-lsp-row' },\n React.createElement('button', { className: cfg.enabled ? 'vsm-primary' : '', disabled: busy, onClick: toggle },\n cfg.enabled ? '已开启(点击关闭)' : '已关闭(点击开启)'),\n ),\n React.createElement('div', { className: 'vsm-lsp-row' },\n React.createElement('label', null, '模型',\n React.createElement('select', { value: modelValue, disabled: busy || !dir?.providers?.length, onChange: (e) => pickModel(e.target.value) },\n React.createElement('option', { value: '' }, dir?.providers?.length ? '自动(取第一个可用模型)' : '无可用模型'),\n (dir?.providers ?? []).flatMap((p) => p.models.map((m) => React.createElement('option', { key: p.id + '/' + m.model, value: p.id + '/' + m.model }, p.name + ' · ' + m.name)))),\n ),\n efforts.length ? React.createElement('label', null, '思考强度',\n React.createElement('select', { value: cfg.effort, disabled: busy, onChange: (e) => save({ effort: e.target.value }) },\n React.createElement('option', { value: '' }, '跟随默认'),\n efforts.map((e) => React.createElement('option', { key: e.id, value: e.id }, e.name))),\n ) : null,\n ),\n note && React.createElement('div', { className: 'vsm-compat-item ok' }, React.createElement('span', { className: 'vsm-compat-name' }, note)),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\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 { normalizeSidebarMinWidth, SIDEBAR_MIN_DEFAULT } from '../sidebarMin.js'\nimport { KeybindingsPanel } from './KeybindingsPanel.js'\nimport { LspSettings } from './LspSettings.js'\nimport { PerfSettings } from './PerfSettings.js'\nimport { IntegrationSettings } from './IntegrationSettings.js'\nimport { AiSettings } from './AiSettings.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 [minW, setMinW] = React.useState(SIDEBAR_MIN_DEFAULT)\n const [minDraft, setMinDraft] = React.useState(null) // 输入草稿(null=跟随已保存值;blur/Enter 提交)\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 snap = settings?.getSnapshot?.()\n const next = snap?.value?.fileOpenTool\n if (typeof next === 'string') setTool(next)\n setMinW(normalizeSidebarMinWidth(snap?.value?.sidebarMinWidth))\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 /** 提交侧边栏最小宽度(归一化夹取 180–560 后持久化)。 */\n const saveMinW = (raw) => {\n const next = normalizeSidebarMinWidth(raw)\n setMinW(next); setBusy(true); setError('')\n if (!settings?.set) { setError('设置服务不可用'); setBusy(false); return }\n settings.set('sidebarMinWidth', next).catch((e) => setError(String(e))).finally(() => setBusy(false))\n }\n /** 结束输入(blur/Enter)时提交草稿。 */\n const commitMinW = () => {\n if (minDraft === null) return\n setMinDraft(null)\n saveMinW(minDraft)\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 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' },\n React.createElement('span', null, '侧边栏最小宽度'),\n React.createElement('input', {\n type: 'number', min: 180, max: 560, step: 10,\n value: minDraft ?? minW,\n disabled: loading || unavailable || notReady || busy || snapshot?.writable === false,\n title: '180–560 px;拖拽侧边栏低于该宽度时自动隐藏',\n onChange: (event) => setMinDraft(event.target.value),\n onBlur: commitMinW,\n onKeyDown: (event) => { if (event.key === 'Enter') commitMinW() },\n }),\n React.createElement('small', null, '180–560 px;拖拽低于该宽度自动隐藏')),\n ),\n ),\n React.createElement(IntegrationSettings, null),\n )\n}\n\n/** 兼容性小节:host 报告(RPC compat)+ 客户端本地适配项。 */\nfunction CompatSection({ getSummary }) {\n const [report, setReport] = React.useState(null)\n const [error, setError] = React.useState('')\n React.useEffect(() => {\n let alive = true\n rpc('compat', {}).then((result) => {\n if (!alive) return\n if (!result.ok) setError(String(result.error))\n else setReport(result.report)\n }).catch((e) => { if (alive) setError(String(e)) })\n return () => { alive = false }\n }, [])\n const renderItems = (list) => (list ?? []).map((item) => React.createElement('div', { key: item.name, className: 'vsm-compat-item ' + (item.active ? 'ok' : 'warn') },\n React.createElement('span', { className: 'vsm-compat-name' }, item.name),\n React.createElement('span', { className: 'vsm-compat-note' }, item.note ?? (item.active ? '正常' : '未生效')),\n ))\n /** 兼容性分组面板:标题 + 线框内容区。 */\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 if (tab === 'ai') body = React.createElement(AiSettings, 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 === 'ai' ? 'active' : '', onClick: () => setTab('ai') }, 'AI 补全'), 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","/**\n * dsh-vscode-mode client — DSH 对话文件链接的 0.1.3+ 路由(remote.session 面)。\n * 0.1.3 起 dsh-client-ui-chat 的 openFile 直接调 ctx.remote.session.openWorkspacePath\n * (浏览器→host RPC session/openWorkspacePath),不再经过 workspaces.openPath,\n * 旧路由补丁因此落空;该方法是 getter-only accessor,补丁经 compat.patchAccessor\n * 换描述符安装。行为与 openPathRouter 对齐:插件打开器优先,\".\"(打开工作区文件夹)、\n * 无可用打开器或打开失败时透传原实现(系统默认应用打开)。\n * 纯逻辑,node 环境可单测(不依赖 DOM / events 模块)。\n * 作者 ddj 2026年09月08号\n */\nimport { patchAccessor } from './compat.js'\nimport { isAvailable, selectOpener, type FileOpenContext, type FileOpenerRegistry } from './fileOpeners.js'\n\n/** session.openWorkspacePath 的结果形状(host 返回 { opened: true };客户端不做输出校验)。 */\nexport interface OpenPathResult {\n ok: boolean\n value?: { opened: boolean }\n}\n\n/** openWorkspacePath 的请求形状;path 为 \".\" 时表示打开工作区文件夹。 */\nexport interface OpenPathRequest {\n path?: unknown\n}\n\n/** 补丁前 openWorkspacePath 的实时实现形状。 */\ntype RemoteOpen = (request: OpenPathRequest) => Promise<OpenPathResult>\n\n/** 插件打开器接管成功时返回给调用方(chat 只看 ok,产物区读 value)。 */\nconst OPENED_RESULT: OpenPathResult = { ok: true, value: { opened: true } }\n\nexport interface RemoteOpenRouterOptions {\n registry: FileOpenerRegistry\n selected: () => string\n context: () => FileOpenContext\n logger?: (message: string) => void\n}\n\n/**\n * 结构化探测 remote.session 命名空间服务及其 openWorkspacePath 方法。\n * 旧版 DSH 无该 namespace、或 api-remotes 尚未挂载时返回 undefined。\n * @author ddj 2026年09月08号\n * @param ctx 客户端服务上下文\n * @returns 命名空间服务实例;不可用返回 undefined\n */\nexport function probeRemoteOpen(ctx: { get: (name: string) => unknown }): object | undefined {\n try {\n const service = ctx.get('remote.session') as { openWorkspacePath?: unknown } | undefined\n if (!service || typeof service.openWorkspacePath !== 'function') return undefined\n return service\n } catch {\n return undefined\n }\n}\n\n/**\n * 安装可卸载的 remote.session.openWorkspacePath 路由(0.1.3+ 会话文件链接主路径)。\n * @author ddj 2026年09月08号\n * @param service probeRemoteOpen 命中的命名空间服务\n * @param options 路由依赖\n * @returns 恢复函数;目标属性缺失时返回 null(调用方停止安装并告警)\n */\nexport function patchRemoteOpen(service: object, options: RemoteOpenRouterOptions): (() => void) | null {\n return patchAccessor(service, 'openWorkspacePath', async (original, ...args) => {\n const fallback = original as unknown as RemoteOpen\n const request = (args[0] ?? {}) as OpenPathRequest\n const path = typeof request.path === 'string' ? request.path : ''\n if (!path || path === '.') return fallback(request)\n const opener = selectOpener(options.registry, options.selected())\n if (!opener || !isAvailable(opener)) return fallback(request)\n try {\n await opener.open(path, options.context())\n return OPENED_RESULT\n } catch (error) {\n options.logger?.('文件打开器 ' + opener.id + ' 失败,回退系统打开: ' + String(error))\n return fallback(request)\n }\n })\n}\n","/**\n * dsh-vscode-mode shared — 外部深链 URL 契约(Windows launcher / Unity 包 / client 共用)。\n * 形态:?<FLAG>=1&<PATHS_KEY>=<enc1>[,<enc2>…] [&<LINE_KEY>=N] [&<COLUMN_KEY>=M]\n * 每个路径独立 percent-encode(encodeURIComponent / Uri.EscapeDataString)后以 `,` 连接:\n * 编码结果不含裸逗号(Windows 路径本身不允许逗号,编码兜底其余字符),URLSearchParams\n * 取值做一次标准解码即得 `enc1,enc2`,按 `,` split 即路径,无需二次 decode。\n * Purity rule: no node/react imports(URLSearchParams 为标准全局)。\n * 作者 ddj 2026-09-07\n */\n\n/** 深链开关参数名(值恒为 '1')。 */\nexport const EDRV_OPEN_FLAG = 'edrvOpen'\n/** 路径列表参数名(逗号分隔的已编码路径)。 */\nexport const EDRV_PATHS_KEY = 'edrvPaths'\n/** 目标行参数名(1-based,可选,作用于首个路径)。 */\nexport const EDRV_LINE_KEY = 'edrvLine'\n/** 目标列参数名(1-based,可选,作用于首个路径)。 */\nexport const EDRV_COLUMN_KEY = 'edrvColumn'\n/** 深链参数键全集(URL 清理用)。 */\nexport const EDRV_PARAM_KEYS = [EDRV_OPEN_FLAG, EDRV_PATHS_KEY, EDRV_LINE_KEY, EDRV_COLUMN_KEY]\n/** 路径分隔符(编码后路径不含裸逗号,分隔安全)。 */\nexport const PATHS_SEPARATOR = ','\n\n/** 一次外部深链请求(解析结果)。 */\nexport interface OpenParams {\n /** 待打开路径(已解码,首个路径可携带行列)。 */\n paths: string[]\n /** 目标行(1-based,可空)。 */\n line?: number\n /** 目标列(1-based,可空)。 */\n column?: number\n}\n\n/**\n * 解析深链查询串:非深链/路径为空 → null;行列仅接受正整数,非法忽略。\n * @author ddj 2026年09月07号\n * @param search location.search(含或不含前导 ? 均可)\n * @returns 深链参数或 null\n */\nexport function parseOpenParams(search: string): OpenParams | null {\n const params = new URLSearchParams(search ?? '')\n if (params.get(EDRV_OPEN_FLAG) !== '1') return null\n const paths = (params.get(EDRV_PATHS_KEY) ?? '')\n .split(PATHS_SEPARATOR)\n .map((item) => item.trim())\n .filter(Boolean)\n if (!paths.length) return null\n const line = positiveIntOf(params.get(EDRV_LINE_KEY))\n const column = positiveIntOf(params.get(EDRV_COLUMN_KEY))\n return { paths, line, column }\n}\n\n/**\n * 正整数解析(非法/非正 → undefined)。\n * @author ddj 2026年09月07号\n * @param raw 参数原文(可空)\n * @returns 正整数或 undefined\n */\nfunction positiveIntOf(raw: string | null): number | undefined {\n const value = Number(raw)\n return Number.isInteger(value) && value > 0 ? value : undefined\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 工作区选择弹窗(深链打开规则 1)。\n * 复用与「添加 MCP」一致的 vsm-mcp-modal / vsm-mcp-dialog 模态(页面居中卡片 + 遮罩 + 主题\n * token),React portal 挂 body;Esc / 遮罩点击 / 取消 → null(中止流程不改任何状态)。\n * 作者 ddj 2026-09-07\n */\nimport React from 'react'\nimport { createRoot } from 'react-dom/client'\n\n/** 用户选择:使用最近的工作区 / 新建工作区 / null=中止。 */\nexport type WorkspaceChoice = 'recent' | 'create' | null\n\n/** 弹窗组件属性。 */\ninterface ChoiceModalProps {\n /** 匹配到的工作区标题。 */\n title: string\n /** 触发打开的文件夹路径。 */\n folder: string\n /** 选择回调(首次调用即卸载)。 */\n done: (choice: WorkspaceChoice) => void\n}\n\n/** 选择弹窗(vsm-mcp-modal 遮罩 + vsm-mcp-dialog 卡片,Esc/遮罩点击取消)。 */\nfunction ChoiceModal({ title, folder, done }: ChoiceModalProps) {\n React.useEffect(() => {\n const onKey = (event) => {\n if (event.key === 'Escape') done(null)\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [])\n return React.createElement('div', {\n className: 'vsm-mcp-modal',\n onMouseDown: (event) => {\n if (event.target === event.currentTarget) done(null)\n },\n },\n React.createElement('div', { className: 'vsm-mcp-dialog' },\n React.createElement('h3', null, '在 DSH 中打开'),\n React.createElement('label', null, '文件夹 ' + folder + ' 位于已注册的工作区「' + title + '」内,选择打开方式:'),\n React.createElement('div', { className: 'vsm-mcp-dialog-actions' },\n React.createElement('button', { onClick: () => done(null) }, '取消'),\n React.createElement('button', { onClick: () => done('create') }, '新建工作区'),\n React.createElement('button', { className: 'vsm-primary', onClick: () => done('recent') }, '使用最近的工作区'),\n ),\n ),\n )\n}\n\n/**\n * 弹出工作区选择弹窗(深链打开规则 1)。\n * @author ddj 2026年09月07号\n * @param title 匹配到的工作区标题\n * @param folder 文件夹路径\n * @returns 用户选择;null = 取消/中止\n */\nexport function chooseWorkspace(title: string, folder: string): Promise<WorkspaceChoice> {\n return new Promise((resolve) => {\n const host = document.createElement('div')\n document.body.appendChild(host)\n const root = createRoot(host)\n const done = (choice: WorkspaceChoice) => {\n root.unmount()\n host.remove()\n resolve(choice)\n }\n root.render(React.createElement(ChoiceModal, { title, folder, done }))\n })\n}\n","/**\n * dsh-vscode-mode client — 深链打开规则引擎(资源管理器右键 / Unity 外部编辑器落地)。\n * 规则:文件夹 ⊂ 某已注册工作区 → 页面内弹窗二选一(使用最近的工作区 / 新建工作区);\n * 文件夹不在任何工作区 → 直达最近对话所在工作区新增;文件 → 最近对话 + 编辑器展开\n * (无任何会话 → 以文件父目录注册工作区引导创建)。首路径驱动规则,其余路径:文件进\n * 编辑器、文件夹补引用。纯函数可单测;编排依赖经 OpenDeps 注入(mock 可测)。\n * 作者 ddj 2026-09-07\n */\nimport { rpc } from './rpc.js'\nimport { chooseWorkspace } from './chooseDialog.js'\nimport { emitOpenAt, openEditorView } from './events.js'\nimport { toastDom } from './externalOpen.js'\nimport { createAddToConversation } from './addToConversation.js'\nimport type { AddOutcome, CtxLike } from './addToConversation.js'\nimport type { OpenParams } from '../shared/externalOpen.js'\n\n/** 路径类型(host edrv.externalStat 判定)。 */\nexport type PathKind = 'file' | 'directory' | 'missing'\n\n/** 打开规则分派结果。 */\nexport type OpenRule = 'choose' | 'folderNew' | 'fileRecent' | 'bootstrap' | 'abort'\n\n/** 工作区视图最小形状(ctx.workspaces.list 快照行)。 */\nexport interface WsView {\n workspaceId: string\n path: string\n title: string\n sessionIds?: readonly string[]\n updatedAt?: string\n}\n\n/** 会话行最小形状(ctx.sessions.list 快照行)。 */\nexport interface SessionRow {\n id: string\n cwd?: string\n updatedAt?: number\n origin?: 'subagent'\n}\n\n/** 打开编排依赖(全部可注入,便于 mock 测试)。 */\nexport interface OpenDeps {\n stat(path: string): Promise<PathKind>\n workspaces(): { items: WsView[]; ready: boolean }\n sessions(): { ids: string[]; byId: Record<string, SessionRow>; ready: boolean }\n createSession(opts: { workspaceId?: string; cwd?: string }): Promise<string>\n createWorkspace(path: string): Promise<{ workspaceId: string; title: string }>\n openSession(id: string): void\n reference(sessionId: string, path: string, appearance: 'file' | 'folder'): Promise<boolean>\n choose(title: string, folder: string): Promise<'recent' | 'create' | null>\n openEditor(path: string | null, line?: number, column?: number): void\n schedule(fn: () => void, ms: number): void\n notify(text: string): void\n}\n\n/** 等列表/输入就绪的节奏。 */\nconst READY_TIMEOUT_MS = 15000\nconst READY_TICK_MS = 300\nconst REF_RETRY_MAX = 20\nconst REF_RETRY_MS = 300\nconst REST_STEP_MS = 150\nconst LINE_AT_DELAY_MS = 200\n\n/**\n * 路径规范化:`\\→/`、小写、去尾分隔符(Windows 大小写不敏感前缀匹配用)。\n * @author ddj 2026年09月07号\n */\nexport function normPath(p: string): string {\n return String(p ?? '').replace(/\\\\/g, '/').replace(/\\/+$/, '').toLowerCase()\n}\n\n/**\n * 目录包含判定:child === root 或 child 位于 root 之下。\n * @author ddj 2026年09月07号\n */\nexport function containsPath(root: string, child: string): boolean {\n const r = normPath(root)\n const c = normPath(child)\n return c === r || c.startsWith(r + '/')\n}\n\n/**\n * 父目录(文件引导创建工作区用;根路径回退自身)。\n * @author ddj 2026年09月07号\n */\nexport function dirnameOf(p: string): string {\n const norm = String(p ?? '').replace(/[\\\\/]+$/, '')\n const cut = Math.max(norm.lastIndexOf('/'), norm.lastIndexOf('\\\\'))\n return cut > 0 ? norm.slice(0, cut) : norm\n}\n\n/**\n * 最近一次对话:排除子代理行,updatedAt 最新优先。\n * @author ddj 2026年09月07号\n */\nexport function recentSession(byId: Record<string, SessionRow>, ids?: string[]): SessionRow | undefined {\n const rows = (ids ?? Object.keys(byId)).map((id) => byId[id]).filter((row) => row && row.origin !== 'subagent')\n return rows.sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0))[0]\n}\n\n/**\n * 文件夹命中的已注册工作区(前缀包含),updatedAt 新者优先。\n * @author ddj 2026年09月07号\n */\nexport function matchWorkspaces(items: WsView[], folder: string): WsView[] {\n return items.filter((ws) => containsPath(ws.path, folder))\n}\n\n/**\n * 规则分派:目录+命中工作区 → choose;目录未命中 → folderNew(以该文件夹为根注册新工作区,\n * 用户确认:一律取右键的文件夹本身);文件有会话 → fileRecent;文件无会话 → bootstrap;\n * 路径缺失 → abort。\n * @author ddj 2026年09月08号\n */\nexport function pickRule(kind: PathKind, matched: boolean, hasSession: boolean): OpenRule {\n if (kind === 'missing') return 'abort'\n if (kind === 'directory') return matched ? 'choose' : 'folderNew'\n return hasSession ? 'fileRecent' : 'bootstrap'\n}\n\n/**\n * 深链打开编排入口:等列表就绪 → 判型 → 规则分派 → 编排 create/open/引用/编辑器。\n * @author ddj 2026年09月07号\n * @param ctx 客户端根上下文(sessions/workspaces 服务)\n * @param params 深链参数(首路径驱动规则)\n * @param overrides 依赖覆盖(测试注入)\n */\nexport async function openDeepLink(ctx: unknown, params: OpenParams, overrides: Partial<OpenDeps> = {}): Promise<void> {\n const deps = realDeps(ctx, overrides)\n if (!(await waitListsReady(deps))) {\n deps.notify('DSH 会话列表未就绪,请稍后重试')\n return\n }\n const primary = params.paths[0]\n const kind = await deps.stat(primary).catch(() => 'missing' as PathKind)\n const sess = deps.sessions()\n const rule = pickRule(kind, matchWorkspaces(deps.workspaces().items, primary).length > 0, Boolean(recentSession(sess.byId, sess.ids)))\n try {\n if (rule === 'abort') {\n deps.notify('路径不存在:' + primary)\n return\n }\n if (rule === 'choose') return await runChoose(deps, primary, params)\n if (rule === 'folderNew') return await runFolderNew(deps, primary, params)\n if (rule === 'fileRecent') return await runFileRecent(deps, primary, params)\n return await runFileBootstrap(deps, primary, params)\n } catch (error) {\n deps.notify('打开失败:' + String((error as Error)?.message ?? error))\n }\n}\n\n/** 等待会话与工作区列表就绪(上限 15s;超时按当前态判定)。 */\nasync function waitListsReady(deps: OpenDeps): Promise<boolean> {\n for (let waited = 0; waited < READY_TIMEOUT_MS; waited += READY_TICK_MS) {\n if (deps.sessions().ready && deps.workspaces().ready) return true\n await sleep(deps, READY_TICK_MS)\n }\n return deps.sessions().ready && deps.workspaces().ready\n}\n\n/** 规则 1:命中工作区 → 弹窗分派(取消即中止)。 */\nasync function runChoose(deps: OpenDeps, folder: string, params: OpenParams): Promise<void> {\n const matches = matchWorkspaces(deps.workspaces().items, folder)\n const best = bestMatch(deps, matches)\n const choice = await deps.choose(best?.title ?? '工作区', folder)\n if (choice === null) return\n if (choice === 'create') return runFolderNew(deps, folder, params)\n const ws = best ?? deps.workspaces().items[0]\n const sessionId = await spawnInWorkspace(deps, ws.workspaceId, undefined)\n await settleRef(deps, sessionId, folder, 'folder')\n deps.openEditor(null)\n await openRest(deps, sessionId, params, 1)\n}\n\n/** 规则 3a:文件 → 所属工作区优先(有会话打开其最近会话;无会话新建 + 文件引用);无匹配 → 最近对话。 */\nasync function runFileRecent(deps: OpenDeps, file: string, params: OpenParams): Promise<void> {\n const ws = pickFileWorkspace(deps, file)\n if (ws) {\n const anchor = recentSessionIn(deps, ws)\n if (anchor) {\n deps.openSession(anchor.id)\n deps.openEditor(file, params.line, params.column)\n await openRest(deps, anchor.id, params, 1)\n return\n }\n // 文件所属工作区存在但无会话 → 在该工作区新建对话 + 文件引用\n const sessionId = await spawnInWorkspace(deps, ws.workspaceId, undefined)\n await settleRef(deps, sessionId, file, 'file')\n deps.openEditor(file, params.line, params.column)\n await openRest(deps, sessionId, params, 1)\n return\n }\n const anchor = recentSession(deps.sessions().byId, deps.sessions().ids)\n if (!anchor) return runFileBootstrap(deps, file, params)\n deps.openSession(anchor.id)\n deps.openEditor(file, params.line, params.column)\n await openRest(deps, anchor.id, params, 1)\n}\n\n/**\n * 文件所属工作区:前缀命中的工作区里,优先取有会话且最近活跃的;都无会话取路径最具体的。\n * @author ddj 2026年09月08号\n */\nfunction pickFileWorkspace(deps: OpenDeps, file: string): WsView | undefined {\n const matches = matchWorkspaces(deps.workspaces().items, file)\n if (!matches.length) return undefined\n const withSessions = matches.filter((ws) => (ws.sessionIds ?? []).some((id) => Boolean(deps.sessions().byId[id])))\n if (!withSessions.length) {\n return [...matches].sort((a, b) => normPath(b.path).length - normPath(a.path).length)[0]\n }\n return withSessions.sort((a, b) => latestSessionAt(deps, b) - latestSessionAt(deps, a))[0]\n}\n\n/** 工作区内会话的最近活跃时间(无成员 → 0)。 */\nfunction latestSessionAt(deps: OpenDeps, ws: WsView): number {\n const byId = deps.sessions().byId\n return (ws.sessionIds ?? []).reduce((max, id) => Math.max(max, byId[id]?.updatedAt ?? 0), 0)\n}\n\n/** 工作区内最近一次会话(排除子代理与不在列表中的陈旧行)。 */\nfunction recentSessionIn(deps: OpenDeps, ws: WsView): SessionRow | undefined {\n const byId = deps.sessions().byId\n const rows = (ws.sessionIds ?? []).map((id) => byId[id]).filter((row) => row && row.origin !== 'subagent')\n return rows.sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0))[0]\n}\n\n/** 规则 3b:文件 + 无任何会话 → 父目录注册工作区 + 新对话 + 文件引用 + 编辑器打开。 */\nasync function runFileBootstrap(deps: OpenDeps, file: string, params: OpenParams): Promise<void> {\n const ws = await deps.createWorkspace(dirnameOf(file))\n const sessionId = await spawnInWorkspace(deps, ws.workspaceId, undefined)\n await settleRef(deps, sessionId, file, 'file')\n deps.openEditor(file, params.line, params.column)\n await openRest(deps, sessionId, params, 1)\n}\n\n/** 规则 1.2:以文件夹注册新工作区 + 新对话 + 文件夹引用 + 编辑页。 */\nasync function runFolderNew(deps: OpenDeps, folder: string, params: OpenParams): Promise<void> {\n const ws = await deps.createWorkspace(folder)\n const sessionId = await spawnInWorkspace(deps, ws.workspaceId, undefined)\n await settleRef(deps, sessionId, folder, 'folder')\n deps.openEditor(null)\n await openRest(deps, sessionId, params, 1)\n}\n\n/** 在指定工作区(或回退 cwd)新建对话并置为当前;返回新会话 id。 */\nasync function spawnInWorkspace(deps: OpenDeps, workspaceId: string | undefined, fallbackCwd: string | undefined): Promise<string> {\n const sessionId = await deps.createSession(workspaceId ? { workspaceId } : fallbackCwd ? { cwd: fallbackCwd } : {})\n deps.openSession(sessionId)\n return sessionId\n}\n\n/** 命中工作区集中「最近」的一个(其成员会话 updatedAt 最新者优先)。 */\nfunction bestMatch(deps: OpenDeps, matches: WsView[]): WsView | undefined {\n const byId = deps.sessions().byId\n const score = (ws: WsView): number => {\n const sessionLatest = (ws.sessionIds ?? []).reduce((max, id) => Math.max(max, byId[id]?.updatedAt ?? 0), 0)\n return Math.max(sessionLatest, Date.parse(ws.updatedAt ?? '') || 0)\n }\n return [...matches].sort((a, b) => score(b) - score(a))[0]\n}\n\n/** 引用插入轮询:输入门面就绪前每 300ms 重试(appendReference 忙态已降级视为成功)。 */\nasync function settleRef(deps: OpenDeps, sessionId: string, path: string, appearance: 'file' | 'folder'): Promise<void> {\n for (let attempt = 0; attempt < REF_RETRY_MAX; attempt++) {\n if (await deps.reference(sessionId, path, appearance)) return\n await sleep(deps, REF_RETRY_MS)\n }\n}\n\n/** 其余路径:文件进编辑器(步进),文件夹补文件夹引用。 */\nasync function openRest(deps: OpenDeps, sessionId: string | null, params: OpenParams, from: number): Promise<void> {\n const rest = params.paths.slice(from)\n for (const [index, path] of rest.entries()) {\n const kind = await deps.stat(path).catch(() => 'missing' as PathKind)\n if (kind === 'file') {\n deps.schedule(() => deps.openEditor(path), REST_STEP_MS * (index + 1))\n } else if (kind === 'directory' && sessionId) {\n await settleRef(deps, sessionId, path, 'folder')\n }\n }\n}\n\n/** 可注入 sleep。 */\nfunction sleep(deps: OpenDeps, ms: number): Promise<void> {\n return new Promise((resolve) => deps.schedule(resolve, ms))\n}\n\n/** 真实依赖装配(全部来自 ctx 注入服务 + 既有 RPC/弹窗/编辑器入口)。 */\nfunction realDeps(ctx: unknown, overrides: Partial<OpenDeps> = {}): OpenDeps {\n const service = (name: string): any => {\n const get = (ctx as { get?: (name: string) => unknown } | undefined)?.get\n return typeof get === 'function' ? get.call(ctx, name) : undefined\n }\n const add = createAddToConversation(ctx as CtxLike)\n const base: OpenDeps = {\n stat: async (path) => {\n const result = await rpc('edrv.externalStat', { path })\n return result.ok ? result.kind : 'missing'\n },\n workspaces: () => {\n const snap = (service('workspaces')?.list?.getSnapshot?.() ?? {}) as { items?: WsView[]; phase?: string }\n return { items: snap.items ?? [], ready: snap.phase === 'ready' }\n },\n sessions: () => {\n const snap = (service('sessions')?.list?.getSnapshot?.() ?? {}) as { ids?: string[]; byId?: Record<string, SessionRow>; phase?: string }\n return { ids: snap.ids ?? [], byId: snap.byId ?? {}, ready: snap.phase !== 'pending' }\n },\n createSession: async (opts) => await service('sessions').create(opts),\n createWorkspace: async (path) => {\n const ws = await service('workspaces').create({ path })\n return { workspaceId: ws.workspaceId, title: ws.title }\n },\n openSession: (id) => service('sessions').open(id),\n reference: async (sessionId, path, appearance) => {\n const outcome: AddOutcome = await add.appendReference(sessionId, path, undefined, appearance)\n return outcome !== 'unavailable'\n },\n choose: (title, folder) => chooseWorkspace(title, folder),\n openEditor: (path, line, column) => {\n if (path == null) {\n openEditorView(null)\n return\n }\n openEditorView(path)\n if (line != null) setTimeout(() => emitOpenAt(path, line, column), LINE_AT_DELAY_MS)\n },\n schedule: (fn, ms) => setTimeout(fn, ms),\n notify: (text) => toastDom(text),\n }\n return { ...base, ...overrides }\n}\n","/**\n * dsh-vscode-mode client — 外部深链落地(Windows 右键菜单 / Unity 外部编辑器)。\n * 启动时解析 location.search 的 edrvOpen 深链:跨源 referrer 守卫防外部网页诱导;\n * 处理完剥离 URL 参数防刷新重开;执行委托 openFlow 打开规则引擎(工作区/对话智能路由)。\n * 另挂 3s 移交轮询(兼活跃心跳):launcher 投递的打开请求由已打开页面就地执行,避免重复开新页。\n * 作者 ddj 2026-09-07 / 2026-09-08\n */\nimport { EDRV_PARAM_KEYS, parseOpenParams } from '../shared/externalOpen.js'\nimport { openDeepLink } from './openFlow.js'\nimport { rpc } from './rpc.js'\nimport { log } from './log.js'\n\n/** toast 自隐时长。 */\nconst TOAST_MS = 5000\n/** 深链移交轮询周期(兼活跃心跳)。 */\nconst HANDOFF_POLL_MS = 3000\n\n/** 深链装配选项(全部可注入便于测试;缺省读浏览器全局)。 */\nexport interface ExtOpenOptions {\n /** 查询串(缺省 location.search)。 */\n search?: string\n /** referrer(缺省 document.referrer)。 */\n referrer?: string\n /** 当前源(缺省 location.origin)。 */\n origin?: string\n}\n\n/**\n * 装配外部深链:深链参数缺失时仅保持移交轮询(零额外开销)。\n * @author ddj 2026年09月07号\n * @param ctx 客户端根上下文(sessions/workspaces 服务)\n * @param options 可注入选项\n */\nexport function setupExtOpen(ctx: unknown, options: ExtOpenOptions = {}): void {\n startPresencePoll(ctx)\n const search = options.search ?? (typeof location !== 'undefined' ? location.search : '')\n const params = parseOpenParams(search)\n if (!params) return\n const referrer = options.referrer ?? (typeof document !== 'undefined' ? document.referrer : '')\n const origin = options.origin ?? (typeof location !== 'undefined' ? location.origin : '')\n if (!referrerAllowed(referrer, origin)) {\n log.warn('已忽略跨源深链请求(referrer=' + referrer + ')')\n return\n }\n stripCurrentUrl()\n void openDeepLink(ctx, params).catch((error) => {\n log.warn('深链打开失败:' + String(error))\n toastDom('深链打开失败:' + String((error as Error)?.message ?? error))\n })\n}\n\n/**\n * 深链移交轮询:每 3s 向 host 领取待打开请求(兼活跃心跳,launcher 据此决定是否开新页)。\n * 页面级单例(window 标记防 HMR 重复);领取到即执行打开规则。\n * @author ddj 2026年09月08号\n * @param ctx 客户端根上下文\n */\nfunction startPresencePoll(ctx: unknown): void {\n if (typeof window === 'undefined') return\n const marker = window as { __edrvExtPoll?: boolean }\n if (marker.__edrvExtPoll) return\n marker.__edrvExtPoll = true\n let executing = false\n window.setInterval(() => {\n if (executing) return\n executing = true\n void rpc('edrv.external.pending', {})\n .then(async (result) => {\n if (!result.ok || !result.open) return\n await openDeepLink(ctx, { paths: result.open.paths, line: result.open.line, column: result.open.column })\n })\n .catch(() => { /* 旧版 host 无此方法/离线:忽略 */ })\n .finally(() => { executing = false })\n }, HANDOFF_POLL_MS)\n}\n\n/**\n * 跨源守卫:referrer 为空(launcher/Unity 直开)或同源 → 允许。\n * @author ddj 2026年09月07号\n * @param referrer 文档 referrer\n * @param origin 当前页面源\n * @returns 是否允许处理深链\n */\nexport function referrerAllowed(referrer: string, origin: string): boolean {\n if (!referrer) return true\n try {\n return new URL(referrer).origin === origin\n } catch {\n return false\n }\n}\n\n/**\n * 剥离 URL 中的深链参数(保留其余参数与 hash,防刷新重开)。\n * @author ddj 2026年09月07号\n * @param href 完整 URL\n * @returns 清理后的 URL(pathname+search+hash)\n */\nexport function stripOpenHref(href: string): string {\n const url = new URL(href)\n for (const key of EDRV_PARAM_KEYS) url.searchParams.delete(key)\n return url.pathname + url.search + url.hash\n}\n\n/** 清理当前页面 URL(best-effort,失败不阻塞打开)。 */\nfunction stripCurrentUrl(): void {\n try {\n if (typeof location === 'undefined' || typeof history === 'undefined') return\n const next = stripOpenHref(location.href)\n if (next !== location.pathname + location.search + location.hash) history.replaceState(null, '', next)\n } catch { /* 清理失败忽略 */ }\n}\n\n/**\n * 轻量 toast(编辑器未挂载也能提示;5s 自隐;openFlow 通知与错误呈现共用)。\n * @author ddj 2026年09月07号\n * @param text 提示文本\n */\nexport function toastDom(text: string): void {\n if (typeof document === 'undefined') return\n const toast = document.createElement('div')\n toast.textContent = text\n toast.setAttribute('style', [\n 'position:fixed', 'left:50%', 'bottom:28px', 'transform:translateX(-50%)',\n 'z-index:99999', 'padding:8px 14px', 'border-radius:8px', 'max-width:80vw',\n 'background:#2a2a2a', 'color:#ddd', 'border:1px solid #444', 'font-size:12px',\n 'box-shadow:0 4px 16px rgba(0,0,0,.35)',\n ].join(';'))\n document.body?.appendChild(toast)\n setTimeout(() => toast.remove(), TOAST_MS)\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 sessions: props?.sessions,\n })\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — OfficialSideTab:DSH 官方右侧 Sidebar「文件编辑」Tab 正文包装。\n * 双用途:页类型 Tab(edrvEditor)经 navigation.params(openPath/focusDiff)打开;\n * file 资源类型 Tab(edrvEditorFile,认领 dsh-resource://file/**)经 navigation.address\n * 解码出真实路径并透传 params.line 行号定位。派发既有 edrv:open-editor 事件复用\n * EditorView 打开流;按会话 key 保证切会话干净重建。\n * Tab 正文切换后重挂载时按最新导航恢复打开(对齐 better-sidebar 形态的种子行为)。\n * 作者 ddj 2026年09月09号\n */\nimport React from 'react'\nimport { EditorView } from './EditorView.js'\nimport { setSideEditorMounted } from '../sidebarBridge.js'\nimport { editorMountEpoch, markEditorMounted, parseOfficialFileAddress, resolveNavOpen } from '../officialSidebar.js'\n\n/**\n * 官方侧边栏 Tab 正文组件(keyed slot sidebar.right.pane.tab 装配)。\n * @param props slot 框架注入(useTabInfo/sessionId)+ 装配依赖(schedule 等)\n * @returns EditorView 侧栏形态\n */\nexport function OfficialSideTab(props) {\n const sessionId = props?.sessionId\n const useTabInfo = props?.useTabInfo\n let navigation\n // useTabInfo 是 slot 框架按组件实例生成的 hook,须在组件顶层无条件调用\n if (typeof useTabInfo === 'function') {\n try {\n navigation = useTabInfo()?.tab?.navigation\n } catch {\n navigation = undefined\n }\n }\n const revision = typeof navigation?.revision === 'number' ? navigation.revision : -1\n const revisionRef = React.useRef(-1)\n // 最新 sessionId 镜像(卸载清理判读「切会话 vs 本会话关闭」用)\n const sessionIdRef = React.useRef(sessionId)\n sessionIdRef.current = sessionId\n\n // 编辑 Tab 激活标记:挂载即激活;卸载时延迟判定「切会话(保持,供新会话自动恢复)\n // vs 本会话关闭/切走其他 Tab(清除,尊重用户选择)」——通知早于会话状态落定,必须延后读;\n // 纪元守卫:判定期间有新正文挂载(HMR/自动恢复)则放弃清除\n React.useEffect(() => {\n setSideEditorMounted(true)\n markEditorMounted()\n return () => {\n setSideEditorMounted(false)\n const epoch = editorMountEpoch()\n const self = sessionIdRef.current\n const schedule = props?.schedule\n const decide = () => {\n if (editorMountEpoch() !== epoch) return\n const current = props?.sessions?.list?.getSnapshot?.()?.current\n markEditorActive(current === self)\n }\n if (typeof schedule === 'function') schedule(decide, 0)\n else decide()\n }\n }, [])\n\n React.useEffect(() => {\n if (revision === revisionRef.current) return\n revisionRef.current = revision\n // revision 0 = 无地址打开(种子/撤销恢复),没有可执行的打开请求\n if (revision <= 0) return\n // file 资源 Tab:地址即文件(解码出真实路径,透传 params.line 行号定位)\n const fileHit = parseOfficialFileAddress(navigation?.address)\n if (fileHit) {\n const line = navigation?.params?.line\n window.dispatchEvent(new CustomEvent('edrv:open-editor', {\n detail: { path: fileHit.path, line: typeof line === 'number' ? line : undefined },\n }))\n return\n }\n // 页类型 Tab:params 携带打开请求\n const request = resolveNavOpen(navigation?.params)\n window.dispatchEvent(new CustomEvent('edrv:open-editor', {\n detail: { path: request.path, focusDiff: request.focusDiff },\n }))\n })\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 sessions: props?.sessions,\n })\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 * 将视口边界 clamp 从 React 渲染层拆出,便于复用和单测。\n * 作者 ddj 2026-08-28 / 2026-09-03\n */\n\nexport interface MenuPosition {\n left: number\n top: 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 * 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 键前缀(按工作区作用域隔离,无 cwd 会话回退会话键)。 */\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 scope 作用域键(scopeStore.workspaceScopeOf 产物)\n * @returns 缓存数据或 null\n */\nexport function explorerLoad(scope: string): ExplorerCacheData | null {\n try {\n return parseExplorer(window.localStorage.getItem(KEY_PREFIX + String(scope)))\n } catch (error) {\n return null\n }\n}\n\n/**\n * 写入某作用域的展开状态缓存(损坏/配额满 → 忽略)。\n * @author ddj 2026年08月28号\n * @param scope 作用域键(scopeStore.workspaceScopeOf 产物)\n * @param data 缓存数据\n */\nexport function explorerSave(scope: string, data: ExplorerCacheData): void {\n try {\n window.localStorage.setItem(KEY_PREFIX + String(scope), 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/** scope → 缓存镜像(同步读,避免每次渲染 parse)。 */\nconst mirrors = new Map<string, EntriesCacheData>()\n/** scope → 落盘防抖计时器。 */\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(scope: string): string | null {\n try {\n return window.localStorage.getItem(KEY_PREFIX + scope)\n } catch (error) {\n return null\n }\n}\n\n/** localStorage 写入(配额/隐私模式失败静默)。 */\nfunction writeRaw(scope: string, text: string): void {\n try {\n window.localStorage.setItem(KEY_PREFIX + scope, text)\n } catch (error) { /* 配额满/隐私模式忽略 */ }\n}\n\n/** 取(或建)作用域缓存镜像。 */\nfunction mirrorOf(scope: string): EntriesCacheData {\n const existing = mirrors.get(scope)\n if (existing) return existing\n const data = entriesParse(readRaw(scope)) ?? { v: 2, root: null, dirs: {} }\n mirrors.set(scope, data)\n return data\n}\n\n/** 调度防抖落盘(重置已有计时器)。 */\nfunction scheduleSave(scope: string): void {\n const prev = saveTimers.get(scope)\n if (prev) clearTimeout(prev)\n saveTimers.set(scope, setTimeout(() => {\n saveTimers.delete(scope)\n const data = mirrors.get(scope)\n if (data) writeRaw(scope, entriesSerialize(entriesTrim(data)))\n }, CACHE_SAVE_DEBOUNCE_MS))\n}\n// --endregion\n\n/**\n * 读某目录缓存条目(无 → null;展示不受新鲜度限制)。\n * @author ddj 2026年08月31号\n * @param scope 作用域键(scopeStore.workspaceScopeOf 产物)\n * @param rel 目录相对路径('' = 根)\n * @returns 缓存条目或 null\n */\nexport function entriesCacheGet(scope: string | undefined, rel: string): TreeEntry[] | null {\n if (!scope) return null\n const dir = mirrorOf(scope).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 scope 作用域键(scopeStore.workspaceScopeOf 产物)\n * @param rel 目录相对路径\n * @returns 新鲜返回 true\n */\nexport function entriesCacheIsFresh(scope: string | undefined, rel: string): boolean {\n if (!scope) return false\n const dir = mirrorOf(scope).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 scope 作用域键(scopeStore.workspaceScopeOf 产物)\n * @param rel 目录相对路径\n * @param entries 目录条目\n */\nexport function entriesCachePut(scope: string | undefined, rel: string, entries: TreeEntry[]): void {\n if (!scope) return\n const data = mirrorOf(scope)\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(scope)\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 { buildTreeMenu } from '../contextMenu.js'\nimport { explorerLoad, explorerSave } from '../../state/explorerCache.js'\nimport { entriesCacheGet, entriesCacheIsFresh, entriesCachePut } from '../../state/explorerEntriesCache.js'\nimport { workspaceScopeOf } from '../../state/scopeStore.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 // 状态作用域:展开树/条目缓存按工作区隔离(同工作区切对话恢复同一份),无 cwd 回退会话\n const scope = ctx?.scope ?? workspaceScopeOf(null, 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(scope, 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(scope, 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(scope, 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 = scope ? explorerLoad(scope) : 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 }, [scope])\n\n // 展开状态防抖写回 localStorage(重启后恢复展开结构;按工作区作用域隔离)\n React.useEffect(() => {\n if (saveTimerRef.current) { clearTimeout(saveTimerRef.current); saveTimerRef.current = null }\n if (!scope) return\n saveTimerRef.current = setTimeout(() => {\n saveTimerRef.current = null\n const expandedList = Object.keys(expanded).filter((k) => expanded[k] === true)\n explorerSave(scope, { root, expanded: expandedList })\n }, SAVE_DEBOUNCE_MS)\n return () => {\n if (saveTimerRef.current) { clearTimeout(saveTimerRef.current); saveTimerRef.current = null }\n }\n }, [expanded, root, scope])\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 (!scope) 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 }, [scope])\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 // 菜单左上角对齐鼠标点击位置(视口坐标,ContextMenu 内再做 viewport clamp)\n setMenu({ x: ev.clientX, y: ev.clientY, 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'\nimport { workspaceScopeOf } from '../../state/scopeStore.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 // 搜索条件按工作区作用域记忆(同工作区切对话恢复同一份),无 cwd 回退会话\n const scope = ctx?.scope ?? workspaceScopeOf(null, 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 (!scope) return\n try {\n const saved = JSON.parse(localStorage.getItem(CACHE_KEY.search + String(scope)) || '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 }, [scope])\n\n // 查询/选项/过滤变化 → 持久化\n React.useEffect(() => {\n if (!scope) return\n try {\n localStorage.setItem(CACHE_KEY.search + String(scope), JSON.stringify({\n query, matchCase, wholeWord, regex, includeText, excludeText, onlyActive, excludeOn, sectionOpen,\n }))\n } catch (e) { /* 忽略 */ }\n }, [scope, 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","/**\n * dsh-vscode-mode client — 规则 frontmatter 纯函数(解析 + 按类型改写)。\n * 与 host parseRuleMdc/ruleTypeOf 语义对齐的浏览器端实现:编辑器类型下拉与\n * 原始 .mdc 文本域双向同步共用;纯字符串运算,禁 node/react 导入。\n * 作者 ddj 2026年09月07号\n */\n\n/** 规则生效类型(与 shared/rules.ts RuleType 一致,此处独立声明避免引入 host 依赖)。 */\nexport type RuleFmType = 'always' | 'auto' | 'manual'\n\n/** 一条 .mdc 文本的解析结果(改写 frontmatter 所需的全部上下文)。 */\nexport interface RuleFmParsed {\n type: RuleFmType\n description: string\n alwaysApply: boolean\n globs: string[]\n enabled: boolean\n /** 是否存在规则 frontmatter(首行 --- 且有闭合)。 */\n hasFm: boolean\n /** 闭合 --- 之后的正文(按 \\n 归一,与 host 解析一致)。 */\n body: string\n /** 已知键之外的 frontmatter 原行(如 updatedAt),改写时原样保留。 */\n fmExtra: string[]\n /** 原文是否带 BOM(改写后回填)。 */\n bom: boolean\n /** 原文 frontmatter 是否显式写了 enabled 行(改写时保持该行存在与否)。 */\n hasEnabledLine: boolean\n}\n\n/** 类型改写入参:下拉/描述/globs 控件的最新值。 */\nexport interface RuleMetaNext {\n type: RuleFmType\n description: string\n globs: string[]\n}\n\n/**\n * 去除值两侧成对引号(与 host stripQuotes 一致)。\n * @author ddj 2026年09月07号\n * @param raw 原始值\n * @returns 去引号后的值\n */\nfunction stripQuotes(raw: string): string {\n const value = raw.trim()\n if (value.length >= 2 && ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\")))) {\n return value.slice(1, -1)\n }\n return value\n}\n\n// --region 解析\n/**\n * 解析 .mdc 全文:首行 --- 且 100 行内有闭合 --- 才视为 frontmatter;\n * 已知键 description/alwaysApply/globs/enabled,其余原行进 fmExtra;永不抛错。\n * @author ddj 2026年09月07号\n * @param text 文件全文\n * @returns 解析结果\n */\nexport function parseRuleFm(text: string): RuleFmParsed {\n const bom = text.startsWith('\\uFEFF')\n const lines = text.replace(/^\\uFEFF/, '').split(/\\r?\\n/)\n const none: RuleFmParsed = { type: 'manual', description: '', alwaysApply: false, globs: [], enabled: true, hasFm: false, body: text.replace(/^\\uFEFF/, ''), fmExtra: [], bom, hasEnabledLine: false }\n if (lines[0]?.trim() !== '---') return none\n let close = -1\n for (let i = 1; i < lines.length && i <= 101; i++) {\n if (lines[i].trim() === '---') { close = i; break }\n }\n if (close < 0) return none\n const parsed: RuleFmParsed = { type: 'manual', description: '', alwaysApply: false, globs: [], enabled: true, hasFm: true, body: lines.slice(close + 1).join('\\n'), fmExtra: [], bom, hasEnabledLine: false }\n for (let i = 1; i < close; i++) {\n const match = /^([A-Za-z_-]+)[ \\t]*:[ \\t]?(.*)$/.exec(lines[i])\n if (!match) { parsed.fmExtra.push(lines[i]); continue }\n const [, key, raw] = match\n if (key === 'description') parsed.description = stripQuotes(raw)\n else if (key === 'alwaysApply') parsed.alwaysApply = stripQuotes(raw).toLowerCase() === 'true'\n else if (key === 'enabled') { parsed.enabled = stripQuotes(raw).toLowerCase() !== 'false'; parsed.hasEnabledLine = true }\n else if (key === 'globs') parsed.globs = parseGlobsValue(raw, lines, i, close)\n else parsed.fmExtra.push(lines[i])\n }\n parsed.type = fmTypeOf(parsed)\n return parsed\n}\n\n/**\n * 解析 globs 值:内联逗号分隔串,或空值后接 YAML 短横列表(与 host parseGlobs 一致)。\n * @author ddj 2026年09月07号\n * @param value 内联值\n * @param lines 全文行\n * @param start globs 行下标\n * @param close 闭合 --- 下标\n * @returns glob 数组\n */\nfunction parseGlobsValue(value: string, lines: string[], start: number, close: number): string[] {\n const inline = stripQuotes(value)\n if (inline) return inline.split(',').map((item) => stripQuotes(item)).filter(Boolean)\n const list: string[] = []\n for (let j = start + 1; j < close; j++) {\n const item = /^[ \\t]*-[ \\t]*(.+)$/.exec(lines[j])\n if (!item) break\n list.push(stripQuotes(item[1]))\n }\n return list\n}\n\n/**\n * 由 frontmatter 推导类型:alwaysApply=true → 总是;有 globs → 自动;否则手动。\n * @author ddj 2026年09月07号\n * @param parsed 解析结果\n * @returns 规则类型\n */\nfunction fmTypeOf(parsed: RuleFmParsed): RuleFmType {\n if (parsed.alwaysApply) return 'always'\n if (parsed.globs.length) return 'auto'\n return 'manual'\n}\n// --endregion\n\n// --region 改写\n/**\n * 按最新控件值重写 frontmatter:known 键固定顺序 + fmExtra + 闭合 --- + 原 body;\n * 无 frontmatter 且目标为手动时:有描述则新建仅含描述的 frontmatter,否则原文返回。\n * @author ddj 2026年09月07号\n * @param parsed parseRuleFm 的结果(必须来自同一文本)\n * @param next 控件最新值\n * @returns 重写后的全文\n */\nexport function applyRuleMeta(parsed: RuleFmParsed, next: RuleMetaNext): string {\n if (!parsed.hasFm && next.type === 'manual') {\n if (!next.description.trim()) return (parsed.bom ? '\\uFEFF' : '') + parsed.body\n return (parsed.bom ? '\\uFEFF' : '') + ['---', 'description: ' + next.description.trim(), '---'].join('\\n') + '\\n' + parsed.body\n }\n const lines: string[] = ['---']\n lines.push('description: ' + next.description.trim())\n if (next.type === 'always') lines.push('alwaysApply: true')\n if (next.type === 'auto') lines.push('globs: ' + next.globs.join(', '))\n if (parsed.hasEnabledLine) lines.push('enabled: ' + (parsed.enabled ? 'true' : 'false'))\n lines.push(...parsed.fmExtra)\n lines.push('---')\n return (parsed.bom ? '\\uFEFF' : '') + lines.join('\\n') + '\\n' + parsed.body\n}\n// --endregion\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏「规则」面板(Codebuddy 规则管理形态)。\n * 双 Tab:用户规则(~/.dsh/rules/)与项目规则(<工作区>/.dsh/rules/);\n * 列表行 = 文件名 + 相对提示,第二行类型徽标与描述,右侧 编辑/删除 图标 + 滑动启用开关;\n * 新建/编辑 = 顶部面包屑 + 规则类型下拉(总是/自动/手动)+ 描述/globs 控件,与原始 .mdc\n * 文本域双向同步(控件改写 frontmatter,文本域回读控件),保存走 rules.save。\n * 作者 ddj 2026年09月03号(2026年09月07号 交互性调整)\n */\nimport React from 'react'\nimport { rpc } from '../../rpc.js'\nimport type { SidebarCtx } from '../types.js'\nimport { CACHE_KEY } from '../../paths.js'\nimport { parseRuleFm, applyRuleMeta } from '../../rulesMdc.js'\n\n/** 新建规则模板(frontmatter 字段与 host parseRuleMdc 对齐)。 */\nconst NEW_TEMPLATE = '---\\ndescription: \\nalwaysApply: true\\n---\\n\\n'\nconst TYPE_LABEL = { always: '总是', auto: '自动', manual: '手动' }\n/** 列表行描述的基础显示上限(字符数;宽面板下的封顶值,超出省略号)。 */\nconst DESC_MAX = 24\n/** 动态字数下限(极窄面板的保底可见字符数)。 */\nconst DESC_CAP_MIN = 8\n/** 动态字数估算:描述之外的行内固定占用 px(动作区/类型标签/徽标/间距/省略余量)。 */\nconst DESC_RESERVE_PX = 210\n/** 动态字数估算:单字符平均宽度 px(11px 字号,中英混排)。 */\nconst DESC_CHAR_PX = 10\n/** 窄面板阈值:低于此宽度隐藏路径提示(编辑界面面包屑与悬停仍有完整路径)。 */\nconst NARROW_W = 420\n\n/**\n * 读 localStorage(损坏/不可用安全)。\n * @author ddj 2026年09月03号\n * @param key 键\n * @returns 值或 null\n */\nfunction readLocal(key) {\n try { return localStorage.getItem(key) } catch (e) { return null }\n}\n\n/**\n * 写 localStorage(不可用安全)。\n * @author ddj 2026年09月03号\n * @param key 键\n * @param value 值\n */\nfunction writeLocal(key, value) {\n try { localStorage.setItem(key, value) } catch (e) { /* 忽略 */ }\n}\n\n/**\n * 类型徽标(总是=绿 / 自动=蓝 / 手动=灰)。\n * @author ddj 2026年09月03号\n * @param type 规则类型\n * @returns 徽标元素\n */\nfunction typeBadge(type) {\n return React.createElement('span', { className: 'edrv-rules-type edrv-rules-type-' + type }, TYPE_LABEL[type] ?? type)\n}\n\n/**\n * 按字符上限截断列表行描述,超出以省略号收尾(上限随面板宽度动态变化;\n * 窄面板下 CSS 省略号仍会按像素提前截断,二者取更小)。\n * @author ddj 2026年09月07号\n * @param text 完整描述\n * @param cap 本帧字符上限\n * @returns 截断后的展示文本\n */\nfunction clampDesc(text, cap) {\n const chars = Array.from(String(text ?? '')) // 按码位切分,避免把 emoji 等代理对从中间截断\n const limit = Math.max(4, Number(cap) || DESC_MAX)\n return chars.length > limit ? chars.slice(0, limit).join('') + '…' : chars.join('')\n}\n\n/**\n * 由面板宽度估算描述可用字符数:随宽度动态变化,并与基础上限取小、极窄时保底。\n * @author ddj 2026年09月07号\n * @param panelWidth 面板内容宽度(px)\n * @returns 本帧描述字符上限\n */\nfunction descCapOf(panelWidth) {\n const byWidth = Math.floor((Number(panelWidth) - DESC_RESERVE_PX) / DESC_CHAR_PX)\n return Math.max(DESC_CAP_MIN, Math.min(DESC_MAX, byWidth))\n}\n\n/**\n * 编辑图标(线性铅笔,与 DiffBox chevron 同风格:currentColor 描边装饰图)。\n * @author ddj 2026年09月07号\n * @returns 13×13 装饰性 SVG\n */\nfunction pencilIcon() {\n return React.createElement('svg', {\n width: 13, height: 13, viewBox: '0 0 24 24', fill: 'none', 'aria-hidden': true, focusable: false,\n }, React.createElement('path', {\n d: 'M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z',\n stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round',\n }))\n}\n\n/**\n * 删除图标(线性垃圾桶,风格同 pencilIcon)。\n * @author ddj 2026年09月07号\n * @returns 13×13 装饰性 SVG\n */\nfunction trashIcon() {\n return React.createElement('svg', {\n width: 13, height: 13, viewBox: '0 0 24 24', fill: 'none', 'aria-hidden': true, focusable: false,\n }, React.createElement('path', {\n d: 'M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2m3 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6h14zM10 11v6M14 11v6',\n stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round',\n }))\n}\n\n/**\n * 逗号分隔的 globs 输入串 → 数组(去空项)。\n * @author ddj 2026年09月07号\n * @param text 输入串\n * @returns glob 数组\n */\nfunction globList(text) {\n return String(text ?? '').split(',').map((item) => item.trim()).filter(Boolean)\n}\n\n/**\n * 由控件值重建 .mdc 全文:frontmatter 按类型/描述/globs 重写,正文与其余键不动。\n * @author ddj 2026年09月07号\n * @param base 当前全文\n * @param fmType 目标类型(always/auto/manual)\n * @param desc 描述文本\n * @param globsText globs 输入串\n * @returns 重写后的全文\n */\nfunction rebuildContent(base, fmType, desc, globsText) {\n return applyRuleMeta(parseRuleFm(base), { type: fmType, description: desc, globs: globList(globsText) })\n}\n\n// --region 列表行\n/**\n * 渲染一条规则行:左侧两行(文件名+相对提示 / 类型徽标+描述),右侧 编辑/删除 图标 + 滑动开关。\n * @author ddj 2026年09月03号\n * @param props.rule 规则元信息\n * @param props.onEdit 编辑回调\n * @param props.onRemove 删除回调\n * @param props.onToggle 开关回调\n * @returns 行元素\n */\nfunction RuleRow(props) {\n const rule = props.rule\n const desc = [rule.error ? '解析失败:' + rule.error : null, rule.description || (rule.type === 'auto' ? 'globs: ' + rule.globs.join(', ') : '')]\n .filter(Boolean).join(' · ')\n return React.createElement('div', { className: 'edrv-rules-row' + (rule.enabled ? '' : ' off') },\n React.createElement('div', { className: 'edrv-rules-main', onClick: () => props.onEdit(rule), title: rule.absPath },\n React.createElement('div', { className: 'edrv-rules-line1' },\n React.createElement('span', { className: 'edrv-rules-file' }, rule.file),\n !props.narrow ? React.createElement('span', { className: 'edrv-rules-path' }, '[' + rule.relHint + rule.file + ']') : null,\n !rule.enabled ? React.createElement('span', { className: 'edrv-rules-offtag' }, '已停用') : null),\n React.createElement('div', { className: 'edrv-rules-sub' },\n React.createElement('span', { className: 'edrv-rules-sublabel' }, '类型:'),\n typeBadge(rule.type),\n desc ? React.createElement('span', { className: 'edrv-rules-desc', title: desc }, clampDesc(desc, props.descCap)) : null)),\n React.createElement('div', { className: 'edrv-rules-actions' },\n React.createElement('button', { className: 'edrv-rules-act', title: '编辑', onClick: () => props.onEdit(rule) }, pencilIcon()),\n React.createElement('button', { className: 'edrv-rules-act', title: '删除', onClick: () => props.onRemove(rule) }, trashIcon()),\n React.createElement('button', {\n className: 'edrv-rules-switch' + (rule.enabled ? ' on' : ''), role: 'switch', 'aria-checked': rule.enabled,\n title: rule.enabled ? '已启用(点击停用)' : '已停用(点击启用)',\n onClick: () => props.onToggle(rule),\n }, React.createElement('span', { className: 'edrv-rules-knob' }))))\n}\n// --endregion\n\n// --region 内嵌编辑器\n/**\n * 新建/编辑表单:面包屑头部 + 规则类型下拉/描述/globs 控件行 + 原始 .mdc 文本域 + 保存/取消。\n * @author ddj 2026年09月03号\n * @param props.form 表单状态(mode/scope/workspacePath/relHint/file/content/fmType/desc/globs/error/saving)\n * @param props.onType 类型下拉变更回调\n * @param props.onDesc 描述输入回调\n * @param props.onGlobs globs 输入回调\n * @param props.onBody 文本域编辑回调\n * @param props.onSave 保存回调\n * @param props.onCancel 取消回调\n * @returns 表单元素\n */\nfunction RuleEditor(props) {\n const form = props.form\n const isNew = form.mode === 'new'\n const crumb = (form.scope === 'project' ? '项目规则' : '用户规则') + ' > ' + form.relHint + ' > ' + (form.file || '新建规则.mdc')\n return React.createElement('div', { className: 'edrv-rules-editor' },\n React.createElement('div', { className: 'edrv-rules-editor-head' },\n React.createElement('span', { className: 'edrv-rules-crumb', title: crumb }, crumb),\n React.createElement('button', { className: 'edrv-rules-act', title: '取消', onClick: props.onCancel }, '✕')),\n React.createElement('div', { className: 'edrv-rules-editor-ctl' },\n React.createElement('label', { className: 'edrv-rules-ctl-label' }, '规则类型'),\n React.createElement('select', { className: 'edrv-rules-select', value: form.fmType, onChange: props.onType },\n Object.keys(TYPE_LABEL).map((key) => React.createElement('option', { key, value: key }, TYPE_LABEL[key]))),\n React.createElement('label', { className: 'edrv-rules-ctl-label' }, '描述'),\n React.createElement('input', {\n className: 'edrv-rules-input edrv-rules-desc-input', value: form.desc, spellCheck: false,\n placeholder: isNew ? '规则用途说明(写入 frontmatter description)' : '规则用途说明', onChange: props.onDesc,\n })),\n form.fmType === 'auto' ? React.createElement('div', { className: 'edrv-rules-editor-ctl' },\n React.createElement('label', { className: 'edrv-rules-ctl-label' }, 'globs'),\n React.createElement('input', {\n className: 'edrv-rules-input', value: form.globs, spellCheck: false,\n placeholder: 'src/**/*.ts, *.md(逗号分隔,命中才注入)', onChange: props.onGlobs,\n })) : null,\n React.createElement('textarea', {\n className: 'edrv-rules-body', spellCheck: false,\n value: form.content,\n onChange: props.onBody,\n }),\n React.createElement('div', { className: 'edrv-rules-editor-hint' },\n '类型/描述/globs 与 frontmatter 双向同步;enabled 与其余键原样保留;无 frontmatter 的纯 markdown 视为「手动」规则'),\n form.error ? React.createElement('div', { className: 'edrv-rules-err' }, form.error) : null,\n React.createElement('div', { className: 'edrv-rules-editor-foot' },\n React.createElement('button', { className: 'edrv-rules-save', disabled: form.saving, onClick: props.onSave }, form.saving ? '保存中…' : '保存')))\n}\n// --endregion\n\n/**\n * 规则面板主体。\n * @param props.ctx 面板共享上下文(notify 可选)\n */\nexport function RulesPanel(props) {\n const ctx = props?.ctx\n const notify = ctx?.notify ?? ((message) => {})\n // 当前会话工作区(EditorView 从 sessions 快照注入;项目 Tab 自动匹配,不提供手动切换)\n const cwd = ctx?.cwd ?? null\n const [tab, setTab] = React.useState(() => (readLocal(CACHE_KEY.rules + 'tab') === 'project' ? 'project' : 'user'))\n const [data, setData] = React.useState(null) // { user: RuleInfo[], projects: RuleProject[] }\n const [error, setError] = React.useState('')\n const panelRef = React.useRef(null)\n const [panelW, setPanelW] = React.useState(0) // 面板内容宽度(ResizeObserver 跟踪;0=未测得)\n const [form, setForm] = React.useState(null) // 编辑器表单状态;null=列表态\n const mountedRef = React.useRef(true)\n\n /**\n * 当前工作区对应的项目聚合(按 ctx.cwd 自动匹配;无会话/未注册返回 null)。\n * @returns RuleProject 或 null\n */\n const activeProject = () => {\n if (!cwd) return null\n return (data?.projects ?? []).find((p) => p.workspacePath === cwd) ?? null\n }\n\n /** 拉取规则总列表(rules.list)。 */\n const load = () => {\n rpc('rules.list', {}).then((res) => {\n if (!mountedRef.current) return\n if (res && res.ok) { setData(res); setError('') } else setError(res?.error ?? '读取规则失败')\n }).catch((e) => { if (mountedRef.current) setError('读取规则异常: ' + String(e)) })\n }\n\n React.useEffect(() => {\n mountedRef.current = true\n load()\n return () => { mountedRef.current = false }\n }, [])\n\n // 面板宽度跟踪:描述字数上限与窄面板模式都随宽度动态变化\n React.useEffect(() => {\n const el = panelRef.current\n if (!el || typeof ResizeObserver === 'undefined') return undefined\n const observer = new ResizeObserver(() => setPanelW(el.clientWidth))\n observer.observe(el)\n setPanelW(el.clientWidth)\n return () => observer.disconnect()\n }, [])\n\n // 描述字数上限与窄面板模式(未测得宽度前用基础上限/完整展示)\n const descCap = panelW > 0 ? descCapOf(panelW) : DESC_MAX\n const narrow = panelW > 0 && panelW < NARROW_W\n\n /**\n * 切换 Tab(记忆到 localStorage)。\n * @param next 目标 Tab\n */\n const switchTab = (next) => {\n setTab(next)\n writeLocal(CACHE_KEY.rules + 'tab', next)\n }\n\n /**\n * 打开新建表单(按当前 Tab 决定作用域;项目规则跟随当前会话工作区)。\n */\n const openNew = () => {\n const scope = tab === 'project' ? 'project' : 'user'\n if (scope === 'project' && !cwd) { notify('当前会话没有工作区,无法新建项目规则'); return }\n const parsed = parseRuleFm(NEW_TEMPLATE)\n setForm({\n mode: 'new', scope, workspacePath: scope === 'project' ? cwd : undefined,\n relHint: scope === 'project' ? '.dsh/rules/' : 'rules/', file: '', content: NEW_TEMPLATE,\n fmType: parsed.type, desc: parsed.description, globs: parsed.globs.join(', '), error: '', saving: false,\n })\n }\n\n /**\n * 打开编辑表单:先拉全文,再解析 frontmatter 回填类型/描述/globs 控件。\n * @param rule 目标规则\n */\n const openEdit = (rule) => {\n rpc('rules.read', { scope: rule.scope, workspacePath: rule.scope === 'project' ? rule.workspacePath : undefined, file: rule.file })\n .then((res) => {\n if (!res || !res.ok) { notify(res?.error ?? '读取规则失败'); return }\n const parsed = parseRuleFm(res.content)\n setForm({\n mode: 'edit', scope: rule.scope, workspacePath: rule.workspacePath, relHint: rule.relHint,\n file: rule.file, content: res.content,\n fmType: parsed.type, desc: parsed.description, globs: parsed.globs.join(', '), error: '', saving: false,\n })\n }).catch((e) => notify('读取规则异常: ' + String(e)))\n }\n\n /** 类型下拉变更:frontmatter 按新类型重写,控件同步。 */\n const onTypeChange = (e) => {\n const nextType = e.target.value\n setForm((prev) => ({ ...prev, fmType: nextType, content: rebuildContent(prev.content, nextType, prev.desc, prev.globs), error: '' }))\n }\n\n /** 描述输入变更:同步 frontmatter description 行。 */\n const onDescChange = (e) => {\n const nextDesc = e.target.value\n setForm((prev) => ({ ...prev, desc: nextDesc, content: rebuildContent(prev.content, prev.fmType, nextDesc, prev.globs), error: '' }))\n }\n\n /** globs 输入变更(自动规则):同步 frontmatter globs 行。 */\n const onGlobsChange = (e) => {\n const nextGlobs = e.target.value\n setForm((prev) => ({ ...prev, globs: nextGlobs, content: rebuildContent(prev.content, prev.fmType, prev.desc, nextGlobs), error: '' }))\n }\n\n /** 文本域直接编辑:回读 frontmatter,同步类型/描述/globs 控件(文本域是唯一真源)。 */\n const onBodyChange = (e) => {\n const parsed = parseRuleFm(e.target.value)\n setForm((prev) => ({ ...prev, content: e.target.value, fmType: parsed.type, desc: parsed.description, globs: parsed.globs.join(', ') }))\n }\n\n /** 保存表单(rules.save;文件名非空 + 自动规则必须有 globs)。 */\n const saveForm = () => {\n const next = { ...form, saving: true, error: '' }\n const file = String(form.file ?? '').trim()\n if (!file) { setForm({ ...next, saving: false, error: '文件名不能为空' }); return }\n if (form.fmType === 'auto' && globList(form.globs).length === 0) { setForm({ ...next, saving: false, error: '自动规则需要至少一个 glob(逗号分隔)' }); return }\n setForm(next)\n rpc('rules.save', { scope: form.scope, workspacePath: form.workspacePath, file, content: form.content })\n .then((res) => {\n if (res && res.ok) {\n setForm(null)\n notify('规则已保存:' + file)\n load()\n } else setForm((prev) => ({ ...prev, saving: false, error: res?.error ?? '保存失败' }))\n }).catch((e) => setForm((prev) => ({ ...prev, saving: false, error: '保存异常: ' + String(e) })))\n }\n\n /**\n * 删除规则(confirm 后走 rules.remove)。\n * @param rule 目标规则\n */\n const removeRule = (rule) => {\n if (!window.confirm('删除规则 ' + rule.file + '?(不可恢复)')) return\n rpc('rules.remove', { scope: rule.scope, workspacePath: rule.workspacePath, file: rule.file })\n .then((res) => {\n if (res && res.ok) { notify('已删除:' + rule.file); load() } else notify(res?.error ?? '删除失败')\n }).catch((e) => notify('删除异常: ' + String(e)))\n }\n\n /**\n * 切换启用开关:本地乐观翻转(按 workspacePath+file 定位,失败回滚)。\n * @param rule 目标规则(project 已注入 workspacePath)\n */\n const toggleRule = (rule) => {\n const enabled = !rule.enabled\n const applyLocal = (on) => setData((prev) => prev ? {\n ...prev,\n user: prev.user.map((r) => (r.scope === 'user' && r.file === rule.file ? { ...r, enabled: on } : r)),\n projects: prev.projects.map((p) => (p.workspacePath === rule.workspacePath\n ? { ...p, rules: p.rules.map((r) => (r.file === rule.file ? { ...r, enabled: on } : r)) }\n : p)),\n } : prev)\n applyLocal(enabled)\n rpc('rules.toggle', { scope: rule.scope, workspacePath: rule.workspacePath, file: rule.file, enabled })\n .then((res) => {\n if (res && res.ok) { applyLocal(res.rule?.enabled === true); notify(res.rule?.enabled === false ? '已停用:' + rule.file : '已启用:' + rule.file) }\n else { applyLocal(!enabled); notify(res?.error ?? '切换失败') }\n }).catch((e) => { applyLocal(!enabled); notify('切换异常: ' + String(e)) })\n }\n\n /** 当前列表数据(按 Tab 取用户规则或当前工作区的项目规则)。 */\n const rowsOf = () => {\n if (!data) return []\n if (tab === 'user') return data.user\n return activeProject()?.rules ?? []\n }\n\n const renderTabs = () => React.createElement('div', { className: 'edrv-rules-tabs' },\n React.createElement('button', { className: 'edrv-rules-tab' + (tab === 'user' ? ' on' : ''), onClick: () => switchTab('user') }, '用户规则'),\n React.createElement('button', { className: 'edrv-rules-tab' + (tab === 'project' ? ' on' : ''), onClick: () => switchTab('project') }, '项目规则'),\n React.createElement('button', { className: 'edrv-rules-new', title: '新建规则', onClick: openNew }, '+ 新建规则'))\n\n /** 项目 Tab 的工作区展示(不可编辑,自动跟随当前会话)。 */\n const renderWsLine = () => {\n if (tab !== 'project') return null\n return React.createElement('div', { className: 'edrv-rules-ws-line', title: cwd ?? '' },\n '工作区:' + (cwd ?? '当前会话未打开工作区'))\n }\n\n const renderEmpty = () => {\n if (tab === 'project') {\n if (!cwd) return '当前会话没有工作区,项目规则不可用(项目规则跟随会话所在工作区)'\n if (!data?.projects?.length) return '当前 DSH 没有已注册的工作区;在目标工作区打开一次会话后再来管理'\n if (!activeProject()) return '当前工作区未注册为 DSH workspace,暂不能管理其项目规则'\n return '<工作区>/.dsh/rules/ 还没有规则,点击「+ 新建规则」创建'\n }\n return '还没有用户规则(~/.dsh/rules/),点击「+ 新建规则」创建'\n }\n\n const renderBody = () => {\n if (form) {\n return React.createElement(RuleEditor, {\n form, onType: onTypeChange, onDesc: onDescChange, onGlobs: onGlobsChange, onBody: onBodyChange,\n onSave: saveForm, onCancel: () => setForm(null),\n })\n }\n if (!data) return React.createElement('div', { className: 'edrv-rules-empty' }, '加载中…')\n if (error) return React.createElement('div', { className: 'edrv-rules-err' }, error)\n const rows = rowsOf()\n if (!rows.length) return React.createElement('div', { className: 'edrv-rules-empty' }, renderEmpty())\n const common = {\n descCap,\n narrow,\n onEdit: (rule) => openEdit({ ...rule, workspacePath: rule.scope === 'project' ? cwd : undefined }),\n onRemove: (rule) => removeRule({ ...rule, workspacePath: rule.scope === 'project' ? cwd : undefined }),\n onToggle: (rule) => toggleRule({ ...rule, workspacePath: rule.scope === 'project' ? cwd : undefined }),\n }\n return React.createElement('div', { className: 'edrv-rules-list' },\n rows.map((rule) => React.createElement(RuleRow, { key: rule.scope + ':' + rule.file, rule, ...common })))\n }\n\n return React.createElement('div', { className: 'edrv-rules-panel', ref: panelRef },\n renderTabs(),\n renderWsLine(),\n React.createElement('div', { className: 'edrv-rules-hint' },\n tab === 'user' ? '用户规则对所有会话生效(存放于 ~/.dsh/rules/)' : '项目规则仅对所在工作区的会话生效(存放于 <工作区>/.dsh/rules/)'),\n renderBody())\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏面板定义(文件管理 + 搜索 + 规则)。\n * 作者 ddj 2026-08-26 / 2026-09-03\n */\nimport React from 'react'\nimport { FileExplorer } from './FileExplorer.js'\nimport { SearchPanel } from './SearchPanel.js'\nimport { RulesPanel } from './RulesPanel.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/**\n * 构造规则管理面板定义(Codebuddy 规则形态:用户规则/项目规则双 Tab + 开关)。\n * @author ddj 2026年09月03号\n * @returns 面板定义(无徽标;活动栏图标 📏,与大纲 📜 区分)\n */\nexport function createRulesPanel(): SidebarPanelDef {\n return {\n id: 'rules',\n title: '规则',\n icon: '📏',\n order: 20,\n render: (ctx: SidebarCtx) => React.createElement(RulesPanel, { ctx }),\n }\n}\n","/**\n * dsh-vscode-mode client — 文件管理右键菜单内置项。\n * 内置项:「在文件浏览器中打开」(文件→OS Explorer 定位选中、目录→打开目录);\n * 「添加引用到对话」(文件/文件夹引用注入当前会话对话输入框)。\n * 反馈统一走 ctx.notify(由 EditorView 提供,落到编辑区路径栏状态)。\n * 作者 ddj 2026-08-27 / 2026-09-03\n */\nimport { revealInExplorer } from '../fileReveal.js'\nimport { statusOfAdd } from '../addToConversation.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 id: 'add-to-conversation',\n label: '添加引用到对话',\n order: 1,\n // 排除根目录空白区(path==='' 无意义)、无会话、动作集缺失时隐藏\n visible: (target, ctx) => Boolean(target.path && ctx.sessionId && ctx.addToConversation),\n run: (target, ctx) => {\n const isDir = target.type === 'directory'\n const add = ctx.addToConversation\n if (!add) {\n ctx.notify?.('添加到对话不可用')\n return\n }\n const okText = isDir ? '已添加文件夹引用' : '已添加文件引用'\n void add.appendReference(ctx.sessionId, target.path, undefined, isDir ? 'folder' : 'file').then((outcome) => {\n ctx.notify?.(statusOfAdd(outcome, okText))\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 * 挂点:官方右侧 Sidebar「文件编辑」Tab(DSH 0.1.5+,对话+编辑同屏)> betterSidebar Tab\n * (归档,仅旧版 DSH 回退)> 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, officialSidebarOpener, shouldClaimFiles, type FileOpenContext } from './fileOpeners.js'\nimport type { FileOpenerRegistry } from './fileOpeners.js'\nimport { installOpenPathRouter, vscodeOpener, autoValue } from './openPathRouter.js'\nimport { patchRemoteOpen, probeRemoteOpen } from './remoteOpenRouter.js'\nimport { setupExtOpen } from './externalOpen.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 { detectOfficial, installOfficial, registerOfficialFileClaim, OFFICIAL_TAB_KIND, OFFICIAL_TAB_TITLE, isEditorTabActive, restoreEditorTab } from './officialSidebar.js'\nimport { SideEditorTab } from './ui/SideEditorTab.js'\nimport { OfficialSideTab } from './ui/OfficialSideTab.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 { createRulesPanel } 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 { sidebarMinApply } from './sidebarMin.js'\nimport { log } from './log.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 // 外部深链落地:Windows 右键菜单 / Unity 外部编辑器 → 浏览器 URL 参数 → 打开规则路由\n setupExtOpen(ctx)\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 // 会话切换 → 编辑 Tab 跨会话自动恢复:上一会话编辑区激活时,新会话自动展开并激活\n //(官方停靠面按会话隔离,新会话默认收起;先试 openTabIn 直写新会话面,未 adopt 走有界重试)。\n // 注意:首次打开某会话时通知早于 current 字段落定,故通知只调度延迟任务,执行时再读最新快照\n if (monacoList && typeof monacoList.subscribe === 'function') {\n const list = monacoList as { getSnapshot: () => { current?: string }; subscribe: (listener: () => void) => () => void }\n ctx.effect(() => {\n let lastCurrent = list.getSnapshot?.()?.current\n const check = () => {\n const current = list.getSnapshot?.()?.current\n if (!current || current === lastCurrent) return\n lastCurrent = current\n if (!isEditorTabActive() || officialService === undefined) return\n try { officialService.service.openTabIn?.(current, OFFICIAL_TAB_KIND, {}) } catch { /* 未 adopt 等 seat 就绪走重试 */ }\n restoreEditorTab(officialService.service, schedule)\n }\n return list.subscribe(() => schedule(check, 0))\n }, 'vscode-mode: editor tab restore')\n }\n const originalOpenPath = workspaces?.openPath\n const binder = pickSettingsBinder(ctx)\n const settings = binder.scope\n let selected = autoValue('auto')\n /** 0.1.3+ 会话文件链接路由(remote.session.openWorkspacePath)是否已安装(compatSummary 展示用)。 */\n let remoteOpenInstalled = false\n /** 两条文件链接路由共用的路由日志(openPathRouter / remoteOpenRouter;统一走插件日志器)。 */\n const routeLogger = (message: string): void => log.warn(message)\n /** 两条路由共用的 FileOpenContext:当前会话 id 与工作区 cwd。 */\n const openContext = (): FileOpenContext => {\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 /** 可选探测 betterSidebar 服务(不进 inject:缺失会让插件停靠等待,杀死回退路径)。 */\n let sideService = detectSidebarService(ctx)\n /** 可选探测官方右侧 Sidebar(DSH 0.1.5-alpha.1+;探测命中 ≡ 版本判定,不进 inject 同上)。 */\n let officialService = detectOfficial(ctx)\n /** 官方 file 地址认领的当前注销器(null=未认领;由 syncFileClaim 依设置值切换)。 */\n let claimDisposer: (() => void) | null = null\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 打开器优先,失败回退系统打开(0.1.2 及更早 DSH 的对话文件链接主路径)' },\n { name: '会话文件链接路由(remote.session.openWorkspacePath)', active: remoteOpenInstalled, note: '0.1.3+ 对话文件引用/产物打开优先走插件打开器,失败回退系统打开' },\n { name: '侧边栏打开器(' + SIDEBAR_PLUGIN + ')', active: registry.get(SIDEBAR_PLUGIN) !== undefined, note: registry.get(SIDEBAR_PLUGIN) !== undefined ? '已注册(优先级 80)' : '未检测到侧边栏打开能力' },\n { name: '侧边栏编辑区(官方 Sidebar)', active: officialService !== undefined, note: officialService !== undefined ? '编辑区=官方右侧 Sidebar Tab(对话+编辑同屏,DSH 0.1.5+)' : '官方侧边栏服务未探测到(DSH < 0.1.5-alpha.1 时属预期)' },\n { name: '侧边栏编辑区(' + SIDEBAR_PLUGIN + ',归档)', active: sideService !== undefined, note: sideService !== undefined ? '编辑区=侧边栏 Tab(旧版 DSH 回退形态)' : '未检测到;DSH ≥ 0.1.5 优先官方侧边栏,旧版可安装(' + SIDEBAR_INSTALL_CMD + ')' },\n { name: '文件链接官方认领(dsh-resource://file)', active: claimDisposer !== null, note: claimDisposer !== null ? '聊天文件链接由本插件编辑器接管(官方侧边栏内打开)' : '链接走官方查看器或旧版路由(未认领)' },\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 // 规则面板:活动栏「规则」页签(Codebuddy 规则管理形态:用户/项目规则 + 启用开关,host 注入生效)\n ctx.effect(() => sidebarPanels.register(createRulesPanel()), 'vscode-mode: sidebar panel rules')\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 // 官方侧边栏正文组件装配(页类型与 file 认领两类 Tab 共用同一 EditorView 形态)\n const officialRenderTab = (props: Record<string, unknown>) => React.createElement(OfficialSideTab, Object.assign({}, props, { schedule, addToConversation, sidebarPanels, outlineSources, fileMenuItems, sessions }))\n /** 官方 file 地址认领同步:自动/VSCodeMode 档认领(链接进本插件编辑器),其余交官方查看器。 */\n const syncFileClaim = (): void => {\n const official = officialService\n const want = official !== undefined && shouldClaimFiles(selected)\n if (want && claimDisposer === null && official) {\n const disposer = registerOfficialFileClaim({ tabs: official.tabs, slots: ctx.slots, renderTab: officialRenderTab })\n if (disposer !== null) claimDisposer = ctx.effect(() => disposer, 'vscode-mode: official file claim')\n return\n }\n if (!want && claimDisposer !== null) {\n claimDisposer()\n claimDisposer = null\n }\n }\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 syncFileClaim()\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 // 同一订阅里顺带同步侧边栏最小宽度(sidebarMinWidth)→ 派发 edrv:sidebar-min-width 通知编辑器重夹\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 const minW = sidebarMinApply(snapshot.value?.sidebarMinWidth)\n window.dispatchEvent(new CustomEvent('edrv:sidebar-min-width', { detail: { value: minW } }))\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: openContext,\n logger: routeLogger,\n }), 'vscode-mode: file link routing')\n }\n // 0.1.3+ 会话文件链接主路径:dsh-client-ui-chat 的 openFile 直接调\n // remote.session.openWorkspacePath(session/openWorkspacePath RPC),绕开\n // workspaces.openPath;该 namespace 由 api-remotes 在 loader.await 后挂载,\n // 晚于本插件 apply,且旧版 DSH 可能整段不存在——不加 inject(避免旧版停等\n // 永不激活),改为定时探测有界重试(与侧栏服务探测同款节奏)。\n let remoteRetries = 0\n const retryRemoteOpen = (): void => {\n if (remoteOpenInstalled || remoteRetries >= 15) {\n if (!remoteOpenInstalled) log.warn('未探测到 remote.session.openWorkspacePath,0.1.3+ 会话文件链接路由未安装')\n return\n }\n remoteRetries += 1\n schedule(() => {\n if (remoteOpenInstalled) return\n const service = probeRemoteOpen(ctx)\n if (!service) {\n retryRemoteOpen()\n return\n }\n const disposer = patchRemoteOpen(service, { registry, selected: () => selected, context: openContext, logger: routeLogger })\n if (!disposer) {\n log.warn('remote.session 存在但 openWorkspacePath 不可补丁,会话文件链接路由未安装')\n return\n }\n remoteOpenInstalled = true\n ctx.effect(() => disposer, 'vscode-mode: remote file link routing')\n log.info('已安装 0.1.3+ 会话文件链接路由(remote.session.openWorkspacePath)')\n }, 2000)\n }\n retryRemoteOpen()\n\n // 中央「文件编辑」页签(旧形态回退):类 VSCode 编辑器;侧边栏形态(官方/better-sidebar)可用时\n // 编辑器住侧边栏 Tab,本页签不注册(避免双实例: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, sessions })))\n }\n\n // 侧边栏三形态互斥切换:官方(DSH 0.1.5+)> better-sidebar(归档,仅旧版回退)> 中央页签。\n // officialDisposer / sideDisposer / legacyDisposer 任一时刻只保留其一(避免双实例 Monaco 抢占)。\n // ⚠️ 两个可选服务都可能晚于本插件就绪(better-sidebar bundle 1MB+ 后加载;官方服务旧 DSH\n // 不存在),一次性探测会误报——故启动后按 2s 间隔重试(窗口 ~30s):每 tick 先探官方再探\n // better-sidebar;better-sidebar 先命中而官方后到时自动切换(官方优先),窗口结束仍未命中\n // 则保持中央页签回退。\n let officialDisposer: (() => void) | null = null\n let sideDisposer: (() => void) | null = null\n let legacyDisposer: (() => void) | null = null\n const installOfficialForm = (): void => {\n const official = officialService\n if (officialDisposer !== null || !official) return\n if (sideDisposer !== null) { sideDisposer(); sideDisposer = null }\n if (legacyDisposer !== null) { legacyDisposer(); legacyDisposer = null }\n const outcome = installOfficial({\n tabs: official.tabs,\n service: official.service,\n slots: ctx.slots,\n renderTab: officialRenderTab,\n guide: {\n title: () => OFFICIAL_TAB_TITLE,\n description: () => 'Monaco 文件编辑器:对话与编辑同屏(差异审查/跳转/大纲)',\n },\n })\n if (outcome === null) {\n // 官方类型注册失败(API 变更等):撤下官方标记,回退旧形态链\n officialService = undefined\n applySideForm()\n return\n }\n officialDisposer = ctx.effect(() => outcome, 'vscode-mode: official sidebar editor tab')\n // 官方打开器(下拉「官方侧边栏」选项,动态出现;openResource 能力缺失时跳过)+ 按当前设置同步 file 地址认领\n if (typeof official.service.openResource === 'function') {\n ctx.effect(() => registry.register(officialSidebarOpener(official.service)), 'vscode-mode: official sidebar opener')\n }\n syncFileClaim()\n }\n const applySideForm = (): void => {\n if (officialService) {\n installOfficialForm()\n return\n }\n if (sideService) {\n if (sideDisposer !== null) return\n if (officialDisposer !== null) { officialDisposer(); officialDisposer = null }\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, sessions })),\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 return\n }\n if (legacyDisposer !== null) return\n if (officialDisposer !== null) { officialDisposer(); officialDisposer = null }\n if (sideDisposer !== null) { sideDisposer(); sideDisposer = null }\n setEnsureSideEditor(null)\n legacyDisposer = registerLegacyTab()\n }\n applySideForm()\n let sideRetries = 0\n const retrySideService = (): void => {\n if (officialService !== undefined || sideRetries >= 15) return\n sideRetries += 1\n schedule(() => {\n if (officialService !== undefined) return\n officialService = detectOfficial(ctx)\n if (officialService !== undefined) {\n log.info('检测到官方右侧 Sidebar(DSH 0.1.5+),切换官方侧边栏编辑形态')\n applySideForm()\n return\n }\n if (sideService === undefined) {\n sideService = detectSidebarService(ctx)\n if (sideService !== undefined) {\n log.info('检测到 ' + SIDEBAR_PLUGIN + ',切换侧边栏编辑形态(官方未探测到,后续仍优先官方)')\n applySideForm()\n }\n }\n retrySideService()\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","orderOf","isAvailable","listeners","React","createPortal","React","React","KEY_PREFIX","registered","CACHE_TTL_MS","DEBOUNCE_MS","React","React","React","React","React","markEditorActive","React","React","React","React","React","React","React","React","createRoot","React","React","React","React","createPortal","KEY_PREFIX","IconFolderOpen16","IconFolderClose16","React","FileTypeIcon","classifyFileType","IconRefreshOutline16","React","React","IconFolderOpenOutline16","React","IconSearchOutline16","IconListPenOutline16","React","IconCodeOutline16","React","React"],"sources":["../src/shared/rpc.ts","../src/client/rpc.ts","../src/shared/logger.ts","../src/client/log.ts","../src/client/sidebarBridge.ts","../src/client/events.ts","../src/client/monaco/theme.ts","../src/client/monaco/loader.ts","../src/client/imagePreview.ts","../src/client/pdfPreview.ts","../src/client/pdf/pdfLoader.ts","../src/client/pdf/pdfPanel.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/editorModelState.ts","../src/client/ui/commandCatalog.ts","../src/client/keybindings.ts","../src/client/ui/QuickOpen.ts","../src/client/commandGlobals.ts","../src/client/commandSearch.ts","../src/client/commandRegistry.ts","../src/client/commandPaletteStore.ts","../src/client/ui/CommandPalette.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/client/state/scopeStore.ts","../src/client/state/modelCache.ts","../src/client/sidebarMin.ts","../src/client/navHistory.ts","../src/client/addToConversation.ts","../src/shared/lsp.ts","../src/client/monaco/lsp/lspClient.ts","../src/client/monaco/lsp/providers.ts","../src/client/monaco/lsp/underline.ts","../src/client/monaco/lsp/index.ts","../src/shared/ai.ts","../src/client/ai/inlineProvider.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/officialSidebar.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/IntegrationSettings.ts","../src/client/ui/AiSettings.ts","../src/client/ui/McpSettings.ts","../src/client/openPathRouter.ts","../src/client/remoteOpenRouter.ts","../src/shared/externalOpen.ts","../src/client/chooseDialog.ts","../src/client/openFlow.ts","../src/client/externalOpen.ts","../src/client/ui/SideEditorTab.ts","../src/client/ui/OfficialSideTab.ts","../src/client/ui/ClaimRouter.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/rulesMdc.ts","../src/client/sidebar/panels/RulesPanel.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/commandBridge.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 { ShellIntegrationStatus, UnityListPayload, UnityProjectEntry } from './integration.js'\nimport type { RuleInfo, RuleProject, RuleRefInput, RuleSaveInput } from './rules.js'\nimport type { LspEnvInstallState, LspExtInfo, LspExtUpdate, LspHover, LspLocation, LspMarketItem, LspPosition, LspSemanticTokens, LspServerStatus, LspSymbol } from './lsp.js'\nimport type { AiConfigPatch, AiConfigView, AiDirectoryView, AiInlineRequest, AiInlineResult } from './ai.js'\n\n/** webServer 精确路由。 */\nexport const RPC_PATH = '/edrv/rpc'\n\n/**\n * 图片扩展名(小写、无点)→ MIME。edrv.read base64 响应与 client 图片预览共用,\n * 收敛在此避免 host/client 两处漂移。\n * @author ddj 2026年09月08号\n */\nexport const IMAGE_MIME: Record<string, string> = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n ico: 'image/x-icon',\n avif: 'image/avif',\n svg: 'image/svg+xml',\n}\n\n/**\n * 路径 → 图片 MIME:按 basename 扩展名小写查 {@link IMAGE_MIME},未命中回退 application/octet-stream。\n * @author ddj 2026年09月08号\n * @param path 文件路径(`/` 或 `\\` 分隔均可)\n * @returns MIME 字符串\n */\nexport function imageMimeOf(path: string): string {\n const base = String(path || '').split(/[\\\\/]/).pop() || ''\n const dot = base.lastIndexOf('.')\n const ext = dot > 0 ? base.slice(dot + 1).toLowerCase() : ''\n return IMAGE_MIME[ext] ?? 'application/octet-stream'\n}\n\n/** PDF 统一 MIME(host base64 响应与 client PDF 面板同源,避免两处漂移)。 */\nexport const PDF_MIME = 'application/pdf'\n\n/**\n * 路径 → 二进制预览 MIME:PDF 特判 {@link PDF_MIME},其余走图片表回退 octet-stream。\n * @author ddj 2026年09月22号\n * @param path 文件路径(`/` 或 `\\` 分隔均可)\n * @returns MIME 字符串\n */\nexport function binaryMimeOf(path: string): string {\n const base = String(path || '').split(/[\\\\/]/).pop() || ''\n const dot = base.lastIndexOf('.')\n if (dot > 0 && base.slice(dot + 1).toLowerCase() === 'pdf') return PDF_MIME\n return imageMimeOf(path)\n}\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; encoding?: 'base64' }\n 'edrv.original': { sessionId?: string; path: string }\n 'edrv.save': { sessionId?: string; path: string; content: string }\n 'edrv.saveBinary': { sessionId?: string; path: string; content: string; encoding: 'base64' }\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; integrationBaseUrl?: string; expectedRevision?: number }\n 'edrv.integration.status': {}\n 'edrv.integration.register': {}\n 'edrv.integration.unregister': {}\n 'edrv.unity.list': {}\n 'edrv.unity.add': { path: string }\n 'edrv.unity.remove': { path: string }\n 'edrv.unity.install': { path: string }\n 'edrv.externalStat': { path: string }\n 'edrv.external.handoff': { paths: string[]; line?: number; column?: number }\n 'edrv.external.pending': {}\n 'edrv.external.pendingState': { token: string; take?: boolean }\n 'vscode.devFormGet': {}\n 'vscode.devFormSet': { enabled: boolean; path?: string }\n 'compat': {}\n 'edrv.lsp.status': { sessionId?: string }\n 'edrv.lsp.detect': {}\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.envInstall': { languageId: string; id: string }\n 'edrv.lsp.envState': {}\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.ai.inline': AiInlineRequest\n 'edrv.ai.models': { force?: boolean }\n 'edrv.ai.configGet': {}\n 'edrv.ai.configUpdate': AiConfigPatch\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 'rules.list': {}\n 'rules.read': RuleRefInput\n 'rules.save': RuleSaveInput\n 'rules.remove': RuleRefInput\n 'rules.toggle': RuleRefInput & { enabled: boolean }\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; encoding?: 'base64'; mime?: string }\n 'edrv.original': { content: string; size: number; stale: StaleHunk[]; fallback: boolean }\n 'edrv.save': object\n 'edrv.saveBinary': 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; integrationBaseUrl: string; revision?: number }\n 'vscode.fileOpenSettingsUpdate': { fileOpenTool: string; integrationBaseUrl: string; revision?: number }\n 'edrv.integration.status': ShellIntegrationStatus\n 'edrv.integration.register': ShellIntegrationStatus\n 'edrv.integration.unregister': ShellIntegrationStatus\n 'edrv.unity.list': UnityListPayload\n 'edrv.unity.add': { project: UnityProjectEntry }\n 'edrv.unity.remove': object\n 'edrv.unity.install': { project: UnityProjectEntry }\n 'edrv.externalStat': { kind: 'file' | 'directory' | 'missing' }\n 'edrv.external.handoff': { clients: number; token: string }\n 'edrv.external.pending': { open: { paths: string[]; line?: number; column?: number } | null }\n 'edrv.external.pendingState': { delivered: boolean }\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.detect': { 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.envInstall': { started: boolean }\n 'edrv.lsp.envState': { states: LspEnvInstallState[] }\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.ai.inline': AiInlineResult\n 'edrv.ai.models': AiDirectoryView\n 'edrv.ai.configGet': AiConfigView\n 'edrv.ai.configUpdate': AiConfigView\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 'rules.list': { user: RuleInfo[]; projects: RuleProject[] }\n 'rules.read': { content: string }\n 'rules.save': { rule: RuleInfo }\n 'rules.remove': object\n 'rules.toggle': { rule: RuleInfo }\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 — 统一日志核心(双面共享,平台中立)。\n * 输出规范:\n * - 格式:`[dsh-vscode-mode][:scope] 消息`;前缀只在模块内部拼接,业务代码禁止手写前缀\n * - 级别语义:debug=诊断明细 / info=装配与路由里程碑 / warn=降级与兼容回退 / error=失败\n * - 出口:host 面经 bindHostLog(ctx) 绑定 ctx.logger(缺失回退 console);client 面固定 console\n * - 诊断文件通道(edrv.debug → ~/.dsh/dsh-vscode-mode/logs/)见 debugLog.ts,与本模块前缀共用\n * 新增日志一律 `import { log } from '../log.js'`(client 为 './log.js')后调 log.debug/info/warn/error;\n * 子域日志用 log.child('scope'),禁止另起 console。\n * 作者 ddj 2026-09-08\n */\n\n/** 插件统一日志前缀(与包安装名一致)。 */\nexport const LOG_PREFIX = '[dsh-vscode-mode]'\n\n/** 日志级别(与 console 方法名对齐)。 */\nexport type LoggerLevel = 'debug' | 'info' | 'warn' | 'error'\n\n/** 日志出口:接收拼好前缀的整行(host 面接 ctx.logger,client 面接 console)。 */\nexport type LoggerSink = (level: LoggerLevel, line: string) => void\n\n/** 默认级别到 console 方法名的映射。 */\nconst CONSOLE_METHODS: Record<LoggerLevel, string> = { debug: 'debug', info: 'info', warn: 'warn', error: 'error' }\n\n/**\n * 默认出口:console(级别直映方法;方法缺失时静默丢弃,不抛错)。\n * @author ddj 2026年09月08号\n * @returns console 出口\n */\nexport function consoleSink(): LoggerSink {\n return (level, line) => {\n const emit = (console as unknown as Record<string, unknown>)[CONSOLE_METHODS[level]]\n if (typeof emit === 'function') (emit as (message: string) => void).call(console, line)\n }\n}\n\n/**\n * DSH host 出口工厂:转接 ctx.logger(方法级可选调用,缺服务/缺方法回退 console)。\n * @author ddj 2026年09月08号\n * @param ctx DSH host 上下文\n * @returns 日志出口\n */\nexport function ctxLogSink(ctx: unknown): LoggerSink {\n const base = consoleSink()\n return (level, line) => {\n const logger = (ctx as { logger?: Record<string, unknown> } | null | undefined)?.logger\n const emit = logger?.[level]\n if (typeof emit === 'function') (emit as (message: string) => void).call(logger, line)\n else base(level, line)\n }\n}\n\n/**\n * 拼一行日志:`[dsh-vscode-mode][:scope] 消息`(scope 为空省略冒号段)。\n * @author ddj 2026年09月08号\n * @param scope 子域(可空)\n * @param message 消息文本\n * @returns 整行文本\n */\nexport function formatLine(scope: string, message: string): string {\n const text = String(message)\n return scope ? LOG_PREFIX + ':' + scope + ' ' + text : LOG_PREFIX + ' ' + text\n}\n\n/** 日志器实例(四级别统一入口 + 换出口/派生子域)。 */\nexport interface PluginLogger {\n debug(message: string): void\n info(message: string): void\n warn(message: string): void\n error(message: string): void\n /** 更换出口(同一实例树共享,host 装配期绑定 ctx.logger 用;client 单例不调用)。 */\n bind(sink: LoggerSink): void\n /** 派生带子域前缀的新实例(共享出口,如 log.child('debug') → `[dsh-vscode-mode:debug]`)。 */\n child(scope: string): PluginLogger\n}\n\n/** 实例树共享的出口状态(bind 换出口对整棵树生效)。 */\ninterface SinkState {\n sink: LoggerSink\n}\n\n/**\n * 日志器工厂(内部):emit 时读共享出口状态,保证父 bind 后子实例跟随。\n * @author ddj 2026年09月08号\n * @param state 共享出口状态\n * @param scope 子域文本(可空)\n * @returns 日志器\n */\nfunction makeLogger(state: SinkState, scope: string): PluginLogger {\n const emit = (level: LoggerLevel, message: string): void => state.sink(level, formatLine(scope, message))\n return {\n debug: (message) => emit('debug', message),\n info: (message) => emit('info', message),\n warn: (message) => emit('warn', message),\n error: (message) => emit('error', message),\n bind(next: LoggerSink): void {\n state.sink = next\n },\n child(next: string): PluginLogger {\n return makeLogger(state, scope ? scope + '.' + next : next)\n },\n }\n}\n\n/**\n * 创建插件日志器(默认 console 出口;host 面单例由 bindHostLog 换到 ctx.logger)。\n * @author ddj 2026年09月08号\n * @param sink 初始出口(缺省 console)\n * @param scope 初始子域(业务方一般经 child 派生,不直接传)\n * @returns 日志器\n */\nexport function createLogger(sink: LoggerSink = consoleSink(), scope = ''): PluginLogger {\n return makeLogger({ sink }, scope)\n}\n","/**\n * dsh-vscode-mode client — 日志单例(全 client 面唯一日志入口)。\n * client 无 ctx.logger 服务,固定 console 出口;格式/级别语义与 host 面一致(shared/logger.ts)。\n * 用法:`import { log } from './log.js'` → `log.debug/info/warn/error(msg)`;子域用 `log.child('scope')`。\n * 作者 ddj 2026-09-08\n */\nimport { createLogger } from '../shared/logger.js'\n\n/** client 面插件日志单例。 */\nexport const log = createLogger()\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'\nimport { log } from './log.js'\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 log.warn('侧栏编辑器打开失败(' + 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) { log.warn('回退注册失败(' + 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 log.warn('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 log.warn('侧边栏 Tab 注册失败(' + String(error) + ')')\n // 注册失败 = 侧栏形态不可用:立即回退中央页签,不接管打开路由\n if (!fallbackInstalled) {\n fallbackInstalled = true\n try { registerLegacyFallback() } catch (inner) { log.warn('回退注册失败(' + 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 主题:官方令牌跟随 + 现役双套回落。\n * 优先级:官方代码/UI 令牌(--shiki-* / --dsw-alias-*,DSH 0.1.5+ 主题体系,\n * 含第三方皮肤)→ edrv-dark / edrv-light 两套内置配色(旧版 DSH 或令牌缺失)。\n * 明暗判定:body[data-ds-dark-theme](官方)→ 根 data-theme(旧皮肤)→ prefers-color-scheme。\n * 作者 ddj 2026-08-28 / 2026-09-10\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-ds-dark-theme → 旧皮肤 data-theme → prefers-color-scheme → 暗)。\n * @author ddj 2026年08月28号 / 2026年09月10号\n * @returns 'dark' | 'light'\n */\nexport function detectColorScheme() {\n try {\n const official = document.body?.getAttribute?.('data-ds-dark-theme')\n if (official !== null && official !== undefined && official !== 'false') return 'dark'\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\n// --region 官方主题跟随(--shiki-* / --dsw-alias-* 令牌)\n\n/** 动态官方主题 id 前缀(每次应用带序号重建,保证 Monaco 感知重定义)。 */\nconst EDRV_OFFICIAL = 'edrv-official'\n\n/** 官方代码配色令牌 → Monaco 规则 token 前缀(粗粒度;未覆盖的规则保留现役语义分层)。 */\nconst RULE_TOKEN_MAP = [\n ['--shiki-token-comment', ['comment']],\n ['--shiki-token-keyword', ['keyword']],\n ['--shiki-token-string', ['string']],\n ['--shiki-token-string-expression', ['string.escape']],\n ['--shiki-token-constant', ['number', 'constant']],\n ['--shiki-token-function', ['function', 'method', 'member']],\n ['--shiki-token-parameter', ['parameter', 'variable.parameter']],\n ['--shiki-token-punctuation', ['delimiter', 'operator', 'punctuation']],\n ['--shiki-token-link', ['annotation', 'metatag']],\n]\n\n/**\n * 官方 UI 令牌 → Monaco 颜色键(每键给候选令牌,按序取首个可解析值)。\n * 依据运行态实测:--dsw-alias-* 定义在 body 上;--shiki-background/-foreground 未定义,\n * 故代码面底色用 markdown-code-block 近似;selection 不覆盖(沿用现役可见选框)。\n */\nconst COLOR_TOKEN_MAP = [\n [['--dsw-alias-markdown-code-block', '--dsw-alias-bg-layer-2'], ['editor.background', 'editorGutter.background', 'minimap.background']],\n [['--dsw-alias-label-primary', '--shiki-foreground'], ['editor.foreground']],\n [['--dsw-alias-bg-layer-1', '--dsw-alias-bg-layer-3'], ['editorWidget.background', 'editorHoverWidget.background']],\n [['--dsw-alias-label-tertiary'], ['editorLineNumber.foreground']],\n [['--dsw-alias-label-secondary'], ['editorLineNumber.activeForeground']],\n [['--dsw-alias-interactive-bg-hover'], ['editor.lineHighlightBackground', 'editor.inactiveSelectionBackground']],\n]\n\n/** 已应用的官方主题序号(模块级计数,保证主题 id 每次唯一)。 */\nlet officialSeq = 0\n\n/**\n * 读官方 CSS 变量(先 body 后文档根;未定义/空值/未解析 var() 返回 undefined)。\n * 依据运行态实测:DSH 的 --dsw-alias-* 定义在 body 上,仅 --shiki-token-* 在根。\n * @author ddj 2026年09月10号\n * @param name CSS 变量名(含 -- 前缀)\n * @returns 计算样式值,或 undefined\n */\nexport function readCssVar(name) {\n try {\n if (typeof window?.getComputedStyle !== 'function') return undefined\n const hosts = [document?.body, document?.documentElement]\n for (const host of hosts) {\n if (!host) continue\n const raw = window.getComputedStyle(host).getPropertyValue(name)\n const value = String(raw ?? '').trim()\n if (value && !value.startsWith('var(')) return value\n }\n return undefined\n } catch (error) {\n return undefined\n }\n}\n\n/**\n * 数值 → 两位十六进制(0-255 夹取)。\n * @author ddj 2026年09月10号\n * @param value 通道值\n * @returns 两位小写十六进制\n */\nfunction hex2(value) {\n const text = Math.max(0, Math.min(255, Math.round(Number(value) || 0))).toString(16)\n return text.length === 1 ? '0' + text : text\n}\n\n/**\n * CSS 颜色归一为 Monaco 可用值(#rgb/#rrggbb/#rrggbbaa 原样,rgb()/hsl() 转 hex,其余 undefined)。\n * @author ddj 2026年09月10号\n * @param value CSS 计算样式颜色值\n * @returns Monaco 颜色字符串,或 undefined(不可识别)\n */\nexport function toMonacoColor(value) {\n const text = String(value ?? '').trim().toLowerCase()\n if (!text || text.startsWith('var(')) return undefined\n if (/^#[0-9a-f]{3}$/.test(text)) return '#' + text.slice(1).split('').map((c) => c + c).join('')\n if (/^#[0-9a-f]{6}$/.test(text) || /^#[0-9a-f]{8}$/.test(text)) return text\n return channelColor(text)\n}\n\n/**\n * rgb()/rgba()/hsl()/hsla() → Monaco 颜色(兼容逗号与空格/斜杠两种参数语法)。\n * @author ddj 2026年09月10号\n * @param text 小写颜色文本\n * @returns Monaco 颜色,或 undefined(不可识别)\n */\nfunction channelColor(text) {\n const body = /^(?:rgba?|hsla?)\\(([^)]+)\\)$/.exec(text)?.[1]\n if (!body) return undefined\n const parts = body.split(/[\\s,/]+/).filter(Boolean)\n if (parts.length < 3) return undefined\n let channels\n if (text.startsWith('hsl')) {\n const h = Number(parts[0])\n const s = percentOf(parts[1])\n const l = percentOf(parts[2])\n if (![h, s, l].every(Number.isFinite)) return undefined\n channels = hslToRgb(h, s, l)\n } else {\n channels = parts.slice(0, 3).map(Number)\n }\n if (channels.some((n) => !Number.isFinite(n))) return undefined\n const alpha = parts.length > 3 ? alphaOf(parts[3]) : 1\n const tail = Number.isFinite(alpha) && alpha < 1 ? hex2(alpha * 255) : ''\n return '#' + channels.map(hex2).join('') + tail\n}\n\n/**\n * 百分数文本 → 数值('5%' → 5,'0.5' → 0.5)。\n * @author ddj 2026年09月10号\n * @param value 参数文本\n * @returns 数值(非数字为 NaN)\n */\nfunction percentOf(value) {\n const text = String(value ?? '')\n return text.endsWith('%') ? Number(text.slice(0, -1)) : Number(text)\n}\n\n/**\n * alpha 参数归一('5%' → 0.05,'0.5' → 0.5)。\n * @author ddj 2026年09月10号\n * @param value 参数文本\n * @returns 0-1 的 alpha(非数字为 NaN)\n */\nfunction alphaOf(value) {\n const text = String(value ?? '')\n return text.endsWith('%') ? Number(text.slice(0, -1)) / 100 : Number(text)\n}\n\n/**\n * HSL → RGB 通道(h 度、s/l 为 0-100 百分数)。\n * @author ddj 2026年09月10号\n * @param h 色相(度)\n * @param s 饱和度(0-100)\n * @param l 亮度(0-100)\n * @returns [r, g, b](0-255)\n */\nfunction hslToRgb(h, s, l) {\n const hue = ((h % 360) + 360) % 360\n const sat = Math.max(0, Math.min(100, s)) / 100\n const lum = Math.max(0, Math.min(100, l)) / 100\n const c = (1 - Math.abs(2 * lum - 1)) * sat\n const x = c * (1 - Math.abs(((hue / 60) % 2) - 1))\n const m = lum - c / 2\n const table = [[c, x, 0], [x, c, 0], [0, c, x], [0, x, c], [x, 0, c], [c, 0, x]]\n return table[Math.min(5, Math.floor(hue / 60))].map((v) => (v + m) * 255)\n}\n\n/**\n * 官方令牌 → Monaco 颜色键覆盖表(候选令牌按序取首个可解析值;全缺则不写入,保持现役回落)。\n * @author ddj 2026年09月10号\n * @returns 颜色键 → 颜色值\n */\nfunction tokenColors() {\n const out = {}\n for (const entry of COLOR_TOKEN_MAP) {\n const color = firstColor(entry[0])\n if (color === undefined) continue\n for (const key of entry[1]) out[key] = color\n }\n return out\n}\n\n/**\n * 候选令牌中首个可解析为 Monaco 颜色的值。\n * @author ddj 2026年09月10号\n * @param names CSS 变量名候选(按优先级)\n * @returns Monaco 颜色,或 undefined(全部缺失/不可解析)\n */\nfunction firstColor(names) {\n for (const name of names) {\n const color = toMonacoColor(readCssVar(name))\n if (color !== undefined) return color\n }\n return undefined\n}\n\n/**\n * 官方令牌 → Monaco 规则前缀覆盖表(值去掉 # 前缀,Monaco rules 约定)。\n * @author ddj 2026年09月10号\n * @returns token 前缀 → 十六进制色(无 #)\n */\nfunction tokenRules() {\n const out = {}\n for (const entry of RULE_TOKEN_MAP) {\n const color = toMonacoColor(readCssVar(entry[0]))\n if (color === undefined) continue\n for (const prefix of entry[1]) out[prefix] = color.replace('#', '')\n }\n return out\n}\n\n/**\n * 现役规则叠加令牌覆盖(前缀命中即换色,未命中保持语义分层)。\n * @author ddj 2026年09月10号\n * @param baseRules 现役规则表(edrv-dark / edrv-light)\n * @param overrides token 前缀 → 颜色\n * @returns 覆盖后的规则表(无覆盖时原样返回)\n */\nfunction withOverrides(baseRules, overrides) {\n const prefixes = Object.keys(overrides)\n if (!prefixes.length) return baseRules\n return baseRules.map((rule) => {\n const hit = prefixes.find((p) => rule.token === p || rule.token.startsWith(p + '.'))\n return hit === undefined ? rule : Object.assign({}, rule, { foreground: overrides[hit] })\n })\n}\n\n/**\n * 基础规则(token 为空串)前景色跟随官方 editor.foreground。\n * Monaco 的 '' 规则匹配所有未被更具体规则命中的 token,不改它则内置 #1e1e1e 会盖住\n * editor.foreground 令牌色(实测 .mtk1 仍为内置值的原因)。\n * @author ddj 2026年09月10号\n * @param rules 现役规则表\n * @param color 已解析的 editor.foreground(含 #,缺省则不覆盖)\n * @returns 基础规则换色后的规则表\n */\nexport function withBaseForeground(rules, color) {\n if (!color) return rules\n const foreground = String(color).replace('#', '')\n return rules.map((rule) => (rule.token === '' ? Object.assign({}, rule, { foreground }) : rule))\n}\n\n/**\n * 构建跟随官方的 Monaco 主题(令牌全缺时 hasTokens=false,调用方回落现役双套)。\n * @author ddj 2026年09月10号\n * @param scheme 明暗('light' 之外一律按暗色)\n * @returns 主题定义(base/rules/colors/hasTokens)\n */\nexport function officialThemeOf(scheme) {\n const dark = scheme !== 'light'\n const colors = tokenColors()\n const rules = tokenRules()\n const layered = withOverrides(dark ? DARK_RULES : LIGHT_RULES, rules)\n return {\n base: dark ? 'vs-dark' : 'vs',\n rules: withBaseForeground(layered, colors['editor.foreground']),\n colors: Object.assign({}, dark ? DARK_COLORS : LIGHT_COLORS, colors),\n hasTokens: Object.keys(colors).length > 0 || Object.keys(rules).length > 0,\n }\n}\n\n/**\n * 应用跟随官方的主题;令牌读不到或定义失败时回落现役双套。\n * @author ddj 2026年09月10号\n * @param monaco Monaco 实例\n * @returns 实际应用的 Monaco 主题 id\n */\nexport function applyOfficial(monaco) {\n if (!monaco?.editor?.setTheme || !monaco?.editor?.defineTheme) return themeNameOf()\n const theme = officialThemeOf(detectColorScheme())\n if (!theme.hasTokens) {\n applyTheme(monaco)\n return themeNameOf()\n }\n officialSeq += 1\n const id = EDRV_OFFICIAL + '-' + officialSeq\n try {\n monaco.editor.defineTheme(id, { base: theme.base, inherit: true, rules: theme.rules, colors: theme.colors })\n monaco.editor.setTheme(id)\n return id\n } catch (error) {\n applyTheme(monaco)\n return themeNameOf()\n }\n}\n\n/**\n * 观察官方明暗标记变化(body / 根节点的 data-ds-dark-theme 与 data-theme)。\n * @author ddj 2026年09月10号\n * @param onChange 标记变化回调\n * @returns 停止观察函数(非浏览器环境返回空函数)\n */\nexport function observeScheme(onChange) {\n try {\n if (typeof MutationObserver !== 'function' || !document?.body) return () => {}\n const observer = new MutationObserver(() => onChange())\n const filter = ['data-ds-dark-theme', 'data-theme']\n observer.observe(document.body, { attributes: true, attributeFilter: filter })\n if (document.documentElement) {\n observer.observe(document.documentElement, { attributes: true, attributeFilter: filter })\n }\n return () => observer.disconnect()\n } catch (error) {\n return () => {}\n }\n}\n\n/**\n * 官方主题快照 → 明暗(ThemeRuntime.getTheme() 快照;字段缺失/未知返回 undefined)。\n * @author ddj 2026年09月10号\n * @param snapshot 官方主题快照\n * @returns 'light' | 'dark' | undefined\n */\nexport function schemeOfSnapshot(snapshot) {\n const value = snapshot ?? {}\n const scheme = value.active?.colorScheme ?? value.colorScheme\n return scheme === 'light' || scheme === 'dark' ? scheme : undefined\n}\n// --endregion\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 { applyOfficial, 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 // 主题:注册现役双套(幂等)+ 应用跟随官方的令牌主题(令牌缺失时回落现役)\n try {\n registerThemes(window.monaco)\n applyOfficial(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","/**\n * dsh-vscode-mode client — 图片文件判定与 data URL 组装(编辑区图片预览面板用)。\n * 纯函数、无 DOM 依赖,便于单测;MIME 表收敛在 shared/rpc.ts(host base64 响应同源)。\n * @author ddj 2026年09月08号\n */\nimport { IMAGE_MIME } from '../shared/rpc.js'\n\n/** 可预览的图片扩展名集合(小写、无点)。 */\nconst IMAGE_EXT_SET: Set<string> = new Set(Object.keys(IMAGE_MIME))\n\n/**\n * 判断路径是否为可预览的图片文件(取 basename 扩展名,大小写不敏感)。\n * @author ddj 2026年09月08号\n * @param path 文件路径(`/` 或 `\\` 分隔均可)\n * @returns 是否图片文件\n */\nexport function isImagePath(path: string): boolean {\n const base = String(path || '').split(/[\\\\/]/).pop() || ''\n const dot = base.lastIndexOf('.')\n if (dot <= 0) return false\n return IMAGE_EXT_SET.has(base.slice(dot + 1).toLowerCase())\n}\n\n/**\n * 判断路径是否为 SVG 文件(唯一提供「以文本打开」切换的图片格式)。\n * @author ddj 2026年09月08号\n * @param path 文件路径(`/` 或 `\\` 分隔均可)\n * @returns 是否 SVG\n */\nexport function isSvgPath(path: string): boolean {\n const base = String(path || '').split(/[\\\\/]/).pop() || ''\n const dot = base.lastIndexOf('.')\n return dot > 0 && base.slice(dot + 1).toLowerCase() === 'svg'\n}\n\n/**\n * base64 文本 → 可直接赋给 `<img src>` 的 data URL。\n * @author ddj 2026年09月08号\n * @param base64 base64 文本(不含 data: 前缀)\n * @param mime MIME 类型(host edrv.read base64 响应携带)\n * @returns data URL 字符串\n */\nexport function dataUrlOf(base64: string, mime: string): string {\n return 'data:' + (mime || 'application/octet-stream') + ';base64,' + base64\n}\n","/**\n * dsh-vscode-mode client — PDF 文件判定与 base64 编解码(编辑区 PDF 面板用)。\n * 纯函数、无 DOM 依赖,便于单测;PDF_MIME 收敛在 shared/rpc.ts(host base64 响应同源)。\n * @author ddj 2026年09月22号\n */\nimport { PDF_MIME } from '../shared/rpc.js'\n\nexport { PDF_MIME }\n\n/**\n * 判断路径是否为 PDF 文件(取 basename 扩展名,大小写不敏感)。\n * @author ddj 2026年09月22号\n * @param path 文件路径(`/` 或 `\\` 分隔均可)\n * @returns 是否 PDF 文件\n */\nexport function isPdfPath(path: string): boolean {\n const base = String(path || '').split(/[\\\\/]/).pop() || ''\n const dot = base.lastIndexOf('.')\n return dot > 0 && base.slice(dot + 1).toLowerCase() === 'pdf'\n}\n\n/**\n * base64 文本 → 二进制字节(喂给 pdf.js getDocument 的 data 入参)。\n * @author ddj 2026年09月22号\n * @param base64 base64 文本(不含 data: 前缀,host edrv.read base64 响应携带)\n * @returns 原始字节\n */\nexport function base64ToBytes(base64: string): Uint8Array {\n const bin = atob(String(base64 || ''))\n const bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n return bytes\n}\n\n/**\n * 二进制字节 → base64 文本(编辑保存回传 host 前的编码步骤)。\n * @author ddj 2026年09月22号\n * @param bytes 原始字节\n * @returns base64 文本\n */\nexport function bytesToBase64(bytes: Uint8Array): string {\n let bin = ''\n const chunk = 0x8000\n for (let i = 0; i < bytes.length; i += chunk) {\n bin += String.fromCharCode(...bytes.subarray(i, i + chunk))\n }\n return btoa(bin)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — pdf.js 加载器(vendor 产物离线随包,/edrv/vendor/pdfjs/*)。\n * 加载链:module script 内按序动态 import build/pdf.mjs(自挂 globalThis.pdfjsLib)→\n * web/pdf_viewer.mjs(从 globalThis.pdfjsLib 解构)→ window.__edrvPdfjs handoff。\n * 用 script 注入而非打包内 import():客户端包是 CJS,bundler 会改写动态 import 破坏 URL 语义。\n * 作者 ddj 2026-09-22\n */\n\n/** vendor 根(routes.ts /edrv/vendor 前缀路由分发 assets/vendor/*)。 */\nexport const PDFJS_BASE = '/edrv/vendor/pdfjs'\n/** pdf.js Worker 地址(GlobalWorkerOptions.workerSrc)。 */\nexport const PDFJS_WORKER_SRC = PDFJS_BASE + '/build/pdf.worker.mjs'\n/** CJK 字符映射目录(中文 PDF 渲染必需,尾斜杠固定)。 */\nexport const PDFJS_CMAP_URL = PDFJS_BASE + '/cmaps/'\n/** 标准字体目录(未嵌字体 PDF 兜底,尾斜杠固定)。 */\nexport const PDFJS_FONT_URL = PDFJS_BASE + '/standard_fonts/'\n/** 组件层样式(pdfViewer/textLayer/annotationEditor 布局)。 */\nconst PDFJS_CSS_URL = PDFJS_BASE + '/web/pdf_viewer.css'\n\nlet pdfjsPromise = null\n\n/**\n * 注入 pdf_viewer.css(幂等;vendor 路由带 etag 协商缓存,重复挂载走 304)。\n * @author ddj 2026年09月22号\n */\nfunction ensurePdfCss() {\n if (typeof document === 'undefined') return\n if (document.querySelector('link[data-edrv-pdfjs-css]')) return\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.href = PDFJS_CSS_URL\n link.dataset.edrvPdfjsCss = '1'\n document.head.appendChild(link)\n}\n\n/**\n * 加载 pdf.js(core + viewer 组件层):去重 promise,失败重置允许重试(对齐 monaco loader)。\n * @author ddj 2026年09月22号\n * @returns Promise<{lib, viewer}> lib=build/pdf.mjs(getDocument/GlobalWorkerOptions/编辑器枚举等),viewer=web/pdf_viewer.mjs(PDFViewer/EventBus 等)\n */\nexport function loadPdfjs() {\n if (!pdfjsPromise) {\n pdfjsPromise = new Promise((resolve, reject) => {\n ensurePdfCss()\n const boot = () => {\n const handoff = window.__edrvPdfjs\n if (handoff && handoff.lib && handoff.viewer) {\n try {\n handoff.lib.GlobalWorkerOptions.workerSrc = PDFJS_WORKER_SRC\n } catch (error) { /* worker 配置失败留给 getDocument 报错 */ }\n resolve(handoff)\n return\n }\n reject(new Error('pdf.js 模块加载失败:handoff 缺失'))\n }\n const fail = (error) => {\n pdfjsPromise = null\n reject(error instanceof Error ? error : new Error(String(error)))\n }\n const existing = document.querySelector('script[data-edrv-pdfjs-loader]')\n if (existing) {\n // 前一次注入仍在执行:等 handoff 出现(module 评估完即写入)\n existing.addEventListener('edrv-pdfjs-ready', boot, { once: true })\n if (window.__edrvPdfjs) boot()\n return\n }\n const s = document.createElement('script')\n s.type = 'module'\n s.textContent =\n 'import * as lib from \"' + PDFJS_BASE + '/build/pdf.mjs\";\\n' +\n 'import * as viewer from \"' + PDFJS_BASE + '/web/pdf_viewer.mjs\";\\n' +\n 'window.__edrvPdfjs = { lib, viewer };\\n' +\n 'document.querySelector(\"script[data-edrv-pdfjs-loader]\")?.dispatchEvent(new Event(\"edrv-pdfjs-ready\"));'\n s.dataset.edrvPdfjsLoader = '1'\n s.onload = boot\n s.onerror = () => fail(new Error('pdf.js loader 脚本加载失败(检查 assets/vendor/pdfjs 完整 / /edrv/vendor 路由可达)'))\n document.head.appendChild(s)\n })\n }\n return pdfjsPromise\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — PDF 面板控制器(命令式 DOM,React 只渲染外壳 div)。\n * 浏览:PDFViewer 组件(虚拟化渲染 + 文本层);编辑:内置注释编辑器\n * (FreeText 文本框 / Ink 画笔 / Highlight 高亮),保存经 pdfDocument.saveDocument()\n * → base64 → edrv.saveBinary 回写原文件。接线方式对齐官方 viewer(web/app.js)。\n * 作者 ddj 2026-09-22\n */\nimport { rpc } from '../rpc.js'\nimport { bytesToBase64 } from '../pdfPreview.js'\nimport { loadPdfjs, PDFJS_CMAP_URL, PDFJS_FONT_URL } from './pdfLoader.js'\n\n/** 无障碍占位 l10n:组件内 translate 为 fire-and-forget,stub 避免触发 locale 404。 */\nconst L10N_STUB = {\n get: async (key) => key,\n translate: async () => {},\n getDirection: () => 'ltr',\n}\n\n/**\n * PDF 面板控制器工厂。\n * @author ddj 2026年09月22号\n * @param deps 依赖:sessionId/path(保存回写目标)+ 状态栏回调\n * @returns 控制器:mount/destroy/savePdf/setMode/isDirty\n */\nexport function createPdfPanel(deps) {\n const status = (t) => { try { deps.setStatus(t) } catch { /* 状态栏回调异常忽略 */ } }\n\n let stage = null\n let pageLabel = null\n let eventBus = null\n let busAbort = null\n let editorTypes = null\n let pdfViewer = null\n let pdfDocument = null\n let loadingTask = null\n let modeButtons = null\n let destroyed = false\n let dirty = false\n let saving = false\n\n /** 脏状态上抛(tab 脏点)+ 本地记忆。 */\n const setDirty = (value) => {\n dirty = value\n if (modeButtons) modeButtons.save.classList.toggle('edrv-pdf-dirty', value)\n try { deps.onDirtyChange(value) } catch { /* 脏点回调异常忽略 */ }\n }\n\n /** 页码指示更新(pagechanging/pagesinit 事件)。 */\n const updatePageLabel = () => {\n if (!pageLabel || !pdfViewer) return\n pageLabel.textContent = pdfViewer.currentPageNumber + ' / ' + pdfViewer.pagesCount\n }\n\n /** 编辑模式按钮高亮同步(annotationeditormodechanged 事件;evt.mode 为枚举数值)。 */\n const syncModeButtons = (mode) => {\n if (!modeButtons || !editorTypes) return\n const byValue = { [editorTypes.NONE]: 'none', [editorTypes.FREETEXT]: 'freetext', [editorTypes.INK]: 'ink', [editorTypes.HIGHLIGHT]: 'highlight' }\n const key = byValue[mode] ?? 'none'\n for (const k of Object.keys(modeButtons.modes)) {\n modeButtons.modes[k].classList.toggle('edrv-pdf-mode-on', k === key)\n }\n }\n\n /** 编辑模式符号键 → AnnotationEditorType 数值(版本间枚举值有差异,禁止硬编码)。 */\n const modeValueOf = (key) => {\n if (!editorTypes) return null\n return { none: editorTypes.NONE, freetext: editorTypes.FREETEXT, ink: editorTypes.INK, highlight: editorTypes.HIGHLIGHT }[key] ?? null\n }\n\n /**\n * 切换编辑模式(进入注释编辑器某模式或退出回 NONE)。\n * @author ddj 2026年09月22号\n * @param key 模式符号键:none/freetext/ink/highlight\n */\n const applyMode = (key) => {\n if (!pdfViewer || !pdfDocument) { status('PDF 未就绪'); return }\n const mode = modeValueOf(key)\n if (mode === null) return\n try {\n pdfViewer.annotationEditorMode = { mode }\n status(key === 'none' ? '已退出编辑' : '编辑模式:' + (key === 'freetext' ? '文本框' : key === 'ink' ? '画笔' : '高亮'))\n } catch (error) {\n status('切换编辑模式失败:' + String(error))\n }\n }\n\n /**\n * 保存编辑:saveDocument 导出 → base64 → edrv.saveBinary 回写。\n * @author ddj 2026年09月22号\n * @returns Promise<boolean> 是否成功\n */\n const savePdf = async () => {\n if (saving) return false\n if (!pdfDocument) { status('PDF 未就绪'); return false }\n if (!dirty) { status('PDF 无未保存修改'); return true }\n saving = true\n status('正在保存 PDF…')\n try {\n const data = await pdfDocument.saveDocument()\n const res = await rpc('edrv.saveBinary', { sessionId: deps.sessionId, path: deps.path, content: bytesToBase64(data), encoding: 'base64' })\n if (res && res.ok) {\n setDirty(false)\n try { pdfDocument.annotationStorage.resetModified() } catch { /* 重置失败仅影响下次保存判定 */ }\n status('已保存 ' + new Date().toTimeString().slice(0, 8))\n return true\n }\n status('保存失败')\n try { deps.setError(res?.error ? String(res.error) : '保存失败') } catch { /* 错误回调异常忽略 */ }\n return false\n } catch (error) {\n status('保存失败')\n try { deps.setError('PDF 保存异常:' + String(error)) } catch { /* 错误回调异常忽略 */ }\n return false\n } finally {\n saving = false\n }\n }\n\n /** 工具条 DOM(页码/缩放/编辑模式/保存/刷新)。 */\n const buildToolbar = (root) => {\n const bar = document.createElement('div')\n bar.className = 'edrv-pdf-bar'\n const mkBtn = (text, title, onClick, cls) => {\n const b = document.createElement('button')\n b.className = cls || 'edrv-pill edrv-pill-ghost'\n b.textContent = text\n b.title = title\n b.addEventListener('click', onClick)\n bar.appendChild(b)\n return b\n }\n mkBtn('◀', '上一页', () => { if (pdfViewer) pdfViewer.currentPageNumber = Math.max(1, pdfViewer.currentPageNumber - 1) })\n pageLabel = document.createElement('span')\n pageLabel.className = 'edrv-pdf-page'\n pageLabel.textContent = '…'\n bar.appendChild(pageLabel)\n mkBtn('▶', '下一页', () => { if (pdfViewer) pdfViewer.currentPageNumber = Math.min(pdfViewer.pagesCount, pdfViewer.currentPageNumber + 1) })\n mkBtn('−', '缩小', () => { try { pdfViewer.decreaseScale() } catch { /* 缩放失败忽略 */ } }, 'edrv-pill edrv-pill-ghost edrv-pdf-zoom')\n mkBtn('+', '放大', () => { try { pdfViewer.increaseScale() } catch { /* 缩放失败忽略 */ } }, 'edrv-pill edrv-pill-ghost edrv-pdf-zoom')\n bar.appendChild(document.createElement('span')).className = 'edrv-pdf-sep'\n const modes = {}\n modes.freetext = mkBtn('✎ 文本框', '插入文本框注释', () => applyMode('freetext'))\n modes.ink = mkBtn('🖌 画笔', '手绘画笔注释', () => applyMode('ink'))\n modes.highlight = mkBtn('🖍 高亮', '高亮选中文本', () => applyMode('highlight'))\n modes.none = mkBtn('☐ 选择', '退出编辑模式', () => applyMode('none'))\n modeButtons = { modes, save: null }\n bar.appendChild(document.createElement('span')).className = 'edrv-pdf-sep'\n mkBtn('⟳', '重新加载文件', () => { try { deps.onReload() } catch { /* 刷新回调异常忽略 */ } })\n modeButtons.save = mkBtn('💾 保存', '保存修改到文件 (Ctrl+S)', () => { void savePdf() })\n root.appendChild(bar)\n }\n\n /**\n * 挂载面板并加载 PDF 字节。\n * @author ddj 2026年09月22号\n * @param host React 渲染的外壳 div(挂载后保持引用稳定)\n * @param bytes PDF 原始字节\n * @returns Promise<void> 渲染就绪或失败(失败置 deps.setError)\n */\n const mount = async (host, bytes) => {\n try {\n const pdfjs = await loadPdfjs()\n if (destroyed) return\n editorTypes = pdfjs.lib.AnnotationEditorType\n busAbort = new AbortController()\n const onBus = (name, fn) => eventBus.on(name, fn, { signal: busAbort.signal })\n const root = document.createElement('div')\n root.className = 'edrv-pdf'\n buildToolbar(root)\n stage = document.createElement('div')\n stage.className = 'edrv-pdf-stage'\n const viewerDiv = document.createElement('div')\n viewerDiv.className = 'pdfViewer edrv-pdf-viewer'\n stage.appendChild(viewerDiv)\n root.appendChild(stage)\n host.textContent = ''\n host.appendChild(root)\n\n eventBus = new pdfjs.viewer.EventBus()\n const linkService = new pdfjs.viewer.PDFLinkService({ eventBus })\n pdfViewer = new pdfjs.viewer.PDFViewer({\n container: stage,\n viewer: viewerDiv,\n eventBus,\n linkService,\n l10n: L10N_STUB,\n textLayerMode: 1,\n annotationEditorMode: editorTypes.NONE,\n })\n linkService.setViewer(pdfViewer)\n onBus('pagechanging', updatePageLabel)\n onBus('pagesinit', () => {\n try { pdfViewer.currentScaleValue = 'page-width' } catch { /* 初始缩放失败用默认值 */ }\n updatePageLabel()\n })\n onBus('annotationeditormodechanged', (evt) => syncModeButtons(evt?.mode))\n\n loadingTask = pdfjs.lib.getDocument({ data: bytes, cMapUrl: PDFJS_CMAP_URL, cMapPacked: true, standardFontDataUrl: PDFJS_FONT_URL })\n pdfDocument = await loadingTask.promise\n if (destroyed) { void loadingTask.destroy(); return }\n const storage = pdfDocument.annotationStorage\n storage.onSetModified = () => setDirty(true)\n storage.onResetModified = () => setDirty(false)\n pdfViewer.setDocument(pdfDocument)\n linkService.setDocument(pdfDocument)\n status('PDF 已就绪(' + pdfDocument.numPages + ' 页)')\n } catch (error) {\n if (destroyed) return\n const message = String((error && (error.message || error.name)) || error)\n const friendly = message.includes('password') ? '不支持加密 PDF' : 'PDF 加载失败:' + message\n status('PDF 加载失败')\n try { deps.setError(friendly) } catch { /* 错误回调异常忽略 */ }\n }\n }\n\n /** 是否有未保存修改(EditorView Ctrl+S 分派用)。 */\n const isDirty = () => dirty\n\n /** 销毁:解绑事件、销毁文档与 DOM(重复调用安全)。 */\n const destroy = () => {\n destroyed = true\n try { busAbort?.abort() } catch { /* 已中止 */ }\n try { pdfViewer?.cleanup() } catch { /* 视图已销毁 */ }\n try { void loadingTask?.destroy() } catch { /* 任务已销毁 */ }\n try { void pdfDocument?.destroy() } catch { /* 文档已销毁 */ }\n if (stage?.parentNode) stage.parentNode.removeChild(stage)\n stage = null\n eventBus = null\n busAbort = null\n editorTypes = null\n pdfViewer = null\n pdfDocument = null\n loadingTask = null\n modeButtons = null\n }\n\n return { mount, destroy, savePdf, isDirty }\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/**\n * 差异比较口径归一化:剥离 UTF-8 BOM、统一 CRLF 为 LF。\n * 背景:外部工具(pwsh/编辑器)可能改变 BOM/行尾,导致 after 指纹与 hunk\n * 定位在内容语义未变的情况下误报 conflict,把待确认修改从 UI 排除。\n * @author ddj 2026年09月09号\n */\nexport function normalizeForCompare(text: string): string {\n return text.replace(/^\\uFEFF/, '').replace(/\\r\\n/g, '\\n')\n}\n\n/** 归一化一个 hunk 的两侧文本(与 normalizeForCompare 同口径)。 */\nexport function normalizeHunk(hunk: Hunk): Hunk {\n return {\n oldText: hunk.oldText === null ? null : normalizeForCompare(hunk.oldText),\n newText: normalizeForCompare(hunk.newText),\n }\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) 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, normalizeForCompare, normalizeHunk, 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/**\n * 计算文件内各差异区域(行范围 + old/new + 状态),用于行内绿标注与 DiffBox。\n * 定位统一基于归一化文本(剥 BOM、CRLF→LF):外部工具可能改变行尾/BOM,\n * 与 edit 工具的 LF hunk 口径不一致会导致定位失败(差异被误标 stale)。\n * 行号按 \\n 计数,归一化不改变行号,展示语义不变。\n * @author ddj 2026年09月09号\n */\nexport function diffRegions(records: RecordView[], content: string | null): Region[] {\n const regions: Region[] = []\n if (content === null) return regions\n const normalized = normalizeForCompare(content)\n const lines = splitLines(normalized)\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: normalizeHunk(hunk) })\n }\n const locations = locateHunks(normalized, 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(normalized, 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 * `|` 连接多个候选(任一命中即触发),如 `Alt+ArrowLeft|Ctrl+Alt+-`。\n * 约束:本模块被 host 与 client 两半共用,**禁止 import client 侧模块**(React/浏览器 API)。\n * 与 client/ui/commandCatalog 的一致性由 tests/commands.test.ts 断言兜底。\n * 作者 ddj 2026年08月26号 / 2026年09月10号\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 'edrv.navigateBack': 'Alt+ArrowLeft|Ctrl+Alt+-',\n 'edrv.navigateForward': 'Alt+ArrowRight|Ctrl+Shift+-',\n // 页签循环:主候选避开浏览器保留键(Ctrl+Tab / Ctrl+PgUp/PgDn 会被浏览器截获)\n 'edrv.nextTab': 'Ctrl+Alt+ArrowRight|Ctrl+PageDown',\n 'edrv.prevTab': 'Ctrl+Alt+ArrowLeft|Ctrl+PageUp',\n // 命令栏(Ctrl+Shift+P 主候选;F1 为 VS Code 同款第二候选)与编辑行导航\n 'edrv.showCommands': 'Ctrl+Shift+P|F1',\n 'edrv.nextEditorRow': 'Ctrl+Alt+ArrowDown',\n 'edrv.prevEditorRow': 'Ctrl+Alt+ArrowUp',\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 — 编辑器模型可用性探测(模块级,不依赖 React)。\n * 命令可用性判定(快捷键过滤 / 命令栏隐藏 / 执行前置检查)需要「当前是否有活动编辑器」,\n * 而命令目录是模块级常量、拿不到 EditorView 实例,故统一读 DOM 标记:\n * `[data-edrv-view]` 只在 EditorView 挂载期存在于文档中(浮层 portal 走同一根节点)。\n * 作者 ddj 2026年09月10号\n */\n\n/** 编辑器根节点选择器(EditorView 三种形态共用)。 */\nexport const EDITOR_ROOT_SELECTOR = '[data-edrv-view]'\n\n/**\n * 当前文档是否挂载了编辑器视图(无 document 的运行环境返回 false)。\n * @author ddj 2026年09月10号\n * @returns 是否存在编辑器根节点\n */\nexport function hasEditorView(): boolean {\n if (typeof document === 'undefined') return false\n return document.querySelector(EDITOR_ROOT_SELECTOR) !== null\n}\n\n/**\n * 当前文档是否已有 Monaco 活动模型(编辑器打开着文件而非空态)。\n * @author ddj 2026年09月10号\n * @returns 是否存在活动模型\n */\nexport function hasEditorModel(): boolean {\n if (typeof document === 'undefined') return false\n return document.querySelector('.monaco-editor textarea.inputarea') !== null\n}\n","/**\n * dsh-vscode-mode client — 编辑器指令目录(纯元数据)。\n * 「一条命令 = 一条注册数据」:命令栏、快捷键设置页、快捷键监听与 Monaco 右键菜单\n * 全部从本表读取;新增一条能力只需在 EDITOR_COMMANDS 追加一项(可选 keybinding)。\n * run 只派发 `edrv.command.*` 窗口事件,不直接触碰 React/Monaco(`edrv.command.` 前缀\n * 与既有 `edrv:` 刷新/主题事件分属不同命名空间,互不干扰)。\n * 作者 ddj 2026年09月10号\n */\nimport { hasEditorModel } from '../editorModelState.js'\n\n/** 一条编辑器指令(展示 + 执行 + 可用性)。 */\nexport interface CommandDef {\n /** 稳定命令 id(`edrv.` 前缀;第三方注册请避让该前缀)。 */\n id: string\n /** 命令栏与设置页展示名。 */\n label: string\n /** 命令栏分组名。 */\n category: string\n /** 组内排序(小者优先)。 */\n order?: number\n /** 默认键位弦(可选;可含 `|` 多候选)。声明后由快捷键设置页展示与录制。 */\n keybinding?: string\n /** 运行体:派发窗口事件或直接执行。 */\n run: () => void\n /** 可用性判定(缺省视为始终可用;返回 false 时命令栏隐藏且 run 被拒)。 */\n available?: () => boolean\n}\n\n/**\n * 派发编辑器命令事件(`edrv.command.<action>`)。\n * 无 window 的运行环境(纯 Node 单测)静默跳过,命令本身不因此失败。\n * @author ddj 2026年09月10号\n * @param action 动作名(不含前缀)\n */\nfunction emit(action: string): void {\n if (typeof window === 'undefined') return\n window.dispatchEvent(new CustomEvent('edrv.command.' + action))\n}\n\n/** 编辑器命令事件名前缀(EditorView / QuickOpen / 第三方据此监听)。 */\nexport const COMMAND_EVENT_PREFIX = 'edrv.command.'\n\n/** 需要活动编辑器模型才可用的命令(命令栏隐藏并拒绝执行)。 */\nfunction needsModel(): boolean {\n return hasEditorModel()\n}\n\n/** 面板区显隐切换始终可用(未挂载编辑器时 run 为空操作)。 */\nfunction alwaysAvailable(): boolean {\n return true\n}\n\n/**\n * 光标整行下移(编辑行导航)。\n * @author ddj 2026年09月10号\n * @returns 命令定义\n */\nfunction nextEditorRowDef(): CommandDef {\n return {\n id: 'edrv.nextEditorRow', label: '下一编辑行(光标整行下移)', category: '导航', order: 50,\n keybinding: 'Ctrl+Alt+ArrowDown', available: needsModel,\n run: () => emit('nextEditorRow'),\n }\n}\n\n/**\n * 光标整行上移(编辑行导航)。\n * @author ddj 2026年09月10号\n * @returns 命令定义\n */\nfunction prevEditorRowDef(): CommandDef {\n return {\n id: 'edrv.prevEditorRow', label: '上一编辑行(光标整行上移)', category: '导航', order: 60,\n keybinding: 'Ctrl+Alt+ArrowUp', available: needsModel,\n run: () => emit('prevEditorRow'),\n }\n}\n\n/**\n * 编辑器内置指令目录(顺序 = 快捷键设置页展示顺序)。\n * 前置 8 条的键位由 EditorView / QuickOpen 自行 capture 监听(历史实现),\n * 故不进 BRIDGE_COMMANDS,避免同一按键双执行。\n * @author ddj 2026年09月10号\n */\nexport const EDITOR_COMMANDS: readonly CommandDef[] = [\n {\n id: 'edrv.save', label: '保存文件', category: '文件', order: 10,\n keybinding: 'Ctrl+S', available: needsModel,\n run: () => emit('save'),\n },\n {\n id: 'edrv.quickOpen', label: '快速打开文件', category: '文件', order: 20,\n keybinding: 'Ctrl+P', available: alwaysAvailable,\n run: () => emit('quickOpen'),\n },\n {\n id: 'edrv.toggleSidebar', label: '切换侧边栏', category: '视图', order: 10,\n keybinding: 'Ctrl+B', available: alwaysAvailable,\n run: () => emit('toggleSidebar'),\n },\n {\n id: 'edrv.searchInFiles', label: '在工作区中搜索', category: '视图', order: 20,\n keybinding: 'Ctrl+Shift+F', available: alwaysAvailable,\n run: () => emit('searchInFiles'),\n },\n {\n id: 'edrv.navigateBack', label: '后退(导航历史)', category: '导航', order: 10,\n keybinding: 'Alt+ArrowLeft|Ctrl+Alt+-', available: needsModel,\n run: () => emit('navigateBack'),\n },\n {\n id: 'edrv.navigateForward', label: '前进(导航历史)', category: '导航', order: 20,\n keybinding: 'Alt+ArrowRight|Ctrl+Shift+-', available: needsModel,\n run: () => emit('navigateForward'),\n },\n {\n id: 'edrv.nextTab', label: '下一个页签', category: '导航', order: 30,\n keybinding: 'Ctrl+Alt+ArrowRight|Ctrl+PageDown', available: needsModel,\n run: () => emit('nextTab'),\n },\n {\n id: 'edrv.prevTab', label: '上一个页签', category: '导航', order: 40,\n keybinding: 'Ctrl+Alt+ArrowLeft|Ctrl+PageUp', available: needsModel,\n run: () => emit('prevTab'),\n },\n {\n id: 'edrv.goToDefinition', label: '转到定义', category: '语言智能', order: 10,\n available: needsModel,\n run: () => emit('goToDefinition'),\n },\n {\n id: 'edrv.findReferences', label: '查找所有引用', category: '语言智能', order: 20,\n available: needsModel,\n run: () => emit('findReferences'),\n },\n {\n id: 'edrv.triggerAi', label: '触发 AI 内联补全', category: '语言智能', order: 30,\n available: needsModel,\n run: () => emit('triggerAi'),\n },\n {\n id: 'edrv.openInExplorer', label: '在文件浏览器中打开', category: '文件', order: 30,\n available: needsModel,\n run: () => emit('openInExplorer'),\n },\n]\n\n/**\n * 桥接派发指令(无原生监听,键位由 commandBridge 统一 capture 处理)。\n * 新增「只填目录、不写监听」的编辑器指令一律放这里:键位、命令栏、设置页自动可用。\n * @author ddj 2026年09月10号\n */\nexport const BRIDGE_COMMANDS: readonly CommandDef[] = [\n nextEditorRowDef(),\n prevEditorRowDef(),\n]\n\n/**\n * 命令栏自身的命令(避免循环依赖,由 commandBridge 注入 run 后注册)。\n * @author ddj 2026年09月10号\n * @param run 打开命令栏\n * @returns 命令定义\n */\nexport function showCommandsDef(run: () => void): CommandDef {\n return {\n id: 'edrv.showCommands', label: '显示所有命令', category: '视图', order: 1,\n keybinding: 'Ctrl+Shift+P|F1', available: alwaysAvailable, run,\n }\n}\n\n/**\n * 需要全局键位派发的指令(桥接类 + 命令栏自身;不含 EditorView/QuickOpen 原生监听的那些)。\n * @author ddj 2026年09月10号\n * @param showCommands 命令栏命令定义\n * @returns 派发集合\n */\nexport function dispatchedCommands(showCommands: CommandDef): readonly CommandDef[] {\n return [...BRIDGE_COMMANDS, showCommands]\n}\n","/**\n * dsh-vscode-mode client — 快捷键配置模块(解析/匹配/状态同步)。\n * 纯逻辑(parseChord/parseChords/formatChord/matchEvent/chordFromEvent/normalizeKey)不依赖 DOM,可单测;\n * 模块状态由 settings 订阅驱动(client/index.ts 调 keybindingsApply)。\n * 键位语义:Ctrl 与 Cmd 互认(延续 Ctrl+P/Ctrl+B 捕获行为)。\n * 命令目录(COMMANDS)派生自指令目录 commandCatalog(指令 = 单一数据源,设置页自动跟随);\n * 另支持运行时键位表(第三方命令 register 时声明,不落设置 schema,注销即失效)。\n * 作者 ddj 2026年08月26号 / 2026年09月10号\n */\nimport React from 'react'\nimport { KEYBINDING_DEFAULTS, normalizeKeybindings } from '../shared/keybindings.js'\nimport { BRIDGE_COMMANDS, EDITOR_COMMANDS, showCommandsDef } from './ui/commandCatalog.js'\nimport { log } from './log.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 ...EDITOR_COMMANDS.map((command) => ({ id: command.id, label: command.label })),\n { id: 'edrv.showCommands', label: '显示所有命令' },\n ...BRIDGE_COMMANDS.map((command) => ({ id: command.id, label: command.label })),\n]\n\n/** 命令栏命令定义(键位自检与目录展示共用;run 不参与键位逻辑)。 */\nfunction paletteCommand(): { id: string; label: string; keybinding?: string } {\n return showCommandsDef(() => {})\n}\n\n/**\n * 目录与默认键位表一致性自检(仅告警不中断):新指令漏写共享表时第一时间可见。\n * @author ddj 2026年09月10号\n */\nfunction checkDefaultsDrift(): void {\n for (const command of [...EDITOR_COMMANDS, paletteCommand()]) {\n if (!command.keybinding) continue\n if (KEYBINDING_DEFAULTS[command.id] === command.keybinding) continue\n log.warn('指令默认键位与共享表不一致:' + command.id\n + ' 目录=' + command.keybinding + ' 共享表=' + String(KEYBINDING_DEFAULTS[command.id]))\n }\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 }\nconst runtime = new Map<string, Binding[]>()\nconst listeners = new Set<() => void>()\n\ncheckDefaultsDrift()\n\n/**\n * 应用设置快照(与默认值合并;未知 id 丢弃;空对象 = 全部默认)。\n * 每个命令可含多候选键位(`|` 分隔),任一命中即触发。\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 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 * 注册运行时键位(第三方命令;优先于设置值,注销即失效)。\n * @author ddj 2026年09月10号\n * @param id 命令 id\n * @param chord 键位弦(空/非法按未绑定处理)\n * @returns 注销函数(幂等)\n */\nexport function addRuntimeKeybinding(id: string, chord: string): () => void {\n runtime.set(id, parseChords(chord))\n notifyKeybindings()\n return () => removeRuntimeKeybinding(id)\n}\n\n/**\n * 移除运行时键位。\n * @author ddj 2026年09月10号\n * @param id 命令 id\n */\nexport function removeRuntimeKeybinding(id: string): void {\n if (!runtime.delete(id)) return\n notifyKeybindings()\n}\n\n/** 通知键位订阅者(异常隔离)。 */\nfunction notifyKeybindings(): void {\n for (const listener of listeners) {\n try { listener() } catch { /* 监听器异常不影响其他订阅 */ }\n }\n}\n\n/**\n * 当前命令的键位弦(运行时键位优先;未绑定/空 → null)。\n * @author ddj 2026年08月26号 / 2026年09月10号\n * @param id 命令 id\n * @returns 键位弦或 null\n */\nexport function chordOf(id: string): string | null {\n if (runtime.has(id)) {\n const chords = runtime.get(id) ?? []\n return chords.length ? chords.map(formatChord).join('|') : null\n }\n const chord = current[id]\n return typeof chord === 'string' && chord.trim() !== '' ? chord : null\n}\n\n/**\n * 当前命令的解析键位集合(未绑定/非法 → 空数组;含多候选)。\n * @author ddj 2026年08月26号 / 2026年09月10号\n * @param id 命令 id\n * @returns 解析键位数组(可能为空)\n */\nexport function bindingsOf(id: string): Binding[] {\n const override = runtime.get(id)\n if (override) return override\n const chord = current[id]\n return typeof chord === 'string' ? parseChords(chord) : []\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 * 解析多候选键位弦(`|` 分隔):逐段解析,丢弃非法段,去重。\n * @author ddj 2026年08月26号\n * @param chord 键位弦(如 `Alt+ArrowLeft|Ctrl+Alt+-`)\n * @returns 解析键位数组(纯 `|`/空/非法 → 空数组)\n */\nexport function parseChords(chord: string): Binding[] {\n const out: Binding[] = []\n const seen = new Set<string>()\n for (const part of String(chord ?? '').split('|')) {\n const binding = parseChord(part)\n if (!binding) continue\n const key = formatChord(binding)\n if (seen.has(key)) continue\n seen.add(key)\n out.push(binding)\n }\n return out\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 互认;多候选任一命中即 true)。\n * @author ddj 2026年08月26号\n * @param e 键盘事件(鸭子类型,便于单测)\n * @param bindings 解析键位或键位数组(null/空 = 未绑定,永不命中)\n * @returns 是否命中\n */\nexport function matchEvent(e: { ctrlKey?: boolean; metaKey?: boolean; shiftKey?: boolean; altKey?: boolean; key?: string }, bindings: Binding | Binding[] | null): boolean {\n const list = Array.isArray(bindings) ? bindings : bindings ? [bindings] : []\n for (const binding of list) {\n if (Boolean(e.ctrlKey || e.metaKey) !== (binding.ctrl || binding.meta)) continue\n if (Boolean(e.shiftKey) !== binding.shift) continue\n if (Boolean(e.altKey) !== binding.alt) continue\n if (normalizeKey(e.key ?? '') === binding.key) return true\n }\n return false\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 { bindingsOf, 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 openBox = () => {\n inputRef.current?.focus?.()\n setOpen(true)\n }\n const onKey = (e) => {\n if (matchEvent(e, bindingsOf('edrv.quickOpen'))) {\n e.preventDefault(); e.stopPropagation()\n openBox()\n } else if (e.key === 'Escape') {\n setOpen(false); inputRef.current?.blur?.()\n }\n }\n window.addEventListener('keydown', onKey, true)\n // 指令系统入口(命令栏「快速打开文件」):与键位复用同一动作\n window.addEventListener('edrv.command.quickOpen', openBox)\n return () => {\n window.removeEventListener('keydown', onKey, true)\n window.removeEventListener('edrv.command.quickOpen', openBox)\n }\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","/**\n * dsh-vscode-mode client — 指令系统的全局挂点名约定。\n * 单独成模块:装配层(client/index.ts)与读取方(命令栏/第三方)都要用,\n * 放这里可避免 CommandPalette ↔ index 的循环依赖。\n *\n * ⚠️ 必须挂在 window 自身(双下划线 + edrv 前缀,与既有 __edrvExtPoll 同风格)。\n * 旧实现写 window.dsh.edrvCommands——DSH 从不创建 window.dsh 命名空间(全仓库无赋值),\n * 该路径恒为死代码并导致命令栏读到空表;不要再改回气泡式挂点。\n * 作者 ddj 2026年09月10号\n */\n\n/** 指令注册表的全局挂点名:window[REGISTRY_GLOBAL](第三方注册与调试读取;命令栏首选模块引用)。 */\nexport const REGISTRY_GLOBAL = '__edrvCommands__'\n","/**\n * dsh-vscode-mode client — 命令栏筛选与排序(纯函数,可单测)。\n * 匹配语义:查询与索引文本统一小写,空格分词,全部 token 需在 label/id/category\n * 任一字段中以子串出现(中文子串匹配天然成立)。\n * 排序语义:命中字段权重(label 0 < id 1 < category 2)+ 目录序(order 缺省 100)+ 注册序,\n * 保证同一查询下结果稳定、越相关的越靠前。\n * 作者 ddj 2026年09月10号\n */\nimport type { CommandDef } from './ui/commandCatalog.js'\n\n/** 排序用基础序(未声明 order 的命令排在已声明之后)。 */\nconst DEFAULT_ORDER = 100\n\n/** 命中字段权重(数值越小越优先)。 */\nconst FIELD_WEIGHT: Record<string, number> = { label: 0, id: 1, category: 2 }\n\n/** 命令栏候选行(命令定义 + 匹配权重)。 */\nexport interface CommandHit {\n command: CommandDef\n weight: number\n}\n\n/** 命中字段索引文本(小写)。 */\ninterface IndexedFields {\n label: string\n id: string\n category: string\n}\n\n/** 小写化(非字符串按空串处理,容错外部脏数据)。 */\nfunction lower(text: unknown): string {\n return typeof text === 'string' ? text.toLocaleLowerCase('en-US') : ''\n}\n\n/** 建立一条命令的索引文本。 */\nfunction indexOf(command: CommandDef): IndexedFields {\n return { label: lower(command.label), id: lower(command.id), category: lower(command.category) }\n}\n\n/**\n * 命令是否命中全部 token;命中时返回最优(最小)字段权重。\n * @author ddj 2026年09月10号\n * @param fields 命令索引文本\n * @param tokens 小写查询 token\n * @returns 字段权重;未命中返回 null\n */\nfunction hitWeight(fields: IndexedFields, tokens: readonly string[]): number | null {\n let best: number | null = null\n for (const token of tokens) {\n let tokenWeight: number | null = null\n for (const field of ['label', 'id', 'category'] as const) {\n if (!fields[field].includes(token)) continue\n const weight = FIELD_WEIGHT[field]\n if (tokenWeight === null || weight < tokenWeight) tokenWeight = weight\n if (weight === 0) break\n }\n if (tokenWeight === null) return null\n if (best === null || tokenWeight < best) best = tokenWeight\n }\n return best\n}\n\n/** 目录序(order 缺省 100;非有限值同样按 100)。 */\nfunction orderOf(command: CommandDef): number {\n const order = command.order\n return typeof order === 'number' && Number.isFinite(order) ? order : DEFAULT_ORDER\n}\n\n/**\n * 过滤并按相关度排序命令(空查询返回全部,仅按目录序排序)。\n * @author ddj 2026年09月10号\n * @param commands 候选命令(调用方通常已按可用性过滤)\n * @param query 用户输入\n * @returns 命中命令数组\n */\nexport function filterCommands(commands: readonly CommandDef[], query: string): CommandDef[] {\n const tokens = lower(query).split(/\\s+/).filter(Boolean)\n const hits: CommandHit[] = []\n for (const command of commands) {\n const weight = tokens.length ? hitWeight(indexOf(command), tokens) : 0\n if (weight !== null) hits.push({ command, weight })\n }\n return hits\n .map((hit, index) => ({ hit, index }))\n .sort((a, b) => a.hit.weight - b.hit.weight\n || orderOf(a.hit.command) - orderOf(b.hit.command)\n || a.index - b.index)\n .map((entry) => entry.hit.command)\n}\n","/**\n * dsh-vscode-mode client — 指令注册表(命令栏与快捷键系统的唯一数据源)。\n * 镜像 sidebar/registry.ts 的注册表模式:register 返回注销器、list/subscribe 可订阅;\n * 额外提供 run(id):先做可用性判定再执行,运行体异常一律捕获上报,绝不让命令抛出到事件循环。\n * 重复 id 按「后注册者生效」覆盖,旧注销器带身份校验(不会误删新实例,见 releaseRegistry)。\n * 作者 ddj 2026年09月10号\n */\nimport { filterCommands } from './commandSearch.js'\nimport { log } from './log.js'\nimport type { CommandDef } from './ui/commandCatalog.js'\n\n/** 指令注册表(对插件内与第三方一致)。 */\nexport interface CommandRegistry {\n /** 注册命令;返回注销函数(幂等,重复调用无效)。 */\n register(command: CommandDef): () => void\n /** 命令是否存在。 */\n has(id: string): boolean\n /** 读取命令定义。 */\n get(id: string): CommandDef | undefined\n /** 全部命令(按目录序稳定排序)。 */\n list(): CommandDef[]\n /** 可用命令(available 缺省视为可用)。 */\n available(): CommandDef[]\n /** 命令栏过滤(先按可用性过滤,再按相关度排序)。 */\n match(query: string): CommandDef[]\n /** 执行命令;不可用/未注册/抛异常统一返回 false(不抛出)。 */\n run(id: string): boolean\n /** 订阅注册表变化。 */\n subscribe(listener: () => void): () => void\n}\n\nconst registryLog = log.child('commands')\n\n/** 校验命令定义(缺 id/label/run 抛 TypeError,早失败优于静默无效)。 */\nfunction assertCommand(command: CommandDef): void {\n if (!command || typeof command.id !== 'string' || !command.id) throw new TypeError('命令必须提供 id')\n if (typeof command.label !== 'string' || !command.label) throw new TypeError('命令必须提供 label:' + command.id)\n if (typeof command.run !== 'function') throw new TypeError('命令必须提供 run:' + command.id)\n}\n\n/** 目录序(order 缺省 100;非有限值同样按 100)。 */\nfunction orderOf(command: CommandDef): number {\n return typeof command.order === 'number' && Number.isFinite(command.order) ? command.order : 100\n}\n\n/** 命令是否可用(available 缺省视为可用;判定异常按不可用处理)。 */\nfunction isAvailable(command: CommandDef): boolean {\n if (typeof command.available !== 'function') return true\n try {\n return command.available() === true\n } catch (error) {\n registryLog.warn('可用性判定异常(按不可用处理):' + command.id + ' · ' + String(error))\n return false\n }\n}\n\n/**\n * 注销命令(仅当表中仍是本次注册的定义时移除,避免旧实例误删新实例)。\n * @author ddj 2026年09月10号\n * @param entries 命令表\n * @param notify 变化通知\n * @param command 注册时的定义\n * @returns 注销函数\n */\nfunction releaseRegistry(entries: Map<string, CommandDef>, notify: () => void, command: CommandDef): () => void {\n let released = false\n return () => {\n if (released) return\n released = true\n if (entries.get(command.id) !== command) return\n entries.delete(command.id)\n notify()\n }\n}\n\n/**\n * 执行已注册命令(可用性判定 → 运行体 → 异常上报)。\n * @author ddj 2026年09月10号\n * @param command 命令定义\n * @returns 是否真正执行\n */\nfunction runCommand(command: CommandDef): boolean {\n if (!isAvailable(command)) {\n registryLog.debug('命令不可用,已跳过:' + command.id)\n return false\n }\n try {\n command.run()\n registryLog.debug('命令已执行:' + command.id)\n return true\n } catch (error) {\n registryLog.error('命令执行失败:' + command.id + ' · ' + String(error))\n return false\n }\n}\n\n/**\n * 创建指令注册表。\n * @author ddj 2026年09月10号\n * @returns 指令注册表\n */\nexport function createCommandRegistry(): CommandRegistry {\n const entries = new Map<string, CommandDef>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) {\n try {\n listener()\n } catch (error) {\n registryLog.warn('注册表订阅回调异常:' + String(error))\n }\n }\n }\n const list = (): CommandDef[] =>\n [...entries.values()].sort((a, b) => orderOf(a) - orderOf(b))\n const available = (): CommandDef[] => list().filter(isAvailable)\n return {\n register(command: CommandDef): () => void {\n assertCommand(command)\n const replaced = entries.get(command.id)\n if (replaced !== undefined) registryLog.warn('命令 id 重复注册(后者生效):' + command.id)\n entries.set(command.id, command)\n notify()\n return releaseRegistry(entries, notify, command)\n },\n has: (id) => entries.has(id),\n get: (id) => entries.get(id),\n list,\n available,\n match: (query) => filterCommands(available(), query),\n run(id: string): boolean {\n const command = entries.get(id)\n if (!command) {\n registryLog.warn('命令未注册:' + id)\n return false\n }\n return runCommand(command)\n },\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n }\n}\n","/**\n * dsh-vscode-mode client — 命令栏开关状态与单实例宿主认领。\n * 命令栏浮层走 createPortal 渲染到 body,但组件必须挂在插件自己的 React 树里:\n * 编辑区有三种形态(官方右侧 Sidebar / better-sidebar / 中央页签),会话切换时旧树先卸载、\n * 新树后挂载,可能出现两个宿主——claimPaletteHost 保证任一时刻只有一个宿主真正渲染浮层。\n * 运行体由 commandBridge 经 setPaletteRunner 注入(避免 store ↔ 注册表循环依赖);\n * 注册表本体经 setRegistryRef 存入模块引用,命令栏据此读取候选——不依赖任何 window 全局\n * (旧实现写 window.dsh.edrvCommands,而 DSH 从不创建 window.dsh,导致命令栏恒为空表)。\n * 作者 ddj 2026年09月10号\n */\nimport type { CommandRegistry } from './commandRegistry.js'\n\n/** 命令栏上次的唤起来源(诊断用)。 */\nlet openReason = ''\n\n/** 装配期存入的指令注册表(命令栏读取候选的唯一真源)。 */\nlet registryTable: CommandRegistry | null = null\n\n/** 命令栏是否展开。 */\nlet opened = false\n\n/** 当前真正渲染浮层的宿主令牌(null = 无宿主)。 */\nlet hostToken: object | null = null\n\n/** 注入的命令执行器(commandBridge 装配时写入)。 */\nlet runner: ((id: string) => boolean) | null = null\n\n/** 打开命令栏前的焦点元素(关闭后归还焦点,键盘操作不中断)。 */\nlet focusBack: HTMLElement | null = null\n\nconst listeners = new Set<() => void>()\n\n/** 通知全部订阅者(回调异常不影响其他订阅)。 */\nfunction notifyPalette(): void {\n for (const listener of listeners) {\n try {\n listener()\n } catch {\n /* 订阅回调异常忽略 */\n }\n }\n}\n\n/**\n * 注入命令执行器(命令栏执行选中命令时调用)。\n * @author ddj 2026年09月10号\n * @param next 执行器(返回是否执行成功)\n */\nexport function setPaletteRunner(next: ((id: string) => boolean) | null): void {\n runner = next\n}\n\n/**\n * 执行命令栏选中的命令。\n * @author ddj 2026年09月10号\n * @param id 命令 id\n * @returns 是否执行成功(执行器未注入/命令不可用/抛异常均为 false)\n */\nexport function runPaletteCommand(id: string): boolean {\n if (!runner) return false\n return runner(id) === true\n}\n\n/**\n * 存入指令注册表(commandBridge 装配期调用;命令栏据此读取候选)。\n * @author ddj 2026年09月10号\n * @param next 指令注册表(null = 卸载)\n */\nexport function setRegistryRef(next: CommandRegistry | null): void {\n registryTable = next\n}\n\n/**\n * 读取指令注册表(未装配返回 null;浮层据此回退全局/空表)。\n * @author ddj 2026年09月10号\n * @returns 指令注册表或 null\n */\nexport function registryRef(): CommandRegistry | null {\n return registryTable\n}\n\n/**\n * 订阅命令栏开关变化。\n * @author ddj 2026年09月10号\n * @param listener 变化回调\n * @returns 取消订阅函数\n */\nexport function subscribePalette(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n}\n\n/**\n * 命令栏是否展开(useSyncExternalStore 快照)。\n * @author ddj 2026年09月10号\n * @returns 是否展开\n */\nexport function isPaletteOpen(): boolean {\n return opened\n}\n\n/** 记录打开前的焦点元素(只在真正需要归还时记录)。 */\nfunction rememberFocus(): void {\n if (typeof document === 'undefined') return\n const active = document.activeElement\n focusBack = active instanceof HTMLElement ? active : null\n}\n\n/**\n * 打开命令栏(已打开时为空操作;记录当前焦点供关闭后归还)。\n * @author ddj 2026年09月10号\n * @param reason 唤起来源(键盘/命令/外部 API)\n */\nexport function openCommandPalette(reason = 'keybinding'): void {\n if (opened) return\n rememberFocus()\n openReason = reason\n opened = true\n notifyPalette()\n}\n\n/**\n * 关闭命令栏并归还焦点。\n * @author ddj 2026年09月10号\n */\nexport function closeCommandPalette(): void {\n if (!opened) return\n opened = false\n openReason = ''\n notifyPalette()\n const target = focusBack\n focusBack = null\n if (!target || typeof target.focus !== 'function') return\n try {\n target.focus()\n } catch {\n /* 目标已卸载时忽略 */\n }\n}\n\n/** 上次唤起来源(诊断/测试读取)。 */\nexport function paletteReason(): string {\n return openReason\n}\n\n/**\n * 认领命令栏宿主(返回 true 表示由本宿主渲染浮层)。\n * @author ddj 2026年09月10号\n * @returns 是否为当前宿主\n */\nexport function claimPaletteHost(): boolean {\n if (hostToken !== null) return false\n hostToken = {}\n return true\n}\n\n/**\n * 释放宿主认领(仅持有者可释放,卸载顺序错乱不会顶掉新宿主)。\n * @author ddj 2026年09月10号\n * @param token 认领令牌(null 表示本宿主未认领)\n */\nexport function releasePaletteHost(token: object | null): void {\n if (token === null || hostToken !== token) return\n hostToken = null\n}\n","/**\n * dsh-vscode-mode client — 命令栏浮层(Ctrl+Shift+P / F1)。\n * 订阅 commandPaletteStore 的开关状态;候选来自注入的指令注册表(window.dsh.edrvCommands),\n * 过滤/排序复用 commandSearch 纯函数;↑↓ 选择、Enter 执行、Esc 或点击遮罩关闭。\n * 浮层经 createPortal 渲染到 body,故不受编辑区三种形态(官方侧栏/better-sidebar/中央页签)影响;\n * 宿主单实例由 store 的 claimPaletteHost 保证(另一个宿主自动返回 null)。\n * 作者 ddj 2026年09月10号\n */\nimport React from 'react'\nimport { createPortal } from 'react-dom'\nimport { REGISTRY_GLOBAL } from '../commandGlobals.js'\nimport { filterCommands } from '../commandSearch.js'\nimport { createCommandRegistry } from '../commandRegistry.js'\nimport type { CommandRegistry } from '../commandRegistry.js'\nimport { chordOf } from '../keybindings.js'\nimport {\n claimPaletteHost, closeCommandPalette, isPaletteOpen, registryRef, releasePaletteHost,\n runPaletteCommand, subscribePalette,\n} from '../commandPaletteStore.js'\nimport type { CommandDef } from './commandCatalog.js'\n\n/** 空注册表(宿主未注入时的安全降级:命令栏可开但无候选)。 */\nlet fallbackRegistry: CommandRegistry | null = null\n\n/**\n * 读取指令注册表:① 装配期存入的模块引用(首选,不依赖全局)\n * ② window[REGISTRY_GLOBAL] 镜像(第三方/调试场景)③ 空表降级(仅装配异常时)。\n * @author ddj 2026年09月10号\n * @returns 指令注册表\n */\nfunction useRegistry(): CommandRegistry {\n const injected = registryRef()\n if (injected) return injected\n const mirrored = typeof window === 'undefined'\n ? undefined\n : (window as unknown as Record<string, CommandRegistry | undefined>)[REGISTRY_GLOBAL]\n if (mirrored) return mirrored\n if (!fallbackRegistry) fallbackRegistry = createCommandRegistry()\n return fallbackRegistry\n}\n\n/** 命令栏每一行的展示信息。 */\ninterface PaletteRow {\n command: CommandDef\n chord: string | null\n}\n\n/**\n * 组装候选行(先按可用性过滤,再按查询排序)。\n * @author ddj 2026年09月10号\n * @param registry 指令注册表\n * @param query 用户输入\n * @returns 候选行\n */\nfunction rowsOf(registry: CommandRegistry, query: string): PaletteRow[] {\n return filterCommands(registry.available(), query)\n .map((command) => ({ command, chord: chordOf(command.id) }))\n}\n\n/**\n * 命令栏浮层(未展开/非宿主时渲染 null)。\n * @author ddj 2026年09月10号\n * @returns 浮层 React 元素或 null\n */\nexport function CommandPalette(): React.ReactElement | null {\n const open = React.useSyncExternalStore(subscribePalette, isPaletteOpen)\n const registry = useRegistry()\n const [token] = React.useState(() => (claimPaletteHost() ? {} : null))\n const [query, setQuery] = React.useState('')\n const [selected, setSelected] = React.useState(0)\n const [notice, setNotice] = React.useState('')\n const inputRef = React.useRef<HTMLInputElement | null>(null)\n const host = token !== null\n\n React.useEffect(() => () => releasePaletteHost(token), [token])\n React.useEffect(() => {\n if (!open) return undefined\n setQuery('')\n setSelected(0)\n setNotice('')\n const timer = setTimeout(() => inputRef.current?.focus(), 0)\n return () => clearTimeout(timer)\n }, [open])\n\n const rows = React.useMemo(\n () => (open && host ? rowsOf(registry, query) : []),\n [open, host, registry, query],\n )\n const active = rows.length ? Math.min(selected, rows.length - 1) : 0\n\n React.useEffect(() => {\n if (!open) return\n const node = document.querySelector('.edrv-palette-row.edrv-palette-sel')\n const scroll = (node as HTMLElement | null)?.scrollIntoView\n if (typeof scroll === 'function') scroll.call(node, { block: 'nearest' })\n }, [open, active, rows.length])\n\n /** 执行候选行(执行器内部会做可用性校验与异常上报)。 */\n const execute = (row: PaletteRow | undefined): void => {\n if (!row) return\n closeCommandPalette()\n if (!runPaletteCommand(row.command.id)) setNotice('命令未执行:' + row.command.label)\n }\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n event.stopPropagation()\n if (event.key === 'Escape') {\n event.preventDefault()\n closeCommandPalette()\n return\n }\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault()\n if (!rows.length) return\n const step = event.key === 'ArrowDown' ? 1 : rows.length - 1\n setSelected((value) => (Math.min(value, rows.length - 1) + step) % rows.length)\n return\n }\n if (event.key === 'Enter') {\n event.preventDefault()\n execute(rows[active])\n }\n }\n\n if (!open || !host || typeof document === 'undefined') return null\n const list = rows.length\n ? rows.map((row, index) => React.createElement('div', {\n key: row.command.id,\n className: 'edrv-palette-row' + (index === active ? ' edrv-palette-sel' : ''),\n onMouseEnter: () => setSelected(index),\n onClick: () => execute(row),\n },\n React.createElement('span', { className: 'edrv-palette-label' }, row.command.label),\n React.createElement('span', { className: 'edrv-palette-cat' }, row.command.category),\n row.chord ? React.createElement('kbd', { className: 'edrv-palette-key' }, row.chord) : null))\n : React.createElement('div', { className: 'edrv-palette-empty' }, '无匹配命令')\n\n const panel = React.createElement('div', { className: 'edrv-palette', 'data-edrv-palette': '1', onKeyDown },\n React.createElement('input', {\n ref: inputRef,\n className: 'edrv-palette-input',\n value: query,\n placeholder: '输入命令名称…(↑↓ 选择 · Enter 执行 · Esc 关闭)',\n spellCheck: false,\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => {\n setQuery(event.target.value)\n setSelected(0)\n setNotice('')\n },\n }),\n React.createElement('div', { className: 'edrv-palette-list' }, list),\n notice ? React.createElement('div', { className: 'edrv-palette-notice' }, notice) : null)\n\n const overlay = React.createElement('div', { 'data-edrv-view': '1' },\n React.createElement('div', { className: 'edrv-palette-mask', onClick: () => closeCommandPalette() }),\n panel)\n return createPortal(overlay, document.body)\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 * 面板列表来自注册表(活动栏图标/徽标/激活态);最左侧图标列(活动栏)常显,\n * 右侧详情面板区可拖拽调宽/隐藏:visible=false 时仅保留图标列(宽 = 图标列宽),\n * 点击任一图标重新展开面板(onShow),底部按钮在 ◀ 收起 / ▶ 展开间切换。\n * 拖拽调宽下限 = minWidth prop(通用设置 sidebarMinWidth,默认 300),低于下限直接收起面板区。\n * 作者 ddj 2026-08-26 / 2026-09-04\n */\nimport React from 'react'\nimport type { SidebarCtx } from './types.js'\n\nconst W_MAX = 560\n/** 面板区隐藏时容器的宽度(= 图标列宽,与 editor.css .edrv-rail 对齐)。 */\nconst RAIL_ONLY_W = 44\n/** 隐藏态接缝拖拽条宽度(与 editor.css .edrv-side-resize 对齐)。 */\nconst SEAM_W = 5\n/** 隐藏态拖出面板区的触发阈值(px,拖过即展开并继续实时调宽)。 */\nconst PULL_OUT_THRESHOLD = 12\n\n/**\n * 活动栏图标内容:面板可给官方图标组件(跟随官方主题),也可给文本/emoji(回落)。\n * @author ddj 2026年09月10号\n * @param icon 面板定义的 icon 字段(组件或文本)\n * @returns 图标元素或文本;组件渲染异常返回 null\n */\nfunction railIconEl(icon) {\n if (typeof icon !== 'function') return icon\n try {\n return React.createElement(icon, { size: 16 })\n } catch (error) {\n return null\n }\n}\n\n/**\n * 侧边栏容器。\n * @param props.registry 面板注册表(list() 提供面板顺序)\n * @param props.ctx 面板共享上下文\n * @param props.activePanel 当前激活面板 id\n * @param props.onActive 激活面板变化回调\n * @param props.visible 面板区是否可见(false = 只显示活动栏)\n * @param props.onShow 重新展开面板区回调(活动栏图标点击/底部按钮)\n * @param props.width 面板区宽度\n * @param props.onWidth 宽度变化回调\n * @param props.onHide 收起面板区回调\n * @param props.minWidth 最小宽度(通用设置 sidebarMinWidth;拖拽低于它触发隐藏)\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 visible = props.visible !== false\n const onShow = props.onShow\n const width = props.width\n const onWidth = props.onWidth\n const onHide = props.onHide\n const wMin = Math.max(120, Math.min(W_MAX, Math.round(Number(props.minWidth) || 300)))\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 cleanup = () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n }\n const onUp = () => cleanup()\n const onMove = (ev) => {\n const raw = startW + (ev.clientX - startX)\n // 低于最小宽度:清理监听并直接收起面板区(不夹住)\n if (raw < wMin) {\n cleanup()\n onHide()\n return\n }\n onWidth(Math.min(W_MAX, raw))\n }\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n\n }\n\n /**\n * 隐藏态接缝拖拽:向右拖过阈值把面板区拉出来(以记忆宽度展开),继续拖动实时调宽。\n * @param e pointerdown 事件\n */\n const onSeamPointerDown = (e) => {\n e.preventDefault()\n const startX = e.clientX\n const baseW = Math.max(wMin, Math.min(W_MAX, Math.round(Number(width) || wMin)))\n let expanded = false\n let expandStartX = 0\n const cleanup = () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n }\n const onUp = () => cleanup()\n const onMove = (ev) => {\n if (!expanded) {\n if (ev.clientX - startX < PULL_OUT_THRESHOLD) return\n expanded = true\n expandStartX = ev.clientX\n onShow()\n return\n }\n onWidth(Math.max(wMin, Math.min(W_MAX, baseW + (ev.clientX - expandStartX))))\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' + (visible && active && p.id === active.id ? ' edrv-rail-on' : ''),\n title: p.title,\n onClick: () => {\n onActive(p.id)\n // 面板区隐藏时点击图标 = 展开到该面板(VSCode 活动栏行为)\n if (!visible && typeof onShow === 'function') onShow()\n },\n },\n React.createElement('span', { className: 'edrv-rail-icon' }, railIconEl(p.icon)),\n count > 0\n ? React.createElement('span', { className: 'edrv-rail-badge' }, String(count))\n : null)\n })),\n React.createElement('button', {\n className: 'edrv-rail-btn',\n title: (visible ? '隐藏面板区' : '展开面板区') + ' (Ctrl+B)',\n onClick: () => (visible ? onHide() : onShow?.()),\n }, visible ? '◀' : '▶'))\n\n return React.createElement('div', {\n className: 'edrv-sidebar' + (visible ? '' : ' edrv-sidebar-rail-only'),\n // maxWidth 兜底:持久化宽度超过容器可用空间时也不允许布局宽溢出(配合 flex-shrink:1 收缩)\n style: { width: visible ? width : RAIL_ONLY_W + SEAM_W, maxWidth: '100%' },\n },\n rail,\n visible\n ? React.createElement('div', { className: 'edrv-side-body' },\n active ? active.render(ctx) : null)\n : null,\n visible\n ? React.createElement('div', { className: 'edrv-side-resize', onPointerDown: onPointerDown })\n // 隐藏态接缝:悬浮显示拖拽光标与高亮,向右拖把面板区拉出来\n : React.createElement('div', { className: 'edrv-side-resize', title: '拖拽展开面板区', onPointerDown: onSeamPointerDown }))\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 键前缀表(按功能隔离;与 scopeStore 作用域键拼接:工作区优先,无 cwd 回退会话)。 */\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 /** 规则面板 UI 状态(RulesPanel v1:Tab 与项目工作区选择,全局不按会话)。 */\n rules: 'edrv.rules.v1.',\n} as const\n\n/** 按前缀拼作用域键(scopeStore 产出作用域;侧边栏/编辑器等需要布局段时自行拼接后传入)。 */\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 键前缀(按工作区作用域隔离,无 cwd 会话回退会话键)。 */\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 scope 作用域键(scopeStore.workspaceScopeOf 产物)\n * @returns path → viewState 映射\n */\nexport function viewStatesLoad(scope: string): Record<string, unknown> {\n try {\n return parseViewStates(window.localStorage.getItem(KEY_PREFIX + String(scope))) ?? {}\n } catch (error) {\n return {}\n }\n}\n\n/**\n * 写入某作用域的视图状态缓存(损坏/配额满 → 忽略)。\n * @author ddj 2026年08月28号\n * @param scope 作用域键(scopeStore.workspaceScopeOf 产物)\n * @param states path → viewState 映射\n */\nexport function viewStatesSave(scope: string, states: Record<string, unknown>): void {\n try {\n window.localStorage.setItem(KEY_PREFIX + String(scope), serializeViewStates(states))\n } catch (error) { /* 配额满/隐私模式忽略 */ }\n}\n","/**\n * dsh-vscode-mode client — 编辑区状态作用域键(scope key)。\n * 编辑区 UI 状态(页签/展开树/视图状态/侧边栏等)按「工作区」隔离:同一工作区下\n * 切换对话恢复同一份状态,无体感差别;会话没有 cwd 时回退按会话隔离(旧行为)。\n * 另提供旧「会话键」数据到「工作区键」的一次性迁移(只复制不删除,幂等)。\n * 键前缀统一走 paths.ts PathConst(CACHE_KEY),本模块只产出拼接用的作用域串。\n * 作者 ddj 2026-09-09\n */\nimport { CACHE_KEY } from '../paths.js'\n\n// --region 归一化与作用域键\n\n/** Windows 盘符绝对路径(如 D:/ 或 d:\\),大小写不敏感。 */\nconst WIN_DRIVE_RE = /^[a-z]:\\//i\n\n/**\n * 归一化工作区路径:trim、反斜杠→斜杠、去尾部斜杠;\n * Windows 盘符绝对路径整体小写(文件系统大小写不敏感),POSIX 路径保留大小写。\n * @author ddj 2026年09月09号\n * @param cwd 工作区目录(sessions 快照 byId[sessionId].cwd)\n * @returns 归一化路径;空值返回 ''\n */\nexport function normalizeWsPath(cwd: string | undefined | null): string {\n const s = String(cwd ?? '').trim().replace(/\\\\/g, '/').replace(/\\/+$/, '')\n if (!s) return ''\n return WIN_DRIVE_RE.test(s) ? s.toLowerCase() : s\n}\n\n/**\n * 计算编辑区状态作用域键:有 cwd → 'ws:' + 归一化路径(同工作区共享);\n * 无 cwd → 'sid:' + sessionId(回退按会话隔离,对齐旧行为)。\n * @author ddj 2026年09月09号\n * @param cwd 工作区目录(可为 null/undefined)\n * @param sessionId 会话 id(cwd 缺失时的隔离键)\n * @returns 作用域键字符串\n */\nexport function workspaceScopeOf(cwd: string | undefined | null, sessionId: string | undefined): string {\n const ws = normalizeWsPath(cwd)\n if (ws) return 'ws:' + ws\n return 'sid:' + String(sessionId ?? '')\n}\n// --endregion\n\n// --region 旧会话键迁移\n\n/** 参与迁移的 localStorage 键前缀(编辑区全部按会话持久化的旧键)。 */\nconst MIGRATE_PREFIXES: readonly string[] = [\n CACHE_KEY.editor,\n CACHE_KEY.viewstate,\n CACHE_KEY.sidebar + 'side.',\n CACHE_KEY.sidebar,\n CACHE_KEY.search,\n CACHE_KEY.expanded,\n CACHE_KEY.entries,\n]\n\n/** 已迁移过的 scope+sessionId 组合(按 storage 实例分组;每页生命周期只跑一次)。 */\nconst migratedPairs = new WeakMap<object, Set<string>>()\n\n/**\n * 把旧「前缀+sessionId」键的数据一次性复制到「前缀+scope」键(目标已存在则跳过)。\n * 只复制不删除旧键;幂等,可安全重复调用。升级后首个工作区键为空时兜底恢复旧数据。\n * @author ddj 2026年09月09号\n * @param scope 目标作用域键\n * @param sessionId 旧数据所属会话 id\n * @param storage localStorage 注入口(缺省 window.localStorage,测试可传内存桩)\n */\nexport function migrateScopedKeys(scope: string, sessionId: string | undefined, storage?: Storage): void {\n if (!scope || !sessionId) return\n let store: Storage | null = null\n try {\n store = storage ?? window.localStorage\n } catch (error) {\n return\n }\n if (!store) return\n let pairs = migratedPairs.get(store)\n if (!pairs) {\n pairs = new Set()\n migratedPairs.set(store, pairs)\n }\n const pair = scope + '|' + sessionId\n if (pairs.has(pair)) return\n pairs.add(pair)\n const legacy = String(sessionId)\n for (const prefix of MIGRATE_PREFIXES) {\n const target = prefix + scope\n try {\n if (store.getItem(target) !== null) continue\n const raw = store.getItem(prefix + legacy)\n if (raw === null) continue\n store.setItem(target, raw)\n } catch (error) { /* 配额满/隐私模式忽略,不阻塞 */ }\n }\n}\n// --endregion\n","/**\n * dsh-vscode-mode client — Monaco model 跨挂载缓存(按工作区作用域)。\n * 编辑区每会话重挂载会销毁实例,但文件 model(内容)与工作区绑定:\n * 按作用域把 model 缓存在模块级,重挂载后 loadContent 命中缓存同步种出内容,\n * 消除切换对话时的加载闪烁。切换作用域时释放上一作用域未附着编辑器的模型\n * (附着中的仅移出缓存,交由编辑器自身生命周期,防正在显示的模型被销毁)。\n * 纯对象容器逻辑,不依赖 monaco,可单测。\n * 作者 ddj 2026-09-09\n */\n\n// --region 常量与状态\n\n/** 单作用域缓存上限(超出按写入序逐出最旧,近似 LRU)。 */\nexport const MODEL_CACHE_CAP = 40\n\n/** scope →(path → model)缓存表。 */\nconst caches = new Map<string, Map<string, unknown>>()\n/** 当前激活作用域(切换时释放上一个)。 */\nlet activeScope: string | null = null\n// --endregion\n\n/** 模型是否仍附着在某个编辑器实例上(缺方法视为未附着)。 */\nfunction isAttached(model: unknown): boolean {\n const fn = (model as { isAttachedToEditor?: () => boolean } | null)?.isAttachedToEditor\n return typeof fn === 'function' ? fn.call(model) === true : false\n}\n\n/** 释放模型(仅未附着编辑器时真正 dispose;附着中的保留给编辑器自毁)。 */\nfunction disposeIfFree(model: unknown): void {\n if (!model || isAttached(model)) return\n try { (model as { dispose: () => void }).dispose() } catch { /* 已释放/异常忽略 */ }\n}\n\n/**\n * 取(或切)某作用域的 model 缓存:同作用域重复调用复用同一 Map(跨挂载存活);\n * 作用域变化时释放上一作用域的模型(未附着的 dispose,附着中的仅移出缓存)。\n * @author ddj 2026年09月09号\n * @param scope 作用域键(scopeStore.workspaceScopeOf 产物)\n * @returns 该作用域的 path → model Map\n */\nexport function modelsForScope(scope: string): Map<string, unknown> {\n const existing = caches.get(scope)\n if (existing && activeScope === scope) return existing\n if (activeScope !== null && activeScope !== scope) {\n const prev = caches.get(activeScope)\n if (prev) {\n for (const model of prev.values()) disposeIfFree(model)\n prev.clear()\n caches.delete(activeScope)\n }\n }\n activeScope = scope\n if (existing) return existing\n const map = new Map<string, unknown>()\n caches.set(scope, map)\n return map\n}\n\n/**\n * 记入模型并刷新 LRU 序(先删后插保证最新),超上限逐出最旧(未附着才 dispose)。\n * @author ddj 2026年09月09号\n * @param map 作用域缓存 Map\n * @param path 工作区相对路径\n * @param model Monaco model(或测试桩)\n */\nexport function rememberModel(map: Map<string, unknown>, path: string, model: unknown): void {\n if (!path || !model) return\n map.delete(path)\n map.set(path, model)\n while (map.size > MODEL_CACHE_CAP) {\n const oldest = map.keys().next().value\n if (oldest === undefined) break\n const evicted = map.get(oldest)\n map.delete(oldest)\n disposeIfFree(evicted)\n }\n}\n","/**\n * dsh-vscode-mode client — 侧边栏最小宽度共享状态。\n * 设置来源:dsh-vscode-mode 命名空间的 sidebarMinWidth 字段(通用设置页可调);\n * 客户端 settings 订阅经 sidebarMinApply 写入,编辑器/侧边栏容器经 getSidebarMinWidth 读取,\n * 变更时由 client/index.ts 派发 edrv:sidebar-min-width 窗口事件通知编辑器重夹。\n * 作者 ddj 2026年09月04号\n */\n\n/** 默认最小宽度(设置缺失/非法时的兜底值)。 */\nexport const SIDEBAR_MIN_DEFAULT = 300\n/** 最小宽度允许下界(与旧版拖拽下限一致)。 */\nexport const SIDEBAR_MIN_FLOOR = 180\n/** 最小宽度允许上界(与侧边栏最大宽度 W_MAX 一致,避免区间倒挂)。 */\nexport const SIDEBAR_MIN_CEIL = 560\n\nlet currentMin = SIDEBAR_MIN_DEFAULT\n\n/**\n * 归一化最小宽度:非法(NaN/非有限/负数)回退默认,越界夹取到 [180, 560]。\n * @author ddj 2026年09月04号\n * @param value 原始值(设置文档来的任意 JSON 值)\n * @returns 合法最小宽度\n */\nexport function normalizeSidebarMinWidth(value: unknown): number {\n const n = typeof value === 'number' ? value : Number(value)\n if (!Number.isFinite(n) || n <= 0) return SIDEBAR_MIN_DEFAULT\n return Math.max(SIDEBAR_MIN_FLOOR, Math.min(SIDEBAR_MIN_CEIL, Math.round(n)))\n}\n\n/**\n * 应用设置值(client/index.ts 设置订阅同步调用)。\n * @author ddj 2026年09月04号\n * @param value 设置文档中的 sidebarMinWidth\n * @returns 归一化后的生效值\n */\nexport function sidebarMinApply(value: unknown): number {\n currentMin = normalizeSidebarMinWidth(value)\n return currentMin\n}\n\n/**\n * 读取当前生效的最小宽度(编辑器初始/恢复/拖拽夹取共用)。\n * @author ddj 2026年09月04号\n * @returns 当前最小宽度\n */\nexport function getSidebarMinWidth(): number {\n return currentMin\n}\n","/**\n * dsh-vscode-mode client — 编辑器导航历史(后退/前进)纯逻辑。\n * 对齐 VSCode Go Back / Go Forward(navigation history):记录「文件 + 焦点位置」访问轨迹,\n * 后退回到上一处焦点,前进回到下一处,跨文件生效。\n * 数据模型:past(末位 = 当前)+ future 两个栈;record 压栈并清空 future;\n * 与栈顶同 path+line+column 视为同一位置:仅刷新 viewState 快照,不压栈、不清 future。\n * 纯逻辑无 DOM 依赖,可单测;navHistoryFor 提供按工作区作用域的实例仓(跨会话复用)。\n * 作者 ddj 2026年09月04号\n */\n\n/** 导航历史单条记录:文件 + 焦点位置(+ 可选的 viewState 快照用于恢复滚动/折叠)。 */\nexport interface NavEntry {\n /** 工作区相对路径 */\n path: string\n /** 焦点行(1-based) */\n line?: number\n /** 焦点列(1-based) */\n column?: number\n /** 该位置保存的 Monaco viewState(恢复滚动/折叠) */\n viewState?: unknown\n}\n\n/** 导航历史接口。 */\nexport interface NavHistory {\n /** 记录当前位置(压栈 + 清空 future;与栈顶同位置时仅更新 viewState)。 */\n record(entry: NavEntry): void\n /** 后退:返回将要恢复的前一条目;历史不足 2 条 → null。 */\n back(): NavEntry | null\n /** 前进:返回将要恢复的条目;future 空 → null。 */\n forward(): NavEntry | null\n /** 是否可后退。 */\n canBack(): boolean\n /** 是否可前进。 */\n canForward(): boolean\n /** 后退目标条目(不改变状态;不可退 → null)。 */\n peekBack(): NavEntry | null\n /** 前进目标条目(不改变状态;不可进 → null)。 */\n peekForward(): NavEntry | null\n}\n\n/** 后退栈默认容量上限(超出逐出最旧)。 */\nexport const NAV_HISTORY_CAP = 200\n\n/** 工作区历史实例缓存上限(FIFO 逐出最久未用作用域,防长期驻留泄漏)。 */\nexport const NAV_SCOPE_CAP = 6\n\n/** scope → 导航历史实例(同工作区跨会话复用同一份历史)。 */\nconst scopeHistories = new Map<string, NavHistory>()\n\n/** 路径一致(容忍相对路径大小写差异,对齐既有 sameFile 语义常用写法)。 */\nfunction samePath(a: string, b: string): boolean {\n if (a === b) return true\n return String(a).replace(/\\\\/g, '/').toLowerCase() === String(b).replace(/\\\\/g, '/').toLowerCase()\n}\n\n/** 位置一致(无焦点时按 null 归一,`undefined`/`null` 视为相等)。 */\nfunction samePos(a: NavEntry, b: NavEntry): boolean {\n if (!samePath(a.path, b.path)) return false\n return (a.line ?? null) === (b.line ?? null) && (a.column ?? null) === (b.column ?? null)\n}\n\n/**\n * 创建导航历史实例(容量裁剪到 cap)。\n * @author ddj 2026年09月04号\n * @param cap 后退栈容量上限(默认 NAV_HISTORY_CAP)\n * @returns 导航历史实例\n */\nexport function createNavHistory(cap = NAV_HISTORY_CAP): NavHistory {\n const past: NavEntry[] = []\n const future: NavEntry[] = []\n return {\n record(entry: NavEntry): void {\n if (!entry || !entry.path) return\n const top = past[past.length - 1]\n if (top && samePos(top, entry)) {\n // 同一位置:只更新 viewState 快照(滚动/折叠可能变化),栈与 future 不动\n if (top.viewState !== undefined || entry.viewState !== undefined) top.viewState = entry.viewState\n return\n }\n past.push({ path: entry.path, line: entry.line, column: entry.column, viewState: entry.viewState })\n if (past.length > cap) past.splice(0, past.length - cap)\n future.length = 0\n },\n back(): NavEntry | null {\n if (past.length < 2) return null\n const current = past.pop()\n if (!current) return null\n future.push(current)\n return past[past.length - 1]\n },\n forward(): NavEntry | null {\n const entry = future.pop()\n if (!entry) return null\n past.push(entry)\n return entry\n },\n canBack(): boolean {\n return past.length >= 2\n },\n canForward(): boolean {\n return future.length > 0\n },\n peekBack(): NavEntry | null {\n return past.length >= 2 ? past[past.length - 2] : null\n },\n peekForward(): NavEntry | null {\n return future.length ? future[future.length - 1] : null\n },\n }\n}\n\n/**\n * 取(或建)某工作区作用域的导航历史实例:同 scope 跨会话复用同一实例,\n * 后退/前进历史在切换对话后保留(对齐「同一工作区同一编辑区」体感)。\n * 超出 NAV_SCOPE_CAP 时逐出最旧的实例(Map 插入序近似 LRU)。\n * @author ddj 2026年09月09号\n * @param scope 作用域键(scopeStore.workspaceScopeOf 产物)\n * @param cap 后退栈容量上限(透传 createNavHistory)\n * @returns 导航历史实例\n */\nexport function navHistoryFor(scope: string, cap = NAV_HISTORY_CAP): NavHistory {\n const existing = scopeHistories.get(scope)\n if (existing) return existing\n const created = createNavHistory(cap)\n scopeHistories.set(scope, created)\n if (scopeHistories.size > NAV_SCOPE_CAP) {\n const oldest = scopeHistories.keys().next().value\n if (typeof oldest === 'string') scopeHistories.delete(oldest)\n }\n return created\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 均支持)。 */\nexport type RefAppearance = 'file' | 'folder'\n\n/** 把追加引用结果映射为可读文案(ok 用 okText;busy 提示已降级纯文本;unavailable 提示不可用)。\n * @author ddj 2026年09月03号\n * @param outcome 追加结果状态\n * @param okText 成功文案(如「已添加文件引用」/「已添加文件夹引用」)\n * @returns 状态栏/通知用文案\n */\nexport function statusOfAdd(outcome: AddOutcome, okText: string): string {\n if (outcome === 'ok') return okText\n if (outcome === 'busy') return okText + '(输入框忙,已降级纯文本)'\n return '无法添加到对话(无会话或输入框不可用)'\n}\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) 文本)。\n * @param path 目标路径(相对 cwd 或绝对)\n * @param cwd 会话工作区目录(可选)\n * @param range 行区间(可选)\n * @param appearance 引用外观:'file'(默认)| 'folder'\n */\nexport function buildFileRef(\n path: string,\n cwd: string | undefined,\n range?: RefRange,\n appearance: RefAppearance = 'file',\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,\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}\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(\n sessionId: string | undefined,\n path: string,\n range?: RefRange,\n appearance?: RefAppearance,\n ): 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/** 输入门面插入引用(拦截异常视作未应用,走降级)。\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, appearance) => {\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, appearance)\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 return 'busy'\n }\n return 'ok'\n }\n\n return { appendReference }\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/** 语义 token 解码后的绝对范围(LSP 0-based;type 为插件固定 legend 与 type 名)。 */\nexport interface LspSemanticTokenRange {\n start: LspPosition\n end: LspPosition\n type: string\n modifiers: number\n}\n\n/** 语义 token 中可作为\"可导航标识符\"的类型(ctrl+hover 下划线判定用)。 */\nexport const LSP_NAVIGABLE_TOKEN_TYPES: ReadonlySet<string> = new Set([\n 'variable', 'parameter', 'property', 'function', 'method', 'class', 'enum',\n 'struct', 'interface', 'namespace', 'typeParameter', 'enumMember', 'event', 'type',\n])\n\n/**\n * 语义 token 是否属于可导航标识符。\n * @author ddj 2026年09月02号\n * @param type 语义 token 类型名(插件固定 legend)\n * @returns 是否可导航\n */\nexport function isNavigableTokenType(type: string): boolean {\n return LSP_NAVIGABLE_TOKEN_TYPES.has(type)\n}\n\n/**\n * 解码 LSP delta 编码的语义 token 流为绝对范围数组。\n * @author ddj 2026年09月02号\n * @param data 5 元组 delta 流(host normalizeSemanticData 产物,类型索引对应固定 legend)\n * @param types 固定 legend 类型表(缺省 LSP_SEMANTIC_TOKEN_TYPES)\n * @returns 绝对范围列表(保持文档顺序)\n */\nexport function decodeSemanticTokens(\n data: number[],\n types: readonly string[] = LSP_SEMANTIC_TOKEN_TYPES,\n): LspSemanticTokenRange[] {\n const out: LspSemanticTokenRange[] = []\n let line = 0\n let character = 0\n for (let i = 0; i + 4 < data.length; i += 5) {\n const deltaLine = data[i] ?? 0\n const deltaCharacter = data[i + 1] ?? 0\n const length = Math.max(0, data[i + 2] ?? 0)\n const typeIndex = data[i + 3] ?? 0\n const modifiers = data[i + 4] ?? 0\n line += deltaLine\n character = deltaLine === 0 ? character + deltaCharacter : deltaCharacter\n out.push({\n start: { line, character },\n end: { line, character: character + length },\n type: types[typeIndex] ?? 'variable',\n modifiers,\n })\n }\n return out\n}\n\n/** LSP 服务器能力子集:本插件会用到的方法。 */\nexport interface LspServerCapabilities {\n definition: boolean\n declaration: 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.missingEnv 元素,仅含未满足项)。 */\nexport interface LspMissingEnv {\n id: string // 需求标识(如 dotnet-runtime:10,同时是安装器键)\n label: string // 显示名(如 '.NET 运行时 10.0')\n detail?: string // 说明(哪个服务器需要)\n installable: boolean // 支持一键安装\n manualUrl?: string // 官网手动下载地址\n manualLabel?: string\n}\n\n/** 环境安装进行态(edrv.lsp.envState 载荷元素)。 */\nexport interface LspEnvInstallState {\n id: string\n phase: 'idle' | 'downloading' | 'extracting' | 'done' | 'failed'\n message?: string\n}\n\n/** 同语言检测到的候选服务器(candidates 元素;chosen 标记当前选用者)。 */\nexport interface LspCandidate {\n name: string // 显示名(如 EmmyLua / LuaLS / Roslyn)\n version?: string // 扩展清单版本\n path?: string // 服务器入口路径(argv 比对用)\n chosen?: boolean // 是否为当前解析选用的服务器\n}\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 missingEnv?: LspMissingEnv[] // 未满足的环境需求(无则省略)\n candidates?: LspCandidate[] // 同语言检测到的候选服务器(设置页展示用,无则省略)\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) {\n // 0 条「其它」引用:降级查定义(参数/局部变量只被声明时引用为空,定义可经 host 降级链推导)\n const defs = await findDefinition(path, model.getValue(), position)\n const first = defs[0]\n if (!first) return\n const lspPos = monoToLsp(position.lineNumber, position.column)\n if (sameFile(targetOpenPath(first), path) && posInRange(lspPos, first.lspRange)) return // 定义即自身:无其它可跳,保持静默\n jumpToLocation(first)\n return\n }\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 — Ctrl+hover 可导航标识符下划线提示。\n * 背景:内嵌 Monaco 构建(0.42.0-dev)无 linkDetection contrib,原生不产生 ctrl+hover 下划线,\n * 插件自绘:Ctrl/Meta 按住悬停在\"语义 token 标识符\"上时给词加下划线装饰,移出/松开即清除。\n * 数据来源于语义 token(每 model+version 缓存 60s),不做逐词 LSP 查询。\n * 作者 ddj 2026-09-02\n */\nimport { pathOfModel, fetchSemanticTokens } from './lspClient.js'\nimport { decodeSemanticTokens, isNavigableTokenType } from '../../../shared/lsp.js'\n\nconst CACHE_TTL_MS = 60_000\n\n/**\n * 给一个 Monaco 编辑器绑定 Ctrl+hover 下划线提示(幂等)。\n * @author ddj 2026年09月02号\n * @param ed Monaco 编辑器\n * @param monaco Monaco 实例\n */\nexport function bindLspUnderline(ed, monaco) {\n if (!ed || !monaco || ed.__edrvUnderline) return\n ed.__edrvUnderline = true\n let decoIds = []\n let lastKey = null\n let hoverSeq = 0\n let cache = { path: null, version: -1, ranges: null, at: 0 }\n\n const clear = () => {\n if (decoIds.length) {\n ed.deltaDecorations(decoIds, [])\n decoIds = []\n }\n lastKey = null\n }\n\n /** 取当前文档语义 token 范围(模型版本 + TTL 缓存)。 */\n const rangesOf = async (model) => {\n const path = pathOfModel(model)\n const version = model.getVersionId?.() ?? 0\n if (cache.path === path && cache.version === version && cache.ranges && Date.now() - cache.at < CACHE_TTL_MS) {\n return cache.ranges\n }\n const res = await fetchSemanticTokens(path, model.getValue()).catch(() => null)\n const ranges = res && Array.isArray(res.data) ? decodeSemanticTokens(res.data) : []\n cache = { path, version, ranges, at: Date.now() }\n return ranges\n }\n\n ed.onMouseMove((event) => {\n const native = event?.event\n const ctrl = native?.ctrlKey ?? false\n const meta = native?.metaKey ?? false\n if (!ctrl && !meta) {\n clear()\n hoverSeq++\n return\n }\n const pos = event?.target?.position\n const model = ed.getModel()\n if (!pos || !model) {\n clear()\n hoverSeq++\n return\n }\n const word = model.getWordAtPosition(pos)\n if (!word) {\n clear()\n hoverSeq++\n return\n }\n const seq = ++hoverSeq\n const path = pathOfModel(model)\n void rangesOf(model).then((ranges) => {\n if (seq !== hoverSeq) return // 鼠标已移走,忽略过期结果\n const lineIndex = Math.max(0, word.startLineNumber - 1)\n const startCol = Math.max(0, word.startColumn - 1)\n const endCol = Math.max(startCol, word.endColumn - 1)\n const hit = ranges.some((r) => {\n if (r.start.line !== lineIndex) return false\n return isNavigableTokenType(r.type) && r.start.character <= startCol && r.end.character >= endCol\n })\n if (!hit) {\n if (lastKey !== null) clear()\n return\n }\n const key = String(path) + ':' + word.startColumn + ':' + word.endColumn\n if (key === lastKey) return\n lastKey = key\n decoIds = ed.deltaDecorations(decoIds, [{\n range: new monaco.Range(word.startLineNumber, word.startColumn, word.endLineNumber, word.endColumn),\n options: { inlineClassName: 'edrv-nav-underline' },\n }])\n })\n })\n\n ed.onMouseLeave(() => clear())\n ed.onDidBlurEditorText?.(() => clear())\n}\n\n/** 兼容占位(与 providers 的 hideReferencesOverlay 对称,无需真正释放)。 */\nexport function disposeLspUnderline() {}\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","/**\n * dsh-vscode-mode shared — AI 内联补全契约与纯函数(双面,禁 node/react)。\n * 只放\"过 RPC 的载荷形状\"与无副作用变换:窗口裁剪、prompt 拼装、输出清理。\n * host 与语言模型之间的流式交互在 host 侧 src/ai/inline.ts。\n * 作者 ddj\n */\n\n/** 上下文窗口:前缀字符上限(含未保存编辑的当前文档)。 */\nexport const AI_PREFIX_MAX = 2000\n/** 上下文窗口:后缀字符上限(光标之后不参与补全语义的部分)。 */\nexport const AI_SUFFIX_MAX = 500\n/** 触发门槛:前缀至少 4 个字符才请求(省掉空转调用)。 */\nexport const AI_MIN_PREFIX = 4\n/** 单次补全输出上限(token 预算 + 行数双约束,早停兜底)。 */\nexport const AI_MAX_TOKENS = 120\n/** 输出行数上限:超过即截断(ghost text 太长不可用)。 */\nexport const AI_MAX_LINES = 3\n/** 流式早停:已收字符数达到该值即 abort(省尾部延迟)。 */\nexport const AI_EARLY_STOP_CHARS = 300\n/** 补全请求超时(毫秒):codebuddy CLI 网关实测 TTFT 3.5~8.4s 抖动(debug 实证),\n * 12s 内无任何 token 即放弃;token 一到仍按行数/字符早停。 */\nexport const AI_TIMEOUT_MS = 12000\n\n/** client → host 的补全请求载荷。 */\nexport interface AiInlineRequest {\n /** 当前文档工作区相对路径(语言提示用)。 */\n path: string\n /** 光标前文本(client 已裁剪到 AI_PREFIX_MAX)。 */\n prefix: string\n /** 光标后文本(client 已裁剪到 AI_SUFFIX_MAX)。 */\n suffix: string\n}\n\n/** host → client 的补全结果(text 为空 = 无建议)。 */\nexport interface AiInlineResult {\n /** 建议插入文本(已清理:剥围栏/截行数/去重复)。 */\n text: string\n /** 失败原因(ok:false 或 text 为空时的诊断文案,供状态栏展示)。 */\n note?: string\n}\n\n/** 模型目录条目(含该模型的思考档位元数据)。 */\nexport interface AiModelEntry {\n provider: string\n model: string\n name: string\n /** 无 reasoning 元数据 = 空数组(UI 隐藏档位选择器)。 */\n efforts: Array<{ id: string; name: string }>\n /** 模型默认档位 id(无则空)。 */\n defaultEffort: string\n}\n\n/** 模型目录视图(edrv.ai.models 载荷)。 */\nexport interface AiDirectoryView {\n providers: Array<{ id: string; name: string; models: AiModelEntry[] }>\n /** 目录不可用原因(llm 服务缺失等;ok:false 时亦有 error,此为软降级说明)。 */\n note?: string\n}\n\n/** AI 补全配置视图(edrv.ai.configGet 载荷)。 */\nexport interface AiConfigView {\n enabled: boolean\n /** 空 = 自动选首个 provider/model。 */\n provider: string\n /** 空 = 自动选该 provider 首个模型。 */\n model: string\n /** 空 = 跟随模型默认(请求不携带 reasoningEffort)。 */\n effort: string\n}\n\n/** AI 补全配置更新载荷(edrv.ai.configUpdate)。 */\nexport interface AiConfigPatch {\n enabled?: boolean\n provider?: string\n model?: string\n /** 空 = 清除(跟随默认)。 */\n effort?: string\n}\n\n/**\n * 按 AI_PREFIX_MAX/AI_SUFFIX_MAX 裁剪前后缀(client 侧发请求前调用)。\n * @author ddj\n * @param prefix 光标前全文\n * @param suffix 光标后全文\n * @returns 裁剪后的窗口\n */\nexport function trimInlineWindow(prefix: string, suffix: string): { prefix: string; suffix: string } {\n const pre = typeof prefix === 'string' ? prefix : ''\n const suf = typeof suffix === 'string' ? suffix : ''\n return {\n prefix: pre.length > AI_PREFIX_MAX ? pre.slice(pre.length - AI_PREFIX_MAX) : pre,\n suffix: suf.length > AI_SUFFIX_MAX ? suf.slice(0, AI_SUFFIX_MAX) : suf,\n }\n}\n\n/**\n * 是否值得发起补全请求:前缀达标且非纯空白(空行/行首不请求)。\n * @author ddj\n * @param prefix 光标前文本\n * @returns 是否可请求\n */\nexport function inlineWorth(prefix: string): boolean {\n const pre = typeof prefix === 'string' ? prefix : ''\n if (pre.length < AI_MIN_PREFIX) return false\n // 只拦\"整体无内容\"(纯空白);结尾空白(如 `local a = `)是最自然的补全触发\n // 形态,必须放行——原尾字符守卫把这类场景全数拦截(debug 实证 H4)\n return pre.trim().length > 0\n}\n\n/**\n * 拼装补全 user 消息文本:语言/文件名 + 前缀 + 补全点标记 + 后缀。\n * host 侧与单测共用,保证请求形状一致。\n * @author ddj\n * @param req 补全请求(已裁剪)\n * @returns 用户消息文本\n */\nexport function buildInlinePrompt(req: AiInlineRequest): string {\n const name = String(req.path || '').split(/[\\\\/]/).pop() || 'untitled'\n return [\n '文件:' + name,\n '现有代码(光标位于 <CURSOR> 标记处):',\n req.prefix + '<CURSOR>' + req.suffix,\n ].join('\\n')\n}\n\n/** 补全 system 提示词:硬约束输出形态(只给插入文本)。 */\nexport const AI_INLINE_SYSTEM =\n '你是代码自动补全引擎。只输出应插入 <CURSOR> 处的代码文本:' +\n '禁止任何解释、注释性语句、markdown 代码围栏或对原文的复述;' +\n '最多 ' + AI_MAX_LINES + ' 行,从光标处自然衔接前文,不要重复前缀已有内容;' +\n '无法给出高置信度补全时输出空文本。'\n\n/**\n * 清理模型输出:剥 markdown 围栏、剥对 <CURSOR> 标记的复述、按行数截断、去首尾空行。\n * 产出空文本的判定也在这里(纯函数,单测覆盖)。\n * @author ddj\n * @param raw 模型原始输出\n * @param prefix 请求时的前缀(复述检测)\n * @returns 清理后的插入文本(可能为空串)\n */\nexport function cleanInlineText(raw: string, prefix: string): string {\n let text = typeof raw === 'string' ? raw : ''\n if (!text) return ''\n // markdown 围栏剥离(```lang … ``` 或 ```…```)\n const fenced = /^```[^\\n]*\\n([\\s\\S]*?)\\n?```$/.exec(text.trim())\n if (fenced) text = fenced[1] ?? ''\n // 模型复述了标记本身:取标记之后的部分\n const cursorAt = text.indexOf('<CURSOR>')\n if (cursorAt >= 0) text = text.slice(cursorAt + '<CURSOR>'.length)\n // 整体就是前缀结尾片段的复述:剥掉(防\"从行首重抄一遍\"类退化输出)\n const tailPrefix = prefix.length > 0 ? prefix.slice(-40) : ''\n if (tailPrefix && text.startsWith(tailPrefix)) text = text.slice(tailPrefix.length)\n // 行数截断 + 行尾空白清理\n const lines = text.split('\\n').slice(0, AI_MAX_LINES).map((l) => l.replace(/\\s+$/, ''))\n while (lines.length > 0 && lines[0] === '') lines.shift()\n while (lines.length > 0 && lines[lines.length - 1] === '') lines.pop()\n return lines.join('\\n')\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — AI 内联补全(ghost text)provider。\n * 速度设计:内部 150ms 去抖(Monaco 逐键调用 provider,不逐键打 LLM)、\n * 在飞取消(新请求 abort 旧的)+ 序号守卫(过期响应丢弃)、\n * 位置+前缀缓存(dismiss 后同位置重查不重复计费)、前后缀窗口裁剪。\n * 状态经 edrv:ai-status 事件广播给编辑器底部状态栏;\n * 差异审查期间静默(edrv 差异块存在时返回空,不与 Keep/Undo 浮层打架)。\n * 作者 ddj\n */\nimport { rpc } from '../rpc.js'\nimport { RPC_PATH } from '../../shared/rpc.js'\nimport {\n AI_PREFIX_MAX, AI_SUFFIX_MAX, inlineWorth, trimInlineWindow,\n} from '../../shared/ai.js'\n\n/**\n * 广播补全状态给编辑器底部状态栏(EditorView 监听 edrv:ai-status 渲染)。\n * @author ddj\n * @param state busy=请求中 ok=完成(detail.ms 耗时) error=失败(detail.note) idle=就绪 config=开关变化\n * @param detail 附加信息\n */\nfunction emitAiStatus(state, detail) {\n try { window.dispatchEvent(new CustomEvent('edrv:ai-status', { detail: { state, detail } })) } catch { /* 状态广播失败不影响补全 */ }\n}\n\n/** 去抖等待(毫秒):Monaco 逐键调用 provider,静默该时长才真正发 RPC;\n * 网关 TTFT 本身 3.5s+(debug 实证),client 侧去抖压到 150ms 不再叠加明显延迟。 */\nconst DEBOUNCE_MS = 150\n/** 缓存容量上限(LRU 超限即整体清空;键空间小,够用)。 */\nconst CACHE_MAX = 30\n/** 缓存 TTL(毫秒)。 */\nconst CACHE_TTL_MS = 60_000\n\nlet registered = false\nlet seq = 0\nlet inFlight = null\nlet debounceTimer = null\nconst cache = new Map()\n\n/** 上次开关状态(configUpdate 后经事件刷新,关闭时立即静默)。 */\nlet enabled = false\n\n/** 供设置面板保存后同步开关状态(不重载页面即时生效)。 */\nexport function setAiInlineEnabled(value) {\n enabled = value === true\n emitAiStatus('config', { enabled })\n if (!enabled) {\n seq += 1 // 作废在飞响应\n cache.clear()\n }\n}\n\n/** 当前开关(EditorView 装配时决定是否注册)。 */\nexport function aiInlineEnabled() {\n return enabled\n}\n\n/** 初始化开关(启动时从 configGet 拉一次)。 */\nexport async function initAiInlineState() {\n try {\n const res = await rpc('edrv.ai.configGet', {})\n setAiInlineEnabled(res?.ok && res.enabled === true)\n } catch {\n setAiInlineEnabled(false)\n }\n}\n\n/**\n * 缓存键:路径 + 行:列 + 前缀尾 24 字符(同位置不同文本区分)。\n * @author ddj\n */\nfunction cacheKey(path, line, column, prefix) {\n return path + ':' + line + ':' + column + ':' + String(prefix || '').slice(-24)\n}\n\n/**\n * 差异审查期间静默:编辑器上存在 AI 补全应避让的 pending 差异装饰时返回 true。\n * 通过编辑器实例上的 edrv 差异装饰类名判定,缺失视为无差异。\n * @author ddj\n */\nfunction diffPending(editor) {\n try {\n const model = editor?.getModel?.()\n const decos = model?.getAllDecorations?.() ?? []\n return decos.some((d) => String(d?.options?.className || '').includes('edrv-mn-'))\n } catch {\n return false\n }\n}\n\n/**\n * 注册 AI 内联补全 provider(幂等;Monaco 就绪后调用一次)。\n * @author ddj\n * @param monaco window.monaco\n */\nexport function registerAiInline(monaco) {\n if (registered || !monaco?.languages?.registerInlineCompletionsProvider) return\n registered = true\n monaco.languages.registerInlineCompletionsProvider('*', {\n async provideInlineCompletions(model, position, context, token) {\n const t0 = Date.now()\n if (!enabled || token?.isCancellationRequested) return { items: [] }\n const path = decodeURIComponent(String(model?.uri?.path || '').replace(/^\\//, ''))\n if (!path || model.uri.scheme !== 'edrv') return { items: [] }\n const editor = monacoRef?.activeEditor\n if (editor && diffPending(editor)) return { items: [] }\n const offset = model.getOffsetAt(position)\n const value = model.getValue()\n const trimmed = trimInlineWindow(value.slice(0, offset), value.slice(offset))\n if (!inlineWorth(trimmed.prefix)) return { items: [] }\n const key = cacheKey(path, position.lineNumber, position.column, trimmed.prefix)\n const hit = cache.get(key)\n if (hit && Date.now() - hit.at < CACHE_TTL_MS) {\n return hit.items.length ? { items: hit.items } : { items: [] }\n }\n return new Promise((resolve) => {\n // 去抖:登记最新意图,静默 DEBOUNCE_MS 后才发 RPC;期间新请求顶掉旧的\n seq += 1\n const mySeq = seq\n if (inFlight) { try { inFlight.abort() } catch { /* 已结束 */ } inFlight = null }\n if (debounceTimer) clearTimeout(debounceTimer)\n debounceTimer = setTimeout(async () => {\n debounceTimer = null\n if (mySeq !== seq || token?.isCancellationRequested) { resolve({ items: [] }); return }\n const controller = new AbortController()\n inFlight = controller\n emitAiStatus('busy')\n try {\n const res = await fetch(RPC_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ method: 'edrv.ai.inline', args: { path, prefix: trimmed.prefix, suffix: trimmed.suffix } }),\n signal: controller.signal,\n })\n const data = await res.json()\n if (mySeq !== seq || !data?.ok || typeof data.text !== 'string' || !data.text) {\n cache.set(key, { items: [], at: Date.now() })\n if (data?.note) emitAiStatus('error', { note: String(data.note) })\n else emitAiStatus('idle')\n resolve({ items: [] })\n return\n }\n const items = [{ insertText: data.text, range: undefined }]\n cacheSet(key, items)\n emitAiStatus('ok', { ms: Date.now() - t0 })\n resolve({ items })\n } catch (error) {\n emitAiStatus('error', { note: String(error && error.message || error).slice(0, 80) })\n resolve({ items: [] })\n } finally {\n if (inFlight === controller) inFlight = null\n }\n }, DEBOUNCE_MS)\n // 提前取消:token 取消/新请求顶替时清掉待发定时器\n const guard = setInterval(() => {\n if (mySeq !== seq || token?.isCancellationRequested) {\n clearInterval(guard)\n if (debounceTimer) { clearTimeout(debounceTimer); debounceTimer = null }\n resolve({ items: [] })\n } else if (!debounceTimer) {\n clearInterval(guard)\n }\n }, 120)\n })\n },\n freeInlineCompletions() { /* 无资源需释放 */ },\n })\n}\n\n/** 缓存写入(超限整体清空,LRU 简化)。 */\nfunction cacheSet(key, items) {\n if (cache.size >= CACHE_MAX) cache.clear()\n cache.set(key, { items, at: Date.now() })\n}\n\n/** EditorView ref 注入口(差异静默判定用当前编辑器)。 */\nlet monacoRef = null\n\n/** EditorView 装配后调用(注册 provider + 初始化开关)。 */\nexport function setupAiInline(monaco) {\n monacoRef = monaco && { activeEditor: null }\n if (!registered) registerAiInline(monaco)\n void initAiInlineState()\n}\n\n/** EditorView 每次创建/切换编辑器实例时刷新引用。 */\nexport function trackAiEditor(editor) {\n if (monacoRef) monacoRef.activeEditor = editor\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — EditorView:中央 VSCode 式文件编辑器(编排层)。\n * 迁移自原 src/client/index.ts 的 EditorView,语义不改;差异自绘已抽到 monaco/diffRender。\n * 职责:页签/QuickOpen/Monaco 编辑器/差异审查(DiffBox/Launcher/Badge 事件装配)/状态栏/自动保存。\n * 状态作用域:页签/视图状态/侧边栏/展开树等 UI 状态按工作区作用域(cwd)隔离,\n * 同一工作区切换对话恢复同一份状态;无 cwd 会话回退按会话隔离(scopeStore)。\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 { dataUrlOf, isImagePath, isSvgPath } from '../imagePreview.js'\nimport { base64ToBytes, isPdfPath } from '../pdfPreview.js'\nimport { createPdfPanel } from '../pdf/pdfPanel.js'\nimport { applyOfficial, 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 { CommandPalette } from './CommandPalette.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 { migrateScopedKeys, workspaceScopeOf } from '../state/scopeStore.js'\nimport { modelsForScope, rememberModel } from '../state/modelCache.js'\nimport { bindingsOf, chordOf, matchEvent, useKeybindingsVersion } from '../keybindings.js'\nimport { getSidebarMinWidth } from '../sidebarMin.js'\nimport { navHistoryFor } from '../navHistory.js'\nimport { statusOfAdd } from '../addToConversation.js'\nimport { CACHE_KEY } from '../paths.js'\nimport { bindLspEditor, runGoToDefinition, runFindReferences, hideReferencesOverlay } from '../monaco/lsp/providers.js'\nimport { bindLspUnderline } from '../monaco/lsp/underline.js'\nimport { onLspProgress, refreshStatus } from '../monaco/lsp/index.js'\nimport { setupAiInline, trackAiEditor, aiInlineEnabled } from '../ai/inlineProvider.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 // 当前会话工作区 cwd(sessions 快照反应式读取;cwd 变化时作用域跟随刷新)\n const sessionsList = props?.sessions?.list\n const cwd = React.useSyncExternalStore(\n React.useCallback((onStoreChange) => (\n typeof sessionsList?.subscribe === 'function' ? sessionsList.subscribe(onStoreChange) : () => {}\n ), [sessionsList]),\n () => sessionsList?.getSnapshot?.()?.byId?.[sessionId]?.cwd ?? null,\n () => null,\n )\n // 状态作用域(scopeStore):同工作区共享一份编辑区状态,无 cwd 回退会话隔离;\n // 迁移放渲染期(useMemo)——子面板恢复 effect 先于父 effect 执行,须先补齐工作区键\n const scope = React.useMemo(() => {\n const s = workspaceScopeOf(cwd, sessionId)\n migrateScopedKeys(s, sessionId)\n return s\n }, [cwd, sessionId])\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 [imageSrc, setImageSrc] = React.useState(null) // 图片预览 data URL(图片 tab 专用,文本 tab 恒为 null)\n const [imgSize, setImgSize] = React.useState(null) // 图片自然尺寸 { w, h }(路径栏 meta)\n const [imgBroken, setImgBroken] = React.useState(false) // 图片解码失败(onError),显示占位与重试\n const svgTextRef = React.useRef(new Set()) // 强制以文本打开的 SVG 路径集合(toggleSvgText 维护)\n const [pdfBytes, setPdfBytes] = React.useState(null) // 当前 PDF tab 的原始字节(null=加载中/非 PDF)\n const pdfB64CacheRef = React.useRef(new Map()) // path → base64(tab 切回免重读;FIFO 上限防内存膨胀)\n const pdfCtlRef = React.useRef(new Map()) // path → PDF 面板控制器(mount 产出,关闭/卸载销毁)\n const pdfHostRef = React.useRef(null) // PDF 面板外壳 div(命令式控制器接管)\n const [status, setStatus] = React.useState('')\n const [lspServers, setLspServers] = React.useState([])\n // AI 补全状态(底部状态栏段):{ state: idle|busy|ok|error, detail, enabled }\n const [aiStatus, setAiStatus] = React.useState({ state: 'idle', detail: null, enabled: false })\n const aiStatusTimer = React.useRef(null)\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(() => getSidebarMinWidth()) // 侧边栏宽度(初值 = 最小宽度,默认 300)\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(null)\n // model 跨挂载缓存(按工作区作用域):重挂载秒显内容,消除切换对话闪烁\n if (!modelsRef.current) modelsRef.current = modelsForScope(scope)\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 restoredScopeRef = React.useRef(null) // 已恢复状态的作用域(cwd 晚到 sid→ws 时允许重恢复)\n const pendingFocusRef = React.useRef(null) // { path, region } 内容加载后跳转\n // 导航历史(后退/前进):跨文件焦点位置;按会话隔离,会话切换重置\n const navRef = React.useRef(null)\n if (!navRef.current) navRef.current = navHistoryFor(scope)\n const navPendingRef = React.useRef(null) // { path,line,column,viewState } 待恢复条目(内容就绪后消费)\n const navCursorTimerRef = React.useRef(null) // 光标位置防抖记录计时器\n const navBackRef = React.useRef(null) // 后退动作最新闭包(窗口级键盘监听读取)\n const navForwardRef = React.useRef(null) // 前进动作最新闭包(窗口级键盘监听读取)\n const cycleTabRef = React.useRef(null) // 页签循环动作最新闭包(Ctrl+Alt+←/→、Ctrl+PgUp/PgDn)\n const rowNavColRef = React.useRef(null) // 整行上下移动的期望列(连续移动保持列位)\n const rowNavMoveRef = React.useRef(false) // 本次光标变化是否由整行移动触发(否则清空期望列)\n const activeRef = React.useRef(null) // 当前活动文件的最新值(空依赖闭包/指令回调读取)\n activeRef.current = active\n const tabsHostRef = React.useRef(null) // 页签栏容器(切换后把当前页签滚入可见区)\n const [navTick, setNavTick] = React.useState(0) // 历史可用性版本(按钮 disabled 重渲染)\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 onEditRef = React.useRef(null) // 编辑置脏的最新闭包(Monaco 内容变化监听经 ref 调用,防首帧 active=null 陈旧闭包)\n const saveViewStateRef = React.useRef(null) // 视图状态保存的最新闭包(卸载清理读取,避免过期 active)\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 // 当前 tab 是否处于图片预览模式(与 loadContent 的分派条件同源;SVG 文本模式时为 false)\n const isImageActive = !!active && isImagePath(active) && !svgTextRef.current.has(active)\n // 当前 tab 是否为 PDF 面板(与 loadContent 分派条件同源)\n const isPdfActive = !!active && isPdfPath(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(scope, viewStatesRef.current)\n } catch (e) { /* 视图状态保存失败忽略 */ }\n }\n saveViewStateRef.current = saveViewState\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 /**\n * 采集当前焦点条目:路径从编辑器 model 实时读取(避免空依赖闭包读到过期 active),\n * 位置/viewState 从编辑器读取;编辑器或模型未就绪 → null。\n * @author ddj 2026年09月04号\n * @returns 导航历史条目或 null\n */\n const captureNavEntry = () => {\n const ed = editorRef.current\n const model = ed?.getModel?.()\n const uriPath = model?.uri?.path\n if (!ed || !uriPath) return null\n let line = null\n let column = null\n try {\n const pos = ed.getPosition?.()\n if (pos) { line = pos.lineNumber; column = pos.column }\n } catch (e) { /* 位置读取失败降级为仅路径 */ }\n let viewState = null\n try { viewState = ed.saveViewState() } catch (e) { /* 快照失败忽略 */ }\n return { path: decodeURIComponent(String(uriPath).replace(/^\\//, '')), line, column, viewState }\n }\n\n /**\n * 记录当前位置到导航历史(同位置去重由历史模块处理;可用性变化时刷新按钮)。\n * @author ddj 2026年09月04号\n */\n const recordNav = () => {\n const entry = captureNavEntry()\n if (!entry) return\n const wasBack = navRef.current.canBack()\n const wasForward = navRef.current.canForward()\n navRef.current.record(entry)\n if (navRef.current.canBack() !== wasBack || navRef.current.canForward() !== wasForward) {\n setNavTick((v) => v + 1)\n }\n }\n\n /**\n * 跳到历史条目:保存当前视图状态后打开目标文件,内容就绪后恢复焦点。\n * @author ddj 2026年09月04号\n * @param entry 目标历史条目\n */\n const navigateTo = (entry) => {\n if (!entry || !entry.path) return\n flushSave()\n saveViewState(active)\n navPendingRef.current = entry\n addTab(entry.path, true)\n setFocusRequest((value) => value + 1) // 目标已是活动文件时也触发恢复\n }\n\n /**\n * 立即落盘待记录的光标位置(后退/前进前调用:<500ms 内刚移动的光标也算入历史)。\n * @author ddj 2026年09月04号\n */\n const flushNavCursor = () => {\n if (!navCursorTimerRef.current) return\n clearTimeout(navCursorTimerRef.current)\n navCursorTimerRef.current = null\n recordNav()\n }\n\n /**\n * 后退:恢复上一处焦点(跨文件)。\n * @author ddj 2026年09月04号\n */\n const navBack = () => {\n flushNavCursor()\n const entry = navRef.current.back()\n if (!entry) return\n navigateTo(entry)\n setNavTick((v) => v + 1)\n }\n\n /**\n * 前进:恢复下一处焦点(跨文件)。\n * @author ddj 2026年09月04号\n */\n const navForward = () => {\n flushNavCursor()\n const entry = navRef.current.forward()\n if (!entry) return\n navigateTo(entry)\n setNavTick((v) => v + 1)\n }\n navBackRef.current = navBack\n navForwardRef.current = navForward\n\n const closeTab = (path) => {\n flushSave()\n if (path === active) { saveViewState(path); recordNav() }\n // PDF tab 关闭:销毁面板控制器并清缓存(未保存注释随之丢弃,脏点已提示)\n const pdfCtl = pdfCtlRef.current.get(path)\n if (pdfCtl) { pdfCtl.destroy(); pdfCtlRef.current.delete(path) }\n pdfB64CacheRef.current.delete(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 * 在已打开页签间循环切换(文件分页归编辑器自带页签栏)。\n * @author ddj 2026年09月10号\n * @param step 步进(+1 下一个 / -1 上一个)\n */\n const cycleTab = (step) => {\n if (tabs.length < 2) return\n const idx = tabs.findIndex((t) => t.path === active)\n const next = tabs[(idx + step + tabs.length) % tabs.length]\n if (!next || next.path === active) return\n flushSave()\n saveViewState(active)\n recordNav()\n setActive(next.path)\n }\n cycleTabRef.current = cycleTab\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 // 图片文件走专用通道:base64 → data URL 预览,不建 Monaco model、不进文本/差异流程\n if (isImagePath(path) && !svgTextRef.current.has(path)) {\n loadImage(path, sid, seq)\n return\n }\n // PDF 文件走专用通道:base64 → PDF 面板(浏览 + 注释编辑),不建 Monaco model\n if (isPdfPath(path)) {\n loadPdf(path, sid, seq, force === true)\n return\n }\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 * 加载图片文件为 data URL(编辑区只读预览);失败走 loadError 面板(重试经 loadContent 分派回此)。\n * @author ddj 2026年09月08号\n * @param path 图片文件路径\n * @param sid 会话 id\n * @param seq 加载序号(过期响应丢弃)\n */\n const loadImage = (path, sid, seq) => {\n setImageSrc(null)\n setImgSize(null)\n setImgBroken(false)\n setLoadStage({ progress: monaco ? 72 : 12, message: '读取图片…' })\n rpc('edrv.read', { sessionId: sid, path, encoding: 'base64' }).then((res) => {\n if (seq !== loadSeqRef.current || path !== active) return\n if (res && res.ok && res.encoding === 'base64') {\n if (!res.mime) {\n setLoadError('host 版本过旧:图片响应缺少 mime')\n setError('host 版本过旧:图片响应缺少 mime')\n setStatus('读取失败')\n return\n }\n setImageSrc(dataUrlOf(res.content, res.mime))\n setLoadStage({ progress: 100, message: '图片已就绪' })\n setStatus('已加载')\n return\n }\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 }).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 * 加载 PDF 文件为原始字节(编辑区 PDF 面板);命中 base64 缓存秒切,force 绕过缓存重读。\n * 面板控制器由 pdf host mount effect 产出(per-path,关闭/卸载销毁)。\n * @author ddj 2026年09月22号\n * @param path PDF 文件路径\n * @param sid 会话 id\n * @param seq 加载序号(过期响应丢弃)\n * @param force true=绕过缓存强制 RPC 重读(刷新按钮)\n */\n const loadPdf = (path, sid, seq, force) => {\n setPdfBytes(null)\n setLoadStage({ progress: monaco ? 72 : 12, message: '读取 PDF…' })\n const cache = pdfB64CacheRef.current\n const hit = !force ? cache.get(path) : undefined\n if (typeof hit === 'string' && hit) {\n // 刷新插入序(Map 按插入序 FIFO 驱逐)后秒切\n cache.delete(path)\n cache.set(path, hit)\n setPdfBytes(base64ToBytes(hit))\n setLoadStage({ progress: 100, message: 'PDF 已就绪' })\n setStatus('已加载')\n return\n }\n rpc('edrv.read', { sessionId: sid, path, encoding: 'base64' }).then((res) => {\n if (seq !== loadSeqRef.current || path !== active) return\n if (res && res.ok && res.encoding === 'base64') {\n cache.set(path, res.content)\n while (cache.size > 6) cache.delete(cache.keys().next().value)\n setPdfBytes(base64ToBytes(res.content))\n setLoadStage({ progress: 100, message: 'PDF 已就绪' })\n setStatus('已加载')\n return\n }\n const base = res?.error ? String(res.error) : '读取失败'\n const message = res?.resolvedPath ? base + ':' + String(res.resolvedPath) : base\n setLoadError(message)\n setError(message)\n setStatus('读取失败')\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 // AI 补全状态事件:busy/ok/error/idle 即时上栏;ok 3s、error 10s 后回落就绪\n React.useEffect(() => {\n const apply = (state, detail) => {\n if (aiStatusTimer.current) { clearTimeout(aiStatusTimer.current); aiStatusTimer.current = null }\n setAiStatus((prev) => ({ state, detail: detail ?? null, enabled: state === 'config' ? detail?.enabled === true : prev.enabled }))\n if (state === 'ok') aiStatusTimer.current = setTimeout(() => setAiStatus((p) => (p.state === 'ok' ? { ...p, state: 'idle' } : p)), 3000)\n else if (state === 'error') aiStatusTimer.current = setTimeout(() => setAiStatus((p) => (p.state === 'error' ? { ...p, state: 'idle' } : p)), 10000)\n }\n const onAiStatus = (e) => { if (e?.detail?.state) apply(e.detail.state, e.detail.detail) }\n const onAiConfig = (e) => apply('config', { enabled: e?.detail?.enabled === true })\n window.addEventListener('edrv:ai-status', onAiStatus)\n window.addEventListener('edrv:ai-config', onAiConfig)\n apply('config', { enabled: aiInlineEnabled() })\n return () => {\n window.removeEventListener('edrv:ai-status', onAiStatus)\n window.removeEventListener('edrv:ai-config', onAiConfig)\n if (aiStatusTimer.current) clearTimeout(aiStatusTimer.current)\n }\n }, [])\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 recordNav()\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 recordNav()\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 恢复页签(按工作区作用域;cwd 晚到 sid→ws 切换时重恢复一次)\n React.useEffect(() => {\n if (!sessionId || restoredScopeRef.current === scope) return\n restoredScopeRef.current = scope\n // model 缓存跟随作用域(切工作区释放旧作用域模型;同工作区跨挂载复用)\n modelsRef.current = modelsForScope(scope)\n viewStatesRef.current = viewStatesLoad(scope)\n try {\n const raw = localStorage.getItem(CACHE_KEY.editor + String(scope))\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, scope])\n\n // 导航历史按工作区作用域隔离:同工作区切换对话保留历史,跨工作区换实例\n React.useEffect(() => {\n navRef.current = navHistoryFor(scope)\n navPendingRef.current = null\n if (navCursorTimerRef.current) { clearTimeout(navCursorTimerRef.current); navCursorTimerRef.current = null }\n setNavTick((v) => v + 1)\n }, [scope])\n\n React.useEffect(() => {\n if (!sessionId) return\n try { localStorage.setItem(CACHE_KEY.editor + String(scope), JSON.stringify({ tabs: tabs.map((t) => t.path), active })) }\n catch (e) { /* 忽略 */ }\n }, [tabs, active, sessionId, scope])\n\n // 侧边栏状态:恢复(显隐/宽度/激活面板);侧栏形态独立键(默认收起,不共享页签形态偏好)\n // 宽度下限来自通用设置 sidebarMinWidth(默认 300),恢复值按其重夹\n const sidebarKey = CACHE_KEY.sidebar + (layout === 'side' ? 'side.' : '') + String(scope)\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(getSidebarMinWidth(), Math.min(560, saved.width)))\n if (typeof saved.panel === 'string') setActivePanel(saved.panel)\n }\n } catch (e) { /* 损坏忽略 */ }\n }, [sessionId, sidebarKey])\n\n // 侧边栏最小宽度设置变更(edrv:sidebar-min-width)→ 更新 minW 并重夹当前宽度\n const [sidebarMinW, setSidebarMinW] = React.useState(() => getSidebarMinWidth())\n React.useEffect(() => {\n const onMinChange = () => {\n setSidebarMinW(getSidebarMinWidth())\n setSidebarW((w) => Math.max(getSidebarMinWidth(), w))\n }\n window.addEventListener('edrv:sidebar-min-width', onMinChange)\n return () => window.removeEventListener('edrv:sidebar-min-width', onMinChange)\n }, [])\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 // 切换侧边栏(capture 抢占,避免与 DSH 全局冲突;键位随快捷键配置)\n React.useEffect(() => {\n const onKey = (e) => {\n if (!matchEvent(e, bindingsOf('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, bindingsOf('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, bindingsOf('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 // 后退/前进:导航历史(跨文件焦点位置;经 ref 读最新闭包,避免空依赖过期)\n React.useEffect(() => {\n const onKey = (e) => {\n if (!matchEvent(e, bindingsOf('edrv.navigateBack'))) return\n e.preventDefault(); e.stopPropagation()\n if (navBackRef.current) navBackRef.current()\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n React.useEffect(() => {\n const onKey = (e) => {\n if (!matchEvent(e, bindingsOf('edrv.navigateForward'))) return\n e.preventDefault(); e.stopPropagation()\n if (navForwardRef.current) navForwardRef.current()\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n // 页签循环切换:Ctrl+Alt+←/→(主候选,浏览器不占用)或 Ctrl+PgUp/PgDn(部分宿主可用)\n React.useEffect(() => {\n const onKey = (e) => {\n const step = matchEvent(e, bindingsOf('edrv.nextTab')) ? 1\n : matchEvent(e, bindingsOf('edrv.prevTab')) ? -1\n : 0\n if (step === 0) return\n e.preventDefault(); e.stopPropagation()\n if (cycleTabRef.current) cycleTabRef.current(step)\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n // 整行上下移动的实现见下方「指令系统接线」effect(moveRow 单点定义,命令栏与键位共用)。\n\n /**\n * 指令系统接线:命令栏/键位/第三方派发的 `edrv.command.*` 事件落到编辑器动作。\n * 全部动作经最新闭包执行(与窗口级键位监听同源);事件名逐条字面书写,\n * 便于与指令目录(ui/commandCatalog)静态对照(tests/commands.test.ts 有断言)。\n * @author ddj 2026年09月10号\n */\n React.useEffect(() => {\n /** 整行上下移动:Monaco 内置 cursorUp/Down 会丢列位,故按期望列自行定位(连续移动保持同列)。 */\n const moveRow = (step) => {\n const ed = editorRef.current\n const model = ed?.getModel?.()\n const pos = ed?.getPosition?.()\n if (!ed || !model || !pos) return\n const col = rowNavColRef.current ?? pos.column\n const line = Math.max(1, Math.min(model.getLineCount(), pos.lineNumber + step))\n if (line === pos.lineNumber) return\n const maxCol = model.getLineMaxColumn(line)\n rowNavColRef.current = col\n rowNavMoveRef.current = true\n ed.setPosition({ lineNumber: line, column: Math.max(1, Math.min(col, maxCol)) })\n ed.revealLineInCenterIfOutsideViewport?.(line)\n }\n const handlers = [\n ['edrv.command.save', () => { if (editorRef.current?.getModel?.()) { flushSave(); doSaveRef.current?.(false) } }],\n // 快速打开由 QuickOpen 自己接该事件(它持有搜索框 ref),此处不重复实现\n ['edrv.command.toggleSidebar', () => setSidebarOn((v) => !v)],\n ['edrv.command.searchInFiles', () => {\n setSidebarOn(true)\n setActivePanel('search')\n setTimeout(() => window.dispatchEvent(new CustomEvent('edrv:search-focus')), 0)\n }],\n ['edrv.command.navigateBack', () => navBackRef.current?.()],\n ['edrv.command.navigateForward', () => navForwardRef.current?.()],\n ['edrv.command.nextTab', () => cycleTabRef.current?.(1)],\n ['edrv.command.prevTab', () => cycleTabRef.current?.(-1)],\n ['edrv.command.nextEditorRow', () => moveRow(1)],\n ['edrv.command.prevEditorRow', () => moveRow(-1)],\n ['edrv.command.goToDefinition', () => { const ed = editorRef.current; if (ed) void runGoToDefinition(ed) }],\n ['edrv.command.findReferences', () => { const ed = editorRef.current; if (ed) void runFindReferences(ed) }],\n ['edrv.command.triggerAi', () => editorRef.current?.trigger?.('edrv-ai', 'editor.action.inlineSuggest.trigger', null)],\n ['edrv.command.openInExplorer', () => {\n const path = activeRef.current\n if (!path) { setStatus('无活动文件'); return }\n menuHandlersRef.current?.openInExplorer?.(path)\n }],\n ]\n const byName = new Map(handlers)\n const onCommand = (event) => {\n const action = byName.get(event.type)\n if (!action) return\n try { action() } catch (error) { dbg(sessionId, '指令 ' + event.type + ' 失败:' + String(error)) }\n }\n for (const [eventName] of handlers) window.addEventListener(eventName, onCommand)\n return () => {\n for (const [eventName] of handlers) window.removeEventListener(eventName, onCommand)\n }\n }, [sessionId])\n\n // 活动页签滚动可见(页签栏溢出时键盘切换/打开文件后把当前页签带回视野):\n // 只调整页签栏自身 scrollLeft,不触发页面滚动。\n React.useEffect(() => {\n const host = tabsHostRef.current\n if (!host) return\n const el = host.querySelector?.('.edrv-tab-active')\n if (!el) return\n const left = el.offsetLeft\n const right = left + el.offsetWidth\n if (left < host.scrollLeft) host.scrollLeft = left\n else if (right > host.scrollLeft + host.clientWidth) host.scrollLeft = right - host.clientWidth\n }, [active, tabs.length])\n\n // 鼠标侧键后退/前进:Logitech 官方默认「后退/前进」= XButton 鼠标事件(button 3/4),不产生键盘事件。\n // pointerdown 触发导航(preventDefault 后兼容 mousedown 可能不再触发,避免双触发);\n // mousedown 兜底仅取消浏览器历史导航默认动作(MDN:preventDefault mousedown/pointerdown 可抑制)。\n // @author ddj 2026年09月02号\n React.useEffect(() => {\n const onPointer = (e) => {\n if (e?.button !== 3 && e?.button !== 4) return\n e.preventDefault(); e.stopPropagation()\n const ref = e.button === 3 ? navBackRef : navForwardRef\n if (ref.current) ref.current()\n }\n const onMouse = (e) => {\n if (e?.button !== 3 && e?.button !== 4) return\n e.preventDefault(); e.stopPropagation()\n }\n window.addEventListener('pointerdown', onPointer, true)\n window.addEventListener('mousedown', onMouse, true)\n return () => {\n window.removeEventListener('pointerdown', onPointer, true)\n window.removeEventListener('mousedown', onMouse, true)\n }\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 setImageSrc(null)\n setImgSize(null)\n setImgBroken(false)\n setPdfBytes(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) => {\n if (!alive) return\n setMonaco(m)\n // AI 内联补全 provider 注册 + 开关初始化(幂等)\n setupAiInline(m)\n }).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 就绪后注册现役双套(幂等)+ 应用跟随官方的令牌主题;\n // 官方主题事件(edrv:theme-change,经 ctx.theme/属性观察广播)与系统明暗切换时跟随重刷。\n React.useEffect(() => {\n if (!monaco) return\n registerThemes(monaco)\n const apply = () => applyOfficial(monaco)\n apply()\n window.addEventListener('edrv:theme-change', apply)\n const query = typeof window.matchMedia === 'function' ? window.matchMedia('(prefers-color-scheme: dark)') : null\n if (query) {\n if (typeof query.addEventListener === 'function') query.addEventListener('change', apply)\n else query.addListener(apply)\n }\n return () => {\n window.removeEventListener('edrv:theme-change', apply)\n if (!query) return\n if (typeof query.removeEventListener === 'function') query.removeEventListener('change', apply)\n else query.removeListener(apply)\n }\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 // 注册表守卫:同 URI 已存在的 model 直接复用(HMR 换 bundle 后防重复创建抛错)\n const uri = window.monaco.Uri.parse('edrv:///' + encodeURI(path))\n model = window.monaco.editor.getModel(uri) || window.monaco.editor.createModel(text ?? '', langOf(path), uri)\n rememberModel(cache, 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 if (!active) return\n // PDF tab:保存委托给面板控制器(saveDocument → base64 → edrv.saveBinary)\n if (isPdfPath(active)) {\n const ctl = pdfCtlRef.current.get(active)\n if (!ctl) { if (!silent) setStatus('PDF 未就绪'); return }\n if (!ctl.isDirty()) { if (!silent) setStatus('PDF 无未保存修改'); return }\n void ctl.savePdf()\n return\n }\n const ed = editorRef.current\n if (!ed) return\n if (isImageActive) { setStatus('图片只读预览'); 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 // @author ddj 2026年09月09号 空依赖监听只持有首帧 onEdit(active 恒 null→提前返回,星号与自动保存从未生效):每次渲染同步最新闭包\n onEditRef.current = onEdit\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 // PDF 面板外壳 ref 回调(div 仅在 PDF 分支渲染,refs 先于 effect 就绪)\n const ensurePdfHost = (node) => { pdfHostRef.current = node }\n\n // PDF 面板装配:控制器挂进外壳 div,切换 tab/卸载即销毁(重开重挂,base64 缓存兜底秒切)\n React.useEffect(() => {\n const host = pdfHostRef.current\n if (!isPdfActive || !pdfBytes || !host) return\n const path = active\n const ctl = createPdfPanel({\n sessionId,\n path,\n setStatus,\n setError,\n onDirtyChange: (d) => setDirtyMap((prev) => Object.assign({}, prev, { [path]: d })),\n onReload: () => loadContent(path, sessionId, true),\n })\n pdfCtlRef.current.set(path, ctl)\n void ctl.mount(host, pdfBytes)\n return () => {\n ctl.destroy()\n if (pdfCtlRef.current.get(path) === ctl) pdfCtlRef.current.delete(path)\n }\n }, [isPdfActive, pdfBytes, active])\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 // 卸载即切作用域/重挂载:先把待记录光标落进历史,再存当前文件视图状态\n //(经 ref 取最新闭包,修正旧实现捕获挂载时 active 的问题)\n flushNavCursor()\n saveViewStateRef.current?.()\n diffRendererRef.current?.dispose?.()\n hideReferencesOverlay()\n if (editorRef.current) { editorRef.current.dispose(); editorRef.current = null }\n // model 不在此销毁:跨挂载缓存按作用域存活(modelCache 切作用域时统一释放)\n for (const ctl of pdfCtlRef.current.values()) ctl.destroy()\n pdfCtlRef.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 // AI 内联补全(ghost text):开关经 edrv.ai.configGet 拉取;provider 见 client/ai/inlineProvider\n inlineSuggest: { enabled: true },\n })\n // 保存改由窗口级快捷键监听执行(键位可配置;见上方 edrv.save 监听)\n ed.onDidChangeModelContent(() => {\n if (!ed.getModel() || programmaticRef.current) return\n onEditRef.current?.()\n })\n ed.onDidChangeCursorPosition((e) => {\n setCursor('Ln ' + e.position.lineNumber + ', Col ' + e.position.column)\n // 整行移动(↓↑)刚定位时保留期望列;其余光标移动(点击/打字/方向键)清空期望列\n if (rowNavMoveRef.current) rowNavMoveRef.current = false\n else rowNavColRef.current = null\n // 导航历史:同文件内光标移动防抖记录(程序化恢复触发的位置与栈顶去重,无副作用)\n if (navCursorTimerRef.current) clearTimeout(navCursorTimerRef.current)\n navCursorTimerRef.current = setTimeout(() => {\n navCursorTimerRef.current = null\n recordNav()\n }, 500)\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 // 整行上下移动 + 命令栏:只登记 Monaco 右键菜单入口(不绑键位)。\n // 键位由指令桥统一 capture 派发 `edrv.command.*`,此处再绑一次会双执行。\n ed.addAction({\n id: 'edrv.prevEditorRow', label: '上一编辑行', contextMenuGroupId: '1_edrv',\n run: () => window.dispatchEvent(new CustomEvent('edrv.command.prevEditorRow')),\n })\n ed.addAction({\n id: 'edrv.nextEditorRow', label: '下一编辑行', contextMenuGroupId: '1_edrv',\n run: () => window.dispatchEvent(new CustomEvent('edrv.command.nextEditorRow')),\n })\n ed.addAction({\n id: 'edrv.showCommands', label: '显示所有命令', contextMenuGroupId: '1_edrv',\n run: () => window.dispatchEvent(new CustomEvent('edrv.command.showCommands')),\n })\n bindLspEditor(ed)\n bindLspUnderline(ed, m)\n // AI 补全:编辑器实例登记(差异静默判定用)+ Alt+\\ 手动触发 ghost text\n trackAiEditor(ed)\n ed.addCommand(m.KeyMod.Alt | m.KeyCode.Backslash, () => {\n ed.trigger('edrv-ai', 'editor.action.inlineSuggest.trigger', null)\n })\n // hover 差异块 → 浮出 Keep/Undo(req:鼠标移到编辑区差异块时显示)\n // 防闪烁:① 区域不变不 setState(浮窗锚定差异块起始行,不跟随鼠标);② 延迟隐藏;\n // ③ 浮窗自身 onMouseEnter 取消隐藏计时(鼠标在浮窗与编辑器间移动不闪)。\n const hideSoon = () => {\n if (hoverEditorRef.current || hoverPanelRef.current || hideTimerRef.current) return\n hideTimerRef.current = setTimeout(() => {\n hideTimerRef.current = null\n if (hoverEditorRef.current || hoverPanelRef.current) return\n hoverKeyRef.current = null\n hoverTopRef.current = null\n setHoverAct(null)\n }, 180)\n }\n ed.onMouseMove((e) => {\n hoverEditorRef.current = true\n const line = e?.target?.position?.lineNumber\n const map = lineRegionMapRef.current\n if (!line || !map.size) { hoverEditorRef.current = false; hideSoon(); return }\n const hit = map.get(line)\n if (!hit) { hoverEditorRef.current = false; hideSoon(); return }\n const key = callIdAttr(hit.callId, hit.idx)\n const top = Math.max(0, ed.getTopForLineNumber(Math.max(1, hit.start)) - ed.getScrollTop())\n const layout = ed.getLayoutInfo()\n const minimapLeft = layout.minimap?.minimapLeft || 0\n const right = minimapLeft > 0 ? Math.max(12, layout.width - minimapLeft + 8) : Math.max(12, layout.verticalScrollbarWidth + 8)\n if (hoverKeyRef.current === key && hoverTopRef.current === top && hoverRightRef.current === right) return // 同区域同位置不重复更新\n hoverKeyRef.current = key\n hoverTopRef.current = top\n hoverRightRef.current = right\n if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }\n setHoverAct({ region: hit, top, right })\n })\n editorRef.current = ed\n }, [])\n\n // 打开文件后的跳转(导航历史恢复/差异聚焦/搜索行列跳转,内容就绪后执行一次)\n React.useEffect(() => {\n const ed = editorRef.current\n if (!ed || content === null) return\n // 导航历史恢复优先:viewState 快照恢复滚动/折叠,行列补定位\n const nav = navPendingRef.current\n if (nav && nav.path === active) {\n navPendingRef.current = null\n if (nav.viewState) {\n try { ed.restoreViewState(nav.viewState) } catch (e) { /* 非法快照忽略(行号越界自动兜底) */ }\n }\n if (nav.line != null) {\n ed.revealLineInCenter(Math.max(1, nav.line))\n ed.setPosition({ lineNumber: Math.max(1, nav.line), column: Math.max(1, nav.column ?? 1) })\n }\n ed.focus()\n return\n }\n const pf = pendingFocusRef.current\n if (!pf || pf.path !== active) 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 * SVG 在图片预览与文本编辑间切换(按路径记忆;重载分派随集合状态自动路由)。\n * @author ddj 2026年09月08号\n * @param path SVG 文件路径\n */\n const toggleSvgText = (path) => {\n const next = new Set(svgTextRef.current)\n if (next.has(path)) next.delete(path)\n else next.add(path)\n svgTextRef.current = next\n setContent(null)\n setContentPath(null)\n setImageSrc(null)\n setImgSize(null)\n setImgBroken(false)\n setLoadError(null)\n setStatus(next.has(path) ? '已切换为文本模式' : '已切换为图片预览')\n loadContent(path, sessionId, true)\n }\n\n /**\n * 图片预览面板:工具条(尺寸 meta / SVG 文本切换 / 刷新)+ 棋盘底自适应图片。\n * @author ddj 2026年09月08号\n */\n const imagePanel = () => React.createElement('div', { className: 'edrv-imgview' },\n React.createElement('div', { className: 'edrv-imgview-bar' },\n React.createElement('span', { className: 'edrv-imgview-meta' },\n imgBroken ? '图片无法显示' : (imgSize ? imgSize.w + '×' + imgSize.h : '…')),\n React.createElement('span', { style: { flex: 1 } }),\n (isSvgPath(active) ? React.createElement('button', {\n className: 'edrv-pill edrv-pill-ghost', title: '以文本方式查看/编辑(SVG 为文本格式)',\n onClick: () => toggleSvgText(active),\n }, '以文本打开') : null),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '重新加载图片', onClick: () => reloadFile() }, '⟳ 刷新')),\n React.createElement('div', { className: 'edrv-imgview-stage' },\n (imgBroken\n ? React.createElement('div', { className: 'edrv-imgview-broken' },\n React.createElement('div', null, '图片解码失败,文件可能已损坏'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', onClick: () => reloadFile() }, '重试'))\n : React.createElement('img', {\n className: 'edrv-imgview-img',\n src: imageSrc,\n alt: active || '',\n onLoad: (e) => { setImgBroken(false); setImgSize({ w: e.target.naturalWidth, h: e.target.naturalHeight }) },\n onError: () => setImgBroken(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 /** 添加文件/选中区引用到对话(异步,状态栏反馈;状态文案走共享 statusOfAdd)。 */\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 recordNav()\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 recordNav()\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 // 图片/PDF 文件跳过文本读探测(二进制会被 host 拒绝),直接进 tab 由专用预览接管\n if (isImagePath(p) || isPdfPath(p)) {\n openFile(p, false)\n setOpenInput(false); setPathDraft(''); setStatus('已打开'); setError(null)\n return\n }\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', ref: tabsHostRef, 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); recordNav(); 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 // 未保存修改页签显示 * 星号(保存成功消失、失败持续);替换原圆点脏标记\n // @author ddj 2026年09月09号\n (dirtyMap[t.path] ? React.createElement('span', { className: 'edrv-tab-star', title: '未保存修改' }, '*') : 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 && !isImageActive && langOf(active) ? React.createElement('span', { className: 'edrv-pb-meta' }, langOf(active)) : null),\n (isImageActive && imgSize ? React.createElement('span', { className: 'edrv-pb-meta' }, imgSize.w + '×' + imgSize.h) : 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 // 状态段行内样式:单行状态栏内的一段;LSP 段弹性占满空闲宽度,把后续段推到行尾\n const lspSegStyle = { display: 'inline-flex', alignItems: 'center', gap: '10px', minWidth: 0, flex: '1 1 auto' }\n const lspSeg = (lspLanguage === 'lua' || lspLanguage === 'csharp')\n ? React.createElement('span', { className: 'edrv-status-seg', style: lspSegStyle, 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 // AI 补全状态段(全语言可用,不随 LSP 语言过滤):就绪/请求中/完成·耗时/失败原因\n const aiEnabled = aiStatus.enabled\n const aiState = aiStatus.state\n const aiDotCls = aiState === 'busy' ? 'busy' : aiState === 'ok' ? 'ready' : aiState === 'error' ? 'idle' : 'ready'\n const aiMsText = aiStatus.detail && aiStatus.detail.ms != null ? (aiStatus.detail.ms / 1000).toFixed(1) + 's' : ''\n const aiNote = aiStatus.detail && aiStatus.detail.note ? String(aiStatus.detail.note) : ''\n const aiLabel = !aiEnabled ? 'AI 补全 · 关'\n : aiState === 'busy' ? 'AI 补全请求中…'\n : aiState === 'ok' ? 'AI 补全完成' + (aiMsText ? ' · ' + aiMsText : '')\n : aiState === 'error' ? 'AI 补全失败 · ' + aiNote.slice(0, 48)\n : 'AI 补全就绪'\n const aiSegStyle = { display: 'inline-flex', alignItems: 'center', gap: '10px', minWidth: 0, flex: '0 0 auto' }\n const aiSeg = (active && aiEnabled !== null)\n ? React.createElement('span', { className: 'edrv-status-seg', style: aiSegStyle, title: aiState === 'error' && aiNote ? aiNote : 'AI 自动补全(设置页「AI 补全」可配置)' },\n React.createElement('span', { className: 'edrv-lsp-status-dot ' + (!aiEnabled ? 'idle' : aiDotCls) }),\n React.createElement('span', { className: 'edrv-sp-lsp' }, aiLabel))\n : null\n\n // 底部状态栏:单行多段——LSP 段居左(弹性吸收空闲宽度),AI 段固定右对齐\n const statusBar = (lspSeg || aiSeg)\n ? React.createElement('div', { className: 'edrv-statusbar' }, lspSeg, aiSeg)\n : null\n\n // 导航历史按钮:目标条目名(tooltip 提示下一步会回到哪个文件)\n const navBackTarget = navRef.current.peekBack()\n const navForwardTarget = navRef.current.peekForward()\n const navNameOf = (entry) => (entry && entry.path ? String(entry.path).split(/[\\\\/]/).pop() : '')\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', {\n className: 'edrv-chip-btn',\n title: '后退(' + (chordOf('edrv.navigateBack') ?? '未绑定') + ')' + (navBackTarget ? ' · ' + navNameOf(navBackTarget) : ''),\n disabled: !navRef.current.canBack(),\n 'aria-label': '后退',\n onClick: navBack,\n }, '←'),\n React.createElement('button', {\n className: 'edrv-chip-btn',\n title: '前进(' + (chordOf('edrv.navigateForward') ?? '未绑定') + ')' + (navForwardTarget ? ' · ' + navNameOf(navForwardTarget) : ''),\n disabled: !navRef.current.canForward(),\n 'aria-label': '前进',\n onClick: navForward,\n }, '→'),\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') + ') 打开工作区文件;' + (chordOf('edrv.showCommands') ?? 'Ctrl+Shift+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 (isImageActive && imageSrc) {\n body = imagePanel()\n } else if (isImageActive) {\n body = loadingBody(loadStage.message || '读取图片…', loadStage.progress)\n } else if (isPdfActive && pdfBytes) {\n body = React.createElement('div', { className: 'edrv-pdf-host', ref: ensurePdfHost, key: active })\n } else if (isPdfActive) {\n body = loadingBody(loadStage.message || '读取 PDF…', loadStage.progress)\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 // 当前会话工作区(反应式 cwd;规则面板项目 Tab 自动匹配)\n cwd: cwd ?? null,\n // 状态作用域键(工作区优先,无 cwd 回退会话;面板持久化统一走它)\n scope,\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 addToConversation,\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 0.1.5+ 自带官方右侧侧边栏(升级即用);旧版可安装 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 statusBar)\n // 编辑器根节点按 composer 顶部边界动态限高,底部对话区域继续由 DSH 原生渲染。\n // 侧栏形态由面板容器给高(100%),不做 composer 几何同步。\n const editorRow = React.createElement('div', { className: 'edrv-editor-row' },\n (sidebarPanels\n ? React.createElement(SidebarView, {\n registry: sidebarPanels,\n ctx: sidebarCtx,\n activePanel,\n onActive: setActivePanel,\n visible: sidebarOn,\n onShow: () => setSidebarOn(true),\n width: sidebarW,\n onWidth: setSidebarW,\n onHide: () => setSidebarOn(false),\n minWidth: sidebarMinW,\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 // 命令栏浮层(Ctrl+Shift+P / F1):portal 到 body,但需挂在插件自己的 React 树里;\n // 三种布局形态都渲染 EditorView,故这里挂载即可,多宿主由 store 单实例认领兜底。\n const paletteEl = React.createElement(CommandPalette, { key: 'edrv-palette', sessionId })\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 paletteEl)\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 paletteEl)\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'\nimport { CommandPalette } from './CommandPalette.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 // 命令栏浮层的兜底宿主:本 dock 是每会话常驻 slot(编辑区未挂载时仍能唤起命令栏);\n // 与 EditorView 同时挂载时由 commandPaletteStore 的单实例认领保证只渲染一份。\n const palette = React.createElement(CommandPalette, { key: 'edrv-palette', sessionId })\n if (editorSnapshot) {\n if (editorSnapshot.mode === 'editor-empty' && !editorSnapshot.fileTotal) return palette\n return React.createElement(React.Fragment, null,\n renderDock(React.createElement(DiffBox, Object.assign({}, editorSnapshot, { dock: true })), sessionId),\n palette)\n }\n\n if (!sessionId || !summary?.pendingFiles?.length) return palette\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 React.createElement(React.Fragment, null,\n renderDock(React.createElement(DiffBox, {\n mode: 'chat',\n dock: true,\n fileTotal: paths.length,\n onOpenNextFile: click,\n }), sessionId || 'chat'),\n palette)\n}\n","/**\n * dsh-vscode-mode client — 兼容层:设置桥选择 / slot 安全注册 / openPath 链式补丁 / 外部插件常量。\n * 纯逻辑与薄 ctx 胶水,node 环境可单测(不依赖 DOM)。\n * 作者 ddj 2026年08月24号\n */\nimport { log } from './log.js'\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>; sidebarMinWidth?: unknown }; writable?: boolean }\n subscribe: (listener: () => void) => () => void\n set: (field: string, value: unknown) => Promise<void>\n}\n\n/**\n * 设置桥三级优先:webUiSettings(linxin666 兼容桥)→ settingsScope(官方)→ 无。\n * 桥绑定抛错时降级到下一级,不让单个桥异常拖垮设置装配。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 激活的桥名称与绑定 scope\n */\nexport function pickSettingsBinder(ctx: { get: (name: string) => unknown }): { service: string; scope: SettingsScopeLike | undefined } {\n for (const service of ['webUiSettings', 'settingsScope']) {\n try {\n const binder = ctx.get(service) as { bind?: (spec: { namespace: string }) => SettingsScopeLike } | undefined\n const scope = binder?.bind?.({ namespace: PLUGIN_NAME })\n if (scope) return { service, scope }\n } catch {\n /* 桥异常时降级到下一级 */\n }\n }\n return { service: 'none', scope: undefined }\n}\n\n/** slot 注册描述(对齐 ctx.slots.register 的形状)。 */\nexport interface SlotSpec {\n name: string\n id: string\n order?: number\n label?: string\n inject?: (sessionId: string) => object\n}\n\n/**\n * 跨版本 slot 安全注册:封装 ctx.slots.inject 等待声明模式(新老 DSH 通用),\n * 服务缺失或注册抛错时降级为警告,不让单条 slot 拖垮装配。\n * 注意:方法必须挂在服务对象上调用(slots.register 是依赖 this.records 的类方法,\n * 解构后 this 丢失会静默失败),故禁止解构。\n * @author ddj 2026年08月24号\n * @param ctx 客户端上下文(slots 服务)\n * @param spec slot 描述\n * @param render 渲染函数\n * @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 log.warn('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 log.warn('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/** patchAccessor 的包装实现形状(original 为补丁前的实时实现)。 */\nexport type PatchWrapper = (original: (...args: never[]) => unknown, ...args: never[]) => unknown\n\n/**\n * accessor 感知的链式补丁:DSH 0.1.3+ 的 remote 命名空间方法(如\n * remote.session.openWorkspacePath)是 getter-only accessor(Object.defineProperty\n * 仅定义 get,直接赋值在严格模式下抛 TypeError),须整体替换属性描述符。\n * 新 getter 每次访问现场调用原 getter 取最新一次性函数作 original,天然跟随\n * DSH 内部 methods 表变化;data 属性降级走 patchMethod;属性缺失返回 null。\n * @author ddj 2026年09月08号\n * @param owner 目标对象\n * @param key 属性名\n * @param wrapper 包装实现(original 为补丁前的实时实现)\n * @returns 恢复函数(幂等、带归属校验);属性缺失时返回 null\n */\nexport function patchAccessor(owner: object, key: string, wrapper: PatchWrapper): (() => void) | null {\n const descriptor = Object.getOwnPropertyDescriptor(owner, key)\n if (!descriptor) return null\n if (typeof descriptor.get !== 'function') return patchMethod(owner, key as never, wrapper as never)\n const rawGet = descriptor.get as (this: object) => unknown\n const patchedGet = function (): unknown {\n const original = (...args: never[]) => (rawGet.call(owner) as (...args: never[]) => unknown)(...args)\n return (...args: never[]) => wrapper(original, ...args)\n }\n Object.defineProperty(owner, key, { configurable: true, enumerable: descriptor.enumerable, get: patchedGet })\n return () => {\n const current = Object.getOwnPropertyDescriptor(owner, key)\n if (current?.get === patchedGet) Object.defineProperty(owner, key, descriptor)\n }\n}\n","/**\n * dsh-vscode-mode client — 官方右侧 Sidebar 桥:探测 DSH 0.1.5-alpha.1+ 的\n * ctx.sidebarRightTabs / ctx.sidebarRight 服务,两段式注册「文件编辑」Tab\n * (类型定义进注册表,正文进 keyed slot sidebar.right.pane.tab)。\n * 可选依赖模式:服务缺失时调用方回退 better-sidebar / 中央页签;本模块不注册任何东西。\n * 维护约定:官方侧边栏(DSH 0.1.5+)是侧边栏编辑形态的唯一维护面;\n * dsh-better-sidebar 桥(sidebarBridge.ts)已归档,仅作旧版 DSH 回退,不再新增能力。\n * 纯逻辑(探测/导航参数解析)可单测,注册装配仅存在于 install 路径。\n * 作者 ddj 2026年09月09号\n */\n\nimport { log } from './log.js'\nimport { setEnsureSideEditor } from './sidebarBridge.js'\n\n/** 官方 Tab 类型注册表服务名(ctx.get 用;不进 inject——旧版 DSH 无此包,inject 会停等)。 */\nexport const OFFICIAL_TABS_SERVICE = 'sidebarRightTabs'\n/** 官方导航控制器服务名(ctx.get 用)。 */\nexport const OFFICIAL_SERVICE = 'sidebarRight'\n/** 官方 keyed slot 名(Tab 正文挂点,由官方侧边栏的 rightbar seat 声明)。 */\nexport const OFFICIAL_SLOT_NAME = 'sidebar.right.pane.tab'\n/** 本插件 Tab 类型定义 id(官方约定用包名;正文 slot 的 key 与之相同)。 */\nexport const OFFICIAL_TAB_ID = 'dsh-vscode-mode'\n/** 本插件 Tab 的类型判别符(ctx.sidebarRight.openTab 的 kind)。 */\nexport const OFFICIAL_TAB_KIND = 'edrvEditor'\n/** Tab 标题(与 better-sidebar 形态一致)。 */\nexport const OFFICIAL_TAB_TITLE = '文件编辑'\n/** 官方 file 资源地址前缀(0.1.5+ 聊天文件链接/文件树打开的统一地址语法)。 */\nexport const OFFICIAL_FILE_PREFIX = 'dsh-resource://file/'\n/** file 地址认领的 patterns(extension 档接管官方 textpreview 的 fallback 认领,注销自动回落)。 */\nexport const OFFICIAL_FILE_PATTERN = 'dsh-resource://file/**'\n/** file 资源类型的定义 id(正文 slot 的 key)。 */\nexport const OFFICIAL_FILE_TAB_ID = 'dsh-vscode-mode/file'\n/** file 资源类型的 kind(与页类型 edrvEditor 区分:同 kind 只允许一份 extension)。 */\nexport const OFFICIAL_FILE_KIND = 'edrvEditorFile'\n\n/** 官方 Tab 打开参数(官方运行时不校验的 JSON,正文经 navigation.params 读回)。 */\nexport interface OfficialTabParams {\n openPath?: string\n focusDiff?: boolean\n /** 目标行号(行引用/工具行跳转透传;缺省仅打开文件)。 */\n line?: number\n}\n\n/** sidebarRightTabs 服务的最小结构面(结构性探测,不 import 官方类型)。 */\nexport interface SidebarRightTabsLike {\n register: (definition: unknown) => () => void\n}\n\n/** sidebarRight 服务的最小结构面(openTab 页路由 + openResource 资源路由 + 可选查询/定向打开)。 */\nexport interface SidebarRightServiceLike {\n openTab: (kind: string, options?: { params?: unknown }) => void\n openResource?: (address: string, options?: { params?: unknown }) => void\n /** 挂载会话的激活 Tab(判读编辑 Tab 是否已激活;无 seat 时 undefined)。 */\n active?: () => { kind?: string } | undefined\n /** 向指定会话的停靠面打开页类型(store 未 adopt 时 no-op)。 */\n openTabIn?: (sessionId: string, kind: string, options?: { params?: unknown }) => void\n}\n\n/** slots 服务的最小结构面(等待声明 + 注册)。 */\nexport interface SlotsLike {\n inject: (name: string, register: () => unknown) => unknown\n register: (spec: object, render: unknown) => unknown\n}\n\n/** 探测命中的一对官方服务。 */\nexport interface OfficialSidebar {\n tabs: SidebarRightTabsLike\n service: SidebarRightServiceLike\n}\n\n/**\n * 结构化探测官方右侧 Sidebar 服务(可选依赖:缺失/降级返回 undefined)。\n * 服务仅存在于 DSH 0.1.5-alpha.1+,探测命中 ≡ 版本判定成立。\n * @author ddj 2026年09月09号\n * @param ctx 客户端服务上下文\n * @returns 注册表与控制器对,或 undefined\n */\nexport function detectOfficial(ctx: { get: (name: string) => unknown }): OfficialSidebar | undefined {\n try {\n const tabs = ctx.get(OFFICIAL_TABS_SERVICE) as SidebarRightTabsLike | undefined\n const service = ctx.get(OFFICIAL_SERVICE) as SidebarRightServiceLike | undefined\n if (!tabs || typeof tabs.register !== 'function') return undefined\n if (!service || typeof service.openTab !== 'function') return undefined\n return { tabs, service }\n } catch {\n return undefined\n }\n}\n\n/**\n * 从官方导航参数安全解析打开请求(缺字段/坏类型一律降级为空请求,不抛错)。\n * @author ddj 2026年09月09号\n * @param params openTab 传入的 params(正文经 navigation.params 读回)\n * @returns 待打开路径与是否聚焦首个差异\n */\nexport function resolveNavOpen(params: unknown): { path: string | null; focusDiff: boolean } {\n const value = (params ?? {}) as OfficialTabParams\n const path = typeof value?.openPath === 'string' && value.openPath ? value.openPath : null\n return { path, focusDiff: value?.focusDiff === true }\n}\n\n/**\n * 从官方导航参数安全解析行号(缺字段/坏类型/非正数一律视为未指定)。\n * @author ddj 2026年09月10号\n * @param params openTab/openResource 传入的 params(正文经 navigation.params 读回)\n * @returns 正整数行号,或 undefined\n */\nexport function resolveNavLine(params: unknown): number | undefined {\n const value = (params ?? {}) as OfficialTabParams\n const line = value?.line\n if (typeof line !== 'number' || !Number.isFinite(line) || line <= 0) return undefined\n return Math.floor(line)\n}\n\n/** 逐段 component 解码(失败返回 null,对齐官方 parseFileAddress 的容错语义)。 */\nfunction decodeSegment(raw: string | undefined): string | null {\n if (raw === undefined) return null\n try {\n return decodeURIComponent(raw)\n } catch {\n return null\n }\n}\n\n/**\n * 解析官方 file 资源地址(镜像 dsh-util-workspace-path 的 parseFileAddress 语法,不 import 官方包)。\n * session 域:`dsh-resource://file/session/<sessionId>/<逐段编码的相对路径>`;\n * absolute 域:`dsh-resource://file/absolute/<去前导 / 的绝对路径>`(POSIX 补回前导 /,\n * Windows 盘符 `C:/` 原样,UNC 保留空首段 `//server/share`)。\n * @author ddj 2026年09月09号\n * @param address 候选地址\n * @returns 文件路径(session 域附带 sessionId);非 file 地址/畸形/解码失败返回 null\n */\nexport function parseOfficialFileAddress(address: unknown): { path: string; sessionId?: string } | null {\n if (typeof address !== 'string' || !address.startsWith(OFFICIAL_FILE_PREFIX)) return null\n const [scope, ...tail] = address.slice(OFFICIAL_FILE_PREFIX.length).split('/')\n const kind = decodeSegment(scope)\n if (kind === 'session') {\n const sessionId = decodeSegment(tail[0])\n const segments = tail.slice(1).map(decodeSegment)\n if (!sessionId || segments.length === 0 || segments.some((s) => s === null)) return null\n const path = (segments as string[]).join('/')\n return path ? { path, sessionId } : null\n }\n if (kind === 'absolute') {\n const unc = tail[0] === '' && tail.length > 1\n const segments = (unc ? tail.slice(1) : tail).map(decodeSegment)\n if (segments.length === 0 || (segments as string[])[0] === '' || segments.some((s) => s === null)) return null\n const list = segments as string[]\n if (unc) return { path: '//' + list.join('/') }\n if (/^[A-Za-z]:$/.test(list[0])) return { path: list.join('/') }\n return { path: '/' + list.join('/') }\n }\n return null\n}\n\n/**\n * file 地址的 Tab chip 标题:解码后的 basename(解码失败回退原始串切片)。\n * @author ddj 2026年09月09号\n * @param address file 资源地址\n * @returns 标题文本\n */\nexport function officialFileTitle(address: unknown): string {\n const parsed = parseOfficialFileAddress(address)\n const source = parsed?.path ?? (typeof address === 'string' ? address : '')\n const normalized = source.replace(/\\\\/g, '/')\n return normalized.slice(normalized.lastIndexOf('/') + 1) || source\n}\n\n/** component 编码一段(对齐官方 encodeSegment:盘符冒号保持字面)。 */\nfunction encodeSegment(segment: string): string {\n return encodeURIComponent(segment).replace(/%3A/gi, ':')\n}\n\n/**\n * 构造官方 file 资源地址(镜像 fileAddressFor 的分派:绝对路径→absolute 域,相对→session 域)。\n * @author ddj 2026年09月09号\n * @param path 绝对或工作区相对路径(两种分隔符均可)\n * @param sessionId 会话 id(相对路径必需;绝对路径可省)\n * @returns `dsh-resource://file/…` 地址\n * @throws 路径为空,或相对路径缺 sessionId\n */\nexport function buildFileAddress(path: string, sessionId?: string): string {\n const posix = (typeof path === 'string' ? path : '').replace(/\\\\/g, '/')\n if (!posix.trim()) throw new Error('buildFileAddress:路径为空')\n const isAbsolute = posix.startsWith('/') || posix.startsWith('//') || /^[A-Za-z]:[/\\\\]/.test(posix)\n if (isAbsolute) {\n const unc = posix.startsWith('//')\n const body = posix.replace(/^\\/+/, '')\n return OFFICIAL_FILE_PREFIX + 'absolute/' + (unc ? '/' : '') + body.split('/').map(encodeSegment).join('/')\n }\n if (!sessionId) throw new Error('buildFileAddress:相对路径需要会话 id')\n const relative = posix.replace(/^(?:\\.\\/)+/, '').replace(/^\\/+/, '')\n return OFFICIAL_FILE_PREFIX + 'session/' + encodeSegment(sessionId) + '/' + relative.split('/').map(encodeSegment).join('/')\n}\n\n// --region file 认领转发(文件分页收归编辑器自带页签栏)\n\n/**\n * 把 file 打开请求转发进单一编辑器页签(文件分页由编辑器自带页签栏接管,\n * 官方侧栏不再按文件分裂出多套编辑器实例)。\n * @author ddj 2026年09月10号\n * @param service 官方 sidebarRight 服务(缺失/缺 openTab 返回 false)\n * @param path 目标文件路径(空值返回 false)\n * @param line 可选行号(透传给编辑器页签导航参数)\n * @returns 转发是否成功(openTab 抛错返回 false,由调用方决定重试或兜底)\n */\nexport function forwardToEditor(\n service: SidebarRightServiceLike | undefined | null,\n path: string | null,\n line?: number,\n): boolean {\n if (!service || typeof service.openTab !== 'function' || !path) return false\n const params: OfficialTabParams = { openPath: path }\n if (line !== undefined) params.line = line\n try {\n // 官方语义:页类型恒去重,故转发只会聚焦既有编辑器页签,不产生新实例\n service.openTab(OFFICIAL_TAB_KIND, { params })\n return true\n } catch (error) {\n log.warn('file 认领转发进编辑器页签失败(' + String(error) + ')')\n return false\n }\n}\n// --endregion\n\n/**\n * 注册官方 Tab 正文(keyed slot,key=定义 id;slots.inject 等待 rightbar seat 声明)。\n * @author ddj 2026年09月09号\n * @param slots slots 服务\n * @param key 正文注册键(= 类型定义 id)\n * @param renderTab 正文组件(包装后的 OfficialSideTab)\n * @returns 注销函数;注册抛错返回 null\n */\nfunction registerBodySlot(slots: SlotsLike, key: string, renderTab: unknown): (() => void) | null {\n try {\n const disposer = slots.inject(OFFICIAL_SLOT_NAME, () => slots.register(\n { name: OFFICIAL_SLOT_NAME, key },\n renderTab,\n ))\n return typeof disposer === 'function' ? (disposer as () => void) : null\n } catch (error) {\n log.warn('官方侧边栏正文 slot 注册失败(' + String(error) + ')')\n return null\n }\n}\n\n/**\n * 注册官方右侧 Sidebar「文件编辑」Tab 并接管打开路由(两段式 + 路由)。\n * 调用方须把返回值挂进 ctx.effect;类型注册抛错时返回 null,由调用方回退旧形态。\n * @author ddj 2026年09月09号\n * @param options 装配参数(探测命中的一对服务 + slots + 正文组件 + guide 文案)\n * @returns 卸载器(反注册类型与正文 + 撤销路由);类型注册失败返回 null\n */\nexport function installOfficial(options: {\n tabs: SidebarRightTabsLike\n service: SidebarRightServiceLike\n slots: SlotsLike\n renderTab: unknown\n guide: { title: () => string; description: () => string }\n}): (() => void) | null {\n const { tabs, service, slots, renderTab, guide } = options\n const open = (path: string | null, focusDiff: boolean): boolean => {\n try {\n // 官方语义:打开即展开侧栏;seat 未挂载(无会话画面)时抛错,降级其他打开器\n service.openTab(OFFICIAL_TAB_KIND, { params: { openPath: path || undefined, focusDiff } })\n } catch (error) {\n log.warn('官方侧边栏打开失败(' + String(error) + ')')\n return false\n }\n return true\n }\n let typeDisposer: (() => void) | null = null\n try {\n // extension 档(默认且最高):与官方内置类型同 kind 时接管,卸载后官方恢复\n typeDisposer = tabs.register({\n id: OFFICIAL_TAB_ID,\n kind: OFFICIAL_TAB_KIND,\n priority: 'extension',\n title: () => OFFICIAL_TAB_TITLE,\n guide: [{ order: 20, title: guide.title, description: guide.description }],\n })\n } catch (error) {\n log.warn('官方侧边栏 Tab 类型注册失败(' + String(error) + '),回退旧形态')\n return null\n }\n setEnsureSideEditor(open)\n const bodyDisposer = registerBodySlot(slots, OFFICIAL_TAB_ID, renderTab)\n return () => {\n if (typeof typeDisposer === 'function') typeDisposer()\n if (typeof bodyDisposer === 'function') bodyDisposer()\n setEnsureSideEditor(null)\n }\n}\n\n/**\n * 注册官方 file 资源地址认领(extension 档接管 `dsh-resource://file/**`,\n * 聊天文件链接/文件树打开改落本插件编辑器;注销后官方 textpreview 自动恢复)。\n * 认领与否由「文件链接使用工具」设置驱动(见 fileOpeners.shouldClaimFiles)。\n * @author ddj 2026年09月09号\n * @param options 装配参数(探测命中的注册表 + slots + 正文组件)\n * @returns 卸载器(反注册类型与正文);类型注册抛错返回 null(回落官方查看器)\n */\nexport function registerOfficialFileClaim(options: {\n tabs: SidebarRightTabsLike\n slots: SlotsLike\n renderTab: unknown\n}): (() => void) | null {\n const { tabs, slots, renderTab } = options\n let typeDisposer: (() => void) | null = null\n try {\n typeDisposer = tabs.register({\n id: OFFICIAL_FILE_TAB_ID,\n kind: OFFICIAL_FILE_KIND,\n patterns: [OFFICIAL_FILE_PATTERN],\n priority: 'extension',\n // 畸形/解码失败地址否决:回落官方 textpreview,不产生白屏 Tab\n canOpen: (address: string) => parseOfficialFileAddress(address) !== null,\n title: (address: string) => officialFileTitle(address),\n })\n } catch (error) {\n log.warn('官方 file 地址认领注册失败(' + String(error) + '),链接走官方查看器')\n return null\n }\n const bodyDisposer = registerBodySlot(slots, OFFICIAL_FILE_TAB_ID, renderTab)\n return () => {\n if (typeof typeDisposer === 'function') typeDisposer()\n if (typeof bodyDisposer === 'function') bodyDisposer()\n }\n}\n\n// --region 编辑 Tab 跨会话自动恢复\n\n/** 编辑 Tab 是否处于激活态(正文挂载 = 激活;模块级,跨会话存活)。 */\nlet editorTabActive = false\n/** 正文挂载纪元(每次挂载自增;延迟判定期间有新挂载则放弃清除)。 */\nlet mountEpoch = 0\n\n/**\n * 标记编辑 Tab 激活并推进挂载纪元(正文挂载时调用)。\n * @author ddj 2026年09月09号\n */\nexport function markEditorMounted(): void {\n mountEpoch += 1\n markEditorActive(true)\n}\n\n/**\n * 直接设置激活标记(正文卸载延迟判定用;测试 also 用作状态编排入口)。\n * @author ddj 2026年09月09号\n * @param active 是否激活\n */\nexport function markEditorActive(active: boolean): void {\n editorTabActive = active\n}\n\n/**\n * 读编辑 Tab 激活标记(会话切换时决定是否自动恢复编辑栏)。\n * @author ddj 2026年09月09号\n * @returns 上次标记的激活状态\n */\nexport function isEditorTabActive(): boolean {\n return editorTabActive\n}\n\n/**\n * 读当前挂载纪元(卸载延迟判定用:纪元已推进 = 有新正文接管,不清标记)。\n * @author ddj 2026年09月09号\n * @returns 当前纪元\n */\nexport function editorMountEpoch(): number {\n return mountEpoch\n}\n\n/**\n * 在挂载会话恢复编辑 Tab:已激活跳过(官方幂等);seat 未就绪抛错时有界重试。\n * openTab 官方语义「打开即展开侧栏」,一次调用同时完成展开 + 激活。\n * @author ddj 2026年09月09号\n * @param service 官方 sidebarRight 服务(缺失/未装配直接返回)\n * @param schedule 延时调度(ctx.timeout;重试节拍)\n * @param attempts 剩余尝试次数(默认 10 次 × 150ms ≈ 1.5s 窗口)\n */\nexport function restoreEditorTab(\n service: SidebarRightServiceLike | undefined | null,\n schedule: (fn: () => void, ms: number) => void,\n attempts = 10,\n): void {\n if (!service || typeof service.openTab !== 'function' || !editorTabActive) return\n try {\n if (service.active?.()?.kind === OFFICIAL_TAB_KIND) return\n service.openTab(OFFICIAL_TAB_KIND, {})\n } catch {\n // seat 未挂载/未绑定(会话面尚未渲染):等一拍再试,放弃后保持现状不阻塞\n if (attempts > 1) schedule(() => restoreEditorTab(service, schedule, attempts - 1), 150)\n }\n}\n// --endregion\n","/**\n * dsh-vscode-mode client — 文件打开器注册表与自动选择。\n * @author ddj 2026年08月24号 / 2026年09月09号\n */\nimport { SIDEBAR_PLUGIN } from './compat.js'\nimport { buildFileAddress } from './officialSidebar.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/** 官方右侧侧边栏打开器 id(「文件链接使用工具」下拉的官方选项;DSH 0.1.5+)。 */\nexport const OFFICIAL_OPEN_TOOL = 'dsh-official-sidebar'\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/** 官方 sidebarRight.openResource 的最小结构面(结构性使用,不 import 官方类型)。 */\nexport interface OfficialOpenResourceService {\n openResource?: (address: string, options?: { params?: unknown }) => void\n}\n\n/**\n * 文件链接是否由本插件认领官方 file 地址:自动/VSCodeMode 档接管(链接进本插件编辑器),\n * 官方侧边栏/system/better-sidebar 档不认领(官方查看器或旧版路由生效)。\n * @author ddj 2026年09月09号\n * @param selected 「文件链接使用工具」当前值\n * @returns 是否认领\n */\nexport function shouldClaimFiles(selected: unknown): boolean {\n return selected === AUTO_OPEN_TOOL || selected === VSCODE_OPEN_TOOL\n}\n\n/**\n * 创建「官方侧边栏」文件打开器(DSH 0.1.5+,经 ctx.sidebarRight.openResource 打开官方查看器)。\n * 仅官方服务探测命中时注册;下拉选项随注册动态出现(McpSettings 动态渲染)。\n * @author ddj 2026年09月09号\n * @param service 官方导航控制器\n * @returns 文件打开器\n */\nexport function officialSidebarOpener(service: OfficialOpenResourceService): FileOpener {\n return {\n id: OFFICIAL_OPEN_TOOL,\n label: '官方侧边栏',\n description: '在 DSH 官方右侧侧边栏查看器中打开(0.1.5+)',\n priority: 90,\n isAvailable: () => typeof service.openResource === 'function',\n open: (path, context) => {\n if (typeof service.openResource !== 'function') throw new Error('官方侧边栏 openResource 能力不可用')\n service.openResource(buildFileAddress(path, context.sessionId))\n },\n }\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, parseChords } 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 && parseChords(chord).length === 0\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, '配置编辑器视图的快捷键(命令栏 / 保存 / 快速打开 / 侧边栏 / 搜索 / 后退前进 / 页签与编辑行导航)。修改即时写入配置,重新聚焦编辑器后生效;命令栏(默认 Ctrl+Shift+P 或 F1)可搜索并执行下列全部命令。'),\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.detect(检测结果驱动卡片动态显示),配置经 edrv.lsp.configGet/Update,扩展经 edrv.lsp.ext.*。\n * 作者 ddj 2026-08-27 / 2026-09-03\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport '../styles/mcp.css'\n\n/** 支持语言的展示元数据(卡片显示由检测结果驱动;未知 id 走 langMeta 兜底)。 */\nconst LANG_META = {\n lua: { label: 'Lua(EmmyLua / LuaLS)', hint: '优先使用已安装 EmmyLua;未安装时回退 LuaLS 或 PATH 中的 lua-language-server' },\n csharp: { label: 'C#(Roslyn / DotRush / OmniSharp)', hint: '优先自动发现 ms-dotnettools.csharp / DotRush 扩展(DotRush 需 .NET 10 运行时);也可手动指定' },\n}\n\n/** 语言展示元数据(含未知 id 兜底)。 */\nfunction langMeta(id) {\n return LANG_META[id] || { label: id + '(语言服务器)', hint: '' }\n}\n\n/** 该语言是否已存配置(禁用开关或手动命令/路径)。 */\nfunction hasStoredConfig(cfg) {\n if (!cfg || typeof cfg !== 'object') return false\n if (cfg.enabled === false) return true\n return Boolean((cfg.command && cfg.command.trim()) || (cfg.path && cfg.path.trim()))\n}\n\n/** 该语言是否显示卡片:检测到可用 LSP、已存配置、或存在待安装的缺失环境。 */\nfunction langVisible(status, config) {\n if (!status) return false\n if (status.source && status.source !== 'none') return true\n if (hasStoredConfig(config[status.languageId])) return true\n return Array.isArray(status.missingEnv) && status.missingEnv.length > 0\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 envButtonLabel(req, envStates) {\n const state = (envStates ?? []).find((s) => s.id === req.id)\n if (state?.phase === 'downloading') return '下载中…'\n if (state?.phase === 'extracting') return '安装中…'\n if (state?.phase === 'done') return '已完成'\n if (state?.phase === 'failed') return '重试'\n return '一键安装'\n}\n\n/** 语言卡片:状态 + 缺失环境提示(一键安装/官网下载) + 启用开关 + 命令/路径配置 + 重新检测。 */\nfunction LangCard({ lang, config, status, busy, envStates, onInstallEnv, 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 Array.isArray(status?.candidates) && status.candidates.length > 1\n ? React.createElement('div', { className: 'vsm-lsp-hint' },\n '候选(' + status.candidates.length + '):' + status.candidates.map((c) =>\n c.name + (c.version ? ' v' + c.version : '') + (c.chosen ? '(当前)' : '')).join(' · '))\n : null,\n Array.isArray(status?.missingEnv) && status.missingEnv.length\n ? React.createElement('div', { className: 'vsm-lsp-hint' },\n '缺少运行环境(一键安装后自动生效):',\n status.missingEnv.map((req) => React.createElement('div', { key: req.id, className: 'vsm-mcp-actions' },\n React.createElement('span', null, req.label, req.detail ? '(' + req.detail + ')' : ''),\n req.installable ? React.createElement('button', {\n className: 'vsm-primary vsm-small',\n disabled: busy === 'env:' + req.id,\n onClick: () => onInstallEnv(lang.id, req),\n }, envButtonLabel(req, envStates)) : null,\n req.manualUrl ? React.createElement('a', {\n href: req.manualUrl, target: '_blank', rel: 'noreferrer',\n style: { color: 'inherit', textDecoration: 'underline', alignSelf: 'center' },\n }, req.manualLabel ?? '官网下载') : null)))\n : 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 const [envStates, setEnvStates] = React.useState([])\n const [envLang, setEnvLang] = React.useState('')\n\n const refreshServers = React.useCallback(() => {\n Promise.all([rpc('edrv.lsp.configGet', {}), rpc('edrv.lsp.detect', {})])\n .then(([cfg, det]) => {\n if (cfg?.ok) setConfig(cfg.config ?? {})\n if (det?.ok) setServers(det.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 refreshEnvStates = React.useCallback(() => {\n return rpc('edrv.lsp.envState', {})\n .then((res) => {\n if (res?.ok) setEnvStates(res.states ?? [])\n return res?.states ?? []\n })\n .catch(() => [])\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 = React.useCallback((languageId) => {\n window.dispatchEvent(new CustomEvent('edrv:lsp-redetect', { detail: { languageId } }))\n }, [])\n\n /** 一键安装缺失环境:启动内置安装器(成功后进入轮询,完成自动重同步)。 */\n const installEnv = (languageId, req) => {\n const key = 'env:' + req.id\n setBusy(key)\n setError('')\n setEnvLang(languageId)\n rpc('edrv.lsp.envInstall', { languageId, id: req.id })\n .then((res) => {\n if (!res?.ok) { setError(res?.error ?? '无法启动安装'); return }\n void refreshEnvStates()\n void refreshServers()\n })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n // 环境安装进行中:2s 轮询进度并刷新状态;某项转入 done 时由下方过渡检测重同步\n React.useEffect(() => {\n const states = envStates ?? []\n const installing = states.some((s) => s.phase === 'downloading' || s.phase === 'extracting')\n if (!installing) return\n const timer = setInterval(() => {\n void refreshEnvStates()\n void refreshServers()\n }, 2000)\n return () => clearInterval(timer)\n }, [envStates, refreshEnvStates, refreshServers])\n\n // 环境安装完成过渡检测:刷新状态并通知编辑器重新同步对应语言\n const prevEnvPhases = React.useRef({})\n React.useEffect(() => {\n const states = envStates ?? []\n for (const s of states) {\n const prev = prevEnvPhases.current[s.id]\n if (prev && prev !== 'done' && s.phase === 'done' && envLang) {\n void refreshServers()\n notifyResync(envLang)\n }\n prevEnvPhases.current[s.id] = s.phase\n }\n }, [envStates, envLang, refreshServers, notifyResync])\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 void refreshServers() // 新装 LSP 使对应语言卡片出现\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 void refreshServers() // 新装 LSP 使对应语言卡片出现\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 void refreshServers() // 卸载后对应语言卡片按最新检测隐匿\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 void refreshServers() // 更新后选用版本随之变化\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 // 动态显示:检测结果(detect 全量)驱动卡片可见性;未检出语言灰字列出\n const detected = Array.isArray(servers) ? servers : []\n const visible = detected.filter((s) => langVisible(s, config))\n const hidden = detected.filter((s) => !visible.includes(s))\n body = panel('语言服务器', React.createElement(React.Fragment, null,\n visible.length ? visible.map((status) => {\n const meta = langMeta(status.languageId)\n return React.createElement(LangCard, {\n key: status.languageId, lang: { id: status.languageId, label: meta.label, hint: meta.hint },\n config: config[status.languageId] ?? {},\n status,\n busy, envStates, onInstallEnv: installEnv, onToggle: toggleLang, onSave: saveLang, onRedetect: redetectLang,\n })\n }) : React.createElement('div', { className: 'vsm-mcp-empty' },\n '未检测到已安装的语言服务器;可切换到「市场」搜索安装(如 sumneko.lua),或安装本地 .vsix 后刷新。'),\n hidden.length ? React.createElement('div', { className: 'vsm-lsp-hint' },\n '未检测到:' + hidden.map((s) => langMeta(s.languageId).label).join('、') + ' —— 可在「市场」安装后刷新。') : null,\n React.createElement('div', { className: 'vsm-lsp-hint' }, '提示:打开对应语言的文件即自动(惰性)启动语言服务器;未配置时编辑器功能不受影响,大纲回退内置解析。')))\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 — 「系统集成」设置面板(跨平台)。\n * 右键菜单:Windows=HKCU 三类键(reg)/ Linux=Nautilus 脚本 + Dolphin 服务菜单(文件写入)/\n * macOS=Automator 快速操作(一键复制配方手动创建,自动检测/移除)。\n * 深链基址来自设置 integrationBaseUrl(settings.set 持久化)。\n * Unity 集成:登记项目根 + 一键安装/更新内嵌包到 <项目>/Packages/com.dsh.editor。\n * 作者 ddj 2026-09-07\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { SettingsContext } from '../settingsContext.js'\n\n/** launcher 状态文案。 */\nfunction launcherText(launcher) {\n if (!launcher?.present) return '未安装'\n return launcher.compiled ? '已编译 exe(无闪窗)' : '已安装'\n}\n\n/** 注册条目状态文案(跨平台 entries)。 */\nfunction entriesText(entries) {\n if (!entries?.length) return '本平台无自动注册入口'\n return entries.map((entry) => entry.label + (entry.registered ? ' ✓' : ' ✗')).join(' · ')\n}\n\n/** macOS Automator 快速操作配方(复制到剪贴板,用户按步骤创建)。 */\nfunction automatorRecipe(launcherPath) {\n return [\n 'macOS Finder 快速操作(Automator)配置步骤:',\n '1. Automator → 新建 → 快速操作',\n '2. 「工作流程接收当前」选:文件或文件夹;位于:任何应用程序',\n '3. 添加动作「运行 Shell 脚本」,Shell 选 /bin/bash,传递输入选「作为参数」',\n '4. 脚本内容替换为:',\n ' exec \"' + launcherPath + '\" \"$@\"',\n '5. 保存为:在 DSH 文件编辑中打开',\n '完成后在 Finder 右键 → 快速操作/服务 中出现「在 DSH 文件编辑中打开」。',\n ].join('\\n')\n}\n\n/** 单个 Unity 项目行。 */\nfunction ProjectRow({ project, busy, onInstall, onRemove }) {\n const versionText = project.missingDir\n ? '目录不存在'\n : project.error\n ? project.error\n : project.installedVersion\n ? '已装 v' + project.installedVersion + (project.upToDate ? '(最新)' : '(可更新)')\n : '未安装'\n const installable = !project.missingDir && !project.error\n return React.createElement('div', { className: 'vsm-general-row', key: project.path },\n React.createElement('span', null,\n project.title,\n React.createElement('small', { className: 'vsm-devform-note' }, ' ' + project.path + ' · ' + versionText)),\n React.createElement('div', { className: 'vsm-devform-actions' },\n React.createElement('button', {\n className: 'vsm-primary vsm-small',\n disabled: !installable || busy === 'install:' + project.path,\n title: project.upToDate ? '重新安装(整目录替换)' : '安装/更新到该 Unity 项目',\n onClick: () => onInstall(project.path),\n }, busy === 'install:' + project.path ? '安装中…' : project.installedVersion ? (project.upToDate ? '重装' : '更新') : '安装'),\n React.createElement('button', { disabled: busy === 'remove:' + project.path, onClick: () => onRemove(project.path) }, '移除登记'),\n ),\n )\n}\n\n/** 平台提示条(注册语义差异说明)。 */\nfunction PlatformNote({ platform, registered }) {\n if (platform === 'win32') return null\n const text = platform === 'linux'\n ? 'Linux 注册覆盖 GNOME Files(Nautilus)与 KDE Dolphin 两个主流文件管理器(文件写入即注册,无需管理员);其他文件管理器暂未支持。'\n : 'macOS:点「复制 Automator 配方」按提示创建快速操作(约 1 分钟),创建后此处自动显示 ✓;「移除注册」仅删除引用本插件 launcher 的快速操作。'\n return React.createElement('small', { className: 'vsm-devform-msg' }, text)\n}\n\n/**\n * 系统集成面板(挂在 VSCodeMode 设置「通用」页底部)。\n * @author ddj 2026年09月07号\n */\nexport function IntegrationSettings() {\n const settings = React.useContext(SettingsContext)\n const [status, setStatus] = React.useState(null)\n const [statusError, setStatusError] = React.useState('')\n const [unity, setUnity] = React.useState(null)\n const [error, setError] = React.useState('')\n const [message, setMessage] = React.useState('')\n const [busy, setBusy] = React.useState('')\n const [baseUrl, setBaseUrl] = React.useState('')\n const [baseDraft, setBaseDraft] = React.useState(null)\n const [rootDraft, setRootDraft] = React.useState('')\n\n React.useEffect(() => {\n let alive = true\n Promise.all([rpc('edrv.integration.status', {}), rpc('edrv.unity.list', {})]).then(([st, ul]) => {\n if (!alive) return\n if (st.ok) { setStatus(st); setBaseUrl(st.baseUrl); setStatusError('') } else setStatusError(String(st.error))\n if (ul.ok) setUnity(ul)\n }).catch((e) => { if (alive) setError(String(e)) })\n return () => { alive = false }\n }, [])\n\n const platform = status?.platform ?? ''\n const onWin = platform === 'win32'\n const onLinux = platform === 'linux'\n const onMac = platform === 'darwin'\n const anyRegistered = (status?.entries ?? []).some((entry) => entry.registered && !entry.manual)\n\n const refreshUnity = () => rpc('edrv.unity.list', {}).then((result) => { if (result.ok) setUnity(result) })\n\n /** 注册/移除右键菜单(Windows/Linux;macOS 注册按钮替换为配方复制)。 */\n const runMenu = (key, method, done) => {\n setBusy(key); setError(''); setMessage('')\n rpc(method, {}).then((result) => {\n if (!result.ok) throw new Error(result.error)\n setStatus(result)\n setMessage(done)\n }).catch((e) => setError(String(e?.message ?? e))).finally(() => setBusy(''))\n }\n const register = () => runMenu('register', 'edrv.integration.register',\n onLinux ? '已注册:在 Nautilus / Dolphin 中右键文件或文件夹即可看到「在 DSH 文件编辑中打开」(首次出现可能需重启文件管理器)。' : '右键菜单已注册:右键文件/文件夹 →「在 DSH 文件编辑中打开」。')\n const unregister = () => runMenu('unregister', 'edrv.integration.unregister', '右键菜单注册已移除。')\n\n /** 复制 macOS Automator 配方(含 launcher 实际路径)。 */\n const copyRecipe = () => {\n const text = automatorRecipe(status?.launcher?.path ?? '$HOME/.dsh/dsh-vscode-mode/shell/dsh-open.sh')\n navigator.clipboard?.writeText(text)\n .then(() => setMessage('配方已复制,粘贴到备忘录按步骤操作即可。'))\n .catch(() => setMessage(text))\n }\n\n /** 保存深链基址(settings.set 持久化;已注册时提示重新注册刷新 launcher ini)。 */\n const saveBase = () => {\n const next = String(baseDraft ?? '').trim()\n if (!next) return\n if (!settings?.set) { setError('设置服务不可用'); return }\n setBusy('base'); setError(''); setMessage('')\n settings.set('integrationBaseUrl', next)\n .then(() => { setBaseUrl(next); setMessage('深链基址已保存;如已注册右键菜单,请点「注册」刷新 launcher 配置。') })\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n /** 登记 Unity 项目(校验 Assets/ProjectSettings)。 */\n const addProject = () => {\n setBusy('add'); setError(''); setMessage('')\n rpc('edrv.unity.add', { path: rootDraft.trim() }).then((result) => {\n if (!result.ok) throw new Error(result.error)\n setRootDraft('')\n setMessage('项目已登记,点「安装」把包复制进项目 Packages/ 目录。')\n return refreshUnity()\n }).catch((e) => setError(String(e?.message ?? e))).finally(() => setBusy(''))\n }\n\n /** 一键安装/更新(整目录替换内嵌包)。 */\n const installProject = (path) => {\n setBusy('install:' + path); setError(''); setMessage('')\n rpc('edrv.unity.install', { path }).then((result) => {\n if (!result.ok) throw new Error(result.error)\n const project = result.project\n setMessage('已安装/更新:' + project.title + '(v' + project.installedVersion + ')。Unity 已打开时切回窗口即生效。')\n return refreshUnity()\n }).catch((e) => setError(String(e?.message ?? e))).finally(() => setBusy(''))\n }\n\n /** 移除登记(不删除已安装的包目录)。 */\n const removeProject = (path) => {\n if (!window.confirm('移除该项目的登记?(不删除已安装的包目录)')) return\n setBusy('remove:' + path); setError(''); setMessage('')\n rpc('edrv.unity.remove', { path })\n .then(refreshUnity)\n .catch((e) => setError(String(e)))\n .finally(() => setBusy(''))\n }\n\n /** 复制包源路径(手动 Add package from disk 兜底)。 */\n const copySource = () => {\n const text = unity?.sourcePath ?? ''\n if (!text) return\n navigator.clipboard?.writeText(text)\n .then(() => setMessage('已复制包源路径:' + text))\n .catch(() => setMessage('包源路径:' + text))\n }\n\n return 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('p', { style: { margin: '0 0 8px' } },\n '把 DSH 编辑器接入系统入口:文件管理器右键菜单(Windows/Linux/macOS)+ Unity 外部脚本编辑器(UPM 内嵌包,自动发现,无需改 manifest.json)。'),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n message && React.createElement('small', { className: 'vsm-devform-msg' }, message),\n status && !onWin && React.createElement(PlatformNote, { platform, registered: anyRegistered }),\n React.createElement('label', { className: 'vsm-general-row' },\n React.createElement('span', null, 'DSH 服务地址'),\n React.createElement('input', {\n value: baseDraft ?? baseUrl,\n placeholder: 'http://127.0.0.1:3080',\n onChange: (event) => setBaseDraft(event.target.value),\n onKeyDown: (event) => { if (event.key === 'Enter') saveBase() },\n }),\n React.createElement('button', { disabled: busy === 'base' || baseDraft === null, onClick: saveBase }, '保存'),\n ),\n React.createElement('label', { className: 'vsm-general-row' },\n React.createElement('span', null,\n '右键菜单 ',\n React.createElement('small', { className: 'vsm-devform-note' },\n status\n ? entriesText(status.entries) + ' · launcher:' + launcherText(status.launcher)\n : statusError ? '状态获取失败:' + statusError : '读取中…')),\n React.createElement('div', { className: 'vsm-devform-actions' },\n (onWin || onLinux) && React.createElement('button', { className: 'vsm-primary vsm-small', disabled: busy === 'register', onClick: register }, busy === 'register' ? '注册中…' : '注册'),\n onMac && React.createElement('button', { className: 'vsm-primary vsm-small', onClick: copyRecipe }, '复制 Automator 配方'),\n status && React.createElement('button', { disabled: busy === 'unregister' || (!anyRegistered && !onMac), onClick: unregister }, '移除注册'),\n ),\n ),\n React.createElement('div', { className: 'vsm-general-row', style: { alignItems: 'flex-start' } },\n React.createElement('span', null,\n 'Unity 一键安装 ',\n React.createElement('small', { className: 'vsm-devform-note' },\n unity ? '包 v' + (unity.sourceVersion ?? '?') + ' · ' + unity.sourcePath : '读取中…')),\n React.createElement('div', { className: 'vsm-devform-actions' },\n React.createElement('button', { onClick: copySource }, '复制包源路径'),\n ),\n ),\n (unity?.projects ?? []).map((project) => React.createElement(ProjectRow, {\n key: project.path,\n project,\n busy,\n onInstall: installProject,\n onRemove: removeProject,\n })),\n React.createElement('label', { className: 'vsm-general-row' },\n React.createElement('span', null, '添加 Unity 项目'),\n React.createElement('input', {\n value: rootDraft,\n placeholder: '项目根目录(含 Assets 与 ProjectSettings)',\n onChange: (event) => setRootDraft(event.target.value),\n onKeyDown: (event) => { if (event.key === 'Enter') addProject() },\n }),\n React.createElement('button', { className: 'vsm-primary vsm-small', disabled: busy === 'add' || !rootDraft.trim(), onClick: addProject }, busy === 'add' ? '校验中…' : '添加'),\n ),\n React.createElement('small', null, '安装 = 复制到 <项目>/Packages/com.dsh.editor(内嵌包);更新 = 整目录替换;卸载 = 删除该目录。Unity 打开时切回窗口自动刷新生效。插件卸载/重载时会自动清理并恢复右键菜单注册(「移除注册」后不再恢复)。'),\n ),\n )\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — AI 补全设置卡片。\n * 开关 + 模型下拉(edrv.ai.models 目录,按 provider 分组,默认「自动」)+\n * 思考强度下拉(随所选模型的 efforts 元数据动态渲染:无档位隐藏;含「跟随默认」)。\n * 保存走 edrv.ai.configUpdate;保存后广播 edrv:ai-config 事件让 provider 即时生效。\n * 作者 ddj\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { setAiInlineEnabled } from '../ai/inlineProvider.js'\n\n/**\n * AI 补全设置卡片(设置页「AI 补全」Tab 主体)。\n * @author ddj\n */\nexport function AiSettings() {\n const [cfg, setCfg] = React.useState(null)\n const [dir, setDir] = React.useState(null)\n const [note, setNote] = React.useState('')\n const [error, setError] = React.useState('')\n const [busy, setBusy] = React.useState(false)\n\n React.useEffect(() => {\n Promise.all([rpc('edrv.ai.configGet', {}), rpc('edrv.ai.models', {})])\n .then(([c, d]) => {\n if (c.ok) setCfg({ enabled: c.enabled, provider: c.provider, model: c.model, effort: c.effort })\n else setError(c.error || '配置读取失败')\n if (d.ok) setDir(d)\n else setError(d.error || '模型目录读取失败')\n })\n .catch((e) => setError(String(e)))\n }, [])\n\n /** 所选 provider 下的模型条目(自动路由时取首组供档位参考)。 */\n const modelsOf = (provider) => {\n if (!dir?.providers?.length) return []\n if (!provider) return dir.providers[0]?.models ?? []\n return dir.providers.find((p) => p.id === provider)?.models ?? []\n }\n\n /** 档位可选项:模型无 reasoning 元数据 → 空数组(选择器隐藏)。 */\n const efforts = (() => {\n const models = modelsOf(cfg?.provider)\n return models.find((m) => m.model === cfg?.model)?.efforts ?? models[0]?.efforts ?? []\n })()\n\n const save = async (patch) => {\n setBusy(true)\n setError('')\n try {\n const res = await rpc('edrv.ai.configUpdate', patch)\n if (!res.ok) throw new Error(res.error || '保存失败')\n setCfg({ enabled: res.enabled, provider: res.provider, model: res.model, effort: res.effort })\n setAiInlineEnabled(res.enabled)\n setNote('已保存')\n window.dispatchEvent(new CustomEvent('edrv:ai-config', { detail: { enabled: res.enabled } }))\n } catch (e) {\n setError(String(e))\n } finally {\n setBusy(false)\n }\n }\n\n const toggle = () => save({ enabled: !cfg.enabled })\n\n const pickModel = (value) => {\n // 「自动」:provider/model 清空(host 自动取目录首个);档位保留\n if (!value) return save({ provider: '', model: '' })\n const idx = value.indexOf('/')\n const provider = value.slice(0, idx)\n const model = value.slice(idx + 1)\n const efforts = modelsOf(provider).find((m) => m.model === model)?.efforts ?? []\n // 换模型后原档位可能不属于新模型:档位一并清空(跟随默认)\n const keep = efforts.some((e) => e.id === cfg.effort)\n save(keep ? { provider, model } : { provider, model, effort: '' })\n }\n\n if (!cfg) return React.createElement('div', { className: 'vsm-mcp-empty' }, error || '正在读取 AI 补全配置…')\n\n const modelValue = cfg.provider && cfg.model ? cfg.provider + '/' + cfg.model : ''\n return React.createElement('section', { className: 'vsm-lsp-card' },\n React.createElement('h3', null, 'AI 自动补全(实验)'),\n React.createElement('p', { className: 'vsm-lsp-note' }, '编辑停顿后由模型生成内联建议(ghost text),Tab 接受,Alt+\\\\ 手动触发。每次补全是一次模型调用;建议选择非推理模型,且思考强度选「跟随默认」或最低档以获得更快响应。'),\n React.createElement('div', { className: 'vsm-lsp-row' },\n React.createElement('button', { className: cfg.enabled ? 'vsm-primary' : '', disabled: busy, onClick: toggle },\n cfg.enabled ? '已开启(点击关闭)' : '已关闭(点击开启)'),\n ),\n React.createElement('div', { className: 'vsm-lsp-row' },\n React.createElement('label', null, '模型',\n React.createElement('select', { value: modelValue, disabled: busy || !dir?.providers?.length, onChange: (e) => pickModel(e.target.value) },\n React.createElement('option', { value: '' }, dir?.providers?.length ? '自动(取第一个可用模型)' : '无可用模型'),\n (dir?.providers ?? []).flatMap((p) => p.models.map((m) => React.createElement('option', { key: p.id + '/' + m.model, value: p.id + '/' + m.model }, p.name + ' · ' + m.name)))),\n ),\n efforts.length ? React.createElement('label', null, '思考强度',\n React.createElement('select', { value: cfg.effort, disabled: busy, onChange: (e) => save({ effort: e.target.value }) },\n React.createElement('option', { value: '' }, '跟随默认'),\n efforts.map((e) => React.createElement('option', { key: e.id, value: e.id }, e.name))),\n ) : null,\n ),\n note && React.createElement('div', { className: 'vsm-compat-item ok' }, React.createElement('span', { className: 'vsm-compat-name' }, note)),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\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 { normalizeSidebarMinWidth, SIDEBAR_MIN_DEFAULT } from '../sidebarMin.js'\nimport { KeybindingsPanel } from './KeybindingsPanel.js'\nimport { LspSettings } from './LspSettings.js'\nimport { PerfSettings } from './PerfSettings.js'\nimport { IntegrationSettings } from './IntegrationSettings.js'\nimport { AiSettings } from './AiSettings.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 [minW, setMinW] = React.useState(SIDEBAR_MIN_DEFAULT)\n const [minDraft, setMinDraft] = React.useState(null) // 输入草稿(null=跟随已保存值;blur/Enter 提交)\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 snap = settings?.getSnapshot?.()\n const next = snap?.value?.fileOpenTool\n if (typeof next === 'string') setTool(next)\n setMinW(normalizeSidebarMinWidth(snap?.value?.sidebarMinWidth))\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 /** 提交侧边栏最小宽度(归一化夹取 180–560 后持久化)。 */\n const saveMinW = (raw) => {\n const next = normalizeSidebarMinWidth(raw)\n setMinW(next); setBusy(true); setError('')\n if (!settings?.set) { setError('设置服务不可用'); setBusy(false); return }\n settings.set('sidebarMinWidth', next).catch((e) => setError(String(e))).finally(() => setBusy(false))\n }\n /** 结束输入(blur/Enter)时提交草稿。 */\n const commitMinW = () => {\n if (minDraft === null) return\n setMinDraft(null)\n saveMinW(minDraft)\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 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' },\n React.createElement('span', null, '侧边栏最小宽度'),\n React.createElement('input', {\n type: 'number', min: 180, max: 560, step: 10,\n value: minDraft ?? minW,\n disabled: loading || unavailable || notReady || busy || snapshot?.writable === false,\n title: '180–560 px;拖拽侧边栏低于该宽度时自动隐藏',\n onChange: (event) => setMinDraft(event.target.value),\n onBlur: commitMinW,\n onKeyDown: (event) => { if (event.key === 'Enter') commitMinW() },\n }),\n React.createElement('small', null, '180–560 px;拖拽低于该宽度自动隐藏')),\n ),\n ),\n React.createElement(IntegrationSettings, null),\n )\n}\n\n/** 兼容性小节:host 报告(RPC compat)+ 客户端本地适配项。 */\nfunction CompatSection({ getSummary }) {\n const [report, setReport] = React.useState(null)\n const [error, setError] = React.useState('')\n React.useEffect(() => {\n let alive = true\n rpc('compat', {}).then((result) => {\n if (!alive) return\n if (!result.ok) setError(String(result.error))\n else setReport(result.report)\n }).catch((e) => { if (alive) setError(String(e)) })\n return () => { alive = false }\n }, [])\n const renderItems = (list) => (list ?? []).map((item) => React.createElement('div', { key: item.name, className: 'vsm-compat-item ' + (item.active ? 'ok' : 'warn') },\n React.createElement('span', { className: 'vsm-compat-name' }, item.name),\n React.createElement('span', { className: 'vsm-compat-note' }, item.note ?? (item.active ? '正常' : '未生效')),\n ))\n /** 兼容性分组面板:标题 + 线框内容区。 */\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 if (tab === 'ai') body = React.createElement(AiSettings, 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 === 'ai' ? 'active' : '', onClick: () => setTab('ai') }, 'AI 补全'), 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","/**\n * dsh-vscode-mode client — DSH 对话文件链接的 0.1.3+ 路由(remote.session 面)。\n * 0.1.3 起 dsh-client-ui-chat 的 openFile 直接调 ctx.remote.session.openWorkspacePath\n * (浏览器→host RPC session/openWorkspacePath),不再经过 workspaces.openPath,\n * 旧路由补丁因此落空;该方法是 getter-only accessor,补丁经 compat.patchAccessor\n * 换描述符安装。行为与 openPathRouter 对齐:插件打开器优先,\".\"(打开工作区文件夹)、\n * 无可用打开器或打开失败时透传原实现(系统默认应用打开)。\n * 纯逻辑,node 环境可单测(不依赖 DOM / events 模块)。\n * 作者 ddj 2026年09月08号\n */\nimport { patchAccessor } from './compat.js'\nimport { isAvailable, selectOpener, type FileOpenContext, type FileOpenerRegistry } from './fileOpeners.js'\n\n/** session.openWorkspacePath 的结果形状(host 返回 { opened: true };客户端不做输出校验)。 */\nexport interface OpenPathResult {\n ok: boolean\n value?: { opened: boolean }\n}\n\n/** openWorkspacePath 的请求形状;path 为 \".\" 时表示打开工作区文件夹。 */\nexport interface OpenPathRequest {\n path?: unknown\n}\n\n/** 补丁前 openWorkspacePath 的实时实现形状。 */\ntype RemoteOpen = (request: OpenPathRequest) => Promise<OpenPathResult>\n\n/** 插件打开器接管成功时返回给调用方(chat 只看 ok,产物区读 value)。 */\nconst OPENED_RESULT: OpenPathResult = { ok: true, value: { opened: true } }\n\nexport interface RemoteOpenRouterOptions {\n registry: FileOpenerRegistry\n selected: () => string\n context: () => FileOpenContext\n logger?: (message: string) => void\n}\n\n/**\n * 结构化探测 remote.session 命名空间服务及其 openWorkspacePath 方法。\n * 旧版 DSH 无该 namespace、或 api-remotes 尚未挂载时返回 undefined。\n * @author ddj 2026年09月08号\n * @param ctx 客户端服务上下文\n * @returns 命名空间服务实例;不可用返回 undefined\n */\nexport function probeRemoteOpen(ctx: { get: (name: string) => unknown }): object | undefined {\n try {\n const service = ctx.get('remote.session') as { openWorkspacePath?: unknown } | undefined\n if (!service || typeof service.openWorkspacePath !== 'function') return undefined\n return service\n } catch {\n return undefined\n }\n}\n\n/**\n * 安装可卸载的 remote.session.openWorkspacePath 路由(0.1.3+ 会话文件链接主路径)。\n * @author ddj 2026年09月08号\n * @param service probeRemoteOpen 命中的命名空间服务\n * @param options 路由依赖\n * @returns 恢复函数;目标属性缺失时返回 null(调用方停止安装并告警)\n */\nexport function patchRemoteOpen(service: object, options: RemoteOpenRouterOptions): (() => void) | null {\n return patchAccessor(service, 'openWorkspacePath', async (original, ...args) => {\n const fallback = original as unknown as RemoteOpen\n const request = (args[0] ?? {}) as OpenPathRequest\n const path = typeof request.path === 'string' ? request.path : ''\n if (!path || path === '.') return fallback(request)\n const opener = selectOpener(options.registry, options.selected())\n if (!opener || !isAvailable(opener)) return fallback(request)\n try {\n await opener.open(path, options.context())\n return OPENED_RESULT\n } catch (error) {\n options.logger?.('文件打开器 ' + opener.id + ' 失败,回退系统打开: ' + String(error))\n return fallback(request)\n }\n })\n}\n","/**\n * dsh-vscode-mode shared — 外部深链 URL 契约(Windows launcher / Unity 包 / client 共用)。\n * 形态:?<FLAG>=1&<PATHS_KEY>=<enc1>[,<enc2>…] [&<LINE_KEY>=N] [&<COLUMN_KEY>=M]\n * 每个路径独立 percent-encode(encodeURIComponent / Uri.EscapeDataString)后以 `,` 连接:\n * 编码结果不含裸逗号(Windows 路径本身不允许逗号,编码兜底其余字符),URLSearchParams\n * 取值做一次标准解码即得 `enc1,enc2`,按 `,` split 即路径,无需二次 decode。\n * Purity rule: no node/react imports(URLSearchParams 为标准全局)。\n * 作者 ddj 2026-09-07\n */\n\n/** 深链开关参数名(值恒为 '1')。 */\nexport const EDRV_OPEN_FLAG = 'edrvOpen'\n/** 路径列表参数名(逗号分隔的已编码路径)。 */\nexport const EDRV_PATHS_KEY = 'edrvPaths'\n/** 目标行参数名(1-based,可选,作用于首个路径)。 */\nexport const EDRV_LINE_KEY = 'edrvLine'\n/** 目标列参数名(1-based,可选,作用于首个路径)。 */\nexport const EDRV_COLUMN_KEY = 'edrvColumn'\n/** 深链参数键全集(URL 清理用)。 */\nexport const EDRV_PARAM_KEYS = [EDRV_OPEN_FLAG, EDRV_PATHS_KEY, EDRV_LINE_KEY, EDRV_COLUMN_KEY]\n/** 路径分隔符(编码后路径不含裸逗号,分隔安全)。 */\nexport const PATHS_SEPARATOR = ','\n\n/** 一次外部深链请求(解析结果)。 */\nexport interface OpenParams {\n /** 待打开路径(已解码,首个路径可携带行列)。 */\n paths: string[]\n /** 目标行(1-based,可空)。 */\n line?: number\n /** 目标列(1-based,可空)。 */\n column?: number\n}\n\n/**\n * 解析深链查询串:非深链/路径为空 → null;行列仅接受正整数,非法忽略。\n * @author ddj 2026年09月07号\n * @param search location.search(含或不含前导 ? 均可)\n * @returns 深链参数或 null\n */\nexport function parseOpenParams(search: string): OpenParams | null {\n const params = new URLSearchParams(search ?? '')\n if (params.get(EDRV_OPEN_FLAG) !== '1') return null\n const paths = (params.get(EDRV_PATHS_KEY) ?? '')\n .split(PATHS_SEPARATOR)\n .map((item) => item.trim())\n .filter(Boolean)\n if (!paths.length) return null\n const line = positiveIntOf(params.get(EDRV_LINE_KEY))\n const column = positiveIntOf(params.get(EDRV_COLUMN_KEY))\n return { paths, line, column }\n}\n\n/**\n * 正整数解析(非法/非正 → undefined)。\n * @author ddj 2026年09月07号\n * @param raw 参数原文(可空)\n * @returns 正整数或 undefined\n */\nfunction positiveIntOf(raw: string | null): number | undefined {\n const value = Number(raw)\n return Number.isInteger(value) && value > 0 ? value : undefined\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 工作区选择弹窗(深链打开规则 1)。\n * 复用与「添加 MCP」一致的 vsm-mcp-modal / vsm-mcp-dialog 模态(页面居中卡片 + 遮罩 + 主题\n * token),React portal 挂 body;Esc / 遮罩点击 / 取消 → null(中止流程不改任何状态)。\n * 作者 ddj 2026-09-07\n */\nimport React from 'react'\nimport { createRoot } from 'react-dom/client'\n\n/** 用户选择:使用最近的工作区 / 新建工作区 / null=中止。 */\nexport type WorkspaceChoice = 'recent' | 'create' | null\n\n/** 弹窗组件属性。 */\ninterface ChoiceModalProps {\n /** 匹配到的工作区标题。 */\n title: string\n /** 触发打开的文件夹路径。 */\n folder: string\n /** 选择回调(首次调用即卸载)。 */\n done: (choice: WorkspaceChoice) => void\n}\n\n/** 选择弹窗(vsm-mcp-modal 遮罩 + vsm-mcp-dialog 卡片,Esc/遮罩点击取消)。 */\nfunction ChoiceModal({ title, folder, done }: ChoiceModalProps) {\n React.useEffect(() => {\n const onKey = (event) => {\n if (event.key === 'Escape') done(null)\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [])\n return React.createElement('div', {\n className: 'vsm-mcp-modal',\n onMouseDown: (event) => {\n if (event.target === event.currentTarget) done(null)\n },\n },\n React.createElement('div', { className: 'vsm-mcp-dialog' },\n React.createElement('h3', null, '在 DSH 中打开'),\n React.createElement('label', null, '文件夹 ' + folder + ' 位于已注册的工作区「' + title + '」内,选择打开方式:'),\n React.createElement('div', { className: 'vsm-mcp-dialog-actions' },\n React.createElement('button', { onClick: () => done(null) }, '取消'),\n React.createElement('button', { onClick: () => done('create') }, '新建工作区'),\n React.createElement('button', { className: 'vsm-primary', onClick: () => done('recent') }, '使用最近的工作区'),\n ),\n ),\n )\n}\n\n/**\n * 弹出工作区选择弹窗(深链打开规则 1)。\n * @author ddj 2026年09月07号\n * @param title 匹配到的工作区标题\n * @param folder 文件夹路径\n * @returns 用户选择;null = 取消/中止\n */\nexport function chooseWorkspace(title: string, folder: string): Promise<WorkspaceChoice> {\n return new Promise((resolve) => {\n const host = document.createElement('div')\n document.body.appendChild(host)\n const root = createRoot(host)\n const done = (choice: WorkspaceChoice) => {\n root.unmount()\n host.remove()\n resolve(choice)\n }\n root.render(React.createElement(ChoiceModal, { title, folder, done }))\n })\n}\n","/**\n * dsh-vscode-mode client — 深链打开规则引擎(资源管理器右键 / Unity 外部编辑器落地)。\n * 规则:文件夹 ⊂ 某已注册工作区 → 页面内弹窗二选一(使用最近的工作区 / 新建工作区);\n * 文件夹不在任何工作区 → 直达最近对话所在工作区新增;文件 → 最近对话 + 编辑器展开\n * (无任何会话 → 以文件父目录注册工作区引导创建)。首路径驱动规则,其余路径:文件进\n * 编辑器、文件夹补引用。纯函数可单测;编排依赖经 OpenDeps 注入(mock 可测)。\n * 作者 ddj 2026-09-07\n */\nimport { rpc } from './rpc.js'\nimport { chooseWorkspace } from './chooseDialog.js'\nimport { emitOpenAt, openEditorView } from './events.js'\nimport { toastDom } from './externalOpen.js'\nimport { createAddToConversation } from './addToConversation.js'\nimport type { AddOutcome, CtxLike } from './addToConversation.js'\nimport type { OpenParams } from '../shared/externalOpen.js'\n\n/** 路径类型(host edrv.externalStat 判定)。 */\nexport type PathKind = 'file' | 'directory' | 'missing'\n\n/** 打开规则分派结果。 */\nexport type OpenRule = 'choose' | 'folderNew' | 'fileRecent' | 'bootstrap' | 'abort'\n\n/** 工作区视图最小形状(ctx.workspaces.list 快照行)。 */\nexport interface WsView {\n workspaceId: string\n path: string\n title: string\n sessionIds?: readonly string[]\n updatedAt?: string\n}\n\n/** 会话行最小形状(ctx.sessions.list 快照行)。 */\nexport interface SessionRow {\n id: string\n cwd?: string\n updatedAt?: number\n origin?: 'subagent'\n}\n\n/** 打开编排依赖(全部可注入,便于 mock 测试)。 */\nexport interface OpenDeps {\n stat(path: string): Promise<PathKind>\n workspaces(): { items: WsView[]; ready: boolean }\n sessions(): { ids: string[]; byId: Record<string, SessionRow>; ready: boolean }\n createSession(opts: { workspaceId?: string; cwd?: string }): Promise<string>\n createWorkspace(path: string): Promise<{ workspaceId: string; title: string }>\n openSession(id: string): void\n reference(sessionId: string, path: string, appearance: 'file' | 'folder'): Promise<boolean>\n choose(title: string, folder: string): Promise<'recent' | 'create' | null>\n openEditor(path: string | null, line?: number, column?: number): void\n schedule(fn: () => void, ms: number): void\n notify(text: string): void\n}\n\n/** 等列表/输入就绪的节奏。 */\nconst READY_TIMEOUT_MS = 15000\nconst READY_TICK_MS = 300\nconst REF_RETRY_MAX = 20\nconst REF_RETRY_MS = 300\nconst REST_STEP_MS = 150\nconst LINE_AT_DELAY_MS = 200\n\n/**\n * 路径规范化:`\\→/`、小写、去尾分隔符(Windows 大小写不敏感前缀匹配用)。\n * @author ddj 2026年09月07号\n */\nexport function normPath(p: string): string {\n return String(p ?? '').replace(/\\\\/g, '/').replace(/\\/+$/, '').toLowerCase()\n}\n\n/**\n * 目录包含判定:child === root 或 child 位于 root 之下。\n * @author ddj 2026年09月07号\n */\nexport function containsPath(root: string, child: string): boolean {\n const r = normPath(root)\n const c = normPath(child)\n return c === r || c.startsWith(r + '/')\n}\n\n/**\n * 父目录(文件引导创建工作区用;根路径回退自身)。\n * @author ddj 2026年09月07号\n */\nexport function dirnameOf(p: string): string {\n const norm = String(p ?? '').replace(/[\\\\/]+$/, '')\n const cut = Math.max(norm.lastIndexOf('/'), norm.lastIndexOf('\\\\'))\n return cut > 0 ? norm.slice(0, cut) : norm\n}\n\n/**\n * 最近一次对话:排除子代理行,updatedAt 最新优先。\n * @author ddj 2026年09月07号\n */\nexport function recentSession(byId: Record<string, SessionRow>, ids?: string[]): SessionRow | undefined {\n const rows = (ids ?? Object.keys(byId)).map((id) => byId[id]).filter((row) => row && row.origin !== 'subagent')\n return rows.sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0))[0]\n}\n\n/**\n * 文件夹命中的已注册工作区(前缀包含),updatedAt 新者优先。\n * @author ddj 2026年09月07号\n */\nexport function matchWorkspaces(items: WsView[], folder: string): WsView[] {\n return items.filter((ws) => containsPath(ws.path, folder))\n}\n\n/**\n * 规则分派:目录+命中工作区 → choose;目录未命中 → folderNew(以该文件夹为根注册新工作区,\n * 用户确认:一律取右键的文件夹本身);文件有会话 → fileRecent;文件无会话 → bootstrap;\n * 路径缺失 → abort。\n * @author ddj 2026年09月08号\n */\nexport function pickRule(kind: PathKind, matched: boolean, hasSession: boolean): OpenRule {\n if (kind === 'missing') return 'abort'\n if (kind === 'directory') return matched ? 'choose' : 'folderNew'\n return hasSession ? 'fileRecent' : 'bootstrap'\n}\n\n/**\n * 深链打开编排入口:等列表就绪 → 判型 → 规则分派 → 编排 create/open/引用/编辑器。\n * @author ddj 2026年09月07号\n * @param ctx 客户端根上下文(sessions/workspaces 服务)\n * @param params 深链参数(首路径驱动规则)\n * @param overrides 依赖覆盖(测试注入)\n */\nexport async function openDeepLink(ctx: unknown, params: OpenParams, overrides: Partial<OpenDeps> = {}): Promise<void> {\n const deps = realDeps(ctx, overrides)\n if (!(await waitListsReady(deps))) {\n deps.notify('DSH 会话列表未就绪,请稍后重试')\n return\n }\n const primary = params.paths[0]\n const kind = await deps.stat(primary).catch(() => 'missing' as PathKind)\n const sess = deps.sessions()\n const rule = pickRule(kind, matchWorkspaces(deps.workspaces().items, primary).length > 0, Boolean(recentSession(sess.byId, sess.ids)))\n try {\n if (rule === 'abort') {\n deps.notify('路径不存在:' + primary)\n return\n }\n if (rule === 'choose') return await runChoose(deps, primary, params)\n if (rule === 'folderNew') return await runFolderNew(deps, primary, params)\n if (rule === 'fileRecent') return await runFileRecent(deps, primary, params)\n return await runFileBootstrap(deps, primary, params)\n } catch (error) {\n deps.notify('打开失败:' + String((error as Error)?.message ?? error))\n }\n}\n\n/** 等待会话与工作区列表就绪(上限 15s;超时按当前态判定)。 */\nasync function waitListsReady(deps: OpenDeps): Promise<boolean> {\n for (let waited = 0; waited < READY_TIMEOUT_MS; waited += READY_TICK_MS) {\n if (deps.sessions().ready && deps.workspaces().ready) return true\n await sleep(deps, READY_TICK_MS)\n }\n return deps.sessions().ready && deps.workspaces().ready\n}\n\n/** 规则 1:命中工作区 → 弹窗分派(取消即中止)。 */\nasync function runChoose(deps: OpenDeps, folder: string, params: OpenParams): Promise<void> {\n const matches = matchWorkspaces(deps.workspaces().items, folder)\n const best = bestMatch(deps, matches)\n const choice = await deps.choose(best?.title ?? '工作区', folder)\n if (choice === null) return\n if (choice === 'create') return runFolderNew(deps, folder, params)\n const ws = best ?? deps.workspaces().items[0]\n const sessionId = await spawnInWorkspace(deps, ws.workspaceId, undefined)\n await settleRef(deps, sessionId, folder, 'folder')\n deps.openEditor(null)\n await openRest(deps, sessionId, params, 1)\n}\n\n/** 规则 3a:文件 → 所属工作区优先(有会话打开其最近会话;无会话新建 + 文件引用);无匹配 → 最近对话。 */\nasync function runFileRecent(deps: OpenDeps, file: string, params: OpenParams): Promise<void> {\n const ws = pickFileWorkspace(deps, file)\n if (ws) {\n const anchor = recentSessionIn(deps, ws)\n if (anchor) {\n deps.openSession(anchor.id)\n deps.openEditor(file, params.line, params.column)\n await openRest(deps, anchor.id, params, 1)\n return\n }\n // 文件所属工作区存在但无会话 → 在该工作区新建对话 + 文件引用\n const sessionId = await spawnInWorkspace(deps, ws.workspaceId, undefined)\n await settleRef(deps, sessionId, file, 'file')\n deps.openEditor(file, params.line, params.column)\n await openRest(deps, sessionId, params, 1)\n return\n }\n const anchor = recentSession(deps.sessions().byId, deps.sessions().ids)\n if (!anchor) return runFileBootstrap(deps, file, params)\n deps.openSession(anchor.id)\n deps.openEditor(file, params.line, params.column)\n await openRest(deps, anchor.id, params, 1)\n}\n\n/**\n * 文件所属工作区:前缀命中的工作区里,优先取有会话且最近活跃的;都无会话取路径最具体的。\n * @author ddj 2026年09月08号\n */\nfunction pickFileWorkspace(deps: OpenDeps, file: string): WsView | undefined {\n const matches = matchWorkspaces(deps.workspaces().items, file)\n if (!matches.length) return undefined\n const withSessions = matches.filter((ws) => (ws.sessionIds ?? []).some((id) => Boolean(deps.sessions().byId[id])))\n if (!withSessions.length) {\n return [...matches].sort((a, b) => normPath(b.path).length - normPath(a.path).length)[0]\n }\n return withSessions.sort((a, b) => latestSessionAt(deps, b) - latestSessionAt(deps, a))[0]\n}\n\n/** 工作区内会话的最近活跃时间(无成员 → 0)。 */\nfunction latestSessionAt(deps: OpenDeps, ws: WsView): number {\n const byId = deps.sessions().byId\n return (ws.sessionIds ?? []).reduce((max, id) => Math.max(max, byId[id]?.updatedAt ?? 0), 0)\n}\n\n/** 工作区内最近一次会话(排除子代理与不在列表中的陈旧行)。 */\nfunction recentSessionIn(deps: OpenDeps, ws: WsView): SessionRow | undefined {\n const byId = deps.sessions().byId\n const rows = (ws.sessionIds ?? []).map((id) => byId[id]).filter((row) => row && row.origin !== 'subagent')\n return rows.sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0))[0]\n}\n\n/** 规则 3b:文件 + 无任何会话 → 父目录注册工作区 + 新对话 + 文件引用 + 编辑器打开。 */\nasync function runFileBootstrap(deps: OpenDeps, file: string, params: OpenParams): Promise<void> {\n const ws = await deps.createWorkspace(dirnameOf(file))\n const sessionId = await spawnInWorkspace(deps, ws.workspaceId, undefined)\n await settleRef(deps, sessionId, file, 'file')\n deps.openEditor(file, params.line, params.column)\n await openRest(deps, sessionId, params, 1)\n}\n\n/** 规则 1.2:以文件夹注册新工作区 + 新对话 + 文件夹引用 + 编辑页。 */\nasync function runFolderNew(deps: OpenDeps, folder: string, params: OpenParams): Promise<void> {\n const ws = await deps.createWorkspace(folder)\n const sessionId = await spawnInWorkspace(deps, ws.workspaceId, undefined)\n await settleRef(deps, sessionId, folder, 'folder')\n deps.openEditor(null)\n await openRest(deps, sessionId, params, 1)\n}\n\n/** 在指定工作区(或回退 cwd)新建对话并置为当前;返回新会话 id。 */\nasync function spawnInWorkspace(deps: OpenDeps, workspaceId: string | undefined, fallbackCwd: string | undefined): Promise<string> {\n const sessionId = await deps.createSession(workspaceId ? { workspaceId } : fallbackCwd ? { cwd: fallbackCwd } : {})\n deps.openSession(sessionId)\n return sessionId\n}\n\n/** 命中工作区集中「最近」的一个(其成员会话 updatedAt 最新者优先)。 */\nfunction bestMatch(deps: OpenDeps, matches: WsView[]): WsView | undefined {\n const byId = deps.sessions().byId\n const score = (ws: WsView): number => {\n const sessionLatest = (ws.sessionIds ?? []).reduce((max, id) => Math.max(max, byId[id]?.updatedAt ?? 0), 0)\n return Math.max(sessionLatest, Date.parse(ws.updatedAt ?? '') || 0)\n }\n return [...matches].sort((a, b) => score(b) - score(a))[0]\n}\n\n/** 引用插入轮询:输入门面就绪前每 300ms 重试(appendReference 忙态已降级视为成功)。 */\nasync function settleRef(deps: OpenDeps, sessionId: string, path: string, appearance: 'file' | 'folder'): Promise<void> {\n for (let attempt = 0; attempt < REF_RETRY_MAX; attempt++) {\n if (await deps.reference(sessionId, path, appearance)) return\n await sleep(deps, REF_RETRY_MS)\n }\n}\n\n/** 其余路径:文件进编辑器(步进),文件夹补文件夹引用。 */\nasync function openRest(deps: OpenDeps, sessionId: string | null, params: OpenParams, from: number): Promise<void> {\n const rest = params.paths.slice(from)\n for (const [index, path] of rest.entries()) {\n const kind = await deps.stat(path).catch(() => 'missing' as PathKind)\n if (kind === 'file') {\n deps.schedule(() => deps.openEditor(path), REST_STEP_MS * (index + 1))\n } else if (kind === 'directory' && sessionId) {\n await settleRef(deps, sessionId, path, 'folder')\n }\n }\n}\n\n/** 可注入 sleep。 */\nfunction sleep(deps: OpenDeps, ms: number): Promise<void> {\n return new Promise((resolve) => deps.schedule(resolve, ms))\n}\n\n/** 真实依赖装配(全部来自 ctx 注入服务 + 既有 RPC/弹窗/编辑器入口)。 */\nfunction realDeps(ctx: unknown, overrides: Partial<OpenDeps> = {}): OpenDeps {\n const service = (name: string): any => {\n const get = (ctx as { get?: (name: string) => unknown } | undefined)?.get\n return typeof get === 'function' ? get.call(ctx, name) : undefined\n }\n const add = createAddToConversation(ctx as CtxLike)\n const base: OpenDeps = {\n stat: async (path) => {\n const result = await rpc('edrv.externalStat', { path })\n return result.ok ? result.kind : 'missing'\n },\n workspaces: () => {\n const snap = (service('workspaces')?.list?.getSnapshot?.() ?? {}) as { items?: WsView[]; phase?: string }\n return { items: snap.items ?? [], ready: snap.phase === 'ready' }\n },\n sessions: () => {\n const snap = (service('sessions')?.list?.getSnapshot?.() ?? {}) as { ids?: string[]; byId?: Record<string, SessionRow>; phase?: string }\n return { ids: snap.ids ?? [], byId: snap.byId ?? {}, ready: snap.phase !== 'pending' }\n },\n createSession: async (opts) => await service('sessions').create(opts),\n createWorkspace: async (path) => {\n const ws = await service('workspaces').create({ path })\n return { workspaceId: ws.workspaceId, title: ws.title }\n },\n openSession: (id) => service('sessions').open(id),\n reference: async (sessionId, path, appearance) => {\n const outcome: AddOutcome = await add.appendReference(sessionId, path, undefined, appearance)\n return outcome !== 'unavailable'\n },\n choose: (title, folder) => chooseWorkspace(title, folder),\n openEditor: (path, line, column) => {\n if (path == null) {\n openEditorView(null)\n return\n }\n openEditorView(path)\n if (line != null) setTimeout(() => emitOpenAt(path, line, column), LINE_AT_DELAY_MS)\n },\n schedule: (fn, ms) => setTimeout(fn, ms),\n notify: (text) => toastDom(text),\n }\n return { ...base, ...overrides }\n}\n","/**\n * dsh-vscode-mode client — 外部深链落地(Windows 右键菜单 / Unity 外部编辑器)。\n * 启动时解析 location.search 的 edrvOpen 深链:跨源 referrer 守卫防外部网页诱导;\n * 处理完剥离 URL 参数防刷新重开;执行委托 openFlow 打开规则引擎(工作区/对话智能路由)。\n * 另挂 3s 移交轮询(兼活跃心跳):launcher 投递的打开请求由已打开页面就地执行,避免重复开新页。\n * 作者 ddj 2026-09-07 / 2026-09-08\n */\nimport { EDRV_PARAM_KEYS, parseOpenParams } from '../shared/externalOpen.js'\nimport { openDeepLink } from './openFlow.js'\nimport { rpc } from './rpc.js'\nimport { log } from './log.js'\n\n/** toast 自隐时长。 */\nconst TOAST_MS = 5000\n/** 深链移交轮询周期(兼活跃心跳)。 */\nconst HANDOFF_POLL_MS = 3000\n\n/** 深链装配选项(全部可注入便于测试;缺省读浏览器全局)。 */\nexport interface ExtOpenOptions {\n /** 查询串(缺省 location.search)。 */\n search?: string\n /** referrer(缺省 document.referrer)。 */\n referrer?: string\n /** 当前源(缺省 location.origin)。 */\n origin?: string\n}\n\n/**\n * 装配外部深链:深链参数缺失时仅保持移交轮询(零额外开销)。\n * @author ddj 2026年09月07号\n * @param ctx 客户端根上下文(sessions/workspaces 服务)\n * @param options 可注入选项\n */\nexport function setupExtOpen(ctx: unknown, options: ExtOpenOptions = {}): void {\n startPresencePoll(ctx)\n const search = options.search ?? (typeof location !== 'undefined' ? location.search : '')\n const params = parseOpenParams(search)\n if (!params) return\n const referrer = options.referrer ?? (typeof document !== 'undefined' ? document.referrer : '')\n const origin = options.origin ?? (typeof location !== 'undefined' ? location.origin : '')\n if (!referrerAllowed(referrer, origin)) {\n log.warn('已忽略跨源深链请求(referrer=' + referrer + ')')\n return\n }\n stripCurrentUrl()\n void openDeepLink(ctx, params).catch((error) => {\n log.warn('深链打开失败:' + String(error))\n toastDom('深链打开失败:' + String((error as Error)?.message ?? error))\n })\n}\n\n/**\n * 深链移交轮询:每 3s 向 host 领取待打开请求(兼活跃心跳,launcher 据此决定是否开新页)。\n * 页面级单例(window 标记防 HMR 重复);领取到即执行打开规则。\n * @author ddj 2026年09月08号\n * @param ctx 客户端根上下文\n */\nfunction startPresencePoll(ctx: unknown): void {\n if (typeof window === 'undefined') return\n const marker = window as { __edrvExtPoll?: boolean }\n if (marker.__edrvExtPoll) return\n marker.__edrvExtPoll = true\n let executing = false\n window.setInterval(() => {\n if (executing) return\n executing = true\n void rpc('edrv.external.pending', {})\n .then(async (result) => {\n if (!result.ok || !result.open) return\n await openDeepLink(ctx, { paths: result.open.paths, line: result.open.line, column: result.open.column })\n })\n .catch(() => { /* 旧版 host 无此方法/离线:忽略 */ })\n .finally(() => { executing = false })\n }, HANDOFF_POLL_MS)\n}\n\n/**\n * 跨源守卫:referrer 为空(launcher/Unity 直开)或同源 → 允许。\n * @author ddj 2026年09月07号\n * @param referrer 文档 referrer\n * @param origin 当前页面源\n * @returns 是否允许处理深链\n */\nexport function referrerAllowed(referrer: string, origin: string): boolean {\n if (!referrer) return true\n try {\n return new URL(referrer).origin === origin\n } catch {\n return false\n }\n}\n\n/**\n * 剥离 URL 中的深链参数(保留其余参数与 hash,防刷新重开)。\n * @author ddj 2026年09月07号\n * @param href 完整 URL\n * @returns 清理后的 URL(pathname+search+hash)\n */\nexport function stripOpenHref(href: string): string {\n const url = new URL(href)\n for (const key of EDRV_PARAM_KEYS) url.searchParams.delete(key)\n return url.pathname + url.search + url.hash\n}\n\n/** 清理当前页面 URL(best-effort,失败不阻塞打开)。 */\nfunction stripCurrentUrl(): void {\n try {\n if (typeof location === 'undefined' || typeof history === 'undefined') return\n const next = stripOpenHref(location.href)\n if (next !== location.pathname + location.search + location.hash) history.replaceState(null, '', next)\n } catch { /* 清理失败忽略 */ }\n}\n\n/**\n * 轻量 toast(编辑器未挂载也能提示;5s 自隐;openFlow 通知与错误呈现共用)。\n * @author ddj 2026年09月07号\n * @param text 提示文本\n */\nexport function toastDom(text: string): void {\n if (typeof document === 'undefined') return\n const toast = document.createElement('div')\n toast.textContent = text\n toast.setAttribute('style', [\n 'position:fixed', 'left:50%', 'bottom:28px', 'transform:translateX(-50%)',\n 'z-index:99999', 'padding:8px 14px', 'border-radius:8px', 'max-width:80vw',\n 'background:#2a2a2a', 'color:#ddd', 'border:1px solid #444', 'font-size:12px',\n 'box-shadow:0 4px 16px rgba(0,0,0,.35)',\n ].join(';'))\n document.body?.appendChild(toast)\n setTimeout(() => toast.remove(), TOAST_MS)\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 sessions: props?.sessions,\n })\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — OfficialSideTab:DSH 官方右侧 Sidebar「文件编辑」页签正文包装。\n * 用途:页类型 Tab(edrvEditor)经 navigation.params(openPath/focusDiff/line)打开;\n * 兼作 file 认领转发(ClaimRouter)失败时的兜底正文(就地挂编辑器,旧行为)。\n * 派发既有 edrv:open-editor 事件复用 EditorView 打开流;按会话 key 保证切会话干净重建。\n * Tab 正文切换后重挂载时按最新导航恢复打开(对齐 better-sidebar 形态的种子行为)。\n * 作者 ddj 2026年09月09号 / 2026年09月10号\n */\nimport React from 'react'\nimport { EditorView } from './EditorView.js'\nimport { setSideEditorMounted } from '../sidebarBridge.js'\nimport { editorMountEpoch, markEditorMounted, parseOfficialFileAddress, resolveNavLine, resolveNavOpen } from '../officialSidebar.js'\n\n/**\n * 官方侧边栏 Tab 正文组件(keyed slot sidebar.right.pane.tab 装配)。\n * @param props slot 框架注入(useTabInfo/sessionId)+ 装配依赖(schedule 等)\n * @returns EditorView 侧栏形态\n */\nexport function OfficialSideTab(props) {\n const sessionId = props?.sessionId\n const useTabInfo = props?.useTabInfo\n let navigation\n // useTabInfo 是 slot 框架按组件实例生成的 hook,须在组件顶层无条件调用\n if (typeof useTabInfo === 'function') {\n try {\n navigation = useTabInfo()?.tab?.navigation\n } catch {\n navigation = undefined\n }\n }\n const revision = typeof navigation?.revision === 'number' ? navigation.revision : -1\n const revisionRef = React.useRef(-1)\n // 最新 sessionId 镜像(卸载清理判读「切会话 vs 本会话关闭」用)\n const sessionIdRef = React.useRef(sessionId)\n sessionIdRef.current = sessionId\n\n // 编辑 Tab 激活标记:挂载即激活;卸载时延迟判定「切会话(保持,供新会话自动恢复)\n // vs 本会话关闭/切走其他 Tab(清除,尊重用户选择)」——通知早于会话状态落定,必须延后读;\n // 纪元守卫:判定期间有新正文挂载(HMR/自动恢复)则放弃清除\n React.useEffect(() => {\n setSideEditorMounted(true)\n markEditorMounted()\n return () => {\n setSideEditorMounted(false)\n const epoch = editorMountEpoch()\n const self = sessionIdRef.current\n const schedule = props?.schedule\n const decide = () => {\n if (editorMountEpoch() !== epoch) return\n const current = props?.sessions?.list?.getSnapshot?.()?.current\n markEditorActive(current === self)\n }\n if (typeof schedule === 'function') schedule(decide, 0)\n else decide()\n }\n }, [])\n\n React.useEffect(() => {\n if (revision === revisionRef.current) return\n revisionRef.current = revision\n // revision 0 = 无地址打开(种子/撤销恢复),没有可执行的打开请求\n if (revision <= 0) return\n // file 资源 Tab:地址即文件(解码出真实路径,透传 params.line 行号定位)\n const fileHit = parseOfficialFileAddress(navigation?.address)\n if (fileHit) {\n const line = navigation?.params?.line\n window.dispatchEvent(new CustomEvent('edrv:open-editor', {\n detail: { path: fileHit.path, line: typeof line === 'number' ? line : undefined },\n }))\n return\n }\n // 页类型 Tab:params 携带打开请求(line = 行引用/工具行跳转的行号定位)\n const request = resolveNavOpen(navigation?.params)\n window.dispatchEvent(new CustomEvent('edrv:open-editor', {\n detail: { path: request.path, focusDiff: request.focusDiff, line: resolveNavLine(navigation?.params) },\n }))\n })\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 sessions: props?.sessions,\n })\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — ClaimRouter:官方 file 认领页签的中转正文。\n * 官方为每个 `dsh-resource://file/**` 地址开一个认领页签;本组件只做转发:\n * 解析地址 → 送进单一编辑器页签(文件分页由编辑器自带页签栏接管)→ 关闭本中转页签。\n * 转发失败(seat 未就绪等瞬时态)按 3 次 ×150ms 重试;仍失败则就地渲染兜底正文\n * (旧行为:每文件一套编辑器),保证退化路径不白屏。本组件自身不创建 Monaco 实例。\n * 作者 ddj 2026年09月10号\n */\nimport React from 'react'\nimport { forwardToEditor, parseOfficialFileAddress, resolveNavLine } from '../officialSidebar.js'\nimport { log } from '../log.js'\n\n/** 转发尝试次数(含首次)与重试间隔。 */\nconst FORWARD_ATTEMPTS = 3\nconst FORWARD_DELAY_MS = 150\n\n/**\n * 读 slot 框架注入的 tab 记录(hook 缺失或抛错时返回 undefined)。\n * @author ddj 2026年09月10号\n * @param props slot 框架注入的组件 props\n * @returns tab 记录(含 navigation 与 actions),或 undefined\n */\nfunction readTab(props) {\n const useTabInfo = props?.useTabInfo\n if (typeof useTabInfo !== 'function') return undefined\n try {\n return useTabInfo()?.tab\n } catch {\n return undefined\n }\n}\n\n/**\n * 关闭本中转页签(失败仅告警:目标文件已在编辑器打开,残留页签不阻塞功能)。\n * @author ddj 2026年09月10号\n * @param tab slot 框架注入的 tab 记录\n */\nfunction closeTab(tab) {\n try {\n tab?.actions?.close?.()\n } catch (error) {\n log.warn('中转页签关闭失败(' + String(error) + ')')\n }\n}\n\n/**\n * 组装 file 认领转发正文。\n * @author ddj 2026年09月10号\n * @param spec 装配依赖(service 官方导航服务 / schedule 延时调度 / fallback 兜底正文)\n * @returns 正文组件(注册进 keyed slot sidebar.right.pane.tab)\n */\nexport function createClaimRouter(spec) {\n const service = spec?.service\n const schedule = spec?.schedule\n const fallback = spec?.fallback\n\n /**\n * 中转正文:转发成功即关闭自身;重试耗尽后渲染兜底正文。\n * @param props slot 框架注入(useTabInfo)+ 装配依赖\n * @returns 兜底正文元素,或 null(转发中 / 已转发)\n */\n function ClaimRouter(props) {\n const tab = readTab(props)\n const navigation = tab?.navigation\n const revision = typeof navigation?.revision === 'number' ? navigation.revision : -1\n const [failed, setFailed] = React.useState(false)\n const doneRef = React.useRef(-1)\n\n React.useEffect(() => {\n if (revision === doneRef.current) return\n doneRef.current = revision\n const parsed = parseOfficialFileAddress(navigation?.address)\n if (!parsed) {\n setFailed(true)\n return\n }\n const line = resolveNavLine(navigation?.params)\n let left = FORWARD_ATTEMPTS\n const attempt = () => {\n if (forwardToEditor(service, parsed.path, line)) {\n closeTab(tab)\n return\n }\n left -= 1\n if (left > 0 && typeof schedule === 'function') schedule(attempt, FORWARD_DELAY_MS)\n else setFailed(true)\n }\n attempt()\n }, [revision])\n\n if (!failed || typeof fallback !== 'function') return null\n return React.createElement(fallback, props)\n }\n return ClaimRouter\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 * 将视口边界 clamp 从 React 渲染层拆出,便于复用和单测。\n * 作者 ddj 2026-08-28 / 2026-09-03\n */\n\nexport interface MenuPosition {\n left: number\n top: 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 * 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 键前缀(按工作区作用域隔离,无 cwd 会话回退会话键)。 */\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 scope 作用域键(scopeStore.workspaceScopeOf 产物)\n * @returns 缓存数据或 null\n */\nexport function explorerLoad(scope: string): ExplorerCacheData | null {\n try {\n return parseExplorer(window.localStorage.getItem(KEY_PREFIX + String(scope)))\n } catch (error) {\n return null\n }\n}\n\n/**\n * 写入某作用域的展开状态缓存(损坏/配额满 → 忽略)。\n * @author ddj 2026年08月28号\n * @param scope 作用域键(scopeStore.workspaceScopeOf 产物)\n * @param data 缓存数据\n */\nexport function explorerSave(scope: string, data: ExplorerCacheData): void {\n try {\n window.localStorage.setItem(KEY_PREFIX + String(scope), 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/** scope → 缓存镜像(同步读,避免每次渲染 parse)。 */\nconst mirrors = new Map<string, EntriesCacheData>()\n/** scope → 落盘防抖计时器。 */\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(scope: string): string | null {\n try {\n return window.localStorage.getItem(KEY_PREFIX + scope)\n } catch (error) {\n return null\n }\n}\n\n/** localStorage 写入(配额/隐私模式失败静默)。 */\nfunction writeRaw(scope: string, text: string): void {\n try {\n window.localStorage.setItem(KEY_PREFIX + scope, text)\n } catch (error) { /* 配额满/隐私模式忽略 */ }\n}\n\n/** 取(或建)作用域缓存镜像。 */\nfunction mirrorOf(scope: string): EntriesCacheData {\n const existing = mirrors.get(scope)\n if (existing) return existing\n const data = entriesParse(readRaw(scope)) ?? { v: 2, root: null, dirs: {} }\n mirrors.set(scope, data)\n return data\n}\n\n/** 调度防抖落盘(重置已有计时器)。 */\nfunction scheduleSave(scope: string): void {\n const prev = saveTimers.get(scope)\n if (prev) clearTimeout(prev)\n saveTimers.set(scope, setTimeout(() => {\n saveTimers.delete(scope)\n const data = mirrors.get(scope)\n if (data) writeRaw(scope, entriesSerialize(entriesTrim(data)))\n }, CACHE_SAVE_DEBOUNCE_MS))\n}\n// --endregion\n\n/**\n * 读某目录缓存条目(无 → null;展示不受新鲜度限制)。\n * @author ddj 2026年08月31号\n * @param scope 作用域键(scopeStore.workspaceScopeOf 产物)\n * @param rel 目录相对路径('' = 根)\n * @returns 缓存条目或 null\n */\nexport function entriesCacheGet(scope: string | undefined, rel: string): TreeEntry[] | null {\n if (!scope) return null\n const dir = mirrorOf(scope).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 scope 作用域键(scopeStore.workspaceScopeOf 产物)\n * @param rel 目录相对路径\n * @returns 新鲜返回 true\n */\nexport function entriesCacheIsFresh(scope: string | undefined, rel: string): boolean {\n if (!scope) return false\n const dir = mirrorOf(scope).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 scope 作用域键(scopeStore.workspaceScopeOf 产物)\n * @param rel 目录相对路径\n * @param entries 目录条目\n */\nexport function entriesCachePut(scope: string | undefined, rel: string, entries: TreeEntry[]): void {\n if (!scope) return\n const data = mirrorOf(scope)\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(scope)\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 / 2026-09-10\n */\nimport React from 'react'\nimport { FileTypeIcon, IconFolderClose16, IconFolderOpen16, IconRefreshOutline16, classifyFileType } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { rpc } from '../../rpc.js'\nimport { ContextMenu } from '../../ui/ContextMenu.js'\nimport { buildTreeMenu } from '../contextMenu.js'\nimport { explorerLoad, explorerSave } from '../../state/explorerCache.js'\nimport { entriesCacheGet, entriesCacheIsFresh, entriesCachePut } from '../../state/explorerEntriesCache.js'\nimport { workspaceScopeOf } from '../../state/scopeStore.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// --region 行图标(官方原语:目录文件夹图标 + 文件类型图标;缺失时回落纯文本)\n\n/**\n * 目录图标元素(官方 IconFolderOpen16/Close16)。\n * @author ddj 2026年09月10号\n * @param isOpen 目录是否展开\n * @returns 图标元素;原语缺失返回 null\n */\nfunction dirIconEl(isOpen) {\n const Icon = isOpen ? IconFolderOpen16 : IconFolderClose16\n if (typeof Icon !== 'function') return null\n return React.createElement(Icon, { size: 16, className: 'edrv-tree-icon' })\n}\n\n/**\n * 文件图标元素(官方 FileTypeIcon + classifyFileType 分类,未知类型为 other)。\n * @author ddj 2026年09月10号\n * @param name 文件名(含扩展名)\n * @returns 图标元素;原语缺失或分类异常返回 null\n */\nfunction fileIconEl(name) {\n if (typeof FileTypeIcon !== 'function' || typeof classifyFileType !== 'function') return null\n try {\n return React.createElement(FileTypeIcon, { kind: classifyFileType(String(name ?? '')), size: 16, className: 'edrv-tree-icon' })\n } catch (error) {\n return null\n }\n}\n\n/**\n * 行图标分派:目录 → 文件夹图标,文件 → 官方类型图标。\n * @author ddj 2026年09月10号\n * @param e 目录条目(name/type)\n * @param isDir 是否目录\n * @param isOpen 目录是否展开\n * @returns 图标元素或 null\n */\nfunction rowIconEl(e, isDir, isOpen) {\n return isDir ? dirIconEl(isOpen) : fileIconEl(e?.name)\n}\n\n/**\n * 刷新按钮图标(官方 IconRefreshOutline16;原语缺失回落文本 ⟳)。\n * @author ddj 2026年09月10号\n * @returns 图标元素或回落文本\n */\nfunction refreshIconEl() {\n if (typeof IconRefreshOutline16 !== 'function') return '⟳'\n return React.createElement(IconRefreshOutline16, { size: 14 })\n}\n// --endregion\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 // 状态作用域:展开树/条目缓存按工作区隔离(同工作区切对话恢复同一份),无 cwd 回退会话\n const scope = ctx?.scope ?? workspaceScopeOf(null, 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(scope, 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(scope, 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(scope, 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 = scope ? explorerLoad(scope) : 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 }, [scope])\n\n // 展开状态防抖写回 localStorage(重启后恢复展开结构;按工作区作用域隔离)\n React.useEffect(() => {\n if (saveTimerRef.current) { clearTimeout(saveTimerRef.current); saveTimerRef.current = null }\n if (!scope) return\n saveTimerRef.current = setTimeout(() => {\n saveTimerRef.current = null\n const expandedList = Object.keys(expanded).filter((k) => expanded[k] === true)\n explorerSave(scope, { root, expanded: expandedList })\n }, SAVE_DEBOUNCE_MS)\n return () => {\n if (saveTimerRef.current) { clearTimeout(saveTimerRef.current); saveTimerRef.current = null }\n }\n }, [expanded, root, scope])\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 (!scope) 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 }, [scope])\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 // 菜单左上角对齐鼠标点击位置(视口坐标,ContextMenu 内再做 viewport clamp)\n setMenu({ x: ev.clientX, y: ev.clientY, target: { path: e.path, type: e.type } })\n },\n },\n React.createElement('span', { className: 'edrv-tree-chev' },\n isDir ? (isOpen ? '▾' : '▸') : ''),\n rowIconEl(e, isDir, isOpen),\n React.createElement('span', { className: 'edrv-tree-name' + (dim ? ' edrv-tree-dim' : '') },\n 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 }, refreshIconEl())),\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'\nimport { workspaceScopeOf } from '../../state/scopeStore.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 // 搜索条件按工作区作用域记忆(同工作区切对话恢复同一份),无 cwd 回退会话\n const scope = ctx?.scope ?? workspaceScopeOf(null, 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 (!scope) return\n try {\n const saved = JSON.parse(localStorage.getItem(CACHE_KEY.search + String(scope)) || '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 }, [scope])\n\n // 查询/选项/过滤变化 → 持久化\n React.useEffect(() => {\n if (!scope) return\n try {\n localStorage.setItem(CACHE_KEY.search + String(scope), JSON.stringify({\n query, matchCase, wholeWord, regex, includeText, excludeText, onlyActive, excludeOn, sectionOpen,\n }))\n } catch (e) { /* 忽略 */ }\n }, [scope, 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","/**\n * dsh-vscode-mode client — 规则 frontmatter 纯函数(解析 + 按类型改写)。\n * 与 host parseRuleMdc/ruleTypeOf 语义对齐的浏览器端实现:编辑器类型下拉与\n * 原始 .mdc 文本域双向同步共用;纯字符串运算,禁 node/react 导入。\n * 作者 ddj 2026年09月07号\n */\n\n/** 规则生效类型(与 shared/rules.ts RuleType 一致,此处独立声明避免引入 host 依赖)。 */\nexport type RuleFmType = 'always' | 'auto' | 'manual'\n\n/** 一条 .mdc 文本的解析结果(改写 frontmatter 所需的全部上下文)。 */\nexport interface RuleFmParsed {\n type: RuleFmType\n description: string\n alwaysApply: boolean\n globs: string[]\n enabled: boolean\n /** 是否存在规则 frontmatter(首行 --- 且有闭合)。 */\n hasFm: boolean\n /** 闭合 --- 之后的正文(按 \\n 归一,与 host 解析一致)。 */\n body: string\n /** 已知键之外的 frontmatter 原行(如 updatedAt),改写时原样保留。 */\n fmExtra: string[]\n /** 原文是否带 BOM(改写后回填)。 */\n bom: boolean\n /** 原文 frontmatter 是否显式写了 enabled 行(改写时保持该行存在与否)。 */\n hasEnabledLine: boolean\n}\n\n/** 类型改写入参:下拉/描述/globs 控件的最新值。 */\nexport interface RuleMetaNext {\n type: RuleFmType\n description: string\n globs: string[]\n}\n\n/**\n * 去除值两侧成对引号(与 host stripQuotes 一致)。\n * @author ddj 2026年09月07号\n * @param raw 原始值\n * @returns 去引号后的值\n */\nfunction stripQuotes(raw: string): string {\n const value = raw.trim()\n if (value.length >= 2 && ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\")))) {\n return value.slice(1, -1)\n }\n return value\n}\n\n// --region 解析\n/**\n * 解析 .mdc 全文:首行 --- 且 100 行内有闭合 --- 才视为 frontmatter;\n * 已知键 description/alwaysApply/globs/enabled,其余原行进 fmExtra;永不抛错。\n * @author ddj 2026年09月07号\n * @param text 文件全文\n * @returns 解析结果\n */\nexport function parseRuleFm(text: string): RuleFmParsed {\n const bom = text.startsWith('\\uFEFF')\n const lines = text.replace(/^\\uFEFF/, '').split(/\\r?\\n/)\n const none: RuleFmParsed = { type: 'manual', description: '', alwaysApply: false, globs: [], enabled: true, hasFm: false, body: text.replace(/^\\uFEFF/, ''), fmExtra: [], bom, hasEnabledLine: false }\n if (lines[0]?.trim() !== '---') return none\n let close = -1\n for (let i = 1; i < lines.length && i <= 101; i++) {\n if (lines[i].trim() === '---') { close = i; break }\n }\n if (close < 0) return none\n const parsed: RuleFmParsed = { type: 'manual', description: '', alwaysApply: false, globs: [], enabled: true, hasFm: true, body: lines.slice(close + 1).join('\\n'), fmExtra: [], bom, hasEnabledLine: false }\n for (let i = 1; i < close; i++) {\n const match = /^([A-Za-z_-]+)[ \\t]*:[ \\t]?(.*)$/.exec(lines[i])\n if (!match) { parsed.fmExtra.push(lines[i]); continue }\n const [, key, raw] = match\n if (key === 'description') parsed.description = stripQuotes(raw)\n else if (key === 'alwaysApply') parsed.alwaysApply = stripQuotes(raw).toLowerCase() === 'true'\n else if (key === 'enabled') { parsed.enabled = stripQuotes(raw).toLowerCase() !== 'false'; parsed.hasEnabledLine = true }\n else if (key === 'globs') parsed.globs = parseGlobsValue(raw, lines, i, close)\n else parsed.fmExtra.push(lines[i])\n }\n parsed.type = fmTypeOf(parsed)\n return parsed\n}\n\n/**\n * 解析 globs 值:内联逗号分隔串,或空值后接 YAML 短横列表(与 host parseGlobs 一致)。\n * @author ddj 2026年09月07号\n * @param value 内联值\n * @param lines 全文行\n * @param start globs 行下标\n * @param close 闭合 --- 下标\n * @returns glob 数组\n */\nfunction parseGlobsValue(value: string, lines: string[], start: number, close: number): string[] {\n const inline = stripQuotes(value)\n if (inline) return inline.split(',').map((item) => stripQuotes(item)).filter(Boolean)\n const list: string[] = []\n for (let j = start + 1; j < close; j++) {\n const item = /^[ \\t]*-[ \\t]*(.+)$/.exec(lines[j])\n if (!item) break\n list.push(stripQuotes(item[1]))\n }\n return list\n}\n\n/**\n * 由 frontmatter 推导类型:alwaysApply=true → 总是;有 globs → 自动;否则手动。\n * @author ddj 2026年09月07号\n * @param parsed 解析结果\n * @returns 规则类型\n */\nfunction fmTypeOf(parsed: RuleFmParsed): RuleFmType {\n if (parsed.alwaysApply) return 'always'\n if (parsed.globs.length) return 'auto'\n return 'manual'\n}\n// --endregion\n\n// --region 改写\n/**\n * 按最新控件值重写 frontmatter:known 键固定顺序 + fmExtra + 闭合 --- + 原 body;\n * 无 frontmatter 且目标为手动时:有描述则新建仅含描述的 frontmatter,否则原文返回。\n * @author ddj 2026年09月07号\n * @param parsed parseRuleFm 的结果(必须来自同一文本)\n * @param next 控件最新值\n * @returns 重写后的全文\n */\nexport function applyRuleMeta(parsed: RuleFmParsed, next: RuleMetaNext): string {\n if (!parsed.hasFm && next.type === 'manual') {\n if (!next.description.trim()) return (parsed.bom ? '\\uFEFF' : '') + parsed.body\n return (parsed.bom ? '\\uFEFF' : '') + ['---', 'description: ' + next.description.trim(), '---'].join('\\n') + '\\n' + parsed.body\n }\n const lines: string[] = ['---']\n lines.push('description: ' + next.description.trim())\n if (next.type === 'always') lines.push('alwaysApply: true')\n if (next.type === 'auto') lines.push('globs: ' + next.globs.join(', '))\n if (parsed.hasEnabledLine) lines.push('enabled: ' + (parsed.enabled ? 'true' : 'false'))\n lines.push(...parsed.fmExtra)\n lines.push('---')\n return (parsed.bom ? '\\uFEFF' : '') + lines.join('\\n') + '\\n' + parsed.body\n}\n// --endregion\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏「规则」面板(Codebuddy 规则管理形态)。\n * 双 Tab:用户规则(~/.dsh/rules/)与项目规则(<工作区>/.dsh/rules/);\n * 列表行 = 文件名 + 相对提示,第二行类型徽标与描述,右侧 编辑/删除 图标 + 滑动启用开关;\n * 新建/编辑 = 顶部面包屑 + 规则类型下拉(总是/自动/手动)+ 描述/globs 控件,与原始 .mdc\n * 文本域双向同步(控件改写 frontmatter,文本域回读控件),保存走 rules.save。\n * 作者 ddj 2026年09月03号(2026年09月07号 交互性调整)\n */\nimport React from 'react'\nimport { rpc } from '../../rpc.js'\nimport type { SidebarCtx } from '../types.js'\nimport { CACHE_KEY } from '../../paths.js'\nimport { parseRuleFm, applyRuleMeta } from '../../rulesMdc.js'\n\n/** 新建规则模板(frontmatter 字段与 host parseRuleMdc 对齐)。 */\nconst NEW_TEMPLATE = '---\\ndescription: \\nalwaysApply: true\\n---\\n\\n'\nconst TYPE_LABEL = { always: '总是', auto: '自动', manual: '手动' }\n/** 列表行描述的基础显示上限(字符数;宽面板下的封顶值,超出省略号)。 */\nconst DESC_MAX = 24\n/** 动态字数下限(极窄面板的保底可见字符数)。 */\nconst DESC_CAP_MIN = 8\n/** 动态字数估算:描述之外的行内固定占用 px(动作区/类型标签/徽标/间距/省略余量)。 */\nconst DESC_RESERVE_PX = 210\n/** 动态字数估算:单字符平均宽度 px(11px 字号,中英混排)。 */\nconst DESC_CHAR_PX = 10\n/** 窄面板阈值:低于此宽度隐藏路径提示(编辑界面面包屑与悬停仍有完整路径)。 */\nconst NARROW_W = 420\n\n/**\n * 读 localStorage(损坏/不可用安全)。\n * @author ddj 2026年09月03号\n * @param key 键\n * @returns 值或 null\n */\nfunction readLocal(key) {\n try { return localStorage.getItem(key) } catch (e) { return null }\n}\n\n/**\n * 写 localStorage(不可用安全)。\n * @author ddj 2026年09月03号\n * @param key 键\n * @param value 值\n */\nfunction writeLocal(key, value) {\n try { localStorage.setItem(key, value) } catch (e) { /* 忽略 */ }\n}\n\n/**\n * 类型徽标(总是=绿 / 自动=蓝 / 手动=灰)。\n * @author ddj 2026年09月03号\n * @param type 规则类型\n * @returns 徽标元素\n */\nfunction typeBadge(type) {\n return React.createElement('span', { className: 'edrv-rules-type edrv-rules-type-' + type }, TYPE_LABEL[type] ?? type)\n}\n\n/**\n * 按字符上限截断列表行描述,超出以省略号收尾(上限随面板宽度动态变化;\n * 窄面板下 CSS 省略号仍会按像素提前截断,二者取更小)。\n * @author ddj 2026年09月07号\n * @param text 完整描述\n * @param cap 本帧字符上限\n * @returns 截断后的展示文本\n */\nfunction clampDesc(text, cap) {\n const chars = Array.from(String(text ?? '')) // 按码位切分,避免把 emoji 等代理对从中间截断\n const limit = Math.max(4, Number(cap) || DESC_MAX)\n return chars.length > limit ? chars.slice(0, limit).join('') + '…' : chars.join('')\n}\n\n/**\n * 由面板宽度估算描述可用字符数:随宽度动态变化,并与基础上限取小、极窄时保底。\n * @author ddj 2026年09月07号\n * @param panelWidth 面板内容宽度(px)\n * @returns 本帧描述字符上限\n */\nfunction descCapOf(panelWidth) {\n const byWidth = Math.floor((Number(panelWidth) - DESC_RESERVE_PX) / DESC_CHAR_PX)\n return Math.max(DESC_CAP_MIN, Math.min(DESC_MAX, byWidth))\n}\n\n/**\n * 编辑图标(线性铅笔,与 DiffBox chevron 同风格:currentColor 描边装饰图)。\n * @author ddj 2026年09月07号\n * @returns 13×13 装饰性 SVG\n */\nfunction pencilIcon() {\n return React.createElement('svg', {\n width: 13, height: 13, viewBox: '0 0 24 24', fill: 'none', 'aria-hidden': true, focusable: false,\n }, React.createElement('path', {\n d: 'M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z',\n stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round',\n }))\n}\n\n/**\n * 删除图标(线性垃圾桶,风格同 pencilIcon)。\n * @author ddj 2026年09月07号\n * @returns 13×13 装饰性 SVG\n */\nfunction trashIcon() {\n return React.createElement('svg', {\n width: 13, height: 13, viewBox: '0 0 24 24', fill: 'none', 'aria-hidden': true, focusable: false,\n }, React.createElement('path', {\n d: 'M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2m3 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6h14zM10 11v6M14 11v6',\n stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round',\n }))\n}\n\n/**\n * 逗号分隔的 globs 输入串 → 数组(去空项)。\n * @author ddj 2026年09月07号\n * @param text 输入串\n * @returns glob 数组\n */\nfunction globList(text) {\n return String(text ?? '').split(',').map((item) => item.trim()).filter(Boolean)\n}\n\n/**\n * 由控件值重建 .mdc 全文:frontmatter 按类型/描述/globs 重写,正文与其余键不动。\n * @author ddj 2026年09月07号\n * @param base 当前全文\n * @param fmType 目标类型(always/auto/manual)\n * @param desc 描述文本\n * @param globsText globs 输入串\n * @returns 重写后的全文\n */\nfunction rebuildContent(base, fmType, desc, globsText) {\n return applyRuleMeta(parseRuleFm(base), { type: fmType, description: desc, globs: globList(globsText) })\n}\n\n// --region 列表行\n/**\n * 渲染一条规则行:左侧两行(文件名+相对提示 / 类型徽标+描述),右侧 编辑/删除 图标 + 滑动开关。\n * @author ddj 2026年09月03号\n * @param props.rule 规则元信息\n * @param props.onEdit 编辑回调\n * @param props.onRemove 删除回调\n * @param props.onToggle 开关回调\n * @returns 行元素\n */\nfunction RuleRow(props) {\n const rule = props.rule\n const desc = [rule.error ? '解析失败:' + rule.error : null, rule.description || (rule.type === 'auto' ? 'globs: ' + rule.globs.join(', ') : '')]\n .filter(Boolean).join(' · ')\n return React.createElement('div', { className: 'edrv-rules-row' + (rule.enabled ? '' : ' off') },\n React.createElement('div', { className: 'edrv-rules-main', onClick: () => props.onEdit(rule), title: rule.absPath },\n React.createElement('div', { className: 'edrv-rules-line1' },\n React.createElement('span', { className: 'edrv-rules-file' }, rule.file),\n !props.narrow ? React.createElement('span', { className: 'edrv-rules-path' }, '[' + rule.relHint + rule.file + ']') : null,\n !rule.enabled ? React.createElement('span', { className: 'edrv-rules-offtag' }, '已停用') : null),\n React.createElement('div', { className: 'edrv-rules-sub' },\n React.createElement('span', { className: 'edrv-rules-sublabel' }, '类型:'),\n typeBadge(rule.type),\n desc ? React.createElement('span', { className: 'edrv-rules-desc', title: desc }, clampDesc(desc, props.descCap)) : null)),\n React.createElement('div', { className: 'edrv-rules-actions' },\n React.createElement('button', { className: 'edrv-rules-act', title: '编辑', onClick: () => props.onEdit(rule) }, pencilIcon()),\n React.createElement('button', { className: 'edrv-rules-act', title: '删除', onClick: () => props.onRemove(rule) }, trashIcon()),\n React.createElement('button', {\n className: 'edrv-rules-switch' + (rule.enabled ? ' on' : ''), role: 'switch', 'aria-checked': rule.enabled,\n title: rule.enabled ? '已启用(点击停用)' : '已停用(点击启用)',\n onClick: () => props.onToggle(rule),\n }, React.createElement('span', { className: 'edrv-rules-knob' }))))\n}\n// --endregion\n\n// --region 内嵌编辑器\n/**\n * 新建/编辑表单:面包屑头部 + 规则类型下拉/描述/globs 控件行 + 原始 .mdc 文本域 + 保存/取消。\n * @author ddj 2026年09月03号\n * @param props.form 表单状态(mode/scope/workspacePath/relHint/file/content/fmType/desc/globs/error/saving)\n * @param props.onType 类型下拉变更回调\n * @param props.onDesc 描述输入回调\n * @param props.onGlobs globs 输入回调\n * @param props.onBody 文本域编辑回调\n * @param props.onSave 保存回调\n * @param props.onCancel 取消回调\n * @returns 表单元素\n */\nfunction RuleEditor(props) {\n const form = props.form\n const isNew = form.mode === 'new'\n const crumb = (form.scope === 'project' ? '项目规则' : '用户规则') + ' > ' + form.relHint + ' > ' + (form.file || '新建规则.mdc')\n return React.createElement('div', { className: 'edrv-rules-editor' },\n React.createElement('div', { className: 'edrv-rules-editor-head' },\n React.createElement('span', { className: 'edrv-rules-crumb', title: crumb }, crumb),\n React.createElement('button', { className: 'edrv-rules-act', title: '取消', onClick: props.onCancel }, '✕')),\n React.createElement('div', { className: 'edrv-rules-editor-ctl' },\n React.createElement('label', { className: 'edrv-rules-ctl-label' }, '规则类型'),\n React.createElement('select', { className: 'edrv-rules-select', value: form.fmType, onChange: props.onType },\n Object.keys(TYPE_LABEL).map((key) => React.createElement('option', { key, value: key }, TYPE_LABEL[key]))),\n React.createElement('label', { className: 'edrv-rules-ctl-label' }, '描述'),\n React.createElement('input', {\n className: 'edrv-rules-input edrv-rules-desc-input', value: form.desc, spellCheck: false,\n placeholder: isNew ? '规则用途说明(写入 frontmatter description)' : '规则用途说明', onChange: props.onDesc,\n })),\n form.fmType === 'auto' ? React.createElement('div', { className: 'edrv-rules-editor-ctl' },\n React.createElement('label', { className: 'edrv-rules-ctl-label' }, 'globs'),\n React.createElement('input', {\n className: 'edrv-rules-input', value: form.globs, spellCheck: false,\n placeholder: 'src/**/*.ts, *.md(逗号分隔,命中才注入)', onChange: props.onGlobs,\n })) : null,\n React.createElement('textarea', {\n className: 'edrv-rules-body', spellCheck: false,\n value: form.content,\n onChange: props.onBody,\n }),\n React.createElement('div', { className: 'edrv-rules-editor-hint' },\n '类型/描述/globs 与 frontmatter 双向同步;enabled 与其余键原样保留;无 frontmatter 的纯 markdown 视为「手动」规则'),\n form.error ? React.createElement('div', { className: 'edrv-rules-err' }, form.error) : null,\n React.createElement('div', { className: 'edrv-rules-editor-foot' },\n React.createElement('button', { className: 'edrv-rules-save', disabled: form.saving, onClick: props.onSave }, form.saving ? '保存中…' : '保存')))\n}\n// --endregion\n\n/**\n * 规则面板主体。\n * @param props.ctx 面板共享上下文(notify 可选)\n */\nexport function RulesPanel(props) {\n const ctx = props?.ctx\n const notify = ctx?.notify ?? ((message) => {})\n // 当前会话工作区(EditorView 从 sessions 快照注入;项目 Tab 自动匹配,不提供手动切换)\n const cwd = ctx?.cwd ?? null\n const [tab, setTab] = React.useState(() => (readLocal(CACHE_KEY.rules + 'tab') === 'project' ? 'project' : 'user'))\n const [data, setData] = React.useState(null) // { user: RuleInfo[], projects: RuleProject[] }\n const [error, setError] = React.useState('')\n const panelRef = React.useRef(null)\n const [panelW, setPanelW] = React.useState(0) // 面板内容宽度(ResizeObserver 跟踪;0=未测得)\n const [form, setForm] = React.useState(null) // 编辑器表单状态;null=列表态\n const mountedRef = React.useRef(true)\n\n /**\n * 当前工作区对应的项目聚合(按 ctx.cwd 自动匹配;无会话/未注册返回 null)。\n * @returns RuleProject 或 null\n */\n const activeProject = () => {\n if (!cwd) return null\n return (data?.projects ?? []).find((p) => p.workspacePath === cwd) ?? null\n }\n\n /** 拉取规则总列表(rules.list)。 */\n const load = () => {\n rpc('rules.list', {}).then((res) => {\n if (!mountedRef.current) return\n if (res && res.ok) { setData(res); setError('') } else setError(res?.error ?? '读取规则失败')\n }).catch((e) => { if (mountedRef.current) setError('读取规则异常: ' + String(e)) })\n }\n\n React.useEffect(() => {\n mountedRef.current = true\n load()\n return () => { mountedRef.current = false }\n }, [])\n\n // 面板宽度跟踪:描述字数上限与窄面板模式都随宽度动态变化\n React.useEffect(() => {\n const el = panelRef.current\n if (!el || typeof ResizeObserver === 'undefined') return undefined\n const observer = new ResizeObserver(() => setPanelW(el.clientWidth))\n observer.observe(el)\n setPanelW(el.clientWidth)\n return () => observer.disconnect()\n }, [])\n\n // 描述字数上限与窄面板模式(未测得宽度前用基础上限/完整展示)\n const descCap = panelW > 0 ? descCapOf(panelW) : DESC_MAX\n const narrow = panelW > 0 && panelW < NARROW_W\n\n /**\n * 切换 Tab(记忆到 localStorage)。\n * @param next 目标 Tab\n */\n const switchTab = (next) => {\n setTab(next)\n writeLocal(CACHE_KEY.rules + 'tab', next)\n }\n\n /**\n * 打开新建表单(按当前 Tab 决定作用域;项目规则跟随当前会话工作区)。\n */\n const openNew = () => {\n const scope = tab === 'project' ? 'project' : 'user'\n if (scope === 'project' && !cwd) { notify('当前会话没有工作区,无法新建项目规则'); return }\n const parsed = parseRuleFm(NEW_TEMPLATE)\n setForm({\n mode: 'new', scope, workspacePath: scope === 'project' ? cwd : undefined,\n relHint: scope === 'project' ? '.dsh/rules/' : 'rules/', file: '', content: NEW_TEMPLATE,\n fmType: parsed.type, desc: parsed.description, globs: parsed.globs.join(', '), error: '', saving: false,\n })\n }\n\n /**\n * 打开编辑表单:先拉全文,再解析 frontmatter 回填类型/描述/globs 控件。\n * @param rule 目标规则\n */\n const openEdit = (rule) => {\n rpc('rules.read', { scope: rule.scope, workspacePath: rule.scope === 'project' ? rule.workspacePath : undefined, file: rule.file })\n .then((res) => {\n if (!res || !res.ok) { notify(res?.error ?? '读取规则失败'); return }\n const parsed = parseRuleFm(res.content)\n setForm({\n mode: 'edit', scope: rule.scope, workspacePath: rule.workspacePath, relHint: rule.relHint,\n file: rule.file, content: res.content,\n fmType: parsed.type, desc: parsed.description, globs: parsed.globs.join(', '), error: '', saving: false,\n })\n }).catch((e) => notify('读取规则异常: ' + String(e)))\n }\n\n /** 类型下拉变更:frontmatter 按新类型重写,控件同步。 */\n const onTypeChange = (e) => {\n const nextType = e.target.value\n setForm((prev) => ({ ...prev, fmType: nextType, content: rebuildContent(prev.content, nextType, prev.desc, prev.globs), error: '' }))\n }\n\n /** 描述输入变更:同步 frontmatter description 行。 */\n const onDescChange = (e) => {\n const nextDesc = e.target.value\n setForm((prev) => ({ ...prev, desc: nextDesc, content: rebuildContent(prev.content, prev.fmType, nextDesc, prev.globs), error: '' }))\n }\n\n /** globs 输入变更(自动规则):同步 frontmatter globs 行。 */\n const onGlobsChange = (e) => {\n const nextGlobs = e.target.value\n setForm((prev) => ({ ...prev, globs: nextGlobs, content: rebuildContent(prev.content, prev.fmType, prev.desc, nextGlobs), error: '' }))\n }\n\n /** 文本域直接编辑:回读 frontmatter,同步类型/描述/globs 控件(文本域是唯一真源)。 */\n const onBodyChange = (e) => {\n const parsed = parseRuleFm(e.target.value)\n setForm((prev) => ({ ...prev, content: e.target.value, fmType: parsed.type, desc: parsed.description, globs: parsed.globs.join(', ') }))\n }\n\n /** 保存表单(rules.save;文件名非空 + 自动规则必须有 globs)。 */\n const saveForm = () => {\n const next = { ...form, saving: true, error: '' }\n const file = String(form.file ?? '').trim()\n if (!file) { setForm({ ...next, saving: false, error: '文件名不能为空' }); return }\n if (form.fmType === 'auto' && globList(form.globs).length === 0) { setForm({ ...next, saving: false, error: '自动规则需要至少一个 glob(逗号分隔)' }); return }\n setForm(next)\n rpc('rules.save', { scope: form.scope, workspacePath: form.workspacePath, file, content: form.content })\n .then((res) => {\n if (res && res.ok) {\n setForm(null)\n notify('规则已保存:' + file)\n load()\n } else setForm((prev) => ({ ...prev, saving: false, error: res?.error ?? '保存失败' }))\n }).catch((e) => setForm((prev) => ({ ...prev, saving: false, error: '保存异常: ' + String(e) })))\n }\n\n /**\n * 删除规则(confirm 后走 rules.remove)。\n * @param rule 目标规则\n */\n const removeRule = (rule) => {\n if (!window.confirm('删除规则 ' + rule.file + '?(不可恢复)')) return\n rpc('rules.remove', { scope: rule.scope, workspacePath: rule.workspacePath, file: rule.file })\n .then((res) => {\n if (res && res.ok) { notify('已删除:' + rule.file); load() } else notify(res?.error ?? '删除失败')\n }).catch((e) => notify('删除异常: ' + String(e)))\n }\n\n /**\n * 切换启用开关:本地乐观翻转(按 workspacePath+file 定位,失败回滚)。\n * @param rule 目标规则(project 已注入 workspacePath)\n */\n const toggleRule = (rule) => {\n const enabled = !rule.enabled\n const applyLocal = (on) => setData((prev) => prev ? {\n ...prev,\n user: prev.user.map((r) => (r.scope === 'user' && r.file === rule.file ? { ...r, enabled: on } : r)),\n projects: prev.projects.map((p) => (p.workspacePath === rule.workspacePath\n ? { ...p, rules: p.rules.map((r) => (r.file === rule.file ? { ...r, enabled: on } : r)) }\n : p)),\n } : prev)\n applyLocal(enabled)\n rpc('rules.toggle', { scope: rule.scope, workspacePath: rule.workspacePath, file: rule.file, enabled })\n .then((res) => {\n if (res && res.ok) { applyLocal(res.rule?.enabled === true); notify(res.rule?.enabled === false ? '已停用:' + rule.file : '已启用:' + rule.file) }\n else { applyLocal(!enabled); notify(res?.error ?? '切换失败') }\n }).catch((e) => { applyLocal(!enabled); notify('切换异常: ' + String(e)) })\n }\n\n /** 当前列表数据(按 Tab 取用户规则或当前工作区的项目规则)。 */\n const rowsOf = () => {\n if (!data) return []\n if (tab === 'user') return data.user\n return activeProject()?.rules ?? []\n }\n\n const renderTabs = () => React.createElement('div', { className: 'edrv-rules-tabs' },\n React.createElement('button', { className: 'edrv-rules-tab' + (tab === 'user' ? ' on' : ''), onClick: () => switchTab('user') }, '用户规则'),\n React.createElement('button', { className: 'edrv-rules-tab' + (tab === 'project' ? ' on' : ''), onClick: () => switchTab('project') }, '项目规则'),\n React.createElement('button', { className: 'edrv-rules-new', title: '新建规则', onClick: openNew }, '+ 新建规则'))\n\n /** 项目 Tab 的工作区展示(不可编辑,自动跟随当前会话)。 */\n const renderWsLine = () => {\n if (tab !== 'project') return null\n return React.createElement('div', { className: 'edrv-rules-ws-line', title: cwd ?? '' },\n '工作区:' + (cwd ?? '当前会话未打开工作区'))\n }\n\n const renderEmpty = () => {\n if (tab === 'project') {\n if (!cwd) return '当前会话没有工作区,项目规则不可用(项目规则跟随会话所在工作区)'\n if (!data?.projects?.length) return '当前 DSH 没有已注册的工作区;在目标工作区打开一次会话后再来管理'\n if (!activeProject()) return '当前工作区未注册为 DSH workspace,暂不能管理其项目规则'\n return '<工作区>/.dsh/rules/ 还没有规则,点击「+ 新建规则」创建'\n }\n return '还没有用户规则(~/.dsh/rules/),点击「+ 新建规则」创建'\n }\n\n const renderBody = () => {\n if (form) {\n return React.createElement(RuleEditor, {\n form, onType: onTypeChange, onDesc: onDescChange, onGlobs: onGlobsChange, onBody: onBodyChange,\n onSave: saveForm, onCancel: () => setForm(null),\n })\n }\n if (!data) return React.createElement('div', { className: 'edrv-rules-empty' }, '加载中…')\n if (error) return React.createElement('div', { className: 'edrv-rules-err' }, error)\n const rows = rowsOf()\n if (!rows.length) return React.createElement('div', { className: 'edrv-rules-empty' }, renderEmpty())\n const common = {\n descCap,\n narrow,\n onEdit: (rule) => openEdit({ ...rule, workspacePath: rule.scope === 'project' ? cwd : undefined }),\n onRemove: (rule) => removeRule({ ...rule, workspacePath: rule.scope === 'project' ? cwd : undefined }),\n onToggle: (rule) => toggleRule({ ...rule, workspacePath: rule.scope === 'project' ? cwd : undefined }),\n }\n return React.createElement('div', { className: 'edrv-rules-list' },\n rows.map((rule) => React.createElement(RuleRow, { key: rule.scope + ':' + rule.file, rule, ...common })))\n }\n\n return React.createElement('div', { className: 'edrv-rules-panel', ref: panelRef },\n renderTabs(),\n renderWsLine(),\n React.createElement('div', { className: 'edrv-rules-hint' },\n tab === 'user' ? '用户规则对所有会话生效(存放于 ~/.dsh/rules/)' : '项目规则仅对所在工作区的会话生效(存放于 <工作区>/.dsh/rules/)'),\n renderBody())\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏面板定义(文件管理 + 搜索 + 规则)。\n * 活动栏图标用官方 UI 原语(跟随 DSH 主题与皮肤);原语缺失时由 SidebarView 回落文本渲染。\n * 作者 ddj 2026-08-26 / 2026-09-03 / 2026-09-10\n */\nimport React from 'react'\nimport { IconFolderOpenOutline16, IconListPenOutline16, IconSearchOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { FileExplorer } from './FileExplorer.js'\nimport { SearchPanel } from './SearchPanel.js'\nimport { RulesPanel } from './RulesPanel.js'\nimport type { SidebarPanelDef, SidebarCtx } from '../types.js'\n\n/**\n * 构造文件管理面板定义。\n * @author ddj 2026年08月26号 / 2026年09月10号\n * @returns 面板定义(含活动栏徽标 = 差异文件总数;图标 = 官方 IconFolderOpenOutline16)\n */\nexport function createFilePanel(): SidebarPanelDef {\n return {\n id: 'explorer',\n title: '文件管理',\n icon: IconFolderOpenOutline16,\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号 / 2026年09月10号\n * @returns 面板定义(无徽标;图标 = 官方 IconSearchOutline16)\n */\nexport function createSearchPanel(): SidebarPanelDef {\n return {\n id: 'search',\n title: '搜索',\n icon: IconSearchOutline16,\n order: 15,\n render: (ctx: SidebarCtx) => React.createElement(SearchPanel, { ctx }),\n }\n}\n\n/**\n * 构造规则管理面板定义(Codebuddy 规则形态:用户规则/项目规则双 Tab + 开关)。\n * @author ddj 2026年09月03号 / 2026年09月10号\n * @returns 面板定义(无徽标;图标 = 官方 IconListPenOutline16)\n */\nexport function createRulesPanel(): SidebarPanelDef {\n return {\n id: 'rules',\n title: '规则',\n icon: IconListPenOutline16,\n order: 20,\n render: (ctx: SidebarCtx) => React.createElement(RulesPanel, { ctx }),\n }\n}\n","/**\n * dsh-vscode-mode client — 文件管理右键菜单内置项。\n * 内置项:「在文件浏览器中打开」(文件→OS Explorer 定位选中、目录→打开目录);\n * 「添加引用到对话」(文件/文件夹引用注入当前会话对话输入框)。\n * 反馈统一走 ctx.notify(由 EditorView 提供,落到编辑区路径栏状态)。\n * 作者 ddj 2026-08-27 / 2026-09-03\n */\nimport { revealInExplorer } from '../fileReveal.js'\nimport { statusOfAdd } from '../addToConversation.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 id: 'add-to-conversation',\n label: '添加引用到对话',\n order: 1,\n // 排除根目录空白区(path==='' 无意义)、无会话、动作集缺失时隐藏\n visible: (target, ctx) => Boolean(target.path && ctx.sessionId && ctx.addToConversation),\n run: (target, ctx) => {\n const isDir = target.type === 'directory'\n const add = ctx.addToConversation\n if (!add) {\n ctx.notify?.('添加到对话不可用')\n return\n }\n const okText = isDir ? '已添加文件夹引用' : '已添加文件引用'\n void add.appendReference(ctx.sessionId, target.path, undefined, isDir ? 'folder' : 'file').then((outcome) => {\n ctx.notify?.(statusOfAdd(outcome, okText))\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 { IconCodeOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { OutlinePanel } from './OutlinePanel.js'\nimport type { SidebarPanelDef, SidebarCtx } from '../sidebar/types.js'\n\n/**\n * 构造大纲面板定义。\n * @author ddj 2026年08月27号 / 2026年09月10号\n * @returns 面板定义(无徽标;活动栏图标 = 官方 IconCodeOutline16)\n */\nexport function createOutlinePanel(): SidebarPanelDef {\n return {\n id: 'outline',\n title: '大纲',\n icon: IconCodeOutline16,\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 — 指令执行桥(装配层)。\n * 职责三件:① 把内置指令目录注册进注册表;② 为「桥接派发」类指令挂窗口 capture 键位监听\n * (EditorView 原生监听的 8 条不进这里,避免双执行);③ 注入命令栏执行器。\n * 编辑器动作本身由 EditorView / QuickOpen 监听 `edrv.command.<action>` 窗口事件完成——桥不持有\n * React 状态,因此指令系统可在编辑器挂载前装配、卸载后仍安全。\n * 作者 ddj 2026年09月10号\n */\nimport { BRIDGE_COMMANDS, EDITOR_COMMANDS, dispatchedCommands, showCommandsDef } from './ui/commandCatalog.js'\nimport { createCommandRegistry } from './commandRegistry.js'\nimport type { CommandRegistry } from './commandRegistry.js'\nimport { bindingsOf, matchEvent } from './keybindings.js'\nimport { log } from './log.js'\nimport { openCommandPalette, setPaletteRunner, setRegistryRef } from './commandPaletteStore.js'\n\nconst bridgeLog = log.child('commands')\n\n/** 桥接装配选项(事件目标可注入,便于单测)。 */\nexport interface CommandBridgeOptions {\n /** 键盘事件目标(缺省 window;无 window 的纯 Node 环境自动跳过监听)。 */\n target?: Pick<EventTarget, 'addEventListener' | 'removeEventListener'>\n}\n\n/** 指令执行桥句柄。 */\nexport interface CommandBridge {\n /** 指令注册表(第三方可继续 register)。 */\n registry: CommandRegistry\n /** 卸载全部内置指令并解除键位监听(幂等)。 */\n dispose(): void\n}\n\n/** 解析事件目标(缺省 window;无 window 返回 null)。 */\nfunction resolveTarget(options: CommandBridgeOptions): CommandBridgeOptions['target'] | null {\n if (options.target) return options.target\n if (typeof window === 'undefined') return null\n return window\n}\n\n/**\n * 创建指令执行桥:注册内置指令 + 桥接类指令的全局键位监听。\n * @author ddj 2026年09月10号\n * @param options 装配选项(事件目标注入)\n * @returns 指令执行桥句柄\n */\nexport function createCommandBridge(options: CommandBridgeOptions = {}): CommandBridge {\n const registry = createCommandRegistry()\n const disposers: Array<() => void> = []\n const palette = showCommandsDef(() => openCommandPalette('command'))\n for (const command of [...EDITOR_COMMANDS, ...BRIDGE_COMMANDS]) {\n disposers.push(registry.register(command))\n }\n disposers.push(registry.register(palette))\n setPaletteRunner((id) => registry.run(id))\n // 命令栏候选来源:模块引用直传(旧实现依赖 window.dsh,DSH 无该命名空间 → 恒空表)\n setRegistryRef(registry)\n\n // 全局键位派发集合:桥接类指令 + 命令栏自身(EditorView/QuickOpen 原生监听的 8 条不在内,避免双执行)\n const dispatched = dispatchedCommands(palette)\n const onKey = (event: KeyboardEvent): void => {\n for (const command of dispatched) {\n if (!matchEvent(event, bindingsOf(command.id))) continue\n event.preventDefault()\n event.stopPropagation()\n registry.run(command.id)\n return\n }\n }\n const target = resolveTarget(options)\n if (target) target.addEventListener('keydown', onKey as EventListener, true)\n\n const dispose = (): void => {\n if (target) target.removeEventListener('keydown', onKey as EventListener, true)\n while (disposers.length) {\n const release = disposers.pop()\n if (release) release()\n }\n setPaletteRunner(null)\n setRegistryRef(null)\n }\n bridgeLog.info('指令注册表已装配(' + registry.list().length + ' 条指令,桥接键位 '\n + dispatched.length + ' 条)')\n return { registry, dispose }\n}\n","/**\n * dsh-vscode-mode client — 浏览器半入口:slot 注册 + 装配。\n * 挂点:官方右侧 Sidebar「文件编辑」Tab(DSH 0.1.5+,对话+编辑同屏)> betterSidebar Tab\n * (归档,仅旧版 DSH 回退)> 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 { observeScheme, schemeOfSnapshot } from './monaco/theme.js'\nimport { createFileOpenerRegistry, scanSidebar, officialSidebarOpener, shouldClaimFiles, type FileOpenContext } from './fileOpeners.js'\nimport type { FileOpenerRegistry } from './fileOpeners.js'\nimport { installOpenPathRouter, vscodeOpener, autoValue } from './openPathRouter.js'\nimport { patchRemoteOpen, probeRemoteOpen } from './remoteOpenRouter.js'\nimport { setupExtOpen } from './externalOpen.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 { detectOfficial, installOfficial, registerOfficialFileClaim, OFFICIAL_TAB_KIND, OFFICIAL_TAB_TITLE, isEditorTabActive, restoreEditorTab } from './officialSidebar.js'\nimport { SideEditorTab } from './ui/SideEditorTab.js'\nimport { OfficialSideTab } from './ui/OfficialSideTab.js'\nimport { createClaimRouter } from './ui/ClaimRouter.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 { createRulesPanel } 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 { createCommandBridge } from './commandBridge.js'\nimport { REGISTRY_GLOBAL } from './commandGlobals.js'\nimport { sidebarMinApply } from './sidebarMin.js'\nimport { log } from './log.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/** 指令桥装配幂等标记(同一 document 重复 apply 只装配一次,避免重复键位监听)。 */\nlet commandsMounted = false\n\n/**\n * 装配指令注册表(指令桥 + 命令栏)。\n * 指令桥不依赖已挂载编辑器(run 只派发窗口事件),故可在启动期装配;\n * 命令栏浮层的宿主由 CommandPalette 自己在编辑区树内认领。\n * @author ddj 2026年09月10号\n * @param ctx 客户端根上下文\n * @returns void\n */\nfunction setupCommands(ctx: any): void {\n if (commandsMounted) return\n commandsMounted = true\n const bridge = createCommandBridge()\n ctx.provide(REGISTRY_GLOBAL, bridge.registry)\n // 无条件镜像到 window(DSH 不创建 window.dsh,旧条件式赋值是死代码 → 命令栏空表)\n const host = window as unknown as Record<string, unknown>\n host[REGISTRY_GLOBAL] = bridge.registry\n ctx.effect(() => () => {\n bridge.dispose()\n commandsMounted = false\n if (host[REGISTRY_GLOBAL] === bridge.registry) delete host[REGISTRY_GLOBAL]\n }, 'vscode-mode: command registry')\n log.info('指令系统已装配:' + bridge.registry.list().length + ' 条指令,Ctrl+Shift+P 打开命令栏')\n}\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 // 指令系统(命令栏 + 指令注册表)先装配:命令栏在被任何 React slot 渲染前即可唤起\n setupCommands(ctx)\n\n const registry: FileOpenerRegistry = createFileOpenerRegistry()\n const workspaces = ctx.get('workspaces')\n const sessions = ctx.get('sessions')\n\n // 外部深链落地:Windows 右键菜单 / Unity 外部编辑器 → 浏览器 URL 参数 → 打开规则路由\n setupExtOpen(ctx)\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 // 会话切换 → 编辑 Tab 跨会话自动恢复:上一会话编辑区激活时,新会话自动展开并激活\n //(官方停靠面按会话隔离,新会话默认收起;先试 openTabIn 直写新会话面,未 adopt 走有界重试)。\n // 注意:首次打开某会话时通知早于 current 字段落定,故通知只调度延迟任务,执行时再读最新快照\n if (monacoList && typeof monacoList.subscribe === 'function') {\n const list = monacoList as { getSnapshot: () => { current?: string }; subscribe: (listener: () => void) => () => void }\n ctx.effect(() => {\n let lastCurrent = list.getSnapshot?.()?.current\n const check = () => {\n const current = list.getSnapshot?.()?.current\n if (!current || current === lastCurrent) return\n lastCurrent = current\n if (!isEditorTabActive() || officialService === undefined) return\n try { officialService.service.openTabIn?.(current, OFFICIAL_TAB_KIND, {}) } catch { /* 未 adopt 等 seat 就绪走重试 */ }\n restoreEditorTab(officialService.service, schedule)\n }\n return list.subscribe(() => schedule(check, 0))\n }, 'vscode-mode: editor tab restore')\n }\n const originalOpenPath = workspaces?.openPath\n const binder = pickSettingsBinder(ctx)\n const settings = binder.scope\n let selected = autoValue('auto')\n /** 0.1.3+ 会话文件链接路由(remote.session.openWorkspacePath)是否已安装(compatSummary 展示用)。 */\n let remoteOpenInstalled = false\n /** 两条文件链接路由共用的路由日志(openPathRouter / remoteOpenRouter;统一走插件日志器)。 */\n const routeLogger = (message: string): void => log.warn(message)\n /** 两条路由共用的 FileOpenContext:当前会话 id 与工作区 cwd。 */\n const openContext = (): FileOpenContext => {\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 /** 可选探测 betterSidebar 服务(不进 inject:缺失会让插件停靠等待,杀死回退路径)。 */\n let sideService = detectSidebarService(ctx)\n /** 可选探测官方右侧 Sidebar(DSH 0.1.5-alpha.1+;探测命中 ≡ 版本判定,不进 inject 同上)。 */\n let officialService = detectOfficial(ctx)\n /** 官方 file 地址认领的当前注销器(null=未认领;由 syncFileClaim 依设置值切换)。 */\n let claimDisposer: (() => void) | null = null\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 打开器优先,失败回退系统打开(0.1.2 及更早 DSH 的对话文件链接主路径)' },\n { name: '会话文件链接路由(remote.session.openWorkspacePath)', active: remoteOpenInstalled, note: '0.1.3+ 对话文件引用/产物打开优先走插件打开器,失败回退系统打开' },\n { name: '侧边栏打开器(' + SIDEBAR_PLUGIN + ')', active: registry.get(SIDEBAR_PLUGIN) !== undefined, note: registry.get(SIDEBAR_PLUGIN) !== undefined ? '已注册(优先级 80)' : '未检测到侧边栏打开能力' },\n { name: '侧边栏编辑区(官方 Sidebar)', active: officialService !== undefined, note: officialService !== undefined ? '编辑区=官方右侧 Sidebar Tab(对话+编辑同屏,DSH 0.1.5+)' : '官方侧边栏服务未探测到(DSH < 0.1.5-alpha.1 时属预期)' },\n { name: '侧边栏编辑区(' + SIDEBAR_PLUGIN + ',归档)', active: sideService !== undefined, note: sideService !== undefined ? '编辑区=侧边栏 Tab(旧版 DSH 回退形态)' : '未检测到;DSH ≥ 0.1.5 优先官方侧边栏,旧版可安装(' + SIDEBAR_INSTALL_CMD + ')' },\n { name: '文件链接官方认领(dsh-resource://file)', active: claimDisposer !== null, note: claimDisposer !== null ? '聊天文件链接转发进单一编辑器页签(文件分页归编辑器自带页签栏)' : '链接走官方查看器或旧版路由(未认领)' },\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 // 规则面板:活动栏「规则」页签(Codebuddy 规则管理形态:用户/项目规则 + 启用开关,host 注入生效)\n ctx.effect(() => sidebarPanels.register(createRulesPanel()), 'vscode-mode: sidebar panel rules')\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 // 官方侧边栏正文组件装配(页类型正文;兼作 file 认领转发失败时的兜底正文)\n const officialRenderTab = (props: Record<string, unknown>) => React.createElement(OfficialSideTab, Object.assign({}, props, { schedule, addToConversation, sidebarPanels, outlineSources, fileMenuItems, sessions }))\n /** 官方 file 地址认领同步:自动/VSCodeMode 档认领(转发进单一编辑器页签),其余交官方查看器。 */\n const syncFileClaim = (): void => {\n const official = officialService\n const want = official !== undefined && shouldClaimFiles(selected)\n if (want && claimDisposer === null && official) {\n // 认领正文只做转发:文件分页收归编辑器自带页签栏,官方侧栏不再按文件分裂编辑器实例\n const renderTab = createClaimRouter({ service: official.service, schedule, fallback: officialRenderTab })\n const disposer = registerOfficialFileClaim({ tabs: official.tabs, slots: ctx.slots, renderTab })\n if (disposer !== null) claimDisposer = ctx.effect(() => disposer, 'vscode-mode: official file claim')\n return\n }\n if (!want && claimDisposer !== null) {\n claimDisposer()\n claimDisposer = null\n }\n }\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 syncFileClaim()\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 // 同一订阅里顺带同步侧边栏最小宽度(sidebarMinWidth)→ 派发 edrv:sidebar-min-width 通知编辑器重夹\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 const minW = sidebarMinApply(snapshot.value?.sidebarMinWidth)\n window.dispatchEvent(new CustomEvent('edrv:sidebar-min-width', { detail: { value: minW } }))\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: openContext,\n logger: routeLogger,\n }), 'vscode-mode: file link routing')\n }\n // 0.1.3+ 会话文件链接主路径:dsh-client-ui-chat 的 openFile 直接调\n // remote.session.openWorkspacePath(session/openWorkspacePath RPC),绕开\n // workspaces.openPath;该 namespace 由 api-remotes 在 loader.await 后挂载,\n // 晚于本插件 apply,且旧版 DSH 可能整段不存在——不加 inject(避免旧版停等\n // 永不激活),改为定时探测有界重试(与侧栏服务探测同款节奏)。\n let remoteRetries = 0\n const retryRemoteOpen = (): void => {\n if (remoteOpenInstalled || remoteRetries >= 15) {\n if (!remoteOpenInstalled) log.warn('未探测到 remote.session.openWorkspacePath,0.1.3+ 会话文件链接路由未安装')\n return\n }\n remoteRetries += 1\n schedule(() => {\n if (remoteOpenInstalled) return\n const service = probeRemoteOpen(ctx)\n if (!service) {\n retryRemoteOpen()\n return\n }\n const disposer = patchRemoteOpen(service, { registry, selected: () => selected, context: openContext, logger: routeLogger })\n if (!disposer) {\n log.warn('remote.session 存在但 openWorkspacePath 不可补丁,会话文件链接路由未安装')\n return\n }\n remoteOpenInstalled = true\n ctx.effect(() => disposer, 'vscode-mode: remote file link routing')\n log.info('已安装 0.1.3+ 会话文件链接路由(remote.session.openWorkspacePath)')\n }, 2000)\n }\n retryRemoteOpen()\n\n // 官方主题跟随(DSH 0.1.5+):ctx.theme 快照事件优先,其次明暗标记观察(observeScheme),\n // 都不可用时 theme.ts 的 detectColorScheme 兜底;统一广播 edrv:theme-change 触发 Monaco 主题重刷。\n const themeService = ctx.get('theme') as { getTheme?: () => unknown } | undefined\n const emitTheme = (): void => {\n const snapshot = typeof themeService?.getTheme === 'function' ? themeService.getTheme() : undefined\n window.dispatchEvent(new CustomEvent('edrv:theme-change', { detail: { scheme: schemeOfSnapshot(snapshot) } }))\n }\n ctx.effect(() => {\n if (!themeService || typeof ctx.on !== 'function') return undefined\n const disposer = ctx.on('theme/change', emitTheme)\n return typeof disposer === 'function' ? disposer : undefined\n }, 'vscode-mode: official theme event')\n ctx.effect(() => observeScheme(emitTheme), 'vscode-mode: theme attribute watch')\n emitTheme()\n\n // 中央「文件编辑」页签(旧形态回退):类 VSCode 编辑器;侧边栏形态(官方/better-sidebar)可用时\n // 编辑器住侧边栏 Tab,本页签不注册(避免双实例: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, sessions })))\n }\n\n // 侧边栏三形态互斥切换:官方(DSH 0.1.5+)> better-sidebar(归档,仅旧版回退)> 中央页签。\n // officialDisposer / sideDisposer / legacyDisposer 任一时刻只保留其一(避免双实例 Monaco 抢占)。\n // ⚠️ 两个可选服务都可能晚于本插件就绪(better-sidebar bundle 1MB+ 后加载;官方服务旧 DSH\n // 不存在),一次性探测会误报——故启动后按 2s 间隔重试(窗口 ~30s):每 tick 先探官方再探\n // better-sidebar;better-sidebar 先命中而官方后到时自动切换(官方优先),窗口结束仍未命中\n // 则保持中央页签回退。\n let officialDisposer: (() => void) | null = null\n let sideDisposer: (() => void) | null = null\n let legacyDisposer: (() => void) | null = null\n const installOfficialForm = (): void => {\n const official = officialService\n if (officialDisposer !== null || !official) return\n if (sideDisposer !== null) { sideDisposer(); sideDisposer = null }\n if (legacyDisposer !== null) { legacyDisposer(); legacyDisposer = null }\n const outcome = installOfficial({\n tabs: official.tabs,\n service: official.service,\n slots: ctx.slots,\n renderTab: officialRenderTab,\n guide: {\n title: () => OFFICIAL_TAB_TITLE,\n description: () => 'Monaco 文件编辑器:对话与编辑同屏(差异审查/跳转/大纲)',\n },\n })\n if (outcome === null) {\n // 官方类型注册失败(API 变更等):撤下官方标记,回退旧形态链\n officialService = undefined\n applySideForm()\n return\n }\n officialDisposer = ctx.effect(() => outcome, 'vscode-mode: official sidebar editor tab')\n // 官方打开器(下拉「官方侧边栏」选项,动态出现;openResource 能力缺失时跳过)+ 按当前设置同步 file 地址认领\n if (typeof official.service.openResource === 'function') {\n ctx.effect(() => registry.register(officialSidebarOpener(official.service)), 'vscode-mode: official sidebar opener')\n }\n syncFileClaim()\n }\n const applySideForm = (): void => {\n if (officialService) {\n installOfficialForm()\n return\n }\n if (sideService) {\n if (sideDisposer !== null) return\n if (officialDisposer !== null) { officialDisposer(); officialDisposer = null }\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, sessions })),\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 return\n }\n if (legacyDisposer !== null) return\n if (officialDisposer !== null) { officialDisposer(); officialDisposer = null }\n if (sideDisposer !== null) { sideDisposer(); sideDisposer = null }\n setEnsureSideEditor(null)\n legacyDisposer = registerLegacyTab()\n }\n applySideForm()\n let sideRetries = 0\n const retrySideService = (): void => {\n if (officialService !== undefined || sideRetries >= 15) return\n sideRetries += 1\n schedule(() => {\n if (officialService !== undefined) return\n officialService = detectOfficial(ctx)\n if (officialService !== undefined) {\n log.info('检测到官方右侧 Sidebar(DSH 0.1.5+),切换官方侧边栏编辑形态')\n applySideForm()\n return\n }\n if (sideService === undefined) {\n sideService = detectSidebarService(ctx)\n if (sideService !== undefined) {\n log.info('检测到 ' + SIDEBAR_PLUGIN + ',切换侧边栏编辑形态(官方未探测到,后续仍优先官方)')\n applySideForm()\n }\n }\n retrySideService()\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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"}