dsh-vscode-mode 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/client.js +64 -14
- package/lib/client.js.map +1 -1
- package/package.json +1 -1
- package/src/client/index.ts +11 -4
- package/src/client/ui/EditorView.ts +44 -11
package/lib/client.js
CHANGED
|
@@ -1136,7 +1136,10 @@ window.__ModuleLoader__.load({
|
|
|
1136
1136
|
const lineRegionMapRef = react.default.useRef(/* @__PURE__ */ new Map());
|
|
1137
1137
|
const hoverKeyRef = react.default.useRef(null);
|
|
1138
1138
|
const hoverTopRef = react.default.useRef(null);
|
|
1139
|
+
const hoverRightRef = react.default.useRef(null);
|
|
1139
1140
|
const hideTimerRef = react.default.useRef(null);
|
|
1141
|
+
const hoverEditorRef = react.default.useRef(false);
|
|
1142
|
+
const hoverPanelRef = react.default.useRef(false);
|
|
1140
1143
|
const batchBusyRef = react.default.useRef(false);
|
|
1141
1144
|
const diffRendererRef = react.default.useRef(null);
|
|
1142
1145
|
if (!diffRendererRef.current) diffRendererRef.current = createDiffRenderer((sid, t) => dbg(sid, t));
|
|
@@ -1408,41 +1411,49 @@ window.__ModuleLoader__.load({
|
|
|
1408
1411
|
setCursor("Ln " + e.position.lineNumber + ", Col " + e.position.column);
|
|
1409
1412
|
});
|
|
1410
1413
|
const hideSoon = () => {
|
|
1411
|
-
if (hideTimerRef.current) return;
|
|
1414
|
+
if (hoverEditorRef.current || hoverPanelRef.current || hideTimerRef.current) return;
|
|
1412
1415
|
hideTimerRef.current = setTimeout(() => {
|
|
1413
1416
|
hideTimerRef.current = null;
|
|
1417
|
+
if (hoverEditorRef.current || hoverPanelRef.current) return;
|
|
1414
1418
|
hoverKeyRef.current = null;
|
|
1415
1419
|
hoverTopRef.current = null;
|
|
1416
1420
|
setHoverAct(null);
|
|
1417
1421
|
}, 180);
|
|
1418
1422
|
};
|
|
1419
1423
|
ed.onMouseMove((e) => {
|
|
1424
|
+
hoverEditorRef.current = true;
|
|
1420
1425
|
const line = e?.target?.position?.lineNumber;
|
|
1421
1426
|
const map = lineRegionMapRef.current;
|
|
1422
1427
|
if (!line || !map.size) {
|
|
1428
|
+
hoverEditorRef.current = false;
|
|
1423
1429
|
hideSoon();
|
|
1424
1430
|
return;
|
|
1425
1431
|
}
|
|
1426
1432
|
const hit = map.get(line);
|
|
1427
1433
|
if (!hit) {
|
|
1434
|
+
hoverEditorRef.current = false;
|
|
1428
1435
|
hideSoon();
|
|
1429
1436
|
return;
|
|
1430
1437
|
}
|
|
1431
1438
|
const key = callIdAttr(hit.callId, hit.idx);
|
|
1432
1439
|
const top = Math.max(0, ed.getTopForLineNumber(Math.max(1, hit.start)) - ed.getScrollTop());
|
|
1433
|
-
|
|
1440
|
+
const layout = ed.getLayoutInfo();
|
|
1441
|
+
const minimapLeft = layout.minimap?.minimapLeft || 0;
|
|
1442
|
+
const right = minimapLeft > 0 ? Math.max(12, layout.width - minimapLeft + 8) : Math.max(12, layout.verticalScrollbarWidth + 8);
|
|
1443
|
+
if (hoverKeyRef.current === key && hoverTopRef.current === top && hoverRightRef.current === right) return;
|
|
1434
1444
|
hoverKeyRef.current = key;
|
|
1435
1445
|
hoverTopRef.current = top;
|
|
1446
|
+
hoverRightRef.current = right;
|
|
1436
1447
|
if (hideTimerRef.current) {
|
|
1437
1448
|
clearTimeout(hideTimerRef.current);
|
|
1438
1449
|
hideTimerRef.current = null;
|
|
1439
1450
|
}
|
|
1440
1451
|
setHoverAct({
|
|
1441
1452
|
region: hit,
|
|
1442
|
-
top
|
|
1453
|
+
top,
|
|
1454
|
+
right
|
|
1443
1455
|
});
|
|
1444
1456
|
});
|
|
1445
|
-
ed.onMouseLeave(hideSoon);
|
|
1446
1457
|
editorRef.current = ed;
|
|
1447
1458
|
}, []);
|
|
1448
1459
|
react.default.useEffect(() => {
|
|
@@ -1504,6 +1515,22 @@ window.__ModuleLoader__.load({
|
|
|
1504
1515
|
refreshRecords();
|
|
1505
1516
|
};
|
|
1506
1517
|
/**
|
|
1518
|
+
* 关闭当前差异浮窗并清理 hover 锚点。
|
|
1519
|
+
* @author ddj 2026年08月21号
|
|
1520
|
+
*/
|
|
1521
|
+
const dismissHover = () => {
|
|
1522
|
+
hoverKeyRef.current = null;
|
|
1523
|
+
hoverTopRef.current = null;
|
|
1524
|
+
hoverRightRef.current = null;
|
|
1525
|
+
hoverEditorRef.current = false;
|
|
1526
|
+
hoverPanelRef.current = false;
|
|
1527
|
+
if (hideTimerRef.current) {
|
|
1528
|
+
clearTimeout(hideTimerRef.current);
|
|
1529
|
+
hideTimerRef.current = null;
|
|
1530
|
+
}
|
|
1531
|
+
setHoverAct(null);
|
|
1532
|
+
};
|
|
1533
|
+
/**
|
|
1507
1534
|
* 对单个差异区域执行采纳/不采纳。
|
|
1508
1535
|
* @author ddj 2026年08月20号
|
|
1509
1536
|
* @param region 差异区域(callId/idx/create)
|
|
@@ -1696,29 +1723,45 @@ window.__ModuleLoader__.load({
|
|
|
1696
1723
|
className: "edrv-hoveract",
|
|
1697
1724
|
style: {
|
|
1698
1725
|
top: hoverAct.top,
|
|
1699
|
-
right: 12
|
|
1726
|
+
right: hoverAct.right ?? 12
|
|
1700
1727
|
},
|
|
1701
1728
|
onMouseEnter: () => {
|
|
1729
|
+
hoverPanelRef.current = true;
|
|
1730
|
+
if (hideTimerRef.current) {
|
|
1731
|
+
clearTimeout(hideTimerRef.current);
|
|
1732
|
+
hideTimerRef.current = null;
|
|
1733
|
+
}
|
|
1734
|
+
},
|
|
1735
|
+
onMouseMove: () => {
|
|
1736
|
+
hoverPanelRef.current = true;
|
|
1702
1737
|
if (hideTimerRef.current) {
|
|
1703
1738
|
clearTimeout(hideTimerRef.current);
|
|
1704
1739
|
hideTimerRef.current = null;
|
|
1705
1740
|
}
|
|
1706
1741
|
},
|
|
1707
1742
|
onMouseLeave: () => {
|
|
1708
|
-
|
|
1743
|
+
hoverPanelRef.current = false;
|
|
1744
|
+
if (hoverEditorRef.current || hideTimerRef.current) return;
|
|
1745
|
+
hideTimerRef.current = setTimeout(() => {
|
|
1709
1746
|
hideTimerRef.current = null;
|
|
1747
|
+
if (hoverEditorRef.current || hoverPanelRef.current) return;
|
|
1710
1748
|
hoverKeyRef.current = null;
|
|
1711
1749
|
hoverTopRef.current = null;
|
|
1712
1750
|
setHoverAct(null);
|
|
1713
|
-
},
|
|
1714
|
-
hideTimerRef.current = t;
|
|
1751
|
+
}, 420);
|
|
1715
1752
|
}
|
|
1716
1753
|
}, react.default.createElement("button", {
|
|
1717
1754
|
className: "edrv-pill edrv-pill-keep",
|
|
1718
|
-
onClick: () =>
|
|
1755
|
+
onClick: () => {
|
|
1756
|
+
dismissHover();
|
|
1757
|
+
actHunk(hoverAct.region, false);
|
|
1758
|
+
}
|
|
1719
1759
|
}, "✓ Keep"), react.default.createElement("button", {
|
|
1720
1760
|
className: "edrv-pill edrv-pill-undo",
|
|
1721
|
-
onClick: () =>
|
|
1761
|
+
onClick: () => {
|
|
1762
|
+
dismissHover();
|
|
1763
|
+
actHunk(hoverAct.region, true);
|
|
1764
|
+
}
|
|
1722
1765
|
}, "↩ Undo")) : null;
|
|
1723
1766
|
const overlay = launcherOpen ? react.default.createElement(react.default.Fragment, null, react.default.createElement("div", {
|
|
1724
1767
|
style: {
|
|
@@ -1880,6 +1923,13 @@ window.__ModuleLoader__.load({
|
|
|
1880
1923
|
* dsh-vscode-mode client — 浏览器半入口:slot 注册 + 装配。
|
|
1881
1924
|
* 挂点:conversation.view「文件编辑」页签(中央 Monaco 编辑器)+ header 差异角标。
|
|
1882
1925
|
* 与 Host 通信:同源 fetch('/edrv/rpc')(shared/rpc 契约)。
|
|
1926
|
+
*
|
|
1927
|
+
* ⚠️ 跨版本 slot 装配(2026-08-21):新版 DSH 的 slots 系统要求 slot 必须由父 entry
|
|
1928
|
+
* 的 children table 先声明,直接 `ctx.slots.register({name:'conversation.view'})` 在
|
|
1929
|
+
* 声明未就绪时抛 `slot ... is not declared (a parent entry's children table must declare it)`。
|
|
1930
|
+
* 正确写法 = `ctx.slots.inject(name, () => ctx.slots.register(...))`:声明存在时同步
|
|
1931
|
+
* 执行,否则等待声明(官方 ui-conversation 自身即此模式);旧版(rc.8 及更早)同样支持,
|
|
1932
|
+
* 故跨版本兼容。slot 名未变:conversation.view / conversation.session.header.utilities。
|
|
1883
1933
|
* 作者 ddj 2026-08-20
|
|
1884
1934
|
*/
|
|
1885
1935
|
const inject = ["slots", "timer"];
|
|
@@ -1890,19 +1940,19 @@ window.__ModuleLoader__.load({
|
|
|
1890
1940
|
*/
|
|
1891
1941
|
function apply(ctx) {
|
|
1892
1942
|
const schedule = (fn, ms) => ctx.timeout(fn, ms);
|
|
1893
|
-
ctx.slots.register({
|
|
1943
|
+
ctx.slots.inject("conversation.view", () => ctx.slots.register({
|
|
1894
1944
|
name: "conversation.view",
|
|
1895
1945
|
id: "edrv-editor",
|
|
1896
1946
|
order: 5,
|
|
1897
1947
|
label: "文件编辑",
|
|
1898
1948
|
inject: (sessionId) => ({ sessionId })
|
|
1899
|
-
}, (props) => react.default.createElement(EditorView, Object.assign({}, props, { schedule })));
|
|
1900
|
-
ctx.slots.register({
|
|
1949
|
+
}, (props) => react.default.createElement(EditorView, Object.assign({}, props, { schedule }))));
|
|
1950
|
+
ctx.slots.inject("conversation.session.header.utilities", () => ctx.slots.register({
|
|
1901
1951
|
name: "conversation.session.header.utilities",
|
|
1902
1952
|
id: "edrv-diff-badge",
|
|
1903
1953
|
order: 90,
|
|
1904
1954
|
label: "差异"
|
|
1905
|
-
}, (props) => react.default.createElement(DiffBadge, Object.assign({}, props)));
|
|
1955
|
+
}, (props) => react.default.createElement(DiffBadge, Object.assign({}, props))));
|
|
1906
1956
|
}
|
|
1907
1957
|
//#endregion
|
|
1908
1958
|
exports.apply = apply;
|
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["React","React","React","React","React","React","React"],"sources":["../src/shared/rpc.ts","../src/client/rpc.ts","../src/client/events.ts","../src/client/monaco/loader.ts","../src/client/monaco/diffRender.ts","../src/client/state/records.ts","../src/client/state/regions.ts","../src/client/ui/QuickOpen.ts","../src/client/ui/shared.ts","../src/client/ui/DiffBox.ts","../src/client/ui/DiffBarEmpty.ts","../src/client/ui/DiffLauncher.ts","../src/client/ui/EditorView.ts","../src/client/ui/DiffBadge.ts","../src/client/index.ts"],"sourcesContent":["/**\n * dsh-vscode-mode RPC contract — method names, per-method request/ok payloads,\n * and the typed handler map shared by the host dispatcher and the client\n * fetch wrapper. 载荷形状与历史实现一字不差,仅把隐式约定类型化。\n *\n * Purity rule: no node/react imports (same as types.ts).\n * 作者 ddj 2026-08-20\n */\nimport type {\n ArchiveBatch,\n ArchiveEntry,\n RecordView,\n StaleHunk,\n} from './types.js'\n\n/** webServer 精确路由。 */\nexport const RPC_PATH = '/edrv/rpc'\n\n/** 决策作用域:call=整条记录,hunk=单个差异块。 */\nexport type RpcScope = 'call' | 'hunk'\n\n/** 每个方法的请求参数(sessionId 为公共可选字段)。 */\nexport interface RpcRequestMap {\n 'edrv.list': { sessionId?: string; callIds?: string[] }\n 'edrv.accept': { sessionId?: string; callId: string; scope?: RpcScope; hunkIndex?: number }\n 'edrv.reject': { sessionId?: string; callId: string; scope?: RpcScope; hunkIndex?: number }\n 'edrv.read': { sessionId?: string; path: string }\n 'edrv.original': { sessionId?: string; path: string }\n 'edrv.save': { sessionId?: string; path: string; content: string }\n 'edrv.archiveList': { sessionId?: string }\n 'edrv.archiveRead': { sessionId?: string; path?: string }\n 'edrv.rollback': { sessionId?: string; path: string; batch?: number }\n 'edrv.debug': { sessionId?: string; text: string }\n 'edrv.searchFiles': { sessionId?: string; query: string }\n}\n\nexport type RpcMethod = keyof RpcRequestMap\n\n/** 每个方法成功(ok:true)时的附加载荷。 */\nexport interface RpcOkMap {\n 'edrv.list': { records: RecordView[] }\n 'edrv.accept': { record: RecordView }\n 'edrv.reject': { record: RecordView }\n 'edrv.read': { content: string; size: number }\n 'edrv.original': { content: string; size: number; stale: StaleHunk[]; fallback: boolean }\n 'edrv.save': object\n 'edrv.archiveList': { entries: ArchiveEntry[] }\n 'edrv.archiveRead': { batches: ArchiveBatch[] }\n 'edrv.rollback': { path: string; batch: number | null }\n 'edrv.debug': object\n 'edrv.searchFiles': { files: string[]; truncated: boolean }\n}\n\n/** 统一响应:{ok:true, ...payload} 或 {ok:false, error}。 */\nexport type RpcResult<M extends RpcMethod> =\n | ({ ok: true } & RpcOkMap[M])\n | { ok: false; error: string }\n\n/** 每个方法的 handler 签名(host 分发表与 client 类型检查共用)。 */\nexport type RpcHandler<M extends RpcMethod> = (\n args: RpcRequestMap[M],\n) => Promise<RpcResult<M>>\n\n/** host RPC 分发表:method → handler。 */\nexport type RpcHandlerMap = {\n [M in RpcMethod]: RpcHandler<M>\n}\n","/**\n * dsh-vscode-mode client — 类型化 RPC 包装 + 诊断日志。\n * 迁移自原 src/client/index.ts 的 rpc/dbg,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport { RPC_PATH } from '../shared/rpc.js'\nimport type { RpcMethod, RpcRequestMap, RpcResult } from '../shared/rpc.js'\n\n/** 同源 RPC 调用(host /edrv/rpc 精确路由)。 */\nexport function rpc<M extends RpcMethod>(method: M, args: RpcRequestMap[M]): Promise<RpcResult<M>> {\n return fetch(RPC_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ method, args }),\n }).then((res) => res.json()) as Promise<RpcResult<M>>\n}\n\n/**\n * 诊断日志:统一走 host edrv.debug 落盘,避免 console 刷屏。\n * @author ddj 2026年08月20号\n * @param sessionId 会话 id\n * @param text 日志文本\n */\nexport function dbg(sessionId: string | undefined, text: string): void {\n try {\n rpc('edrv.debug', { sessionId, text }).catch(() => {})\n } catch (e) { /* 日志失败忽略 */ }\n}\n","/**\n * dsh-vscode-mode client — 跨组件/跨 slot 的窗口事件助手。\n * 迁移自原 src/client/index.ts 的 openEditorView 与事件派发,语义不改。\n * 作者 ddj 2026-08-20\n */\n\n/**\n * 打开中央「文件编辑」页签:点击 shell 会话头部的视图页签(DOM 级,无需 store actions)。\n * @author ddj 2026年08月20号\n * @param path 要打开的路径(可空)\n */\nexport function openEditorView(path: string | null): void {\n const tabs = Array.from(document.querySelectorAll('div[role=\"tablist\"] button[role=\"tab\"]'))\n for (const b of tabs) {\n if (b.textContent && b.textContent.includes('文件编辑')) { (b as HTMLButtonElement).click(); break }\n }\n const p = path ?? null\n setTimeout(() => {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path: p } }))\n }, 80)\n}\n\n/** 差异状态变化:触发角标/DiffBox 重拉。 */\nexport function emitRefresh(): void {\n window.dispatchEvent(new CustomEvent('edrv:refresh'))\n}\n\n/** 打开指定路径到编辑区页签。 */\nexport function emitOpenEditor(path: string): void {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path } }))\n}\n\n/** 拉起 DiffLauncher。 */\nexport function emitShowLauncher(): void {\n window.dispatchEvent(new CustomEvent('edrv:show-launcher'))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — Monaco 加载与语言映射(AMD 构建,离线随包分发)。\n * 迁移自原 src/client/index.ts 的 MONACO_BASE/LANG_BY_EXT/langOf/loadMonaco,语义不改。\n * 作者 ddj 2026-08-20\n */\n\nexport const MONACO_BASE = '/edrv/vendor/monaco/vs'\nlet monacoPromise = null\n\n/** 扩展名 → Monaco language id(常见语言;未知回退 plaintext)。 */\nexport const LANG_BY_EXT = {\n js: 'javascript', jsx: 'javascript', mjs: 'javascript', cjs: 'javascript',\n ts: 'typescript', tsx: 'typescript', mts: 'typescript', cts: 'typescript',\n json: 'json', jsonc: 'json', md: 'markdown', markdown: 'markdown', mdx: 'mdx',\n css: 'css', scss: 'scss', less: 'less', html: 'html', htm: 'html', vue: 'html', xml: 'xml',\n yaml: 'yaml', yml: 'yaml', toml: 'ini', ini: 'ini', cfg: 'ini',\n py: 'python', sh: 'shell', bash: 'shell', zsh: 'shell', ps1: 'powershell',\n lua: 'lua', java: 'java', c: 'c', h: 'c', cpp: 'cpp', cc: 'cpp', cxx: 'cpp', hpp: 'cpp',\n cs: 'csharp', go: 'go', rs: 'rust', rb: 'ruby', php: 'php', sql: 'sql',\n swift: 'swift', kt: 'kotlin', kts: 'kotlin', dart: 'dart', dockerfile: 'dockerfile'\n}\n\n/**\n * 路径 → Monaco language id:取 basename 扩展名(dockerfile/Dockerfile 特判)。\n * @author ddj 2026年08月20号\n * @param path 文件路径\n * @returns language id\n */\nexport function langOf(path) {\n const base = String(path || '').split(/[\\\\/]/).pop() || ''\n if (/^dockerfile$/i.test(base)) return 'dockerfile'\n const dot = base.lastIndexOf('.')\n if (dot <= 0) return 'plaintext'\n return LANG_BY_EXT[base.slice(dot + 1).toLowerCase()] ?? 'plaintext'\n}\n\n/**\n * 加载 Monaco Editor(AMD 构建,随插件包离线分发):注入 loader.js → require.config → editor.main。\n * @author ddj 2026年08月20号\n * @returns Promise<object> window.monaco\n */\nexport function loadMonaco() {\n if (!monacoPromise) {\n monacoPromise = new Promise((resolve, reject) => {\n const boot = () => {\n try {\n window.require.config({ paths: { vs: MONACO_BASE } })\n window.require(['vs/editor/editor.main'], () => resolve(window.monaco), (err) => {\n monacoPromise = null\n reject(new Error('Monaco 模块加载失败:' + String(err)))\n })\n } catch (error) {\n monacoPromise = null\n reject(error)\n }\n }\n const existing = document.querySelector('script[data-edrv-monaco-loader]')\n if (existing) boot()\n else {\n const s = document.createElement('script')\n s.src = MONACO_BASE + '/loader.js'\n s.dataset.edrvMonacoLoader = '1'\n s.onload = boot\n s.onerror = () => { monacoPromise = null; reject(new Error('Monaco loader 加载失败')) }\n document.head.appendChild(s)\n }\n })\n }\n return monacoPromise\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 行内差异自绘(新增行绿底 + glyph margin '+';删除块 view zone 红底)。\n * 迁移自原 src/client/index.ts 的 diff-render effect,语义不改。\n * 作者 ddj 2026-08-20\n */\n\n/**\n * 差异渲染器(每 EditorView 挂载一个,内部持有 zone/decoration 状态)。\n * @param log 诊断日志函数((sessionId, text) => void)\n */\nexport function createDiffRenderer(log) {\n let viewZoneIds = []\n let decorations = []\n\n /**\n * 渲染当前 pending 差异:绿底 decoration + 删除块 view zones + '-' 号 overlay(滚动同步)。\n * @param monaco window.monaco\n * @param editor Monaco 编辑器实例\n * @param pendingRegions 待处理差异区域\n * @param sessionId 会话 id\n */\n const render = (monaco, editor, pendingRegions, sessionId) => {\n const renderT0 = Date.now()\n const callIdAttr = (callId, idx) => String(callId) + ':' + String(idx)\n log(sessionId, '[diff-render] begin regs=' + pendingRegions.length + ' ' + pendingRegions.map((r) => callIdAttr(r.callId, r.idx) + '@' + (r.start ?? '?') + '-' + (r.end ?? '?') + '(-' + (r.oldLines ? r.oldLines.length : 0) + '/+' + (r.newLines ? r.newLines.length : 0) + ')').join('|'))\n\n const decos = []\n for (const r of pendingRegions) {\n if (r.start === undefined || r.end === undefined) continue\n if (!r.create && r.newLines && r.newLines.length) {\n decos.push({\n range: new monaco.Range(r.start, 1, Math.max(r.start, r.end - 1), 1),\n options: { isWholeLine: true, className: 'edrv-mn-add-line', linesDecorationsClassName: 'edrv-mn-gutter-add' },\n })\n }\n }\n decorations = editor.deltaDecorations(decorations, decos)\n\n // 删除块 view zones(红底 + 正文;- 号由独立 overlay 层渲染,定位在 decoration 列与 + 同列,\n // 不受 view zone 容器定位/裁剪影响;滚动用 translateY 同步)\n let createdZones = []\n editor.changeViewZones((accessor) => {\n for (const id of viewZoneIds) { try { accessor.removeZone(id) } catch (e) { /* 已移除 */ } }\n viewZoneIds = []\n const zones = []\n for (const r of pendingRegions) {\n if (r.create) continue\n const oldLines = r.oldLines && r.oldLines.length ? r.oldLines : null\n if (!oldLines) continue\n const after = Math.max(0, (r.start ?? 1) - 1)\n const domNode = document.createElement('div')\n domNode.className = 'edrv-del-zone'\n domNode.dataset.edrvHunk = callIdAttr(r.callId, r.idx)\n for (const t of oldLines) {\n const row = document.createElement('div')\n row.className = 'edrv-del-row'\n const text = document.createElement('span')\n text.className = 'edrv-del-text'\n text.textContent = t\n row.appendChild(text)\n domNode.appendChild(row)\n }\n const id = accessor.addZone({\n afterLineNumber: after,\n heightInLines: oldLines.length,\n domNode,\n suppressMouseDown: false,\n })\n viewZoneIds.push(id)\n zones.push({ domNode, after, n: oldLines.length })\n }\n createdZones = zones\n })\n\n if (createdZones.length) {\n const root = editor.getDomNode()\n if (root) {\n let overlay = root.querySelector('.edrv-minus-overlay')\n if (!overlay) {\n overlay = document.createElement('div')\n overlay.className = 'edrv-minus-overlay'\n root.appendChild(overlay)\n }\n overlay.innerHTML = ''\n const lineH = editor.getOption(monaco.editor.EditorOption.lineHeight) || 20\n let li = null\n try { li = editor.getLayoutInfo() } catch (e) { /* ignore */ }\n const left = li ? li.decorationsLeft : 0\n const width = li && li.decorationsWidth > 0 ? li.decorationsWidth : 16\n const lineCount = editor.getModel().getLineCount()\n let itemIdx = 0\n let zi = 0\n for (const z of createdZones) {\n // 用 Monaco 坐标 API 计算 view zone 顶部,避免离屏 zone DOM 未布局导致 getBoundingClientRect 为 0\n const anchor = Math.min(z.after + 1, lineCount)\n let zoneBottom = editor.getTopForLineNumber(anchor)\n if (z.after >= lineCount) zoneBottom += lineH\n const zoneTop = zoneBottom - z.n * lineH\n for (let i = 0; i < z.n; i++) {\n const item = document.createElement('div')\n item.className = 'edrv-minus-item'\n item.textContent = '-'\n item.style.width = width + 'px'\n item.style.height = lineH + 'px'\n item.dataset.zone = String(zi)\n item.dataset.row = String(i)\n item.style.top = (zoneTop + i * lineH) + 'px'\n item.style.left = left + 'px'\n overlay.appendChild(item)\n itemIdx++\n }\n zi++\n }\n log(sessionId, '[diff-render] placed zones=' + createdZones.length + ' items=' + itemIdx + ' left=' + left + ' w=' + width + ' t+' + (Date.now() - renderT0) + 'ms')\n // 滚动同步:overlay 随内容滚动(内容坐标 - scrollTop)\n const syncScroll = () => {\n const s2 = editor.getScrollTop() || 0\n if (overlay) overlay.style.transform = 'translateY(' + (-s2) + 'px)'\n }\n syncScroll()\n overlay.__edrvSync = syncScroll\n if (!overlay.__edrvBound) {\n overlay.__edrvBound = true\n editor.onDidScrollChange(syncScroll)\n }\n // 已可见的 zone 用真实 DOM 坐标做一次微调(离屏 zone 仍保留坐标 API 位置)\n setTimeout(() => {\n try {\n const edRect = root.getBoundingClientRect()\n const st = editor.getScrollTop() || 0\n const items = overlay.querySelectorAll('.edrv-minus-item')\n for (const item of items) {\n const zIndex = Number(item.dataset.zone)\n const rIndex = Number(item.dataset.row)\n const z = createdZones[zIndex]\n if (!z || !z.domNode.isConnected) continue\n const rowEl = z.domNode.querySelectorAll('.edrv-del-row')[rIndex]\n if (!rowEl) continue\n const rowRect = rowEl.getBoundingClientRect()\n if (rowRect.height > 0) {\n item.style.top = (rowRect.top - edRect.top + st) + 'px'\n }\n }\n } catch (e) { log(sessionId, '[diff-render] correct fail ' + String(e)) }\n }, 50)\n }\n } else {\n const root = editor.getDomNode()\n const overlay = root && root.querySelector('.edrv-minus-overlay')\n if (overlay) overlay.innerHTML = ''\n }\n }\n\n /** 卸载清理(EditorView unmount 时调用)。 */\n const dispose = () => {\n viewZoneIds = []\n decorations = []\n }\n\n return { render, dispose }\n}\n","/**\n * dsh-vscode-mode client — 记录/差异状态纯函数(可单测)。\n * 迁移自原 src/client/index.ts 前段,语义一字不改。\n * 作者 ddj 2026-08-20\n */\nimport type { CallHunk, Hunk, RecordView } from '../../shared/types.js'\n\n/** 差异决策状态。 */\nexport const ST = { PENDING: 'pending', ACCEPTED: 'accepted', REJECTED: 'rejected' } as const\nexport type Status = 'pending' | 'accepted' | 'rejected'\n\n/** 记录视图摘要(按文件分组)。 */\nexport interface FileSummary {\n path: string\n recs: RecordView[]\n pending: number\n}\nexport interface Summary {\n files: FileSummary[]\n pendingFiles: FileSummary[]\n totalFiles: number\n}\n\n/** hunk 的 DOM 定位 key(callId:idx)。 */\nexport function callIdAttr(callId: string, idx: number): string {\n return String(callId) + ':' + String(idx)\n}\n\n/** 某 hunk 的当前决策状态(缺省 pending)。 */\nexport function statusAt(rec: RecordView | undefined, idx: number): Status {\n if (!rec) return ST.PENDING\n if (Array.isArray(rec.decisions?.perHunk) && rec.decisions.perHunk[idx] !== undefined) return rec.decisions.perHunk[idx] as Status\n return (rec.decisions?.call as Status) ?? ST.PENDING\n}\n\n/** hunk 是否为空差异(old===new,无实际内容变化,不可操作)。create 记录不视为空差异。 */\nexport function noopHunk(rec: RecordView | undefined, h: Hunk | CallHunk | null | undefined): boolean {\n if (!rec || rec.create === true) return false\n const precise = rec.toolName === 'edit' && rec.callHunk ? rec.callHunk : h\n const oldText = precise?.oldText ?? null\n const newText = precise?.newText ?? null\n return oldText !== null && oldText === newText\n}\n\n/** 记录是否仍有待处理差异(superseded / 全部已决策 = false)。 */\nexport function isRecPending(rec: RecordView): boolean {\n if (!rec || rec.superseded === true) return false\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n if (perHunk.length) {\n // 只认存在至少一个\"非空差异且未决策\"的 hunk\n for (let i = 0; i < perHunk.length; i++) {\n if (perHunk[i] !== 'accepted' && perHunk[i] !== 'rejected' && !noopHunk(rec, (rec.hunks || [])[i])) return true\n }\n return false\n }\n return rec.decisions.call === 'pending' || rec.decisions.call === undefined\n}\n\n/** 记录待处理差异\"处\"数(按 hunk,跳过空差异)。 */\nexport function pendingCount(recs: RecordView[]): number {\n let n = 0\n for (const rec of recs) {\n if (!isRecPending(rec)) continue\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n if (perHunk.length) {\n for (let i = 0; i < perHunk.length; i++) {\n if (perHunk[i] === 'pending' && !noopHunk(rec, (rec.hunks || [])[i])) n++\n }\n } else {\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (const h of hunks) if (!noopHunk(rec, h)) n++\n if (!hunks.length && !noopHunk(rec, rec.callHunk)) n = Math.max(n, 1)\n }\n }\n return n\n}\n\n/** 按文件分组的差异摘要(角标/Launcher 用)。 */\nexport function summarize(records: RecordView[]): Summary {\n const byPath = new Map<string, RecordView[]>()\n for (const r of records) {\n if (!byPath.has(r.path)) byPath.set(r.path, [])\n byPath.get(r.path)!.push(r)\n }\n const files: FileSummary[] = []\n for (const [path, recs] of byPath) files.push({ path, recs, pending: pendingCount(recs) })\n files.sort((a, b) => (a.path < b.path ? -1 : 1))\n const pendingFiles = files.filter((f) => f.pending > 0)\n return { files, pendingFiles, totalFiles: pendingFiles.length }\n}\n","/**\n * dsh-vscode-mode client — 差异区域计算纯函数(可单测)。\n * 迁移自原 src/client/index.ts 的 diffRegions/trimCommonLines/countLinesBefore,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport type { Hunk, RecordView } from '../../shared/types.js'\nimport { ST, noopHunk, statusAt } from './records.js'\nimport type { Status } from './records.js'\n\n/** 差异区域(文件内一段待处理/已处理的变更)。 */\nexport interface Region {\n callId: string\n idx: number\n start?: number\n end?: number\n oldLines: string[]\n newLines: string[]\n whole?: boolean\n status: Status\n create: boolean\n rec: RecordView\n superseded: boolean\n stale?: boolean\n}\n\n/** 统计 index 之前(不含)的换行数 → 0 基行号。 */\nexport function countLinesBefore(text: string, index: number): number {\n let n = 0\n for (let i = 0; i < index; i++) if (text.charCodeAt(i) === 10) n++\n return n\n}\n\n/**\n * 行级公共前缀/后缀裁剪:old/new 首尾相同的行视为未变化(上下文),只保留真正变更的中间段。\n * @author ddj 2026年08月20号\n * @param oldLines 替换前内容按行拆分\n * @param newLines 替换后内容按行拆分\n * @returns 裁剪后的变更段与公共前缀行数\n */\nexport function trimCommonLines(oldLines: string[], newLines: string[]): { oldLines: string[]; newLines: string[]; shift: number } {\n let prefix = 0\n const maxPrefix = Math.min(oldLines.length, newLines.length)\n while (prefix < maxPrefix && oldLines[prefix] === newLines[prefix]) prefix++\n let suffix = 0\n const maxSuffix = Math.min(oldLines.length - prefix, newLines.length - prefix)\n while (suffix < maxSuffix && oldLines[oldLines.length - 1 - suffix] === newLines[newLines.length - 1 - suffix]) suffix++\n return { oldLines: oldLines.slice(prefix, oldLines.length - suffix), newLines: newLines.slice(prefix, newLines.length - suffix), shift: prefix }\n}\n\n/** 计算文件内各差异区域(行范围 + old/new + 状态),用于行内绿标注与 DiffBox。 */\nexport function diffRegions(records: RecordView[], content: string | null): Region[] {\n const regions: Region[] = []\n if (content === null) return regions\n const lines = content.split('\\n')\n for (const rec of records) {\n for (let i = 0; i < rec.hunks.length; i++) {\n const h: Hunk = rec.hunks[i]\n if (noopHunk(rec, h)) continue // 空差异(old===new)无实际变化,跳过\n const status = statusAt(rec, i)\n if (rec.create) {\n regions.push({ callId: rec.callId, idx: i, start: 1, end: lines.length, oldLines: [], newLines: lines.slice(), whole: true, status, create: true, rec, superseded: rec.superseded === true })\n continue\n }\n const precise = rec.toolName === 'edit' && rec.callHunk ? rec.callHunk : h\n const newText = precise.newText ?? ''\n const at = content.indexOf(newText)\n if (at < 0) {\n regions.push({ callId: rec.callId, idx: i, stale: true, status, create: false, oldLines: [], newLines: [], rec, superseded: rec.superseded === true })\n continue\n }\n const start = countLinesBefore(content, at) + 1\n const oldLines = precise.oldText === null ? [] : precise.oldText.split('\\n')\n const newLines = newText.split('\\n')\n const trimmed = trimCommonLines(oldLines, newLines)\n const regionStart = start + trimmed.shift\n regions.push({ callId: rec.callId, idx: i, start: regionStart, end: regionStart + trimmed.newLines.length, oldLines: trimmed.oldLines, newLines: trimmed.newLines, status, create: false, rec, superseded: rec.superseded === true })\n }\n }\n regions.sort((a, b) => (a.start ?? Infinity) - (b.start ?? Infinity))\n return regions\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — QuickOpen:顶部搜索框(Ctrl+P 打开文件)。\n * 迁移自原 src/client/index.ts 的 QuickOpen,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\n\n/**\n * 快速打开搜索框:Ctrl+P 聚焦,输入 ≥2 字符经 edrv.searchFiles 搜索,\n * 结果列表点击/回车打开文件。\n * @param props.sessionId 会话 id\n * @param props.onOpen 打开回调(path)\n */\nexport function QuickOpen(props) {\n const sessionId = props?.sessionId\n const onOpen = props?.onOpen\n const [q, setQ] = React.useState('')\n const [results, setResults] = React.useState(null)\n const [open, setOpen] = React.useState(false)\n const inputRef = React.useRef(null)\n const seq = React.useRef(0)\n const timer = React.useRef(null)\n\n const search = (query) => {\n const s = ++seq.current\n const clean = String(query || '').trim()\n if (clean.length < 2) { setResults(null); return }\n rpc('edrv.searchFiles', { sessionId, query: clean }).then((res) => {\n if (s !== seq.current) return\n setResults((res && res.ok && Array.isArray(res.files)) ? res.files : [])\n }).catch(() => { if (s === seq.current) setResults([]) })\n }\n\n const onChange = (v) => {\n setQ(v); setOpen(true)\n if (timer.current) clearTimeout(timer.current)\n timer.current = setTimeout(() => search(v), 180)\n }\n\n const pick = (p) => {\n onOpen(p)\n setQ(''); setResults(null); setOpen(false)\n inputRef.current?.blur?.()\n }\n\n React.useEffect(() => {\n const onKey = (e) => {\n if ((e.ctrlKey || e.metaKey) && String(e.key).toLowerCase() === 'p') {\n e.preventDefault(); e.stopPropagation()\n inputRef.current?.focus?.()\n setOpen(true)\n } else if (e.key === 'Escape') {\n setOpen(false); inputRef.current?.blur?.()\n }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n const dirText = (p) => {\n const base = String(p).split(/[\\\\/]/).pop() || String(p)\n return String(p).slice(0, Math.max(0, String(p).length - base.length)).replace(/[\\\\/]+$/, '') || String(p)\n }\n\n let pop = null\n if (open && Array.isArray(results) && q.trim().length >= 2) {\n if (results.length) {\n const items = results.map((p) => React.createElement('div', { key: p, className: 'edrv-search-item', onClick: () => pick(p) },\n React.createElement('span', { className: 'n' }, String(p).split(/[\\\\/]/).pop() || p),\n React.createElement('span', { className: 'd' }, dirText(p))))\n pop = React.createElement('div', { className: 'edrv-search-pop' }, ...items)\n } else {\n pop = React.createElement('div', { className: 'edrv-search-pop' }, React.createElement('div', { className: 'edrv-search-empty' }, '无匹配文件'))\n }\n }\n\n return React.createElement('div', { className: 'edrv-search-wrap' },\n React.createElement('input', {\n ref: inputRef, className: 'edrv-search', placeholder: '搜索文件 (Ctrl+P)',\n value: q,\n onChange: (e) => onChange(e.target.value),\n onFocus: () => { if (q.trim().length >= 2 && !results) setOpen(true) },\n onKeyDown: (e) => {\n if (e.key === 'Enter' && Array.isArray(results) && results.length) pick(results[0])\n if (e.key === 'Escape') setOpen(false)\n },\n }),\n pop)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — UI 共用小工具(按钮样式/状态文案/等宽字体)。\n * 迁移自原 src/client/index.ts 的 btn/badgeOf/MONO,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport { ST } from '../state/records.js'\n\n/** 次级按钮内联样式(accept=true 绿色 / false 红色)。 */\nexport function btn(accept) {\n return {\n fontSize: 11,\n padding: '1px 8px',\n border: '1px solid var(--dsw-alias-border-l2,#555)',\n borderRadius: 4,\n cursor: 'pointer',\n background: 'var(--dsw-alias-bg-layer-1,transparent)',\n color: accept ? 'var(--dsw-alias-state-success-primary,#2e9e44)' : 'var(--dsw-alias-state-error-primary,#d9534f)',\n }\n}\n\n/** 状态中文文案。 */\nexport function badgeOf(status) {\n return status === ST.ACCEPTED ? '已采纳' : status === ST.REJECTED ? '已拒绝' : '待处理'\n}\n\n/** 等宽字体常量(差异行渲染用)。 */\nexport const MONO = { fontFamily: 'var(--ds-font-family-code, ui-monospace, monospace)', fontSize: 12, lineHeight: 1.55 }\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffBox:每个文件底部紧凑差异条(per-file hunk + ⋮ 二级菜单)。\n * 迁移自原 src/client/index.ts 的 DiffBox,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { callIdAttr } from '../state/records.js'\nimport { badgeOf } from './shared.js'\n\n/**\n * 差异条:当前文件内 diff 导航(↑↓←→)、Keep/Undo、展开 hunk 列表、⋮ 二级菜单\n * (Keep All / Undo All / 差异总览 / 归档 / 回滚 / 刷新)+ 其他差异文件小节。\n */\nexport function DiffBox(props) {\n const {\n pendingRegions, staleRegions, onAct, onAcceptFile, onUndoFile, onAcceptAllFiles, onUndoAllFiles,\n allPendingCount, onRollback, onJump, otherFiles, onOpenOther, onOpenLauncher, onRefresh, activePath,\n diffIdx, diffTotal, fileIdx, fileTotal, onPrevDiff, onNextDiff, onPrevFile, onNextFile,\n } = props\n const [expanded, setExpanded] = React.useState(false)\n const [menuOpen, setMenuOpen] = React.useState(false)\n const canAct = pendingRegions.length > 0\n\n const base = String(activePath || '').split(/[\\\\/]/).pop() || ''\n\n let bodyEl = null\n if (expanded) {\n const rows = pendingRegions.map((r) => {\n const key = callIdAttr(r.callId, r.idx)\n return React.createElement('div', { key, className: 'edrv-diffrow', 'data-edrv-hunk': key, title: '跳转到 L' + (r.start ?? '?'), onClick: () => onJump(r) },\n React.createElement('span', { className: 'edrv-diffrow-l' }, 'L' + (r.start ?? '?') + '-' + (r.end ?? '?')),\n (r.oldLines.length ? React.createElement('span', { className: 'edrv-diffrow-o' }, '-' + r.oldLines.length) : null),\n (r.newLines.length ? React.createElement('span', { className: 'edrv-diffrow-n' }, '+' + r.newLines.length) : null),\n (r.create ? React.createElement('span', { className: 'edrv-diffrow-tag' }, '新建') : null),\n React.createElement('span', { style: { flex: 1 } }))\n })\n const stale = staleRegions.map((r) => React.createElement('div', { key: 'stale' + callIdAttr(r.callId, r.idx), className: 'edrv-diffrow edrv-diffrow-stale', title: '差异无法定位(文件可能已被手动修改)' },\n React.createElement('span', { className: 'edrv-diffrow-l' }, 'L' + (r.start ?? '?') + ' 无法定位'),\n React.createElement('span', { className: 'edrv-diffrow-tag' }, badgeOf(r.status))))\n let othersEl = null\n if (otherFiles.length) {\n othersEl = React.createElement('div', { className: 'edrv-diffbox-others' },\n React.createElement('span', { className: 'edrv-diffrow-tag' }, '其他差异文件 (' + otherFiles.length + '):'),\n otherFiles.map((f) => React.createElement('button', { key: f.path, className: 'edrv-diffrow-file', title: f.path, onClick: () => onOpenOther(f.path) },\n String(f.path).split(/[\\\\/]/).pop() + ' (' + f.pending + ')')))\n }\n bodyEl = React.createElement('div', { className: 'edrv-diffbar-body' }, ...rows, ...stale, othersEl)\n }\n\n const menu = menuOpen\n ? React.createElement(React.Fragment, null,\n React.createElement('div', { style: { position: 'fixed', inset: 0, zIndex: 44 }, onClick: () => setMenuOpen(false) }),\n React.createElement('div', { className: 'edrv-diffbar-menu' },\n React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !allPendingCount, onClick: () => { onAcceptAllFiles(); setMenuOpen(false) } }, '✓ Keep All(全部文件采纳)'),\n React.createElement('button', { className: 'edrv-diffmenu-item danger', disabled: !allPendingCount, onClick: () => { onUndoAllFiles(); setMenuOpen(false) } }, '↩ Undo All(全部文件不采纳)'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onOpenLauncher('pending'); setMenuOpen(false) } }, '🗂 差异总览'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onOpenLauncher('archive'); setMenuOpen(false) } }, '📁 归档'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !canAct, onClick: () => { onRollback(); setMenuOpen(false) } }, '⟲ 回滚文件'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onRefresh(); setMenuOpen(false) } }, '⟳ 刷新')))\n : null\n\n return React.createElement('div', { className: 'edrv-diffbar', 'data-edrv-diffbox': '1' },\n React.createElement('div', { className: 'edrv-diffbar-row' },\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异', disabled: !canAct, onClick: onPrevDiff }, '↑'),\n React.createElement('span', { className: 'edrv-diffbar-count', title: '当前文件内差异位置(点击展开/收起差异列表)', onClick: () => setExpanded((v) => !v) }, diffTotal ? (diffIdx + 1) + '/' + diffTotal : '0/0'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '下一个差异', disabled: !canAct, onClick: onNextDiff }, '↓'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异文件', disabled: !fileTotal, onClick: onPrevFile }, '←'),\n React.createElement('span', { className: 'edrv-diffbar-count edrv-count-file', title: '差异文件位置' }, fileTotal ? (fileIdx + 1) + '/' + fileTotal + ' 文件' : '0/0 文件'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '下一个差异文件', disabled: !fileTotal, onClick: onNextFile }, '→'),\n React.createElement('span', { className: 'edrv-diffbar-file', title: activePath || '' }, base),\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', title: '采纳当前文件的全部差异', disabled: !canAct, onClick: onAcceptFile }, '✓ Keep'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-undo', title: '不采纳当前文件的全部差异(回滚)', disabled: !canAct, onClick: onUndoFile }, '↩ Undo'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '更多操作', onClick: () => setMenuOpen((v) => !v) }, '⋮')),\n bodyEl,\n menu)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffBarEmpty:无文件打开 / 当前文件无差异但有差异文件时的空态浮窗。\n * 迁移自原 src/client/index.ts 的 DiffBarEmpty,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\n\n/**\n * 空态差异条:提示当前状态 + 查看下一个差异文件 + ⋮(总览/归档/刷新)。\n */\nexport function DiffBarEmpty(props) {\n const { sum, active, staleCount, onNextFile, onOpenLauncher, onRefresh } = props\n const [menuOpen, setMenuOpen] = React.useState(false)\n const n = sum?.totalFiles ?? 0\n const tip = active\n ? (staleCount > 0 ? '当前文件有 ' + staleCount + ' 处差异无法定位(可能已被后续修改影响)' : '当前文件无待处理差异')\n : '未打开文件'\n\n const menu = menuOpen\n ? React.createElement(React.Fragment, null,\n React.createElement('div', { style: { position: 'fixed', inset: 0, zIndex: 44 }, onClick: () => setMenuOpen(false) }),\n React.createElement('div', { className: 'edrv-diffbar-menu' },\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onOpenLauncher('pending'); setMenuOpen(false) } }, '🗂 差异总览'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onOpenLauncher('archive'); setMenuOpen(false) } }, '📁 归档'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onRefresh(); setMenuOpen(false) } }, '⟳ 刷新')))\n : null\n\n return React.createElement('div', { className: 'edrv-diffbar', 'data-edrv-diffbox': '1' },\n React.createElement('div', { className: 'edrv-diffbar-row' },\n React.createElement('span', { className: 'edrv-diffbar-count' }, '⚠ 差异 ' + n + ' 文件'),\n React.createElement('span', { className: 'edrv-diffbar-file' }, tip),\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', title: '打开并跳转到下一个差异文件', onClick: onNextFile }, '查看下一个差异文件'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '更多操作', onClick: () => setMenuOpen((v) => !v) }, '⋮')),\n menu)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffLauncher:全局差异总览 + 归档 圆角下拉。\n * 迁移自原 src/client/index.ts 的 DiffLauncher,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { MONO, btn } from './shared.js'\n\n/**\n * 全局差异面板:待处理文件列表(点击打开并跳转)+ 归档浏览/批次回滚。\n * 由状态栏差异 chip / header 角标触发。\n */\nexport function DiffLauncher(props) {\n const sessionId = props?.sessionId\n const sum = props?.sum\n const onClose = props?.onClose\n const onOpenFile = props?.onOpenFile\n const [tab, setTab] = React.useState(props?.tab === 'archive' ? 'archive' : 'pending') // 'pending' | 'archive'\n const [archives, setArchives] = React.useState(null)\n const [archiveDetail, setArchiveDetail] = React.useState(null)\n const [archivePath, setArchivePath] = React.useState(null)\n const [archiveErr, setArchiveErr] = React.useState(null)\n const [error, setError] = React.useState(null)\n\n const loadArchives = () => {\n if (!sessionId) { setArchiveErr('会话不存在'); return }\n rpc('edrv.archiveList', { sessionId }).then((res) => {\n if (res && res.ok && Array.isArray(res.entries)) { setArchives(res.entries); setArchiveErr(null) }\n else setArchiveErr(res?.error ? String(res.error) : '归档列表读取失败')\n }).catch((e) => setArchiveErr('归档异常:' + String(e)))\n }\n const loadArchiveDetail = (path) => {\n if (!sessionId) return\n setArchiveDetail(null)\n rpc('edrv.archiveRead', { sessionId, path }).then((res) => {\n if (res && res.ok && Array.isArray(res.batches)) setArchiveDetail(res.batches)\n else setArchiveErr(res?.error ? String(res.error) : '归档详情读取失败')\n }).catch((e) => setArchiveErr('归档异常:' + String(e)))\n }\n React.useEffect(() => {\n if (tab !== 'archive') return\n setArchives(null); setArchiveDetail(null); setArchivePath(null); setArchiveErr(null)\n loadArchives()\n }, [tab, sessionId])\n\n let body\n if (tab === 'pending') {\n body = (sum.pendingFiles.length === 0\n ? React.createElement('div', { className: 'edrv-search-empty' }, '暂无待处理差异(已全部处理)')\n : sum.pendingFiles.map((f) => React.createElement('div', { key: f.path, className: 'edrv-launch-row', title: '打开并跳转到差异 ' + f.path, onClick: () => onOpenFile(f.path) },\n React.createElement('span', { className: 'edrv-launch-path' }, f.path),\n React.createElement('span', { className: 'edrv-launch-cnt' }, '待处理 ' + f.pending + ' 处'),\n React.createElement('button', { className: 'edrv-btn-mini edrv-btn-keep', onClick: (e) => { e.stopPropagation(); onOpenFile(f.path) } }, '打开'))))\n } else {\n if (archiveErr) body = React.createElement('div', { className: 'edrv-search-empty', style: { color: 'var(--dsw-alias-state-error-primary,#d9534f)' } }, '错误:' + String(archiveErr))\n else if (archives === null) body = React.createElement('div', { className: 'edrv-search-empty' }, '加载中…')\n else if (archives.length === 0) body = React.createElement('div', { className: 'edrv-search-empty' }, '暂无归档记录')\n else {\n const inner = archives.map((e) => {\n const open = archivePath === e.path\n let detailEl = null\n if (open) {\n if (archiveDetail === null) detailEl = React.createElement('div', { style: { padding: 8, fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, '加载中…')\n else {\n const batches = archiveDetail.filter((b) => b.path === e.path)\n detailEl = batches.map((b) => (Array.isArray(b.records) ? b.records : []).map((rec) => {\n const lines = []\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (const h of hunks) {\n const oldLs = (h.oldText ?? '').split('\\n')\n const newLs = (h.newText ?? '').split('\\n')\n for (const t of oldLs) lines.push({ k: 'old', t })\n if (oldLs.length && newLs.length) lines.push({ k: 'sep', t: '' })\n for (const t of newLs) lines.push({ k: 'new', t })\n }\n const sm = rec.summary || { accepted: 0, rejected: 0, pending: 0, superseded: false }\n return React.createElement('div', { key: rec.callId, style: { padding: '5px 8px', borderTop: '1px solid var(--dsw-alias-border-l1,#333)' } },\n React.createElement('div', { style: { display: 'flex', gap: 8, alignItems: 'center', flexWrap: 'wrap', fontSize: 11, marginBottom: 2 } },\n React.createElement('span', { style: { color: 'var(--dsw-alias-label-primary,#ddd)', fontWeight: 600 } }, rec.toolName === 'write' ? (rec.create ? '新建' : '写入') : '编辑'),\n React.createElement('span', { style: { color: 'var(--dsw-alias-state-success-primary,#2e9e44)' } }, '采纳 ' + sm.accepted),\n React.createElement('span', { style: { color: 'var(--dsw-alias-state-error-primary,#d9534f)' } }, '拒绝 ' + sm.rejected),\n (rec.superseded ? React.createElement('span', { style: { color: 'var(--dsw-alias-state-warn-primary,#b7791f)' } }, '被覆盖') : null),\n React.createElement('span', { style: { color: 'var(--dsw-alias-label-tertiary,#888)' } }, new Date(rec.at).toLocaleTimeString())),\n React.createElement('pre', { style: { margin: 0, whiteSpace: 'pre', fontFamily: MONO.fontFamily, fontSize: 11, lineHeight: 1.5, overflowX: 'auto' } }, lines.map((ln, i) => React.createElement('div', { key: i, style: { background: ln.k === 'old' ? 'rgba(239,68,68,.10)' : ln.k === 'new' ? 'rgba(34,197,94,.10)' : 'transparent', color: ln.k === 'old' ? 'var(--dsw-alias-state-error-primary,#d9534f)' : ln.k === 'new' ? 'var(--dsw-alias-state-success-primary,#2e9e44)' : 'var(--dsw-alias-label-tertiary,#888)' } }, (ln.k === 'old' ? '- ' : ln.k === 'new' ? '+ ' : '') + ln.t)))\n )\n }))\n }\n }\n return React.createElement('div', { key: e.at + e.path, style: { border: '1px solid var(--dsw-alias-border-l1,#333)', borderRadius: 8, overflow: 'hidden' } },\n React.createElement('div', { style: { display: 'flex', gap: 8, alignItems: 'center', padding: '6px 8px', background: 'var(--dsw-alias-bg-layer-1,transparent)', cursor: 'pointer', flexWrap: 'wrap' }, onClick: () => { if (open) { setArchivePath(null); setArchiveDetail(null) } else { setArchivePath(e.path); loadArchiveDetail(e.path) } } },\n React.createElement('span', { style: { flex: 1, fontSize: 12, color: 'var(--dsw-alias-label-primary,#ddd)', wordBreak: 'break-all' } }, e.path),\n (e.batch != null ? React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, '批次 ' + e.batch) : null),\n (e.reason ? React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-state-warn-primary,#b7791f)' } }, e.reason) : null),\n React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, new Date(e.at).toLocaleString()),\n React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, '采纳 ' + e.summary.accepted + ' · 拒绝 ' + e.summary.rejected + (e.summary.superseded ? ' · 覆盖 ' + e.summary.superseded : '')),\n React.createElement('button', { onClick: (ev) => {\n ev.stopPropagation()\n if (e.batch == null) return\n if (!window.confirm('将文件恢复到批次 ' + e.batch + ' 之前的状态?(当前活跃差异将一并归档)')) return\n rpc('edrv.rollback', { sessionId, path: e.path, batch: e.batch }).then((res) => {\n if (res && res.ok) {\n setError(null); window.dispatchEvent(new CustomEvent('edrv:refresh'))\n setArchivePath(null); setArchiveDetail(null); loadArchives()\n } else setError(res?.error ? String(res.error) : '回滚失败')\n }).catch((err) => setError('回滚异常:' + String(err)))\n }, style: btn(false) }, '回滚')),\n detailEl)\n })\n body = React.createElement('div', { className: 'edrv-launch-arch' }, inner)\n }\n }\n\n return React.createElement('div', { className: 'edrv-launch', 'data-edrv-launch': '1' },\n React.createElement('div', { className: 'edrv-launch-head' },\n React.createElement('span', { style: { fontSize: 12, fontWeight: 600, color: 'var(--dsw-alias-label-primary,#eee)', marginRight: 4 } }, '差异'),\n React.createElement('button', { className: 'edrv-launch-tab' + (tab === 'pending' ? ' on' : ''), onClick: () => setTab('pending') }, '待处理' + (sum.totalFiles ? ' (' + sum.totalFiles + ')' : '')),\n React.createElement('button', { className: 'edrv-launch-tab' + (tab === 'archive' ? ' on' : ''), onClick: () => setTab('archive') }, '归档'),\n React.createElement('span', { style: { flex: 1 } }),\n (error ? React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-state-error-primary,#d9534f)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: '40%' } }, '错误:' + String(error)) : null),\n React.createElement('button', { onClick: onClose, style: btn(false) }, '✕ 关闭')),\n React.createElement('div', { className: 'edrv-launch-body' }, body))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — EditorView:中央 VSCode 式文件编辑器(编排层)。\n * 迁移自原 src/client/index.ts 的 EditorView,语义不改;差异自绘已抽到 monaco/diffRender。\n * 职责:页签/QuickOpen/Monaco 编辑器/差异审查(DiffBox/Launcher/Badge 事件装配)/状态栏/自动保存。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { dbg, rpc } from '../rpc.js'\nimport { emitRefresh } from '../events.js'\nimport { langOf, loadMonaco } from '../monaco/loader.js'\nimport { createDiffRenderer } from '../monaco/diffRender.js'\nimport { ST, callIdAttr, noopHunk, summarize } from '../state/records.js'\nimport { diffRegions } from '../state/regions.js'\nimport { QuickOpen } from './QuickOpen.js'\nimport { DiffBox } from './DiffBox.js'\nimport { DiffBarEmpty } from './DiffBarEmpty.js'\nimport { DiffLauncher } from './DiffLauncher.js'\n\n/**\n * 中央编辑区:文件页签(脏点/关闭/打开路径)+ Ctrl+P 搜索 + Monaco 编辑器 +\n * 底部差异条(DiffBox/空态)+ 全局差异下拉(DiffLauncher)+ 状态栏。\n * @param props.sessionId 会话 id\n * @param props.schedule 延时调度(ctx.timeout)\n */\nexport function EditorView(props) {\n const sessionId = props?.sessionId\n const schedule = props.schedule\n const [monaco, setMonaco] = React.useState(null)\n const [monacoErr, setMonacoErr] = React.useState(null)\n const [records, setRecords] = React.useState({})\n const [tabs, setTabs] = React.useState([])\n const [active, setActive] = React.useState(null)\n const [dirtyMap, setDirtyMap] = React.useState({})\n const [content, setContent] = React.useState(null)\n const [status, setStatus] = React.useState('')\n const [error, setError] = React.useState(null)\n const [openInput, setOpenInput] = React.useState(false)\n const [pathDraft, setPathDraft] = React.useState('')\n const [cursor, setCursor] = React.useState('')\n const [launcherOpen, setLauncherOpen] = React.useState(false)\n const [launcherTab, setLauncherTab] = React.useState('pending')\n const [hoverAct, setHoverAct] = React.useState(null) // { region, top } 编辑区 hover 差异块的 Keep/Undo 浮层\n const [diffIdx, setDiffIdx] = React.useState(0) // 当前文件内差异位置(x/x 显示)\n const [fileIdx, setFileIdx] = React.useState(0) // 全局差异文件位置(x/x 文件 显示)\n const editorRef = React.useRef(null)\n const monacoRef = React.useRef(null)\n const modelsRef = React.useRef(new Map())\n const saveTimerRef = React.useRef(null)\n const loadSeqRef = React.useRef(0)\n const programmaticRef = React.useRef(false)\n const bootRef = React.useRef(false)\n const pendingFocusRef = React.useRef(null) // { path, region } 内容加载后跳转\n const hoverRegionsRef = React.useRef([]) // 当前 pending 区域镜像(稳定回调读取)\n const lineRegionMapRef = React.useRef(new Map()) // 行 → 区域 映射(hover 命中)\n const hoverKeyRef = React.useRef(null) // 当前 hover 区域 key(区域不变不重渲染)\n const hoverTopRef = React.useRef(null) // 当前 hover 浮窗 top(滚动后位置变化才重定位)\n const hideTimerRef = React.useRef(null) // 延迟隐藏计时器(防闪烁)\n const batchBusyRef = React.useRef(false) // 批量 Keep All/Undo All 防重入\n const diffRendererRef = React.useRef(null)\n if (!diffRendererRef.current) diffRendererRef.current = createDiffRenderer((sid, t) => dbg(sid, t))\n\n const currentRecords = React.useMemo(() => {\n const list = []\n for (const rec of Object.values(records)) if (rec.path === active) list.push(rec)\n return list\n }, [records, active])\n\n const regions = React.useMemo(() => diffRegions(currentRecords, content).filter((r) => !r.superseded), [currentRecords, content])\n // useMemo 稳定引用:否则 hover 等重渲染会让 view zone effect 反复重建(- 号闪烁)\n const pendingRegions = React.useMemo(() => regions.filter((r) => r.status === ST.PENDING && !r.stale), [regions])\n const staleRegions = React.useMemo(() => regions.filter((r) => r.status === ST.PENDING && r.stale), [regions])\n hoverRegionsRef.current = pendingRegions\n // 行 → 差异区域 映射(hover O(1) 命中;每行归属其区域)\n const lineRegionMap = React.useMemo(() => {\n const map = new Map()\n for (const r of pendingRegions) {\n if (r.start === undefined || r.end === undefined) continue\n const last = Math.max(r.start, r.end - 1)\n for (let ln = r.start; ln <= last; ln++) if (!map.has(ln)) map.set(ln, r)\n }\n return map\n }, [pendingRegions])\n lineRegionMapRef.current = lineRegionMap\n const sum = React.useMemo(() => summarize(Object.values(records)), [records])\n\n const addTab = (path, select) => {\n setTabs((prev) => {\n if (prev.some((t) => t.path === path)) return prev\n return prev.concat([{ path }])\n })\n if (select) setActive(path)\n }\n\n const closeTab = (path) => {\n flushSave()\n setTabs((prev) => {\n const idx = prev.findIndex((t) => t.path === path)\n if (idx < 0) return prev\n const next = prev.filter((t) => t.path !== path)\n if (active === path) setActive(next[idx] ? next[idx].path : (next[idx - 1] ? next[idx - 1].path : null))\n return next\n })\n }\n\n const refreshRecords = () => {\n if (!sessionId) return\n rpc('edrv.list', { sessionId }).then((res) => {\n if (!res || !res.ok || !Array.isArray(res.records)) return\n const map = {}\n for (const r of res.records) map[r.callId] = r\n setRecords(map)\n }).catch((e) => setError('list异常:' + String(e)))\n }\n\n const loadContent = (path, sid) => {\n const seq = ++loadSeqRef.current\n rpc('edrv.read', { sessionId: sid, path }).then((res) => {\n if (seq !== loadSeqRef.current || path !== active) return\n if (res && res.ok) { setContent(res.content); setStatus('已加载') }\n else { setError(res?.error ? String(res.error) : '读取失败'); setStatus('读取失败') }\n }).catch((e) => { if (seq === loadSeqRef.current) { setError('read异常:' + String(e)); setStatus('读取失败') } })\n }\n\n // 挂载轮询 + 事件订阅\n React.useEffect(() => {\n if (!sessionId) return\n refreshRecords()\n const t = setInterval(refreshRecords, 5000)\n const onRefresh = () => refreshRecords()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => { clearInterval(t); window.removeEventListener('edrv:refresh', onRefresh) }\n }, [sessionId])\n\n React.useEffect(() => {\n const onOpen = (e) => {\n const p = e?.detail?.path\n if (p) addTab(p, true)\n }\n const onShowLauncher = () => setLauncherOpen(true)\n window.addEventListener('edrv:open-editor', onOpen)\n window.addEventListener('edrv:show-launcher', onShowLauncher)\n return () => {\n window.removeEventListener('edrv:open-editor', onOpen)\n window.removeEventListener('edrv:show-launcher', onShowLauncher)\n }\n }, [sessionId])\n\n // localStorage v2 恢复页签\n React.useEffect(() => {\n if (bootRef.current || !sessionId) return\n bootRef.current = true\n try {\n const raw = localStorage.getItem('edrv.editor.v2.' + String(sessionId))\n if (raw) {\n const saved = JSON.parse(raw)\n if (Array.isArray(saved.tabs) && saved.tabs.length) {\n setTabs(saved.tabs.map((p) => ({ path: p })))\n if (typeof saved.active === 'string') setActive(saved.active)\n }\n }\n } catch (e) { /* 损坏忽略 */ }\n }, [sessionId])\n\n React.useEffect(() => {\n if (!sessionId) return\n try { localStorage.setItem('edrv.editor.v2.' + String(sessionId), JSON.stringify({ tabs: tabs.map((t) => t.path), active })) }\n catch (e) { /* 忽略 */ }\n }, [tabs, active, sessionId])\n\n React.useEffect(() => {\n if (!active) return\n setContent(null); setStatus('加载中…')\n loadContent(active, sessionId)\n }, [active, sessionId])\n\n React.useEffect(() => {\n if (monaco || monacoErr) return\n let alive = true\n loadMonaco().then((m) => { if (alive) setMonaco(m) }).catch((e) => { if (alive) { setMonacoErr(String(e?.message ?? e)); setStatus('Monaco 不可用') } })\n return () => { alive = false }\n }, [monaco, monacoErr])\n\n monacoRef.current = monaco\n\n const getModel = (path, text) => {\n const cache = modelsRef.current\n let model = cache.get(path)\n if (!model) {\n model = window.monaco.editor.createModel(text ?? '', langOf(path), window.monaco.Uri.parse('edrv:///' + encodeURI(path)))\n cache.set(path, model)\n } else if (text !== undefined && model.getValue() !== text) {\n programmaticRef.current = true\n model.setValue(text)\n programmaticRef.current = false\n }\n return model\n }\n\n const flushSave = () => {\n if (saveTimerRef.current) { saveTimerRef.current(); saveTimerRef.current = null }\n }\n\n const doSave = (silent) => {\n const ed = editorRef.current\n if (!active || !ed) return\n const text = ed.getValue()\n if (!silent) setStatus('保存中…')\n rpc('edrv.save', { sessionId, path: active, content: text }).then((res) => {\n if (res && res.ok) {\n setStatus('已保存 ' + new Date().toTimeString().slice(0, 8))\n setContent(text)\n setDirtyMap((d) => Object.assign({}, d, { [active]: false }))\n refreshRecords()\n emitRefresh()\n } else { setStatus('保存失败'); setError(res?.error ? String(res.error) : '保存失败') }\n }).catch((e) => { setStatus('保存失败'); setError('保存异常:' + String(e)) })\n }\n\n const onEdit = () => {\n const ed = editorRef.current\n if (!ed || !active) return\n setDirtyMap((d) => Object.assign({}, d, { [active]: true }))\n setStatus('编辑中…')\n if (saveTimerRef.current) saveTimerRef.current()\n saveTimerRef.current = schedule(() => doSave(true), 700)\n }\n\n // model 同步(当前内容)\n React.useEffect(() => {\n if (!monaco || !editorRef.current || !active || content === null) return\n const ed = editorRef.current\n const model = getModel(active, content)\n if (ed.getModel() !== model) ed.setModel(model)\n }, [monaco, active, content])\n\n // 行内差异自绘(decorations / view zones / minus overlay)→ diffRenderer\n React.useEffect(() => {\n if (!monaco || !editorRef.current || !active || content === null) return\n diffRendererRef.current.render(monaco, editorRef.current, pendingRegions, sessionId)\n }, [monaco, active, content, pendingRegions])\n\n React.useEffect(() => () => {\n flushSave()\n diffRendererRef.current?.dispose?.()\n if (editorRef.current) { editorRef.current.dispose(); editorRef.current = null }\n for (const m of modelsRef.current.values()) m.dispose()\n modelsRef.current.clear()\n const root = editorRef.current && editorRef.current.getDomNode ? editorRef.current.getDomNode() : null\n if (root) {\n const ov = root.querySelector('.edrv-minus-overlay')\n if (ov) ov.remove()\n }\n }, [])\n\n // 普通 Monaco 编辑器(可编辑、单列行号)+ 自绘行内差异(decoration 绿底+ / view zone 删除块)\n const ensureEditor = React.useCallback((node) => {\n if (!node) {\n if (editorRef.current) { editorRef.current.dispose(); editorRef.current = null }\n return\n }\n if (editorRef.current || !monacoRef.current) return\n const m = monacoRef.current\n const ed = m.editor.create(node, {\n value: '',\n language: 'plaintext',\n theme: 'vs',\n fontFamily: 'var(--ds-font-family-code, ui-monospace, monospace)',\n fontSize: 13,\n lineHeight: 20,\n minimap: { enabled: true, scale: 1 },\n glyphMargin: true,\n lineDecorationsWidth: 16,\n automaticLayout: true,\n scrollBeyondLastLine: false,\n wordWrap: 'off',\n tabSize: 2,\n renderWhitespace: 'selection',\n smoothScrolling: true,\n cursorBlinking: 'smooth',\n padding: { top: 8 },\n })\n ed.addCommand(m.KeyMod.CtrlCmd | m.KeyCode.KeyS, () => { flushSave(); doSave(false) })\n ed.onDidChangeModelContent(() => {\n if (!ed.getModel() || programmaticRef.current) return\n onEdit()\n })\n ed.onDidChangeCursorPosition((e) => {\n setCursor('Ln ' + e.position.lineNumber + ', Col ' + e.position.column)\n })\n // hover 差异块 → 浮出 Keep/Undo(req:鼠标移到编辑区差异块时显示)\n // 防闪烁:① 区域不变不 setState(浮窗锚定差异块起始行,不跟随鼠标);② 延迟隐藏;\n // ③ 浮窗自身 onMouseEnter 取消隐藏计时(鼠标在浮窗与编辑器间移动不闪)。\n const hideSoon = () => {\n if (hideTimerRef.current) return\n hideTimerRef.current = setTimeout(() => {\n hideTimerRef.current = null\n hoverKeyRef.current = null\n hoverTopRef.current = null\n setHoverAct(null)\n }, 180)\n }\n ed.onMouseMove((e) => {\n const line = e?.target?.position?.lineNumber\n const map = lineRegionMapRef.current\n if (!line || !map.size) { hideSoon(); return }\n const hit = map.get(line)\n if (!hit) { hideSoon(); return }\n const key = callIdAttr(hit.callId, hit.idx)\n const top = Math.max(0, ed.getTopForLineNumber(Math.max(1, hit.start)) - ed.getScrollTop())\n if (hoverKeyRef.current === key && hoverTopRef.current === top) return // 同区域同位置不重复更新\n hoverKeyRef.current = key\n hoverTopRef.current = top\n if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }\n setHoverAct({ region: hit, top })\n })\n ed.onMouseLeave(hideSoon)\n editorRef.current = ed\n }, [])\n\n // 打开文件后的差异聚焦跳转(内容/差异就绪后执行一次)\n React.useEffect(() => {\n const pf = pendingFocusRef.current\n if (!pf || pf.path !== active || content === null) return\n const target = pf.region || pendingRegions[0]\n const ed = editorRef.current\n if (!target || !ed) return\n pendingFocusRef.current = null\n ed.revealLineInCenter(Math.max(1, target.start ?? 1))\n ed.setPosition({ lineNumber: Math.max(1, target.start ?? 1), column: 1 })\n ed.focus()\n }, [active, content, pendingRegions])\n\n const jumpTo = (region) => {\n if (editorRef.current) {\n editorRef.current.revealLineInCenter(Math.max(1, region?.start ?? 1))\n editorRef.current.setPosition({ lineNumber: Math.max(1, region?.start ?? 1), column: 1 })\n editorRef.current.focus()\n } else {\n pendingFocusRef.current = { path: active, region }\n }\n }\n\n // 索引校正:差异/文件被处理后 pending 列表变化,clamp 到有效范围\n React.useEffect(() => {\n if (diffIdx >= pendingRegions.length && pendingRegions.length > 0) setDiffIdx(pendingRegions.length - 1)\n else if (pendingRegions.length === 0) setDiffIdx(0)\n }, [pendingRegions.length])\n React.useEffect(() => {\n const i = sum.pendingFiles.findIndex((f) => f.path === active)\n if (i >= 0) { if (i !== fileIdx) setFileIdx(i) }\n }, [sum.pendingFiles, active])\n\n // 上下箭头:当前文件内差异切换(x/x)\n const gotoDiff = (delta) => {\n if (!pendingRegions.length) return\n const next = (diffIdx + delta + pendingRegions.length) % pendingRegions.length\n setDiffIdx(next)\n jumpTo(pendingRegions[next])\n }\n // 左右箭头:全局差异文件切换(x/x 文件),打开并跳转\n const gotoFile = (delta) => {\n if (!sum.pendingFiles.length) return\n const next = (fileIdx + delta + sum.pendingFiles.length) % sum.pendingFiles.length\n setFileIdx(next)\n openFile(sum.pendingFiles[next].path, true)\n }\n\n const reloadFile = () => {\n if (!active) return\n loadContent(active, sessionId)\n refreshRecords()\n }\n\n /**\n * 对单个差异区域执行采纳/不采纳。\n * @author ddj 2026年08月20号\n * @param region 差异区域(callId/idx/create)\n * @param reject true=不采纳(回滚),false=采纳\n * @param silent 批量时抑制中间 reload/报错,由批量方统一收尾\n * @returns Promise<boolean> 是否成功\n */\n const actHunk = (region, reject, silent) => {\n const method = reject ? 'edrv.reject' : 'edrv.accept'\n return rpc(method, { sessionId, callId: region.callId, scope: region.create ? 'call' : 'hunk', hunkIndex: region.idx }).then((res) => {\n if (res && res.ok) {\n setRecords((prev) => Object.assign({}, prev, { [region.callId]: res.record }))\n if (!silent) { reloadFile(); emitRefresh() }\n return true\n }\n if (!silent) setError(res?.error ? String(res.error) : '操作失败')\n return false\n }).catch((e) => {\n if (!silent) setError('操作异常:' + String(e))\n return false\n })\n }\n\n const acceptFile = () => { for (const r of pendingRegions) actHunk(r, false) }\n const undoFile = () => { for (const r of [...pendingRegions].reverse()) actHunk(r, true) }\n\n // 所有差异文件的待处理 hunk 列表(二级菜单 Keep All / Undo All 用)\n const allPending = React.useMemo(() => {\n const out = []\n for (const rec of Object.values(records)) {\n if (rec.superseded === true) continue\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (let i = 0; i < hunks.length; i++) {\n const st = perHunk.length ? perHunk[i] : rec.decisions.call\n if (st === 'pending' && !noopHunk(rec, hunks[i])) out.push({ callId: rec.callId, idx: i, create: rec.create === true, at: rec.at })\n }\n }\n return out\n }, [records])\n\n /**\n * 批量处理所有差异文件:采纳全部 / 不采纳全部。不采纳按 at 降序(新改先回滚)串行执行。\n * @author ddj 2026年08月20号\n * @param reject true=全部不采纳(回滚),false=全部采纳\n */\n const actAllPending = (reject) => {\n if (batchBusyRef.current || !allPending.length) return\n batchBusyRef.current = true\n const list = reject ? [...allPending].sort((a, b) => (a.at < b.at ? 1 : a.at > b.at ? -1 : b.idx - a.idx)) : allPending\n let ok = 0, fail = 0\n const run = async () => {\n for (const r of list) {\n if (await actHunk(r, reject, true)) ok++\n else fail++\n }\n batchBusyRef.current = false\n reloadFile()\n emitRefresh()\n setStatus((reject ? '已不采纳 ' : '已采纳 ') + ok + ' 处差异' + (fail ? ',' + fail + ' 处失败' : ''))\n if (fail) setError(fail + ' 处差异处理失败(可能已被后续修改影响),可刷新后重试')\n }\n run()\n }\n const acceptAllFiles = () => actAllPending(false)\n const undoAllFiles = () => actAllPending(true)\n const rollbackFile = () => {\n if (!active) return\n if (!window.confirm('回滚当前文件到修改前状态?(相关差异将归档)')) return\n rpc('edrv.rollback', { sessionId, path: active }).then((res) => {\n if (res && res.ok) {\n setStatus('已回滚'); reloadFile()\n emitRefresh()\n } else setError(res?.error ? String(res.error) : '回滚失败')\n }).catch((e) => setError('回滚异常:' + String(e)))\n }\n\n const openFile = (path, focusDiff) => {\n if (!path) return\n addTab(path, true)\n if (focusDiff) pendingFocusRef.current = { path, region: null }\n }\n\n const openPath = () => {\n const p = (pathDraft || '').trim()\n if (!p) return\n setStatus('打开中…')\n rpc('edrv.read', { sessionId, path: p }).then((res) => {\n if (res && res.ok) {\n openFile(p, false)\n setOpenInput(false); setPathDraft(''); setStatus('已打开'); setError(null)\n } else { setStatus('打开失败'); setError(res?.error ? String(res.error) : '打开失败') }\n }).catch((e) => { setStatus('打开失败'); setError('打开异常:' + String(e)) })\n }\n\n const tabsEl = React.createElement('div', { className: 'edrv-tabs', style: { flex: '1 1 auto', minWidth: 0 } },\n tabs.map((t) => React.createElement('div', {\n key: t.path,\n className: 'edrv-tab' + (t.path === active ? ' edrv-tab-active' : ''),\n title: t.path,\n onClick: () => { if (t.path !== active) { flushSave(); setActive(t.path) } },\n },\n React.createElement('span', { style: { overflow: 'hidden', textOverflow: 'ellipsis', maxWidth: 180 } }, t.path.split(/[\\\\/]/).pop() || t.path),\n (dirtyMap[t.path] ? React.createElement('span', { className: 'edrv-tab-dot' }) : null),\n React.createElement('span', { className: 'edrv-tab-x', onClick: (e) => { e.stopPropagation(); closeTab(t.path) } }, '×'))),\n (openInput\n ? React.createElement('input', { className: 'edrv-path-input', autoFocus: true, placeholder: '输入工作区相对/绝对路径,回车打开', value: pathDraft, onChange: (e) => setPathDraft(e.target.value), onKeyDown: (e) => { if (e.key === 'Enter') openPath(); if (e.key === 'Escape') setOpenInput(false) } })\n : React.createElement('button', { className: 'edrv-tab-add', title: '打开文件(输入路径)', onClick: () => setOpenInput(true) }, '+')))\n\n const pathBar = React.createElement('div', { className: 'edrv-pathbar', title: active || '' },\n React.createElement('span', { className: 'edrv-pb-name' }, active ? String(active).split(/[\\\\/]/).pop() : '未打开文件'),\n React.createElement('span', { className: 'edrv-pb-full' }, active || '使用右上搜索框 (Ctrl+P) 打开文件'))\n\n const tabRow = React.createElement('div', { style: { display: 'flex', alignItems: 'center', background: 'var(--dsw-alias-bg-layer-1,transparent)', flexShrink: 0 } },\n tabsEl,\n React.createElement(QuickOpen, { sessionId, onOpen: (p) => openFile(p, false) }))\n\n const statusBar = React.createElement('div', { className: 'edrv-statusbar' },\n React.createElement('span', null, '编辑'),\n React.createElement('span', null, active ? langOf(active) : ''),\n React.createElement('span', null, cursor),\n (status ? React.createElement('span', null, status) : null),\n React.createElement('span', { style: { flex: 1 } }),\n (sum.totalFiles > 0\n ? React.createElement('button', { className: 'edrv-diffchip', title: '打开差异总览/归档', onClick: () => setLauncherOpen((o) => !o) }, '⚠ 差异 ' + sum.totalFiles + ' 文件')\n : null),\n React.createElement('button', { className: 'edrv-chip-btn', title: '刷新', onClick: reloadFile }, '⟳'))\n\n const otherFiles = sum.pendingFiles.filter((f) => f.path !== active)\n\n let body\n if (!monaco && !monacoErr) {\n body = React.createElement('div', { className: 'edrv-empty' }, '正在加载 Monaco 编辑器…')\n } else if (monacoErr) {\n body = React.createElement('div', { className: 'edrv-empty' },\n React.createElement('div', null, 'Monaco 编辑器加载失败:' + String(monacoErr)),\n React.createElement('div', { style: { fontSize: 11 } }, '请确认插件包 assets/vendor/monaco 完整(/edrv/vendor 路由可达)'))\n } else if (!active) {\n body = React.createElement('div', { className: 'edrv-empty' },\n React.createElement('div', null, '暂无打开的文件'),\n React.createElement('div', { style: { fontSize: 12 } }, '使用右上搜索框 (Ctrl+P) 打开工作区文件;agent 修改文件后顶部会出现差异角标'))\n } else if (content === null) {\n body = React.createElement('div', { className: 'edrv-empty' }, '加载中…')\n } else {\n body = React.createElement('div', { className: 'edrv-monaco-host' },\n React.createElement('div', { ref: ensureEditor }))\n }\n\n const hoverEl = (hoverAct && !launcherOpen)\n ? React.createElement('div', {\n className: 'edrv-hoveract',\n style: { top: hoverAct.top, right: 12 },\n onMouseEnter: () => { if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },\n onMouseLeave: () => { const t = setTimeout(() => { hideTimerRef.current = null; hoverKeyRef.current = null; hoverTopRef.current = null; setHoverAct(null) }, 180); hideTimerRef.current = t },\n },\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', onClick: () => actHunk(hoverAct.region, false) }, '✓ Keep'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-undo', onClick: () => actHunk(hoverAct.region, true) }, '↩ Undo'))\n : null\n\n const overlay = launcherOpen\n ? React.createElement(React.Fragment, null,\n React.createElement('div', { style: { position: 'fixed', inset: 0, zIndex: 30 }, onClick: () => setLauncherOpen(false) }),\n React.createElement(DiffLauncher, { sessionId, sum, tab: launcherTab, onClose: () => setLauncherOpen(false), onOpenFile: (p) => { openFile(p, true); setLauncherOpen(false) } }))\n : (pendingRegions.length > 0\n ? React.createElement(DiffBox, {\n pendingRegions, staleRegions,\n onAct: actHunk,\n onAcceptFile: acceptFile,\n onUndoFile: undoFile,\n onAcceptAllFiles: acceptAllFiles,\n onUndoAllFiles: undoAllFiles,\n allPendingCount: allPending.length,\n onRollback: rollbackFile,\n onJump: jumpTo,\n otherFiles,\n onOpenOther: (p) => openFile(p, true),\n onOpenLauncher: (tab) => { setLauncherTab(tab || 'pending'); setLauncherOpen(true) },\n onRefresh: reloadFile,\n activePath: active,\n diffIdx, diffTotal: pendingRegions.length,\n fileIdx, fileTotal: sum.pendingFiles.length,\n onPrevDiff: () => gotoDiff(-1), onNextDiff: () => gotoDiff(1),\n onPrevFile: () => gotoFile(-1), onNextFile: () => gotoFile(1),\n })\n : (sum.pendingFiles.length > 0\n ? React.createElement(DiffBarEmpty, {\n sum, active, staleCount: staleRegions.length,\n onNextFile: () => { if (sum.pendingFiles.length) openFile(sum.pendingFiles[0].path, true) },\n onOpenLauncher: (tab) => { setLauncherTab(tab || 'pending'); setLauncherOpen(true) },\n onRefresh: reloadFile,\n })\n : null))\n\n return React.createElement('div', { 'data-edrv-view': '1', style: { height: '100%', minHeight: 0, display: 'flex', flexDirection: 'column', background: 'var(--dsw-alias-bg-base,transparent)', overflow: 'hidden' } },\n pathBar,\n tabRow,\n React.createElement('div', { style: { position: 'relative', flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' } },\n body,\n hoverEl,\n overlay),\n statusBar)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffBadge:header 差异角标(仅工作区有差异时显示)。\n * 迁移自原 src/client/index.ts 的 DiffBadge,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { openEditorView, emitShowLauncher } from '../events.js'\nimport { summarize } from '../state/records.js'\n\n/**\n * 会话 header 差异角标:5s 轮询 edrv.list,有差异时显示数字徽章,点击打开编辑区并拉起 DiffLauncher。\n */\nexport function DiffBadge(props) {\n const sessionId = props?.sessionId\n const [n, setN] = React.useState(0)\n const seq = React.useRef(0)\n\n const load = React.useCallback(() => {\n if (!sessionId) return\n const s = ++seq.current\n rpc('edrv.list', { sessionId }).then((res) => {\n if (s !== seq.current || !res || !res.ok || !Array.isArray(res.records)) return\n setN(summarize(res.records).totalFiles)\n }).catch(() => {})\n }, [sessionId])\n\n React.useEffect(() => {\n load()\n const t = setInterval(load, 5000)\n const onRefresh = () => load()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => { clearInterval(t); window.removeEventListener('edrv:refresh', onRefresh) }\n }, [load])\n\n if (!n) return null\n\n const click = () => {\n openEditorView(null)\n setTimeout(() => { emitShowLauncher() }, 120)\n }\n\n return React.createElement('button', {\n onClick: click,\n title: n + ' 个文件有差异,点击在编辑区查看',\n style: { position: 'relative', display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 30, height: 30, padding: 0, background: 'transparent', border: 'none', borderRadius: 6, cursor: 'pointer' },\n },\n React.createElement('img', { src: '/edrv/assets/compare-select.png', alt: '差异', style: { width: 22, height: 22, display: 'block' } }),\n React.createElement('span', { style: { position: 'absolute', top: 1, right: 0, minWidth: 15, height: 15, padding: '0 3px', borderRadius: 8, background: 'var(--dsw-alias-state-warn-primary,#d97706)', color: '#fff', fontSize: 10, lineHeight: '15px', textAlign: 'center', fontWeight: 700, boxSizing: 'border-box' } }, String(n)))\n}\n","/**\n * dsh-vscode-mode client — 浏览器半入口:slot 注册 + 装配。\n * 挂点:conversation.view「文件编辑」页签(中央 Monaco 编辑器)+ header 差异角标。\n * 与 Host 通信:同源 fetch('/edrv/rpc')(shared/rpc 契约)。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport './styles/editor.css'\nimport { EditorView } from './ui/EditorView.js'\nimport { DiffBadge } from './ui/DiffBadge.js'\n\nexport const inject = ['slots', 'timer']\n\n/**\n * 装配客户端:注册中央编辑区视图与 header 差异角标。\n * @author ddj 2026年08月20号\n * @param ctx 客户端根上下文(slots + timer 服务)\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function apply(ctx: any): void {\n const schedule = (fn: () => void, ms: number) => ctx.timeout(fn, ms)\n\n // 中央「文件编辑」页签:类 VSCode 编辑器(顶部=文件页签+搜索框,差异 UI=文件底部圆角悬浮框)\n ctx.slots.register({\n name: 'conversation.view',\n id: 'edrv-editor',\n order: 5,\n label: '文件编辑',\n inject: (sessionId: string) => ({ sessionId }),\n }, (props: unknown) => React.createElement(EditorView, Object.assign({}, props, { schedule })))\n\n // header 差异角标:仅当前工作区存在差异时渲染\n ctx.slots.register(\n { name: 'conversation.session.header.utilities', id: 'edrv-diff-badge', order: 90, label: '差异' },\n (props: unknown) => React.createElement(DiffBadge, Object.assign({}, props)),\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBA,MAAa,WAAW;;;;;;;;;ECPxB,SAAgB,IAAyB,QAAW,MAA+C;GACjG,OAAO,MAAM,UAAU;IACrB,QAAQ;IACR,SAAS,EAAE,gBAAgB,mBAAmB;IAC9C,MAAM,KAAK,UAAU;KAAE;KAAQ;IAAK,CAAC;GACvC,CAAC,CAAC,CAAC,MAAM,QAAQ,IAAI,KAAK,CAAC;EAC7B;;;;;;;EAQA,SAAgB,IAAI,WAA+B,MAAoB;GACrE,IAAI;IACF,IAAI,cAAc;KAAE;KAAW;IAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;GACvD,SAAS,GAAG,CAAe;EAC7B;;;;;;;;;;;;;EChBA,SAAgB,eAAe,MAA2B;GACxD,MAAM,OAAO,MAAM,KAAK,SAAS,iBAAiB,4CAAwC,CAAC;GAC3F,KAAK,MAAM,KAAK,MACd,IAAI,EAAE,eAAe,EAAE,YAAY,SAAS,MAAM,GAAG;IAAE,EAAyB,MAAM;IAAG;GAAM;GAEjG,MAAM,IAAI,QAAQ;GAClB,iBAAiB;IACf,OAAO,cAAc,IAAI,YAAY,oBAAoB,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;GACnF,GAAG,EAAE;EACP;;EAGA,SAAgB,cAAoB;GAClC,OAAO,cAAc,IAAI,YAAY,cAAc,CAAC;EACtD;;EAQA,SAAgB,mBAAyB;GACvC,OAAO,cAAc,IAAI,YAAY,oBAAoB,CAAC;EAC5D;;;;;;;;EC5BA,MAAa,cAAc;EAC3B,IAAI,gBAAgB;;EAGpB,MAAa,cAAc;GACzB,IAAI;GAAc,KAAK;GAAc,KAAK;GAAc,KAAK;GAC7D,IAAI;GAAc,KAAK;GAAc,KAAK;GAAc,KAAK;GAC7D,MAAM;GAAQ,OAAO;GAAQ,IAAI;GAAY,UAAU;GAAY,KAAK;GACxE,KAAK;GAAO,MAAM;GAAQ,MAAM;GAAQ,MAAM;GAAQ,KAAK;GAAQ,KAAK;GAAQ,KAAK;GACrF,MAAM;GAAQ,KAAK;GAAQ,MAAM;GAAO,KAAK;GAAO,KAAK;GACzD,IAAI;GAAU,IAAI;GAAS,MAAM;GAAS,KAAK;GAAS,KAAK;GAC7D,KAAK;GAAO,MAAM;GAAQ,GAAG;GAAK,GAAG;GAAK,KAAK;GAAO,IAAI;GAAO,KAAK;GAAO,KAAK;GAClF,IAAI;GAAU,IAAI;GAAM,IAAI;GAAQ,IAAI;GAAQ,KAAK;GAAO,KAAK;GACjE,OAAO;GAAS,IAAI;GAAU,KAAK;GAAU,MAAM;GAAQ,YAAY;EACzE;;;;;;;EAQA,SAAgB,OAAO,MAAM;GAC3B,MAAM,OAAO,OAAO,QAAQ,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,KAAK;GACxD,IAAI,gBAAgB,KAAK,IAAI,GAAG,OAAO;GACvC,MAAM,MAAM,KAAK,YAAY,GAAG;GAChC,IAAI,OAAO,GAAG,OAAO;GACrB,OAAO,YAAY,KAAK,MAAM,MAAM,CAAC,CAAC,CAAC,YAAY,MAAM;EAC3D;;;;;;EAOA,SAAgB,aAAa;GAC3B,IAAI,CAAC,eACH,gBAAgB,IAAI,SAAS,SAAS,WAAW;IAC/C,MAAM,aAAa;KACjB,IAAI;MACF,OAAO,QAAQ,OAAO,EAAE,OAAO,EAAE,IAAI,YAAY,EAAE,CAAC;MACpD,OAAO,QAAQ,CAAC,uBAAuB,SAAS,QAAQ,OAAO,MAAM,IAAI,QAAQ;OAC/E,gBAAgB;OAChB,uBAAO,IAAI,MAAM,mBAAmB,OAAO,GAAG,CAAC,CAAC;MAClD,CAAC;KACH,SAAS,OAAO;MACd,gBAAgB;MAChB,OAAO,KAAK;KACd;IACF;IAEA,IADiB,SAAS,cAAc,iCAC7B,GAAG,KAAK;SACd;KACH,MAAM,IAAI,SAAS,cAAc,QAAQ;KACzC,EAAE,MAAM;KACR,EAAE,QAAQ,mBAAmB;KAC7B,EAAE,SAAS;KACX,EAAE,gBAAgB;MAAE,gBAAgB;MAAM,uBAAO,IAAI,MAAM,oBAAoB,CAAC;KAAE;KAClF,SAAS,KAAK,YAAY,CAAC;IAC7B;GACF,CAAC;GAEH,OAAO;EACT;;;;;;;;;;;;EC3DA,SAAgB,mBAAmB,KAAK;GACtC,IAAI,cAAc,CAAC;GACnB,IAAI,cAAc,CAAC;;;;;;;;GASnB,MAAM,UAAU,QAAQ,QAAQ,gBAAgB,cAAc;IAC5D,MAAM,WAAW,KAAK,IAAI;IAC1B,MAAM,cAAc,QAAQ,QAAQ,OAAO,MAAM,IAAI,MAAM,OAAO,GAAG;IACrE,IAAI,WAAW,8BAA8B,eAAe,SAAS,MAAM,eAAe,KAAK,MAAM,WAAW,EAAE,QAAQ,EAAE,GAAG,IAAI,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,OAAO,OAAO,QAAQ,EAAE,WAAW,EAAE,SAAS,SAAS,KAAK,QAAQ,EAAE,WAAW,EAAE,SAAS,SAAS,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;IAE7R,MAAM,QAAQ,CAAC;IACf,KAAK,MAAM,KAAK,gBAAgB;KAC9B,IAAI,EAAE,UAAU,KAAA,KAAa,EAAE,QAAQ,KAAA,GAAW;KAClD,IAAI,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,QACxC,MAAM,KAAK;MACT,OAAO,IAAI,OAAO,MAAM,EAAE,OAAO,GAAG,KAAK,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;MACnE,SAAS;OAAE,aAAa;OAAM,WAAW;OAAoB,2BAA2B;MAAqB;KAC/G,CAAC;IAEL;IACA,cAAc,OAAO,iBAAiB,aAAa,KAAK;IAIxD,IAAI,eAAe,CAAC;IACpB,OAAO,iBAAiB,aAAa;KACnC,KAAK,MAAM,MAAM,aAAe,IAAI;MAAE,SAAS,WAAW,EAAE;KAAE,SAAS,GAAG,CAAY;KACtF,cAAc,CAAC;KACf,MAAM,QAAQ,CAAC;KACf,KAAK,MAAM,KAAK,gBAAgB;MAC9B,IAAI,EAAE,QAAQ;MACd,MAAM,WAAW,EAAE,YAAY,EAAE,SAAS,SAAS,EAAE,WAAW;MAChE,IAAI,CAAC,UAAU;MACf,MAAM,QAAQ,KAAK,IAAI,IAAI,EAAE,SAAS,KAAK,CAAC;MAC5C,MAAM,UAAU,SAAS,cAAc,KAAK;MAC5C,QAAQ,YAAY;MACpB,QAAQ,QAAQ,WAAW,WAAW,EAAE,QAAQ,EAAE,GAAG;MACrD,KAAK,MAAM,KAAK,UAAU;OACxB,MAAM,MAAM,SAAS,cAAc,KAAK;OACxC,IAAI,YAAY;OAChB,MAAM,OAAO,SAAS,cAAc,MAAM;OAC1C,KAAK,YAAY;OACjB,KAAK,cAAc;OACnB,IAAI,YAAY,IAAI;OACpB,QAAQ,YAAY,GAAG;MACzB;MACA,MAAM,KAAK,SAAS,QAAQ;OAC1B,iBAAiB;OACjB,eAAe,SAAS;OACxB;OACA,mBAAmB;MACrB,CAAC;MACD,YAAY,KAAK,EAAE;MACnB,MAAM,KAAK;OAAE;OAAS;OAAO,GAAG,SAAS;MAAO,CAAC;KACnD;KACA,eAAe;IACjB,CAAC;IAED,IAAI,aAAa,QAAQ;KACvB,MAAM,OAAO,OAAO,WAAW;KAC/B,IAAI,MAAM;MACR,IAAI,UAAU,KAAK,cAAc,qBAAqB;MACtD,IAAI,CAAC,SAAS;OACZ,UAAU,SAAS,cAAc,KAAK;OACtC,QAAQ,YAAY;OACpB,KAAK,YAAY,OAAO;MAC1B;MACA,QAAQ,YAAY;MACpB,MAAM,QAAQ,OAAO,UAAU,OAAO,OAAO,aAAa,UAAU,KAAK;MACzE,IAAI,KAAK;MACT,IAAI;OAAE,KAAK,OAAO,cAAc;MAAE,SAAS,GAAG,CAAe;MAC7D,MAAM,OAAO,KAAK,GAAG,kBAAkB;MACvC,MAAM,QAAQ,MAAM,GAAG,mBAAmB,IAAI,GAAG,mBAAmB;MACpE,MAAM,YAAY,OAAO,SAAS,CAAC,CAAC,aAAa;MACjD,IAAI,UAAU;MACd,IAAI,KAAK;MACT,KAAK,MAAM,KAAK,cAAc;OAE5B,MAAM,SAAS,KAAK,IAAI,EAAE,QAAQ,GAAG,SAAS;OAC9C,IAAI,aAAa,OAAO,oBAAoB,MAAM;OAClD,IAAI,EAAE,SAAS,WAAW,cAAc;OACxC,MAAM,UAAU,aAAa,EAAE,IAAI;OACnC,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,GAAG,KAAK;QAC5B,MAAM,OAAO,SAAS,cAAc,KAAK;QACzC,KAAK,YAAY;QACjB,KAAK,cAAc;QACnB,KAAK,MAAM,QAAQ,QAAQ;QAC3B,KAAK,MAAM,SAAS,QAAQ;QAC5B,KAAK,QAAQ,OAAO,OAAO,EAAE;QAC7B,KAAK,QAAQ,MAAM,OAAO,CAAC;QAC3B,KAAK,MAAM,MAAO,UAAU,IAAI,QAAS;QACzC,KAAK,MAAM,OAAO,OAAO;QACzB,QAAQ,YAAY,IAAI;QACxB;OACF;OACA;MACF;MACA,IAAI,WAAW,gCAAgC,aAAa,SAAS,YAAY,UAAU,WAAW,OAAO,QAAQ,QAAQ,SAAS,KAAK,IAAI,IAAI,YAAY,IAAI;MAEnK,MAAM,mBAAmB;OACvB,MAAM,KAAK,OAAO,aAAa,KAAK;OACpC,IAAI,SAAS,QAAQ,MAAM,YAAY,gBAAiB,CAAC,KAAM;MACjE;MACA,WAAW;MACX,QAAQ,aAAa;MACrB,IAAI,CAAC,QAAQ,aAAa;OACxB,QAAQ,cAAc;OACtB,OAAO,kBAAkB,UAAU;MACrC;MAEA,iBAAiB;OACf,IAAI;QACF,MAAM,SAAS,KAAK,sBAAsB;QAC1C,MAAM,KAAK,OAAO,aAAa,KAAK;QACpC,MAAM,QAAQ,QAAQ,iBAAiB,kBAAkB;QACzD,KAAK,MAAM,QAAQ,OAAO;SACxB,MAAM,SAAS,OAAO,KAAK,QAAQ,IAAI;SACvC,MAAM,SAAS,OAAO,KAAK,QAAQ,GAAG;SACtC,MAAM,IAAI,aAAa;SACvB,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,aAAa;SAClC,MAAM,QAAQ,EAAE,QAAQ,iBAAiB,eAAe,CAAC,CAAC;SAC1D,IAAI,CAAC,OAAO;SACZ,MAAM,UAAU,MAAM,sBAAsB;SAC5C,IAAI,QAAQ,SAAS,GACnB,KAAK,MAAM,MAAO,QAAQ,MAAM,OAAO,MAAM,KAAM;QAEvD;OACF,SAAS,GAAG;QAAE,IAAI,WAAW,gCAAgC,OAAO,CAAC,CAAC;OAAE;MAC1E,GAAG,EAAE;KACP;IACF,OAAO;KACL,MAAM,OAAO,OAAO,WAAW;KAC/B,MAAM,UAAU,QAAQ,KAAK,cAAc,qBAAqB;KAChE,IAAI,SAAS,QAAQ,YAAY;IACnC;GACF;;GAGA,MAAM,gBAAgB;IACpB,cAAc,CAAC;IACf,cAAc,CAAC;GACjB;GAEA,OAAO;IAAE;IAAQ;GAAQ;EAC3B;;;;ECzJA,MAAa,KAAK;GAAE,SAAS;GAAW,UAAU;GAAY,UAAU;EAAW;;EAgBnF,SAAgB,WAAW,QAAgB,KAAqB;GAC9D,OAAO,OAAO,MAAM,IAAI,MAAM,OAAO,GAAG;EAC1C;;EAGA,SAAgB,SAAS,KAA6B,KAAqB;GACzE,IAAI,CAAC,KAAK,OAAO,GAAG;GACpB,IAAI,MAAM,QAAQ,IAAI,WAAW,OAAO,KAAK,IAAI,UAAU,QAAQ,SAAS,KAAA,GAAW,OAAO,IAAI,UAAU,QAAQ;GACpH,OAAQ,IAAI,WAAW,QAAmB,GAAG;EAC/C;;EAGA,SAAgB,SAAS,KAA6B,GAAgD;GACpG,IAAI,CAAC,OAAO,IAAI,WAAW,MAAM,OAAO;GACxC,MAAM,UAAU,IAAI,aAAa,UAAU,IAAI,WAAW,IAAI,WAAW;GACzE,MAAM,UAAU,SAAS,WAAW;GACpC,MAAM,UAAU,SAAS,WAAW;GACpC,OAAO,YAAY,QAAQ,YAAY;EACzC;;EAGA,SAAgB,aAAa,KAA0B;GACrD,IAAI,CAAC,OAAO,IAAI,eAAe,MAAM,OAAO;GAC5C,MAAM,UAAU,MAAM,QAAQ,IAAI,WAAW,OAAO,IAAI,IAAI,UAAU,UAAU,CAAC;GACjF,IAAI,QAAQ,QAAQ;IAElB,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAClC,IAAI,QAAQ,OAAO,cAAc,QAAQ,OAAO,cAAc,CAAC,SAAS,MAAM,IAAI,SAAS,CAAC,EAAA,CAAG,EAAE,GAAG,OAAO;IAE7G,OAAO;GACT;GACA,OAAO,IAAI,UAAU,SAAS,aAAa,IAAI,UAAU,SAAS,KAAA;EACpE;;EAGA,SAAgB,aAAa,MAA4B;GACvD,IAAI,IAAI;GACR,KAAK,MAAM,OAAO,MAAM;IACtB,IAAI,CAAC,aAAa,GAAG,GAAG;IACxB,MAAM,UAAU,MAAM,QAAQ,IAAI,WAAW,OAAO,IAAI,IAAI,UAAU,UAAU,CAAC;IACjF,IAAI,QAAQ,QACL;UAAA,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAClC,IAAI,QAAQ,OAAO,aAAa,CAAC,SAAS,MAAM,IAAI,SAAS,CAAC,EAAA,CAAG,EAAE,GAAG;IAAA,OAEnE;KACL,MAAM,QAAQ,MAAM,QAAQ,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC;KACtD,KAAK,MAAM,KAAK,OAAO,IAAI,CAAC,SAAS,KAAK,CAAC,GAAG;KAC9C,IAAI,CAAC,MAAM,UAAU,CAAC,SAAS,KAAK,IAAI,QAAQ,GAAG,IAAI,KAAK,IAAI,GAAG,CAAC;IACtE;GACF;GACA,OAAO;EACT;;EAGA,SAAgB,UAAU,SAAgC;GACxD,MAAM,yBAAS,IAAI,IAA0B;GAC7C,KAAK,MAAM,KAAK,SAAS;IACvB,IAAI,CAAC,OAAO,IAAI,EAAE,IAAI,GAAG,OAAO,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,IAAI,EAAE,IAAI,CAAC,CAAE,KAAK,CAAC;GAC5B;GACA,MAAM,QAAuB,CAAC;GAC9B,KAAK,MAAM,CAAC,MAAM,SAAS,QAAQ,MAAM,KAAK;IAAE;IAAM;IAAM,SAAS,aAAa,IAAI;GAAE,CAAC;GACzF,MAAM,MAAM,GAAG,MAAO,EAAE,OAAO,EAAE,OAAO,KAAK,CAAE;GAC/C,MAAM,eAAe,MAAM,QAAQ,MAAM,EAAE,UAAU,CAAC;GACtD,OAAO;IAAE;IAAO;IAAc,YAAY,aAAa;GAAO;EAChE;;;;EC/DA,SAAgB,iBAAiB,MAAc,OAAuB;GACpE,IAAI,IAAI;GACR,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,IAAI,KAAK,WAAW,CAAC,MAAM,IAAI;GAC/D,OAAO;EACT;;;;;;;;EASA,SAAgB,gBAAgB,UAAoB,UAA+E;GACjI,IAAI,SAAS;GACb,MAAM,YAAY,KAAK,IAAI,SAAS,QAAQ,SAAS,MAAM;GAC3D,OAAO,SAAS,aAAa,SAAS,YAAY,SAAS,SAAS;GACpE,IAAI,SAAS;GACb,MAAM,YAAY,KAAK,IAAI,SAAS,SAAS,QAAQ,SAAS,SAAS,MAAM;GAC7E,OAAO,SAAS,aAAa,SAAS,SAAS,SAAS,IAAI,YAAY,SAAS,SAAS,SAAS,IAAI,SAAS;GAChH,OAAO;IAAE,UAAU,SAAS,MAAM,QAAQ,SAAS,SAAS,MAAM;IAAG,UAAU,SAAS,MAAM,QAAQ,SAAS,SAAS,MAAM;IAAG,OAAO;GAAO;EACjJ;;EAGA,SAAgB,YAAY,SAAuB,SAAkC;GACnF,MAAM,UAAoB,CAAC;GAC3B,IAAI,YAAY,MAAM,OAAO;GAC7B,MAAM,QAAQ,QAAQ,MAAM,IAAI;GAChC,KAAK,MAAM,OAAO,SAChB,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,QAAQ,KAAK;IACzC,MAAM,IAAU,IAAI,MAAM;IAC1B,IAAI,SAAS,KAAK,CAAC,GAAG;IACtB,MAAM,SAAS,SAAS,KAAK,CAAC;IAC9B,IAAI,IAAI,QAAQ;KACd,QAAQ,KAAK;MAAE,QAAQ,IAAI;MAAQ,KAAK;MAAG,OAAO;MAAG,KAAK,MAAM;MAAQ,UAAU,CAAC;MAAG,UAAU,MAAM,MAAM;MAAG,OAAO;MAAM;MAAQ,QAAQ;MAAM;MAAK,YAAY,IAAI,eAAe;KAAK,CAAC;KAC5L;IACF;IACA,MAAM,UAAU,IAAI,aAAa,UAAU,IAAI,WAAW,IAAI,WAAW;IACzE,MAAM,UAAU,QAAQ,WAAW;IACnC,MAAM,KAAK,QAAQ,QAAQ,OAAO;IAClC,IAAI,KAAK,GAAG;KACV,QAAQ,KAAK;MAAE,QAAQ,IAAI;MAAQ,KAAK;MAAG,OAAO;MAAM;MAAQ,QAAQ;MAAO,UAAU,CAAC;MAAG,UAAU,CAAC;MAAG;MAAK,YAAY,IAAI,eAAe;KAAK,CAAC;KACrJ;IACF;IACA,MAAM,QAAQ,iBAAiB,SAAS,EAAE,IAAI;IAG9C,MAAM,UAAU,gBAFC,QAAQ,YAAY,OAAO,CAAC,IAAI,QAAQ,QAAQ,MAAM,IAAI,GAC1D,QAAQ,MAAM,IACkB,CAAC;IAClD,MAAM,cAAc,QAAQ,QAAQ;IACpC,QAAQ,KAAK;KAAE,QAAQ,IAAI;KAAQ,KAAK;KAAG,OAAO;KAAa,KAAK,cAAc,QAAQ,SAAS;KAAQ,UAAU,QAAQ;KAAU,UAAU,QAAQ;KAAU;KAAQ,QAAQ;KAAO;KAAK,YAAY,IAAI,eAAe;IAAK,CAAC;GACtO;GAEF,QAAQ,MAAM,GAAG,OAAO,EAAE,SAAS,aAAa,EAAE,SAAS,SAAS;GACpE,OAAO;EACT;;;;;;;;;;;;;;ECjEA,SAAgB,UAAU,OAAO;GAC/B,MAAM,YAAY,OAAO;GACzB,MAAM,SAAS,OAAO;GACtB,MAAM,CAAC,GAAG,QAAQA,MAAAA,QAAM,SAAS,EAAE;GACnC,MAAM,CAAC,SAAS,cAAcA,MAAAA,QAAM,SAAS,IAAI;GACjD,MAAM,CAAC,MAAM,WAAWA,MAAAA,QAAM,SAAS,KAAK;GAC5C,MAAM,WAAWA,MAAAA,QAAM,OAAO,IAAI;GAClC,MAAM,MAAMA,MAAAA,QAAM,OAAO,CAAC;GAC1B,MAAM,QAAQA,MAAAA,QAAM,OAAO,IAAI;GAE/B,MAAM,UAAU,UAAU;IACxB,MAAM,IAAI,EAAE,IAAI;IAChB,MAAM,QAAQ,OAAO,SAAS,EAAE,CAAC,CAAC,KAAK;IACvC,IAAI,MAAM,SAAS,GAAG;KAAE,WAAW,IAAI;KAAG;IAAO;IACjD,IAAI,oBAAoB;KAAE;KAAW,OAAO;IAAM,CAAC,CAAC,CAAC,MAAM,QAAQ;KACjE,IAAI,MAAM,IAAI,SAAS;KACvB,WAAY,OAAO,IAAI,MAAM,MAAM,QAAQ,IAAI,KAAK,IAAK,IAAI,QAAQ,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC,YAAY;KAAE,IAAI,MAAM,IAAI,SAAS,WAAW,CAAC,CAAC;IAAE,CAAC;GAC1D;GAEA,MAAM,YAAY,MAAM;IACtB,KAAK,CAAC;IAAG,QAAQ,IAAI;IACrB,IAAI,MAAM,SAAS,aAAa,MAAM,OAAO;IAC7C,MAAM,UAAU,iBAAiB,OAAO,CAAC,GAAG,GAAG;GACjD;GAEA,MAAM,QAAQ,MAAM;IAClB,OAAO,CAAC;IACR,KAAK,EAAE;IAAG,WAAW,IAAI;IAAG,QAAQ,KAAK;IACzC,SAAS,SAAS,OAAO;GAC3B;GAEA,MAAA,QAAM,gBAAgB;IACpB,MAAM,SAAS,MAAM;KACnB,KAAK,EAAE,WAAW,EAAE,YAAY,OAAO,EAAE,GAAG,CAAC,CAAC,YAAY,MAAM,KAAK;MACnE,EAAE,eAAe;MAAG,EAAE,gBAAgB;MACtC,SAAS,SAAS,QAAQ;MAC1B,QAAQ,IAAI;KACd,OAAO,IAAI,EAAE,QAAQ,UAAU;MAC7B,QAAQ,KAAK;MAAG,SAAS,SAAS,OAAO;KAC3C;IACF;IACA,OAAO,iBAAiB,WAAW,OAAO,IAAI;IAC9C,aAAa,OAAO,oBAAoB,WAAW,OAAO,IAAI;GAChE,GAAG,CAAC,CAAC;GAEL,MAAM,WAAW,MAAM;IACrB,MAAM,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;IACvD,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,WAAW,EAAE,KAAK,OAAO,CAAC;GAC3G;GAEA,IAAI,MAAM;GACV,IAAI,QAAQ,MAAM,QAAQ,OAAO,KAAK,EAAE,KAAK,CAAC,CAAC,UAAU,GAAG;IAC1D,IAAI,QAAQ,QAAQ;KAClB,MAAM,QAAQ,QAAQ,KAAK,MAAMA,MAAAA,QAAM,cAAc,OAAO;MAAE,KAAK;MAAG,WAAW;MAAoB,eAAe,KAAK,CAAC;KAAE,GAC1HA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,GACnFA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;KAC9D,MAAMA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,kBAAkB,GAAG,GAAG,KAAK;IAC7E,OACE,MAAMA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,kBAAkB,GAAGA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,OAAO,CAAC;GAE9I;GAEA,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,GAChEA,MAAAA,QAAM,cAAc,SAAS;IAC3B,KAAK;IAAU,WAAW;IAAe,aAAa;IACtD,OAAO;IACP,WAAW,MAAM,SAAS,EAAE,OAAO,KAAK;IACxC,eAAe;KAAE,IAAI,EAAE,KAAK,CAAC,CAAC,UAAU,KAAK,CAAC,SAAS,QAAQ,IAAI;IAAE;IACrE,YAAY,MAAM;KAChB,IAAI,EAAE,QAAQ,WAAW,MAAM,QAAQ,OAAO,KAAK,QAAQ,QAAQ,KAAK,QAAQ,EAAE;KAClF,IAAI,EAAE,QAAQ,UAAU,QAAQ,KAAK;IACvC;GACF,CAAC,GACD,GAAG;EACP;;;;;;;;;ECjFA,SAAgB,IAAI,QAAQ;GAC1B,OAAO;IACL,UAAU;IACV,SAAS;IACT,QAAQ;IACR,cAAc;IACd,QAAQ;IACR,YAAY;IACZ,OAAO,SAAS,mDAAmD;GACrE;EACF;;EAGA,SAAgB,QAAQ,QAAQ;GAC9B,OAAO,WAAW,GAAG,WAAW,QAAQ,WAAW,GAAG,WAAW,QAAQ;EAC3E;;EAGA,MAAa,OAAO;GAAE,YAAY;GAAuD,UAAU;GAAI,YAAY;EAAK;;;;;;;;;;;;ECbxH,SAAgB,QAAQ,OAAO;GAC7B,MAAM,EACJ,gBAAgB,cAAc,OAAO,cAAc,YAAY,kBAAkB,gBACjF,iBAAiB,YAAY,QAAQ,YAAY,aAAa,gBAAgB,WAAW,YACzF,SAAS,WAAW,SAAS,WAAW,YAAY,YAAY,YAAY,eAC1E;GACJ,MAAM,CAAC,UAAU,eAAeC,MAAAA,QAAM,SAAS,KAAK;GACpD,MAAM,CAAC,UAAU,eAAeA,MAAAA,QAAM,SAAS,KAAK;GACpD,MAAM,SAAS,eAAe,SAAS;GAEvC,MAAM,OAAO,OAAO,cAAc,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,KAAK;GAE9D,IAAI,SAAS;GACb,IAAI,UAAU;IACZ,MAAM,OAAO,eAAe,KAAK,MAAM;KACrC,MAAM,MAAM,WAAW,EAAE,QAAQ,EAAE,GAAG;KACtC,OAAOA,MAAAA,QAAM,cAAc,OAAO;MAAE;MAAK,WAAW;MAAgB,kBAAkB;MAAK,OAAO,WAAW,EAAE,SAAS;MAAM,eAAe,OAAO,CAAC;KAAE,GACrJA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,iBAAiB,GAAG,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,OAAO,IAAI,GACzG,EAAE,SAAS,SAASA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,iBAAiB,GAAG,MAAM,EAAE,SAAS,MAAM,IAAI,MAC5G,EAAE,SAAS,SAASA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,iBAAiB,GAAG,MAAM,EAAE,SAAS,MAAM,IAAI,MAC5G,EAAE,SAASA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,mBAAmB,GAAG,IAAI,IAAI,MACnFA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,QAAQ,aAAa,KAAK,MAAMA,MAAAA,QAAM,cAAc,OAAO;KAAE,KAAK,UAAU,WAAW,EAAE,QAAQ,EAAE,GAAG;KAAG,WAAW;KAAmC,OAAO;IAAqB,GACvLA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,iBAAiB,GAAG,OAAO,EAAE,SAAS,OAAO,OAAO,GAC7FA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,mBAAmB,GAAG,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACpF,IAAI,WAAW;IACf,IAAI,WAAW,QACb,WAAWA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,sBAAsB,GACvEA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,mBAAmB,GAAG,aAAa,WAAW,SAAS,IAAI,GACpG,WAAW,KAAK,MAAMA,MAAAA,QAAM,cAAc,UAAU;KAAE,KAAK,EAAE;KAAM,WAAW;KAAqB,OAAO,EAAE;KAAM,eAAe,YAAY,EAAE,IAAI;IAAE,GACnJ,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,IAAI,OAAO,EAAE,UAAU,GAAG,CAAC,CAAC;IAEpE,SAASA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,GAAG,MAAM,GAAG,OAAO,QAAQ;GACrG;GAEA,MAAM,OAAO,WACTA,MAAAA,QAAM,cAAcA,MAAAA,QAAM,UAAU,MAClCA,MAAAA,QAAM,cAAc,OAAO;IAAE,OAAO;KAAE,UAAU;KAAS,OAAO;KAAG,QAAQ;IAAG;IAAG,eAAe,YAAY,KAAK;GAAE,CAAC,GACpHA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAC1DA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAsB,UAAU,CAAC;IAAiB,eAAe;KAAE,iBAAiB;KAAG,YAAY,KAAK;IAAE;GAAE,GAAG,oBAAoB,GAC9KA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA6B,UAAU,CAAC;IAAiB,eAAe;KAAE,eAAe;KAAG,YAAY,KAAK;IAAE;GAAE,GAAG,qBAAqB,GACpLA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,CAAC,GAC7DA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAsB,eAAe;KAAE,eAAe,SAAS;KAAG,YAAY,KAAK;IAAE;GAAE,GAAG,SAAS,GAC9IA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAsB,eAAe;KAAE,eAAe,SAAS;KAAG,YAAY,KAAK;IAAE;GAAE,GAAG,OAAO,GAC5IA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,CAAC,GAC7DA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAsB,UAAU,CAAC;IAAQ,eAAe;KAAE,WAAW;KAAG,YAAY,KAAK;IAAE;GAAE,GAAG,QAAQ,GACnJA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAsB,eAAe;KAAE,UAAU;KAAG,YAAY,KAAK;IAAE;GAAE,GAAG,MAAM,CAAC,CAAC,IACnI;GAEJ,OAAOA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAgB,qBAAqB;GAAI,GACtFA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,GACzDA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA6B,OAAO;IAAS,UAAU,CAAC;IAAQ,SAAS;GAAW,GAAG,GAAG,GACrIA,MAAAA,QAAM,cAAc,QAAQ;IAAE,WAAW;IAAsB,OAAO;IAA0B,eAAe,aAAa,MAAM,CAAC,CAAC;GAAE,GAAG,YAAa,UAAU,IAAK,MAAM,YAAY,KAAK,GAC5LA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA6B,OAAO;IAAS,UAAU,CAAC;IAAQ,SAAS;GAAW,GAAG,GAAG,GACrIA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA6B,OAAO;IAAW,UAAU,CAAC;IAAW,SAAS;GAAW,GAAG,GAAG,GAC1IA,MAAAA,QAAM,cAAc,QAAQ;IAAE,WAAW;IAAsC,OAAO;GAAS,GAAG,YAAa,UAAU,IAAK,MAAM,YAAY,QAAQ,QAAQ,GAChKA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA6B,OAAO;IAAW,UAAU,CAAC;IAAW,SAAS;GAAW,GAAG,GAAG,GAC1IA,MAAAA,QAAM,cAAc,QAAQ;IAAE,WAAW;IAAqB,OAAO,cAAc;GAAG,GAAG,IAAI,GAC7FA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA4B,OAAO;IAAe,UAAU,CAAC;IAAQ,SAAS;GAAa,GAAG,QAAQ,GACjJA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA4B,OAAO;IAAoB,UAAU,CAAC;IAAQ,SAAS;GAAW,GAAG,QAAQ,GACpJA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA6B,OAAO;IAAQ,eAAe,aAAa,MAAM,CAAC,CAAC;GAAE,GAAG,GAAG,CAAC,GACtI,QACA,IAAI;EACR;;;;;;;;;;;ECnEA,SAAgB,aAAa,OAAO;GAClC,MAAM,EAAE,KAAK,QAAQ,YAAY,YAAY,gBAAgB,cAAc;GAC3E,MAAM,CAAC,UAAU,eAAeC,MAAAA,QAAM,SAAS,KAAK;GACpD,MAAM,IAAI,KAAK,cAAc;GAC7B,MAAM,MAAM,SACP,aAAa,IAAI,WAAW,aAAa,yBAAyB,eACnE;GAEJ,MAAM,OAAO,WACTA,MAAAA,QAAM,cAAcA,MAAAA,QAAM,UAAU,MAClCA,MAAAA,QAAM,cAAc,OAAO;IAAE,OAAO;KAAE,UAAU;KAAS,OAAO;KAAG,QAAQ;IAAG;IAAG,eAAe,YAAY,KAAK;GAAE,CAAC,GACpHA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAC1DA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAsB,eAAe;KAAE,eAAe,SAAS;KAAG,YAAY,KAAK;IAAE;GAAE,GAAG,SAAS,GAC9IA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAsB,eAAe;KAAE,eAAe,SAAS;KAAG,YAAY,KAAK;IAAE;GAAE,GAAG,OAAO,GAC5IA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,CAAC,GAC7DA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAsB,eAAe;KAAE,UAAU;KAAG,YAAY,KAAK;IAAE;GAAE,GAAG,MAAM,CAAC,CAAC,IACnI;GAEJ,OAAOA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAgB,qBAAqB;GAAI,GACtFA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,GACzDA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,qBAAqB,GAAG,UAAU,IAAI,KAAK,GACpFA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,oBAAoB,GAAG,GAAG,GACnEA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA4B,OAAO;IAAiB,SAAS;GAAW,GAAG,WAAW,GACjIA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA6B,OAAO;IAAQ,eAAe,aAAa,MAAM,CAAC,CAAC;GAAE,GAAG,GAAG,CAAC,GACtI,IAAI;EACR;;;;;;;;;;;;ECtBA,SAAgB,aAAa,OAAO;GAClC,MAAM,YAAY,OAAO;GACzB,MAAM,MAAM,OAAO;GACnB,MAAM,UAAU,OAAO;GACvB,MAAM,aAAa,OAAO;GAC1B,MAAM,CAAC,KAAK,UAAUC,MAAAA,QAAM,SAAS,OAAO,QAAQ,YAAY,YAAY,SAAS;GACrF,MAAM,CAAC,UAAU,eAAeA,MAAAA,QAAM,SAAS,IAAI;GACnD,MAAM,CAAC,eAAe,oBAAoBA,MAAAA,QAAM,SAAS,IAAI;GAC7D,MAAM,CAAC,aAAa,kBAAkBA,MAAAA,QAAM,SAAS,IAAI;GACzD,MAAM,CAAC,YAAY,iBAAiBA,MAAAA,QAAM,SAAS,IAAI;GACvD,MAAM,CAAC,OAAO,YAAYA,MAAAA,QAAM,SAAS,IAAI;GAE7C,MAAM,qBAAqB;IACzB,IAAI,CAAC,WAAW;KAAE,cAAc,OAAO;KAAG;IAAO;IACjD,IAAI,oBAAoB,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,QAAQ;KACnD,IAAI,OAAO,IAAI,MAAM,MAAM,QAAQ,IAAI,OAAO,GAAG;MAAE,YAAY,IAAI,OAAO;MAAG,cAAc,IAAI;KAAE,OAC5F,cAAc,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI,UAAU;IAChE,CAAC,CAAC,CAAC,OAAO,MAAM,cAAc,UAAU,OAAO,CAAC,CAAC,CAAC;GACpD;GACA,MAAM,qBAAqB,SAAS;IAClC,IAAI,CAAC,WAAW;IAChB,iBAAiB,IAAI;IACrB,IAAI,oBAAoB;KAAE;KAAW;IAAK,CAAC,CAAC,CAAC,MAAM,QAAQ;KACzD,IAAI,OAAO,IAAI,MAAM,MAAM,QAAQ,IAAI,OAAO,GAAG,iBAAiB,IAAI,OAAO;UACxE,cAAc,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI,UAAU;IAChE,CAAC,CAAC,CAAC,OAAO,MAAM,cAAc,UAAU,OAAO,CAAC,CAAC,CAAC;GACpD;GACA,MAAA,QAAM,gBAAgB;IACpB,IAAI,QAAQ,WAAW;IACvB,YAAY,IAAI;IAAG,iBAAiB,IAAI;IAAG,eAAe,IAAI;IAAG,cAAc,IAAI;IACnF,aAAa;GACf,GAAG,CAAC,KAAK,SAAS,CAAC;GAEnB,IAAI;GACJ,IAAI,QAAQ,WACV,OAAQ,IAAI,aAAa,WAAW,IAChCA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,gBAAgB,IAC/E,IAAI,aAAa,KAAK,MAAMA,MAAAA,QAAM,cAAc,OAAO;IAAE,KAAK,EAAE;IAAM,WAAW;IAAmB,OAAO,cAAc,EAAE;IAAM,eAAe,WAAW,EAAE,IAAI;GAAE,GACjKA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,mBAAmB,GAAG,EAAE,IAAI,GACrEA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,kBAAkB,GAAG,SAAS,EAAE,UAAU,IAAI,GACvFA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA+B,UAAU,MAAM;KAAE,EAAE,gBAAgB;KAAG,WAAW,EAAE,IAAI;IAAE;GAAE,GAAG,IAAI,CAAC,CAAC;QAErJ,IAAI,YAAY,OAAOA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAqB,OAAO,EAAE,OAAO,+CAA+C;GAAE,GAAG,QAAQ,OAAO,UAAU,CAAC;QAC7K,IAAI,aAAa,MAAM,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,MAAM;QACnG,IAAI,SAAS,WAAW,GAAG,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,QAAQ;QACzG;IACH,MAAM,QAAQ,SAAS,KAAK,MAAM;KAChC,MAAM,OAAO,gBAAgB,EAAE;KAC/B,IAAI,WAAW;KACf,IAAI,MAAM;MACR,IAAI,kBAAkB,MAAM,WAAWA,MAAAA,QAAM,cAAc,OAAO,EAAE,OAAO;OAAE,SAAS;OAAG,UAAU;OAAI,OAAO;MAAuC,EAAE,GAAG,MAAM;WAG9J,WADgB,cAAc,QAAQ,MAAM,EAAE,SAAS,EAAE,IACxC,CAAC,CAAC,KAAK,OAAO,MAAM,QAAQ,EAAE,OAAO,IAAI,EAAE,UAAU,CAAC,EAAA,CAAG,KAAK,QAAQ;OACrF,MAAM,QAAQ,CAAC;OACf,MAAM,QAAQ,MAAM,QAAQ,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC;OACtD,KAAK,MAAM,KAAK,OAAO;QACrB,MAAM,SAAS,EAAE,WAAW,GAAA,CAAI,MAAM,IAAI;QAC1C,MAAM,SAAS,EAAE,WAAW,GAAA,CAAI,MAAM,IAAI;QAC1C,KAAK,MAAM,KAAK,OAAO,MAAM,KAAK;SAAE,GAAG;SAAO;QAAE,CAAC;QACjD,IAAI,MAAM,UAAU,MAAM,QAAQ,MAAM,KAAK;SAAE,GAAG;SAAO,GAAG;QAAG,CAAC;QAChE,KAAK,MAAM,KAAK,OAAO,MAAM,KAAK;SAAE,GAAG;SAAO;QAAE,CAAC;OACnD;OACA,MAAM,KAAK,IAAI,WAAW;QAAE,UAAU;QAAG,UAAU;QAAG,SAAS;QAAG,YAAY;OAAM;OACpF,OAAOA,MAAAA,QAAM,cAAc,OAAO;QAAE,KAAK,IAAI;QAAQ,OAAO;SAAE,SAAS;SAAW,WAAW;QAA4C;OAAE,GACzIA,MAAAA,QAAM,cAAc,OAAO,EAAE,OAAO;QAAE,SAAS;QAAQ,KAAK;QAAG,YAAY;QAAU,UAAU;QAAQ,UAAU;QAAI,cAAc;OAAE,EAAE,GACrIA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;QAAE,OAAO;QAAuC,YAAY;OAAI,EAAE,GAAG,IAAI,aAAa,UAAW,IAAI,SAAS,OAAO,OAAQ,IAAI,GACtKA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO,EAAE,OAAO,iDAAiD,EAAE,GAAG,QAAQ,GAAG,QAAQ,GACvHA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO,EAAE,OAAO,+CAA+C,EAAE,GAAG,QAAQ,GAAG,QAAQ,GACpH,IAAI,aAAaA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO,EAAE,OAAO,8CAA8C,EAAE,GAAG,KAAK,IAAI,MAC5HA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO,EAAE,OAAO,uCAAuC,EAAE,GAAG,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC,GAClIA,MAAAA,QAAM,cAAc,OAAO,EAAE,OAAO;QAAE,QAAQ;QAAG,YAAY;QAAO,YAAY,KAAK;QAAY,UAAU;QAAI,YAAY;QAAK,WAAW;OAAO,EAAE,GAAG,MAAM,KAAK,IAAI,MAAMA,MAAAA,QAAM,cAAc,OAAO;QAAE,KAAK;QAAG,OAAO;SAAE,YAAY,GAAG,MAAM,QAAQ,wBAAwB,GAAG,MAAM,QAAQ,wBAAwB;SAAe,OAAO,GAAG,MAAM,QAAQ,iDAAiD,GAAG,MAAM,QAAQ,mDAAmD;QAAuC;OAAE,IAAI,GAAG,MAAM,QAAQ,OAAO,GAAG,MAAM,QAAQ,OAAO,MAAM,GAAG,CAAC,CAAC,CAAC,CAC/jB;MACF,CAAC,CAAC;KAEN;KACA,OAAOA,MAAAA,QAAM,cAAc,OAAO;MAAE,KAAK,EAAE,KAAK,EAAE;MAAM,OAAO;OAAE,QAAQ;OAA6C,cAAc;OAAG,UAAU;MAAS;KAAE,GAC1JA,MAAAA,QAAM,cAAc,OAAO;MAAE,OAAO;OAAE,SAAS;OAAQ,KAAK;OAAG,YAAY;OAAU,SAAS;OAAW,YAAY;OAA2C,QAAQ;OAAW,UAAU;MAAO;MAAG,eAAe;OAAE,IAAI,MAAM;QAAE,eAAe,IAAI;QAAG,iBAAiB,IAAI;OAAE,OAAO;QAAE,eAAe,EAAE,IAAI;QAAG,kBAAkB,EAAE,IAAI;OAAE;MAAE;KAAE,GAC9UA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;MAAE,MAAM;MAAG,UAAU;MAAI,OAAO;MAAuC,WAAW;KAAY,EAAE,GAAG,EAAE,IAAI,GAC7I,EAAE,SAAS,OAAOA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;MAAE,UAAU;MAAI,OAAO;KAAuC,EAAE,GAAG,QAAQ,EAAE,KAAK,IAAI,MAC7I,EAAE,SAASA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;MAAE,UAAU;MAAI,OAAO;KAA8C,EAAE,GAAG,EAAE,MAAM,IAAI,MACvIA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;MAAE,UAAU;MAAI,OAAO;KAAuC,EAAE,GAAG,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GACvIA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;MAAE,UAAU;MAAI,OAAO;KAAuC,EAAE,GAAG,QAAQ,EAAE,QAAQ,WAAW,WAAW,EAAE,QAAQ,YAAY,EAAE,QAAQ,aAAa,WAAW,EAAE,QAAQ,aAAa,GAAG,GAClOA,MAAAA,QAAM,cAAc,UAAU;MAAE,UAAU,OAAO;OAC/C,GAAG,gBAAgB;OACnB,IAAI,EAAE,SAAS,MAAM;OACrB,IAAI,CAAC,OAAO,QAAQ,cAAc,EAAE,QAAQ,sBAAsB,GAAG;OACrE,IAAI,iBAAiB;QAAE;QAAW,MAAM,EAAE;QAAM,OAAO,EAAE;OAAM,CAAC,CAAC,CAAC,MAAM,QAAQ;QAC9E,IAAI,OAAO,IAAI,IAAI;SACjB,SAAS,IAAI;SAAG,OAAO,cAAc,IAAI,YAAY,cAAc,CAAC;SACpE,eAAe,IAAI;SAAG,iBAAiB,IAAI;SAAG,aAAa;QAC7D,OAAO,SAAS,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI,MAAM;OACzD,CAAC,CAAC,CAAC,OAAO,QAAQ,SAAS,UAAU,OAAO,GAAG,CAAC,CAAC;MACnD;MAAG,OAAO,IAAI,KAAK;KAAE,GAAG,IAAI,CAAC,GAC/B,QAAQ;IACZ,CAAC;IACD,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,GAAG,KAAK;GAC5E;GAGF,OAAOA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAe,oBAAoB;GAAI,GACpFA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,GACzDA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;IAAE,UAAU;IAAI,YAAY;IAAK,OAAO;IAAuC,aAAa;GAAE,EAAE,GAAG,IAAI,GAC5IA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW,qBAAqB,QAAQ,YAAY,QAAQ;IAAK,eAAe,OAAO,SAAS;GAAE,GAAG,SAAS,IAAI,aAAa,OAAO,IAAI,aAAa,MAAM,GAAG,GAChMA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW,qBAAqB,QAAQ,YAAY,QAAQ;IAAK,eAAe,OAAO,SAAS;GAAE,GAAG,IAAI,GACzIA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,GACjD,QAAQA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;IAAE,UAAU;IAAI,OAAO;IAAgD,UAAU;IAAU,cAAc;IAAY,YAAY;IAAU,UAAU;GAAM,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC,IAAI,MACvOA,MAAAA,QAAM,cAAc,UAAU;IAAE,SAAS;IAAS,OAAO,IAAI,KAAK;GAAE,GAAG,MAAM,CAAC,GAChFA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,GAAG,IAAI,CAAC;EACvE;;;;;;;;;;;;;;;EClGA,SAAgB,WAAW,OAAO;GAChC,MAAM,YAAY,OAAO;GACzB,MAAM,WAAW,MAAM;GACvB,MAAM,CAAC,QAAQ,aAAaC,MAAAA,QAAM,SAAS,IAAI;GAC/C,MAAM,CAAC,WAAW,gBAAgBA,MAAAA,QAAM,SAAS,IAAI;GACrD,MAAM,CAAC,SAAS,cAAcA,MAAAA,QAAM,SAAS,CAAC,CAAC;GAC/C,MAAM,CAAC,MAAM,WAAWA,MAAAA,QAAM,SAAS,CAAC,CAAC;GACzC,MAAM,CAAC,QAAQ,aAAaA,MAAAA,QAAM,SAAS,IAAI;GAC/C,MAAM,CAAC,UAAU,eAAeA,MAAAA,QAAM,SAAS,CAAC,CAAC;GACjD,MAAM,CAAC,SAAS,cAAcA,MAAAA,QAAM,SAAS,IAAI;GACjD,MAAM,CAAC,QAAQ,aAAaA,MAAAA,QAAM,SAAS,EAAE;GAC7C,MAAM,CAAC,OAAO,YAAYA,MAAAA,QAAM,SAAS,IAAI;GAC7C,MAAM,CAAC,WAAW,gBAAgBA,MAAAA,QAAM,SAAS,KAAK;GACtD,MAAM,CAAC,WAAW,gBAAgBA,MAAAA,QAAM,SAAS,EAAE;GACnD,MAAM,CAAC,QAAQ,aAAaA,MAAAA,QAAM,SAAS,EAAE;GAC7C,MAAM,CAAC,cAAc,mBAAmBA,MAAAA,QAAM,SAAS,KAAK;GAC5D,MAAM,CAAC,aAAa,kBAAkBA,MAAAA,QAAM,SAAS,SAAS;GAC9D,MAAM,CAAC,UAAU,eAAeA,MAAAA,QAAM,SAAS,IAAI;GACnD,MAAM,CAAC,SAAS,cAAcA,MAAAA,QAAM,SAAS,CAAC;GAC9C,MAAM,CAAC,SAAS,cAAcA,MAAAA,QAAM,SAAS,CAAC;GAC9C,MAAM,YAAYA,MAAAA,QAAM,OAAO,IAAI;GACnC,MAAM,YAAYA,MAAAA,QAAM,OAAO,IAAI;GACnC,MAAM,YAAYA,MAAAA,QAAM,uBAAO,IAAI,IAAI,CAAC;GACxC,MAAM,eAAeA,MAAAA,QAAM,OAAO,IAAI;GACtC,MAAM,aAAaA,MAAAA,QAAM,OAAO,CAAC;GACjC,MAAM,kBAAkBA,MAAAA,QAAM,OAAO,KAAK;GAC1C,MAAM,UAAUA,MAAAA,QAAM,OAAO,KAAK;GAClC,MAAM,kBAAkBA,MAAAA,QAAM,OAAO,IAAI;GACzC,MAAM,kBAAkBA,MAAAA,QAAM,OAAO,CAAC,CAAC;GACvC,MAAM,mBAAmBA,MAAAA,QAAM,uBAAO,IAAI,IAAI,CAAC;GAC/C,MAAM,cAAcA,MAAAA,QAAM,OAAO,IAAI;GACrC,MAAM,cAAcA,MAAAA,QAAM,OAAO,IAAI;GACrC,MAAM,eAAeA,MAAAA,QAAM,OAAO,IAAI;GACtC,MAAM,eAAeA,MAAAA,QAAM,OAAO,KAAK;GACvC,MAAM,kBAAkBA,MAAAA,QAAM,OAAO,IAAI;GACzC,IAAI,CAAC,gBAAgB,SAAS,gBAAgB,UAAU,oBAAoB,KAAK,MAAM,IAAI,KAAK,CAAC,CAAC;GAElG,MAAM,iBAAiBA,MAAAA,QAAM,cAAc;IACzC,MAAM,OAAO,CAAC;IACd,KAAK,MAAM,OAAO,OAAO,OAAO,OAAO,GAAG,IAAI,IAAI,SAAS,QAAQ,KAAK,KAAK,GAAG;IAChF,OAAO;GACT,GAAG,CAAC,SAAS,MAAM,CAAC;GAEpB,MAAM,UAAUA,MAAAA,QAAM,cAAc,YAAY,gBAAgB,OAAO,CAAC,CAAC,QAAQ,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC,gBAAgB,OAAO,CAAC;GAEhI,MAAM,iBAAiBA,MAAAA,QAAM,cAAc,QAAQ,QAAQ,MAAM,EAAE,WAAW,GAAG,WAAW,CAAC,EAAE,KAAK,GAAG,CAAC,OAAO,CAAC;GAChH,MAAM,eAAeA,MAAAA,QAAM,cAAc,QAAQ,QAAQ,MAAM,EAAE,WAAW,GAAG,WAAW,EAAE,KAAK,GAAG,CAAC,OAAO,CAAC;GAC7G,gBAAgB,UAAU;GAW1B,iBAAiB,UATKA,MAAAA,QAAM,cAAc;IACxC,MAAM,sBAAM,IAAI,IAAI;IACpB,KAAK,MAAM,KAAK,gBAAgB;KAC9B,IAAI,EAAE,UAAU,KAAA,KAAa,EAAE,QAAQ,KAAA,GAAW;KAClD,MAAM,OAAO,KAAK,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC;KACxC,KAAK,IAAI,KAAK,EAAE,OAAO,MAAM,MAAM,MAAM,IAAI,CAAC,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,CAAC;IAC1E;IACA,OAAO;GACT,GAAG,CAAC,cAAc,CACqB;GACvC,MAAM,MAAMA,MAAAA,QAAM,cAAc,UAAU,OAAO,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;GAE5E,MAAM,UAAU,MAAM,WAAW;IAC/B,SAAS,SAAS;KAChB,IAAI,KAAK,MAAM,MAAM,EAAE,SAAS,IAAI,GAAG,OAAO;KAC9C,OAAO,KAAK,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,QAAQ,UAAU,IAAI;GAC5B;GAEA,MAAM,YAAY,SAAS;IACzB,UAAU;IACV,SAAS,SAAS;KAChB,MAAM,MAAM,KAAK,WAAW,MAAM,EAAE,SAAS,IAAI;KACjD,IAAI,MAAM,GAAG,OAAO;KACpB,MAAM,OAAO,KAAK,QAAQ,MAAM,EAAE,SAAS,IAAI;KAC/C,IAAI,WAAW,MAAM,UAAU,KAAK,OAAO,KAAK,IAAI,CAAC,OAAQ,KAAK,MAAM,KAAK,KAAK,MAAM,EAAE,CAAC,OAAO,IAAK;KACvG,OAAO;IACT,CAAC;GACH;GAEA,MAAM,uBAAuB;IAC3B,IAAI,CAAC,WAAW;IAChB,IAAI,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,QAAQ;KAC5C,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,QAAQ,IAAI,OAAO,GAAG;KACpD,MAAM,MAAM,CAAC;KACb,KAAK,MAAM,KAAK,IAAI,SAAS,IAAI,EAAE,UAAU;KAC7C,WAAW,GAAG;IAChB,CAAC,CAAC,CAAC,OAAO,MAAM,SAAS,YAAY,OAAO,CAAC,CAAC,CAAC;GACjD;GAEA,MAAM,eAAe,MAAM,QAAQ;IACjC,MAAM,MAAM,EAAE,WAAW;IACzB,IAAI,aAAa;KAAE,WAAW;KAAK;IAAK,CAAC,CAAC,CAAC,MAAM,QAAQ;KACvD,IAAI,QAAQ,WAAW,WAAW,SAAS,QAAQ;KACnD,IAAI,OAAO,IAAI,IAAI;MAAE,WAAW,IAAI,OAAO;MAAG,UAAU,KAAK;KAAE,OAC1D;MAAE,SAAS,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI,MAAM;MAAG,UAAU,MAAM;KAAE;IAC9E,CAAC,CAAC,CAAC,OAAO,MAAM;KAAE,IAAI,QAAQ,WAAW,SAAS;MAAE,SAAS,YAAY,OAAO,CAAC,CAAC;MAAG,UAAU,MAAM;KAAE;IAAE,CAAC;GAC5G;GAGA,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,WAAW;IAChB,eAAe;IACf,MAAM,IAAI,YAAY,gBAAgB,GAAI;IAC1C,MAAM,kBAAkB,eAAe;IACvC,OAAO,iBAAiB,gBAAgB,SAAS;IACjD,aAAa;KAAE,cAAc,CAAC;KAAG,OAAO,oBAAoB,gBAAgB,SAAS;IAAE;GACzF,GAAG,CAAC,SAAS,CAAC;GAEd,MAAA,QAAM,gBAAgB;IACpB,MAAM,UAAU,MAAM;KACpB,MAAM,IAAI,GAAG,QAAQ;KACrB,IAAI,GAAG,OAAO,GAAG,IAAI;IACvB;IACA,MAAM,uBAAuB,gBAAgB,IAAI;IACjD,OAAO,iBAAiB,oBAAoB,MAAM;IAClD,OAAO,iBAAiB,sBAAsB,cAAc;IAC5D,aAAa;KACX,OAAO,oBAAoB,oBAAoB,MAAM;KACrD,OAAO,oBAAoB,sBAAsB,cAAc;IACjE;GACF,GAAG,CAAC,SAAS,CAAC;GAGd,MAAA,QAAM,gBAAgB;IACpB,IAAI,QAAQ,WAAW,CAAC,WAAW;IACnC,QAAQ,UAAU;IAClB,IAAI;KACF,MAAM,MAAM,aAAa,QAAQ,oBAAoB,OAAO,SAAS,CAAC;KACtE,IAAI,KAAK;MACP,MAAM,QAAQ,KAAK,MAAM,GAAG;MAC5B,IAAI,MAAM,QAAQ,MAAM,IAAI,KAAK,MAAM,KAAK,QAAQ;OAClD,QAAQ,MAAM,KAAK,KAAK,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;OAC5C,IAAI,OAAO,MAAM,WAAW,UAAU,UAAU,MAAM,MAAM;MAC9D;KACF;IACF,SAAS,GAAG,CAAa;GAC3B,GAAG,CAAC,SAAS,CAAC;GAEd,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,WAAW;IAChB,IAAI;KAAE,aAAa,QAAQ,oBAAoB,OAAO,SAAS,GAAG,KAAK,UAAU;MAAE,MAAM,KAAK,KAAK,MAAM,EAAE,IAAI;MAAG;KAAO,CAAC,CAAC;IAAE,SACtH,GAAG,CAAW;GACvB,GAAG;IAAC;IAAM;IAAQ;GAAS,CAAC;GAE5B,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,QAAQ;IACb,WAAW,IAAI;IAAG,UAAU,MAAM;IAClC,YAAY,QAAQ,SAAS;GAC/B,GAAG,CAAC,QAAQ,SAAS,CAAC;GAEtB,MAAA,QAAM,gBAAgB;IACpB,IAAI,UAAU,WAAW;IACzB,IAAI,QAAQ;IACZ,WAAW,CAAC,CAAC,MAAM,MAAM;KAAE,IAAI,OAAO,UAAU,CAAC;IAAE,CAAC,CAAC,CAAC,OAAO,MAAM;KAAE,IAAI,OAAO;MAAE,aAAa,OAAO,GAAG,WAAW,CAAC,CAAC;MAAG,UAAU,YAAY;KAAE;IAAE,CAAC;IACpJ,aAAa;KAAE,QAAQ;IAAM;GAC/B,GAAG,CAAC,QAAQ,SAAS,CAAC;GAEtB,UAAU,UAAU;GAEpB,MAAM,YAAY,MAAM,SAAS;IAC/B,MAAM,QAAQ,UAAU;IACxB,IAAI,QAAQ,MAAM,IAAI,IAAI;IAC1B,IAAI,CAAC,OAAO;KACV,QAAQ,OAAO,OAAO,OAAO,YAAY,QAAQ,IAAI,OAAO,IAAI,GAAG,OAAO,OAAO,IAAI,MAAM,aAAa,UAAU,IAAI,CAAC,CAAC;KACxH,MAAM,IAAI,MAAM,KAAK;IACvB,OAAO,IAAI,SAAS,KAAA,KAAa,MAAM,SAAS,MAAM,MAAM;KAC1D,gBAAgB,UAAU;KAC1B,MAAM,SAAS,IAAI;KACnB,gBAAgB,UAAU;IAC5B;IACA,OAAO;GACT;GAEA,MAAM,kBAAkB;IACtB,IAAI,aAAa,SAAS;KAAE,aAAa,QAAQ;KAAG,aAAa,UAAU;IAAK;GAClF;GAEA,MAAM,UAAU,WAAW;IACzB,MAAM,KAAK,UAAU;IACrB,IAAI,CAAC,UAAU,CAAC,IAAI;IACpB,MAAM,OAAO,GAAG,SAAS;IACzB,IAAI,CAAC,QAAQ,UAAU,MAAM;IAC7B,IAAI,aAAa;KAAE;KAAW,MAAM;KAAQ,SAAS;IAAK,CAAC,CAAC,CAAC,MAAM,QAAQ;KACzE,IAAI,OAAO,IAAI,IAAI;MACjB,UAAU,0BAAS,IAAI,KAAK,EAAA,CAAE,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;MACxD,WAAW,IAAI;MACf,aAAa,MAAM,OAAO,OAAO,CAAC,GAAG,GAAG,GAAG,SAAS,MAAM,CAAC,CAAC;MAC5D,eAAe;MACf,YAAY;KACd,OAAO;MAAE,UAAU,MAAM;MAAG,SAAS,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI,MAAM;KAAE;IAChF,CAAC,CAAC,CAAC,OAAO,MAAM;KAAE,UAAU,MAAM;KAAG,SAAS,UAAU,OAAO,CAAC,CAAC;IAAE,CAAC;GACtE;GAEA,MAAM,eAAe;IAEnB,IAAI,CADO,UAAU,WACV,CAAC,QAAQ;IACpB,aAAa,MAAM,OAAO,OAAO,CAAC,GAAG,GAAG,GAAG,SAAS,KAAK,CAAC,CAAC;IAC3D,UAAU,MAAM;IAChB,IAAI,aAAa,SAAS,aAAa,QAAQ;IAC/C,aAAa,UAAU,eAAe,OAAO,IAAI,GAAG,GAAG;GACzD;GAGA,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,UAAU,CAAC,UAAU,WAAW,CAAC,UAAU,YAAY,MAAM;IAClE,MAAM,KAAK,UAAU;IACrB,MAAM,QAAQ,SAAS,QAAQ,OAAO;IACtC,IAAI,GAAG,SAAS,MAAM,OAAO,GAAG,SAAS,KAAK;GAChD,GAAG;IAAC;IAAQ;IAAQ;GAAO,CAAC;GAG5B,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,UAAU,CAAC,UAAU,WAAW,CAAC,UAAU,YAAY,MAAM;IAClE,gBAAgB,QAAQ,OAAO,QAAQ,UAAU,SAAS,gBAAgB,SAAS;GACrF,GAAG;IAAC;IAAQ;IAAQ;IAAS;GAAc,CAAC;GAE5C,MAAA,QAAM,sBAAsB;IAC1B,UAAU;IACV,gBAAgB,SAAS,UAAU;IACnC,IAAI,UAAU,SAAS;KAAE,UAAU,QAAQ,QAAQ;KAAG,UAAU,UAAU;IAAK;IAC/E,KAAK,MAAM,KAAK,UAAU,QAAQ,OAAO,GAAG,EAAE,QAAQ;IACtD,UAAU,QAAQ,MAAM;IACxB,MAAM,OAAO,UAAU,WAAW,UAAU,QAAQ,aAAa,UAAU,QAAQ,WAAW,IAAI;IAClG,IAAI,MAAM;KACR,MAAM,KAAK,KAAK,cAAc,qBAAqB;KACnD,IAAI,IAAI,GAAG,OAAO;IACpB;GACF,GAAG,CAAC,CAAC;GAGL,MAAM,eAAeA,MAAAA,QAAM,aAAa,SAAS;IAC/C,IAAI,CAAC,MAAM;KACT,IAAI,UAAU,SAAS;MAAE,UAAU,QAAQ,QAAQ;MAAG,UAAU,UAAU;KAAK;KAC/E;IACF;IACA,IAAI,UAAU,WAAW,CAAC,UAAU,SAAS;IAC7C,MAAM,IAAI,UAAU;IACpB,MAAM,KAAK,EAAE,OAAO,OAAO,MAAM;KAC/B,OAAO;KACP,UAAU;KACV,OAAO;KACP,YAAY;KACZ,UAAU;KACV,YAAY;KACZ,SAAS;MAAE,SAAS;MAAM,OAAO;KAAE;KACnC,aAAa;KACb,sBAAsB;KACtB,iBAAiB;KACjB,sBAAsB;KACtB,UAAU;KACV,SAAS;KACT,kBAAkB;KAClB,iBAAiB;KACjB,gBAAgB;KAChB,SAAS,EAAE,KAAK,EAAE;IACpB,CAAC;IACD,GAAG,WAAW,EAAE,OAAO,UAAU,EAAE,QAAQ,YAAY;KAAE,UAAU;KAAG,OAAO,KAAK;IAAE,CAAC;IACrF,GAAG,8BAA8B;KAC/B,IAAI,CAAC,GAAG,SAAS,KAAK,gBAAgB,SAAS;KAC/C,OAAO;IACT,CAAC;IACD,GAAG,2BAA2B,MAAM;KAClC,UAAU,QAAQ,EAAE,SAAS,aAAa,WAAW,EAAE,SAAS,MAAM;IACxE,CAAC;IAID,MAAM,iBAAiB;KACrB,IAAI,aAAa,SAAS;KAC1B,aAAa,UAAU,iBAAiB;MACtC,aAAa,UAAU;MACvB,YAAY,UAAU;MACtB,YAAY,UAAU;MACtB,YAAY,IAAI;KAClB,GAAG,GAAG;IACR;IACA,GAAG,aAAa,MAAM;KACpB,MAAM,OAAO,GAAG,QAAQ,UAAU;KAClC,MAAM,MAAM,iBAAiB;KAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM;MAAE,SAAS;MAAG;KAAO;KAC7C,MAAM,MAAM,IAAI,IAAI,IAAI;KACxB,IAAI,CAAC,KAAK;MAAE,SAAS;MAAG;KAAO;KAC/B,MAAM,MAAM,WAAW,IAAI,QAAQ,IAAI,GAAG;KAC1C,MAAM,MAAM,KAAK,IAAI,GAAG,GAAG,oBAAoB,KAAK,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,GAAG,aAAa,CAAC;KAC1F,IAAI,YAAY,YAAY,OAAO,YAAY,YAAY,KAAK;KAChE,YAAY,UAAU;KACtB,YAAY,UAAU;KACtB,IAAI,aAAa,SAAS;MAAE,aAAa,aAAa,OAAO;MAAG,aAAa,UAAU;KAAK;KAC5F,YAAY;MAAE,QAAQ;MAAK;KAAI,CAAC;IAClC,CAAC;IACD,GAAG,aAAa,QAAQ;IACxB,UAAU,UAAU;GACtB,GAAG,CAAC,CAAC;GAGL,MAAA,QAAM,gBAAgB;IACpB,MAAM,KAAK,gBAAgB;IAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,UAAU,YAAY,MAAM;IACnD,MAAM,SAAS,GAAG,UAAU,eAAe;IAC3C,MAAM,KAAK,UAAU;IACrB,IAAI,CAAC,UAAU,CAAC,IAAI;IACpB,gBAAgB,UAAU;IAC1B,GAAG,mBAAmB,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC,CAAC;IACpD,GAAG,YAAY;KAAE,YAAY,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC;KAAG,QAAQ;IAAE,CAAC;IACxE,GAAG,MAAM;GACX,GAAG;IAAC;IAAQ;IAAS;GAAc,CAAC;GAEpC,MAAM,UAAU,WAAW;IACzB,IAAI,UAAU,SAAS;KACrB,UAAU,QAAQ,mBAAmB,KAAK,IAAI,GAAG,QAAQ,SAAS,CAAC,CAAC;KACpE,UAAU,QAAQ,YAAY;MAAE,YAAY,KAAK,IAAI,GAAG,QAAQ,SAAS,CAAC;MAAG,QAAQ;KAAE,CAAC;KACxF,UAAU,QAAQ,MAAM;IAC1B,OACE,gBAAgB,UAAU;KAAE,MAAM;KAAQ;IAAO;GAErD;GAGA,MAAA,QAAM,gBAAgB;IACpB,IAAI,WAAW,eAAe,UAAU,eAAe,SAAS,GAAG,WAAW,eAAe,SAAS,CAAC;SAClG,IAAI,eAAe,WAAW,GAAG,WAAW,CAAC;GACpD,GAAG,CAAC,eAAe,MAAM,CAAC;GAC1B,MAAA,QAAM,gBAAgB;IACpB,MAAM,IAAI,IAAI,aAAa,WAAW,MAAM,EAAE,SAAS,MAAM;IAC7D,IAAI,KAAK,GAAS;SAAA,MAAM,SAAS,WAAW,CAAC;IAAA;GAC/C,GAAG,CAAC,IAAI,cAAc,MAAM,CAAC;GAG7B,MAAM,YAAY,UAAU;IAC1B,IAAI,CAAC,eAAe,QAAQ;IAC5B,MAAM,QAAQ,UAAU,QAAQ,eAAe,UAAU,eAAe;IACxE,WAAW,IAAI;IACf,OAAO,eAAe,KAAK;GAC7B;GAEA,MAAM,YAAY,UAAU;IAC1B,IAAI,CAAC,IAAI,aAAa,QAAQ;IAC9B,MAAM,QAAQ,UAAU,QAAQ,IAAI,aAAa,UAAU,IAAI,aAAa;IAC5E,WAAW,IAAI;IACf,SAAS,IAAI,aAAa,KAAK,CAAC,MAAM,IAAI;GAC5C;GAEA,MAAM,mBAAmB;IACvB,IAAI,CAAC,QAAQ;IACb,YAAY,QAAQ,SAAS;IAC7B,eAAe;GACjB;;;;;;;;;GAUA,MAAM,WAAW,QAAQ,QAAQ,WAAW;IAE1C,OAAO,IADQ,SAAS,gBAAgB,eACrB;KAAE;KAAW,QAAQ,OAAO;KAAQ,OAAO,OAAO,SAAS,SAAS;KAAQ,WAAW,OAAO;IAAI,CAAC,CAAC,CAAC,MAAM,QAAQ;KACpI,IAAI,OAAO,IAAI,IAAI;MACjB,YAAY,SAAS,OAAO,OAAO,CAAC,GAAG,MAAM,GAAG,OAAO,SAAS,IAAI,OAAO,CAAC,CAAC;MAC7E,IAAI,CAAC,QAAQ;OAAE,WAAW;OAAG,YAAY;MAAE;MAC3C,OAAO;KACT;KACA,IAAI,CAAC,QAAQ,SAAS,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI,MAAM;KAC7D,OAAO;IACT,CAAC,CAAC,CAAC,OAAO,MAAM;KACd,IAAI,CAAC,QAAQ,SAAS,UAAU,OAAO,CAAC,CAAC;KACzC,OAAO;IACT,CAAC;GACH;GAEA,MAAM,mBAAmB;IAAE,KAAK,MAAM,KAAK,gBAAgB,QAAQ,GAAG,KAAK;GAAE;GAC7E,MAAM,iBAAiB;IAAE,KAAK,MAAM,KAAK,CAAC,GAAG,cAAc,CAAC,CAAC,QAAQ,GAAG,QAAQ,GAAG,IAAI;GAAE;GAGzF,MAAM,aAAaA,MAAAA,QAAM,cAAc;IACrC,MAAM,MAAM,CAAC;IACb,KAAK,MAAM,OAAO,OAAO,OAAO,OAAO,GAAG;KACxC,IAAI,IAAI,eAAe,MAAM;KAC7B,MAAM,UAAU,MAAM,QAAQ,IAAI,WAAW,OAAO,IAAI,IAAI,UAAU,UAAU,CAAC;KACjF,MAAM,QAAQ,MAAM,QAAQ,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC;KACtD,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAEhC,KADW,QAAQ,SAAS,QAAQ,KAAK,IAAI,UAAU,UAC5C,aAAa,CAAC,SAAS,KAAK,MAAM,EAAE,GAAG,IAAI,KAAK;MAAE,QAAQ,IAAI;MAAQ,KAAK;MAAG,QAAQ,IAAI,WAAW;MAAM,IAAI,IAAI;KAAG,CAAC;IAEtI;IACA,OAAO;GACT,GAAG,CAAC,OAAO,CAAC;;;;;;GAOZ,MAAM,iBAAiB,WAAW;IAChC,IAAI,aAAa,WAAW,CAAC,WAAW,QAAQ;IAChD,aAAa,UAAU;IACvB,MAAM,OAAO,SAAS,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,GAAG,MAAO,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,MAAM,EAAE,GAAI,IAAI;IAC7G,IAAI,KAAK,GAAG,OAAO;IACnB,MAAM,MAAM,YAAY;KACtB,KAAK,MAAM,KAAK,MACd,IAAI,MAAM,QAAQ,GAAG,QAAQ,IAAI,GAAG;UAC/B;KAEP,aAAa,UAAU;KACvB,WAAW;KACX,YAAY;KACZ,WAAW,SAAS,UAAU,UAAU,KAAK,UAAU,OAAO,MAAM,OAAO,SAAS,GAAG;KACvF,IAAI,MAAM,SAAS,OAAO,6BAA6B;IACzD;IACA,IAAI;GACN;GACA,MAAM,uBAAuB,cAAc,KAAK;GAChD,MAAM,qBAAqB,cAAc,IAAI;GAC7C,MAAM,qBAAqB;IACzB,IAAI,CAAC,QAAQ;IACb,IAAI,CAAC,OAAO,QAAQ,wBAAwB,GAAG;IAC/C,IAAI,iBAAiB;KAAE;KAAW,MAAM;IAAO,CAAC,CAAC,CAAC,MAAM,QAAQ;KAC9D,IAAI,OAAO,IAAI,IAAI;MACjB,UAAU,KAAK;MAAG,WAAW;MAC7B,YAAY;KACd,OAAO,SAAS,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI,MAAM;IACzD,CAAC,CAAC,CAAC,OAAO,MAAM,SAAS,UAAU,OAAO,CAAC,CAAC,CAAC;GAC/C;GAEA,MAAM,YAAY,MAAM,cAAc;IACpC,IAAI,CAAC,MAAM;IACX,OAAO,MAAM,IAAI;IACjB,IAAI,WAAW,gBAAgB,UAAU;KAAE;KAAM,QAAQ;IAAK;GAChE;GAEA,MAAM,iBAAiB;IACrB,MAAM,KAAK,aAAa,GAAA,CAAI,KAAK;IACjC,IAAI,CAAC,GAAG;IACR,UAAU,MAAM;IAChB,IAAI,aAAa;KAAE;KAAW,MAAM;IAAE,CAAC,CAAC,CAAC,MAAM,QAAQ;KACrD,IAAI,OAAO,IAAI,IAAI;MACjB,SAAS,GAAG,KAAK;MACjB,aAAa,KAAK;MAAG,aAAa,EAAE;MAAG,UAAU,KAAK;MAAG,SAAS,IAAI;KACxE,OAAO;MAAE,UAAU,MAAM;MAAG,SAAS,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI,MAAM;KAAE;IAChF,CAAC,CAAC,CAAC,OAAO,MAAM;KAAE,UAAU,MAAM;KAAG,SAAS,UAAU,OAAO,CAAC,CAAC;IAAE,CAAC;GACtE;GAEA,MAAM,SAASA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAa,OAAO;KAAE,MAAM;KAAY,UAAU;IAAE;GAAE,GAC3G,KAAK,KAAK,MAAMA,MAAAA,QAAM,cAAc,OAAO;IACzC,KAAK,EAAE;IACP,WAAW,cAAc,EAAE,SAAS,SAAS,qBAAqB;IAClE,OAAO,EAAE;IACT,eAAe;KAAE,IAAI,EAAE,SAAS,QAAQ;MAAE,UAAU;MAAG,UAAU,EAAE,IAAI;KAAE;IAAE;GAC7E,GACEA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;IAAE,UAAU;IAAU,cAAc;IAAY,UAAU;GAAI,EAAE,GAAG,EAAE,KAAK,MAAM,OAAO,CAAC,CAAC,IAAI,KAAK,EAAE,IAAI,GAC5I,SAAS,EAAE,QAAQA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,eAAe,CAAC,IAAI,MACjFA,MAAAA,QAAM,cAAc,QAAQ;IAAE,WAAW;IAAc,UAAU,MAAM;KAAE,EAAE,gBAAgB;KAAG,SAAS,EAAE,IAAI;IAAE;GAAE,GAAG,GAAG,CAAC,CAAC,GAC1H,YACGA,MAAAA,QAAM,cAAc,SAAS;IAAE,WAAW;IAAmB,WAAW;IAAM,aAAa;IAAqB,OAAO;IAAW,WAAW,MAAM,aAAa,EAAE,OAAO,KAAK;IAAG,YAAY,MAAM;KAAE,IAAI,EAAE,QAAQ,SAAS,SAAS;KAAG,IAAI,EAAE,QAAQ,UAAU,aAAa,KAAK;IAAE;GAAE,CAAC,IACvRA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAgB,OAAO;IAAc,eAAe,aAAa,IAAI;GAAE,GAAG,GAAG,CAAE;GAEhI,MAAM,UAAUA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAgB,OAAO,UAAU;GAAG,GAC1FA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,eAAe,GAAG,SAAS,OAAO,MAAM,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,IAAI,OAAO,GACjHA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,eAAe,GAAG,UAAU,uBAAuB,CAAC;GAE/F,MAAM,SAASA,MAAAA,QAAM,cAAc,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,YAAY;IAAU,YAAY;IAA2C,YAAY;GAAE,EAAE,GACjK,QACAA,MAAAA,QAAM,cAAc,WAAW;IAAE;IAAW,SAAS,MAAM,SAAS,GAAG,KAAK;GAAE,CAAC,CAAC;GAElF,MAAM,YAAYA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,iBAAiB,GACzEA,MAAAA,QAAM,cAAc,QAAQ,MAAM,IAAI,GACtCA,MAAAA,QAAM,cAAc,QAAQ,MAAM,SAAS,OAAO,MAAM,IAAI,EAAE,GAC9DA,MAAAA,QAAM,cAAc,QAAQ,MAAM,MAAM,GACvC,SAASA,MAAAA,QAAM,cAAc,QAAQ,MAAM,MAAM,IAAI,MACtDA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,GACjD,IAAI,aAAa,IACdA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAiB,OAAO;IAAa,eAAe,iBAAiB,MAAM,CAAC,CAAC;GAAE,GAAG,UAAU,IAAI,aAAa,KAAK,IAC7J,MACJA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAiB,OAAO;IAAM,SAAS;GAAW,GAAG,GAAG,CAAC;GAEtG,MAAM,aAAa,IAAI,aAAa,QAAQ,MAAM,EAAE,SAAS,MAAM;GAEnE,IAAI;GACJ,IAAI,CAAC,UAAU,CAAC,WACd,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,aAAa,GAAG,kBAAkB;QAC5E,IAAI,WACT,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,aAAa,GAC1DA,MAAAA,QAAM,cAAc,OAAO,MAAM,oBAAoB,OAAO,SAAS,CAAC,GACtEA,MAAAA,QAAM,cAAc,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,EAAE,GAAG,mDAAmD,CAAC;QACzG,IAAI,CAAC,QACV,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,aAAa,GAC1DA,MAAAA,QAAM,cAAc,OAAO,MAAM,SAAS,GAC1CA,MAAAA,QAAM,cAAc,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,EAAE,GAAG,+CAA+C,CAAC;QACrG,IAAI,YAAY,MACrB,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,aAAa,GAAG,MAAM;QAErE,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,GAChEA,MAAAA,QAAM,cAAc,OAAO,EAAE,KAAK,aAAa,CAAC,CAAC;GAGrD,MAAM,UAAW,YAAY,CAAC,eAC1BA,MAAAA,QAAM,cAAc,OAAO;IACzB,WAAW;IACX,OAAO;KAAE,KAAK,SAAS;KAAK,OAAO;IAAG;IACtC,oBAAoB;KAAE,IAAI,aAAa,SAAS;MAAE,aAAa,aAAa,OAAO;MAAG,aAAa,UAAU;KAAK;IAAE;IACpH,oBAAoB;KAAE,MAAM,IAAI,iBAAiB;MAAE,aAAa,UAAU;MAAM,YAAY,UAAU;MAAM,YAAY,UAAU;MAAM,YAAY,IAAI;KAAE,GAAG,GAAG;KAAG,aAAa,UAAU;IAAE;GAC9L,GACEA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA4B,eAAe,QAAQ,SAAS,QAAQ,KAAK;GAAE,GAAG,QAAQ,GACjIA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA4B,eAAe,QAAQ,SAAS,QAAQ,IAAI;GAAE,GAAG,QAAQ,CAAC,IACnI;GAEJ,MAAM,UAAU,eACZA,MAAAA,QAAM,cAAcA,MAAAA,QAAM,UAAU,MAClCA,MAAAA,QAAM,cAAc,OAAO;IAAE,OAAO;KAAE,UAAU;KAAS,OAAO;KAAG,QAAQ;IAAG;IAAG,eAAe,gBAAgB,KAAK;GAAE,CAAC,GACxHA,MAAAA,QAAM,cAAc,cAAc;IAAE;IAAW;IAAK,KAAK;IAAa,eAAe,gBAAgB,KAAK;IAAG,aAAa,MAAM;KAAE,SAAS,GAAG,IAAI;KAAG,gBAAgB,KAAK;IAAE;GAAE,CAAC,CAAC,IACjL,eAAe,SAAS,IACrBA,MAAAA,QAAM,cAAc,SAAS;IAC3B;IAAgB;IAChB,OAAO;IACP,cAAc;IACd,YAAY;IACZ,kBAAkB;IAClB,gBAAgB;IAChB,iBAAiB,WAAW;IAC5B,YAAY;IACZ,QAAQ;IACR;IACA,cAAc,MAAM,SAAS,GAAG,IAAI;IACpC,iBAAiB,QAAQ;KAAE,eAAe,OAAO,SAAS;KAAG,gBAAgB,IAAI;IAAE;IACnF,WAAW;IACX,YAAY;IACZ;IAAS,WAAW,eAAe;IACnC;IAAS,WAAW,IAAI,aAAa;IACrC,kBAAkB,SAAS,EAAE;IAAG,kBAAkB,SAAS,CAAC;IAC5D,kBAAkB,SAAS,EAAE;IAAG,kBAAkB,SAAS,CAAC;GAC9D,CAAC,IACA,IAAI,aAAa,SAAS,IACvBA,MAAAA,QAAM,cAAc,cAAc;IAChC;IAAK;IAAQ,YAAY,aAAa;IACtC,kBAAkB;KAAE,IAAI,IAAI,aAAa,QAAQ,SAAS,IAAI,aAAa,EAAE,CAAC,MAAM,IAAI;IAAE;IAC1F,iBAAiB,QAAQ;KAAE,eAAe,OAAO,SAAS;KAAG,gBAAgB,IAAI;IAAE;IACnF,WAAW;GACb,CAAC,IACD;GAEZ,OAAOA,MAAAA,QAAM,cAAc,OAAO;IAAE,kBAAkB;IAAK,OAAO;KAAE,QAAQ;KAAQ,WAAW;KAAG,SAAS;KAAQ,eAAe;KAAU,YAAY;KAAwC,UAAU;IAAS;GAAE,GACnN,SACA,QACAA,MAAAA,QAAM,cAAc,OAAO,EAAE,OAAO;IAAE,UAAU;IAAY,MAAM;IAAG,WAAW;IAAG,SAAS;IAAQ,eAAe;GAAS,EAAE,GAC5H,MACA,SACA,OAAO,GACT,SAAS;EACb;;;;;;;;;;;ECljBA,SAAgB,UAAU,OAAO;GAC/B,MAAM,YAAY,OAAO;GACzB,MAAM,CAAC,GAAG,QAAQC,MAAAA,QAAM,SAAS,CAAC;GAClC,MAAM,MAAMA,MAAAA,QAAM,OAAO,CAAC;GAE1B,MAAM,OAAOA,MAAAA,QAAM,kBAAkB;IACnC,IAAI,CAAC,WAAW;IAChB,MAAM,IAAI,EAAE,IAAI;IAChB,IAAI,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,QAAQ;KAC5C,IAAI,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,QAAQ,IAAI,OAAO,GAAG;KACzE,KAAK,UAAU,IAAI,OAAO,CAAC,CAAC,UAAU;IACxC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;GACnB,GAAG,CAAC,SAAS,CAAC;GAEd,MAAA,QAAM,gBAAgB;IACpB,KAAK;IACL,MAAM,IAAI,YAAY,MAAM,GAAI;IAChC,MAAM,kBAAkB,KAAK;IAC7B,OAAO,iBAAiB,gBAAgB,SAAS;IACjD,aAAa;KAAE,cAAc,CAAC;KAAG,OAAO,oBAAoB,gBAAgB,SAAS;IAAE;GACzF,GAAG,CAAC,IAAI,CAAC;GAET,IAAI,CAAC,GAAG,OAAO;GAEf,MAAM,cAAc;IAClB,eAAe,IAAI;IACnB,iBAAiB;KAAE,iBAAiB;IAAE,GAAG,GAAG;GAC9C;GAEA,OAAOA,MAAAA,QAAM,cAAc,UAAU;IACnC,SAAS;IACT,OAAO,IAAI;IACX,OAAO;KAAE,UAAU;KAAY,SAAS;KAAe,YAAY;KAAU,gBAAgB;KAAU,OAAO;KAAI,QAAQ;KAAI,SAAS;KAAG,YAAY;KAAe,QAAQ;KAAQ,cAAc;KAAG,QAAQ;IAAU;GAC1N,GACEA,MAAAA,QAAM,cAAc,OAAO;IAAE,KAAK;IAAmC,KAAK;IAAM,OAAO;KAAE,OAAO;KAAI,QAAQ;KAAI,SAAS;IAAQ;GAAE,CAAC,GACpIA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;IAAE,UAAU;IAAY,KAAK;IAAG,OAAO;IAAG,UAAU;IAAI,QAAQ;IAAI,SAAS;IAAS,cAAc;IAAG,YAAY;IAA+C,OAAO;IAAQ,UAAU;IAAI,YAAY;IAAQ,WAAW;IAAU,YAAY;IAAK,WAAW;GAAa,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;EACzU;;;;;;;;;ECvCA,MAAa,SAAS,CAAC,SAAS,OAAO;;;;;;EAQvC,SAAgB,MAAM,KAAgB;GACpC,MAAM,YAAY,IAAgB,OAAe,IAAI,QAAQ,IAAI,EAAE;GAGnE,IAAI,MAAM,SAAS;IACjB,MAAM;IACN,IAAI;IACJ,OAAO;IACP,OAAO;IACP,SAAS,eAAuB,EAAE,UAAU;GAC9C,IAAI,UAAmBC,MAAAA,QAAM,cAAc,YAAY,OAAO,OAAO,CAAC,GAAG,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;GAG9F,IAAI,MAAM,SACR;IAAE,MAAM;IAAyC,IAAI;IAAmB,OAAO;IAAI,OAAO;GAAK,IAC9F,UAAmBA,MAAAA,QAAM,cAAc,WAAW,OAAO,OAAO,CAAC,GAAG,KAAK,CAAC,CAC7E;EACF"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["React","React","React","React","React","React","React"],"sources":["../src/shared/rpc.ts","../src/client/rpc.ts","../src/client/events.ts","../src/client/monaco/loader.ts","../src/client/monaco/diffRender.ts","../src/client/state/records.ts","../src/client/state/regions.ts","../src/client/ui/QuickOpen.ts","../src/client/ui/shared.ts","../src/client/ui/DiffBox.ts","../src/client/ui/DiffBarEmpty.ts","../src/client/ui/DiffLauncher.ts","../src/client/ui/EditorView.ts","../src/client/ui/DiffBadge.ts","../src/client/index.ts"],"sourcesContent":["/**\n * dsh-vscode-mode RPC contract — method names, per-method request/ok payloads,\n * and the typed handler map shared by the host dispatcher and the client\n * fetch wrapper. 载荷形状与历史实现一字不差,仅把隐式约定类型化。\n *\n * Purity rule: no node/react imports (same as types.ts).\n * 作者 ddj 2026-08-20\n */\nimport type {\n ArchiveBatch,\n ArchiveEntry,\n RecordView,\n StaleHunk,\n} from './types.js'\n\n/** webServer 精确路由。 */\nexport const RPC_PATH = '/edrv/rpc'\n\n/** 决策作用域:call=整条记录,hunk=单个差异块。 */\nexport type RpcScope = 'call' | 'hunk'\n\n/** 每个方法的请求参数(sessionId 为公共可选字段)。 */\nexport interface RpcRequestMap {\n 'edrv.list': { sessionId?: string; callIds?: string[] }\n 'edrv.accept': { sessionId?: string; callId: string; scope?: RpcScope; hunkIndex?: number }\n 'edrv.reject': { sessionId?: string; callId: string; scope?: RpcScope; hunkIndex?: number }\n 'edrv.read': { sessionId?: string; path: string }\n 'edrv.original': { sessionId?: string; path: string }\n 'edrv.save': { sessionId?: string; path: string; content: string }\n 'edrv.archiveList': { sessionId?: string }\n 'edrv.archiveRead': { sessionId?: string; path?: string }\n 'edrv.rollback': { sessionId?: string; path: string; batch?: number }\n 'edrv.debug': { sessionId?: string; text: string }\n 'edrv.searchFiles': { sessionId?: string; query: string }\n}\n\nexport type RpcMethod = keyof RpcRequestMap\n\n/** 每个方法成功(ok:true)时的附加载荷。 */\nexport interface RpcOkMap {\n 'edrv.list': { records: RecordView[] }\n 'edrv.accept': { record: RecordView }\n 'edrv.reject': { record: RecordView }\n 'edrv.read': { content: string; size: number }\n 'edrv.original': { content: string; size: number; stale: StaleHunk[]; fallback: boolean }\n 'edrv.save': object\n 'edrv.archiveList': { entries: ArchiveEntry[] }\n 'edrv.archiveRead': { batches: ArchiveBatch[] }\n 'edrv.rollback': { path: string; batch: number | null }\n 'edrv.debug': object\n 'edrv.searchFiles': { files: string[]; truncated: boolean }\n}\n\n/** 统一响应:{ok:true, ...payload} 或 {ok:false, error}。 */\nexport type RpcResult<M extends RpcMethod> =\n | ({ ok: true } & RpcOkMap[M])\n | { ok: false; error: string }\n\n/** 每个方法的 handler 签名(host 分发表与 client 类型检查共用)。 */\nexport type RpcHandler<M extends RpcMethod> = (\n args: RpcRequestMap[M],\n) => Promise<RpcResult<M>>\n\n/** host RPC 分发表:method → handler。 */\nexport type RpcHandlerMap = {\n [M in RpcMethod]: RpcHandler<M>\n}\n","/**\n * dsh-vscode-mode client — 类型化 RPC 包装 + 诊断日志。\n * 迁移自原 src/client/index.ts 的 rpc/dbg,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport { RPC_PATH } from '../shared/rpc.js'\nimport type { RpcMethod, RpcRequestMap, RpcResult } from '../shared/rpc.js'\n\n/** 同源 RPC 调用(host /edrv/rpc 精确路由)。 */\nexport function rpc<M extends RpcMethod>(method: M, args: RpcRequestMap[M]): Promise<RpcResult<M>> {\n return fetch(RPC_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ method, args }),\n }).then((res) => res.json()) as Promise<RpcResult<M>>\n}\n\n/**\n * 诊断日志:统一走 host edrv.debug 落盘,避免 console 刷屏。\n * @author ddj 2026年08月20号\n * @param sessionId 会话 id\n * @param text 日志文本\n */\nexport function dbg(sessionId: string | undefined, text: string): void {\n try {\n rpc('edrv.debug', { sessionId, text }).catch(() => {})\n } catch (e) { /* 日志失败忽略 */ }\n}\n","/**\n * dsh-vscode-mode client — 跨组件/跨 slot 的窗口事件助手。\n * 迁移自原 src/client/index.ts 的 openEditorView 与事件派发,语义不改。\n * 作者 ddj 2026-08-20\n */\n\n/**\n * 打开中央「文件编辑」页签:点击 shell 会话头部的视图页签(DOM 级,无需 store actions)。\n * @author ddj 2026年08月20号\n * @param path 要打开的路径(可空)\n */\nexport function openEditorView(path: string | null): void {\n const tabs = Array.from(document.querySelectorAll('div[role=\"tablist\"] button[role=\"tab\"]'))\n for (const b of tabs) {\n if (b.textContent && b.textContent.includes('文件编辑')) { (b as HTMLButtonElement).click(); break }\n }\n const p = path ?? null\n setTimeout(() => {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path: p } }))\n }, 80)\n}\n\n/** 差异状态变化:触发角标/DiffBox 重拉。 */\nexport function emitRefresh(): void {\n window.dispatchEvent(new CustomEvent('edrv:refresh'))\n}\n\n/** 打开指定路径到编辑区页签。 */\nexport function emitOpenEditor(path: string): void {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path } }))\n}\n\n/** 拉起 DiffLauncher。 */\nexport function emitShowLauncher(): void {\n window.dispatchEvent(new CustomEvent('edrv:show-launcher'))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — Monaco 加载与语言映射(AMD 构建,离线随包分发)。\n * 迁移自原 src/client/index.ts 的 MONACO_BASE/LANG_BY_EXT/langOf/loadMonaco,语义不改。\n * 作者 ddj 2026-08-20\n */\n\nexport const MONACO_BASE = '/edrv/vendor/monaco/vs'\nlet monacoPromise = null\n\n/** 扩展名 → Monaco language id(常见语言;未知回退 plaintext)。 */\nexport const LANG_BY_EXT = {\n js: 'javascript', jsx: 'javascript', mjs: 'javascript', cjs: 'javascript',\n ts: 'typescript', tsx: 'typescript', mts: 'typescript', cts: 'typescript',\n json: 'json', jsonc: 'json', md: 'markdown', markdown: 'markdown', mdx: 'mdx',\n css: 'css', scss: 'scss', less: 'less', html: 'html', htm: 'html', vue: 'html', xml: 'xml',\n yaml: 'yaml', yml: 'yaml', toml: 'ini', ini: 'ini', cfg: 'ini',\n py: 'python', sh: 'shell', bash: 'shell', zsh: 'shell', ps1: 'powershell',\n lua: 'lua', java: 'java', c: 'c', h: 'c', cpp: 'cpp', cc: 'cpp', cxx: 'cpp', hpp: 'cpp',\n cs: 'csharp', go: 'go', rs: 'rust', rb: 'ruby', php: 'php', sql: 'sql',\n swift: 'swift', kt: 'kotlin', kts: 'kotlin', dart: 'dart', dockerfile: 'dockerfile'\n}\n\n/**\n * 路径 → Monaco language id:取 basename 扩展名(dockerfile/Dockerfile 特判)。\n * @author ddj 2026年08月20号\n * @param path 文件路径\n * @returns language id\n */\nexport function langOf(path) {\n const base = String(path || '').split(/[\\\\/]/).pop() || ''\n if (/^dockerfile$/i.test(base)) return 'dockerfile'\n const dot = base.lastIndexOf('.')\n if (dot <= 0) return 'plaintext'\n return LANG_BY_EXT[base.slice(dot + 1).toLowerCase()] ?? 'plaintext'\n}\n\n/**\n * 加载 Monaco Editor(AMD 构建,随插件包离线分发):注入 loader.js → require.config → editor.main。\n * @author ddj 2026年08月20号\n * @returns Promise<object> window.monaco\n */\nexport function loadMonaco() {\n if (!monacoPromise) {\n monacoPromise = new Promise((resolve, reject) => {\n const boot = () => {\n try {\n window.require.config({ paths: { vs: MONACO_BASE } })\n window.require(['vs/editor/editor.main'], () => resolve(window.monaco), (err) => {\n monacoPromise = null\n reject(new Error('Monaco 模块加载失败:' + String(err)))\n })\n } catch (error) {\n monacoPromise = null\n reject(error)\n }\n }\n const existing = document.querySelector('script[data-edrv-monaco-loader]')\n if (existing) boot()\n else {\n const s = document.createElement('script')\n s.src = MONACO_BASE + '/loader.js'\n s.dataset.edrvMonacoLoader = '1'\n s.onload = boot\n s.onerror = () => { monacoPromise = null; reject(new Error('Monaco loader 加载失败')) }\n document.head.appendChild(s)\n }\n })\n }\n return monacoPromise\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 行内差异自绘(新增行绿底 + glyph margin '+';删除块 view zone 红底)。\n * 迁移自原 src/client/index.ts 的 diff-render effect,语义不改。\n * 作者 ddj 2026-08-20\n */\n\n/**\n * 差异渲染器(每 EditorView 挂载一个,内部持有 zone/decoration 状态)。\n * @param log 诊断日志函数((sessionId, text) => void)\n */\nexport function createDiffRenderer(log) {\n let viewZoneIds = []\n let decorations = []\n\n /**\n * 渲染当前 pending 差异:绿底 decoration + 删除块 view zones + '-' 号 overlay(滚动同步)。\n * @param monaco window.monaco\n * @param editor Monaco 编辑器实例\n * @param pendingRegions 待处理差异区域\n * @param sessionId 会话 id\n */\n const render = (monaco, editor, pendingRegions, sessionId) => {\n const renderT0 = Date.now()\n const callIdAttr = (callId, idx) => String(callId) + ':' + String(idx)\n log(sessionId, '[diff-render] begin regs=' + pendingRegions.length + ' ' + pendingRegions.map((r) => callIdAttr(r.callId, r.idx) + '@' + (r.start ?? '?') + '-' + (r.end ?? '?') + '(-' + (r.oldLines ? r.oldLines.length : 0) + '/+' + (r.newLines ? r.newLines.length : 0) + ')').join('|'))\n\n const decos = []\n for (const r of pendingRegions) {\n if (r.start === undefined || r.end === undefined) continue\n if (!r.create && r.newLines && r.newLines.length) {\n decos.push({\n range: new monaco.Range(r.start, 1, Math.max(r.start, r.end - 1), 1),\n options: { isWholeLine: true, className: 'edrv-mn-add-line', linesDecorationsClassName: 'edrv-mn-gutter-add' },\n })\n }\n }\n decorations = editor.deltaDecorations(decorations, decos)\n\n // 删除块 view zones(红底 + 正文;- 号由独立 overlay 层渲染,定位在 decoration 列与 + 同列,\n // 不受 view zone 容器定位/裁剪影响;滚动用 translateY 同步)\n let createdZones = []\n editor.changeViewZones((accessor) => {\n for (const id of viewZoneIds) { try { accessor.removeZone(id) } catch (e) { /* 已移除 */ } }\n viewZoneIds = []\n const zones = []\n for (const r of pendingRegions) {\n if (r.create) continue\n const oldLines = r.oldLines && r.oldLines.length ? r.oldLines : null\n if (!oldLines) continue\n const after = Math.max(0, (r.start ?? 1) - 1)\n const domNode = document.createElement('div')\n domNode.className = 'edrv-del-zone'\n domNode.dataset.edrvHunk = callIdAttr(r.callId, r.idx)\n for (const t of oldLines) {\n const row = document.createElement('div')\n row.className = 'edrv-del-row'\n const text = document.createElement('span')\n text.className = 'edrv-del-text'\n text.textContent = t\n row.appendChild(text)\n domNode.appendChild(row)\n }\n const id = accessor.addZone({\n afterLineNumber: after,\n heightInLines: oldLines.length,\n domNode,\n suppressMouseDown: false,\n })\n viewZoneIds.push(id)\n zones.push({ domNode, after, n: oldLines.length })\n }\n createdZones = zones\n })\n\n if (createdZones.length) {\n const root = editor.getDomNode()\n if (root) {\n let overlay = root.querySelector('.edrv-minus-overlay')\n if (!overlay) {\n overlay = document.createElement('div')\n overlay.className = 'edrv-minus-overlay'\n root.appendChild(overlay)\n }\n overlay.innerHTML = ''\n const lineH = editor.getOption(monaco.editor.EditorOption.lineHeight) || 20\n let li = null\n try { li = editor.getLayoutInfo() } catch (e) { /* ignore */ }\n const left = li ? li.decorationsLeft : 0\n const width = li && li.decorationsWidth > 0 ? li.decorationsWidth : 16\n const lineCount = editor.getModel().getLineCount()\n let itemIdx = 0\n let zi = 0\n for (const z of createdZones) {\n // 用 Monaco 坐标 API 计算 view zone 顶部,避免离屏 zone DOM 未布局导致 getBoundingClientRect 为 0\n const anchor = Math.min(z.after + 1, lineCount)\n let zoneBottom = editor.getTopForLineNumber(anchor)\n if (z.after >= lineCount) zoneBottom += lineH\n const zoneTop = zoneBottom - z.n * lineH\n for (let i = 0; i < z.n; i++) {\n const item = document.createElement('div')\n item.className = 'edrv-minus-item'\n item.textContent = '-'\n item.style.width = width + 'px'\n item.style.height = lineH + 'px'\n item.dataset.zone = String(zi)\n item.dataset.row = String(i)\n item.style.top = (zoneTop + i * lineH) + 'px'\n item.style.left = left + 'px'\n overlay.appendChild(item)\n itemIdx++\n }\n zi++\n }\n log(sessionId, '[diff-render] placed zones=' + createdZones.length + ' items=' + itemIdx + ' left=' + left + ' w=' + width + ' t+' + (Date.now() - renderT0) + 'ms')\n // 滚动同步:overlay 随内容滚动(内容坐标 - scrollTop)\n const syncScroll = () => {\n const s2 = editor.getScrollTop() || 0\n if (overlay) overlay.style.transform = 'translateY(' + (-s2) + 'px)'\n }\n syncScroll()\n overlay.__edrvSync = syncScroll\n if (!overlay.__edrvBound) {\n overlay.__edrvBound = true\n editor.onDidScrollChange(syncScroll)\n }\n // 已可见的 zone 用真实 DOM 坐标做一次微调(离屏 zone 仍保留坐标 API 位置)\n setTimeout(() => {\n try {\n const edRect = root.getBoundingClientRect()\n const st = editor.getScrollTop() || 0\n const items = overlay.querySelectorAll('.edrv-minus-item')\n for (const item of items) {\n const zIndex = Number(item.dataset.zone)\n const rIndex = Number(item.dataset.row)\n const z = createdZones[zIndex]\n if (!z || !z.domNode.isConnected) continue\n const rowEl = z.domNode.querySelectorAll('.edrv-del-row')[rIndex]\n if (!rowEl) continue\n const rowRect = rowEl.getBoundingClientRect()\n if (rowRect.height > 0) {\n item.style.top = (rowRect.top - edRect.top + st) + 'px'\n }\n }\n } catch (e) { log(sessionId, '[diff-render] correct fail ' + String(e)) }\n }, 50)\n }\n } else {\n const root = editor.getDomNode()\n const overlay = root && root.querySelector('.edrv-minus-overlay')\n if (overlay) overlay.innerHTML = ''\n }\n }\n\n /** 卸载清理(EditorView unmount 时调用)。 */\n const dispose = () => {\n viewZoneIds = []\n decorations = []\n }\n\n return { render, dispose }\n}\n","/**\n * dsh-vscode-mode client — 记录/差异状态纯函数(可单测)。\n * 迁移自原 src/client/index.ts 前段,语义一字不改。\n * 作者 ddj 2026-08-20\n */\nimport type { CallHunk, Hunk, RecordView } from '../../shared/types.js'\n\n/** 差异决策状态。 */\nexport const ST = { PENDING: 'pending', ACCEPTED: 'accepted', REJECTED: 'rejected' } as const\nexport type Status = 'pending' | 'accepted' | 'rejected'\n\n/** 记录视图摘要(按文件分组)。 */\nexport interface FileSummary {\n path: string\n recs: RecordView[]\n pending: number\n}\nexport interface Summary {\n files: FileSummary[]\n pendingFiles: FileSummary[]\n totalFiles: number\n}\n\n/** hunk 的 DOM 定位 key(callId:idx)。 */\nexport function callIdAttr(callId: string, idx: number): string {\n return String(callId) + ':' + String(idx)\n}\n\n/** 某 hunk 的当前决策状态(缺省 pending)。 */\nexport function statusAt(rec: RecordView | undefined, idx: number): Status {\n if (!rec) return ST.PENDING\n if (Array.isArray(rec.decisions?.perHunk) && rec.decisions.perHunk[idx] !== undefined) return rec.decisions.perHunk[idx] as Status\n return (rec.decisions?.call as Status) ?? ST.PENDING\n}\n\n/** hunk 是否为空差异(old===new,无实际内容变化,不可操作)。create 记录不视为空差异。 */\nexport function noopHunk(rec: RecordView | undefined, h: Hunk | CallHunk | null | undefined): boolean {\n if (!rec || rec.create === true) return false\n const precise = rec.toolName === 'edit' && rec.callHunk ? rec.callHunk : h\n const oldText = precise?.oldText ?? null\n const newText = precise?.newText ?? null\n return oldText !== null && oldText === newText\n}\n\n/** 记录是否仍有待处理差异(superseded / 全部已决策 = false)。 */\nexport function isRecPending(rec: RecordView): boolean {\n if (!rec || rec.superseded === true) return false\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n if (perHunk.length) {\n // 只认存在至少一个\"非空差异且未决策\"的 hunk\n for (let i = 0; i < perHunk.length; i++) {\n if (perHunk[i] !== 'accepted' && perHunk[i] !== 'rejected' && !noopHunk(rec, (rec.hunks || [])[i])) return true\n }\n return false\n }\n return rec.decisions.call === 'pending' || rec.decisions.call === undefined\n}\n\n/** 记录待处理差异\"处\"数(按 hunk,跳过空差异)。 */\nexport function pendingCount(recs: RecordView[]): number {\n let n = 0\n for (const rec of recs) {\n if (!isRecPending(rec)) continue\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n if (perHunk.length) {\n for (let i = 0; i < perHunk.length; i++) {\n if (perHunk[i] === 'pending' && !noopHunk(rec, (rec.hunks || [])[i])) n++\n }\n } else {\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (const h of hunks) if (!noopHunk(rec, h)) n++\n if (!hunks.length && !noopHunk(rec, rec.callHunk)) n = Math.max(n, 1)\n }\n }\n return n\n}\n\n/** 按文件分组的差异摘要(角标/Launcher 用)。 */\nexport function summarize(records: RecordView[]): Summary {\n const byPath = new Map<string, RecordView[]>()\n for (const r of records) {\n if (!byPath.has(r.path)) byPath.set(r.path, [])\n byPath.get(r.path)!.push(r)\n }\n const files: FileSummary[] = []\n for (const [path, recs] of byPath) files.push({ path, recs, pending: pendingCount(recs) })\n files.sort((a, b) => (a.path < b.path ? -1 : 1))\n const pendingFiles = files.filter((f) => f.pending > 0)\n return { files, pendingFiles, totalFiles: pendingFiles.length }\n}\n","/**\n * dsh-vscode-mode client — 差异区域计算纯函数(可单测)。\n * 迁移自原 src/client/index.ts 的 diffRegions/trimCommonLines/countLinesBefore,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport type { Hunk, RecordView } from '../../shared/types.js'\nimport { ST, noopHunk, statusAt } from './records.js'\nimport type { Status } from './records.js'\n\n/** 差异区域(文件内一段待处理/已处理的变更)。 */\nexport interface Region {\n callId: string\n idx: number\n start?: number\n end?: number\n oldLines: string[]\n newLines: string[]\n whole?: boolean\n status: Status\n create: boolean\n rec: RecordView\n superseded: boolean\n stale?: boolean\n}\n\n/** 统计 index 之前(不含)的换行数 → 0 基行号。 */\nexport function countLinesBefore(text: string, index: number): number {\n let n = 0\n for (let i = 0; i < index; i++) if (text.charCodeAt(i) === 10) n++\n return n\n}\n\n/**\n * 行级公共前缀/后缀裁剪:old/new 首尾相同的行视为未变化(上下文),只保留真正变更的中间段。\n * @author ddj 2026年08月20号\n * @param oldLines 替换前内容按行拆分\n * @param newLines 替换后内容按行拆分\n * @returns 裁剪后的变更段与公共前缀行数\n */\nexport function trimCommonLines(oldLines: string[], newLines: string[]): { oldLines: string[]; newLines: string[]; shift: number } {\n let prefix = 0\n const maxPrefix = Math.min(oldLines.length, newLines.length)\n while (prefix < maxPrefix && oldLines[prefix] === newLines[prefix]) prefix++\n let suffix = 0\n const maxSuffix = Math.min(oldLines.length - prefix, newLines.length - prefix)\n while (suffix < maxSuffix && oldLines[oldLines.length - 1 - suffix] === newLines[newLines.length - 1 - suffix]) suffix++\n return { oldLines: oldLines.slice(prefix, oldLines.length - suffix), newLines: newLines.slice(prefix, newLines.length - suffix), shift: prefix }\n}\n\n/** 计算文件内各差异区域(行范围 + old/new + 状态),用于行内绿标注与 DiffBox。 */\nexport function diffRegions(records: RecordView[], content: string | null): Region[] {\n const regions: Region[] = []\n if (content === null) return regions\n const lines = content.split('\\n')\n for (const rec of records) {\n for (let i = 0; i < rec.hunks.length; i++) {\n const h: Hunk = rec.hunks[i]\n if (noopHunk(rec, h)) continue // 空差异(old===new)无实际变化,跳过\n const status = statusAt(rec, i)\n if (rec.create) {\n regions.push({ callId: rec.callId, idx: i, start: 1, end: lines.length, oldLines: [], newLines: lines.slice(), whole: true, status, create: true, rec, superseded: rec.superseded === true })\n continue\n }\n const precise = rec.toolName === 'edit' && rec.callHunk ? rec.callHunk : h\n const newText = precise.newText ?? ''\n const at = content.indexOf(newText)\n if (at < 0) {\n regions.push({ callId: rec.callId, idx: i, stale: true, status, create: false, oldLines: [], newLines: [], rec, superseded: rec.superseded === true })\n continue\n }\n const start = countLinesBefore(content, at) + 1\n const oldLines = precise.oldText === null ? [] : precise.oldText.split('\\n')\n const newLines = newText.split('\\n')\n const trimmed = trimCommonLines(oldLines, newLines)\n const regionStart = start + trimmed.shift\n regions.push({ callId: rec.callId, idx: i, start: regionStart, end: regionStart + trimmed.newLines.length, oldLines: trimmed.oldLines, newLines: trimmed.newLines, status, create: false, rec, superseded: rec.superseded === true })\n }\n }\n regions.sort((a, b) => (a.start ?? Infinity) - (b.start ?? Infinity))\n return regions\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — QuickOpen:顶部搜索框(Ctrl+P 打开文件)。\n * 迁移自原 src/client/index.ts 的 QuickOpen,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\n\n/**\n * 快速打开搜索框:Ctrl+P 聚焦,输入 ≥2 字符经 edrv.searchFiles 搜索,\n * 结果列表点击/回车打开文件。\n * @param props.sessionId 会话 id\n * @param props.onOpen 打开回调(path)\n */\nexport function QuickOpen(props) {\n const sessionId = props?.sessionId\n const onOpen = props?.onOpen\n const [q, setQ] = React.useState('')\n const [results, setResults] = React.useState(null)\n const [open, setOpen] = React.useState(false)\n const inputRef = React.useRef(null)\n const seq = React.useRef(0)\n const timer = React.useRef(null)\n\n const search = (query) => {\n const s = ++seq.current\n const clean = String(query || '').trim()\n if (clean.length < 2) { setResults(null); return }\n rpc('edrv.searchFiles', { sessionId, query: clean }).then((res) => {\n if (s !== seq.current) return\n setResults((res && res.ok && Array.isArray(res.files)) ? res.files : [])\n }).catch(() => { if (s === seq.current) setResults([]) })\n }\n\n const onChange = (v) => {\n setQ(v); setOpen(true)\n if (timer.current) clearTimeout(timer.current)\n timer.current = setTimeout(() => search(v), 180)\n }\n\n const pick = (p) => {\n onOpen(p)\n setQ(''); setResults(null); setOpen(false)\n inputRef.current?.blur?.()\n }\n\n React.useEffect(() => {\n const onKey = (e) => {\n if ((e.ctrlKey || e.metaKey) && String(e.key).toLowerCase() === 'p') {\n e.preventDefault(); e.stopPropagation()\n inputRef.current?.focus?.()\n setOpen(true)\n } else if (e.key === 'Escape') {\n setOpen(false); inputRef.current?.blur?.()\n }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n const dirText = (p) => {\n const base = String(p).split(/[\\\\/]/).pop() || String(p)\n return String(p).slice(0, Math.max(0, String(p).length - base.length)).replace(/[\\\\/]+$/, '') || String(p)\n }\n\n let pop = null\n if (open && Array.isArray(results) && q.trim().length >= 2) {\n if (results.length) {\n const items = results.map((p) => React.createElement('div', { key: p, className: 'edrv-search-item', onClick: () => pick(p) },\n React.createElement('span', { className: 'n' }, String(p).split(/[\\\\/]/).pop() || p),\n React.createElement('span', { className: 'd' }, dirText(p))))\n pop = React.createElement('div', { className: 'edrv-search-pop' }, ...items)\n } else {\n pop = React.createElement('div', { className: 'edrv-search-pop' }, React.createElement('div', { className: 'edrv-search-empty' }, '无匹配文件'))\n }\n }\n\n return React.createElement('div', { className: 'edrv-search-wrap' },\n React.createElement('input', {\n ref: inputRef, className: 'edrv-search', placeholder: '搜索文件 (Ctrl+P)',\n value: q,\n onChange: (e) => onChange(e.target.value),\n onFocus: () => { if (q.trim().length >= 2 && !results) setOpen(true) },\n onKeyDown: (e) => {\n if (e.key === 'Enter' && Array.isArray(results) && results.length) pick(results[0])\n if (e.key === 'Escape') setOpen(false)\n },\n }),\n pop)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — UI 共用小工具(按钮样式/状态文案/等宽字体)。\n * 迁移自原 src/client/index.ts 的 btn/badgeOf/MONO,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport { ST } from '../state/records.js'\n\n/** 次级按钮内联样式(accept=true 绿色 / false 红色)。 */\nexport function btn(accept) {\n return {\n fontSize: 11,\n padding: '1px 8px',\n border: '1px solid var(--dsw-alias-border-l2,#555)',\n borderRadius: 4,\n cursor: 'pointer',\n background: 'var(--dsw-alias-bg-layer-1,transparent)',\n color: accept ? 'var(--dsw-alias-state-success-primary,#2e9e44)' : 'var(--dsw-alias-state-error-primary,#d9534f)',\n }\n}\n\n/** 状态中文文案。 */\nexport function badgeOf(status) {\n return status === ST.ACCEPTED ? '已采纳' : status === ST.REJECTED ? '已拒绝' : '待处理'\n}\n\n/** 等宽字体常量(差异行渲染用)。 */\nexport const MONO = { fontFamily: 'var(--ds-font-family-code, ui-monospace, monospace)', fontSize: 12, lineHeight: 1.55 }\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffBox:每个文件底部紧凑差异条(per-file hunk + ⋮ 二级菜单)。\n * 迁移自原 src/client/index.ts 的 DiffBox,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { callIdAttr } from '../state/records.js'\nimport { badgeOf } from './shared.js'\n\n/**\n * 差异条:当前文件内 diff 导航(↑↓←→)、Keep/Undo、展开 hunk 列表、⋮ 二级菜单\n * (Keep All / Undo All / 差异总览 / 归档 / 回滚 / 刷新)+ 其他差异文件小节。\n */\nexport function DiffBox(props) {\n const {\n pendingRegions, staleRegions, onAct, onAcceptFile, onUndoFile, onAcceptAllFiles, onUndoAllFiles,\n allPendingCount, onRollback, onJump, otherFiles, onOpenOther, onOpenLauncher, onRefresh, activePath,\n diffIdx, diffTotal, fileIdx, fileTotal, onPrevDiff, onNextDiff, onPrevFile, onNextFile,\n } = props\n const [expanded, setExpanded] = React.useState(false)\n const [menuOpen, setMenuOpen] = React.useState(false)\n const canAct = pendingRegions.length > 0\n\n const base = String(activePath || '').split(/[\\\\/]/).pop() || ''\n\n let bodyEl = null\n if (expanded) {\n const rows = pendingRegions.map((r) => {\n const key = callIdAttr(r.callId, r.idx)\n return React.createElement('div', { key, className: 'edrv-diffrow', 'data-edrv-hunk': key, title: '跳转到 L' + (r.start ?? '?'), onClick: () => onJump(r) },\n React.createElement('span', { className: 'edrv-diffrow-l' }, 'L' + (r.start ?? '?') + '-' + (r.end ?? '?')),\n (r.oldLines.length ? React.createElement('span', { className: 'edrv-diffrow-o' }, '-' + r.oldLines.length) : null),\n (r.newLines.length ? React.createElement('span', { className: 'edrv-diffrow-n' }, '+' + r.newLines.length) : null),\n (r.create ? React.createElement('span', { className: 'edrv-diffrow-tag' }, '新建') : null),\n React.createElement('span', { style: { flex: 1 } }))\n })\n const stale = staleRegions.map((r) => React.createElement('div', { key: 'stale' + callIdAttr(r.callId, r.idx), className: 'edrv-diffrow edrv-diffrow-stale', title: '差异无法定位(文件可能已被手动修改)' },\n React.createElement('span', { className: 'edrv-diffrow-l' }, 'L' + (r.start ?? '?') + ' 无法定位'),\n React.createElement('span', { className: 'edrv-diffrow-tag' }, badgeOf(r.status))))\n let othersEl = null\n if (otherFiles.length) {\n othersEl = React.createElement('div', { className: 'edrv-diffbox-others' },\n React.createElement('span', { className: 'edrv-diffrow-tag' }, '其他差异文件 (' + otherFiles.length + '):'),\n otherFiles.map((f) => React.createElement('button', { key: f.path, className: 'edrv-diffrow-file', title: f.path, onClick: () => onOpenOther(f.path) },\n String(f.path).split(/[\\\\/]/).pop() + ' (' + f.pending + ')')))\n }\n bodyEl = React.createElement('div', { className: 'edrv-diffbar-body' }, ...rows, ...stale, othersEl)\n }\n\n const menu = menuOpen\n ? React.createElement(React.Fragment, null,\n React.createElement('div', { style: { position: 'fixed', inset: 0, zIndex: 44 }, onClick: () => setMenuOpen(false) }),\n React.createElement('div', { className: 'edrv-diffbar-menu' },\n React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !allPendingCount, onClick: () => { onAcceptAllFiles(); setMenuOpen(false) } }, '✓ Keep All(全部文件采纳)'),\n React.createElement('button', { className: 'edrv-diffmenu-item danger', disabled: !allPendingCount, onClick: () => { onUndoAllFiles(); setMenuOpen(false) } }, '↩ Undo All(全部文件不采纳)'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onOpenLauncher('pending'); setMenuOpen(false) } }, '🗂 差异总览'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onOpenLauncher('archive'); setMenuOpen(false) } }, '📁 归档'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !canAct, onClick: () => { onRollback(); setMenuOpen(false) } }, '⟲ 回滚文件'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onRefresh(); setMenuOpen(false) } }, '⟳ 刷新')))\n : null\n\n return React.createElement('div', { className: 'edrv-diffbar', 'data-edrv-diffbox': '1' },\n React.createElement('div', { className: 'edrv-diffbar-row' },\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异', disabled: !canAct, onClick: onPrevDiff }, '↑'),\n React.createElement('span', { className: 'edrv-diffbar-count', title: '当前文件内差异位置(点击展开/收起差异列表)', onClick: () => setExpanded((v) => !v) }, diffTotal ? (diffIdx + 1) + '/' + diffTotal : '0/0'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '下一个差异', disabled: !canAct, onClick: onNextDiff }, '↓'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异文件', disabled: !fileTotal, onClick: onPrevFile }, '←'),\n React.createElement('span', { className: 'edrv-diffbar-count edrv-count-file', title: '差异文件位置' }, fileTotal ? (fileIdx + 1) + '/' + fileTotal + ' 文件' : '0/0 文件'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '下一个差异文件', disabled: !fileTotal, onClick: onNextFile }, '→'),\n React.createElement('span', { className: 'edrv-diffbar-file', title: activePath || '' }, base),\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', title: '采纳当前文件的全部差异', disabled: !canAct, onClick: onAcceptFile }, '✓ Keep'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-undo', title: '不采纳当前文件的全部差异(回滚)', disabled: !canAct, onClick: onUndoFile }, '↩ Undo'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '更多操作', onClick: () => setMenuOpen((v) => !v) }, '⋮')),\n bodyEl,\n menu)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffBarEmpty:无文件打开 / 当前文件无差异但有差异文件时的空态浮窗。\n * 迁移自原 src/client/index.ts 的 DiffBarEmpty,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\n\n/**\n * 空态差异条:提示当前状态 + 查看下一个差异文件 + ⋮(总览/归档/刷新)。\n */\nexport function DiffBarEmpty(props) {\n const { sum, active, staleCount, onNextFile, onOpenLauncher, onRefresh } = props\n const [menuOpen, setMenuOpen] = React.useState(false)\n const n = sum?.totalFiles ?? 0\n const tip = active\n ? (staleCount > 0 ? '当前文件有 ' + staleCount + ' 处差异无法定位(可能已被后续修改影响)' : '当前文件无待处理差异')\n : '未打开文件'\n\n const menu = menuOpen\n ? React.createElement(React.Fragment, null,\n React.createElement('div', { style: { position: 'fixed', inset: 0, zIndex: 44 }, onClick: () => setMenuOpen(false) }),\n React.createElement('div', { className: 'edrv-diffbar-menu' },\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onOpenLauncher('pending'); setMenuOpen(false) } }, '🗂 差异总览'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onOpenLauncher('archive'); setMenuOpen(false) } }, '📁 归档'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onRefresh(); setMenuOpen(false) } }, '⟳ 刷新')))\n : null\n\n return React.createElement('div', { className: 'edrv-diffbar', 'data-edrv-diffbox': '1' },\n React.createElement('div', { className: 'edrv-diffbar-row' },\n React.createElement('span', { className: 'edrv-diffbar-count' }, '⚠ 差异 ' + n + ' 文件'),\n React.createElement('span', { className: 'edrv-diffbar-file' }, tip),\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', title: '打开并跳转到下一个差异文件', onClick: onNextFile }, '查看下一个差异文件'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '更多操作', onClick: () => setMenuOpen((v) => !v) }, '⋮')),\n menu)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffLauncher:全局差异总览 + 归档 圆角下拉。\n * 迁移自原 src/client/index.ts 的 DiffLauncher,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { MONO, btn } from './shared.js'\n\n/**\n * 全局差异面板:待处理文件列表(点击打开并跳转)+ 归档浏览/批次回滚。\n * 由状态栏差异 chip / header 角标触发。\n */\nexport function DiffLauncher(props) {\n const sessionId = props?.sessionId\n const sum = props?.sum\n const onClose = props?.onClose\n const onOpenFile = props?.onOpenFile\n const [tab, setTab] = React.useState(props?.tab === 'archive' ? 'archive' : 'pending') // 'pending' | 'archive'\n const [archives, setArchives] = React.useState(null)\n const [archiveDetail, setArchiveDetail] = React.useState(null)\n const [archivePath, setArchivePath] = React.useState(null)\n const [archiveErr, setArchiveErr] = React.useState(null)\n const [error, setError] = React.useState(null)\n\n const loadArchives = () => {\n if (!sessionId) { setArchiveErr('会话不存在'); return }\n rpc('edrv.archiveList', { sessionId }).then((res) => {\n if (res && res.ok && Array.isArray(res.entries)) { setArchives(res.entries); setArchiveErr(null) }\n else setArchiveErr(res?.error ? String(res.error) : '归档列表读取失败')\n }).catch((e) => setArchiveErr('归档异常:' + String(e)))\n }\n const loadArchiveDetail = (path) => {\n if (!sessionId) return\n setArchiveDetail(null)\n rpc('edrv.archiveRead', { sessionId, path }).then((res) => {\n if (res && res.ok && Array.isArray(res.batches)) setArchiveDetail(res.batches)\n else setArchiveErr(res?.error ? String(res.error) : '归档详情读取失败')\n }).catch((e) => setArchiveErr('归档异常:' + String(e)))\n }\n React.useEffect(() => {\n if (tab !== 'archive') return\n setArchives(null); setArchiveDetail(null); setArchivePath(null); setArchiveErr(null)\n loadArchives()\n }, [tab, sessionId])\n\n let body\n if (tab === 'pending') {\n body = (sum.pendingFiles.length === 0\n ? React.createElement('div', { className: 'edrv-search-empty' }, '暂无待处理差异(已全部处理)')\n : sum.pendingFiles.map((f) => React.createElement('div', { key: f.path, className: 'edrv-launch-row', title: '打开并跳转到差异 ' + f.path, onClick: () => onOpenFile(f.path) },\n React.createElement('span', { className: 'edrv-launch-path' }, f.path),\n React.createElement('span', { className: 'edrv-launch-cnt' }, '待处理 ' + f.pending + ' 处'),\n React.createElement('button', { className: 'edrv-btn-mini edrv-btn-keep', onClick: (e) => { e.stopPropagation(); onOpenFile(f.path) } }, '打开'))))\n } else {\n if (archiveErr) body = React.createElement('div', { className: 'edrv-search-empty', style: { color: 'var(--dsw-alias-state-error-primary,#d9534f)' } }, '错误:' + String(archiveErr))\n else if (archives === null) body = React.createElement('div', { className: 'edrv-search-empty' }, '加载中…')\n else if (archives.length === 0) body = React.createElement('div', { className: 'edrv-search-empty' }, '暂无归档记录')\n else {\n const inner = archives.map((e) => {\n const open = archivePath === e.path\n let detailEl = null\n if (open) {\n if (archiveDetail === null) detailEl = React.createElement('div', { style: { padding: 8, fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, '加载中…')\n else {\n const batches = archiveDetail.filter((b) => b.path === e.path)\n detailEl = batches.map((b) => (Array.isArray(b.records) ? b.records : []).map((rec) => {\n const lines = []\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (const h of hunks) {\n const oldLs = (h.oldText ?? '').split('\\n')\n const newLs = (h.newText ?? '').split('\\n')\n for (const t of oldLs) lines.push({ k: 'old', t })\n if (oldLs.length && newLs.length) lines.push({ k: 'sep', t: '' })\n for (const t of newLs) lines.push({ k: 'new', t })\n }\n const sm = rec.summary || { accepted: 0, rejected: 0, pending: 0, superseded: false }\n return React.createElement('div', { key: rec.callId, style: { padding: '5px 8px', borderTop: '1px solid var(--dsw-alias-border-l1,#333)' } },\n React.createElement('div', { style: { display: 'flex', gap: 8, alignItems: 'center', flexWrap: 'wrap', fontSize: 11, marginBottom: 2 } },\n React.createElement('span', { style: { color: 'var(--dsw-alias-label-primary,#ddd)', fontWeight: 600 } }, rec.toolName === 'write' ? (rec.create ? '新建' : '写入') : '编辑'),\n React.createElement('span', { style: { color: 'var(--dsw-alias-state-success-primary,#2e9e44)' } }, '采纳 ' + sm.accepted),\n React.createElement('span', { style: { color: 'var(--dsw-alias-state-error-primary,#d9534f)' } }, '拒绝 ' + sm.rejected),\n (rec.superseded ? React.createElement('span', { style: { color: 'var(--dsw-alias-state-warn-primary,#b7791f)' } }, '被覆盖') : null),\n React.createElement('span', { style: { color: 'var(--dsw-alias-label-tertiary,#888)' } }, new Date(rec.at).toLocaleTimeString())),\n React.createElement('pre', { style: { margin: 0, whiteSpace: 'pre', fontFamily: MONO.fontFamily, fontSize: 11, lineHeight: 1.5, overflowX: 'auto' } }, lines.map((ln, i) => React.createElement('div', { key: i, style: { background: ln.k === 'old' ? 'rgba(239,68,68,.10)' : ln.k === 'new' ? 'rgba(34,197,94,.10)' : 'transparent', color: ln.k === 'old' ? 'var(--dsw-alias-state-error-primary,#d9534f)' : ln.k === 'new' ? 'var(--dsw-alias-state-success-primary,#2e9e44)' : 'var(--dsw-alias-label-tertiary,#888)' } }, (ln.k === 'old' ? '- ' : ln.k === 'new' ? '+ ' : '') + ln.t)))\n )\n }))\n }\n }\n return React.createElement('div', { key: e.at + e.path, style: { border: '1px solid var(--dsw-alias-border-l1,#333)', borderRadius: 8, overflow: 'hidden' } },\n React.createElement('div', { style: { display: 'flex', gap: 8, alignItems: 'center', padding: '6px 8px', background: 'var(--dsw-alias-bg-layer-1,transparent)', cursor: 'pointer', flexWrap: 'wrap' }, onClick: () => { if (open) { setArchivePath(null); setArchiveDetail(null) } else { setArchivePath(e.path); loadArchiveDetail(e.path) } } },\n React.createElement('span', { style: { flex: 1, fontSize: 12, color: 'var(--dsw-alias-label-primary,#ddd)', wordBreak: 'break-all' } }, e.path),\n (e.batch != null ? React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, '批次 ' + e.batch) : null),\n (e.reason ? React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-state-warn-primary,#b7791f)' } }, e.reason) : null),\n React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, new Date(e.at).toLocaleString()),\n React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, '采纳 ' + e.summary.accepted + ' · 拒绝 ' + e.summary.rejected + (e.summary.superseded ? ' · 覆盖 ' + e.summary.superseded : '')),\n React.createElement('button', { onClick: (ev) => {\n ev.stopPropagation()\n if (e.batch == null) return\n if (!window.confirm('将文件恢复到批次 ' + e.batch + ' 之前的状态?(当前活跃差异将一并归档)')) return\n rpc('edrv.rollback', { sessionId, path: e.path, batch: e.batch }).then((res) => {\n if (res && res.ok) {\n setError(null); window.dispatchEvent(new CustomEvent('edrv:refresh'))\n setArchivePath(null); setArchiveDetail(null); loadArchives()\n } else setError(res?.error ? String(res.error) : '回滚失败')\n }).catch((err) => setError('回滚异常:' + String(err)))\n }, style: btn(false) }, '回滚')),\n detailEl)\n })\n body = React.createElement('div', { className: 'edrv-launch-arch' }, inner)\n }\n }\n\n return React.createElement('div', { className: 'edrv-launch', 'data-edrv-launch': '1' },\n React.createElement('div', { className: 'edrv-launch-head' },\n React.createElement('span', { style: { fontSize: 12, fontWeight: 600, color: 'var(--dsw-alias-label-primary,#eee)', marginRight: 4 } }, '差异'),\n React.createElement('button', { className: 'edrv-launch-tab' + (tab === 'pending' ? ' on' : ''), onClick: () => setTab('pending') }, '待处理' + (sum.totalFiles ? ' (' + sum.totalFiles + ')' : '')),\n React.createElement('button', { className: 'edrv-launch-tab' + (tab === 'archive' ? ' on' : ''), onClick: () => setTab('archive') }, '归档'),\n React.createElement('span', { style: { flex: 1 } }),\n (error ? React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-state-error-primary,#d9534f)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: '40%' } }, '错误:' + String(error)) : null),\n React.createElement('button', { onClick: onClose, style: btn(false) }, '✕ 关闭')),\n React.createElement('div', { className: 'edrv-launch-body' }, body))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — EditorView:中央 VSCode 式文件编辑器(编排层)。\n * 迁移自原 src/client/index.ts 的 EditorView,语义不改;差异自绘已抽到 monaco/diffRender。\n * 职责:页签/QuickOpen/Monaco 编辑器/差异审查(DiffBox/Launcher/Badge 事件装配)/状态栏/自动保存。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { dbg, rpc } from '../rpc.js'\nimport { emitRefresh } from '../events.js'\nimport { langOf, loadMonaco } from '../monaco/loader.js'\nimport { createDiffRenderer } from '../monaco/diffRender.js'\nimport { ST, callIdAttr, noopHunk, summarize } from '../state/records.js'\nimport { diffRegions } from '../state/regions.js'\nimport { QuickOpen } from './QuickOpen.js'\nimport { DiffBox } from './DiffBox.js'\nimport { DiffBarEmpty } from './DiffBarEmpty.js'\nimport { DiffLauncher } from './DiffLauncher.js'\n\n/**\n * 中央编辑区:文件页签(脏点/关闭/打开路径)+ Ctrl+P 搜索 + Monaco 编辑器 +\n * 底部差异条(DiffBox/空态)+ 全局差异下拉(DiffLauncher)+ 状态栏。\n * @param props.sessionId 会话 id\n * @param props.schedule 延时调度(ctx.timeout)\n */\nexport function EditorView(props) {\n const sessionId = props?.sessionId\n const schedule = props.schedule\n const [monaco, setMonaco] = React.useState(null)\n const [monacoErr, setMonacoErr] = React.useState(null)\n const [records, setRecords] = React.useState({})\n const [tabs, setTabs] = React.useState([])\n const [active, setActive] = React.useState(null)\n const [dirtyMap, setDirtyMap] = React.useState({})\n const [content, setContent] = React.useState(null)\n const [status, setStatus] = React.useState('')\n const [error, setError] = React.useState(null)\n const [openInput, setOpenInput] = React.useState(false)\n const [pathDraft, setPathDraft] = React.useState('')\n const [cursor, setCursor] = React.useState('')\n const [launcherOpen, setLauncherOpen] = React.useState(false)\n const [launcherTab, setLauncherTab] = React.useState('pending')\n const [hoverAct, setHoverAct] = React.useState(null) // { region, top } 编辑区 hover 差异块的 Keep/Undo 浮层\n const [diffIdx, setDiffIdx] = React.useState(0) // 当前文件内差异位置(x/x 显示)\n const [fileIdx, setFileIdx] = React.useState(0) // 全局差异文件位置(x/x 文件 显示)\n const editorRef = React.useRef(null)\n const monacoRef = React.useRef(null)\n const modelsRef = React.useRef(new Map())\n const saveTimerRef = React.useRef(null)\n const loadSeqRef = React.useRef(0)\n const programmaticRef = React.useRef(false)\n const bootRef = React.useRef(false)\n const pendingFocusRef = React.useRef(null) // { path, region } 内容加载后跳转\n const hoverRegionsRef = React.useRef([]) // 当前 pending 区域镜像(稳定回调读取)\n const lineRegionMapRef = React.useRef(new Map()) // 行 → 区域 映射(hover 命中)\n const hoverKeyRef = React.useRef(null) // 当前 hover 区域 key(区域不变不重渲染)\n const hoverTopRef = React.useRef(null) // 当前 hover 浮窗 top(滚动后位置变化才重定位)\n const hoverRightRef = React.useRef(null) // 浮窗右侧避让 Monaco 缩略栏\n const hideTimerRef = React.useRef(null) // 延迟隐藏计时器(防闪烁)\n const hoverEditorRef = React.useRef(false) // 鼠标是否仍在编辑器命中区\n const hoverPanelRef = React.useRef(false) // 鼠标是否已进入 Keep/Undo 浮层\n const batchBusyRef = React.useRef(false) // 批量 Keep All/Undo All 防重入\n const diffRendererRef = React.useRef(null)\n if (!diffRendererRef.current) diffRendererRef.current = createDiffRenderer((sid, t) => dbg(sid, t))\n\n const currentRecords = React.useMemo(() => {\n const list = []\n for (const rec of Object.values(records)) if (rec.path === active) list.push(rec)\n return list\n }, [records, active])\n\n const regions = React.useMemo(() => diffRegions(currentRecords, content).filter((r) => !r.superseded), [currentRecords, content])\n // useMemo 稳定引用:否则 hover 等重渲染会让 view zone effect 反复重建(- 号闪烁)\n const pendingRegions = React.useMemo(() => regions.filter((r) => r.status === ST.PENDING && !r.stale), [regions])\n const staleRegions = React.useMemo(() => regions.filter((r) => r.status === ST.PENDING && r.stale), [regions])\n hoverRegionsRef.current = pendingRegions\n // 行 → 差异区域 映射(hover O(1) 命中;每行归属其区域)\n const lineRegionMap = React.useMemo(() => {\n const map = new Map()\n for (const r of pendingRegions) {\n if (r.start === undefined || r.end === undefined) continue\n const last = Math.max(r.start, r.end - 1)\n for (let ln = r.start; ln <= last; ln++) if (!map.has(ln)) map.set(ln, r)\n }\n return map\n }, [pendingRegions])\n lineRegionMapRef.current = lineRegionMap\n const sum = React.useMemo(() => summarize(Object.values(records)), [records])\n\n const addTab = (path, select) => {\n setTabs((prev) => {\n if (prev.some((t) => t.path === path)) return prev\n return prev.concat([{ path }])\n })\n if (select) setActive(path)\n }\n\n const closeTab = (path) => {\n flushSave()\n setTabs((prev) => {\n const idx = prev.findIndex((t) => t.path === path)\n if (idx < 0) return prev\n const next = prev.filter((t) => t.path !== path)\n if (active === path) setActive(next[idx] ? next[idx].path : (next[idx - 1] ? next[idx - 1].path : null))\n return next\n })\n }\n\n const refreshRecords = () => {\n if (!sessionId) return\n rpc('edrv.list', { sessionId }).then((res) => {\n if (!res || !res.ok || !Array.isArray(res.records)) return\n const map = {}\n for (const r of res.records) map[r.callId] = r\n setRecords(map)\n }).catch((e) => setError('list异常:' + String(e)))\n }\n\n const loadContent = (path, sid) => {\n const seq = ++loadSeqRef.current\n rpc('edrv.read', { sessionId: sid, path }).then((res) => {\n if (seq !== loadSeqRef.current || path !== active) return\n if (res && res.ok) { setContent(res.content); setStatus('已加载') }\n else { setError(res?.error ? String(res.error) : '读取失败'); setStatus('读取失败') }\n }).catch((e) => { if (seq === loadSeqRef.current) { setError('read异常:' + String(e)); setStatus('读取失败') } })\n }\n\n // 挂载轮询 + 事件订阅\n React.useEffect(() => {\n if (!sessionId) return\n refreshRecords()\n const t = setInterval(refreshRecords, 5000)\n const onRefresh = () => refreshRecords()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => { clearInterval(t); window.removeEventListener('edrv:refresh', onRefresh) }\n }, [sessionId])\n\n React.useEffect(() => {\n const onOpen = (e) => {\n const p = e?.detail?.path\n if (p) addTab(p, true)\n }\n const onShowLauncher = () => setLauncherOpen(true)\n window.addEventListener('edrv:open-editor', onOpen)\n window.addEventListener('edrv:show-launcher', onShowLauncher)\n return () => {\n window.removeEventListener('edrv:open-editor', onOpen)\n window.removeEventListener('edrv:show-launcher', onShowLauncher)\n }\n }, [sessionId])\n\n // localStorage v2 恢复页签\n React.useEffect(() => {\n if (bootRef.current || !sessionId) return\n bootRef.current = true\n try {\n const raw = localStorage.getItem('edrv.editor.v2.' + String(sessionId))\n if (raw) {\n const saved = JSON.parse(raw)\n if (Array.isArray(saved.tabs) && saved.tabs.length) {\n setTabs(saved.tabs.map((p) => ({ path: p })))\n if (typeof saved.active === 'string') setActive(saved.active)\n }\n }\n } catch (e) { /* 损坏忽略 */ }\n }, [sessionId])\n\n React.useEffect(() => {\n if (!sessionId) return\n try { localStorage.setItem('edrv.editor.v2.' + String(sessionId), JSON.stringify({ tabs: tabs.map((t) => t.path), active })) }\n catch (e) { /* 忽略 */ }\n }, [tabs, active, sessionId])\n\n React.useEffect(() => {\n if (!active) return\n setContent(null); setStatus('加载中…')\n loadContent(active, sessionId)\n }, [active, sessionId])\n\n React.useEffect(() => {\n if (monaco || monacoErr) return\n let alive = true\n loadMonaco().then((m) => { if (alive) setMonaco(m) }).catch((e) => { if (alive) { setMonacoErr(String(e?.message ?? e)); setStatus('Monaco 不可用') } })\n return () => { alive = false }\n }, [monaco, monacoErr])\n\n monacoRef.current = monaco\n\n const getModel = (path, text) => {\n const cache = modelsRef.current\n let model = cache.get(path)\n if (!model) {\n model = window.monaco.editor.createModel(text ?? '', langOf(path), window.monaco.Uri.parse('edrv:///' + encodeURI(path)))\n cache.set(path, model)\n } else if (text !== undefined && model.getValue() !== text) {\n programmaticRef.current = true\n model.setValue(text)\n programmaticRef.current = false\n }\n return model\n }\n\n const flushSave = () => {\n if (saveTimerRef.current) { saveTimerRef.current(); saveTimerRef.current = null }\n }\n\n const doSave = (silent) => {\n const ed = editorRef.current\n if (!active || !ed) return\n const text = ed.getValue()\n if (!silent) setStatus('保存中…')\n rpc('edrv.save', { sessionId, path: active, content: text }).then((res) => {\n if (res && res.ok) {\n setStatus('已保存 ' + new Date().toTimeString().slice(0, 8))\n setContent(text)\n setDirtyMap((d) => Object.assign({}, d, { [active]: false }))\n refreshRecords()\n emitRefresh()\n } else { setStatus('保存失败'); setError(res?.error ? String(res.error) : '保存失败') }\n }).catch((e) => { setStatus('保存失败'); setError('保存异常:' + String(e)) })\n }\n\n const onEdit = () => {\n const ed = editorRef.current\n if (!ed || !active) return\n setDirtyMap((d) => Object.assign({}, d, { [active]: true }))\n setStatus('编辑中…')\n if (saveTimerRef.current) saveTimerRef.current()\n saveTimerRef.current = schedule(() => doSave(true), 700)\n }\n\n // model 同步(当前内容)\n React.useEffect(() => {\n if (!monaco || !editorRef.current || !active || content === null) return\n const ed = editorRef.current\n const model = getModel(active, content)\n if (ed.getModel() !== model) ed.setModel(model)\n }, [monaco, active, content])\n\n // 行内差异自绘(decorations / view zones / minus overlay)→ diffRenderer\n React.useEffect(() => {\n if (!monaco || !editorRef.current || !active || content === null) return\n diffRendererRef.current.render(monaco, editorRef.current, pendingRegions, sessionId)\n }, [monaco, active, content, pendingRegions])\n\n React.useEffect(() => () => {\n flushSave()\n diffRendererRef.current?.dispose?.()\n if (editorRef.current) { editorRef.current.dispose(); editorRef.current = null }\n for (const m of modelsRef.current.values()) m.dispose()\n modelsRef.current.clear()\n const root = editorRef.current && editorRef.current.getDomNode ? editorRef.current.getDomNode() : null\n if (root) {\n const ov = root.querySelector('.edrv-minus-overlay')\n if (ov) ov.remove()\n }\n }, [])\n\n // 普通 Monaco 编辑器(可编辑、单列行号)+ 自绘行内差异(decoration 绿底+ / view zone 删除块)\n const ensureEditor = React.useCallback((node) => {\n if (!node) {\n if (editorRef.current) { editorRef.current.dispose(); editorRef.current = null }\n return\n }\n if (editorRef.current || !monacoRef.current) return\n const m = monacoRef.current\n const ed = m.editor.create(node, {\n value: '',\n language: 'plaintext',\n theme: 'vs',\n fontFamily: 'var(--ds-font-family-code, ui-monospace, monospace)',\n fontSize: 13,\n lineHeight: 20,\n minimap: { enabled: true, scale: 1 },\n glyphMargin: true,\n lineDecorationsWidth: 16,\n automaticLayout: true,\n scrollBeyondLastLine: false,\n wordWrap: 'off',\n tabSize: 2,\n renderWhitespace: 'selection',\n smoothScrolling: true,\n cursorBlinking: 'smooth',\n padding: { top: 8 },\n })\n ed.addCommand(m.KeyMod.CtrlCmd | m.KeyCode.KeyS, () => { flushSave(); doSave(false) })\n ed.onDidChangeModelContent(() => {\n if (!ed.getModel() || programmaticRef.current) return\n onEdit()\n })\n ed.onDidChangeCursorPosition((e) => {\n setCursor('Ln ' + e.position.lineNumber + ', Col ' + e.position.column)\n })\n // hover 差异块 → 浮出 Keep/Undo(req:鼠标移到编辑区差异块时显示)\n // 防闪烁:① 区域不变不 setState(浮窗锚定差异块起始行,不跟随鼠标);② 延迟隐藏;\n // ③ 浮窗自身 onMouseEnter 取消隐藏计时(鼠标在浮窗与编辑器间移动不闪)。\n const hideSoon = () => {\n if (hoverEditorRef.current || hoverPanelRef.current || hideTimerRef.current) return\n hideTimerRef.current = setTimeout(() => {\n hideTimerRef.current = null\n if (hoverEditorRef.current || hoverPanelRef.current) return\n hoverKeyRef.current = null\n hoverTopRef.current = null\n setHoverAct(null)\n }, 180)\n }\n ed.onMouseMove((e) => {\n hoverEditorRef.current = true\n const line = e?.target?.position?.lineNumber\n const map = lineRegionMapRef.current\n if (!line || !map.size) { hoverEditorRef.current = false; hideSoon(); return }\n const hit = map.get(line)\n if (!hit) { hoverEditorRef.current = false; hideSoon(); return }\n const key = callIdAttr(hit.callId, hit.idx)\n const top = Math.max(0, ed.getTopForLineNumber(Math.max(1, hit.start)) - ed.getScrollTop())\n const layout = ed.getLayoutInfo()\n const minimapLeft = layout.minimap?.minimapLeft || 0\n const right = minimapLeft > 0 ? Math.max(12, layout.width - minimapLeft + 8) : Math.max(12, layout.verticalScrollbarWidth + 8)\n if (hoverKeyRef.current === key && hoverTopRef.current === top && hoverRightRef.current === right) return // 同区域同位置不重复更新\n hoverKeyRef.current = key\n hoverTopRef.current = top\n hoverRightRef.current = right\n if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }\n setHoverAct({ region: hit, top, right })\n })\n editorRef.current = ed\n }, [])\n\n // 打开文件后的差异聚焦跳转(内容/差异就绪后执行一次)\n React.useEffect(() => {\n const pf = pendingFocusRef.current\n if (!pf || pf.path !== active || content === null) return\n const target = pf.region || pendingRegions[0]\n const ed = editorRef.current\n if (!target || !ed) return\n pendingFocusRef.current = null\n ed.revealLineInCenter(Math.max(1, target.start ?? 1))\n ed.setPosition({ lineNumber: Math.max(1, target.start ?? 1), column: 1 })\n ed.focus()\n }, [active, content, pendingRegions])\n\n const jumpTo = (region) => {\n if (editorRef.current) {\n editorRef.current.revealLineInCenter(Math.max(1, region?.start ?? 1))\n editorRef.current.setPosition({ lineNumber: Math.max(1, region?.start ?? 1), column: 1 })\n editorRef.current.focus()\n } else {\n pendingFocusRef.current = { path: active, region }\n }\n }\n\n // 索引校正:差异/文件被处理后 pending 列表变化,clamp 到有效范围\n React.useEffect(() => {\n if (diffIdx >= pendingRegions.length && pendingRegions.length > 0) setDiffIdx(pendingRegions.length - 1)\n else if (pendingRegions.length === 0) setDiffIdx(0)\n }, [pendingRegions.length])\n React.useEffect(() => {\n const i = sum.pendingFiles.findIndex((f) => f.path === active)\n if (i >= 0) { if (i !== fileIdx) setFileIdx(i) }\n }, [sum.pendingFiles, active])\n\n // 上下箭头:当前文件内差异切换(x/x)\n const gotoDiff = (delta) => {\n if (!pendingRegions.length) return\n const next = (diffIdx + delta + pendingRegions.length) % pendingRegions.length\n setDiffIdx(next)\n jumpTo(pendingRegions[next])\n }\n // 左右箭头:全局差异文件切换(x/x 文件),打开并跳转\n const gotoFile = (delta) => {\n if (!sum.pendingFiles.length) return\n const next = (fileIdx + delta + sum.pendingFiles.length) % sum.pendingFiles.length\n setFileIdx(next)\n openFile(sum.pendingFiles[next].path, true)\n }\n\n const reloadFile = () => {\n if (!active) return\n loadContent(active, sessionId)\n refreshRecords()\n }\n\n /**\n * 关闭当前差异浮窗并清理 hover 锚点。\n * @author ddj 2026年08月21号\n */\n const dismissHover = () => {\n hoverKeyRef.current = null\n hoverTopRef.current = null\n hoverRightRef.current = null\n hoverEditorRef.current = false\n hoverPanelRef.current = false\n if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }\n setHoverAct(null)\n }\n\n /**\n * 对单个差异区域执行采纳/不采纳。\n * @author ddj 2026年08月20号\n * @param region 差异区域(callId/idx/create)\n * @param reject true=不采纳(回滚),false=采纳\n * @param silent 批量时抑制中间 reload/报错,由批量方统一收尾\n * @returns Promise<boolean> 是否成功\n */\n const actHunk = (region, reject, silent) => {\n const method = reject ? 'edrv.reject' : 'edrv.accept'\n return rpc(method, { sessionId, callId: region.callId, scope: region.create ? 'call' : 'hunk', hunkIndex: region.idx }).then((res) => {\n if (res && res.ok) {\n setRecords((prev) => Object.assign({}, prev, { [region.callId]: res.record }))\n if (!silent) { reloadFile(); emitRefresh() }\n return true\n }\n if (!silent) setError(res?.error ? String(res.error) : '操作失败')\n return false\n }).catch((e) => {\n if (!silent) setError('操作异常:' + String(e))\n return false\n })\n }\n\n const acceptFile = () => { for (const r of pendingRegions) actHunk(r, false) }\n const undoFile = () => { for (const r of [...pendingRegions].reverse()) actHunk(r, true) }\n\n // 所有差异文件的待处理 hunk 列表(二级菜单 Keep All / Undo All 用)\n const allPending = React.useMemo(() => {\n const out = []\n for (const rec of Object.values(records)) {\n if (rec.superseded === true) continue\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (let i = 0; i < hunks.length; i++) {\n const st = perHunk.length ? perHunk[i] : rec.decisions.call\n if (st === 'pending' && !noopHunk(rec, hunks[i])) out.push({ callId: rec.callId, idx: i, create: rec.create === true, at: rec.at })\n }\n }\n return out\n }, [records])\n\n /**\n * 批量处理所有差异文件:采纳全部 / 不采纳全部。不采纳按 at 降序(新改先回滚)串行执行。\n * @author ddj 2026年08月20号\n * @param reject true=全部不采纳(回滚),false=全部采纳\n */\n const actAllPending = (reject) => {\n if (batchBusyRef.current || !allPending.length) return\n batchBusyRef.current = true\n const list = reject ? [...allPending].sort((a, b) => (a.at < b.at ? 1 : a.at > b.at ? -1 : b.idx - a.idx)) : allPending\n let ok = 0, fail = 0\n const run = async () => {\n for (const r of list) {\n if (await actHunk(r, reject, true)) ok++\n else fail++\n }\n batchBusyRef.current = false\n reloadFile()\n emitRefresh()\n setStatus((reject ? '已不采纳 ' : '已采纳 ') + ok + ' 处差异' + (fail ? ',' + fail + ' 处失败' : ''))\n if (fail) setError(fail + ' 处差异处理失败(可能已被后续修改影响),可刷新后重试')\n }\n run()\n }\n const acceptAllFiles = () => actAllPending(false)\n const undoAllFiles = () => actAllPending(true)\n const rollbackFile = () => {\n if (!active) return\n if (!window.confirm('回滚当前文件到修改前状态?(相关差异将归档)')) return\n rpc('edrv.rollback', { sessionId, path: active }).then((res) => {\n if (res && res.ok) {\n setStatus('已回滚'); reloadFile()\n emitRefresh()\n } else setError(res?.error ? String(res.error) : '回滚失败')\n }).catch((e) => setError('回滚异常:' + String(e)))\n }\n\n const openFile = (path, focusDiff) => {\n if (!path) return\n addTab(path, true)\n if (focusDiff) pendingFocusRef.current = { path, region: null }\n }\n\n const openPath = () => {\n const p = (pathDraft || '').trim()\n if (!p) return\n setStatus('打开中…')\n rpc('edrv.read', { sessionId, path: p }).then((res) => {\n if (res && res.ok) {\n openFile(p, false)\n setOpenInput(false); setPathDraft(''); setStatus('已打开'); setError(null)\n } else { setStatus('打开失败'); setError(res?.error ? String(res.error) : '打开失败') }\n }).catch((e) => { setStatus('打开失败'); setError('打开异常:' + String(e)) })\n }\n\n const tabsEl = React.createElement('div', { className: 'edrv-tabs', style: { flex: '1 1 auto', minWidth: 0 } },\n tabs.map((t) => React.createElement('div', {\n key: t.path,\n className: 'edrv-tab' + (t.path === active ? ' edrv-tab-active' : ''),\n title: t.path,\n onClick: () => { if (t.path !== active) { flushSave(); setActive(t.path) } },\n },\n React.createElement('span', { style: { overflow: 'hidden', textOverflow: 'ellipsis', maxWidth: 180 } }, t.path.split(/[\\\\/]/).pop() || t.path),\n (dirtyMap[t.path] ? React.createElement('span', { className: 'edrv-tab-dot' }) : null),\n React.createElement('span', { className: 'edrv-tab-x', onClick: (e) => { e.stopPropagation(); closeTab(t.path) } }, '×'))),\n (openInput\n ? React.createElement('input', { className: 'edrv-path-input', autoFocus: true, placeholder: '输入工作区相对/绝对路径,回车打开', value: pathDraft, onChange: (e) => setPathDraft(e.target.value), onKeyDown: (e) => { if (e.key === 'Enter') openPath(); if (e.key === 'Escape') setOpenInput(false) } })\n : React.createElement('button', { className: 'edrv-tab-add', title: '打开文件(输入路径)', onClick: () => setOpenInput(true) }, '+')))\n\n const pathBar = React.createElement('div', { className: 'edrv-pathbar', title: active || '' },\n React.createElement('span', { className: 'edrv-pb-name' }, active ? String(active).split(/[\\\\/]/).pop() : '未打开文件'),\n React.createElement('span', { className: 'edrv-pb-full' }, active || '使用右上搜索框 (Ctrl+P) 打开文件'))\n\n const tabRow = React.createElement('div', { style: { display: 'flex', alignItems: 'center', background: 'var(--dsw-alias-bg-layer-1,transparent)', flexShrink: 0 } },\n tabsEl,\n React.createElement(QuickOpen, { sessionId, onOpen: (p) => openFile(p, false) }))\n\n const statusBar = React.createElement('div', { className: 'edrv-statusbar' },\n React.createElement('span', null, '编辑'),\n React.createElement('span', null, active ? langOf(active) : ''),\n React.createElement('span', null, cursor),\n (status ? React.createElement('span', null, status) : null),\n React.createElement('span', { style: { flex: 1 } }),\n (sum.totalFiles > 0\n ? React.createElement('button', { className: 'edrv-diffchip', title: '打开差异总览/归档', onClick: () => setLauncherOpen((o) => !o) }, '⚠ 差异 ' + sum.totalFiles + ' 文件')\n : null),\n React.createElement('button', { className: 'edrv-chip-btn', title: '刷新', onClick: reloadFile }, '⟳'))\n\n const otherFiles = sum.pendingFiles.filter((f) => f.path !== active)\n\n let body\n if (!monaco && !monacoErr) {\n body = React.createElement('div', { className: 'edrv-empty' }, '正在加载 Monaco 编辑器…')\n } else if (monacoErr) {\n body = React.createElement('div', { className: 'edrv-empty' },\n React.createElement('div', null, 'Monaco 编辑器加载失败:' + String(monacoErr)),\n React.createElement('div', { style: { fontSize: 11 } }, '请确认插件包 assets/vendor/monaco 完整(/edrv/vendor 路由可达)'))\n } else if (!active) {\n body = React.createElement('div', { className: 'edrv-empty' },\n React.createElement('div', null, '暂无打开的文件'),\n React.createElement('div', { style: { fontSize: 12 } }, '使用右上搜索框 (Ctrl+P) 打开工作区文件;agent 修改文件后顶部会出现差异角标'))\n } else if (content === null) {\n body = React.createElement('div', { className: 'edrv-empty' }, '加载中…')\n } else {\n body = React.createElement('div', { className: 'edrv-monaco-host' },\n React.createElement('div', { ref: ensureEditor }))\n }\n\n const hoverEl = (hoverAct && !launcherOpen)\n ? React.createElement('div', {\n className: 'edrv-hoveract',\n style: { top: hoverAct.top, right: hoverAct.right ?? 12 },\n onMouseEnter: () => { hoverPanelRef.current = true; if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },\n onMouseMove: () => { hoverPanelRef.current = true; if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },\n onMouseLeave: () => {\n hoverPanelRef.current = false\n if (hoverEditorRef.current || hideTimerRef.current) return\n hideTimerRef.current = setTimeout(() => {\n hideTimerRef.current = null\n if (hoverEditorRef.current || hoverPanelRef.current) return\n hoverKeyRef.current = null\n hoverTopRef.current = null\n setHoverAct(null)\n }, 420)\n },\n },\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', onClick: () => { dismissHover(); actHunk(hoverAct.region, false) } }, '✓ Keep'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-undo', onClick: () => { dismissHover(); actHunk(hoverAct.region, true) } }, '↩ Undo'))\n : null\n\n const overlay = launcherOpen\n ? React.createElement(React.Fragment, null,\n React.createElement('div', { style: { position: 'fixed', inset: 0, zIndex: 30 }, onClick: () => setLauncherOpen(false) }),\n React.createElement(DiffLauncher, { sessionId, sum, tab: launcherTab, onClose: () => setLauncherOpen(false), onOpenFile: (p) => { openFile(p, true); setLauncherOpen(false) } }))\n : (pendingRegions.length > 0\n ? React.createElement(DiffBox, {\n pendingRegions, staleRegions,\n onAct: actHunk,\n onAcceptFile: acceptFile,\n onUndoFile: undoFile,\n onAcceptAllFiles: acceptAllFiles,\n onUndoAllFiles: undoAllFiles,\n allPendingCount: allPending.length,\n onRollback: rollbackFile,\n onJump: jumpTo,\n otherFiles,\n onOpenOther: (p) => openFile(p, true),\n onOpenLauncher: (tab) => { setLauncherTab(tab || 'pending'); setLauncherOpen(true) },\n onRefresh: reloadFile,\n activePath: active,\n diffIdx, diffTotal: pendingRegions.length,\n fileIdx, fileTotal: sum.pendingFiles.length,\n onPrevDiff: () => gotoDiff(-1), onNextDiff: () => gotoDiff(1),\n onPrevFile: () => gotoFile(-1), onNextFile: () => gotoFile(1),\n })\n : (sum.pendingFiles.length > 0\n ? React.createElement(DiffBarEmpty, {\n sum, active, staleCount: staleRegions.length,\n onNextFile: () => { if (sum.pendingFiles.length) openFile(sum.pendingFiles[0].path, true) },\n onOpenLauncher: (tab) => { setLauncherTab(tab || 'pending'); setLauncherOpen(true) },\n onRefresh: reloadFile,\n })\n : null))\n\n return React.createElement('div', { 'data-edrv-view': '1', style: { height: '100%', minHeight: 0, display: 'flex', flexDirection: 'column', background: 'var(--dsw-alias-bg-base,transparent)', overflow: 'hidden' } },\n pathBar,\n tabRow,\n React.createElement('div', { style: { position: 'relative', flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' } },\n body,\n hoverEl,\n overlay),\n statusBar)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffBadge:header 差异角标(仅工作区有差异时显示)。\n * 迁移自原 src/client/index.ts 的 DiffBadge,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { openEditorView, emitShowLauncher } from '../events.js'\nimport { summarize } from '../state/records.js'\n\n/**\n * 会话 header 差异角标:5s 轮询 edrv.list,有差异时显示数字徽章,点击打开编辑区并拉起 DiffLauncher。\n */\nexport function DiffBadge(props) {\n const sessionId = props?.sessionId\n const [n, setN] = React.useState(0)\n const seq = React.useRef(0)\n\n const load = React.useCallback(() => {\n if (!sessionId) return\n const s = ++seq.current\n rpc('edrv.list', { sessionId }).then((res) => {\n if (s !== seq.current || !res || !res.ok || !Array.isArray(res.records)) return\n setN(summarize(res.records).totalFiles)\n }).catch(() => {})\n }, [sessionId])\n\n React.useEffect(() => {\n load()\n const t = setInterval(load, 5000)\n const onRefresh = () => load()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => { clearInterval(t); window.removeEventListener('edrv:refresh', onRefresh) }\n }, [load])\n\n if (!n) return null\n\n const click = () => {\n openEditorView(null)\n setTimeout(() => { emitShowLauncher() }, 120)\n }\n\n return React.createElement('button', {\n onClick: click,\n title: n + ' 个文件有差异,点击在编辑区查看',\n style: { position: 'relative', display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 30, height: 30, padding: 0, background: 'transparent', border: 'none', borderRadius: 6, cursor: 'pointer' },\n },\n React.createElement('img', { src: '/edrv/assets/compare-select.png', alt: '差异', style: { width: 22, height: 22, display: 'block' } }),\n React.createElement('span', { style: { position: 'absolute', top: 1, right: 0, minWidth: 15, height: 15, padding: '0 3px', borderRadius: 8, background: 'var(--dsw-alias-state-warn-primary,#d97706)', color: '#fff', fontSize: 10, lineHeight: '15px', textAlign: 'center', fontWeight: 700, boxSizing: 'border-box' } }, String(n)))\n}\n","/**\n * dsh-vscode-mode client — 浏览器半入口:slot 注册 + 装配。\n * 挂点:conversation.view「文件编辑」页签(中央 Monaco 编辑器)+ header 差异角标。\n * 与 Host 通信:同源 fetch('/edrv/rpc')(shared/rpc 契约)。\n *\n * ⚠️ 跨版本 slot 装配(2026-08-21):新版 DSH 的 slots 系统要求 slot 必须由父 entry\n * 的 children table 先声明,直接 `ctx.slots.register({name:'conversation.view'})` 在\n * 声明未就绪时抛 `slot ... is not declared (a parent entry's children table must declare it)`。\n * 正确写法 = `ctx.slots.inject(name, () => ctx.slots.register(...))`:声明存在时同步\n * 执行,否则等待声明(官方 ui-conversation 自身即此模式);旧版(rc.8 及更早)同样支持,\n * 故跨版本兼容。slot 名未变:conversation.view / conversation.session.header.utilities。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport './styles/editor.css'\nimport { EditorView } from './ui/EditorView.js'\nimport { DiffBadge } from './ui/DiffBadge.js'\n\nexport const inject = ['slots', 'timer']\n\n/**\n * 装配客户端:注册中央编辑区视图与 header 差异角标。\n * @author ddj 2026年08月20号\n * @param ctx 客户端根上下文(slots + timer 服务)\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function apply(ctx: any): void {\n const schedule = (fn: () => void, ms: number) => ctx.timeout(fn, ms)\n\n // 中央「文件编辑」页签:类 VSCode 编辑器(顶部=文件页签+搜索框,差异 UI=文件底部圆角悬浮框)\n ctx.slots.inject('conversation.view', () => ctx.slots.register({\n name: 'conversation.view',\n id: 'edrv-editor',\n order: 5,\n label: '文件编辑',\n inject: (sessionId: string) => ({ sessionId }),\n }, (props: unknown) => React.createElement(EditorView, Object.assign({}, props, { schedule }))))\n\n // header 差异角标:仅当前工作区存在差异时渲染\n ctx.slots.inject('conversation.session.header.utilities', () => ctx.slots.register(\n { name: 'conversation.session.header.utilities', id: 'edrv-diff-badge', order: 90, label: '差异' },\n (props: unknown) => React.createElement(DiffBadge, Object.assign({}, props)),\n ))\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/client/index.ts
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
* dsh-vscode-mode client — 浏览器半入口:slot 注册 + 装配。
|
|
3
3
|
* 挂点:conversation.view「文件编辑」页签(中央 Monaco 编辑器)+ header 差异角标。
|
|
4
4
|
* 与 Host 通信:同源 fetch('/edrv/rpc')(shared/rpc 契约)。
|
|
5
|
+
*
|
|
6
|
+
* ⚠️ 跨版本 slot 装配(2026-08-21):新版 DSH 的 slots 系统要求 slot 必须由父 entry
|
|
7
|
+
* 的 children table 先声明,直接 `ctx.slots.register({name:'conversation.view'})` 在
|
|
8
|
+
* 声明未就绪时抛 `slot ... is not declared (a parent entry's children table must declare it)`。
|
|
9
|
+
* 正确写法 = `ctx.slots.inject(name, () => ctx.slots.register(...))`:声明存在时同步
|
|
10
|
+
* 执行,否则等待声明(官方 ui-conversation 自身即此模式);旧版(rc.8 及更早)同样支持,
|
|
11
|
+
* 故跨版本兼容。slot 名未变:conversation.view / conversation.session.header.utilities。
|
|
5
12
|
* 作者 ddj 2026-08-20
|
|
6
13
|
*/
|
|
7
14
|
import React from 'react'
|
|
@@ -21,17 +28,17 @@ export function apply(ctx: any): void {
|
|
|
21
28
|
const schedule = (fn: () => void, ms: number) => ctx.timeout(fn, ms)
|
|
22
29
|
|
|
23
30
|
// 中央「文件编辑」页签:类 VSCode 编辑器(顶部=文件页签+搜索框,差异 UI=文件底部圆角悬浮框)
|
|
24
|
-
ctx.slots.register({
|
|
31
|
+
ctx.slots.inject('conversation.view', () => ctx.slots.register({
|
|
25
32
|
name: 'conversation.view',
|
|
26
33
|
id: 'edrv-editor',
|
|
27
34
|
order: 5,
|
|
28
35
|
label: '文件编辑',
|
|
29
36
|
inject: (sessionId: string) => ({ sessionId }),
|
|
30
|
-
}, (props: unknown) => React.createElement(EditorView, Object.assign({}, props, { schedule })))
|
|
37
|
+
}, (props: unknown) => React.createElement(EditorView, Object.assign({}, props, { schedule }))))
|
|
31
38
|
|
|
32
39
|
// header 差异角标:仅当前工作区存在差异时渲染
|
|
33
|
-
ctx.slots.register(
|
|
40
|
+
ctx.slots.inject('conversation.session.header.utilities', () => ctx.slots.register(
|
|
34
41
|
{ name: 'conversation.session.header.utilities', id: 'edrv-diff-badge', order: 90, label: '差异' },
|
|
35
42
|
(props: unknown) => React.createElement(DiffBadge, Object.assign({}, props)),
|
|
36
|
-
)
|
|
43
|
+
))
|
|
37
44
|
}
|
|
@@ -55,7 +55,10 @@ export function EditorView(props) {
|
|
|
55
55
|
const lineRegionMapRef = React.useRef(new Map()) // 行 → 区域 映射(hover 命中)
|
|
56
56
|
const hoverKeyRef = React.useRef(null) // 当前 hover 区域 key(区域不变不重渲染)
|
|
57
57
|
const hoverTopRef = React.useRef(null) // 当前 hover 浮窗 top(滚动后位置变化才重定位)
|
|
58
|
+
const hoverRightRef = React.useRef(null) // 浮窗右侧避让 Monaco 缩略栏
|
|
58
59
|
const hideTimerRef = React.useRef(null) // 延迟隐藏计时器(防闪烁)
|
|
60
|
+
const hoverEditorRef = React.useRef(false) // 鼠标是否仍在编辑器命中区
|
|
61
|
+
const hoverPanelRef = React.useRef(false) // 鼠标是否已进入 Keep/Undo 浮层
|
|
59
62
|
const batchBusyRef = React.useRef(false) // 批量 Keep All/Undo All 防重入
|
|
60
63
|
const diffRendererRef = React.useRef(null)
|
|
61
64
|
if (!diffRendererRef.current) diffRendererRef.current = createDiffRenderer((sid, t) => dbg(sid, t))
|
|
@@ -292,29 +295,34 @@ export function EditorView(props) {
|
|
|
292
295
|
// 防闪烁:① 区域不变不 setState(浮窗锚定差异块起始行,不跟随鼠标);② 延迟隐藏;
|
|
293
296
|
// ③ 浮窗自身 onMouseEnter 取消隐藏计时(鼠标在浮窗与编辑器间移动不闪)。
|
|
294
297
|
const hideSoon = () => {
|
|
295
|
-
if (hideTimerRef.current) return
|
|
298
|
+
if (hoverEditorRef.current || hoverPanelRef.current || hideTimerRef.current) return
|
|
296
299
|
hideTimerRef.current = setTimeout(() => {
|
|
297
300
|
hideTimerRef.current = null
|
|
301
|
+
if (hoverEditorRef.current || hoverPanelRef.current) return
|
|
298
302
|
hoverKeyRef.current = null
|
|
299
303
|
hoverTopRef.current = null
|
|
300
304
|
setHoverAct(null)
|
|
301
305
|
}, 180)
|
|
302
306
|
}
|
|
303
307
|
ed.onMouseMove((e) => {
|
|
308
|
+
hoverEditorRef.current = true
|
|
304
309
|
const line = e?.target?.position?.lineNumber
|
|
305
310
|
const map = lineRegionMapRef.current
|
|
306
|
-
if (!line || !map.size) { hideSoon(); return }
|
|
311
|
+
if (!line || !map.size) { hoverEditorRef.current = false; hideSoon(); return }
|
|
307
312
|
const hit = map.get(line)
|
|
308
|
-
if (!hit) { hideSoon(); return }
|
|
313
|
+
if (!hit) { hoverEditorRef.current = false; hideSoon(); return }
|
|
309
314
|
const key = callIdAttr(hit.callId, hit.idx)
|
|
310
315
|
const top = Math.max(0, ed.getTopForLineNumber(Math.max(1, hit.start)) - ed.getScrollTop())
|
|
311
|
-
|
|
316
|
+
const layout = ed.getLayoutInfo()
|
|
317
|
+
const minimapLeft = layout.minimap?.minimapLeft || 0
|
|
318
|
+
const right = minimapLeft > 0 ? Math.max(12, layout.width - minimapLeft + 8) : Math.max(12, layout.verticalScrollbarWidth + 8)
|
|
319
|
+
if (hoverKeyRef.current === key && hoverTopRef.current === top && hoverRightRef.current === right) return // 同区域同位置不重复更新
|
|
312
320
|
hoverKeyRef.current = key
|
|
313
321
|
hoverTopRef.current = top
|
|
322
|
+
hoverRightRef.current = right
|
|
314
323
|
if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }
|
|
315
|
-
setHoverAct({ region: hit, top })
|
|
324
|
+
setHoverAct({ region: hit, top, right })
|
|
316
325
|
})
|
|
317
|
-
ed.onMouseLeave(hideSoon)
|
|
318
326
|
editorRef.current = ed
|
|
319
327
|
}, [])
|
|
320
328
|
|
|
@@ -372,6 +380,20 @@ export function EditorView(props) {
|
|
|
372
380
|
refreshRecords()
|
|
373
381
|
}
|
|
374
382
|
|
|
383
|
+
/**
|
|
384
|
+
* 关闭当前差异浮窗并清理 hover 锚点。
|
|
385
|
+
* @author ddj 2026年08月21号
|
|
386
|
+
*/
|
|
387
|
+
const dismissHover = () => {
|
|
388
|
+
hoverKeyRef.current = null
|
|
389
|
+
hoverTopRef.current = null
|
|
390
|
+
hoverRightRef.current = null
|
|
391
|
+
hoverEditorRef.current = false
|
|
392
|
+
hoverPanelRef.current = false
|
|
393
|
+
if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }
|
|
394
|
+
setHoverAct(null)
|
|
395
|
+
}
|
|
396
|
+
|
|
375
397
|
/**
|
|
376
398
|
* 对单个差异区域执行采纳/不采纳。
|
|
377
399
|
* @author ddj 2026年08月20号
|
|
@@ -524,12 +546,23 @@ export function EditorView(props) {
|
|
|
524
546
|
const hoverEl = (hoverAct && !launcherOpen)
|
|
525
547
|
? React.createElement('div', {
|
|
526
548
|
className: 'edrv-hoveract',
|
|
527
|
-
style: { top: hoverAct.top, right: 12 },
|
|
528
|
-
onMouseEnter: () => { if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },
|
|
529
|
-
|
|
549
|
+
style: { top: hoverAct.top, right: hoverAct.right ?? 12 },
|
|
550
|
+
onMouseEnter: () => { hoverPanelRef.current = true; if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },
|
|
551
|
+
onMouseMove: () => { hoverPanelRef.current = true; if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },
|
|
552
|
+
onMouseLeave: () => {
|
|
553
|
+
hoverPanelRef.current = false
|
|
554
|
+
if (hoverEditorRef.current || hideTimerRef.current) return
|
|
555
|
+
hideTimerRef.current = setTimeout(() => {
|
|
556
|
+
hideTimerRef.current = null
|
|
557
|
+
if (hoverEditorRef.current || hoverPanelRef.current) return
|
|
558
|
+
hoverKeyRef.current = null
|
|
559
|
+
hoverTopRef.current = null
|
|
560
|
+
setHoverAct(null)
|
|
561
|
+
}, 420)
|
|
562
|
+
},
|
|
530
563
|
},
|
|
531
|
-
React.createElement('button', { className: 'edrv-pill edrv-pill-keep', onClick: () => actHunk(hoverAct.region, false) }, '✓ Keep'),
|
|
532
|
-
React.createElement('button', { className: 'edrv-pill edrv-pill-undo', onClick: () => actHunk(hoverAct.region, true) }, '↩ Undo'))
|
|
564
|
+
React.createElement('button', { className: 'edrv-pill edrv-pill-keep', onClick: () => { dismissHover(); actHunk(hoverAct.region, false) } }, '✓ Keep'),
|
|
565
|
+
React.createElement('button', { className: 'edrv-pill edrv-pill-undo', onClick: () => { dismissHover(); actHunk(hoverAct.region, true) } }, '↩ Undo'))
|
|
533
566
|
: null
|
|
534
567
|
|
|
535
568
|
const overlay = launcherOpen
|