dsh-coding-sidebar 1.0.2 → 1.0.4

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.
Files changed (96) hide show
  1. package/README.md +27 -42
  2. package/lib/client-editor.js +449 -4278
  3. package/lib/client-registry.js +641 -1343
  4. package/lib/client-terminal.js +172 -262
  5. package/lib/client.js +645 -1347
  6. package/lib/index.js +24 -122
  7. package/lib/types/bundle-route.d.ts +1 -1
  8. package/lib/types/client/SideCardSection.d.ts +3 -3
  9. package/lib/types/client/TextEditor.d.ts +20 -10
  10. package/lib/types/client/add-plugin-modal.d.ts +0 -4
  11. package/lib/types/client/api.d.ts +8 -11
  12. package/lib/types/client/builtins/index.d.ts +10 -10
  13. package/lib/types/client/chunk-loader.d.ts +7 -8
  14. package/lib/types/client/locales.d.ts +0 -26
  15. package/lib/types/client/native-avoid.d.ts +2 -0
  16. package/lib/types/client/plugins-shared.d.ts +6 -6
  17. package/lib/types/client/service.d.ts +13 -83
  18. package/lib/types/context-types.d.ts +19 -10
  19. package/lib/types/index.d.ts +1 -1
  20. package/lib/types/prefs-shared.d.ts +1 -24
  21. package/package.json +26 -30
  22. package/src/bundle-route.ts +1 -1
  23. package/src/client/EditorHost.tsx +52 -122
  24. package/src/client/SandboxStatusBar.tsx +12 -9
  25. package/src/client/SideCardSection.module.css +2 -2
  26. package/src/client/SideCardSection.tsx +28 -81
  27. package/src/client/SideChatView.module.css +12 -12
  28. package/src/client/TextEditor.tsx +89 -266
  29. package/src/client/add-plugin-modal.tsx +16 -24
  30. package/src/client/api.ts +1 -25
  31. package/src/client/builtins/index.ts +10 -14
  32. package/src/client/chunk-loader.ts +7 -8
  33. package/src/client/index.tsx +12 -3
  34. package/src/client/locales-ar.ts +0 -6
  35. package/src/client/locales-de.ts +0 -6
  36. package/src/client/locales-fr.ts +0 -6
  37. package/src/client/locales-hi.ts +0 -6
  38. package/src/client/locales-id.ts +0 -6
  39. package/src/client/locales-it.ts +0 -6
  40. package/src/client/locales-ja.ts +0 -6
  41. package/src/client/locales-ko.ts +0 -6
  42. package/src/client/locales-nl.ts +0 -6
  43. package/src/client/locales-pl.ts +0 -6
  44. package/src/client/locales-pt.ts +0 -6
  45. package/src/client/locales-ru.ts +0 -6
  46. package/src/client/locales-sv.ts +0 -6
  47. package/src/client/locales-th.ts +0 -6
  48. package/src/client/locales-tr.ts +0 -6
  49. package/src/client/locales-vi.ts +0 -6
  50. package/src/client/locales-zh-HK.ts +0 -6
  51. package/src/client/locales-zh-MO.ts +0 -6
  52. package/src/client/locales-zh-TW.ts +0 -6
  53. package/src/client/locales.ts +0 -52
  54. package/src/client/native-avoid.ts +155 -0
  55. package/src/client/plugins-shared.ts +6 -6
  56. package/src/client/prefs.ts +0 -7
  57. package/src/client/service.ts +13 -150
  58. package/src/client/sidebar.module.css +1 -425
  59. package/src/config.ts +1 -4
  60. package/src/context-types.ts +12 -7
  61. package/src/index.ts +12 -78
  62. package/src/jobs-routes.ts +3 -2
  63. package/src/prefs-shared.ts +1 -27
  64. package/src/sidechat-routes.ts +13 -8
  65. package/src/subagent-live-route.ts +2 -1
  66. package/lib/client-mermaid.js +0 -200753
  67. package/lib/types/client/MarkdownHtml.d.ts +0 -32
  68. package/lib/types/client/PdfView.d.ts +0 -6
  69. package/lib/types/client/builtins/viewers.d.ts +0 -3
  70. package/lib/types/client/chunks/mermaid.d.ts +0 -10
  71. package/lib/types/client/editor-load.d.ts +0 -66
  72. package/lib/types/client/image-types.d.ts +0 -3
  73. package/lib/types/client/markdown-html.d.ts +0 -96
  74. package/lib/types/client/markdown-images.d.ts +0 -45
  75. package/lib/types/client/md-toc.d.ts +0 -4
  76. package/lib/types/client/mermaid-blocks.d.ts +0 -47
  77. package/lib/types/client/mermaid-sanitize.d.ts +0 -2
  78. package/lib/types/client/mermaid.d.ts +0 -12
  79. package/lib/types/client/pdf-types.d.ts +0 -2
  80. package/lib/types/client/plugins-viewers.d.ts +0 -3
  81. package/lib/types/html-route.d.ts +0 -59
  82. package/src/client/MarkdownHtml.tsx +0 -296
  83. package/src/client/PdfView.tsx +0 -110
  84. package/src/client/builtins/viewers.tsx +0 -125
  85. package/src/client/chunks/mermaid.tsx +0 -10
  86. package/src/client/editor-load.ts +0 -92
  87. package/src/client/image-types.ts +0 -8
  88. package/src/client/markdown-html.ts +0 -331
  89. package/src/client/markdown-images.ts +0 -137
  90. package/src/client/md-toc.tsx +0 -127
  91. package/src/client/mermaid-blocks.ts +0 -110
  92. package/src/client/mermaid-sanitize.ts +0 -93
  93. package/src/client/mermaid.tsx +0 -406
  94. package/src/client/pdf-types.ts +0 -4
  95. package/src/client/plugins-viewers.ts +0 -30
  96. package/src/html-route.ts +0 -106
@@ -58,15 +58,12 @@ window.__ModuleLoader__.load({
58
58
  customCss: "",
59
59
  titleBarCompat: false,
60
60
  titleBarStripPx: 40,
61
- htmlViewerNoSandbox: false,
62
- htmlViewerDefaultUnsafe: false,
63
61
  browserNoSandbox: false,
64
62
  browserInterceptLinks: true,
65
63
  browserInterceptHttp: true,
66
64
  browserInterceptHttps: false,
67
65
  browserAllowedLoopback: "",
68
66
  tabsEnabled: {},
69
- viewersEnabled: {},
70
67
  pluginSettings: {}
71
68
  };
72
69
  /** Clamp one width percent into the contract range (shared by schema and client reads). */
@@ -1302,14 +1299,139 @@ window.__ModuleLoader__.load({
1302
1299
  return new SidebarStore();
1303
1300
  }
1304
1301
  //#endregion
1305
- //#region src/client/service.ts
1306
- /** Extract the lowercase extension without leading dot from a path. */
1307
- function extOfPath(path) {
1308
- const at = path.lastIndexOf(".");
1309
- if (at === -1) return "";
1310
- const base = path.slice(at + 1).toLowerCase();
1311
- return base.includes("/") || base.includes("\\") ? "" : base;
1302
+ //#region src/client/native-avoid.ts
1303
+ /**
1304
+ * Native-sidebar avoidance: when the DSH shell's own sidebar expands to its
1305
+ * wide form, an expanded sidebar panel would crowd the page into several
1306
+ * columns — so the panel yields (collapses; the fact that WE collapsed it
1307
+ * is remembered) and restores when the native sidebar returns to its rail.
1308
+ *
1309
+ * Detection: the host exposes no programmable open/close event — the
1310
+ * `settings.trigger` slot's `{ wide }` owner prop is pushed only to the
1311
+ * slot's occupant, and that slot is single-masked (occupying it would take
1312
+ * over the settings button). But the shell stamps every slot outlet with
1313
+ * `data-slot="<key>"` (the conversation package's own CSS targets
1314
+ * `[data-slot=conversation\.session]`), and the native sidebar hosts the
1315
+ * `sidebar.*` slots — its documented collapsed form is a 56px icon rail,
1316
+ * the expanded form a full column. So: watch the first
1317
+ * `[data-slot^="sidebar."]` element with a ResizeObserver; width > 80px
1318
+ * means expanded. No anchor (older host, attribute renamed) → the feature
1319
+ * stays inert.
1320
+ *
1321
+ * The yield rides the regular `panelOpen` state (same contract as every
1322
+ * other collapse: the toggle button, content-open auto-expansion and the
1323
+ * per-session persistence all keep working). A panel transition we did not
1324
+ * apply — the user reopening the panel, or a content open expanding it —
1325
+ * hands ownership back (no restore on native close); a session switch
1326
+ * re-runs the rule against the newly active session.
1327
+ */
1328
+ /** The documented rail is 56px; anything wider is an expanded sidebar. */
1329
+ const RAIL_MAX_WIDTH = 80;
1330
+ /** The native sidebar's slot outlets (sidebar.settings and siblings). */
1331
+ const ANCHOR_SELECTOR = "[data-slot^=\"sidebar.\"]";
1332
+ function installNativeSidebarAvoidance(store) {
1333
+ if (typeof ResizeObserver === "undefined" || typeof MutationObserver === "undefined" || typeof document === "undefined" || document.body === null) return () => {};
1334
+ let disposed = false;
1335
+ /** null until the anchor is found and measured (unknown = never act). */
1336
+ let nativeWide = null;
1337
+ /** The currently open panel was collapsed by US (restore on native close). */
1338
+ let yielded = false;
1339
+ /** Guards the store subscription: the in-flight reduce is ours. */
1340
+ let applying = false;
1341
+ let lastSeenOpen = null;
1342
+ let lastSessionId;
1343
+ const snapshotOpen = () => store.getSnapshot().state?.panelOpen === true;
1344
+ /** Apply the avoidance rule for the current native-sidebar state. */
1345
+ const reevaluate = () => {
1346
+ if (disposed || nativeWide === null) return;
1347
+ if (nativeWide && !yielded && snapshotOpen()) {
1348
+ yielded = true;
1349
+ applying = true;
1350
+ store.reduce(togglePanel);
1351
+ } else if (!nativeWide && yielded) {
1352
+ yielded = false;
1353
+ if (snapshotOpen()) return;
1354
+ applying = true;
1355
+ store.reduce(togglePanel);
1356
+ }
1357
+ };
1358
+ lastSeenOpen = snapshotOpen();
1359
+ lastSessionId = store.getSnapshot().sessionId;
1360
+ const unsubscribe = store.subscribe(() => {
1361
+ if (disposed) return;
1362
+ const snapshot = store.getSnapshot();
1363
+ const open = snapshotOpen();
1364
+ if (applying) {
1365
+ applying = false;
1366
+ lastSeenOpen = open;
1367
+ lastSessionId = snapshot.sessionId;
1368
+ return;
1369
+ }
1370
+ if (snapshot.sessionId !== lastSessionId) {
1371
+ lastSessionId = snapshot.sessionId;
1372
+ lastSeenOpen = open;
1373
+ reevaluate();
1374
+ return;
1375
+ }
1376
+ if (open !== lastSeenOpen) {
1377
+ lastSeenOpen = open;
1378
+ if (yielded && open) yielded = false;
1379
+ }
1380
+ });
1381
+ let resizeObserver = null;
1382
+ let finder = null;
1383
+ const applyWidth = (width) => {
1384
+ const wide = width > RAIL_MAX_WIDTH;
1385
+ if (wide !== nativeWide) {
1386
+ nativeWide = wide;
1387
+ reevaluate();
1388
+ }
1389
+ };
1390
+ const watch = (element) => {
1391
+ resizeObserver = new ResizeObserver(() => {
1392
+ if (!element.isConnected) {
1393
+ resizeObserver?.disconnect();
1394
+ resizeObserver = null;
1395
+ nativeWide = null;
1396
+ startSearch();
1397
+ return;
1398
+ }
1399
+ applyWidth(element.getBoundingClientRect().width);
1400
+ });
1401
+ resizeObserver.observe(element);
1402
+ applyWidth(element.getBoundingClientRect().width);
1403
+ };
1404
+ const startSearch = () => {
1405
+ const found = document.querySelector(ANCHOR_SELECTOR);
1406
+ if (found !== null) {
1407
+ watch(found);
1408
+ return;
1409
+ }
1410
+ finder = new MutationObserver(() => {
1411
+ const element = document.querySelector(ANCHOR_SELECTOR);
1412
+ if (element !== null) {
1413
+ finder?.disconnect();
1414
+ finder = null;
1415
+ watch(element);
1416
+ }
1417
+ });
1418
+ finder.observe(document.body, {
1419
+ childList: true,
1420
+ subtree: true
1421
+ });
1422
+ };
1423
+ startSearch();
1424
+ return () => {
1425
+ disposed = true;
1426
+ unsubscribe();
1427
+ resizeObserver?.disconnect();
1428
+ resizeObserver = null;
1429
+ finder?.disconnect();
1430
+ finder = null;
1431
+ };
1312
1432
  }
1433
+ //#endregion
1434
+ //#region src/client/service.ts
1313
1435
  /** The file name of a path (both separators). */
1314
1436
  function baseNameOf(path) {
1315
1437
  const at = Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\"));
@@ -1340,7 +1462,7 @@ window.__ModuleLoader__.load({
1340
1462
  if (claimed) return tab;
1341
1463
  }
1342
1464
  }
1343
- const SIDEBAR_SERVICE_VERSION = "1.0.2";
1465
+ const SIDEBAR_SERVICE_VERSION = "1.0.4";
1344
1466
  /**
1345
1467
  * Monotonic capability list consumers use to gate new API usage (features
1346
1468
  * are never removed). Each string names a v0.12.0+ capability:
@@ -1381,12 +1503,11 @@ window.__ModuleLoader__.load({
1381
1503
  }
1382
1504
  /**
1383
1505
  * Create one BetterSidebar service bound to a store. The service owns the
1384
- * tab/viewer registries (Map + listener set) and proxies openTab/closeTab
1506
+ * tab registry (Map + listener set) and proxies openTab/closeTab
1385
1507
  * to the store's reducer. One instance per client plugin activation.
1386
1508
  */
1387
1509
  function createBetterSidebarService(store) {
1388
1510
  const tabs = /* @__PURE__ */ new Map();
1389
- const viewers = /* @__PURE__ */ new Map();
1390
1511
  const listeners = /* @__PURE__ */ new Set();
1391
1512
  const notify = () => {
1392
1513
  for (const fn of [...listeners]) fn();
@@ -1408,36 +1529,9 @@ window.__ModuleLoader__.load({
1408
1529
  }
1409
1530
  };
1410
1531
  };
1411
- const registerFileViewer = (descriptor) => {
1412
- if (viewers.has(descriptor.id)) throw new Error(`[dsh-coding-sidebar] file viewer "${descriptor.id}" already registered`);
1413
- viewers.set(descriptor.id, descriptor);
1414
- notify();
1415
- return () => {
1416
- if (viewers.get(descriptor.id) === descriptor) {
1417
- viewers.delete(descriptor.id);
1418
- notify();
1419
- }
1420
- };
1421
- };
1422
1532
  const getTabs = () => Array.from(tabs.values());
1423
- const getFileViewers = () => Array.from(viewers.values());
1424
1533
  const getTab = (id) => tabs.get(id);
1425
1534
  const isTabEnabled = (id) => store.getPrefs().tabsEnabled[id] !== false;
1426
- const isViewerEnabled = (id) => store.getPrefs().viewersEnabled[id] !== false;
1427
- const matchFileViewer = (path, head) => {
1428
- const ext = extOfPath(path);
1429
- for (const v of Array.from(viewers.values()).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))) {
1430
- if (!isViewerEnabled(v.id)) continue;
1431
- if (head !== void 0 && v.detect !== void 0) {
1432
- if (v.detect(path, head)) return v;
1433
- if (v.exts.length === 0) continue;
1434
- } else if (v.exts.length === 0) {
1435
- if (v.detect === void 0) return v;
1436
- continue;
1437
- }
1438
- if (v.exts.includes(ext)) return v;
1439
- }
1440
- };
1441
1535
  const openTab = (seed, scope) => {
1442
1536
  if (!isTabEnabled(seed.type)) {
1443
1537
  console.warn(`[dsh-coding-sidebar] tab type "${seed.type}" is disabled in the side card settings`);
@@ -1571,13 +1665,9 @@ window.__ModuleLoader__.load({
1571
1665
  };
1572
1666
  return {
1573
1667
  registerTab,
1574
- registerFileViewer,
1575
1668
  getTabs,
1576
- getFileViewers,
1577
1669
  getTab,
1578
1670
  isTabEnabled,
1579
- isViewerEnabled,
1580
- matchFileViewer,
1581
1671
  openTab,
1582
1672
  closeTab: closeTab$1,
1583
1673
  subscribe,
@@ -1917,13 +2007,7 @@ window.__ModuleLoader__.load({
1917
2007
  terminalDepsHint: "DSH 環境のターミナルまたは cmd で以下のコマンドを実行して修復し、再試行してください(node-pty は DSH コアと同じバージョンを維持):",
1918
2008
  terminalDepsProfile: "(検出された profile:{profile})",
1919
2009
  preview: "プレビュー",
1920
- toc: "目次",
1921
2010
  edit: "編集",
1922
- mermaidError: "Mermaid レンダリング失敗",
1923
- mermaidZoomIn: "拡大",
1924
- mermaidZoomOut: "縮小",
1925
- mermaidZoomReset: "リセット",
1926
- mermaidZoomHint: "スクロールで拡大 ・ ドラッグで移動 ・ Esc で閉じる",
1927
2011
  refresh: "更新",
1928
2012
  showInFolder: "フォルダーで表示",
1929
2013
  refreshUnsavedConfirm: "ディスク上のファイルが変更されました。更新すると未保存の編集が失われます。続行しますか?",
@@ -2276,13 +2360,7 @@ window.__ModuleLoader__.load({
2276
2360
  terminalDepsHint: "Führen Sie den folgenden Befehl in einem Terminal oder in cmd auf dem DSH-System aus, um dies zu beheben, und klicken Sie dann auf „Erneut versuchen“ (node-pty bleibt mit der DSH-Core-Version synchron):",
2277
2361
  terminalDepsProfile: " (erkanntes Profil: {profile})",
2278
2362
  preview: "Vorschau",
2279
- toc: "Inhaltsverzeichnis",
2280
2363
  edit: "Bearbeiten",
2281
- mermaidError: "Mermaid-Rendering fehlgeschlagen",
2282
- mermaidZoomIn: "Vergrößern",
2283
- mermaidZoomOut: "Verkleinern",
2284
- mermaidZoomReset: "Zurücksetzen",
2285
- mermaidZoomHint: "Scrollen zum Zoomen · Ziehen zum Verschieben · Esc zum Schließen",
2286
2364
  refresh: "Aktualisieren",
2287
2365
  showInFolder: "Im Ordner anzeigen",
2288
2366
  refreshUnsavedConfirm: "Die Datei wurde geändert. Beim Aktualisieren gehen ungespeicherte Änderungen verloren. Fortfahren?",
@@ -2641,13 +2719,7 @@ window.__ModuleLoader__.load({
2641
2719
  terminalDepsHint: "Exécutez la commande suivante dans un terminal ou cmd de l’environnement DSH pour réparer, puis cliquez sur Réessayer (node-pty reste à la même version que le cœur DSH) :",
2642
2720
  terminalDepsProfile: " (profil détecté : {profile})",
2643
2721
  preview: "Aperçu",
2644
- toc: "Sommaire",
2645
2722
  edit: "Modifier",
2646
- mermaidError: "Échec du rendu Mermaid",
2647
- mermaidZoomIn: "Agrandir",
2648
- mermaidZoomOut: "Réduire",
2649
- mermaidZoomReset: "Réinitialiser",
2650
- mermaidZoomHint: "Molette pour zoomer · glisser pour déplacer · Échap pour fermer",
2651
2723
  refresh: "Actualiser",
2652
2724
  showInFolder: "Afficher dans le dossier",
2653
2725
  refreshUnsavedConfirm: "Le fichier a changé sur le disque. Actualiser supprimera les modifications non enregistrées. Continuer ?",
@@ -2997,13 +3069,7 @@ window.__ModuleLoader__.load({
2997
3069
  terminalDepsHint: "Execute o comando abaixo em um terminal ou cmd na máquina do DSH para reparar e tente novamente (node-pty permanece em sincronia com a versão do núcleo do DSH):",
2998
3070
  terminalDepsProfile: " (perfil detectado: {profile})",
2999
3071
  preview: "Pré-visualizar",
3000
- toc: "Sumário",
3001
3072
  edit: "Editar",
3002
- mermaidError: "Falha ao renderizar o Mermaid",
3003
- mermaidZoomIn: "Ampliar",
3004
- mermaidZoomOut: "Reduzir",
3005
- mermaidZoomReset: "Redefinir",
3006
- mermaidZoomHint: "Rolar para ampliar · arrastar para mover · Esc para fechar",
3007
3073
  refresh: "Atualizar",
3008
3074
  showInFolder: "Mostrar na pasta",
3009
3075
  refreshUnsavedConfirm: "O arquivo mudou no disco. Atualizar descartará edições não salvas. Continuar?",
@@ -3361,13 +3427,7 @@ window.__ModuleLoader__.load({
3361
3427
  terminalDepsHint: "DSH가 설치된 환경의 터미널 또는 cmd에서 아래 명령을 실행하여 복구한 후 다시 시도를 클릭하세요(node-pty는 DSH 코어와 동일한 버전을 유지합니다):",
3362
3428
  terminalDepsProfile: " (profile 감지됨: {profile})",
3363
3429
  preview: "미리보기",
3364
- toc: "목차",
3365
3430
  edit: "편집",
3366
- mermaidError: "Mermaid 렌더링 실패",
3367
- mermaidZoomIn: "확대",
3368
- mermaidZoomOut: "축소",
3369
- mermaidZoomReset: "초기화",
3370
- mermaidZoomHint: "휠로 확대/축소 · 드래그로 이동 · Esc로 닫기",
3371
3431
  refresh: "새로고침",
3372
3432
  showInFolder: "폴더에서 표시",
3373
3433
  refreshUnsavedConfirm: "디스크의 파일이 변경되었습니다. 새로고침하면 저장되지 않은 편집 내용이 손실됩니다. 계속하시겠습니까?",
@@ -3734,13 +3794,7 @@ window.__ModuleLoader__.load({
3734
3794
  terminalDepsHint: "شغّل الأمر التالي في طرفية أو cmd على جهاز DSH للإصلاح، ثم أعد المحاولة (يبقى node-pty متزامناً مع إصدار نواة DSH):",
3735
3795
  terminalDepsProfile: " (الملف الشخصي المكتشف: {profile})",
3736
3796
  preview: "معاينة",
3737
- toc: "الفهرس",
3738
3797
  edit: "تحرير",
3739
- mermaidError: "فشل رسم Mermaid",
3740
- mermaidZoomIn: "تكبير",
3741
- mermaidZoomOut: "تصغير",
3742
- mermaidZoomReset: "إعادة تعيين",
3743
- mermaidZoomHint: "العجلة للتقريب · السحب للتحريك · Esc للإغلاق",
3744
3798
  refresh: "تحديث",
3745
3799
  showInFolder: "إظهار في المجلد",
3746
3800
  refreshUnsavedConfirm: "تغيّر الملف على القرص. سيؤدي التحديث إلى فقدان التعديلات غير المحفوظة. متابعة؟",
@@ -4106,13 +4160,7 @@ window.__ModuleLoader__.load({
4106
4160
  terminalDepsHint: "DSH मशीन पर एक टर्मिनल या cmd में नीचे दिया गया कमांड चलाएँ, फिर पुनः प्रयास करें (node-pty DSH कोर संस्करण के साथ सिंक रहता है):",
4107
4161
  terminalDepsProfile: " (पहचाना गया प्रोफ़ाइल: {profile})",
4108
4162
  preview: "पूर्वावलोकन",
4109
- toc: "विषय-सूची",
4110
4163
  edit: "संपादित करें",
4111
- mermaidError: "Mermaid रेंडर विफल",
4112
- mermaidZoomIn: "ज़ूम इन",
4113
- mermaidZoomOut: "ज़ूम आउट",
4114
- mermaidZoomReset: "रीसेट",
4115
- mermaidZoomHint: "स्क्रॉल से ज़ूम · खींचें पैन करने · Esc से बंद",
4116
4164
  refresh: "ताज़ा करें",
4117
4165
  showInFolder: "फ़ोल्डर में दिखाएँ",
4118
4166
  refreshUnsavedConfirm: "डिस्क पर फ़ाइल बदल गई है। रीफ़्रेश करने पर असहेज किए गए संपादन खो जाएँगे। जारी रखें?",
@@ -4476,13 +4524,7 @@ window.__ModuleLoader__.load({
4476
4524
  terminalDepsHint: "Jalankan perintah di bawah ini di terminal atau cmd pada mesin DSH untuk memperbaikinya, lalu coba lagi (node-pty tetap sinkron dengan versi inti DSH):",
4477
4525
  terminalDepsProfile: " (profil terdeteksi: {profile})",
4478
4526
  preview: "Pratinjau",
4479
- toc: "Daftar Isi",
4480
4527
  edit: "Edit",
4481
- mermaidError: "Render Mermaid gagal",
4482
- mermaidZoomIn: "Perbesar",
4483
- mermaidZoomOut: "Perkecil",
4484
- mermaidZoomReset: "Reset",
4485
- mermaidZoomHint: "Gulir untuk zoom · seret untuk geser · Esc untuk tutup",
4486
4528
  refresh: "Segarkan",
4487
4529
  showInFolder: "Tampilkan di folder",
4488
4530
  refreshUnsavedConfirm: "File berubah di disk. Menyegarkan akan membuang edit yang belum disimpan. Lanjutkan?",
@@ -4848,13 +4890,7 @@ window.__ModuleLoader__.load({
4848
4890
  terminalDepsHint: "Onarmak için DSH makinesindeki bir terminalde veya cmd’de aşağıdaki komutu çalıştırın, sonra yeniden deneyin (node-pty, DSH çekirdek sürümüyle senkron kalır):",
4849
4891
  terminalDepsProfile: " (algılanan profil: {profile})",
4850
4892
  preview: "Önizleme",
4851
- toc: "İçindekiler",
4852
4893
  edit: "Düzenle",
4853
- mermaidError: "Mermaid oluşturma başarısız",
4854
- mermaidZoomIn: "Yakınlaştır",
4855
- mermaidZoomOut: "Uzaklaştır",
4856
- mermaidZoomReset: "Sıfırla",
4857
- mermaidZoomHint: "Yakınlaştırmak için kaydır · taşımak için sürükle · kapatmak için Esc",
4858
4894
  refresh: "Yenile",
4859
4895
  showInFolder: "Klasörde göster",
4860
4896
  refreshUnsavedConfirm: "Dosya diskte değişti. Yenileme kaydedilmemiş düzenlemeleri atar. Devam edilsin mi?",
@@ -5220,13 +5256,7 @@ window.__ModuleLoader__.load({
5220
5256
  terminalDepsHint: "Chạy lệnh sau trong terminal hoặc cmd trên máy DSH để sửa, rồi nhấn thử lại (node-pty đồng bộ phiên bản với lõi DSH):",
5221
5257
  terminalDepsProfile: " (phát hiện profile: {profile})",
5222
5258
  preview: "Xem trước",
5223
- toc: "Mục lục",
5224
5259
  edit: "Chỉnh sửa",
5225
- mermaidError: "Render Mermaid thất bại",
5226
- mermaidZoomIn: "Phóng to",
5227
- mermaidZoomOut: "Thu nhỏ",
5228
- mermaidZoomReset: "Đặt lại",
5229
- mermaidZoomHint: "Cuộn để zoom · kéo để di chuyển · Esc để đóng",
5230
5260
  refresh: "Làm mới",
5231
5261
  showInFolder: "Hiển thị trong thư mục",
5232
5262
  refreshUnsavedConfirm: "Tệp đã thay đổi trên đĩa. Làm mới sẽ loại bỏ các chỉnh sửa chưa lưu. Tiếp tục?",
@@ -5592,13 +5622,7 @@ window.__ModuleLoader__.load({
5592
5622
  terminalDepsHint: "เรียกใช้คำสั่งด้านล่างในเทอร์มินัลหรือ cmd บนเครื่อง DSH เพื่อซ่อมแซม แล้วกดลองอีกครั้ง (node-pty ต้องซิงค์กับเวอร์ชันหลักของ DSH):",
5593
5623
  terminalDepsProfile: " (ตรวจพบ profile: {profile})",
5594
5624
  preview: "พรีวิว",
5595
- toc: "สารบัญ",
5596
5625
  edit: "แก้ไข",
5597
- mermaidError: "เรนเดอร์ Mermaid ล้มเหลว",
5598
- mermaidZoomIn: "ซูมเข้า",
5599
- mermaidZoomOut: "ซูมออก",
5600
- mermaidZoomReset: "รีเซ็ต",
5601
- mermaidZoomHint: "เลื่อนเพื่อซูม · ลากเพื่อแพน · Esc เพื่อปิด",
5602
5626
  refresh: "รีเฟรช",
5603
5627
  showInFolder: "แสดงในโฟลเดอร์",
5604
5628
  refreshUnsavedConfirm: "ไฟล์เปลี่ยนบนดิสก์ การรีเฟรชจะทิ้งการแก้ไขที่ยังไม่ได้บันทึก ดำเนินการต่อหรือไม่",
@@ -5960,13 +5984,7 @@ window.__ModuleLoader__.load({
5960
5984
  terminalDepsHint: "Выполните приведённую ниже команду в терминале или cmd на машине DSH, затем нажмите «Повторить» (node-pty остаётся синхронизированным с версией ядра DSH):",
5961
5985
  terminalDepsProfile: " (обнаружен profile: {profile})",
5962
5986
  preview: "Предпросмотр",
5963
- toc: "Оглавление",
5964
5987
  edit: "Изменить",
5965
- mermaidError: "Сбой рендеринга Mermaid",
5966
- mermaidZoomIn: "Приблизить",
5967
- mermaidZoomOut: "Отдалить",
5968
- mermaidZoomReset: "Сбросить",
5969
- mermaidZoomHint: "Колесо — масштаб · перетаскивание — панорама · Esc — закрыть",
5970
5988
  refresh: "Обновить",
5971
5989
  showInFolder: "Показать в папке",
5972
5990
  refreshUnsavedConfirm: "Файл изменился на диске. Обновление отбросит несохранённые изменения. Продолжить?",
@@ -6323,13 +6341,7 @@ window.__ModuleLoader__.load({
6323
6341
  terminalDepsHint: "Esegua il comando seguente in un terminale o cmd sul computer DSH per ripristinarlo, poi riprovi (node-pty resta sincronizzato con la versione del core DSH):",
6324
6342
  terminalDepsProfile: " (rilevato profilo: {profile})",
6325
6343
  preview: "Anteprima",
6326
- toc: "Indice",
6327
6344
  edit: "Modifica",
6328
- mermaidError: "Rendering Mermaid non riuscito",
6329
- mermaidZoomIn: "Ingrandisci",
6330
- mermaidZoomOut: "Riduci",
6331
- mermaidZoomReset: "Ripristina",
6332
- mermaidZoomHint: "Scorra per zoom · trascini per panoramica · Esc per chiudere",
6333
6345
  refresh: "Aggiorna",
6334
6346
  showInFolder: "Mostra nella cartella",
6335
6347
  refreshUnsavedConfirm: "Il file è cambiato su disco. Aggiornare scarterà le modifiche non salvate. Continuare?",
@@ -6694,13 +6706,7 @@ window.__ModuleLoader__.load({
6694
6706
  terminalDepsHint: "Voer het onderstaande commando uit in een terminal of cmd op de DSH-machine om het te herstellen en probeer het opnieuw (node-pty blijft in sync met de DSH-coreversie):",
6695
6707
  terminalDepsProfile: " (gedetecteerde profile: {profile})",
6696
6708
  preview: "Voorbeeld",
6697
- toc: "Inhoudsopgave",
6698
6709
  edit: "Bewerken",
6699
- mermaidError: "Mermaid-renderen mislukt",
6700
- mermaidZoomIn: "Inzoomen",
6701
- mermaidZoomOut: "Uitzoomen",
6702
- mermaidZoomReset: "Resetten",
6703
- mermaidZoomHint: "Scrollen om te zoomen · slepen om te pannen · Esc om te sluiten",
6704
6710
  refresh: "Vernieuwen",
6705
6711
  showInFolder: "In map tonen",
6706
6712
  refreshUnsavedConfirm: "Het bestand is op schijf gewijzigd. Vernieuwen gooit niet-opgeslagen wijzigingen weg. Doorgaan?",
@@ -7050,13 +7056,7 @@ window.__ModuleLoader__.load({
7050
7056
  terminalDepsHint: "Kör kommandot nedan i en terminal eller cmd på DSH-maskinen för att reparera det, försök sedan igen (node-pty hålls synkad med DSH-kärnversionen):",
7051
7057
  terminalDepsProfile: " (upptäckt profil: {profile})",
7052
7058
  preview: "Förhandsgranska",
7053
- toc: "Innehållsförteckning",
7054
7059
  edit: "Redigera",
7055
- mermaidError: "Mermaid-rendering misslyckades",
7056
- mermaidZoomIn: "Zooma in",
7057
- mermaidZoomOut: "Zooma ut",
7058
- mermaidZoomReset: "Återställ",
7059
- mermaidZoomHint: "Rulla för att zooma · dra för att panorera · Esc för att stänga",
7060
7060
  refresh: "Uppdatera",
7061
7061
  showInFolder: "Visa i mapp",
7062
7062
  refreshUnsavedConfirm: "Filen ändrades på disken. Uppdatering kastar osparade ändringar. Fortsätta?",
@@ -7424,13 +7424,7 @@ window.__ModuleLoader__.load({
7424
7424
  terminalDepsHint: "Uruchom poniższe polecenie w terminalu lub cmd na maszynie DSH, aby to naprawić, a następnie ponów (node-pty pozostaje w synchronizacji z wersją rdzenia DSH):",
7425
7425
  terminalDepsProfile: " (wykryty profil: {profile})",
7426
7426
  preview: "Podgląd",
7427
- toc: "Spis treści",
7428
7427
  edit: "Edytuj",
7429
- mermaidError: "Renderowanie Mermaid nie powiodło się",
7430
- mermaidZoomIn: "Powiększ",
7431
- mermaidZoomOut: "Pomniejsz",
7432
- mermaidZoomReset: "Resetuj",
7433
- mermaidZoomHint: "Kółko: powiększenie · przeciąganie: panowanie · Esc: zamknięcie",
7434
7428
  refresh: "Odśwież",
7435
7429
  showInFolder: "Pokaż w folderze",
7436
7430
  refreshUnsavedConfirm: "Plik zmienił się na dysku. Odświeżenie odrzuci niezapisane zmiany. Kontynuować?",
@@ -7811,13 +7805,7 @@ window.__ModuleLoader__.load({
7811
7805
  terminalDepsHint: "在 DSH 所在環境的終端或 cmd 中執行以下命令修復,然後點重試(node-pty 與 DSH 核心保持同一版本):",
7812
7806
  terminalDepsProfile: "(偵測到 profile:{profile})",
7813
7807
  preview: "預覽",
7814
- toc: "目錄",
7815
7808
  edit: "編輯",
7816
- mermaidError: "Mermaid 渲染失敗",
7817
- mermaidZoomIn: "放大",
7818
- mermaidZoomOut: "縮小",
7819
- mermaidZoomReset: "重設",
7820
- mermaidZoomHint: "滾輪縮放 · 拖曳平移 · Esc 關閉",
7821
7809
  refresh: "重新整理",
7822
7810
  showInFolder: "在文件夾中顯示",
7823
7811
  refreshUnsavedConfirm: "檔案已在磁碟上變更。重新整理會丟失尚未儲存的編輯。繼續?",
@@ -8198,13 +8186,7 @@ window.__ModuleLoader__.load({
8198
8186
  terminalDepsHint: "在 DSH 所在環境的終端或 cmd 中執行以下命令修復,然後點重試(node-pty 與 DSH 核心保持同一版本):",
8199
8187
  terminalDepsProfile: "(偵測到 profile:{profile})",
8200
8188
  preview: "預覽",
8201
- toc: "目錄",
8202
8189
  edit: "編輯",
8203
- mermaidError: "Mermaid 渲染失敗",
8204
- mermaidZoomIn: "放大",
8205
- mermaidZoomOut: "縮小",
8206
- mermaidZoomReset: "重設",
8207
- mermaidZoomHint: "滾輪縮放 · 拖曳平移 · Esc 關閉",
8208
8190
  refresh: "重新整理",
8209
8191
  showInFolder: "在資料夾中顯示",
8210
8192
  refreshUnsavedConfirm: "檔案已在磁碟上變更。重新整理會丟失尚未儲存的編輯。繼續?",
@@ -8585,13 +8567,7 @@ window.__ModuleLoader__.load({
8585
8567
  terminalDepsHint: "在 DSH 所在環境的終端或 cmd 中執行以下命令修復,然後點重試(node-pty 與 DSH 核心保持同一版本):",
8586
8568
  terminalDepsProfile: "(偵測到 profile:{profile})",
8587
8569
  preview: "預覽",
8588
- toc: "目錄",
8589
8570
  edit: "編輯",
8590
- mermaidError: "Mermaid 渲染失敗",
8591
- mermaidZoomIn: "放大",
8592
- mermaidZoomOut: "縮小",
8593
- mermaidZoomReset: "重設",
8594
- mermaidZoomHint: "滾輪縮放 · 拖曳平移 · Esc 關閉",
8595
8571
  refresh: "重新整理",
8596
8572
  showInFolder: "在文件夾中顯示",
8597
8573
  refreshUnsavedConfirm: "檔案已在磁碟上變更。重新整理會丟失尚未儲存的編輯。繼續?",
@@ -8963,14 +8939,6 @@ window.__ModuleLoader__.load({
8963
8939
  terminalDepsFailed: "终端依赖 node-pty 加载失败",
8964
8940
  terminalDepsHint: "在 DSH 所在环境的终端或 cmd 中执行以下命令修复,然后点重试(node-pty 与 DSH 核心保持同一版本):",
8965
8941
  terminalDepsProfile: "(检测到 profile:{profile})",
8966
- preview: "预览",
8967
- toc: "目录",
8968
- edit: "编辑",
8969
- mermaidError: "Mermaid 渲染失败",
8970
- mermaidZoomIn: "放大",
8971
- mermaidZoomOut: "缩小",
8972
- mermaidZoomReset: "重置",
8973
- mermaidZoomHint: "滚轮缩放 · 拖拽平移 · Esc 关闭",
8974
8942
  refresh: "刷新",
8975
8943
  refreshUnsavedConfirm: "文件已在磁盘更新,刷新将丢弃未保存编辑。继续吗?",
8976
8944
  save: "保存",
@@ -9113,16 +9081,8 @@ window.__ModuleLoader__.load({
9113
9081
  settingsShellArgsDesc: "显式 shell 启动参数,空格分隔;非空时完全替换默认参数(与 yaml 的 shellArgs 契约一致)",
9114
9082
  settingsShellArgsPlaceholder: "如 -l(留空用默认参数)",
9115
9083
  settingsTabsTitle: "侧边栏内容",
9116
- settingsViewersTitle: "文件预览",
9117
9084
  settingsGeneralTitle: "常规",
9118
9085
  settingsPopup: "功能设置",
9119
- settingsViewerCatchAll: "兜底:任意文件",
9120
- viewerImage: "图片",
9121
- viewerPdf: "PDF",
9122
- viewerMarkdown: "Markdown",
9123
- viewerCode: "代码",
9124
- viewerBinary: "二进制下载",
9125
- viewerHtml: "HTML",
9126
9086
  browser: "浏览器",
9127
9087
  browserPlaceholder: "输入网址,例如 example.com",
9128
9088
  browserGo: "前往",
@@ -9133,14 +9093,9 @@ window.__ModuleLoader__.load({
9133
9093
  browserBlockedLoopback: "已阻止:不允许在浏览器中访问本机或内部地址",
9134
9094
  browserInvalid: "无效的网址",
9135
9095
  browserNoSandboxWarning: "沙箱已关闭:当前页面与界面同源,拥有完整会话权限(可在设置中恢复)",
9136
- htmlNoSandboxWarning: "沙箱已关闭:此 HTML 与界面同源,可读取会话文件与内部接口(可在设置中恢复)",
9137
9096
  sandboxStatusOn: "沙箱模式:已启用 · 页面无法访问界面数据与本地文件,登录态与第三方 Cookie 可能不可用",
9138
9097
  sandboxUnlock: "临时解锁(不安全)",
9139
9098
  sandboxRestore: "恢复沙箱",
9140
- settingsHtmlDefaultUnsafeTitle: "HTML 预览默认以非沙箱模式打开(不安全)",
9141
- settingsHtmlDefaultUnsafeDesc: "开启后,每次打开 HTML 文件时预览默认处于非沙箱状态(与界面同源,可读取会话文件与内部接口);可在状态行临时恢复沙箱",
9142
- settingsHtmlSandboxTitle: "关闭 HTML 预览沙箱(不安全)",
9143
- settingsHtmlSandboxDesc: "关闭后,预览的 HTML 将与界面同源运行,可读取会话文件、本地存储并调用内部接口。仅对完全可信的文件开启",
9144
9099
  settingsBrowserSandboxTitle: "关闭浏览器沙箱(不安全)",
9145
9100
  settingsBrowserSandboxDesc: "关闭后,访问的任何网站都将与界面同源运行,可读取会话数据并冒充你的登录状态。仅对完全可信的站点开启",
9146
9101
  settingsBrowserLinksTitle: "聊天区外链在侧边栏打开",
@@ -9221,10 +9176,7 @@ window.__ModuleLoader__.load({
9221
9176
  jobKillError: "终止失败",
9222
9177
  addPluginsTabCard: "添加 Tab 插件",
9223
9178
  addPluginsTabCardDesc: "注册新的侧边栏页面",
9224
- addPluginsViewerCard: "添加预览插件",
9225
- addPluginsViewerCardDesc: "注册新的文件类型预览",
9226
9179
  addPluginsTabDesc: "侧边栏页面(Tab)可以由插件扩展。插件通过 ctx.betterSidebar 服务注册;点击「安装」复制安装命令,粘贴到 DSH 所在环境的终端执行。",
9227
- addPluginsViewerDesc: "文件预览器可以由插件扩展。插件通过 ctx.betterSidebar 服务注册;点击「安装」复制安装命令,粘贴到 DSH 所在环境的终端执行。",
9228
9180
  addPluginsBrowseMore: "在 GitHub 上浏览更多插件(topic: dsh-coding-sidebar)",
9229
9181
  addPluginsSearch: "搜索插件名称 / 描述…",
9230
9182
  addPluginsNoMatch: "没有匹配的插件",
@@ -9232,7 +9184,6 @@ window.__ModuleLoader__.load({
9232
9184
  addPluginsEmpty: "暂未收录插件,欢迎在 GitHub topic 下发布你的插件",
9233
9185
  openPlugin: "跳转",
9234
9186
  copyInstall: "复制安装命令",
9235
- pluginOfficeDesc: "为 dsh-coding-sidebar 编辑器提供 Office 三件套预览(.docx / .xlsx / .pptx),把重型 Office 渲染库拆出主包、按需安装",
9236
9187
  pluginFlowglassDesc: "实时会话流程图:三列泳道展示用户、助手与工具调用,支持并行分组、子代理支线、逐层钻取和实时状态;安装 dsh-coding-sidebar 后注册原生「流镜」Tab,未安装时保留独立抽屉",
9237
9188
  pluginGitForgeDesc: "dsh-coding-sidebar「Git 凭据」Tab:GitHub/Gitea 等 Forge 账号库 + 按项目授权 + push 策略硬拦;token 仅存本地 secrets,不进模型上下文;提供只读 GitForge 工具与 agent HTTPS credential helper",
9238
9189
  pluginGitRemotesDesc: "dsh-coding-sidebar Git 远程 Tab:看分支/上游/ahead-behind,fetch(可 prune)、ff-only pull、确认后才 push。不替换内置 Git 的暂存/提交,也不提供 force-push 或模型自动推送",
@@ -9240,7 +9191,6 @@ window.__ModuleLoader__.load({
9240
9191
  pluginSidebarQaDesc: "基于 dsh-coding-sidebar 的划选提问tab分页: 对话划选 → 右侧面板提问 → 同工作区独立追问会话(❓追问·主题):快速无思考模型压缩主对话上下文后与引文一起注入,不打断主对话;追问可嵌套、可继续、可归档",
9241
9192
  pluginSshTunnelDesc: "dsh-coding-sidebar「SSH 隧道」Tab:多机主机清单 + 按项目授权 + 密钥本地保管;模型工具 SSHManager(exec/SFTP/会话策略);中央交互终端与双栏 SFTP",
9242
9193
  pluginTurnReviewDesc: "对「刚刚这一回合」的 diff 做 Approve / Request changes 的人闸门:只审上一回合,不 fork 会话;文件按主会话/子代理/未归因分组,按文件勾选打回 + 可选评语,点文件先看回合开始快照 vs 现在的 diff。不是 /rewind",
9243
- pluginVideoPreviewDesc: "在 dsh-coding-sidebar 编辑器内联预览视频文件(.mp4/.webm/.mov/.mkv/.avi 等),自带支持 HTTP Range(206)的 /video 宿主路由,可拖动进度条、不受 20MB mediaLimit 限制",
9244
9194
  pluginDocsPanelDesc: "DSH 侧边栏里的「全局文档」:全局 Markdown 笔记,任何工作区随时可读——列表点选阅读、悬浮大纲跳转、Chrome / VS Code 外部打开、代码复制,目录可配置(默认 ~/.dsh/docs)",
9245
9195
  pluginEgoBrowserDesc: "把 CitroLabs/ego-lite 接进 DeepSeek Harness 的 agent 浏览器:32 个 ego_* 工具驱动真实 Chromium,侧边栏原生「ego 浏览器」Tab 实时观察 agent 逛的每个页面,可直接点击/拖拽/输入接管;装 dsh-coding-sidebar 时自动注册 Tab,没装则退回浮动浮窗"
9246
9196
  };
@@ -9318,14 +9268,6 @@ window.__ModuleLoader__.load({
9318
9268
  terminalDepsFailed: "Terminal dependency node-pty failed to load",
9319
9269
  terminalDepsHint: "Run the command below in a terminal or cmd on the DSH machine to repair it, then retry (node-pty stays in sync with the DSH core version):",
9320
9270
  terminalDepsProfile: " (detected profile: {profile})",
9321
- preview: "Preview",
9322
- toc: "Table of contents",
9323
- edit: "Edit",
9324
- mermaidError: "Mermaid render failed",
9325
- mermaidZoomIn: "Zoom in",
9326
- mermaidZoomOut: "Zoom out",
9327
- mermaidZoomReset: "Reset",
9328
- mermaidZoomHint: "Scroll to zoom · drag to pan · Esc to close",
9329
9271
  refresh: "Refresh",
9330
9272
  refreshUnsavedConfirm: "The file changed on disk. Refreshing will discard unsaved edits. Continue?",
9331
9273
  save: "Save",
@@ -9468,16 +9410,8 @@ window.__ModuleLoader__.load({
9468
9410
  settingsFontSizeDesc: "Terminal font size in px (9–32, default 13)",
9469
9411
  settingsFontSizeSuffix: "px",
9470
9412
  settingsTabsTitle: "Sidebar content",
9471
- settingsViewersTitle: "File viewers",
9472
9413
  settingsGeneralTitle: "General",
9473
9414
  settingsPopup: "Feature settings",
9474
- settingsViewerCatchAll: "Catch-all: any file",
9475
- viewerImage: "Image",
9476
- viewerPdf: "PDF",
9477
- viewerMarkdown: "Markdown",
9478
- viewerCode: "Code",
9479
- viewerBinary: "Binary download",
9480
- viewerHtml: "HTML",
9481
9415
  browser: "Browser",
9482
9416
  browserPlaceholder: "Enter a URL, e.g. example.com",
9483
9417
  browserGo: "Go",
@@ -9488,14 +9422,9 @@ window.__ModuleLoader__.load({
9488
9422
  browserBlockedLoopback: "Blocked: local and internal addresses cannot be browsed here",
9489
9423
  browserInvalid: "Invalid URL",
9490
9424
  browserNoSandboxWarning: "Sandbox off: the current page runs with full GUI privileges (re-enable in settings)",
9491
- htmlNoSandboxWarning: "Sandbox off: this HTML runs with full GUI privileges (re-enable in settings)",
9492
9425
  sandboxStatusOn: "Sandbox mode: on · pages cannot access the GUI's data or local files; logins and third-party cookies may not work",
9493
9426
  sandboxUnlock: "Temporarily disable (unsafe)",
9494
9427
  sandboxRestore: "Restore sandbox",
9495
- settingsHtmlDefaultUnsafeTitle: "Open HTML previews unsandboxed by default (unsafe)",
9496
- settingsHtmlDefaultUnsafeDesc: "When on, every newly opened HTML preview starts in the unsandboxed state (same origin as the GUI — it can read session files and internal APIs); the status row still offers a one-tap restore",
9497
- settingsHtmlSandboxTitle: "Disable HTML preview sandbox (unsafe)",
9498
- settingsHtmlSandboxDesc: "With the sandbox off, previewed HTML runs with the same origin as the GUI: it can read session files, local storage and call internal APIs. Only enable for fully trusted files",
9499
9428
  settingsBrowserSandboxTitle: "Disable browser sandbox (unsafe)",
9500
9429
  settingsBrowserSandboxDesc: "With the sandbox off, any visited site runs with the same origin as the GUI: it can read session data and act as your logged-in session. Only enable for fully trusted sites",
9501
9430
  settingsBrowserLinksTitle: "Open chat external links in the sidebar",
@@ -9576,10 +9505,7 @@ window.__ModuleLoader__.load({
9576
9505
  jobKillError: "Kill failed",
9577
9506
  addPluginsTabCard: "Add tab plugins",
9578
9507
  addPluginsTabCardDesc: "Register a new sidebar page",
9579
- addPluginsViewerCard: "Add preview plugins",
9580
- addPluginsViewerCardDesc: "Register a file-type preview",
9581
9508
  addPluginsTabDesc: "Sidebar pages (tabs) can be extended by plugins. Plugins register through the ctx.betterSidebar service; clicking Install copies the install command — paste it into a terminal where your DSH profile lives and run it.",
9582
- addPluginsViewerDesc: "File previewers can be extended by plugins. Plugins register through the ctx.betterSidebar service; clicking Install copies the install command — paste it into a terminal where your DSH profile lives and run it.",
9583
9509
  addPluginsBrowseMore: "Browse more plugins on GitHub (topic: dsh-coding-sidebar)",
9584
9510
  addPluginsSearch: "Search by plugin name or description…",
9585
9511
  addPluginsNoMatch: "No plugins match",
@@ -9587,7 +9513,6 @@ window.__ModuleLoader__.load({
9587
9513
  addPluginsEmpty: "No plugins curated yet — publish yours under the GitHub topic",
9588
9514
  openPlugin: "Open",
9589
9515
  copyInstall: "Copy install command",
9590
- pluginOfficeDesc: "Office-suite preview (.docx / .xlsx / .pptx) for the dsh-coding-sidebar editor, keeping the heavy Office render libraries out of the core bundle",
9591
9516
  pluginFlowglassDesc: "Live session flowgraph with three lanes for user, assistant, and tool calls, plus parallel groups, sub-agent branches, drill-down, and live status; registers a native Flowglass tab when dsh-coding-sidebar is installed and keeps its standalone drawer as a fallback",
9592
9517
  pluginGitForgeDesc: "Git Forge tab: GitHub/Gitea (and other forge) account library + per-project grants + hard push policy; tokens stay in local secrets (never in model context); read-only GitForge tool and agent HTTPS credential helper",
9593
9518
  pluginGitRemotesDesc: "Git Remotes tab: branch/upstream/ahead-behind, fetch (optional prune), ff-only pull, and push only after an in-tab confirm. Does not replace the built-in Git stage/commit tab, and does not offer force-push or a model auto-push tool",
@@ -9595,7 +9520,6 @@ window.__ModuleLoader__.load({
9595
9520
  pluginSidebarQaDesc: "Select-and-ask: Select conversation text → ask in the right-side panel → a dedicated follow-up session (❓追问) in the same workspace; a fast no-thinking model compresses the main context and injects it with the quote, without interrupting the main conversation. Follow-ups nest, continue, and archive",
9596
9521
  pluginSshTunnelDesc: "SSH Tunnel tab: multi-host inventory + per-project grants + local secrets; SSHManager tool (exec/SFTP/session strategies); center interactive terminal and dual-pane SFTP",
9597
9522
  pluginTurnReviewDesc: "A human gate on the just-finished turn: Approve / Request changes per path with an optional comment; paths grouped by main session / subagent / unattributed; inline snapshot-vs-now diff before you decide. No fork, no /rewind",
9598
- pluginVideoPreviewDesc: "Inline video preview (.mp4/.webm/.mov/.mkv/.avi etc.) for the dsh-coding-sidebar editor, backed by a dedicated /video host route with HTTP Range (206) support — scrubbing works and files are not capped by the 20MB mediaLimit",
9599
9523
  pluginDocsPanelDesc: "Global docs in the DSH sidebar: read your own Markdown notes from any workspace — a file list, an outline, open in Chrome / VS Code, and copy buttons; the docs directory is configurable (default ~/.dsh/docs)",
9600
9524
  pluginEgoBrowserDesc: "The agent browser for DeepSeek Harness: 32 ego_* tools drive a real Chromium, with a native sidebar \"ego browser\" tab giving a live view of every page the agent visits — you can click, drag, and type to take over. Registers the tab automatically when dsh-coding-sidebar is present, otherwise falls back to a floating bubble"
9601
9525
  };
@@ -9956,7 +9880,7 @@ window.__ModuleLoader__.load({
9956
9880
  }
9957
9881
  //#endregion
9958
9882
  //#region \0dsh-css:/Users/libing/kk_Projects/dsh-coding-sidebar/src/client/sidebar.module.css.mjs
9959
- const css$4 = "[data-dsh-panel-host]{z-index:25;pointer-events:none;position:fixed;inset:0;overflow:hidden}[data-dsh-panel-host][data-dsh-panel-host-degraded]{position:absolute;top:0;left:0}.S5HVoW_toggleCluster{top:calc(3px + env(safe-area-inset-top));z-index:45;pointer-events:auto;flex-direction:row;gap:4px;display:flex;position:absolute;right:10px}.S5HVoW_panel:not(.S5HVoW_panelHidden) .S5HVoW_tabBar{padding-right:72px}.S5HVoW_toggleButton{width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;transition:background var(--ds-transition-duration-slow) var(--ds-ease-in-out), color var(--ds-transition-duration-slow) var(--ds-ease-in-out);background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;display:flex}.S5HVoW_toggleButton:hover:not(:disabled):not([aria-disabled=true]){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_toggleButton:disabled,.S5HVoW_toggleButton[aria-disabled=true]{opacity:.4;cursor:default}.S5HVoW_panel{box-sizing:border-box;z-index:40;pointer-events:auto;background:var(--dsw-alias-bg-layer-1);border-left:1px solid var(--dsw-alias-border-l2);padding-bottom:env(safe-area-inset-bottom);transition:transform var(--ds-transition-duration-slow) var(--ds-ease-in-out), width var(--ds-transition-duration-slow) var(--ds-ease-in-out);flex-direction:column;display:flex;position:absolute;top:0;bottom:0;right:0}.S5HVoW_panelHidden{pointer-events:none;visibility:hidden;transition:transform var(--ds-transition-duration-slow) var(--ds-ease-in-out), width var(--ds-transition-duration-slow) var(--ds-ease-in-out), visibility 0s linear var(--ds-transition-duration-slow);transform:translate(102%)}.S5HVoW_panel[data-dragging]{transition:none}.S5HVoW_panelResize{cursor:col-resize;z-index:2;touch-action:none;width:8px;position:absolute;top:0;bottom:0;left:-4px}.S5HVoW_panelResizeActive{background:var(--dsw-alias-interactive-bg-hover-accent)}.S5HVoW_panelBody{flex:1;min-width:0;min-height:0;display:flex}.S5HVoW_panel{contain:layout style}body[data-dsh-sidebar-dragging] .S5HVoW_panel{will-change:transform}.S5HVoW_floatWindow{z-index:42;pointer-events:auto;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);box-shadow:var(--dsw-shadow-lv3);contain:layout style;border-radius:8px;flex-direction:column;display:flex;position:absolute;overflow:hidden}.S5HVoW_floatWindowDragging{will-change:left, top, width, height}.S5HVoW_floatHeader{height:34px;font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);border-bottom:1px solid var(--dsw-alias-border-l1);cursor:grab;user-select:none;flex:none;align-items:center;gap:4px;padding:0 4px 0 10px;display:flex}.S5HVoW_floatWindowDragging .S5HVoW_floatHeader{cursor:grabbing}.S5HVoW_floatTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.S5HVoW_floatClose{width:18px;height:18px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.S5HVoW_floatClose:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_floatContent{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;overflow:hidden}.S5HVoW_floatResize{z-index:2;cursor:nwse-resize;touch-action:none;width:14px;height:14px;position:absolute;bottom:0;right:0}.S5HVoW_floatResize:hover{background:var(--dsw-alias-interactive-bg-hover-accent)}.S5HVoW_pane[data-dsh-float-dock-over]{outline:2px dashed var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-2px}.S5HVoW_floatDropHint{z-index:46;pointer-events:none;border:2px dashed var(--dsw-alias-interactive-bg-hover-accent);background:color-mix(in srgb, var(--dsw-alias-interactive-bg-hover-accent) 12%, transparent);border-radius:8px;justify-content:center;align-items:center;display:flex;position:absolute}.S5HVoW_floatDropHintLabel{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);border-radius:999px;padding:4px 12px}.S5HVoW_toggleCluster,.S5HVoW_toggleButton,.S5HVoW_tabBar,.S5HVoW_floatHeader{-webkit-app-region:no-drag}body[data-dsh-title-bar-compat] .S5HVoW_toggleCluster{top:calc(var(--dsh-title-bar-strip,40px) + 3px)}body[data-dsh-title-bar-compat] .S5HVoW_panel{padding-top:var(--dsh-title-bar-strip,40px)}.S5HVoW_iconButton{width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:50%;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.S5HVoW_iconButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_iconButton:disabled{opacity:.4;cursor:default}.S5HVoW_workbench,.S5HVoW_split{flex:1;min-width:0;min-height:0;display:flex}.S5HVoW_splitRow{flex-direction:row}.S5HVoW_splitCol{flex-direction:column}.S5HVoW_splitChild{display:flex;position:relative;overflow:hidden}.S5HVoW_divider{z-index:3;touch-action:none;flex:none;position:relative}.S5HVoW_dividerRow:after,.S5HVoW_dividerCol:after{content:\"\";background:var(--dsw-alias-border-l2);transition:background var(--ds-transition-duration-slow) var(--ds-ease-in-out);position:absolute}.S5HVoW_dividerRow{cursor:col-resize;width:7px;margin:0 -2px}.S5HVoW_dividerRow:after{width:1px;top:0;bottom:0;left:50%;transform:translate(-50%)}.S5HVoW_dividerCol{cursor:row-resize;height:7px;margin:-2px 0}.S5HVoW_dividerCol:after{height:1px;top:50%;left:0;right:0;transform:translateY(-50%)}.S5HVoW_divider:hover:after,.S5HVoW_dividerActive:after{background:var(--dsw-alias-interactive-bg-hover-accent)}.S5HVoW_pane{background:var(--dsw-alias-bg-base);flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;position:relative}.S5HVoW_paneDrop{outline:1px solid var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-1px}.S5HVoW_dropOverlay{z-index:6;pointer-events:none;background:var(--dsw-alias-interactive-bg-hover-accent);opacity:.5;position:absolute}.S5HVoW_dropLeft{width:25%;top:0;bottom:0;left:0}.S5HVoW_dropRight{width:25%;top:0;bottom:0;right:0}.S5HVoW_dropUp{height:25%;top:0;left:0;right:0}.S5HVoW_dropDown{height:25%;bottom:0;left:0;right:0}.S5HVoW_dropCenter{outline:2px dashed var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-2px;background:0 0;inset:25%}.S5HVoW_paneContent{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.S5HVoW_paneTab{flex-direction:column;flex:1;min-height:0;display:flex}.S5HVoW_paneTabHidden{display:none}.S5HVoW_paneEmptyCards{flex:1;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));align-content:start;gap:8px;min-height:0;padding:12px;display:grid;overflow:hidden}.S5HVoW_paneCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);min-width:0;color:var(--dsw-alias-label-secondary);font:var(--dsw-font-xxs-strong-12);cursor:pointer;text-align:center;border-radius:8px;flex-direction:column;justify-content:center;align-items:center;gap:6px;padding:12px 8px;display:flex}.S5HVoW_paneCard:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l2)}.S5HVoW_paneCard:disabled{opacity:.45;cursor:default}.S5HVoW_tabBar{border-bottom:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);flex:none;align-items:stretch;height:34px;display:flex}.S5HVoW_tabBarDrop{outline:1px dashed var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-1px}.S5HVoW_tabList{scrollbar-width:none;flex:1;min-width:0;display:flex;overflow-x:auto}.S5HVoW_tabList::-webkit-scrollbar{display:none}.S5HVoW_tab{min-width:64px;max-width:160px;font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-secondary);border-right:1px solid var(--dsw-alias-border-l1);cursor:pointer;user-select:none;background:0 0;flex:none;align-items:center;gap:4px;padding:0 4px 0 10px;display:flex}.S5HVoW_tab:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_tabActive{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-active)}.S5HVoW_tabTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.S5HVoW_tabBadge{min-width:16px;height:15px;font:var(--dsw-font-xxxs-strong-11);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-brand-primary);border-radius:8px;flex:none;justify-content:center;align-items:center;padding:0 4px;display:inline-flex}.S5HVoW_tabClose{width:18px;height:18px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.S5HVoW_tabClose:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_tabBarPlus{background:var(--dsw-alias-bg-layer-1);width:22px;height:22px;color:var(--dsw-alias-label-tertiary);cursor:pointer;border:none;border-radius:5px;flex:none;justify-content:center;align-self:center;align-items:center;margin:0 6px;padding:0;display:inline-flex;position:sticky;right:0}.S5HVoW_tabBarPlus:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_pinnedTab{color:var(--dsw-alias-label-tertiary);font-style:italic}.S5HVoW_pinnedTab:hover{color:var(--dsw-alias-label-secondary)}.S5HVoW_explorer{flex-direction:column;flex:1;min-height:0;display:flex}.S5HVoW_explorerHeader{flex:none;justify-content:space-between;align-items:center;gap:8px;height:36px;padding:0 8px 0 12px;display:flex}.S5HVoW_explorerRoot{font:var(--dsw-font-s-14);color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.S5HVoW_explorerBody{flex:1;min-height:0;padding:4px 8px 8px;overflow:hidden auto}.S5HVoW_explorerRow{box-sizing:border-box;width:100%;max-width:100%;height:34px;font:var(--dsw-font-s-14);color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;white-space:nowrap;animation:S5HVoW_dsh-row-in .15s var(--ds-ease-in-out);background:0 0;border:none;border-radius:8px;align-items:center;gap:6px;padding:0 8px;display:flex}.S5HVoW_explorerRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_explorerRowRevealed{background:color-mix(in srgb, var(--dsw-alias-interactive-bg-hover-accent) 18%, transparent);box-shadow:inset 2px 0 0 var(--dsw-alias-interactive-bg-hover-accent)}.S5HVoW_explorerDir{font:var(--dsw-font-s-strong-14)}.S5HVoW_explorerHidden{opacity:.45}.S5HVoW_explorerSymlink{color:var(--dsw-alias-label-tertiary);flex:none}.S5HVoW_explorerBroken .S5HVoW_explorerName{color:var(--dsw-alias-state-error-primary)}.S5HVoW_explorerName{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.S5HVoW_explorerRef{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);height:20px;color:var(--dsw-alias-label-tertiary);font:var(--dsw-font-xxxs-strong-11);cursor:pointer;border-radius:999px;flex:none;align-items:center;padding:0 8px;display:none}.S5HVoW_explorerRef:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_explorerRow:hover .S5HVoW_explorerRef,.S5HVoW_explorerRow:focus-within .S5HVoW_explorerRef{display:inline-flex}.S5HVoW_explorerCopied{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary);flex:none}.S5HVoW_explorerError{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-error-primary);cursor:default}@keyframes S5HVoW_dsh-row-in{0%{opacity:0}}.S5HVoW_explorerEmpty{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);text-align:center;padding:16px}.S5HVoW_explorerRowDropTarget{background:var(--dsw-alias-interactive-bg-hover);outline:1px dashed var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-1px}.S5HVoW_uploadDropZone{z-index:1001;pointer-events:none;border:2px dashed var(--dsw-alias-interactive-bg-hover-accent);box-shadow:0 0 0 200vmax var(--dsw-alias-bg-mask-drop);animation:S5HVoW_dsh-row-in .15s var(--ds-ease-in-out);border-radius:10px;justify-content:center;align-items:flex-start;padding:12px;display:flex;position:fixed}.S5HVoW_uploadDropHero{flex-direction:column;align-items:center;gap:10px;max-width:100%;padding-top:8px;display:flex}.S5HVoW_uploadDropZonePill{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);max-width:100%;box-shadow:var(--dsw-shadow-lv2);color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxs-strong-12);border-radius:999px;align-items:center;gap:6px;padding:6px 12px;display:flex}.S5HVoW_uploadDropZoneText{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.S5HVoW_uploadDropChatHint{z-index:1002;pointer-events:none;animation:S5HVoW_dsh-row-in .15s var(--ds-ease-in-out);justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;top:0;bottom:0;left:0}.S5HVoW_uploadDropChatCard{text-align:center;max-width:100%;color:var(--dsw-alias-label-primary);font:var(--dsw-font-s-strong-14);flex-direction:column;align-items:center;gap:12px;display:flex}.S5HVoW_uploadOverlay{z-index:30;background:var(--dsw-alias-bg-mask-1);backdrop-filter:var(--dsw-mask-blur);animation:S5HVoW_dsh-row-in .15s var(--ds-ease-in-out);justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.S5HVoW_uploadOverlayCard{border:1px solid var(--dsw-alias-border-inverted);background:var(--dsw-alias-bg-layer-2);min-width:280px;max-width:min(420px,100% - 48px);box-shadow:var(--dsw-shadow-lv3);border-radius:24px;flex-direction:column;gap:12px;padding:20px 24px;display:flex}.S5HVoW_uploadOverlayTitle{font:var(--dsw-font-s-strong-14);color:var(--dsw-alias-label-primary);align-items:center;gap:8px;display:flex}.S5HVoW_uploadOverlayTitle>svg{flex:none}.S5HVoW_uploadOverlayTitle>span{white-space:nowrap;text-overflow:ellipsis;min-width:0;overflow:hidden}.S5HVoW_uploadOverlayProgress{background:var(--dsw-alias-border-l2);border-radius:3px;height:6px;overflow:hidden}.S5HVoW_uploadOverlayProgressFill{background:var(--dsw-alias-interactive-bg-hover-accent);height:100%;transition:width .15s var(--ds-ease-in-out);border-radius:3px}.S5HVoW_uploadOverlayStatus{min-height:1em;font:var(--dsw-font-xxs-12);font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.S5HVoW_uploadOverlayCancel{border:1px solid var(--dsw-alias-border-l2);height:28px;color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxs-strong-12);cursor:pointer;background:0 0;border-radius:8px;align-self:flex-end;padding:0 14px}.S5HVoW_uploadOverlayCancel:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l2)}.S5HVoW_uploadOverlayCancel:disabled{opacity:.4;cursor:default}.S5HVoW_editor{flex-direction:column;flex:1;min-height:0;display:flex}.S5HVoW_editorHeader{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:6px;padding:6px 8px;display:flex}.S5HVoW_editorTitle{min-width:0;font:var(--dsw-font-xxs-strong-12);color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.S5HVoW_editorPathInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);min-width:0;height:28px;color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxs-12);border-radius:6px;flex:1;padding:0 10px}.S5HVoW_editorPathInput:focus{border-color:var(--dsw-alias-border-l2);outline:none}.S5HVoW_editorTreeToggleActive{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-active)}.S5HVoW_editorBody{flex:1;min-height:0;display:flex}.S5HVoW_editorMain{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.S5HVoW_editorTreeDock{border-left:1px solid var(--dsw-alias-border-l1);flex:none;min-height:0;display:flex;position:relative}.S5HVoW_editorTreeResize{cursor:col-resize;touch-action:none;z-index:3;width:6px;position:absolute;top:0;bottom:0;left:0}.S5HVoW_editorTreeResize:hover{background:var(--dsw-alias-border-l2)}.S5HVoW_editorTreePanel{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;position:relative}.S5HVoW_editorTreePanelFull{flex:1}.S5HVoW_editorTreeSearch{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:6px;padding:6px 8px;display:flex}.S5HVoW_editorSearchInput{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);min-width:0;height:26px;color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxs-12);border-radius:6px;flex:1;padding:0 10px}.S5HVoW_editorSearchInput:focus{border-color:var(--dsw-alias-border-l2);outline:none}.S5HVoW_editorSearchHint{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);padding:8px 12px}.S5HVoW_editorSearchResult{width:100%;color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxs-12);text-align:left;cursor:pointer;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:none;border-radius:6px;padding:4px 8px;display:block;overflow:hidden}.S5HVoW_editorSearchResult:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_editorStatus{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary)}.S5HVoW_editorStatusError{color:var(--dsw-alias-state-error-primary)}.S5HVoW_dirtyDot{background:var(--dsw-alias-state-warn-primary);border-radius:50%;flex:none;width:7px;height:7px}.S5HVoW_editorPlaceholder{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);text-align:center;flex:1;justify-content:center;align-items:center;padding:16px;display:flex}.S5HVoW_orphanedType{opacity:.7;overflow-wrap:anywhere;margin-top:8px;font-size:12px;display:block}.S5HVoW_editorBinary{text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;padding:24px 16px;display:flex}.S5HVoW_editorBinaryNotice{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary)}.S5HVoW_editorDownloadLink{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxs-strong-12);cursor:pointer;transition:background var(--ds-transition-duration-slow) var(--ds-ease-in-out), border-color var(--ds-transition-duration-slow) var(--ds-ease-in-out);border-radius:6px;align-items:center;gap:6px;padding:6px 14px;text-decoration:none;display:inline-flex}.S5HVoW_editorDownloadLink:hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l2)}.S5HVoW_editorError{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-error-primary);padding:12px 16px}.S5HVoW_editorBanner{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-state-warn-label);background:var(--dsw-alias-state-warn-tertiary);flex:none;padding:4px 8px}.S5HVoW_sandboxStatus{font:var(--dsw-font-xxxs-11);flex:none;align-items:center;gap:8px;padding:4px 10px;display:flex}.S5HVoW_sandboxStatusOn{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);border-bottom:1px solid var(--dsw-alias-border-l1)}.S5HVoW_sandboxStatusOff{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent)}.S5HVoW_sandboxDot{background:var(--dsw-alias-state-success-primary);border-radius:50%;flex:none;width:6px;height:6px}.S5HVoW_sandboxStatusOff .S5HVoW_sandboxDot{background:var(--dsw-alias-state-error-primary)}.S5HVoW_sandboxStatusText{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.S5HVoW_sandboxAction{border:1px solid var(--dsw-alias-border-l2);font:inherit;color:inherit;cursor:pointer;background:0 0;border-radius:6px;flex:none;padding:2px 8px}.S5HVoW_sandboxAction:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_editorHtml{background:var(--dsw-alias-bg-base);border:none;flex:1;width:100%;min-height:0}.S5HVoW_browser{flex-direction:column;flex:1;min-height:0;display:flex}.S5HVoW_browserBar{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:4px;padding:6px 8px;display:flex}.S5HVoW_browserInput{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);min-width:0;height:28px;color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxs-12);border-radius:6px;flex:1;padding:0 10px}.S5HVoW_browserInput:focus{border-color:var(--dsw-alias-border-l2);outline:none}.S5HVoW_browserMessage{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-state-warn-label);background:var(--dsw-alias-state-warn-tertiary);flex:none;padding:4px 12px}.S5HVoW_browserFrame{background:var(--dsw-alias-bg-base);border:none;flex:1;width:100%;min-height:0}.S5HVoW_browserStart{text-align:center;min-height:0;font:var(--dsw-font-xs-13);color:var(--dsw-alias-label-tertiary);flex:1;justify-content:center;align-items:center;padding:20px;display:flex}.S5HVoW_browserBlocked{text-align:center;min-height:0;color:var(--dsw-alias-state-warn-primary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:6px;padding:24px;display:flex}.S5HVoW_browserBlockedTitle{font:var(--dsw-font-xxs-strong-12);color:var(--dsw-alias-label-primary)}.S5HVoW_browserBlockedDesc{max-width:280px;font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-secondary)}.S5HVoW_browserBlockedActions{gap:8px;margin-top:6px;display:flex}.S5HVoW_browserBlockedButton{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxxs-11);cursor:pointer;border-radius:6px;padding:4px 12px}.S5HVoW_browserBlockedButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_editorCm{background:0 0;flex:1;min-height:0;overflow:hidden}.S5HVoW_editorCmHidden{display:none}.S5HVoW_editorCm .cm-editor{height:100%}.S5HVoW_editorCm .cm-scroller{padding:12px 16px}.S5HVoW_editorCm .cm-editor.cm-focused{outline:none}.S5HVoW_editorModeToggle{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:6px;flex:none;align-items:center;gap:2px;padding:2px;display:inline-flex}.S5HVoW_editorModeButton{color:var(--dsw-alias-label-tertiary);font:var(--dsw-font-xxxs-11);cursor:pointer;background:0 0;border:none;border-radius:4px;padding:2px 8px}.S5HVoW_editorModeButton:hover{color:var(--dsw-alias-label-primary)}.S5HVoW_editorModeActive{background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary)}.S5HVoW_editorImageWrap{flex:1;justify-content:center;align-items:center;min-height:0;padding:12px;display:flex;overflow:auto}.S5HVoW_editorImage{object-fit:contain;max-width:100%;max-height:100%}.S5HVoW_editorMd{min-height:0;font:var(--dsw-font-xs-13);flex:1;padding:12px 16px;overflow-y:auto}.S5HVoW_mermaidWrap{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:6px;margin:6px 0;overflow:hidden}.S5HVoW_mermaidHeader{border-bottom:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);justify-content:space-between;align-items:center;gap:6px;padding:4px 8px;display:flex}.S5HVoW_mermaidInfo{font:var(--dsw-font-xxxs-strong-11);color:var(--dsw-alias-label-tertiary)}.S5HVoW_mermaidCopy{height:20px;color:var(--dsw-alias-label-secondary);font:var(--dsw-font-xxxs-11);cursor:pointer;background:0 0;border:none;border-radius:4px;align-items:center;gap:4px;padding:0 6px;display:inline-flex}.S5HVoW_mermaidCopy:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_mermaidBody{cursor:zoom-in;justify-content:center;padding:10px;display:flex;overflow:auto}.S5HVoW_mermaidBody svg{max-width:100%;height:auto}.S5HVoW_mermaidError{border-bottom:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-state-error-primary);font:var(--dsw-font-xxxs-11);padding:6px 10px}.S5HVoW_mermaidCode{font:var(--dsw-font-xxxs-11);margin:0;padding:8px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;overflow:auto}.S5HVoW_mermaidMarkdown .md-code-block[data-mermaid-processed]{display:contents}.S5HVoW_mermaidModal{z-index:1000;background:var(--dsw-alias-bg-mask-1);backdrop-filter:blur(2px);flex-direction:column;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.S5HVoW_mermaidModalToolbar{z-index:10;gap:8px;display:flex;position:absolute;top:16px;right:16px}.S5HVoW_mermaidModalButton{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);width:36px;height:36px;color:var(--dsw-alias-label-primary);font:var(--dsw-font-xs-strong-13);cursor:pointer;border-radius:8px;justify-content:center;align-items:center;display:inline-flex}.S5HVoW_mermaidModalButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_mermaidModalStage{justify-content:center;align-items:center;width:90vw;height:80vh;display:flex;position:relative;overflow:hidden}.S5HVoW_mermaidModalStage svg{cursor:grab;transform-origin:50%;user-select:none;-webkit-user-drag:none;background:var(--dsw-alias-bg-layer-1);border-radius:12px;max-width:none;max-height:none;padding:16px}.S5HVoW_mermaidModalStage svg:active{cursor:grabbing}.S5HVoW_mermaidModalHint{color:var(--dsw-alias-label-tertiary);font:var(--dsw-font-xxxs-11);pointer-events:none;position:absolute;bottom:16px;left:50%;transform:translate(-50%)}.S5HVoW_selectionPopup{z-index:60;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);height:28px;color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxxs-strong-11);white-space:nowrap;cursor:pointer;border-radius:6px;align-items:center;padding:0 10px;display:inline-flex;position:fixed;transform:translate(-50%,calc(-100% - 8px))}.S5HVoW_selectionPopup:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_editorPdf{background:var(--dsw-alias-bg-base);flex-direction:column;flex:1;min-height:0;display:flex}.S5HVoW_editorPdfToolbar{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;justify-content:flex-end;padding:6px 8px;display:flex}.S5HVoW_editorPdfStage{flex:1;min-height:0;display:flex;position:relative}.S5HVoW_editorPdfFrame{background:var(--dsw-alias-bg-base);border:none;flex:1;width:100%;min-height:0}.S5HVoW_editorPdfFrameBlocked{pointer-events:none}.S5HVoW_editorPdfDragShield{z-index:4;pointer-events:none;background:0 0;position:absolute;inset:0}.S5HVoW_editorPdfDragShieldActive{pointer-events:auto}body[data-dsh-tab-dragging] .S5HVoW_editorPdfFrame{pointer-events:none!important}body[data-dsh-tab-dragging] .S5HVoW_editorPdfDragShield{pointer-events:auto!important}.S5HVoW_terminalWrap{background:var(--dsw-alias-bg-base);flex-direction:column;flex:1;min-height:0;display:flex;position:relative}.S5HVoW_terminal{flex:1;min-height:0;padding:6px 4px 6px 8px}.S5HVoW_terminal .xterm{height:100%}.S5HVoW_terminalBanner{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-state-warn-label);background:var(--dsw-alias-state-warn-tertiary);flex-wrap:wrap;flex:none;align-items:center;gap:8px;padding:3px 10px;display:flex}.S5HVoW_terminalBannerUrl{word-break:break-all;opacity:.85;flex-basis:100%;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.S5HVoW_boundaryError{z-index:50;background:var(--dsw-alias-bg-layer-1);border-left:1px solid var(--dsw-alias-border-l2);font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-error-primary);flex-direction:column;align-items:flex-start;gap:8px;padding:16px;display:flex;position:fixed;top:0;bottom:0;right:0;overflow:auto}.S5HVoW_terminalRetry{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);font:var(--dsw-font-xxxs-strong-11);cursor:pointer;border-radius:999px;flex:none;padding:1px 8px}.S5HVoW_terminalRetry:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_terminalDepsBanner{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-warn-label);background:var(--dsw-alias-state-warn-tertiary);flex-direction:column;flex:none;gap:6px;padding:10px;display:flex}.S5HVoW_terminalDepsTitle{font:var(--dsw-font-xxs-strong-12);color:var(--dsw-alias-state-warn-primary)}.S5HVoW_terminalDepsHint{opacity:.9}.S5HVoW_terminalDepsCommandRow{align-items:flex-start;gap:8px;display:flex}.S5HVoW_terminalRepairCommand{white-space:pre-wrap;word-break:break-all;user-select:text;min-width:0;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:4px;flex:1;max-height:160px;margin:0;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;line-height:1.5;overflow:auto}.S5HVoW_terminalDepsNote{opacity:.85}.S5HVoW_terminalDepsActions{align-items:center;gap:8px;display:flex}.S5HVoW_tabBoundaryError{min-height:0;font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-error-primary);flex-direction:column;flex:1;align-items:flex-start;gap:8px;padding:12px 16px;display:flex;overflow:auto}.S5HVoW_git{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;overflow:hidden auto}.S5HVoW_gitHeader{flex:none;align-items:center;gap:8px;height:36px;padding:0 8px 0 12px;display:flex}.S5HVoW_gitWorktreeRow{flex:none;align-items:center;gap:8px;padding:6px 8px 0 12px;display:flex}.S5HVoW_gitWorktreeLabel{color:var(--dsw-alias-label-tertiary);font:var(--dsw-font-xxxs-11);flex:none}.S5HVoW_gitBranchSelect{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);min-width:0;height:26px;color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxs-12);border-radius:6px;flex:1;padding:0 6px}.S5HVoW_gitSection{border-top:1px solid var(--dsw-alias-border-l1)}.S5HVoW_gitSectionHeader{font:var(--dsw-font-xxxs-strong-11);color:var(--dsw-alias-label-tertiary);text-transform:uppercase;justify-content:space-between;align-items:center;padding:6px 12px 4px;display:flex}.S5HVoW_gitLink{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-brand-primary);cursor:pointer;background:0 0;border:none;padding:0}.S5HVoW_gitLink:hover:not(:disabled){text-decoration:underline}.S5HVoW_gitLink:disabled{opacity:.4;cursor:default}.S5HVoW_gitRow{min-height:34px;animation:S5HVoW_dsh-row-in .15s var(--ds-ease-in-out);border-radius:8px;align-items:center;gap:6px;margin:0 6px;padding:0 8px;display:flex}.S5HVoW_gitRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_gitRowSelected{background:var(--dsw-alias-interactive-bg-active)}.S5HVoW_gitRowMain{cursor:pointer;text-align:left;background:0 0;border:none;flex:1;align-items:center;gap:8px;min-width:0;padding:3px 0;display:flex}.S5HVoW_gitBadge{width:20px;height:16px;font:var(--dsw-font-xxxs-strong-11);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;justify-content:center;align-items:center;display:inline-flex}.S5HVoW_gitName{text-overflow:ellipsis;white-space:nowrap;min-width:0;font:var(--dsw-font-s-14);color:var(--dsw-alias-label-primary);flex:1;overflow:hidden}.S5HVoW_gitEmpty{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);padding:4px 12px 8px}.S5HVoW_gitPlaceholder{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);text-align:center;padding:16px}.S5HVoW_gitError{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-error-primary);white-space:pre-wrap;padding:8px 12px}.S5HVoW_gitDiff{border-top:1px solid var(--dsw-alias-border-l1);padding:8px}.S5HVoW_gitDiffTab{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;overflow:hidden auto}.S5HVoW_gitDiffTabHeader{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:8px;height:36px;padding:0 8px 0 12px;display:flex}.S5HVoW_gitDiffTabTitle{text-overflow:ellipsis;white-space:nowrap;min-width:0;font:var(--dsw-font-xxs-strong-12);color:var(--dsw-alias-label-primary);flex:1;overflow:hidden}.S5HVoW_gitDiffFile{width:100%;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;align-items:baseline;gap:6px;padding:8px 2px 2px;display:flex}.S5HVoW_gitDiffFile:disabled{cursor:default}.S5HVoW_gitDiffFile:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_gitDiffFileChevron{color:var(--dsw-alias-label-tertiary);flex:none;transform:rotate(0)}.S5HVoW_gitDiffFileChevronExpanded{transform:rotate(90deg)}.S5HVoW_gitDiffFilePath{font:var(--dsw-font-xxs-strong-12);color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.S5HVoW_gitDiffFileOld{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;flex:none;max-width:40%;overflow:hidden}.S5HVoW_gitDiffFileTag{border:1px solid var(--dsw-alias-border-l2);font:var(--dsw-font-xxxs-strong-11);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:0 6px}.S5HVoW_gitDiffHunk{font:var(--dsw-font-markdown-code-block-small);color:var(--dsw-alias-label-tertiary);gap:8px;padding:3px 2px;display:flex}.S5HVoW_gitDiffHunkHeader{color:var(--dsw-alias-label-secondary);flex:none}.S5HVoW_gitDiffHunkSection{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.S5HVoW_gitDiffLine{font:var(--dsw-font-markdown-code-block-small);white-space:pre-wrap;overflow-wrap:anywhere;align-items:stretch;min-width:0;line-height:20px;display:flex}.S5HVoW_gitDiffNum{text-align:right;width:36px;color:var(--dsw-alias-label-tertiary);user-select:none;flex:none;padding-right:8px}.S5HVoW_gitDiffCode{flex:1;min-width:0;overflow:visible}.S5HVoW_gitDiffCtx{color:var(--dsw-alias-label-primary)}.S5HVoW_gitDiffDel{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent)}.S5HVoW_gitDiffAdd{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent)}.S5HVoW_gitDiffMeta{padding-left:2px}.S5HVoW_gitDiffMetaText{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary);font-style:italic}.S5HVoW_gitDiffExpand{width:100%;font:var(--dsw-font-xxs-12);color:var(--dsw-alias-brand-primary);cursor:pointer;text-align:center;background:0 0;border:none;margin:4px 0;display:block}.S5HVoW_gitDiffExpand:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_gitConfirmDesc{font:var(--dsw-font-s-14);color:var(--dsw-alias-label-primary);white-space:pre-wrap;margin:0}.S5HVoW_gitCommit{border-top:1px solid var(--dsw-alias-border-l1);align-items:center;gap:6px;padding:8px 12px;display:flex}.S5HVoW_gitCommitInput{flex:1;min-width:0}.S5HVoW_gitCommitButton{background:var(--dsw-alias-button-primary-fill);height:26px;color:var(--dsw-alias-label-primary-inverted);font:var(--dsw-font-xxs-strong-12);cursor:pointer;border:none;border-radius:6px;flex:none;padding:0 12px}.S5HVoW_gitCommitButton:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)}.S5HVoW_gitCommitButton:disabled{opacity:.45;cursor:default}.S5HVoW_gitLogRow{cursor:pointer;border-radius:8px;flex-direction:column;gap:2px;padding:5px 12px;display:flex}.S5HVoW_gitLogRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_gitLogLine1{align-items:baseline;gap:8px;min-width:0;display:flex}.S5HVoW_gitLogHash{font:var(--dsw-font-markdown-code-block-small);color:var(--dsw-alias-label-tertiary);flex:none}.S5HVoW_gitLogLine2{flex-wrap:wrap;align-items:center;gap:6px;min-width:0;display:flex}.S5HVoW_gitLogRef{border:1px solid var(--dsw-alias-border-l2);font:var(--dsw-font-xxxs-strong-11);color:var(--dsw-alias-brand-primary);white-space:nowrap;border-radius:999px;flex:none;padding:0 5px}.S5HVoW_gitLogSubject{text-overflow:ellipsis;white-space:nowrap;min-width:0;font:var(--dsw-font-s-14);color:var(--dsw-alias-label-primary);flex:1;overflow:hidden}.S5HVoW_gitLogMeta{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary)}.S5HVoW_gitLogMore{border:1px solid var(--dsw-alias-border-l2);width:calc(100% - 24px);font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border-radius:6px;margin:4px 12px 8px;padding:6px 0;display:block}.S5HVoW_gitLogMore:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_gitLogMore:disabled{opacity:.5;cursor:default}.S5HVoW_producedRow{flex-wrap:wrap;align-items:center;gap:8px;padding:4px 0;display:flex}.S5HVoW_producedLabel{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary)}.S5HVoW_producedChip{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);max-width:200px;color:var(--dsw-alias-label-secondary);font:var(--dsw-font-xxs-12);cursor:pointer;border-radius:999px;align-items:center;gap:4px;padding:2px 8px;display:inline-flex;overflow:hidden}.S5HVoW_producedChip:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_producedChip span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.S5HVoW_producedMore{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary)}.S5HVoW_toggleButton:focus-visible,.S5HVoW_iconButton:focus-visible,.S5HVoW_tab:focus-visible,.S5HVoW_tabClose:focus-visible,.S5HVoW_tabBarPlus:focus-visible,.S5HVoW_paneCard:focus-visible,.S5HVoW_explorerRow:focus-visible,.S5HVoW_explorerRef:focus-visible,.S5HVoW_gitRowMain:focus-visible,.S5HVoW_gitLink:focus-visible,.S5HVoW_gitCommitButton:focus-visible,.S5HVoW_gitLogRow:focus-visible,.S5HVoW_gitLogMore:focus-visible,.S5HVoW_gitDiffFile:focus-visible,.S5HVoW_gitDiffExpand:focus-visible,.S5HVoW_terminalRetry:focus-visible,.S5HVoW_editorModeButton:focus-visible,.S5HVoW_editorDownloadLink:focus-visible,.S5HVoW_editorPptxButton:focus-visible,.S5HVoW_editorDocxZoomRange:focus-visible{outline:2px solid var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-1px}@media (prefers-reduced-motion:reduce){.S5HVoW_panel,.S5HVoW_panelHidden,.S5HVoW_toggleCluster,.S5HVoW_toggleButton,.S5HVoW_tab,.S5HVoW_tabBarPlus,.S5HVoW_paneCard,.S5HVoW_explorerRow,.S5HVoW_gitRow,.S5HVoW_divider,.S5HVoW_dividerRow:after,.S5HVoW_dividerCol:after{transition:none;animation:none}}@media (width<=767px){.S5HVoW_panel:not(.S5HVoW_panelHidden) .S5HVoW_tabBar{padding-right:40px}.S5HVoW_tab{min-width:48px;max-width:128px}}.S5HVoW_openWithLabel{align-items:center;gap:8px;width:100%;min-width:0;display:flex}.S5HVoW_openWithName{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}.S5HVoW_openWithChevron{color:var(--dsw-alias-label-tertiary);flex:none}.S5HVoW_openWithPin{width:20px;height:20px;color:var(--dsw-alias-label-tertiary);cursor:pointer;border-radius:6px;flex:none;justify-content:center;align-items:center;display:inline-flex}.S5HVoW_openWithPin:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_openWithPinActive{color:var(--dsw-alias-state-business-primary)}.S5HVoW_editorHtmlBlock{margin:8px 0}.S5HVoW_editorHtmlBlock img,.S5HVoW_editorHtmlBlock video{max-width:100%}.S5HVoW_editorHtmlBlock details{margin:4px 0;padding:4px 0}.S5HVoW_editorHtmlBlock summary{cursor:pointer}.S5HVoW_tocBar{z-index:3;pointer-events:none;justify-content:flex-end;height:0;display:flex;position:sticky;top:0}.S5HVoW_tocButton{pointer-events:auto;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);width:26px;height:26px;color:var(--dsw-alias-label-secondary);cursor:pointer;border-radius:6px;justify-content:center;align-items:center;margin:4px 2px 0 0;padding:0;display:inline-flex}.S5HVoW_tocButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_tocPanel{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);width:min(300px,82%);max-height:60vh;box-shadow:var(--dsw-shadow-lv2);pointer-events:auto;border-radius:8px;flex-direction:column;padding:4px;display:flex;position:absolute;top:32px;right:2px;overflow-y:auto}.S5HVoW_tocItem{min-width:0;color:var(--dsw-alias-label-secondary);font:var(--dsw-font-xxs-12);text-align:left;cursor:pointer;background:0 0;border:none;border-radius:6px;align-items:baseline;gap:8px;padding:4px 8px;display:flex}.S5HVoW_tocItem:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_tocItem[data-level=\"2\"]{padding-left:18px}.S5HVoW_tocItem[data-level=\"3\"]{padding-left:28px}.S5HVoW_tocItem[data-level=\"4\"]{padding-left:38px}.S5HVoW_tocItem[data-level=\"5\"]{padding-left:48px}.S5HVoW_tocItem[data-level=\"6\"]{padding-left:58px}.S5HVoW_tocItemLevel{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary);flex:none}.S5HVoW_tocItemText{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}@keyframes S5HVoW_dsh-toc-flash{0%,60%{background:var(--dsw-alias-interactive-bg-hover)}to{background:0 0}}.S5HVoW_tocFlash{border-radius:4px;animation:1.2s ease-out S5HVoW_dsh-toc-flash}";
9883
+ const css$4 = "[data-dsh-panel-host]{z-index:25;pointer-events:none;position:fixed;inset:0;overflow:hidden}[data-dsh-panel-host][data-dsh-panel-host-degraded]{position:absolute;top:0;left:0}.S5HVoW_toggleCluster{top:calc(3px + env(safe-area-inset-top));z-index:45;pointer-events:auto;flex-direction:row;gap:4px;display:flex;position:absolute;right:10px}.S5HVoW_panel:not(.S5HVoW_panelHidden) .S5HVoW_tabBar{padding-right:72px}.S5HVoW_toggleButton{width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;transition:background var(--ds-transition-duration-slow) var(--ds-ease-in-out), color var(--ds-transition-duration-slow) var(--ds-ease-in-out);background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;display:flex}.S5HVoW_toggleButton:hover:not(:disabled):not([aria-disabled=true]){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_toggleButton:disabled,.S5HVoW_toggleButton[aria-disabled=true]{opacity:.4;cursor:default}.S5HVoW_panel{box-sizing:border-box;z-index:40;pointer-events:auto;background:var(--dsw-alias-bg-layer-1);border-left:1px solid var(--dsw-alias-border-l2);padding-bottom:env(safe-area-inset-bottom);transition:transform var(--ds-transition-duration-slow) var(--ds-ease-in-out), width var(--ds-transition-duration-slow) var(--ds-ease-in-out);flex-direction:column;display:flex;position:absolute;top:0;bottom:0;right:0}.S5HVoW_panelHidden{pointer-events:none;visibility:hidden;transition:transform var(--ds-transition-duration-slow) var(--ds-ease-in-out), width var(--ds-transition-duration-slow) var(--ds-ease-in-out), visibility 0s linear var(--ds-transition-duration-slow);transform:translate(102%)}.S5HVoW_panel[data-dragging]{transition:none}.S5HVoW_panelResize{cursor:col-resize;z-index:2;touch-action:none;width:8px;position:absolute;top:0;bottom:0;left:-4px}.S5HVoW_panelResizeActive{background:var(--dsw-alias-interactive-bg-hover-accent)}.S5HVoW_panelBody{flex:1;min-width:0;min-height:0;display:flex}.S5HVoW_panel{contain:layout style}body[data-dsh-sidebar-dragging] .S5HVoW_panel{will-change:transform}.S5HVoW_floatWindow{z-index:42;pointer-events:auto;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);box-shadow:var(--dsw-shadow-lv3);contain:layout style;border-radius:8px;flex-direction:column;display:flex;position:absolute;overflow:hidden}.S5HVoW_floatWindowDragging{will-change:left, top, width, height}.S5HVoW_floatHeader{height:34px;font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);border-bottom:1px solid var(--dsw-alias-border-l1);cursor:grab;user-select:none;flex:none;align-items:center;gap:4px;padding:0 4px 0 10px;display:flex}.S5HVoW_floatWindowDragging .S5HVoW_floatHeader{cursor:grabbing}.S5HVoW_floatTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.S5HVoW_floatClose{width:18px;height:18px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.S5HVoW_floatClose:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_floatContent{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;overflow:hidden}.S5HVoW_floatResize{z-index:2;cursor:nwse-resize;touch-action:none;width:14px;height:14px;position:absolute;bottom:0;right:0}.S5HVoW_floatResize:hover{background:var(--dsw-alias-interactive-bg-hover-accent)}.S5HVoW_pane[data-dsh-float-dock-over]{outline:2px dashed var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-2px}.S5HVoW_floatDropHint{z-index:46;pointer-events:none;border:2px dashed var(--dsw-alias-interactive-bg-hover-accent);background:color-mix(in srgb, var(--dsw-alias-interactive-bg-hover-accent) 12%, transparent);border-radius:8px;justify-content:center;align-items:center;display:flex;position:absolute}.S5HVoW_floatDropHintLabel{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);border-radius:999px;padding:4px 12px}.S5HVoW_toggleCluster,.S5HVoW_toggleButton,.S5HVoW_tabBar,.S5HVoW_floatHeader{-webkit-app-region:no-drag}body[data-dsh-title-bar-compat] .S5HVoW_toggleCluster{top:calc(var(--dsh-title-bar-strip,40px) + 3px)}body[data-dsh-title-bar-compat] .S5HVoW_panel{padding-top:var(--dsh-title-bar-strip,40px)}.S5HVoW_iconButton{width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:50%;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.S5HVoW_iconButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_iconButton:disabled{opacity:.4;cursor:default}.S5HVoW_workbench,.S5HVoW_split{flex:1;min-width:0;min-height:0;display:flex}.S5HVoW_splitRow{flex-direction:row}.S5HVoW_splitCol{flex-direction:column}.S5HVoW_splitChild{display:flex;position:relative;overflow:hidden}.S5HVoW_divider{z-index:3;touch-action:none;flex:none;position:relative}.S5HVoW_dividerRow:after,.S5HVoW_dividerCol:after{content:\"\";background:var(--dsw-alias-border-l2);transition:background var(--ds-transition-duration-slow) var(--ds-ease-in-out);position:absolute}.S5HVoW_dividerRow{cursor:col-resize;width:7px;margin:0 -2px}.S5HVoW_dividerRow:after{width:1px;top:0;bottom:0;left:50%;transform:translate(-50%)}.S5HVoW_dividerCol{cursor:row-resize;height:7px;margin:-2px 0}.S5HVoW_dividerCol:after{height:1px;top:50%;left:0;right:0;transform:translateY(-50%)}.S5HVoW_divider:hover:after,.S5HVoW_dividerActive:after{background:var(--dsw-alias-interactive-bg-hover-accent)}.S5HVoW_pane{background:var(--dsw-alias-bg-base);flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;position:relative}.S5HVoW_paneDrop{outline:1px solid var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-1px}.S5HVoW_dropOverlay{z-index:6;pointer-events:none;background:var(--dsw-alias-interactive-bg-hover-accent);opacity:.5;position:absolute}.S5HVoW_dropLeft{width:25%;top:0;bottom:0;left:0}.S5HVoW_dropRight{width:25%;top:0;bottom:0;right:0}.S5HVoW_dropUp{height:25%;top:0;left:0;right:0}.S5HVoW_dropDown{height:25%;bottom:0;left:0;right:0}.S5HVoW_dropCenter{outline:2px dashed var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-2px;background:0 0;inset:25%}.S5HVoW_paneContent{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.S5HVoW_paneTab{flex-direction:column;flex:1;min-height:0;display:flex}.S5HVoW_paneTabHidden{display:none}.S5HVoW_paneEmptyCards{flex:1;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));align-content:start;gap:8px;min-height:0;padding:12px;display:grid;overflow:hidden}.S5HVoW_paneCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);min-width:0;color:var(--dsw-alias-label-secondary);font:var(--dsw-font-xxs-strong-12);cursor:pointer;text-align:center;border-radius:8px;flex-direction:column;justify-content:center;align-items:center;gap:6px;padding:12px 8px;display:flex}.S5HVoW_paneCard:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l2)}.S5HVoW_paneCard:disabled{opacity:.45;cursor:default}.S5HVoW_tabBar{border-bottom:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);flex:none;align-items:stretch;height:34px;display:flex}.S5HVoW_tabBarDrop{outline:1px dashed var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-1px}.S5HVoW_tabList{scrollbar-width:none;flex:1;min-width:0;display:flex;overflow-x:auto}.S5HVoW_tabList::-webkit-scrollbar{display:none}.S5HVoW_tab{min-width:64px;max-width:160px;font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-secondary);border-right:1px solid var(--dsw-alias-border-l1);cursor:pointer;user-select:none;background:0 0;flex:none;align-items:center;gap:4px;padding:0 4px 0 10px;display:flex}.S5HVoW_tab:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_tabActive{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-active)}.S5HVoW_tabTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.S5HVoW_tabBadge{min-width:16px;height:15px;font:var(--dsw-font-xxxs-strong-11);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-brand-primary);border-radius:8px;flex:none;justify-content:center;align-items:center;padding:0 4px;display:inline-flex}.S5HVoW_tabClose{width:18px;height:18px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.S5HVoW_tabClose:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_tabBarPlus{background:var(--dsw-alias-bg-layer-1);width:22px;height:22px;color:var(--dsw-alias-label-tertiary);cursor:pointer;border:none;border-radius:5px;flex:none;justify-content:center;align-self:center;align-items:center;margin:0 6px;padding:0;display:inline-flex;position:sticky;right:0}.S5HVoW_tabBarPlus:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_pinnedTab{color:var(--dsw-alias-label-tertiary);font-style:italic}.S5HVoW_pinnedTab:hover{color:var(--dsw-alias-label-secondary)}.S5HVoW_explorer{flex-direction:column;flex:1;min-height:0;display:flex}.S5HVoW_explorerHeader{flex:none;justify-content:space-between;align-items:center;gap:8px;height:36px;padding:0 8px 0 12px;display:flex}.S5HVoW_explorerRoot{font:var(--dsw-font-s-14);color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.S5HVoW_explorerBody{flex:1;min-height:0;padding:4px 8px 8px;overflow:hidden auto}.S5HVoW_explorerRow{box-sizing:border-box;width:100%;max-width:100%;height:34px;font:var(--dsw-font-s-14);color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;white-space:nowrap;animation:S5HVoW_dsh-row-in .15s var(--ds-ease-in-out);background:0 0;border:none;border-radius:8px;align-items:center;gap:6px;padding:0 8px;display:flex}.S5HVoW_explorerRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_explorerRowRevealed{background:color-mix(in srgb, var(--dsw-alias-interactive-bg-hover-accent) 18%, transparent);box-shadow:inset 2px 0 0 var(--dsw-alias-interactive-bg-hover-accent)}.S5HVoW_explorerDir{font:var(--dsw-font-s-strong-14)}.S5HVoW_explorerHidden{opacity:.45}.S5HVoW_explorerSymlink{color:var(--dsw-alias-label-tertiary);flex:none}.S5HVoW_explorerBroken .S5HVoW_explorerName{color:var(--dsw-alias-state-error-primary)}.S5HVoW_explorerName{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.S5HVoW_explorerRef{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);height:20px;color:var(--dsw-alias-label-tertiary);font:var(--dsw-font-xxxs-strong-11);cursor:pointer;border-radius:999px;flex:none;align-items:center;padding:0 8px;display:none}.S5HVoW_explorerRef:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_explorerRow:hover .S5HVoW_explorerRef,.S5HVoW_explorerRow:focus-within .S5HVoW_explorerRef{display:inline-flex}.S5HVoW_explorerCopied{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary);flex:none}.S5HVoW_explorerError{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-error-primary);cursor:default}@keyframes S5HVoW_dsh-row-in{0%{opacity:0}}.S5HVoW_explorerEmpty{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);text-align:center;padding:16px}.S5HVoW_explorerRowDropTarget{background:var(--dsw-alias-interactive-bg-hover);outline:1px dashed var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-1px}.S5HVoW_uploadDropZone{z-index:1001;pointer-events:none;border:2px dashed var(--dsw-alias-interactive-bg-hover-accent);box-shadow:0 0 0 200vmax var(--dsw-alias-bg-mask-drop);animation:S5HVoW_dsh-row-in .15s var(--ds-ease-in-out);border-radius:10px;justify-content:center;align-items:flex-start;padding:12px;display:flex;position:fixed}.S5HVoW_uploadDropHero{flex-direction:column;align-items:center;gap:10px;max-width:100%;padding-top:8px;display:flex}.S5HVoW_uploadDropZonePill{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);max-width:100%;box-shadow:var(--dsw-shadow-lv2);color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxs-strong-12);border-radius:999px;align-items:center;gap:6px;padding:6px 12px;display:flex}.S5HVoW_uploadDropZoneText{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.S5HVoW_uploadDropChatHint{z-index:1002;pointer-events:none;animation:S5HVoW_dsh-row-in .15s var(--ds-ease-in-out);justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;top:0;bottom:0;left:0}.S5HVoW_uploadDropChatCard{text-align:center;max-width:100%;color:var(--dsw-alias-label-primary);font:var(--dsw-font-s-strong-14);flex-direction:column;align-items:center;gap:12px;display:flex}.S5HVoW_uploadOverlay{z-index:30;background:var(--dsw-alias-bg-mask-1);backdrop-filter:var(--dsw-mask-blur);animation:S5HVoW_dsh-row-in .15s var(--ds-ease-in-out);justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.S5HVoW_uploadOverlayCard{border:1px solid var(--dsw-alias-border-inverted);background:var(--dsw-alias-bg-layer-2);min-width:280px;max-width:min(420px,100% - 48px);box-shadow:var(--dsw-shadow-lv3);border-radius:24px;flex-direction:column;gap:12px;padding:20px 24px;display:flex}.S5HVoW_uploadOverlayTitle{font:var(--dsw-font-s-strong-14);color:var(--dsw-alias-label-primary);align-items:center;gap:8px;display:flex}.S5HVoW_uploadOverlayTitle>svg{flex:none}.S5HVoW_uploadOverlayTitle>span{white-space:nowrap;text-overflow:ellipsis;min-width:0;overflow:hidden}.S5HVoW_uploadOverlayProgress{background:var(--dsw-alias-border-l2);border-radius:3px;height:6px;overflow:hidden}.S5HVoW_uploadOverlayProgressFill{background:var(--dsw-alias-interactive-bg-hover-accent);height:100%;transition:width .15s var(--ds-ease-in-out);border-radius:3px}.S5HVoW_uploadOverlayStatus{min-height:1em;font:var(--dsw-font-xxs-12);font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.S5HVoW_uploadOverlayCancel{border:1px solid var(--dsw-alias-border-l2);height:28px;color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxs-strong-12);cursor:pointer;background:0 0;border-radius:8px;align-self:flex-end;padding:0 14px}.S5HVoW_uploadOverlayCancel:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l2)}.S5HVoW_uploadOverlayCancel:disabled{opacity:.4;cursor:default}.S5HVoW_editor{flex-direction:column;flex:1;min-height:0;display:flex}.S5HVoW_editorHeader{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:6px;padding:6px 8px;display:flex}.S5HVoW_editorTitle{min-width:0;font:var(--dsw-font-xxs-strong-12);color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.S5HVoW_editorPathInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);min-width:0;height:28px;color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxs-12);border-radius:6px;flex:1;padding:0 10px}.S5HVoW_editorPathInput:focus{border-color:var(--dsw-alias-border-l2);outline:none}.S5HVoW_editorTreeToggleActive{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-active)}.S5HVoW_editorBody{flex:1;min-height:0;display:flex}.S5HVoW_editorMain{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.S5HVoW_editorTreeDock{border-left:1px solid var(--dsw-alias-border-l1);flex:none;min-height:0;display:flex;position:relative}.S5HVoW_editorTreeResize{cursor:col-resize;touch-action:none;z-index:3;width:6px;position:absolute;top:0;bottom:0;left:0}.S5HVoW_editorTreeResize:hover{background:var(--dsw-alias-border-l2)}.S5HVoW_editorTreePanel{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;position:relative}.S5HVoW_editorTreePanelFull{flex:1}.S5HVoW_editorTreeSearch{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:6px;padding:6px 8px;display:flex}.S5HVoW_editorSearchInput{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);min-width:0;height:26px;color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxs-12);border-radius:6px;flex:1;padding:0 10px}.S5HVoW_editorSearchInput:focus{border-color:var(--dsw-alias-border-l2);outline:none}.S5HVoW_editorSearchHint{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);padding:8px 12px}.S5HVoW_editorSearchResult{width:100%;color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxs-12);text-align:left;cursor:pointer;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:none;border-radius:6px;padding:4px 8px;display:block;overflow:hidden}.S5HVoW_editorSearchResult:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_editorStatus{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary)}.S5HVoW_editorStatusError{color:var(--dsw-alias-state-error-primary)}.S5HVoW_dirtyDot{background:var(--dsw-alias-state-warn-primary);border-radius:50%;flex:none;width:7px;height:7px}.S5HVoW_editorPlaceholder{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);text-align:center;flex:1;justify-content:center;align-items:center;padding:16px;display:flex}.S5HVoW_orphanedType{opacity:.7;overflow-wrap:anywhere;margin-top:8px;font-size:12px;display:block}.S5HVoW_editorBinary{text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;padding:24px 16px;display:flex}.S5HVoW_editorBinaryNotice{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary)}.S5HVoW_editorDownloadLink{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxs-strong-12);cursor:pointer;transition:background var(--ds-transition-duration-slow) var(--ds-ease-in-out), border-color var(--ds-transition-duration-slow) var(--ds-ease-in-out);border-radius:6px;align-items:center;gap:6px;padding:6px 14px;text-decoration:none;display:inline-flex}.S5HVoW_editorDownloadLink:hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l2)}.S5HVoW_editorError{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-error-primary);padding:12px 16px}.S5HVoW_editorBanner{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-state-warn-label);background:var(--dsw-alias-state-warn-tertiary);flex:none;padding:4px 8px}.S5HVoW_sandboxStatus{font:var(--dsw-font-xxxs-11);flex:none;align-items:center;gap:8px;padding:4px 10px;display:flex}.S5HVoW_sandboxStatusOn{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);border-bottom:1px solid var(--dsw-alias-border-l1)}.S5HVoW_sandboxStatusOff{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent)}.S5HVoW_sandboxDot{background:var(--dsw-alias-state-success-primary);border-radius:50%;flex:none;width:6px;height:6px}.S5HVoW_sandboxStatusOff .S5HVoW_sandboxDot{background:var(--dsw-alias-state-error-primary)}.S5HVoW_sandboxStatusText{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.S5HVoW_sandboxAction{border:1px solid var(--dsw-alias-border-l2);font:inherit;color:inherit;cursor:pointer;background:0 0;border-radius:6px;flex:none;padding:2px 8px}.S5HVoW_sandboxAction:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_browser{flex-direction:column;flex:1;min-height:0;display:flex}.S5HVoW_browserBar{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:4px;padding:6px 8px;display:flex}.S5HVoW_browserInput{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);min-width:0;height:28px;color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxs-12);border-radius:6px;flex:1;padding:0 10px}.S5HVoW_browserInput:focus{border-color:var(--dsw-alias-border-l2);outline:none}.S5HVoW_browserMessage{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-state-warn-label);background:var(--dsw-alias-state-warn-tertiary);flex:none;padding:4px 12px}.S5HVoW_browserFrame{background:var(--dsw-alias-bg-base);border:none;flex:1;width:100%;min-height:0}.S5HVoW_browserStart{text-align:center;min-height:0;font:var(--dsw-font-xs-13);color:var(--dsw-alias-label-tertiary);flex:1;justify-content:center;align-items:center;padding:20px;display:flex}.S5HVoW_browserBlocked{text-align:center;min-height:0;color:var(--dsw-alias-state-warn-primary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:6px;padding:24px;display:flex}.S5HVoW_browserBlockedTitle{font:var(--dsw-font-xxs-strong-12);color:var(--dsw-alias-label-primary)}.S5HVoW_browserBlockedDesc{max-width:280px;font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-secondary)}.S5HVoW_browserBlockedActions{gap:8px;margin-top:6px;display:flex}.S5HVoW_browserBlockedButton{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxxs-11);cursor:pointer;border-radius:6px;padding:4px 12px}.S5HVoW_browserBlockedButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_editorCm{background:0 0;flex:1;min-height:0;overflow:hidden}.S5HVoW_editorCm .cm-editor{height:100%}.S5HVoW_editorCm .cm-scroller{padding:12px 16px}.S5HVoW_editorCm .cm-editor.cm-focused{outline:none}.S5HVoW_selectionPopup{z-index:60;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);height:28px;color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxxs-strong-11);white-space:nowrap;cursor:pointer;border-radius:6px;align-items:center;padding:0 10px;display:inline-flex;position:fixed;transform:translate(-50%,calc(-100% - 8px))}.S5HVoW_selectionPopup:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_terminalWrap{background:var(--dsw-alias-bg-base);flex-direction:column;flex:1;min-height:0;display:flex;position:relative}.S5HVoW_terminal{flex:1;min-height:0;padding:6px 4px 6px 8px}.S5HVoW_terminal .xterm{height:100%}.S5HVoW_terminalBanner{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-state-warn-label);background:var(--dsw-alias-state-warn-tertiary);flex-wrap:wrap;flex:none;align-items:center;gap:8px;padding:3px 10px;display:flex}.S5HVoW_terminalBannerUrl{word-break:break-all;opacity:.85;flex-basis:100%;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.S5HVoW_boundaryError{z-index:50;background:var(--dsw-alias-bg-layer-1);border-left:1px solid var(--dsw-alias-border-l2);font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-error-primary);flex-direction:column;align-items:flex-start;gap:8px;padding:16px;display:flex;position:fixed;top:0;bottom:0;right:0;overflow:auto}.S5HVoW_terminalRetry{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);font:var(--dsw-font-xxxs-strong-11);cursor:pointer;border-radius:999px;flex:none;padding:1px 8px}.S5HVoW_terminalRetry:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_terminalDepsBanner{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-warn-label);background:var(--dsw-alias-state-warn-tertiary);flex-direction:column;flex:none;gap:6px;padding:10px;display:flex}.S5HVoW_terminalDepsTitle{font:var(--dsw-font-xxs-strong-12);color:var(--dsw-alias-state-warn-primary)}.S5HVoW_terminalDepsHint{opacity:.9}.S5HVoW_terminalDepsCommandRow{align-items:flex-start;gap:8px;display:flex}.S5HVoW_terminalRepairCommand{white-space:pre-wrap;word-break:break-all;user-select:text;min-width:0;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:4px;flex:1;max-height:160px;margin:0;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;line-height:1.5;overflow:auto}.S5HVoW_terminalDepsNote{opacity:.85}.S5HVoW_terminalDepsActions{align-items:center;gap:8px;display:flex}.S5HVoW_tabBoundaryError{min-height:0;font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-error-primary);flex-direction:column;flex:1;align-items:flex-start;gap:8px;padding:12px 16px;display:flex;overflow:auto}.S5HVoW_git{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;overflow:hidden auto}.S5HVoW_gitHeader{flex:none;align-items:center;gap:8px;height:36px;padding:0 8px 0 12px;display:flex}.S5HVoW_gitWorktreeRow{flex:none;align-items:center;gap:8px;padding:6px 8px 0 12px;display:flex}.S5HVoW_gitWorktreeLabel{color:var(--dsw-alias-label-tertiary);font:var(--dsw-font-xxxs-11);flex:none}.S5HVoW_gitBranchSelect{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);min-width:0;height:26px;color:var(--dsw-alias-label-primary);font:var(--dsw-font-xxs-12);border-radius:6px;flex:1;padding:0 6px}.S5HVoW_gitSection{border-top:1px solid var(--dsw-alias-border-l1)}.S5HVoW_gitSectionHeader{font:var(--dsw-font-xxxs-strong-11);color:var(--dsw-alias-label-tertiary);text-transform:uppercase;justify-content:space-between;align-items:center;padding:6px 12px 4px;display:flex}.S5HVoW_gitLink{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-brand-primary);cursor:pointer;background:0 0;border:none;padding:0}.S5HVoW_gitLink:hover:not(:disabled){text-decoration:underline}.S5HVoW_gitLink:disabled{opacity:.4;cursor:default}.S5HVoW_gitRow{min-height:34px;animation:S5HVoW_dsh-row-in .15s var(--ds-ease-in-out);border-radius:8px;align-items:center;gap:6px;margin:0 6px;padding:0 8px;display:flex}.S5HVoW_gitRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_gitRowSelected{background:var(--dsw-alias-interactive-bg-active)}.S5HVoW_gitRowMain{cursor:pointer;text-align:left;background:0 0;border:none;flex:1;align-items:center;gap:8px;min-width:0;padding:3px 0;display:flex}.S5HVoW_gitBadge{width:20px;height:16px;font:var(--dsw-font-xxxs-strong-11);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;justify-content:center;align-items:center;display:inline-flex}.S5HVoW_gitName{text-overflow:ellipsis;white-space:nowrap;min-width:0;font:var(--dsw-font-s-14);color:var(--dsw-alias-label-primary);flex:1;overflow:hidden}.S5HVoW_gitEmpty{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);padding:4px 12px 8px}.S5HVoW_gitPlaceholder{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);text-align:center;padding:16px}.S5HVoW_gitError{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-error-primary);white-space:pre-wrap;padding:8px 12px}.S5HVoW_gitDiff{border-top:1px solid var(--dsw-alias-border-l1);padding:8px}.S5HVoW_gitDiffTab{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;overflow:hidden auto}.S5HVoW_gitDiffTabHeader{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:8px;height:36px;padding:0 8px 0 12px;display:flex}.S5HVoW_gitDiffTabTitle{text-overflow:ellipsis;white-space:nowrap;min-width:0;font:var(--dsw-font-xxs-strong-12);color:var(--dsw-alias-label-primary);flex:1;overflow:hidden}.S5HVoW_gitDiffFile{width:100%;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;align-items:baseline;gap:6px;padding:8px 2px 2px;display:flex}.S5HVoW_gitDiffFile:disabled{cursor:default}.S5HVoW_gitDiffFile:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_gitDiffFileChevron{color:var(--dsw-alias-label-tertiary);flex:none;transform:rotate(0)}.S5HVoW_gitDiffFileChevronExpanded{transform:rotate(90deg)}.S5HVoW_gitDiffFilePath{font:var(--dsw-font-xxs-strong-12);color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.S5HVoW_gitDiffFileOld{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;flex:none;max-width:40%;overflow:hidden}.S5HVoW_gitDiffFileTag{border:1px solid var(--dsw-alias-border-l2);font:var(--dsw-font-xxxs-strong-11);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:0 6px}.S5HVoW_gitDiffHunk{font:var(--dsw-font-markdown-code-block-small);color:var(--dsw-alias-label-tertiary);gap:8px;padding:3px 2px;display:flex}.S5HVoW_gitDiffHunkHeader{color:var(--dsw-alias-label-secondary);flex:none}.S5HVoW_gitDiffHunkSection{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.S5HVoW_gitDiffLine{font:var(--dsw-font-markdown-code-block-small);white-space:pre-wrap;overflow-wrap:anywhere;align-items:stretch;min-width:0;line-height:20px;display:flex}.S5HVoW_gitDiffNum{text-align:right;width:36px;color:var(--dsw-alias-label-tertiary);user-select:none;flex:none;padding-right:8px}.S5HVoW_gitDiffCode{flex:1;min-width:0;overflow:visible}.S5HVoW_gitDiffCtx{color:var(--dsw-alias-label-primary)}.S5HVoW_gitDiffDel{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent)}.S5HVoW_gitDiffAdd{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent)}.S5HVoW_gitDiffMeta{padding-left:2px}.S5HVoW_gitDiffMetaText{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary);font-style:italic}.S5HVoW_gitDiffExpand{width:100%;font:var(--dsw-font-xxs-12);color:var(--dsw-alias-brand-primary);cursor:pointer;text-align:center;background:0 0;border:none;margin:4px 0;display:block}.S5HVoW_gitDiffExpand:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_gitConfirmDesc{font:var(--dsw-font-s-14);color:var(--dsw-alias-label-primary);white-space:pre-wrap;margin:0}.S5HVoW_gitCommit{border-top:1px solid var(--dsw-alias-border-l1);align-items:center;gap:6px;padding:8px 12px;display:flex}.S5HVoW_gitCommitInput{flex:1;min-width:0}.S5HVoW_gitCommitButton{background:var(--dsw-alias-button-primary-fill);height:26px;color:var(--dsw-alias-label-primary-inverted);font:var(--dsw-font-xxs-strong-12);cursor:pointer;border:none;border-radius:6px;flex:none;padding:0 12px}.S5HVoW_gitCommitButton:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)}.S5HVoW_gitCommitButton:disabled{opacity:.45;cursor:default}.S5HVoW_gitLogRow{cursor:pointer;border-radius:8px;flex-direction:column;gap:2px;padding:5px 12px;display:flex}.S5HVoW_gitLogRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.S5HVoW_gitLogLine1{align-items:baseline;gap:8px;min-width:0;display:flex}.S5HVoW_gitLogHash{font:var(--dsw-font-markdown-code-block-small);color:var(--dsw-alias-label-tertiary);flex:none}.S5HVoW_gitLogLine2{flex-wrap:wrap;align-items:center;gap:6px;min-width:0;display:flex}.S5HVoW_gitLogRef{border:1px solid var(--dsw-alias-border-l2);font:var(--dsw-font-xxxs-strong-11);color:var(--dsw-alias-brand-primary);white-space:nowrap;border-radius:999px;flex:none;padding:0 5px}.S5HVoW_gitLogSubject{text-overflow:ellipsis;white-space:nowrap;min-width:0;font:var(--dsw-font-s-14);color:var(--dsw-alias-label-primary);flex:1;overflow:hidden}.S5HVoW_gitLogMeta{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary)}.S5HVoW_gitLogMore{border:1px solid var(--dsw-alias-border-l2);width:calc(100% - 24px);font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border-radius:6px;margin:4px 12px 8px;padding:6px 0;display:block}.S5HVoW_gitLogMore:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_gitLogMore:disabled{opacity:.5;cursor:default}.S5HVoW_producedRow{flex-wrap:wrap;align-items:center;gap:8px;padding:4px 0;display:flex}.S5HVoW_producedLabel{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary)}.S5HVoW_producedChip{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);max-width:200px;color:var(--dsw-alias-label-secondary);font:var(--dsw-font-xxs-12);cursor:pointer;border-radius:999px;align-items:center;gap:4px;padding:2px 8px;display:inline-flex;overflow:hidden}.S5HVoW_producedChip:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_producedChip span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.S5HVoW_producedMore{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary)}.S5HVoW_toggleButton:focus-visible,.S5HVoW_iconButton:focus-visible,.S5HVoW_tab:focus-visible,.S5HVoW_tabClose:focus-visible,.S5HVoW_tabBarPlus:focus-visible,.S5HVoW_paneCard:focus-visible,.S5HVoW_explorerRow:focus-visible,.S5HVoW_explorerRef:focus-visible,.S5HVoW_gitRowMain:focus-visible,.S5HVoW_gitLink:focus-visible,.S5HVoW_gitCommitButton:focus-visible,.S5HVoW_gitLogRow:focus-visible,.S5HVoW_gitLogMore:focus-visible,.S5HVoW_gitDiffFile:focus-visible,.S5HVoW_gitDiffExpand:focus-visible,.S5HVoW_terminalRetry:focus-visible,.S5HVoW_editorDownloadLink:focus-visible{outline:2px solid var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-1px}@media (prefers-reduced-motion:reduce){.S5HVoW_panel,.S5HVoW_panelHidden,.S5HVoW_toggleCluster,.S5HVoW_toggleButton,.S5HVoW_tab,.S5HVoW_tabBarPlus,.S5HVoW_paneCard,.S5HVoW_explorerRow,.S5HVoW_gitRow,.S5HVoW_divider,.S5HVoW_dividerRow:after,.S5HVoW_dividerCol:after{transition:none;animation:none}}@media (width<=767px){.S5HVoW_panel:not(.S5HVoW_panelHidden) .S5HVoW_tabBar{padding-right:40px}.S5HVoW_tab{min-width:48px;max-width:128px}}.S5HVoW_openWithLabel{align-items:center;gap:8px;width:100%;min-width:0;display:flex}.S5HVoW_openWithName{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}.S5HVoW_openWithChevron{color:var(--dsw-alias-label-tertiary);flex:none}.S5HVoW_openWithPin{width:20px;height:20px;color:var(--dsw-alias-label-tertiary);cursor:pointer;border-radius:6px;flex:none;justify-content:center;align-items:center;display:inline-flex}.S5HVoW_openWithPin:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.S5HVoW_openWithPinActive{color:var(--dsw-alias-state-business-primary)}@keyframes S5HVoW_dsh-toc-flash{0%,60%{background:var(--dsw-alias-interactive-bg-hover)}to{background:0 0}}";
9960
9884
  const tagId$4 = "dsh-external/dsh-coding-sidebar/sidebar.module.css";
9961
9885
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$4) + "]") === null) {
9962
9886
  const tag = document.createElement("style");
@@ -9966,241 +9890,203 @@ window.__ModuleLoader__.load({
9966
9890
  document.head.appendChild(tag);
9967
9891
  }
9968
9892
  var sidebar_module_css_default = {
9969
- "gitDiffExpand": "S5HVoW_gitDiffExpand",
9970
- "uploadOverlayProgress": "S5HVoW_uploadOverlayProgress",
9971
- "gitDiffLine": "S5HVoW_gitDiffLine",
9972
- "tabBadge": "S5HVoW_tabBadge",
9973
- "terminalDepsTitle": "S5HVoW_terminalDepsTitle",
9893
+ "sandboxDot": "S5HVoW_sandboxDot",
9894
+ "terminalRetry": "S5HVoW_terminalRetry",
9895
+ "gitDiffMeta": "S5HVoW_gitDiffMeta",
9896
+ "editorStatus": "S5HVoW_editorStatus",
9897
+ "uploadDropHero": "S5HVoW_uploadDropHero",
9898
+ "editorHeader": "S5HVoW_editorHeader",
9899
+ "gitDiffCode": "S5HVoW_gitDiffCode",
9900
+ "panel": "S5HVoW_panel",
9901
+ "sandboxStatusOff": "S5HVoW_sandboxStatusOff",
9974
9902
  "panelResizeActive": "S5HVoW_panelResizeActive",
9975
- "uploadOverlayCancel": "S5HVoW_uploadOverlayCancel",
9976
- "editorMd": "S5HVoW_editorMd",
9977
- "explorerRowDropTarget": "S5HVoW_explorerRowDropTarget",
9978
- "gitSectionHeader": "S5HVoW_gitSectionHeader",
9979
- "paneCard": "S5HVoW_paneCard",
9980
- "mermaidCode": "S5HVoW_mermaidCode",
9903
+ "gitDiffDel": "S5HVoW_gitDiffDel",
9904
+ "explorerEmpty": "S5HVoW_explorerEmpty",
9905
+ "panelBody": "S5HVoW_panelBody",
9906
+ "gitBranchSelect": "S5HVoW_gitBranchSelect",
9981
9907
  "terminal": "S5HVoW_terminal",
9982
- "editorTreeDock": "S5HVoW_editorTreeDock",
9983
- "gitBadge": "S5HVoW_gitBadge",
9984
- "divider": "S5HVoW_divider",
9985
- "explorerRowRevealed": "S5HVoW_explorerRowRevealed",
9986
- "editorHtml": "S5HVoW_editorHtml",
9987
- "uploadOverlayCard": "S5HVoW_uploadOverlayCard",
9988
- "gitRow": "S5HVoW_gitRow",
9989
- "floatWindow": "S5HVoW_floatWindow",
9990
- "mermaidError": "S5HVoW_mermaidError",
9991
- "split": "S5HVoW_split",
9992
- "editorHeader": "S5HVoW_editorHeader",
9993
- "uploadDropChatCard": "S5HVoW_uploadDropChatCard",
9994
- "gitDiffFileOld": "S5HVoW_gitDiffFileOld",
9995
- "editorSearchInput": "S5HVoW_editorSearchInput",
9996
- "gitDiffTab": "S5HVoW_gitDiffTab",
9997
- "gitDiffFileTag": "S5HVoW_gitDiffFileTag",
9998
- "boundaryError": "S5HVoW_boundaryError",
9999
- "paneTab": "S5HVoW_paneTab",
10000
- "editorTreePanelFull": "S5HVoW_editorTreePanelFull",
10001
- "gitDiffTabHeader": "S5HVoW_gitDiffTabHeader",
10002
- "gitLogHash": "S5HVoW_gitLogHash",
10003
- "dsh-row-in": "S5HVoW_dsh-row-in",
10004
- "editorBinary": "S5HVoW_editorBinary",
10005
- "editorError": "S5HVoW_editorError",
10006
- "toggleButton": "S5HVoW_toggleButton",
10007
- "floatHeader": "S5HVoW_floatHeader",
10008
- "floatContent": "S5HVoW_floatContent",
10009
- "tabBarDrop": "S5HVoW_tabBarDrop",
10010
- "uploadDropChatHint": "S5HVoW_uploadDropChatHint",
10011
- "sandboxStatusText": "S5HVoW_sandboxStatusText",
10012
- "gitLogLine1": "S5HVoW_gitLogLine1",
10013
- "openWithName": "S5HVoW_openWithName",
10014
- "dropOverlay": "S5HVoW_dropOverlay",
10015
- "floatWindowDragging": "S5HVoW_floatWindowDragging",
10016
- "editorDownloadLink": "S5HVoW_editorDownloadLink",
10017
- "explorerBody": "S5HVoW_explorerBody",
10018
- "terminalDepsNote": "S5HVoW_terminalDepsNote",
10019
- "gitName": "S5HVoW_gitName",
10020
- "editorMain": "S5HVoW_editorMain",
10021
- "gitError": "S5HVoW_gitError",
9908
+ "uploadDropZone": "S5HVoW_uploadDropZone",
10022
9909
  "gitLogLine2": "S5HVoW_gitLogLine2",
9910
+ "uploadDropChatCard": "S5HVoW_uploadDropChatCard",
10023
9911
  "dsh-toc-flash": "S5HVoW_dsh-toc-flash",
10024
- "dirtyDot": "S5HVoW_dirtyDot",
10025
- "paneEmptyCards": "S5HVoW_paneEmptyCards",
10026
- "dropDown": "S5HVoW_dropDown",
10027
- "openWithLabel": "S5HVoW_openWithLabel",
10028
- "editor": "S5HVoW_editor",
10029
- "panelResize": "S5HVoW_panelResize",
10030
- "editorStatus": "S5HVoW_editorStatus",
10031
- "panelHidden": "S5HVoW_panelHidden",
10032
- "editorTreeToggleActive": "S5HVoW_editorTreeToggleActive",
10033
9912
  "paneContent": "S5HVoW_paneContent",
10034
- "mermaidModalHint": "S5HVoW_mermaidModalHint",
10035
- "gitDiffCtx": "S5HVoW_gitDiffCtx",
10036
- "tabBarPlus": "S5HVoW_tabBarPlus",
10037
- "editorTreePanel": "S5HVoW_editorTreePanel",
10038
- "editorBody": "S5HVoW_editorBody",
10039
- "gitHeader": "S5HVoW_gitHeader",
10040
- "workbench": "S5HVoW_workbench",
10041
- "gitDiff": "S5HVoW_gitDiff",
10042
- "uploadDropZone": "S5HVoW_uploadDropZone",
10043
- "orphanedType": "S5HVoW_orphanedType",
10044
- "producedRow": "S5HVoW_producedRow",
10045
- "git": "S5HVoW_git",
10046
- "terminalDepsActions": "S5HVoW_terminalDepsActions",
10047
- "mermaidModal": "S5HVoW_mermaidModal",
10048
- "editorPdfFrame": "S5HVoW_editorPdfFrame",
10049
- "gitLink": "S5HVoW_gitLink",
10050
- "editorImageWrap": "S5HVoW_editorImageWrap",
10051
- "dropRight": "S5HVoW_dropRight",
10052
- "tocPanel": "S5HVoW_tocPanel",
10053
- "dropLeft": "S5HVoW_dropLeft",
10054
9913
  "tabBar": "S5HVoW_tabBar",
10055
- "gitWorktreeLabel": "S5HVoW_gitWorktreeLabel",
10056
- "editorCm": "S5HVoW_editorCm",
10057
- "tocFlash": "S5HVoW_tocFlash",
10058
- "gitDiffAdd": "S5HVoW_gitDiffAdd",
10059
- "uploadOverlayProgressFill": "S5HVoW_uploadOverlayProgressFill",
10060
- "tocItemText": "S5HVoW_tocItemText",
10061
- "explorerRoot": "S5HVoW_explorerRoot",
9914
+ "editorSearchHint": "S5HVoW_editorSearchHint",
10062
9915
  "browserStart": "S5HVoW_browserStart",
10063
- "gitRowSelected": "S5HVoW_gitRowSelected",
10064
- "mermaidCopy": "S5HVoW_mermaidCopy",
10065
- "gitCommitInput": "S5HVoW_gitCommitInput",
10066
- "mermaidModalToolbar": "S5HVoW_mermaidModalToolbar",
10067
- "gitLogRef": "S5HVoW_gitLogRef",
10068
- "editorBinaryNotice": "S5HVoW_editorBinaryNotice",
9916
+ "gitDiff": "S5HVoW_gitDiff",
9917
+ "editorPlaceholder": "S5HVoW_editorPlaceholder",
9918
+ "tabActive": "S5HVoW_tabActive",
10069
9919
  "gitDiffHunkHeader": "S5HVoW_gitDiffHunkHeader",
10070
- "explorer": "S5HVoW_explorer",
9920
+ "uploadDropZonePill": "S5HVoW_uploadDropZonePill",
9921
+ "explorerBody": "S5HVoW_explorerBody",
9922
+ "tabBoundaryError": "S5HVoW_tabBoundaryError",
9923
+ "gitDiffCtx": "S5HVoW_gitDiffCtx",
10071
9924
  "explorerHeader": "S5HVoW_explorerHeader",
10072
- "openWithChevron": "S5HVoW_openWithChevron",
10073
- "mermaidMarkdown": "S5HVoW_mermaidMarkdown",
10074
- "gitBranchSelect": "S5HVoW_gitBranchSelect",
10075
- "editorPdfDragShield": "S5HVoW_editorPdfDragShield",
10076
- "gitDiffMeta": "S5HVoW_gitDiffMeta",
10077
- "editorPptxButton": "S5HVoW_editorPptxButton",
10078
- "explorerName": "S5HVoW_explorerName",
10079
- "uploadDropZoneText": "S5HVoW_uploadDropZoneText",
10080
- "terminalWrap": "S5HVoW_terminalWrap",
10081
- "iconButton": "S5HVoW_iconButton",
10082
- "mermaidModalStage": "S5HVoW_mermaidModalStage",
10083
- "floatDropHintLabel": "S5HVoW_floatDropHintLabel",
10084
- "gitEmpty": "S5HVoW_gitEmpty",
9925
+ "dsh-row-in": "S5HVoW_dsh-row-in",
9926
+ "uploadDropChatHint": "S5HVoW_uploadDropChatHint",
9927
+ "browserInput": "S5HVoW_browserInput",
9928
+ "explorer": "S5HVoW_explorer",
9929
+ "floatResize": "S5HVoW_floatResize",
9930
+ "editorTitle": "S5HVoW_editorTitle",
9931
+ "orphanedType": "S5HVoW_orphanedType",
9932
+ "editorBanner": "S5HVoW_editorBanner",
9933
+ "paneEmptyCards": "S5HVoW_paneEmptyCards",
9934
+ "gitDiffHunk": "S5HVoW_gitDiffHunk",
9935
+ "selectionPopup": "S5HVoW_selectionPopup",
9936
+ "splitCol": "S5HVoW_splitCol",
9937
+ "toggleButton": "S5HVoW_toggleButton",
10085
9938
  "gitDiffHunkSection": "S5HVoW_gitDiffHunkSection",
10086
- "gitWorktreeRow": "S5HVoW_gitWorktreeRow",
10087
- "openWithPinActive": "S5HVoW_openWithPinActive",
10088
- "editorImage": "S5HVoW_editorImage",
10089
- "editorPdfStage": "S5HVoW_editorPdfStage",
10090
- "producedLabel": "S5HVoW_producedLabel",
10091
- "terminalDepsHint": "S5HVoW_terminalDepsHint",
10092
- "uploadOverlay": "S5HVoW_uploadOverlay",
9939
+ "explorerRef": "S5HVoW_explorerRef",
10093
9940
  "editorTreeResize": "S5HVoW_editorTreeResize",
10094
- "gitLogMore": "S5HVoW_gitLogMore",
10095
- "tabActive": "S5HVoW_tabActive",
10096
- "editorPdfDragShieldActive": "S5HVoW_editorPdfDragShieldActive",
10097
- "editorModeActive": "S5HVoW_editorModeActive",
10098
- "explorerHidden": "S5HVoW_explorerHidden",
10099
- "uploadOverlayTitle": "S5HVoW_uploadOverlayTitle",
10100
- "editorPdf": "S5HVoW_editorPdf",
10101
- "floatDropHint": "S5HVoW_floatDropHint",
10102
- "editorPdfToolbar": "S5HVoW_editorPdfToolbar",
9941
+ "gitPlaceholder": "S5HVoW_gitPlaceholder",
9942
+ "dropDown": "S5HVoW_dropDown",
10103
9943
  "terminalDepsBanner": "S5HVoW_terminalDepsBanner",
10104
- "tabBoundaryError": "S5HVoW_tabBoundaryError",
9944
+ "sandboxStatus": "S5HVoW_sandboxStatus",
9945
+ "uploadOverlay": "S5HVoW_uploadOverlay",
9946
+ "editorStatusError": "S5HVoW_editorStatusError",
10105
9947
  "producedChip": "S5HVoW_producedChip",
10106
- "panelBody": "S5HVoW_panelBody",
9948
+ "gitName": "S5HVoW_gitName",
9949
+ "editor": "S5HVoW_editor",
9950
+ "editorTreePanelFull": "S5HVoW_editorTreePanelFull",
9951
+ "gitLogMeta": "S5HVoW_gitLogMeta",
9952
+ "tabBadge": "S5HVoW_tabBadge",
9953
+ "explorerRow": "S5HVoW_explorerRow",
9954
+ "openWithPinActive": "S5HVoW_openWithPinActive",
9955
+ "gitCommit": "S5HVoW_gitCommit",
9956
+ "gitLogHash": "S5HVoW_gitLogHash",
9957
+ "paneDrop": "S5HVoW_paneDrop",
9958
+ "explorerRowRevealed": "S5HVoW_explorerRowRevealed",
9959
+ "floatWindow": "S5HVoW_floatWindow",
9960
+ "editorSearchInput": "S5HVoW_editorSearchInput",
9961
+ "gitError": "S5HVoW_gitError",
9962
+ "sandboxStatusOn": "S5HVoW_sandboxStatusOn",
9963
+ "openWithName": "S5HVoW_openWithName",
9964
+ "gitDiffMetaText": "S5HVoW_gitDiffMetaText",
9965
+ "openWithChevron": "S5HVoW_openWithChevron",
9966
+ "browserBlockedDesc": "S5HVoW_browserBlockedDesc",
9967
+ "paneTabHidden": "S5HVoW_paneTabHidden",
9968
+ "editorBody": "S5HVoW_editorBody",
9969
+ "editorTreeToggleActive": "S5HVoW_editorTreeToggleActive",
9970
+ "gitDiffFileTag": "S5HVoW_gitDiffFileTag",
9971
+ "editorBinaryNotice": "S5HVoW_editorBinaryNotice",
9972
+ "editorMain": "S5HVoW_editorMain",
9973
+ "explorerError": "S5HVoW_explorerError",
10107
9974
  "dividerRow": "S5HVoW_dividerRow",
10108
- "splitRow": "S5HVoW_splitRow",
10109
- "terminalRetry": "S5HVoW_terminalRetry",
10110
- "producedMore": "S5HVoW_producedMore",
10111
- "explorerSymlink": "S5HVoW_explorerSymlink",
10112
- "uploadDropHero": "S5HVoW_uploadDropHero",
10113
- "sandboxStatusOff": "S5HVoW_sandboxStatusOff",
10114
- "sandboxDot": "S5HVoW_sandboxDot",
10115
- "floatResize": "S5HVoW_floatResize",
9975
+ "tabBarPlus": "S5HVoW_tabBarPlus",
9976
+ "explorerRowDropTarget": "S5HVoW_explorerRowDropTarget",
9977
+ "terminalDepsActions": "S5HVoW_terminalDepsActions",
10116
9978
  "explorerBroken": "S5HVoW_explorerBroken",
10117
- "browserBlocked": "S5HVoW_browserBlocked",
10118
- "editorDocxZoomRange": "S5HVoW_editorDocxZoomRange",
10119
- "openWithPin": "S5HVoW_openWithPin",
10120
9979
  "floatClose": "S5HVoW_floatClose",
10121
- "browserBlockedButton": "S5HVoW_browserBlockedButton",
10122
- "uploadDropZonePill": "S5HVoW_uploadDropZonePill",
10123
- "editorBanner": "S5HVoW_editorBanner",
10124
- "terminalBannerUrl": "S5HVoW_terminalBannerUrl",
10125
- "gitDiffHunk": "S5HVoW_gitDiffHunk",
10126
- "dropUp": "S5HVoW_dropUp",
10127
- "pinnedTab": "S5HVoW_pinnedTab",
10128
- "browserFrame": "S5HVoW_browserFrame",
10129
- "tab": "S5HVoW_tab",
10130
- "gitConfirmDesc": "S5HVoW_gitConfirmDesc",
10131
- "browserBlockedTitle": "S5HVoW_browserBlockedTitle",
10132
- "browserInput": "S5HVoW_browserInput",
10133
- "explorerError": "S5HVoW_explorerError",
10134
- "editorModeToggle": "S5HVoW_editorModeToggle",
10135
- "panel": "S5HVoW_panel",
10136
- "sandboxAction": "S5HVoW_sandboxAction",
10137
- "tabList": "S5HVoW_tabList",
10138
- "browserMessage": "S5HVoW_browserMessage",
10139
- "gitPlaceholder": "S5HVoW_gitPlaceholder",
9980
+ "explorerDir": "S5HVoW_explorerDir",
10140
9981
  "gitCommitButton": "S5HVoW_gitCommitButton",
10141
- "uploadOverlayStatus": "S5HVoW_uploadOverlayStatus",
10142
- "dividerCol": "S5HVoW_dividerCol",
10143
- "gitLogSubject": "S5HVoW_gitLogSubject",
10144
- "explorerEmpty": "S5HVoW_explorerEmpty",
9982
+ "gitDiffFileChevronExpanded": "S5HVoW_gitDiffFileChevronExpanded",
9983
+ "floatDropHint": "S5HVoW_floatDropHint",
9984
+ "gitConfirmDesc": "S5HVoW_gitConfirmDesc",
9985
+ "terminalBanner": "S5HVoW_terminalBanner",
9986
+ "tab": "S5HVoW_tab",
9987
+ "panelHidden": "S5HVoW_panelHidden",
9988
+ "editorSearchResult": "S5HVoW_editorSearchResult",
9989
+ "editorDownloadLink": "S5HVoW_editorDownloadLink",
9990
+ "sandboxStatusText": "S5HVoW_sandboxStatusText",
9991
+ "browser": "S5HVoW_browser",
9992
+ "dirtyDot": "S5HVoW_dirtyDot",
9993
+ "tabList": "S5HVoW_tabList",
9994
+ "paneCard": "S5HVoW_paneCard",
9995
+ "browserBlocked": "S5HVoW_browserBlocked",
10145
9996
  "terminalRepairCommand": "S5HVoW_terminalRepairCommand",
10146
- "editorPathInput": "S5HVoW_editorPathInput",
10147
- "gitDiffFilePath": "S5HVoW_gitDiffFilePath",
10148
- "browserBlockedActions": "S5HVoW_browserBlockedActions",
10149
- "gitDiffMetaText": "S5HVoW_gitDiffMetaText",
9997
+ "gitRow": "S5HVoW_gitRow",
9998
+ "gitRowSelected": "S5HVoW_gitRowSelected",
9999
+ "gitDiffFile": "S5HVoW_gitDiffFile",
10000
+ "gitDiffLine": "S5HVoW_gitDiffLine",
10150
10001
  "gitDiffNum": "S5HVoW_gitDiffNum",
10151
- "editorStatusError": "S5HVoW_editorStatusError",
10152
- "gitDiffTabTitle": "S5HVoW_gitDiffTabTitle",
10153
- "dividerActive": "S5HVoW_dividerActive",
10154
- "editorPdfFrameBlocked": "S5HVoW_editorPdfFrameBlocked",
10155
- "editorHtmlBlock": "S5HVoW_editorHtmlBlock",
10156
- "tocItem": "S5HVoW_tocItem",
10157
- "explorerCopied": "S5HVoW_explorerCopied",
10158
- "gitLogRow": "S5HVoW_gitLogRow",
10159
- "gitSection": "S5HVoW_gitSection",
10160
- "mermaidHeader": "S5HVoW_mermaidHeader",
10161
- "editorTitle": "S5HVoW_editorTitle",
10162
- "editorTreeSearch": "S5HVoW_editorTreeSearch",
10163
- "browserBlockedDesc": "S5HVoW_browserBlockedDesc",
10164
- "floatTitle": "S5HVoW_floatTitle",
10002
+ "gitLogLine1": "S5HVoW_gitLogLine1",
10165
10003
  "pane": "S5HVoW_pane",
10166
- "tocItemLevel": "S5HVoW_tocItemLevel",
10167
- "gitLogMeta": "S5HVoW_gitLogMeta",
10168
- "selectionPopup": "S5HVoW_selectionPopup",
10169
- "editorSearchResult": "S5HVoW_editorSearchResult",
10170
- "mermaidModalButton": "S5HVoW_mermaidModalButton",
10004
+ "dropLeft": "S5HVoW_dropLeft",
10005
+ "gitWorktreeRow": "S5HVoW_gitWorktreeRow",
10006
+ "gitDiffTabHeader": "S5HVoW_gitDiffTabHeader",
10007
+ "gitCommitInput": "S5HVoW_gitCommitInput",
10008
+ "terminalDepsNote": "S5HVoW_terminalDepsNote",
10009
+ "terminalWrap": "S5HVoW_terminalWrap",
10010
+ "gitDiffExpand": "S5HVoW_gitDiffExpand",
10171
10011
  "gitDiffFileChevron": "S5HVoW_gitDiffFileChevron",
10172
- "mermaidBody": "S5HVoW_mermaidBody",
10173
- "explorerRow": "S5HVoW_explorerRow",
10012
+ "uploadOverlayCancel": "S5HVoW_uploadOverlayCancel",
10013
+ "workbench": "S5HVoW_workbench",
10014
+ "producedRow": "S5HVoW_producedRow",
10015
+ "paneTab": "S5HVoW_paneTab",
10016
+ "gitHeader": "S5HVoW_gitHeader",
10017
+ "splitChild": "S5HVoW_splitChild",
10018
+ "explorerRoot": "S5HVoW_explorerRoot",
10019
+ "gitSection": "S5HVoW_gitSection",
10020
+ "gitBadge": "S5HVoW_gitBadge",
10021
+ "openWithLabel": "S5HVoW_openWithLabel",
10022
+ "dropUp": "S5HVoW_dropUp",
10023
+ "floatDropHintLabel": "S5HVoW_floatDropHintLabel",
10024
+ "browserBlockedActions": "S5HVoW_browserBlockedActions",
10025
+ "explorerSymlink": "S5HVoW_explorerSymlink",
10174
10026
  "dropCenter": "S5HVoW_dropCenter",
10175
- "editorSearchHint": "S5HVoW_editorSearchHint",
10176
- "explorerRef": "S5HVoW_explorerRef",
10177
- "paneTabHidden": "S5HVoW_paneTabHidden",
10178
- "gitRowMain": "S5HVoW_gitRowMain",
10179
- "mermaidWrap": "S5HVoW_mermaidWrap",
10180
- "tabTitle": "S5HVoW_tabTitle",
10181
- "explorerDir": "S5HVoW_explorerDir",
10182
- "browserBar": "S5HVoW_browserBar",
10183
- "gitDiffFile": "S5HVoW_gitDiffFile",
10184
- "mermaidInfo": "S5HVoW_mermaidInfo",
10185
- "editorPlaceholder": "S5HVoW_editorPlaceholder",
10186
- "browser": "S5HVoW_browser",
10187
- "gitDiffFileChevronExpanded": "S5HVoW_gitDiffFileChevronExpanded",
10188
- "gitDiffDel": "S5HVoW_gitDiffDel",
10189
- "terminalBanner": "S5HVoW_terminalBanner",
10190
- "paneDrop": "S5HVoW_paneDrop",
10191
- "sandboxStatusOn": "S5HVoW_sandboxStatusOn",
10192
- "editorModeButton": "S5HVoW_editorModeButton",
10027
+ "pinnedTab": "S5HVoW_pinnedTab",
10028
+ "editorTreePanel": "S5HVoW_editorTreePanel",
10029
+ "editorBinary": "S5HVoW_editorBinary",
10030
+ "browserMessage": "S5HVoW_browserMessage",
10031
+ "browserFrame": "S5HVoW_browserFrame",
10193
10032
  "terminalDepsCommandRow": "S5HVoW_terminalDepsCommandRow",
10194
- "tocBar": "S5HVoW_tocBar",
10195
- "tocButton": "S5HVoW_tocButton",
10196
- "editorCmHidden": "S5HVoW_editorCmHidden",
10197
- "splitChild": "S5HVoW_splitChild",
10198
- "toggleCluster": "S5HVoW_toggleCluster",
10033
+ "gitEmpty": "S5HVoW_gitEmpty",
10199
10034
  "tabClose": "S5HVoW_tabClose",
10200
- "sandboxStatus": "S5HVoW_sandboxStatus",
10201
- "gitDiffCode": "S5HVoW_gitDiffCode",
10202
- "gitCommit": "S5HVoW_gitCommit",
10203
- "splitCol": "S5HVoW_splitCol"
10035
+ "gitDiffTab": "S5HVoW_gitDiffTab",
10036
+ "gitLogRef": "S5HVoW_gitLogRef",
10037
+ "uploadDropZoneText": "S5HVoW_uploadDropZoneText",
10038
+ "uploadOverlayProgress": "S5HVoW_uploadOverlayProgress",
10039
+ "dropRight": "S5HVoW_dropRight",
10040
+ "terminalBannerUrl": "S5HVoW_terminalBannerUrl",
10041
+ "gitLink": "S5HVoW_gitLink",
10042
+ "uploadOverlayStatus": "S5HVoW_uploadOverlayStatus",
10043
+ "floatWindowDragging": "S5HVoW_floatWindowDragging",
10044
+ "terminalDepsTitle": "S5HVoW_terminalDepsTitle",
10045
+ "git": "S5HVoW_git",
10046
+ "gitRowMain": "S5HVoW_gitRowMain",
10047
+ "gitDiffFileOld": "S5HVoW_gitDiffFileOld",
10048
+ "gitLogMore": "S5HVoW_gitLogMore",
10049
+ "uploadOverlayProgressFill": "S5HVoW_uploadOverlayProgressFill",
10050
+ "boundaryError": "S5HVoW_boundaryError",
10051
+ "gitLogRow": "S5HVoW_gitLogRow",
10052
+ "producedMore": "S5HVoW_producedMore",
10053
+ "dropOverlay": "S5HVoW_dropOverlay",
10054
+ "floatHeader": "S5HVoW_floatHeader",
10055
+ "explorerHidden": "S5HVoW_explorerHidden",
10056
+ "explorerName": "S5HVoW_explorerName",
10057
+ "sandboxAction": "S5HVoW_sandboxAction",
10058
+ "uploadOverlayTitle": "S5HVoW_uploadOverlayTitle",
10059
+ "gitDiffTabTitle": "S5HVoW_gitDiffTabTitle",
10060
+ "tabBarDrop": "S5HVoW_tabBarDrop",
10061
+ "editorTreeSearch": "S5HVoW_editorTreeSearch",
10062
+ "browserBar": "S5HVoW_browserBar",
10063
+ "editorCm": "S5HVoW_editorCm",
10064
+ "uploadOverlayCard": "S5HVoW_uploadOverlayCard",
10065
+ "terminalDepsHint": "S5HVoW_terminalDepsHint",
10066
+ "split": "S5HVoW_split",
10067
+ "editorError": "S5HVoW_editorError",
10068
+ "dividerActive": "S5HVoW_dividerActive",
10069
+ "producedLabel": "S5HVoW_producedLabel",
10070
+ "dividerCol": "S5HVoW_dividerCol",
10071
+ "gitDiffFilePath": "S5HVoW_gitDiffFilePath",
10072
+ "gitLogSubject": "S5HVoW_gitLogSubject",
10073
+ "editorPathInput": "S5HVoW_editorPathInput",
10074
+ "divider": "S5HVoW_divider",
10075
+ "floatContent": "S5HVoW_floatContent",
10076
+ "iconButton": "S5HVoW_iconButton",
10077
+ "splitRow": "S5HVoW_splitRow",
10078
+ "explorerCopied": "S5HVoW_explorerCopied",
10079
+ "browserBlockedTitle": "S5HVoW_browserBlockedTitle",
10080
+ "floatTitle": "S5HVoW_floatTitle",
10081
+ "editorTreeDock": "S5HVoW_editorTreeDock",
10082
+ "tabTitle": "S5HVoW_tabTitle",
10083
+ "gitWorktreeLabel": "S5HVoW_gitWorktreeLabel",
10084
+ "gitDiffAdd": "S5HVoW_gitDiffAdd",
10085
+ "browserBlockedButton": "S5HVoW_browserBlockedButton",
10086
+ "panelResize": "S5HVoW_panelResize",
10087
+ "gitSectionHeader": "S5HVoW_gitSectionHeader",
10088
+ "openWithPin": "S5HVoW_openWithPin",
10089
+ "toggleCluster": "S5HVoW_toggleCluster"
10204
10090
  };
10205
10091
  //#endregion
10206
10092
  //#region src/client/intercept.tsx
@@ -10553,23 +10439,15 @@ window.__ModuleLoader__.load({
10553
10439
  * the platform opener (argv, no shell). */
10554
10440
  openExternal: (payload) => call("open.external", payload)
10555
10441
  };
10556
- /** Absolute URL of the media route for one path (images only). */
10557
- function mediaUrl(scope, path) {
10558
- return fileUrl(scope, path, false);
10559
- }
10560
10442
  /** Absolute URL of the download route: serves raw bytes (binary-safe) with
10561
10443
  * `Content-Disposition: attachment`, so the browser saves the file. */
10562
10444
  function downloadUrl(scope, path) {
10563
- return fileUrl(scope, path, true);
10564
- }
10565
- /** Shared URL builder for the /sidebar/file route (media vs download). */
10566
- function fileUrl(scope, path, download) {
10567
10445
  const params = new URLSearchParams({
10568
10446
  sessionId: scope.sessionId,
10569
- path
10447
+ path,
10448
+ download: "1"
10570
10449
  });
10571
10450
  if (scope.cwd !== void 0 && scope.cwd !== "") params.set("cwd", scope.cwd);
10572
- if (download) params.set("download", "1");
10573
10451
  return `/sidebar/file?${params.toString()}`;
10574
10452
  }
10575
10453
  //#endregion
@@ -10590,67 +10468,6 @@ window.__ModuleLoader__.load({
10590
10468
  });
10591
10469
  }
10592
10470
  //#endregion
10593
- //#region src/client/editor-load.ts
10594
- /** Decode the host's base64 head bytes into the sniffing buffer. */
10595
- function decodeHead(headBase64) {
10596
- const binary = atob(headBase64);
10597
- const bytes = new Uint8Array(binary.length);
10598
- for (let i = 0; i < binary.length; i += 1) bytes[i] = binary.charCodeAt(i);
10599
- return bytes;
10600
- }
10601
- /**
10602
- * Dispatch one matched viewer's fetchStrategy. A missing viewer or a
10603
- * `binary-download` strategy both mean "no client-side renderer" → the
10604
- * download UI. `mediaUrlOf` builds the media URL for `mediaUrl`/`none`
10605
- * strategies (pure, but scope-bound — injected by the host).
10606
- */
10607
- function planFirstMatch(viewer, mediaUrlOf) {
10608
- if (viewer === void 0 || viewer.fetchStrategy === "binary-download") return { kind: "binary" };
10609
- switch (viewer.fetchStrategy) {
10610
- case "mediaUrl":
10611
- case "none": return {
10612
- kind: "render",
10613
- viewer,
10614
- mediaUrl: mediaUrlOf()
10615
- };
10616
- case "custom": return {
10617
- kind: "customLoad",
10618
- viewer
10619
- };
10620
- case "fsRead": return {
10621
- kind: "fetchFsRead",
10622
- viewer
10623
- };
10624
- }
10625
- }
10626
- /**
10627
- * Decide what an fsRead result means for the editor.
10628
- * - Text: the first match stands (content is valid for any fsRead viewer).
10629
- * - Binary: the host head bytes enable a re-match — a `detect` viewer (e.g.
10630
- * a plugin sniffing a binary format) may claim the file. `custom` viewers
10631
- * load their own bytes; `mediaUrl`/`none` viewers render the media route;
10632
- * an fsRead viewer or nothing cannot render binary → download UI.
10633
- */
10634
- function planFsReadOutcome(viewer, result, rematch, mediaUrlOf) {
10635
- if (!result.binary) return {
10636
- kind: "render",
10637
- viewer,
10638
- content: result.content,
10639
- truncated: result.truncated
10640
- };
10641
- const claimed = result.head === void 0 ? void 0 : rematch(decodeHead(result.head));
10642
- if (claimed !== void 0 && claimed.fetchStrategy === "custom") return {
10643
- kind: "customLoad",
10644
- viewer: claimed
10645
- };
10646
- if (claimed !== void 0 && (claimed.fetchStrategy === "mediaUrl" || claimed.fetchStrategy === "none")) return {
10647
- kind: "render",
10648
- viewer: claimed,
10649
- mediaUrl: mediaUrlOf()
10650
- };
10651
- return { kind: "binary" };
10652
- }
10653
- //#endregion
10654
10471
  //#region node_modules/.pnpm/react-icons@5.7.0_react@18.3.1/node_modules/react-icons/lib/iconContext.mjs
10655
10472
  var DefaultContext = {
10656
10473
  color: void 0,
@@ -11042,8 +10859,8 @@ window.__ModuleLoader__.load({
11042
10859
  strokeLinejoin: "round"
11043
10860
  })
11044
10861
  });
11045
- /** Image viewer glyph: a picture frame with a sun and a mountain. */
11046
- const IconImageOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
10862
+ /** Browser tab glyph: a globe with meridians. */
10863
+ const IconGlobeOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
11047
10864
  width: size,
11048
10865
  height: size,
11049
10866
  className,
@@ -11051,33 +10868,32 @@ window.__ModuleLoader__.load({
11051
10868
  fill: "none",
11052
10869
  xmlns: "http://www.w3.org/2000/svg",
11053
10870
  children: [
11054
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
11055
- x: "1.5",
11056
- y: "2.5",
11057
- width: "13",
11058
- height: "11",
11059
- rx: "2",
10871
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
10872
+ cx: "8",
10873
+ cy: "8",
10874
+ r: "6.5",
11060
10875
  stroke: "currentColor",
11061
10876
  strokeWidth: "1.5"
11062
10877
  }),
11063
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
11064
- cx: "5.5",
11065
- cy: "6",
11066
- r: "1.2",
10878
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ellipse", {
10879
+ cx: "8",
10880
+ cy: "8",
10881
+ rx: "2.8",
10882
+ ry: "6.5",
11067
10883
  stroke: "currentColor",
11068
10884
  strokeWidth: "1.5"
11069
10885
  }),
11070
10886
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11071
- d: "m3.5 12 3-3 2.25 2.25L11.5 8.5 13 10.5",
10887
+ d: "M1.5 8h13M8 1.5c-2.4 1.8-2.4 11.2 0 13M8 1.5c2.4 1.8 2.4 11.2 0 13",
11072
10888
  stroke: "currentColor",
11073
10889
  strokeWidth: "1.5",
11074
- strokeLinecap: "round",
11075
- strokeLinejoin: "round"
10890
+ strokeLinecap: "round"
11076
10891
  })
11077
10892
  ]
11078
10893
  });
11079
- /** PDF viewer glyph: a document frame with the "PDF" label. */
11080
- const IconPdfOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
10894
+ /** History glyph (thread switcher): a clock with a counterclockwise arrow,
10895
+ * in the app's outline style the "past conversations" mark. */
10896
+ const IconHistoryOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
11081
10897
  width: size,
11082
10898
  height: size,
11083
10899
  className,
@@ -11086,65 +10902,30 @@ window.__ModuleLoader__.load({
11086
10902
  xmlns: "http://www.w3.org/2000/svg",
11087
10903
  children: [
11088
10904
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11089
- d: "M3.5 1.5h6.5L13.5 5v9.5h-10z",
10905
+ d: "M2.4 6.8A5.6 5.6 0 1 1 2.4 9.2",
11090
10906
  stroke: "currentColor",
11091
10907
  strokeWidth: "1.5",
11092
- strokeLinejoin: "round"
10908
+ strokeLinecap: "round"
11093
10909
  }),
11094
10910
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11095
- d: "M9.5 1.5V5h4",
10911
+ d: "M2.2 3.4v3.4h3.4",
11096
10912
  stroke: "currentColor",
11097
10913
  strokeWidth: "1.5",
11098
- strokeLinejoin: "round"
11099
- }),
11100
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11101
- d: "M5 13.5v-3h1.4c.75 0 1.1.32 1.1.85 0 .54-.35.85-1.1.85H5.3",
11102
- stroke: "currentColor",
11103
- strokeWidth: "1.25",
11104
10914
  strokeLinecap: "round",
11105
10915
  strokeLinejoin: "round"
11106
10916
  }),
11107
10917
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11108
- d: "M8.3 13.5v-3h1.05c.8 0 1.35.5 1.35 1.5s-.55 1.5-1.35 1.5z",
10918
+ d: "M8 5.4V8l1.9 1.2",
11109
10919
  stroke: "currentColor",
11110
- strokeWidth: "1.25",
10920
+ strokeWidth: "1.5",
11111
10921
  strokeLinecap: "round",
11112
10922
  strokeLinejoin: "round"
11113
- }),
11114
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11115
- d: "M11.6 13.5v-3h1.3",
11116
- stroke: "currentColor",
11117
- strokeWidth: "1.25",
11118
- strokeLinecap: "round"
11119
10923
  })
11120
10924
  ]
11121
10925
  });
11122
- /** Markdown viewer glyph: the classic "M with a down arrow" badge. */
11123
- const IconMarkdownOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
11124
- width: size,
11125
- height: size,
11126
- className,
11127
- viewBox: "0 0 16 16",
11128
- fill: "none",
11129
- xmlns: "http://www.w3.org/2000/svg",
11130
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
11131
- x: "1.5",
11132
- y: "2.5",
11133
- width: "13",
11134
- height: "11",
11135
- rx: "2",
11136
- stroke: "currentColor",
11137
- strokeWidth: "1.5"
11138
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11139
- d: "M4 10.5V5.5l2 2.5 2-2.5v5M9.5 10.5v-5l2 2.5 2-2.5v5",
11140
- stroke: "currentColor",
11141
- strokeWidth: "1.5",
11142
- strokeLinecap: "round",
11143
- strokeLinejoin: "round"
11144
- })]
11145
- });
11146
- /** HTML viewer glyph: a document frame with a "‹/›" tag pair. */
11147
- const IconHtmlOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
10926
+ /** Save glyph (save-as-new-session): the classic floppy disk, in the app's
10927
+ * outline style. */
10928
+ const IconSaveOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
11148
10929
  width: size,
11149
10930
  height: size,
11150
10931
  className,
@@ -11153,133 +10934,38 @@ window.__ModuleLoader__.load({
11153
10934
  xmlns: "http://www.w3.org/2000/svg",
11154
10935
  children: [
11155
10936
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11156
- d: "M3.5 1.5h6.5L13.5 5v9.5h-10z",
10937
+ d: "M4.2 14.5h7.6a1.2 1.2 0 0 0 1.2-1.2V4.9L10.6 2.5H4.2A1.2 1.2 0 0 0 3 3.7v9.6a1.2 1.2 0 0 0 1.2 1.2z",
11157
10938
  stroke: "currentColor",
11158
10939
  strokeWidth: "1.5",
11159
10940
  strokeLinejoin: "round"
11160
10941
  }),
11161
10942
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11162
- d: "M9.5 1.5V5h4",
10943
+ d: "M10 2.5v2.6H5.6V2.5",
11163
10944
  stroke: "currentColor",
11164
10945
  strokeWidth: "1.5",
11165
10946
  strokeLinejoin: "round"
11166
10947
  }),
11167
10948
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11168
- d: "M5.6 13.2 4.2 10l1.4-3.2M7.4 6.8 8.8 10l-1.4 3.2",
10949
+ d: "M5.4 14.5v-4.2h5.2v4.2",
11169
10950
  stroke: "currentColor",
11170
- strokeWidth: "1.25",
11171
- strokeLinecap: "round",
10951
+ strokeWidth: "1.5",
11172
10952
  strokeLinejoin: "round"
11173
10953
  })
11174
10954
  ]
11175
10955
  });
11176
- /** Browser tab glyph: a globe with meridians. */
11177
- const IconGlobeOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
10956
+ /**
10957
+ * Visual Studio Code brand mark for the file-tree "open with" menu. The
10958
+ * path is the Simple Icons `visualstudiocode` glyph (CC0 1.0,
10959
+ * simple-icons@11.0.0 — later releases dropped it over Microsoft's brand
10960
+ * policy, so it is inlined here rather than pulled from react-icons),
10961
+ * rendered monochrome via currentColor to follow the active skin.
10962
+ */
10963
+ const IconVscode16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
11178
10964
  width: size,
11179
10965
  height: size,
11180
10966
  className,
11181
- viewBox: "0 0 16 16",
11182
- fill: "none",
11183
- xmlns: "http://www.w3.org/2000/svg",
11184
- children: [
11185
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
11186
- cx: "8",
11187
- cy: "8",
11188
- r: "6.5",
11189
- stroke: "currentColor",
11190
- strokeWidth: "1.5"
11191
- }),
11192
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ellipse", {
11193
- cx: "8",
11194
- cy: "8",
11195
- rx: "2.8",
11196
- ry: "6.5",
11197
- stroke: "currentColor",
11198
- strokeWidth: "1.5"
11199
- }),
11200
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11201
- d: "M1.5 8h13M8 1.5c-2.4 1.8-2.4 11.2 0 13M8 1.5c2.4 1.8 2.4 11.2 0 13",
11202
- stroke: "currentColor",
11203
- strokeWidth: "1.5",
11204
- strokeLinecap: "round"
11205
- })
11206
- ]
11207
- });
11208
- /** History glyph (thread switcher): a clock with a counterclockwise arrow,
11209
- * in the app's outline style — the "past conversations" mark. */
11210
- const IconHistoryOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
11211
- width: size,
11212
- height: size,
11213
- className,
11214
- viewBox: "0 0 16 16",
11215
- fill: "none",
11216
- xmlns: "http://www.w3.org/2000/svg",
11217
- children: [
11218
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11219
- d: "M2.4 6.8A5.6 5.6 0 1 1 2.4 9.2",
11220
- stroke: "currentColor",
11221
- strokeWidth: "1.5",
11222
- strokeLinecap: "round"
11223
- }),
11224
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11225
- d: "M2.2 3.4v3.4h3.4",
11226
- stroke: "currentColor",
11227
- strokeWidth: "1.5",
11228
- strokeLinecap: "round",
11229
- strokeLinejoin: "round"
11230
- }),
11231
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11232
- d: "M8 5.4V8l1.9 1.2",
11233
- stroke: "currentColor",
11234
- strokeWidth: "1.5",
11235
- strokeLinecap: "round",
11236
- strokeLinejoin: "round"
11237
- })
11238
- ]
11239
- });
11240
- /** Save glyph (save-as-new-session): the classic floppy disk, in the app's
11241
- * outline style. */
11242
- const IconSaveOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
11243
- width: size,
11244
- height: size,
11245
- className,
11246
- viewBox: "0 0 16 16",
11247
- fill: "none",
11248
- xmlns: "http://www.w3.org/2000/svg",
11249
- children: [
11250
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11251
- d: "M4.2 14.5h7.6a1.2 1.2 0 0 0 1.2-1.2V4.9L10.6 2.5H4.2A1.2 1.2 0 0 0 3 3.7v9.6a1.2 1.2 0 0 0 1.2 1.2z",
11252
- stroke: "currentColor",
11253
- strokeWidth: "1.5",
11254
- strokeLinejoin: "round"
11255
- }),
11256
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11257
- d: "M10 2.5v2.6H5.6V2.5",
11258
- stroke: "currentColor",
11259
- strokeWidth: "1.5",
11260
- strokeLinejoin: "round"
11261
- }),
11262
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11263
- d: "M5.4 14.5v-4.2h5.2v4.2",
11264
- stroke: "currentColor",
11265
- strokeWidth: "1.5",
11266
- strokeLinejoin: "round"
11267
- })
11268
- ]
11269
- });
11270
- /**
11271
- * Visual Studio Code brand mark for the file-tree "open with" menu. The
11272
- * path is the Simple Icons `visualstudiocode` glyph (CC0 1.0,
11273
- * simple-icons@11.0.0 — later releases dropped it over Microsoft's brand
11274
- * policy, so it is inlined here rather than pulled from react-icons),
11275
- * rendered monochrome via currentColor to follow the active skin.
11276
- */
11277
- const IconVscode16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
11278
- width: size,
11279
- height: size,
11280
- className,
11281
- viewBox: "0 0 24 24",
11282
- fill: "currentColor",
10967
+ viewBox: "0 0 24 24",
10968
+ fill: "currentColor",
11283
10969
  xmlns: "http://www.w3.org/2000/svg",
11284
10970
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M23.15 2.587L18.21.21a1.494 1.494 0 0 0-1.705.29l-9.46 8.63-4.12-3.128a.999.999 0 0 0-1.276.057L.327 7.261A1 1 0 0 0 .326 8.74L3.899 12 .326 15.26a1 1 0 0 0 .001 1.479L1.65 17.94a.999.999 0 0 0 1.276.057l4.12-3.128 9.46 8.63a1.492 1.492 0 0 0 1.704.29l4.942-2.377A1.5 1.5 0 0 0 24 20.06V3.939a1.5 1.5 0 0 0-.85-1.352zm-5.146 14.861L10.826 12l7.178-5.448v10.896z" })
11285
10971
  });
@@ -12296,15 +11982,12 @@ window.__ModuleLoader__.load({
12296
11982
  customCss: typeof record.customCss === "string" ? record.customCss : SIDEBAR_PREFS_DEFAULTS.customCss,
12297
11983
  titleBarCompat: typeof record.titleBarCompat === "boolean" ? record.titleBarCompat : SIDEBAR_PREFS_DEFAULTS.titleBarCompat,
12298
11984
  titleBarStripPx: typeof record.titleBarStripPx === "number" && Number.isFinite(record.titleBarStripPx) ? clampTitleBarStrip(record.titleBarStripPx) : SIDEBAR_PREFS_DEFAULTS.titleBarStripPx,
12299
- htmlViewerNoSandbox: typeof record.htmlViewerNoSandbox === "boolean" ? record.htmlViewerNoSandbox : SIDEBAR_PREFS_DEFAULTS.htmlViewerNoSandbox,
12300
- htmlViewerDefaultUnsafe: typeof record.htmlViewerDefaultUnsafe === "boolean" ? record.htmlViewerDefaultUnsafe : SIDEBAR_PREFS_DEFAULTS.htmlViewerDefaultUnsafe,
12301
11985
  browserNoSandbox: typeof record.browserNoSandbox === "boolean" ? record.browserNoSandbox : SIDEBAR_PREFS_DEFAULTS.browserNoSandbox,
12302
11986
  browserInterceptLinks: typeof record.browserInterceptLinks === "boolean" ? record.browserInterceptLinks : SIDEBAR_PREFS_DEFAULTS.browserInterceptLinks,
12303
11987
  browserInterceptHttp: typeof record.browserInterceptHttp === "boolean" ? record.browserInterceptHttp : SIDEBAR_PREFS_DEFAULTS.browserInterceptHttp,
12304
11988
  browserInterceptHttps: typeof record.browserInterceptHttps === "boolean" ? record.browserInterceptHttps : SIDEBAR_PREFS_DEFAULTS.browserInterceptHttps,
12305
11989
  browserAllowedLoopback: typeof record.browserAllowedLoopback === "string" ? record.browserAllowedLoopback : SIDEBAR_PREFS_DEFAULTS.browserAllowedLoopback,
12306
11990
  tabsEnabled: booleanMapOf(record.tabsEnabled),
12307
- viewersEnabled: booleanMapOf(record.viewersEnabled),
12308
11991
  pluginSettings: pluginSettingsMapOf(record.pluginSettings)
12309
11992
  };
12310
11993
  }
@@ -12728,14 +12411,98 @@ window.__ModuleLoader__.load({
12728
12411
  });
12729
12412
  }
12730
12413
  //#endregion
12414
+ //#region src/client/lazy-chunk.tsx
12415
+ /**
12416
+ * Lazy chunk view wrapper: mounts a component that lives in a lazy chunk,
12417
+ * showing a loading placeholder while the chunk script loads and an error +
12418
+ * retry affordance on failure. Used by the built-in tab/viewer descriptors.
12419
+ *
12420
+ * Contract note: {@link lazyChunkComponent} returns a plain render-prop
12421
+ * function — the descriptor contract is `component: (props) => ReactNode`,
12422
+ * and the repo renders descriptors BOTH ways: Sidebar calls
12423
+ * `descriptor.component(props)` directly, EditorHost renders it via
12424
+ * `createElement`. The wrapper function body therefore contains no hooks;
12425
+ * all state lives in the inner {@link LazyChunkView} component.
12426
+ */
12427
+ function LazyChunkView({ chunk, pick, props }) {
12428
+ const [attempt, setAttempt] = (0, react.useState)(0);
12429
+ const [state, setState] = (0, react.useState)({ status: "loading" });
12430
+ (0, react.useEffect)(() => {
12431
+ let cancelled = false;
12432
+ setState({ status: "loading" });
12433
+ loadChunk(chunk).then((mod) => {
12434
+ if (cancelled) return;
12435
+ const Comp = pick(mod);
12436
+ if (Comp === void 0) {
12437
+ setState({
12438
+ status: "error",
12439
+ message: `[dsh-coding-sidebar] chunk "${chunk}" is missing its component`
12440
+ });
12441
+ return;
12442
+ }
12443
+ setState({
12444
+ status: "ready",
12445
+ Comp
12446
+ });
12447
+ }).catch((error) => {
12448
+ if (cancelled) return;
12449
+ setState({
12450
+ status: "error",
12451
+ message: error instanceof Error ? error.message : String(error)
12452
+ });
12453
+ });
12454
+ return () => {
12455
+ cancelled = true;
12456
+ };
12457
+ }, [
12458
+ chunk,
12459
+ pick,
12460
+ attempt
12461
+ ]);
12462
+ if (state.status === "loading") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12463
+ className: sidebar_module_css_default.editorPlaceholder,
12464
+ children: t("loading")
12465
+ });
12466
+ if (state.status === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12467
+ className: sidebar_module_css_default.editorError,
12468
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: state.message }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12469
+ type: "button",
12470
+ className: sidebar_module_css_default.terminalRetry,
12471
+ onClick: () => {
12472
+ setAttempt((current) => current + 1);
12473
+ },
12474
+ children: t("terminalRetry")
12475
+ })]
12476
+ });
12477
+ return (0, react.createElement)(state.Comp, props);
12478
+ }
12479
+ /**
12480
+ * Build a descriptor-compatible lazy wrapper for a chunk-resident component.
12481
+ * The returned function is the descriptor `component` itself: it returns an
12482
+ * element and never calls hooks, so both invocation styles (plain function
12483
+ * call and createElement/JSX render) work. `pick` must be a module-level
12484
+ * function (stable identity) — an inline lambda would re-trigger the load
12485
+ * effect on every render.
12486
+ * @param chunk - the chunk name (see chunk-loader.ts).
12487
+ * @param pick - select the component from the chunk's exports.
12488
+ */
12489
+ function lazyChunkComponent(chunk, pick) {
12490
+ return (props) => (0, react.createElement)(LazyChunkView, {
12491
+ chunk,
12492
+ pick,
12493
+ props
12494
+ });
12495
+ }
12496
+ //#endregion
12731
12497
  //#region src/client/EditorHost.tsx
12732
12498
  /**
12733
- * The editor tab host: the single FILES WINDOW. It resolves a file's
12734
- * previewer through the sidebar registry (`matchFileViewer`), fetches bytes
12735
- * per the matched viewer's fetch strategy, and renders its component — or
12736
- * the shared download pane when nothing can render the file. A tab without
12737
- * a path (the seeded "Files" home) renders an empty-state hint instead of
12738
- * the viewer loading flow; that path-less window IS the file explorer.
12499
+ * The editor tab host: the single FILES WINDOW. It fetches a file's text
12500
+ * through the host fs.read — text renders in the (chunk-lazy) sidebar text
12501
+ * editor, a binary file renders the shared download pane. (v1.0.4: the
12502
+ * file-viewer registry/matching was retired file preview is the host's
12503
+ * job now, the sidebar edits text only.) A tab without a path (the seeded
12504
+ * "Files" home) renders an empty-state hint instead of the loading flow;
12505
+ * that path-less window IS the file explorer.
12739
12506
  *
12740
12507
  * The chrome depends on the `editorExplorer` mode (read reactively so
12741
12508
  * toggling it re-renders without a reload):
@@ -12749,10 +12516,15 @@ window.__ModuleLoader__.load({
12749
12516
  * The tree's context menu offers the explicit escapes in both modes: open
12750
12517
  * in a new tab (per-path dedupe) or to the side (a fresh tab in a fresh
12751
12518
  * rightward split of the current pane).
12752
- *
12753
- * The strategy dispatch is pure (planFirstMatch / planFsReadOutcome in
12754
- * editor-load.ts); this component only wires it to the host APIs.
12755
12519
  */
12520
+ /**
12521
+ * Lazy wrapper over the chunk-resident text editor: CodeMirror and the
12522
+ * language packs are fetched only when a file tab first renders (see
12523
+ * chunk-loader.ts). The `pick` function is module-level (stable identity —
12524
+ * the wrapper effect depends on it); the cast bridges the chunk exports
12525
+ * record to the prop shape.
12526
+ */
12527
+ const LazyTextEditor = lazyChunkComponent("editor", (mod) => mod.TextEditor);
12756
12528
  /** The docked tree panel's width bounds (drag-resize clamps into them). */
12757
12529
  const TREE_WIDTH_DEFAULT = 240;
12758
12530
  const TREE_WIDTH_MIN = 160;
@@ -12790,7 +12562,6 @@ window.__ModuleLoader__.load({
12790
12562
  function EditorHost(props) {
12791
12563
  const { ctx, store, scope, tab, expanded, revealed, onToggleDir, onReferenceFile } = props;
12792
12564
  const path = tab.path ?? "";
12793
- const title = tab.title;
12794
12565
  const isDir = metaOf(tab).dir === true;
12795
12566
  const [load, setLoad] = (0, react.useState)({ status: "loading" });
12796
12567
  const [reloadSeq, setReloadSeq] = (0, react.useState)(0);
@@ -12929,81 +12700,36 @@ window.__ModuleLoader__.load({
12929
12700
  setToolbar(null);
12930
12701
  if (showEmpty || isDir) return;
12931
12702
  let cancelled = false;
12932
- const controller = new AbortController();
12933
12703
  setLoad({ status: "loading" });
12934
- const mediaUrlOf = () => mediaUrl(scope, path);
12935
- const apply = (action) => {
12704
+ api.fsRead(scope, path).then((result) => {
12936
12705
  if (cancelled) return;
12937
- switch (action.kind) {
12938
- case "binary":
12939
- setLoad({ status: "binary" });
12940
- return;
12941
- case "render":
12942
- setLoad({
12943
- status: "ready",
12944
- viewer: action.viewer,
12945
- content: action.content,
12946
- truncated: action.truncated,
12947
- mediaUrl: action.mediaUrl,
12948
- customData: action.customData
12949
- });
12950
- return;
12951
- case "customLoad":
12952
- action.viewer.load?.(path, scope, controller.signal).then((data) => {
12953
- if (cancelled) return;
12954
- setLoad({
12955
- status: "ready",
12956
- viewer: action.viewer,
12957
- customData: data
12958
- });
12959
- }).catch((error) => {
12960
- if (cancelled) return;
12961
- setLoad({
12962
- status: "error",
12963
- message: error instanceof Error ? error.message : String(error)
12964
- });
12965
- });
12966
- return;
12967
- case "fetchFsRead":
12968
- api.fsRead(scope, path).then((result) => {
12969
- if (cancelled) return;
12970
- const outcome = planFsReadOutcome(action.viewer, {
12971
- binary: result.kind === "binary",
12972
- content: result.kind === "text" ? result.content : "",
12973
- truncated: result.truncated,
12974
- head: result.kind === "binary" ? result.head : void 0
12975
- }, (head) => ctx.get("betterSidebar")?.matchFileViewer(path, head), mediaUrlOf);
12976
- apply(outcome);
12977
- }).catch((error) => {
12978
- if (cancelled) return;
12979
- setLoad({
12980
- status: "error",
12981
- message: error instanceof Error ? error.message : String(error)
12982
- });
12983
- });
12984
- return;
12706
+ if (result.kind === "binary") {
12707
+ setLoad({ status: "binary" });
12708
+ return;
12985
12709
  }
12986
- };
12987
- apply(planFirstMatch(ctx.get("betterSidebar")?.matchFileViewer(path), mediaUrlOf));
12710
+ setLoad({
12711
+ status: "ready",
12712
+ content: result.content,
12713
+ truncated: result.truncated
12714
+ });
12715
+ }).catch((error) => {
12716
+ if (cancelled) return;
12717
+ setLoad({
12718
+ status: "error",
12719
+ message: error instanceof Error ? error.message : String(error)
12720
+ });
12721
+ });
12988
12722
  return () => {
12989
12723
  cancelled = true;
12990
- controller.abort();
12991
12724
  };
12992
12725
  }, [
12993
12726
  scope.sessionId,
12994
12727
  scope.cwd,
12995
12728
  path,
12996
- ctx,
12997
12729
  showEmpty,
12998
12730
  isDir,
12999
12731
  reloadSeq
13000
12732
  ]);
13001
- const prevSaveState = (0, react.useRef)(void 0);
13002
- (0, react.useEffect)(() => {
13003
- const current = toolbar?.saveState;
13004
- if (prevSaveState.current !== "saved" && current === "saved" && toolbar?.mode === "preview") setReloadSeq((sequence) => sequence + 1);
13005
- prevSaveState.current = current;
13006
- }, [toolbar?.saveState, toolbar?.mode]);
13007
12733
  const treeOpen = treeOpenOf(tab);
13008
12734
  /** Persist the panel flag on the tab (survives reloads with the layout). */
13009
12735
  const toggleTree = () => {
@@ -13040,25 +12766,6 @@ window.__ModuleLoader__.load({
13040
12766
  cwd: scope.cwd,
13041
12767
  onOpen: openFile
13042
12768
  }, path),
13043
- toolbar?.modes === true && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
13044
- className: sidebar_module_css_default.editorModeToggle,
13045
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
13046
- type: "button",
13047
- className: clsx(sidebar_module_css_default.editorModeButton, toolbar.mode === "preview" && sidebar_module_css_default.editorModeActive),
13048
- onClick: () => {
13049
- if (toolbar.mode === "edit" && toolbar.dirty !== true && toolbar.saveState !== "failed") setReloadSeq((sequence) => sequence + 1);
13050
- controlsRef.current?.setMode("preview");
13051
- },
13052
- children: t("preview")
13053
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
13054
- type: "button",
13055
- className: clsx(sidebar_module_css_default.editorModeButton, toolbar.mode === "edit" && sidebar_module_css_default.editorModeActive),
13056
- onClick: () => {
13057
- controlsRef.current?.setMode("edit");
13058
- },
13059
- children: t("edit")
13060
- })]
13061
- }),
13062
12769
  toolbar?.dirty === true && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
13063
12770
  className: sidebar_module_css_default.dirtyDot,
13064
12771
  title: t("unsaved")
@@ -13116,17 +12823,13 @@ window.__ModuleLoader__.load({
13116
12823
  scope,
13117
12824
  path
13118
12825
  }),
13119
- !showEmpty && load.status === "ready" && (0, react.createElement)(load.viewer.component, {
12826
+ !showEmpty && load.status === "ready" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(LazyTextEditor, {
13120
12827
  ctx,
13121
12828
  store,
13122
12829
  scope,
13123
12830
  path,
13124
- title,
13125
- viewerId: load.viewer.id,
13126
12831
  content: load.content,
13127
12832
  truncated: load.truncated,
13128
- mediaUrl: load.mediaUrl,
13129
- customData: load.customData,
13130
12833
  toolbar: "host",
13131
12834
  onToolbarState,
13132
12835
  onToolbarControls
@@ -13207,7 +12910,7 @@ window.__ModuleLoader__.load({
13207
12910
  }
13208
12911
  //#endregion
13209
12912
  //#region \0dsh-css:/Users/libing/kk_Projects/dsh-coding-sidebar/src/client/SideCardSection.module.css.mjs
13210
- const css$3 = ".AC9POW_section{flex-direction:column;gap:16px;width:100%;max-width:760px;display:flex}.AC9POW_intro{color:var(--dsw-alias-label-tertiary);margin:0;padding:0 2px;font-size:13px;line-height:20px}.AC9POW_group{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:16px;flex-direction:column;flex:none;gap:8px;padding:20px;display:flex}.AC9POW_groupHeading{color:var(--dsw-alias-label-primary);align-items:baseline;gap:7px;padding:0 2px 6px;font-size:13px;font-weight:600;line-height:20px;display:flex}.AC9POW_count{background:var(--dsw-alias-accent-soft,var(--dsw-alias-bg-layer-2));color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:16px}.AC9POW_grid{grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:12px;display:grid}.AC9POW_card{border:1px solid var(--dsw-alias-border-l2);min-height:106px;font:inherit;color:inherit;cursor:pointer;background:0 0;border-radius:12px;flex-direction:column;transition:background .12s,border-color .12s;display:flex;position:relative;overflow:hidden}.AC9POW_card:not(.AC9POW_cardOn):hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-label-dimmed)}.AC9POW_cardOn{border-color:color-mix(in srgb, var(--dsw-alias-button-primary-fill) 45%, transparent);background:var(--dsw-alias-interactive-bg-active)}.AC9POW_cardMain{border-radius:inherit;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;flex-direction:column;flex:1;gap:6px;padding:12px;display:flex}.AC9POW_cardMain:focus-visible,.AC9POW_cardSettings:focus-visible,.AC9POW_rowGear:focus-visible{outline:2px solid var(--dsw-alias-border-l4);outline-offset:2px}.AC9POW_cardTop{align-items:center;gap:8px;min-width:0;min-height:28px;display:flex}.AC9POW_cardIconChip{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);width:28px;height:28px;color:var(--dsw-alias-label-tertiary);border-radius:8px;flex:none;justify-content:center;align-items:center;display:inline-flex}.AC9POW_cardOn .AC9POW_cardIconChip{border-color:color-mix(in srgb, var(--dsw-alias-button-primary-fill) 35%, transparent);background:color-mix(in srgb, var(--dsw-alias-button-primary-fill) 12%, transparent);color:var(--dsw-alias-button-primary-fill)}.AC9POW_cardTitle{min-width:0;color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;flex:1;font-size:13px;font-weight:600;line-height:20px;overflow:hidden}.AC9POW_cardOn .AC9POW_cardTitle{color:var(--dsw-alias-label-primary)}.AC9POW_cardSwitch{flex:none;align-items:center;display:inline-flex}.AC9POW_cardSwitchTrack{box-sizing:border-box;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;align-items:center;width:30px;height:16px;padding:2px;transition:background .15s,border-color .15s;display:inline-flex}.AC9POW_cardSwitchThumb{background:var(--dsw-alias-label-tertiary);border-radius:50%;width:10px;height:10px;transition:transform .15s,background .15s;display:block}.AC9POW_cardOn .AC9POW_cardSwitchTrack{border-color:var(--dsw-alias-button-primary-fill);background:var(--dsw-alias-button-primary-fill)}.AC9POW_cardOn .AC9POW_cardSwitchThumb{background:var(--dsw-alias-bg-layer-3);transform:translate(14px)}.AC9POW_cardDesc{color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-overflow:ellipsis;font-size:11px;line-height:16px;overflow:hidden}.AC9POW_addCard{border-style:dashed;border-color:var(--dsw-alias-border-l2);text-align:left;align-items:flex-start;padding:12px}.AC9POW_addCard:hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-interactive-bg-hover-accent);color:var(--dsw-alias-label-primary)}.AC9POW_addCard:hover .AC9POW_cardTitle{color:var(--dsw-alias-label-primary)}.AC9POW_addCard:hover .AC9POW_cardIconChip{border-color:color-mix(in srgb, var(--dsw-alias-button-primary-fill) 35%, transparent);color:var(--dsw-alias-button-primary-fill)}.AC9POW_addCard:focus-visible{outline:2px solid var(--dsw-alias-border-l4);outline-offset:2px}.AC9POW_cardOn .AC9POW_cardDesc{color:var(--dsw-alias-label-secondary)}.AC9POW_cardSettings{border:0;border-top:1px solid var(--dsw-alias-border-l1);width:100%;color:var(--dsw-alias-label-secondary);font:inherit;text-align:left;cursor:pointer;background:0 0;align-items:center;gap:6px;padding:6px 12px;font-size:11px;font-weight:500;line-height:16px;transition:background .12s,color .12s;display:flex}.AC9POW_cardOn .AC9POW_cardSettings{border-top-color:color-mix(in srgb, var(--dsw-alias-button-primary-fill) 18%, transparent)}.AC9POW_cardSettings:hover{background:var(--dsw-alias-interactive-bg-hover-accent);color:var(--dsw-alias-brand-primary)}.AC9POW_rowGear{border:1px solid var(--dsw-alias-border-l2);width:22px;height:22px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border-radius:6px;flex:none;justify-content:center;align-items:center;padding:0;transition:background .12s,border-color .12s,color .12s;display:inline-flex}.AC9POW_rowGear:hover{border-color:var(--dsw-alias-interactive-bg-hover-accent);background:var(--dsw-alias-interactive-bg-hover-accent);color:var(--dsw-alias-brand-primary)}.AC9POW_row{border-bottom:1px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:center;gap:16px;padding:12px 2px;display:flex}.AC9POW_row:last-child{border-bottom:none}.AC9POW_rowText{flex-direction:column;gap:4px;min-width:0;display:flex}.AC9POW_title{color:var(--dsw-alias-label-primary);font-size:14px;line-height:22px}.AC9POW_desc{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}.AC9POW_switch{cursor:pointer;flex:none;display:inline-flex;position:relative}.AC9POW_switchInput{opacity:0;width:1px;height:1px;margin:0;position:absolute}.AC9POW_switchTrack{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:10px;align-items:center;width:36px;height:20px;padding:2px;transition:background .15s,border-color .15s;display:inline-flex}.AC9POW_switchThumb{background:var(--dsw-alias-label-tertiary);border-radius:50%;width:14px;height:14px;transition:transform .15s,background .15s;display:block}.AC9POW_switch:hover .AC9POW_switchTrack{border-color:var(--dsw-alias-label-dimmed)}.AC9POW_switchInput:checked+.AC9POW_switchTrack{border-color:var(--dsw-alias-button-primary-fill);background:var(--dsw-alias-button-primary-fill)}.AC9POW_switchInput:checked+.AC9POW_switchTrack .AC9POW_switchThumb{background:var(--dsw-alias-bg-layer-3);transform:translate(16px)}.AC9POW_switchInput:focus-visible+.AC9POW_switchTrack{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.AC9POW_control{flex:none;align-items:center;gap:6px;display:flex}.AC9POW_percentInput{width:76px}.AC9POW_typedInput{width:200px}.AC9POW_typedInputNumber{width:76px}.AC9POW_selectAnchor{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);max-width:220px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:8px;align-items:center;gap:6px;padding:4px 8px;font-size:13px;line-height:20px;display:flex}.AC9POW_selectAnchor:hover{border-color:var(--dsw-alias-label-dimmed)}.AC9POW_selectAnchorIcon{flex:none;display:inline-flex}.AC9POW_selectAnchorText{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.AC9POW_selectOption{align-items:center;gap:10px;min-width:200px;display:flex}.AC9POW_selectOptionIcon{color:var(--dsw-alias-label-secondary);flex:none;display:inline-flex}.AC9POW_selectOptionText{flex-direction:column;min-width:0;display:flex}.AC9POW_suffix{color:var(--dsw-alias-label-secondary);font-size:14px;line-height:22px}.AC9POW_cssTextArea{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);width:100%;min-height:120px;color:var(--dsw-alias-label-primary);font-family:var(--ds-font-family-code,monospace);resize:vertical;border-radius:8px;padding:8px 10px;font-size:12px;line-height:1.6}.AC9POW_cssTextArea:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.AC9POW_popupDialog.AC9POW_popupDialog{width:min(460px,100%)}.AC9POW_popupRows{box-sizing:border-box;scrollbar-width:thin;scrollbar-color:var(--dsw-alias-scrollbar-bg-l2,transparent) transparent;flex-direction:column;gap:8px;width:100%;max-height:min(52vh,440px);padding-right:4px;display:flex;overflow:hidden auto}.AC9POW_popupRows::-webkit-scrollbar{width:6px}.AC9POW_popupRows::-webkit-scrollbar-thumb{background:var(--dsw-alias-scrollbar-bg-l2,var(--dsw-alias-border-l2));border-radius:3px}.AC9POW_popupRows::-webkit-scrollbar-thumb:hover{background:var(--dsw-alias-scrollbar-hover-l2,var(--dsw-alias-label-dimmed))}.AC9POW_popupRow{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;flex:none;justify-content:space-between;align-items:center;gap:16px;min-width:0;padding:12px 14px;transition:border-color .16s,background .16s;display:flex}.AC9POW_popupRow:hover{border-color:var(--dsw-alias-label-dimmed)}.AC9POW_done{appearance:none;font:inherit;cursor:pointer;background:var(--dsw-alias-label-primary);color:var(--dsw-alias-bg-layer-3);border:1px solid #0000;border-radius:8px;padding:5px 14px;font-size:13px;line-height:1.5}.AC9POW_done:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}.AC9POW_error{color:var(--dsw-alias-state-error-primary);padding:10px 0 2px;font-size:12px;line-height:17px}.AC9POW_pluginModal.AC9POW_pluginModal{width:min(560px,100%)}.AC9POW_pluginList{flex-direction:column;gap:12px;width:100%;display:flex}.AC9POW_pluginTopicBtn{appearance:none;border:1px solid var(--dsw-alias-border-l2);width:100%;font:inherit;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);cursor:pointer;border-radius:8px;padding:6px 12px;font-size:12px;line-height:18px}.AC9POW_pluginTopicBtn:hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-interactive-bg-hover-accent);color:var(--dsw-alias-label-primary)}.AC9POW_pluginTopicBtn:focus-visible{outline:2px solid var(--dsw-alias-border-l4);outline-offset:1px}.AC9POW_pluginEmpty{color:var(--dsw-alias-label-tertiary);padding:20px 2px;font-size:12px;line-height:18px}.AC9POW_pluginEntry{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:12px;flex-direction:column;gap:4px;padding:12px;display:flex}.AC9POW_pluginEntryHead{justify-content:space-between;align-items:center;gap:12px;display:flex}.AC9POW_pluginEntryActions{flex:none;align-items:center;gap:6px;display:inline-flex}.AC9POW_pluginJumpBtn{appearance:none;border:1px solid var(--dsw-alias-border-l2);font:inherit;cursor:pointer;color:var(--dsw-alias-label-secondary);background:0 0;border-radius:8px;flex:none;padding:3px 12px;font-size:12px;line-height:1.5}.AC9POW_pluginJumpBtn:hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-interactive-bg-hover-accent);color:var(--dsw-alias-label-primary)}.AC9POW_pluginJumpBtn:focus-visible{outline:2px solid var(--dsw-alias-border-l4);outline-offset:1px}.AC9POW_pluginName{appearance:none;min-width:0;font:inherit;color:var(--dsw-alias-label-primary);text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;background:0 0;border:0;padding:0;font-size:13px;font-weight:600;line-height:20px;text-decoration:none;overflow:hidden}.AC9POW_pluginName:hover{color:var(--dsw-alias-button-primary-fill);text-decoration:underline}.AC9POW_pluginDesc{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:18px}.AC9POW_pluginInstall{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);white-space:nowrap;border-radius:8px;padding:6px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;line-height:16px;display:block;overflow-x:auto}.AC9POW_pluginCopyBtn{appearance:none;font:inherit;cursor:pointer;background:var(--dsw-alias-label-primary);color:var(--dsw-alias-bg-layer-3);border:1px solid #0000;border-radius:8px;flex:none;padding:3px 12px;font-size:12px;line-height:1.5}.AC9POW_pluginCopyBtn:hover{background:var(--dsw-alias-button-primary-hover)}.AC9POW_pluginCopyBtn:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}@media (prefers-reduced-motion:reduce){.AC9POW_card,.AC9POW_cardSettings,.AC9POW_cardSwitchTrack,.AC9POW_cardSwitchThumb,.AC9POW_rowGear,.AC9POW_popupRow,.AC9POW_switchTrack,.AC9POW_switchThumb{transition:none}}.AC9POW_versionBadge{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:999px;align-self:flex-start;align-items:center;gap:8px;padding:4px 12px 4px 14px;font-size:12px;line-height:18px;display:inline-flex}.AC9POW_versionBadgeName{color:var(--dsw-alias-label-primary);font-weight:600}.AC9POW_versionBadgeTag{background:var(--dsw-alias-accent-soft,var(--dsw-alias-border-l2));color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;border-radius:999px;padding:1px 8px}.AC9POW_pluginSearch{box-sizing:border-box;appearance:none;border:1px solid var(--dsw-alias-border-l2);width:100%;font:inherit;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-1);border-radius:8px;padding:6px 10px;font-size:12px;line-height:18px}.AC9POW_pluginSearch::placeholder{color:var(--dsw-alias-label-tertiary)}.AC9POW_pluginSearch:focus-visible{outline:2px solid var(--dsw-alias-border-l4);outline-offset:1px}.AC9POW_pluginEntries{flex-direction:column;gap:10px;max-height:46vh;padding-right:2px;display:flex;overflow:hidden auto}.AC9POW_pluginGroup{flex-direction:column;gap:8px;display:flex}.AC9POW_pluginGroupHeading{color:var(--dsw-alias-label-secondary);padding:2px 2px 0;font-size:12px;font-weight:600;line-height:18px}.AC9POW_openWithEditorRow{grid-template-columns:1fr 1.5fr auto auto;align-items:center;gap:8px;min-width:0;display:grid}.AC9POW_openWithEditorInput,.AC9POW_openWithEditorTemplate{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);width:100%;min-width:0;color:var(--dsw-alias-label-primary);font:inherit;border-radius:8px;padding:5px 8px;font-size:13px;line-height:20px}.AC9POW_openWithEditorInput:focus-visible,.AC9POW_openWithEditorTemplate:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}.AC9POW_openWithFamily{color:var(--dsw-alias-label-secondary);white-space:nowrap;cursor:pointer;align-items:center;gap:5px;font-size:12px;display:inline-flex}.AC9POW_openWithRemove{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:8px;justify-content:center;align-items:center;padding:4px;display:inline-flex}.AC9POW_openWithRemove:hover{color:var(--dsw-alias-state-error-primary);background:var(--dsw-alias-bg-layer-2)}.AC9POW_openWithHint{color:var(--dsw-alias-state-error-primary);padding:0 2px;font-size:12px;line-height:17px}";
12913
+ const css$3 = ".AC9POW_section{flex-direction:column;gap:16px;width:100%;max-width:760px;display:flex}.AC9POW_intro{color:var(--dsw-alias-label-tertiary);margin:0;padding:0 2px;font-size:13px;line-height:20px}.AC9POW_group{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:16px;flex-direction:column;flex:none;gap:8px;padding:20px;display:flex}.AC9POW_groupHeading{color:var(--dsw-alias-label-primary);align-items:baseline;gap:7px;padding:0 2px 6px;font-size:13px;font-weight:600;line-height:20px;display:flex}.AC9POW_count{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:16px}.AC9POW_grid{grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:12px;display:grid}.AC9POW_card{border:1px solid var(--dsw-alias-border-l2);min-height:106px;font:inherit;color:inherit;cursor:pointer;background:0 0;border-radius:12px;flex-direction:column;transition:background .12s,border-color .12s;display:flex;position:relative;overflow:hidden}.AC9POW_card:not(.AC9POW_cardOn):hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-label-dimmed)}.AC9POW_cardOn{border-color:color-mix(in srgb, var(--dsw-alias-button-primary-fill) 45%, transparent);background:var(--dsw-alias-interactive-bg-active)}.AC9POW_cardMain{border-radius:inherit;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;flex-direction:column;flex:1;gap:6px;padding:12px;display:flex}.AC9POW_cardMain:focus-visible,.AC9POW_cardSettings:focus-visible,.AC9POW_rowGear:focus-visible{outline:2px solid var(--dsw-alias-border-l4);outline-offset:2px}.AC9POW_cardTop{align-items:center;gap:8px;min-width:0;min-height:28px;display:flex}.AC9POW_cardIconChip{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);width:28px;height:28px;color:var(--dsw-alias-label-tertiary);border-radius:8px;flex:none;justify-content:center;align-items:center;display:inline-flex}.AC9POW_cardOn .AC9POW_cardIconChip{border-color:color-mix(in srgb, var(--dsw-alias-button-primary-fill) 35%, transparent);background:color-mix(in srgb, var(--dsw-alias-button-primary-fill) 12%, transparent);color:var(--dsw-alias-button-primary-fill)}.AC9POW_cardTitle{min-width:0;color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;flex:1;font-size:13px;font-weight:600;line-height:20px;overflow:hidden}.AC9POW_cardOn .AC9POW_cardTitle{color:var(--dsw-alias-label-primary)}.AC9POW_cardSwitch{flex:none;align-items:center;display:inline-flex}.AC9POW_cardSwitchTrack{box-sizing:border-box;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;align-items:center;width:30px;height:16px;padding:2px;transition:background .15s,border-color .15s;display:inline-flex}.AC9POW_cardSwitchThumb{background:var(--dsw-alias-label-tertiary);border-radius:50%;width:10px;height:10px;transition:transform .15s,background .15s;display:block}.AC9POW_cardOn .AC9POW_cardSwitchTrack{border-color:var(--dsw-alias-button-primary-fill);background:var(--dsw-alias-button-primary-fill)}.AC9POW_cardOn .AC9POW_cardSwitchThumb{background:var(--dsw-alias-bg-layer-3);transform:translate(14px)}.AC9POW_cardDesc{color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-overflow:ellipsis;font-size:11px;line-height:16px;overflow:hidden}.AC9POW_addCard{border-style:dashed;border-color:var(--dsw-alias-border-l2);text-align:left;align-items:flex-start;padding:12px}.AC9POW_addCard:hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-interactive-bg-hover-accent);color:var(--dsw-alias-label-primary)}.AC9POW_addCard:hover .AC9POW_cardTitle{color:var(--dsw-alias-label-primary)}.AC9POW_addCard:hover .AC9POW_cardIconChip{border-color:color-mix(in srgb, var(--dsw-alias-button-primary-fill) 35%, transparent);color:var(--dsw-alias-button-primary-fill)}.AC9POW_addCard:focus-visible{outline:2px solid var(--dsw-alias-border-l4);outline-offset:2px}.AC9POW_cardOn .AC9POW_cardDesc{color:var(--dsw-alias-label-secondary)}.AC9POW_cardSettings{border:0;border-top:1px solid var(--dsw-alias-border-l1);width:100%;color:var(--dsw-alias-label-secondary);font:inherit;text-align:left;cursor:pointer;background:0 0;align-items:center;gap:6px;padding:6px 12px;font-size:11px;font-weight:500;line-height:16px;transition:background .12s,color .12s;display:flex}.AC9POW_cardOn .AC9POW_cardSettings{border-top-color:color-mix(in srgb, var(--dsw-alias-button-primary-fill) 18%, transparent)}.AC9POW_cardSettings:hover{background:var(--dsw-alias-interactive-bg-hover-accent);color:var(--dsw-alias-brand-primary)}.AC9POW_rowGear{border:1px solid var(--dsw-alias-border-l2);width:22px;height:22px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border-radius:6px;flex:none;justify-content:center;align-items:center;padding:0;transition:background .12s,border-color .12s,color .12s;display:inline-flex}.AC9POW_rowGear:hover{border-color:var(--dsw-alias-interactive-bg-hover-accent);background:var(--dsw-alias-interactive-bg-hover-accent);color:var(--dsw-alias-brand-primary)}.AC9POW_row{border-bottom:1px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:center;gap:16px;padding:12px 2px;display:flex}.AC9POW_row:last-child{border-bottom:none}.AC9POW_rowText{flex-direction:column;gap:4px;min-width:0;display:flex}.AC9POW_title{color:var(--dsw-alias-label-primary);font-size:14px;line-height:22px}.AC9POW_desc{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}.AC9POW_switch{cursor:pointer;flex:none;display:inline-flex;position:relative}.AC9POW_switchInput{opacity:0;width:1px;height:1px;margin:0;position:absolute}.AC9POW_switchTrack{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:10px;align-items:center;width:36px;height:20px;padding:2px;transition:background .15s,border-color .15s;display:inline-flex}.AC9POW_switchThumb{background:var(--dsw-alias-label-tertiary);border-radius:50%;width:14px;height:14px;transition:transform .15s,background .15s;display:block}.AC9POW_switch:hover .AC9POW_switchTrack{border-color:var(--dsw-alias-label-dimmed)}.AC9POW_switchInput:checked+.AC9POW_switchTrack{border-color:var(--dsw-alias-button-primary-fill);background:var(--dsw-alias-button-primary-fill)}.AC9POW_switchInput:checked+.AC9POW_switchTrack .AC9POW_switchThumb{background:var(--dsw-alias-bg-layer-3);transform:translate(16px)}.AC9POW_switchInput:focus-visible+.AC9POW_switchTrack{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.AC9POW_control{flex:none;align-items:center;gap:6px;display:flex}.AC9POW_percentInput{width:76px}.AC9POW_typedInput{width:200px}.AC9POW_typedInputNumber{width:76px}.AC9POW_selectAnchor{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);max-width:220px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:8px;align-items:center;gap:6px;padding:4px 8px;font-size:13px;line-height:20px;display:flex}.AC9POW_selectAnchor:hover{border-color:var(--dsw-alias-label-dimmed)}.AC9POW_selectAnchorIcon{flex:none;display:inline-flex}.AC9POW_selectAnchorText{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.AC9POW_selectOption{align-items:center;gap:10px;min-width:200px;display:flex}.AC9POW_selectOptionIcon{color:var(--dsw-alias-label-secondary);flex:none;display:inline-flex}.AC9POW_selectOptionText{flex-direction:column;min-width:0;display:flex}.AC9POW_suffix{color:var(--dsw-alias-label-secondary);font-size:14px;line-height:22px}.AC9POW_cssTextArea{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);width:100%;min-height:120px;color:var(--dsw-alias-label-primary);font-family:var(--ds-font-family-code,monospace);resize:vertical;border-radius:8px;padding:8px 10px;font-size:12px;line-height:1.6}.AC9POW_cssTextArea:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.AC9POW_popupDialog.AC9POW_popupDialog{width:min(460px,100%)}.AC9POW_popupRows{box-sizing:border-box;scrollbar-width:thin;scrollbar-color:var(--dsw-alias-scrollbar-bg-l2,transparent) transparent;flex-direction:column;gap:8px;width:100%;max-height:min(52vh,440px);padding-right:4px;display:flex;overflow:hidden auto}.AC9POW_popupRows::-webkit-scrollbar{width:6px}.AC9POW_popupRows::-webkit-scrollbar-thumb{background:var(--dsw-alias-scrollbar-bg-l2,var(--dsw-alias-border-l2));border-radius:3px}.AC9POW_popupRows::-webkit-scrollbar-thumb:hover{background:var(--dsw-alias-scrollbar-hover-l2,var(--dsw-alias-label-dimmed))}.AC9POW_popupRow{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;flex:none;justify-content:space-between;align-items:center;gap:16px;min-width:0;padding:12px 14px;transition:border-color .16s,background .16s;display:flex}.AC9POW_popupRow:hover{border-color:var(--dsw-alias-label-dimmed)}.AC9POW_done{appearance:none;font:inherit;cursor:pointer;background:var(--dsw-alias-label-primary);color:var(--dsw-alias-bg-layer-3);border:1px solid #0000;border-radius:8px;padding:5px 14px;font-size:13px;line-height:1.5}.AC9POW_done:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}.AC9POW_error{color:var(--dsw-alias-state-error-primary);padding:10px 0 2px;font-size:12px;line-height:17px}.AC9POW_pluginModal.AC9POW_pluginModal{width:min(560px,100%)}.AC9POW_pluginList{flex-direction:column;gap:12px;width:100%;display:flex}.AC9POW_pluginTopicBtn{appearance:none;border:1px solid var(--dsw-alias-border-l2);width:100%;font:inherit;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);cursor:pointer;border-radius:8px;padding:6px 12px;font-size:12px;line-height:18px}.AC9POW_pluginTopicBtn:hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-interactive-bg-hover-accent);color:var(--dsw-alias-label-primary)}.AC9POW_pluginTopicBtn:focus-visible{outline:2px solid var(--dsw-alias-border-l4);outline-offset:1px}.AC9POW_pluginEmpty{color:var(--dsw-alias-label-tertiary);padding:20px 2px;font-size:12px;line-height:18px}.AC9POW_pluginEntry{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:12px;flex-direction:column;gap:4px;padding:12px;display:flex}.AC9POW_pluginEntryHead{justify-content:space-between;align-items:center;gap:12px;display:flex}.AC9POW_pluginEntryActions{flex:none;align-items:center;gap:6px;display:inline-flex}.AC9POW_pluginJumpBtn{appearance:none;border:1px solid var(--dsw-alias-border-l2);font:inherit;cursor:pointer;color:var(--dsw-alias-label-secondary);background:0 0;border-radius:8px;flex:none;padding:3px 12px;font-size:12px;line-height:1.5}.AC9POW_pluginJumpBtn:hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-interactive-bg-hover-accent);color:var(--dsw-alias-label-primary)}.AC9POW_pluginJumpBtn:focus-visible{outline:2px solid var(--dsw-alias-border-l4);outline-offset:1px}.AC9POW_pluginName{appearance:none;min-width:0;font:inherit;color:var(--dsw-alias-label-primary);text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;background:0 0;border:0;padding:0;font-size:13px;font-weight:600;line-height:20px;text-decoration:none;overflow:hidden}.AC9POW_pluginName:hover{color:var(--dsw-alias-button-primary-fill);text-decoration:underline}.AC9POW_pluginDesc{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:18px}.AC9POW_pluginInstall{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);white-space:nowrap;border-radius:8px;padding:6px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;line-height:16px;display:block;overflow-x:auto}.AC9POW_pluginCopyBtn{appearance:none;font:inherit;cursor:pointer;background:var(--dsw-alias-label-primary);color:var(--dsw-alias-bg-layer-3);border:1px solid #0000;border-radius:8px;flex:none;padding:3px 12px;font-size:12px;line-height:1.5}.AC9POW_pluginCopyBtn:hover{background:var(--dsw-alias-button-primary-hover)}.AC9POW_pluginCopyBtn:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}@media (prefers-reduced-motion:reduce){.AC9POW_card,.AC9POW_cardSettings,.AC9POW_cardSwitchTrack,.AC9POW_cardSwitchThumb,.AC9POW_rowGear,.AC9POW_popupRow,.AC9POW_switchTrack,.AC9POW_switchThumb{transition:none}}.AC9POW_versionBadge{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:999px;align-self:flex-start;align-items:center;gap:8px;padding:4px 12px 4px 14px;font-size:12px;line-height:18px;display:inline-flex}.AC9POW_versionBadgeName{color:var(--dsw-alias-label-primary);font-weight:600}.AC9POW_versionBadgeTag{background:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;border-radius:999px;padding:1px 8px}.AC9POW_pluginSearch{box-sizing:border-box;appearance:none;border:1px solid var(--dsw-alias-border-l2);width:100%;font:inherit;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-1);border-radius:8px;padding:6px 10px;font-size:12px;line-height:18px}.AC9POW_pluginSearch::placeholder{color:var(--dsw-alias-label-tertiary)}.AC9POW_pluginSearch:focus-visible{outline:2px solid var(--dsw-alias-border-l4);outline-offset:1px}.AC9POW_pluginEntries{flex-direction:column;gap:10px;max-height:46vh;padding-right:2px;display:flex;overflow:hidden auto}.AC9POW_pluginGroup{flex-direction:column;gap:8px;display:flex}.AC9POW_pluginGroupHeading{color:var(--dsw-alias-label-secondary);padding:2px 2px 0;font-size:12px;font-weight:600;line-height:18px}.AC9POW_openWithEditorRow{grid-template-columns:1fr 1.5fr auto auto;align-items:center;gap:8px;min-width:0;display:grid}.AC9POW_openWithEditorInput,.AC9POW_openWithEditorTemplate{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);width:100%;min-width:0;color:var(--dsw-alias-label-primary);font:inherit;border-radius:8px;padding:5px 8px;font-size:13px;line-height:20px}.AC9POW_openWithEditorInput:focus-visible,.AC9POW_openWithEditorTemplate:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}.AC9POW_openWithFamily{color:var(--dsw-alias-label-secondary);white-space:nowrap;cursor:pointer;align-items:center;gap:5px;font-size:12px;display:inline-flex}.AC9POW_openWithRemove{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:8px;justify-content:center;align-items:center;padding:4px;display:inline-flex}.AC9POW_openWithRemove:hover{color:var(--dsw-alias-state-error-primary);background:var(--dsw-alias-bg-layer-2)}.AC9POW_openWithHint{color:var(--dsw-alias-state-error-primary);padding:0 2px;font-size:12px;line-height:17px}";
13211
12914
  const tagId$3 = "dsh-external/dsh-coding-sidebar/SideCardSection.module.css";
13212
12915
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) {
13213
12916
  const tag = document.createElement("style");
@@ -13217,75 +12920,75 @@ window.__ModuleLoader__.load({
13217
12920
  document.head.appendChild(tag);
13218
12921
  }
13219
12922
  var SideCardSection_module_css_default = {
13220
- "openWithEditorRow": "AC9POW_openWithEditorRow",
13221
- "typedInput": "AC9POW_typedInput",
13222
- "selectAnchorText": "AC9POW_selectAnchorText",
12923
+ "cardSwitch": "AC9POW_cardSwitch",
12924
+ "intro": "AC9POW_intro",
12925
+ "cardSwitchTrack": "AC9POW_cardSwitchTrack",
12926
+ "cssTextArea": "AC9POW_cssTextArea",
12927
+ "switchInput": "AC9POW_switchInput",
12928
+ "group": "AC9POW_group",
12929
+ "cardOn": "AC9POW_cardOn",
12930
+ "addCard": "AC9POW_addCard",
13223
12931
  "card": "AC9POW_card",
12932
+ "groupHeading": "AC9POW_groupHeading",
12933
+ "row": "AC9POW_row",
12934
+ "pluginDesc": "AC9POW_pluginDesc",
12935
+ "switchTrack": "AC9POW_switchTrack",
12936
+ "openWithRemove": "AC9POW_openWithRemove",
12937
+ "percentInput": "AC9POW_percentInput",
12938
+ "control": "AC9POW_control",
12939
+ "openWithEditorInput": "AC9POW_openWithEditorInput",
12940
+ "pluginGroup": "AC9POW_pluginGroup",
13224
12941
  "switchThumb": "AC9POW_switchThumb",
13225
- "selectOptionText": "AC9POW_selectOptionText",
13226
- "pluginJumpBtn": "AC9POW_pluginJumpBtn",
12942
+ "title": "AC9POW_title",
12943
+ "openWithEditorTemplate": "AC9POW_openWithEditorTemplate",
12944
+ "pluginCopyBtn": "AC9POW_pluginCopyBtn",
13227
12945
  "cardSettings": "AC9POW_cardSettings",
12946
+ "cardMain": "AC9POW_cardMain",
12947
+ "cardDesc": "AC9POW_cardDesc",
12948
+ "typedInputNumber": "AC9POW_typedInputNumber",
13228
12949
  "desc": "AC9POW_desc",
13229
- "addCard": "AC9POW_addCard",
13230
- "versionBadgeTag": "AC9POW_versionBadgeTag",
13231
- "intro": "AC9POW_intro",
13232
- "versionBadgeName": "AC9POW_versionBadgeName",
13233
- "openWithRemove": "AC9POW_openWithRemove",
13234
- "openWithEditorInput": "AC9POW_openWithEditorInput",
13235
- "groupHeading": "AC9POW_groupHeading",
13236
- "error": "AC9POW_error",
12950
+ "cardSwitchThumb": "AC9POW_cardSwitchThumb",
12951
+ "pluginGroupHeading": "AC9POW_pluginGroupHeading",
12952
+ "cardTop": "AC9POW_cardTop",
12953
+ "pluginSearch": "AC9POW_pluginSearch",
12954
+ "pluginEntry": "AC9POW_pluginEntry",
12955
+ "selectAnchorText": "AC9POW_selectAnchorText",
12956
+ "pluginEmpty": "AC9POW_pluginEmpty",
12957
+ "rowGear": "AC9POW_rowGear",
12958
+ "selectOptionText": "AC9POW_selectOptionText",
12959
+ "selectAnchorIcon": "AC9POW_selectAnchorIcon",
12960
+ "selectAnchor": "AC9POW_selectAnchor",
12961
+ "openWithFamily": "AC9POW_openWithFamily",
13237
12962
  "section": "AC9POW_section",
13238
- "percentInput": "AC9POW_percentInput",
13239
- "pluginName": "AC9POW_pluginName",
13240
- "switch": "AC9POW_switch",
13241
12963
  "popupDialog": "AC9POW_popupDialog",
13242
- "grid": "AC9POW_grid",
13243
- "rowText": "AC9POW_rowText",
13244
- "pluginEntries": "AC9POW_pluginEntries",
13245
- "count": "AC9POW_count",
13246
- "switchInput": "AC9POW_switchInput",
13247
- "cardMain": "AC9POW_cardMain",
13248
- "cardSwitchTrack": "AC9POW_cardSwitchTrack",
13249
- "selectOption": "AC9POW_selectOption",
13250
- "pluginSearch": "AC9POW_pluginSearch",
13251
- "cardIconChip": "AC9POW_cardIconChip",
13252
- "pluginTopicBtn": "AC9POW_pluginTopicBtn",
13253
- "pluginDesc": "AC9POW_pluginDesc",
12964
+ "switch": "AC9POW_switch",
12965
+ "versionBadge": "AC9POW_versionBadge",
12966
+ "pluginList": "AC9POW_pluginList",
13254
12967
  "selectOptionIcon": "AC9POW_selectOptionIcon",
13255
- "openWithEditorTemplate": "AC9POW_openWithEditorTemplate",
13256
- "cardTop": "AC9POW_cardTop",
12968
+ "pluginJumpBtn": "AC9POW_pluginJumpBtn",
12969
+ "openWithHint": "AC9POW_openWithHint",
12970
+ "pluginEntryActions": "AC9POW_pluginEntryActions",
13257
12971
  "cardTitle": "AC9POW_cardTitle",
12972
+ "popupRows": "AC9POW_popupRows",
12973
+ "versionBadgeTag": "AC9POW_versionBadgeTag",
12974
+ "suffix": "AC9POW_suffix",
12975
+ "rowText": "AC9POW_rowText",
12976
+ "grid": "AC9POW_grid",
12977
+ "pluginTopicBtn": "AC9POW_pluginTopicBtn",
12978
+ "openWithEditorRow": "AC9POW_openWithEditorRow",
12979
+ "cardIconChip": "AC9POW_cardIconChip",
12980
+ "versionBadgeName": "AC9POW_versionBadgeName",
13258
12981
  "done": "AC9POW_done",
13259
- "pluginModal": "AC9POW_pluginModal",
13260
- "group": "AC9POW_group",
12982
+ "typedInput": "AC9POW_typedInput",
12983
+ "pluginName": "AC9POW_pluginName",
13261
12984
  "pluginInstall": "AC9POW_pluginInstall",
13262
- "cardSwitchThumb": "AC9POW_cardSwitchThumb",
13263
- "typedInputNumber": "AC9POW_typedInputNumber",
13264
- "title": "AC9POW_title",
12985
+ "count": "AC9POW_count",
12986
+ "pluginModal": "AC9POW_pluginModal",
12987
+ "selectOption": "AC9POW_selectOption",
13265
12988
  "popupRow": "AC9POW_popupRow",
13266
- "control": "AC9POW_control",
13267
- "cardDesc": "AC9POW_cardDesc",
13268
- "pluginEmpty": "AC9POW_pluginEmpty",
13269
- "selectAnchor": "AC9POW_selectAnchor",
13270
- "selectAnchorIcon": "AC9POW_selectAnchorIcon",
13271
- "pluginList": "AC9POW_pluginList",
13272
- "versionBadge": "AC9POW_versionBadge",
13273
- "pluginGroup": "AC9POW_pluginGroup",
13274
- "pluginCopyBtn": "AC9POW_pluginCopyBtn",
13275
- "cssTextArea": "AC9POW_cssTextArea",
13276
- "suffix": "AC9POW_suffix",
13277
- "switchTrack": "AC9POW_switchTrack",
13278
- "openWithFamily": "AC9POW_openWithFamily",
13279
- "cardSwitch": "AC9POW_cardSwitch",
13280
- "cardOn": "AC9POW_cardOn",
13281
- "row": "AC9POW_row",
13282
12989
  "pluginEntryHead": "AC9POW_pluginEntryHead",
13283
- "pluginGroupHeading": "AC9POW_pluginGroupHeading",
13284
- "openWithHint": "AC9POW_openWithHint",
13285
- "pluginEntryActions": "AC9POW_pluginEntryActions",
13286
- "pluginEntry": "AC9POW_pluginEntry",
13287
- "rowGear": "AC9POW_rowGear",
13288
- "popupRows": "AC9POW_popupRows"
12990
+ "error": "AC9POW_error",
12991
+ "pluginEntries": "AC9POW_pluginEntries"
13289
12992
  };
13290
12993
  //#endregion
13291
12994
  //#region src/client/open-with-settings.tsx
@@ -13433,90 +13136,7 @@ window.__ModuleLoader__.load({
13433
13136
  role: "note",
13434
13137
  children: t("openWithSettingsInvalidHint")
13435
13138
  })
13436
- ]
13437
- });
13438
- }
13439
- //#endregion
13440
- //#region src/client/lazy-chunk.tsx
13441
- /**
13442
- * Lazy chunk view wrapper: mounts a component that lives in a lazy chunk,
13443
- * showing a loading placeholder while the chunk script loads and an error +
13444
- * retry affordance on failure. Used by the built-in tab/viewer descriptors.
13445
- *
13446
- * Contract note: {@link lazyChunkComponent} returns a plain render-prop
13447
- * function — the descriptor contract is `component: (props) => ReactNode`,
13448
- * and the repo renders descriptors BOTH ways: Sidebar calls
13449
- * `descriptor.component(props)` directly, EditorHost renders it via
13450
- * `createElement`. The wrapper function body therefore contains no hooks;
13451
- * all state lives in the inner {@link LazyChunkView} component.
13452
- */
13453
- function LazyChunkView({ chunk, pick, props }) {
13454
- const [attempt, setAttempt] = (0, react.useState)(0);
13455
- const [state, setState] = (0, react.useState)({ status: "loading" });
13456
- (0, react.useEffect)(() => {
13457
- let cancelled = false;
13458
- setState({ status: "loading" });
13459
- loadChunk(chunk).then((mod) => {
13460
- if (cancelled) return;
13461
- const Comp = pick(mod);
13462
- if (Comp === void 0) {
13463
- setState({
13464
- status: "error",
13465
- message: `[dsh-coding-sidebar] chunk "${chunk}" is missing its component`
13466
- });
13467
- return;
13468
- }
13469
- setState({
13470
- status: "ready",
13471
- Comp
13472
- });
13473
- }).catch((error) => {
13474
- if (cancelled) return;
13475
- setState({
13476
- status: "error",
13477
- message: error instanceof Error ? error.message : String(error)
13478
- });
13479
- });
13480
- return () => {
13481
- cancelled = true;
13482
- };
13483
- }, [
13484
- chunk,
13485
- pick,
13486
- attempt
13487
- ]);
13488
- if (state.status === "loading") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
13489
- className: sidebar_module_css_default.editorPlaceholder,
13490
- children: t("loading")
13491
- });
13492
- if (state.status === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
13493
- className: sidebar_module_css_default.editorError,
13494
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: state.message }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
13495
- type: "button",
13496
- className: sidebar_module_css_default.terminalRetry,
13497
- onClick: () => {
13498
- setAttempt((current) => current + 1);
13499
- },
13500
- children: t("terminalRetry")
13501
- })]
13502
- });
13503
- return (0, react.createElement)(state.Comp, props);
13504
- }
13505
- /**
13506
- * Build a descriptor-compatible lazy wrapper for a chunk-resident component.
13507
- * The returned function is the descriptor `component` itself: it returns an
13508
- * element and never calls hooks, so both invocation styles (plain function
13509
- * call and createElement/JSX render) work. `pick` must be a module-level
13510
- * function (stable identity) — an inline lambda would re-trigger the load
13511
- * effect on every render.
13512
- * @param chunk - the chunk name (see chunk-loader.ts).
13513
- * @param pick - select the component from the chunk's exports.
13514
- */
13515
- function lazyChunkComponent(chunk, pick) {
13516
- return (props) => (0, react.createElement)(LazyChunkView, {
13517
- chunk,
13518
- pick,
13519
- props
13139
+ ]
13520
13140
  });
13521
13141
  }
13522
13142
  //#endregion
@@ -15087,57 +14707,57 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
15087
14707
  }
15088
14708
  var SubagentView_module_css_default = {
15089
14709
  "subagentLiveTool": "F2T6aa_subagentLiveTool",
15090
- "subagentHeader": "F2T6aa_subagentHeader",
15091
- "subagentDot": "F2T6aa_subagentDot",
15092
- "historyToggle": "F2T6aa_historyToggle",
15093
- "jobsDot": "F2T6aa_jobsDot",
15094
- "jobsKillError": "F2T6aa_jobsKillError",
15095
- "subagentLiveText": "F2T6aa_subagentLiveText",
15096
- "subagentRefresh": "F2T6aa_subagentRefresh",
14710
+ "subagentTitle": "F2T6aa_subagentTitle",
14711
+ "jobsRowSettled": "F2T6aa_jobsRowSettled",
14712
+ "jobsRowMain": "F2T6aa_jobsRowMain",
14713
+ "subagentRowActive": "F2T6aa_subagentRowActive",
14714
+ "subagentEmpty": "F2T6aa_subagentEmpty",
14715
+ "jobsRow": "F2T6aa_jobsRow",
14716
+ "jobsSecondary": "F2T6aa_jobsSecondary",
14717
+ "subagentCount": "F2T6aa_subagentCount",
14718
+ "jobsContent": "F2T6aa_jobsContent",
15097
14719
  "jobsTitle": "F2T6aa_jobsTitle",
14720
+ "subagentBody": "F2T6aa_subagentBody",
14721
+ "subagentContent": "F2T6aa_subagentContent",
14722
+ "subagent": "F2T6aa_subagent",
15098
14723
  "jobsPaneLabel": "F2T6aa_jobsPaneLabel",
14724
+ "jobsPaneError": "F2T6aa_jobsPaneError",
14725
+ "subagentNode": "F2T6aa_subagentNode",
15099
14726
  "jobsPane": "F2T6aa_jobsPane",
15100
- "jobsRow": "F2T6aa_jobsRow",
14727
+ "jobsCount": "F2T6aa_jobsCount",
14728
+ "jobsDot": "F2T6aa_jobsDot",
14729
+ "jobsPaneDot": "F2T6aa_jobsPaneDot",
14730
+ "jobsPanePre": "F2T6aa_jobsPanePre",
15101
14731
  "jobsPaneClose": "F2T6aa_jobsPaneClose",
14732
+ "jobsKill": "F2T6aa_jobsKill",
14733
+ "jobsPaneHeader": "F2T6aa_jobsPaneHeader",
14734
+ "subagentDot": "F2T6aa_subagentDot",
14735
+ "jobsLabel": "F2T6aa_jobsLabel",
14736
+ "subagentLive": "F2T6aa_subagentLive",
14737
+ "jobsPaneStatus": "F2T6aa_jobsPaneStatus",
14738
+ "jobsLabelLine": "F2T6aa_jobsLabelLine",
15102
14739
  "jobsPaneHint": "F2T6aa_jobsPaneHint",
15103
- "subagentSecondary": "F2T6aa_subagentSecondary",
15104
- "subagentLabel": "F2T6aa_subagentLabel",
14740
+ "jobsList": "F2T6aa_jobsList",
15105
14741
  "subagentError": "F2T6aa_subagentError",
15106
- "subagentEmpty": "F2T6aa_subagentEmpty",
15107
- "subagentTitle": "F2T6aa_subagentTitle",
15108
- "jobsCount": "F2T6aa_jobsCount",
15109
- "jobsLabelLine": "F2T6aa_jobsLabelLine",
15110
- "jobsPanePre": "F2T6aa_jobsPanePre",
15111
- "subagentRowActive": "F2T6aa_subagentRowActive",
14742
+ "subagentRowLoading": "F2T6aa_subagentRowLoading",
14743
+ "subagentRow": "F2T6aa_subagentRow",
14744
+ "subagentHeader": "F2T6aa_subagentHeader",
14745
+ "subagentRefresh": "F2T6aa_subagentRefresh",
14746
+ "subagentSecondary": "F2T6aa_subagentSecondary",
15112
14747
  "subagentLiveArgs": "F2T6aa_subagentLiveArgs",
15113
- "jobs": "F2T6aa_jobs",
15114
- "jobsContent": "F2T6aa_jobsContent",
15115
- "subagentCount": "F2T6aa_subagentCount",
15116
14748
  "subagentEmptyHint": "F2T6aa_subagentEmptyHint",
15117
- "subagent": "F2T6aa_subagent",
15118
- "jobsPaneError": "F2T6aa_jobsPaneError",
15119
- "jobsLabel": "F2T6aa_jobsLabel",
15120
14749
  "subagentErrorRetry": "F2T6aa_subagentErrorRetry",
15121
- "jobsList": "F2T6aa_jobsList",
15122
- "jobsRowSelected": "F2T6aa_jobsRowSelected",
15123
- "jobsRowSettled": "F2T6aa_jobsRowSettled",
15124
- "jobsHeader": "F2T6aa_jobsHeader",
15125
- "jobsSecondary": "F2T6aa_jobsSecondary",
15126
- "subagentRow": "F2T6aa_subagentRow",
15127
- "subagentContent": "F2T6aa_subagentContent",
15128
- "jobsKillArmed": "F2T6aa_jobsKillArmed",
15129
- "jobsPaneHeader": "F2T6aa_jobsPaneHeader",
15130
- "subagentLive": "F2T6aa_subagentLive",
15131
- "jobsKill": "F2T6aa_jobsKill",
15132
- "subagentBody": "F2T6aa_subagentBody",
15133
- "subagentRowLoading": "F2T6aa_subagentRowLoading",
15134
- "jobsRowMain": "F2T6aa_jobsRowMain",
15135
- "jobsKind": "F2T6aa_jobsKind",
15136
- "jobsPaneDot": "F2T6aa_jobsPaneDot",
15137
- "jobsPaneStatus": "F2T6aa_jobsPaneStatus",
15138
14750
  "subagentRowDisabled": "F2T6aa_subagentRowDisabled",
14751
+ "jobs": "F2T6aa_jobs",
14752
+ "jobsHeader": "F2T6aa_jobsHeader",
14753
+ "subagentLabel": "F2T6aa_subagentLabel",
15139
14754
  "subagentChildren": "F2T6aa_subagentChildren",
15140
- "subagentNode": "F2T6aa_subagentNode"
14755
+ "jobsRowSelected": "F2T6aa_jobsRowSelected",
14756
+ "jobsKind": "F2T6aa_jobsKind",
14757
+ "jobsKillError": "F2T6aa_jobsKillError",
14758
+ "subagentLiveText": "F2T6aa_subagentLiveText",
14759
+ "historyToggle": "F2T6aa_historyToggle",
14760
+ "jobsKillArmed": "F2T6aa_jobsKillArmed"
15141
14761
  };
15142
14762
  //#endregion
15143
14763
  //#region src/client/SubagentView.tsx
@@ -16234,7 +15854,7 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
16234
15854
  }
16235
15855
  //#endregion
16236
15856
  //#region \0dsh-css:/Users/libing/kk_Projects/dsh-coding-sidebar/src/client/SideChatView.module.css.mjs
16237
- const css$1 = "._64UoUa_sidechat{flex-direction:column;flex:1;min-height:0;display:flex}._64UoUa_sidechatDetailHeader{border-bottom:1px solid var(--dsw-alias-hairline);flex:none;align-items:center;gap:4px;min-height:36px;padding:4px 8px 4px 12px;display:flex}._64UoUa_sidechatHeaderDot{flex:none}._64UoUa_sidechatHeaderSpacer{flex:1;min-width:0}._64UoUa_sidechatAgentBadge{border:1px solid var(--dsw-alias-hairline);max-width:55%;font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;border-radius:999px;flex:none;padding:1px 8px;overflow:hidden}._64UoUa_sidechatIconBtn{width:26px;height:26px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:6px;flex:none;justify-content:center;align-items:center;padding:0;transition:background-color .1s ease-out,color .1s ease-out;display:inline-flex}._64UoUa_sidechatIconBtn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._64UoUa_sidechatIconBtn:disabled{opacity:.4;cursor:default}._64UoUa_sidechatHero{min-height:0;color:var(--dsw-alias-label-tertiary);text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:24px 20px;animation:.2s ease-out _64UoUa_sidechatFadeIn;display:flex}._64UoUa_sidechatHeroTitle{font:var(--dsw-font-s-14);color:var(--dsw-alias-label-primary);font-weight:500}._64UoUa_sidechatHeroDesc{max-width:300px;font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);line-height:1.6}._64UoUa_sidechatPrimaryBtn{background:var(--dsw-alias-button-info-fill,var(--dsw-alias-accent));color:var(--dsw-alias-button-info-label,var(--dsw-alias-accent-ink,#fff));font:var(--dsw-font-s-13);cursor:pointer;border:none;border-radius:999px;flex:none;margin-top:4px;padding:6px 14px;transition:opacity .1s ease-out}._64UoUa_sidechatPrimaryBtn:hover:not(:disabled){opacity:.88}._64UoUa_sidechatPrimaryBtn:disabled{opacity:.4;cursor:default}._64UoUa_sidechatHint{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);flex:none;padding:4px 12px}._64UoUa_sidechatError{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-danger);flex:none;padding:4px 12px}._64UoUa_sidechatScroll{flex-direction:column;flex:1;gap:10px;min-height:0;padding:10px 12px;display:flex;overflow-y:auto}._64UoUa_sidechatScroll>*{animation:.18s ease-out _64UoUa_sidechatRowIn}._64UoUa_sidechatUser{background:var(--dsw-specific-bubble,var(--dsw-alias-bg-base));max-width:88%;font:var(--dsw-font-s-14);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;border-radius:18px;align-self:flex-end;padding:8px 14px}._64UoUa_sidechatAssistant{font:var(--dsw-font-s-14);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;align-self:stretch}._64UoUa_sidechatRow{align-self:stretch}._64UoUa_sidechatRowLine{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);align-items:center;gap:6px;padding:1px 0;display:flex}._64UoUa_sidechatRowSummary{cursor:pointer;user-select:none;list-style:none}._64UoUa_sidechatRowSummary::-webkit-details-marker{display:none}._64UoUa_sidechatRowSummary:hover{color:var(--dsw-alias-label-secondary)}._64UoUa_sidechatRowStatic{cursor:default}._64UoUa_sidechatRowChevron{flex:none;align-items:center;transition:transform .1s ease-out;display:inline-flex}._64UoUa_sidechatRow[open] ._64UoUa_sidechatRowChevron{transform:rotate(90deg)}._64UoUa_sidechatRowLabel{text-overflow:ellipsis;white-space:nowrap;max-width:60%;color:var(--dsw-alias-label-secondary);flex:none;overflow:hidden}._64UoUa_sidechatRowMono{font-family:var(--dsw-font-mono)}._64UoUa_sidechatRowMeta{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--dsw-font-mono);color:var(--dsw-alias-label-tertiary);flex:1;overflow:hidden}._64UoUa_sidechatRowFailed ._64UoUa_sidechatRowLabel,._64UoUa_sidechatRowFailed ._64UoUa_sidechatRowMeta{color:var(--dsw-alias-danger)}._64UoUa_sidechatRowBody{border-left:1px solid var(--dsw-alias-hairline);margin:2px 0 4px 7px;padding:2px 0 2px 10px}._64UoUa_sidechatRowProse{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);white-space:pre-wrap;overflow-wrap:anywhere;max-height:240px;overflow-y:auto}._64UoUa_sidechatRowCode{font:var(--dsw-font-xxs-12);font-family:var(--dsw-font-mono);color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;max-height:220px;margin:0;padding:4px 0;overflow-y:auto}._64UoUa_sidechatRowCode+._64UoUa_sidechatRowCode{border-top:1px solid var(--dsw-alias-hairline)}._64UoUa_sidechatShimmerText{background-image:linear-gradient(90deg, var(--dsw-alias-label-tertiary) 0%, var(--dsw-alias-label-primary) 50%, var(--dsw-alias-label-tertiary) 100%);color:#0000;background-size:200% 100%;-webkit-background-clip:text;background-clip:text;animation:2.6s linear infinite _64UoUa_sidechatSweep}._64UoUa_sidechatStatus{flex:none;align-items:center;gap:8px;padding:2px 14px 6px;animation:.16s ease-out _64UoUa_sidechatFadeIn;display:flex}._64UoUa_sidechatStatusText{font:var(--dsw-font-xxs-12);background-image:linear-gradient(90deg, var(--dsw-alias-label-tertiary) 0%, var(--dsw-alias-label-primary) 50%, var(--dsw-alias-label-tertiary) 100%);color:#0000;background-size:200% 100%;-webkit-background-clip:text;background-clip:text;animation:2.6s linear infinite _64UoUa_sidechatSweep}._64UoUa_sidechatComposer{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,var(--dsw-alias-hairline));background:var(--dsw-specific-input-major,var(--dsw-alias-bg-base));box-shadow:var(--dsw-shadow-lv2,none);border-radius:16px;flex-direction:column;flex:none;gap:4px;margin:0 8px 8px;padding:8px 8px 6px 14px;display:flex}._64UoUa_sidechatComposerInput{box-sizing:border-box;width:100%;color:var(--dsw-alias-label-primary);font:var(--dsw-font-s-14);resize:none;background:0 0;border:none;outline:none;max-height:132px;padding:2px 0;line-height:22px}._64UoUa_sidechatComposerInput::placeholder{color:var(--dsw-alias-label-tertiary)}._64UoUa_sidechatComposerBar{flex:none;align-items:center;gap:8px;min-height:28px;display:flex}._64UoUa_sidechatComposerMeta{min-width:0;font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}._64UoUa_sidechatSendBtn{background:var(--dsw-alias-button-info-fill,var(--dsw-alias-accent));width:28px;height:28px;color:var(--dsw-alias-button-info-label,var(--dsw-alias-accent-ink,#fff));cursor:pointer;border:none;border-radius:50%;flex:none;justify-content:center;align-items:center;padding:0;transition:opacity .1s ease-out;animation:.12s ease-out _64UoUa_sidechatBtnIn;display:inline-flex}._64UoUa_sidechatSendBtn:hover:not(:disabled){opacity:.88}._64UoUa_sidechatSendBtn:disabled{opacity:.35;cursor:default}@keyframes _64UoUa_sidechatRowIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes _64UoUa_sidechatFadeIn{0%{opacity:0}to{opacity:1}}@keyframes _64UoUa_sidechatBtnIn{0%{opacity:0;transform:scale(.85)}to{opacity:1;transform:scale(1)}}@keyframes _64UoUa_sidechatSweep{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){._64UoUa_sidechatScroll>*,._64UoUa_sidechatHero,._64UoUa_sidechatStatus,._64UoUa_sidechatSendBtn{animation:none}._64UoUa_sidechatStatusText,._64UoUa_sidechatShimmerText{color:var(--dsw-alias-label-tertiary);background-image:none;animation:none}._64UoUa_sidechatRowChevron{transition:none}}";
15857
+ const css$1 = "._64UoUa_sidechat{flex-direction:column;flex:1;min-height:0;display:flex}._64UoUa_sidechatDetailHeader{border-bottom:1px solid var(--dsw-alias-border-l);flex:none;align-items:center;gap:4px;min-height:36px;padding:4px 8px 4px 12px;display:flex}._64UoUa_sidechatHeaderDot{flex:none}._64UoUa_sidechatHeaderSpacer{flex:1;min-width:0}._64UoUa_sidechatAgentBadge{border:1px solid var(--dsw-alias-border-l);max-width:55%;font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;border-radius:999px;flex:none;padding:1px 8px;overflow:hidden}._64UoUa_sidechatIconBtn{width:26px;height:26px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:6px;flex:none;justify-content:center;align-items:center;padding:0;transition:background-color .1s ease-out,color .1s ease-out;display:inline-flex}._64UoUa_sidechatIconBtn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._64UoUa_sidechatIconBtn:disabled{opacity:.4;cursor:default}._64UoUa_sidechatHero{min-height:0;color:var(--dsw-alias-label-tertiary);text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:24px 20px;animation:.2s ease-out _64UoUa_sidechatFadeIn;display:flex}._64UoUa_sidechatHeroTitle{font:var(--dsw-font-s-14);color:var(--dsw-alias-label-primary);font-weight:500}._64UoUa_sidechatHeroDesc{max-width:300px;font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);line-height:1.6}._64UoUa_sidechatPrimaryBtn{background:var(--dsw-alias-button-info-fill,var(--dsw-alias-interactive-bg-hover-solid));color:#fff;font:var(--dsw-font-s-14);cursor:pointer;border:none;border-radius:999px;flex:none;margin-top:4px;padding:6px 14px;transition:opacity .1s ease-out}._64UoUa_sidechatPrimaryBtn:hover:not(:disabled){opacity:.88}._64UoUa_sidechatPrimaryBtn:disabled{opacity:.4;cursor:default}._64UoUa_sidechatHint{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);flex:none;padding:4px 12px}._64UoUa_sidechatError{font:var(--dsw-font-xxs-12);color:#d5304d;flex:none;padding:4px 12px}._64UoUa_sidechatScroll{flex-direction:column;flex:1;gap:10px;min-height:0;padding:10px 12px;display:flex;overflow-y:auto}._64UoUa_sidechatScroll>*{animation:.18s ease-out _64UoUa_sidechatRowIn}._64UoUa_sidechatUser{background:var(--dsw-specific-bubble,var(--dsw-alias-bg-base));max-width:88%;font:var(--dsw-font-s-14);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;border-radius:18px;align-self:flex-end;padding:8px 14px}._64UoUa_sidechatAssistant{font:var(--dsw-font-s-14);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;align-self:stretch}._64UoUa_sidechatRow{align-self:stretch}._64UoUa_sidechatRowLine{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);align-items:center;gap:6px;padding:1px 0;display:flex}._64UoUa_sidechatRowSummary{cursor:pointer;user-select:none;list-style:none}._64UoUa_sidechatRowSummary::-webkit-details-marker{display:none}._64UoUa_sidechatRowSummary:hover{color:var(--dsw-alias-label-secondary)}._64UoUa_sidechatRowStatic{cursor:default}._64UoUa_sidechatRowChevron{flex:none;align-items:center;transition:transform .1s ease-out;display:inline-flex}._64UoUa_sidechatRow[open] ._64UoUa_sidechatRowChevron{transform:rotate(90deg)}._64UoUa_sidechatRowLabel{text-overflow:ellipsis;white-space:nowrap;max-width:60%;color:var(--dsw-alias-label-secondary);flex:none;overflow:hidden}._64UoUa_sidechatRowMono{font-family:var(--dsw-font-mono)}._64UoUa_sidechatRowMeta{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--dsw-font-mono);color:var(--dsw-alias-label-tertiary);flex:1;overflow:hidden}._64UoUa_sidechatRowFailed ._64UoUa_sidechatRowLabel,._64UoUa_sidechatRowFailed ._64UoUa_sidechatRowMeta{color:#d5304d}._64UoUa_sidechatRowBody{border-left:1px solid var(--dsw-alias-border-l);margin:2px 0 4px 7px;padding:2px 0 2px 10px}._64UoUa_sidechatRowProse{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);white-space:pre-wrap;overflow-wrap:anywhere;max-height:240px;overflow-y:auto}._64UoUa_sidechatRowCode{font:var(--dsw-font-xxs-12);font-family:var(--dsw-font-mono);color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;max-height:220px;margin:0;padding:4px 0;overflow-y:auto}._64UoUa_sidechatRowCode+._64UoUa_sidechatRowCode{border-top:1px solid var(--dsw-alias-border-l)}._64UoUa_sidechatShimmerText{background-image:linear-gradient(90deg, var(--dsw-alias-label-tertiary) 0%, var(--dsw-alias-label-primary) 50%, var(--dsw-alias-label-tertiary) 100%);color:#0000;background-size:200% 100%;-webkit-background-clip:text;background-clip:text;animation:2.6s linear infinite _64UoUa_sidechatSweep}._64UoUa_sidechatStatus{flex:none;align-items:center;gap:8px;padding:2px 14px 6px;animation:.16s ease-out _64UoUa_sidechatFadeIn;display:flex}._64UoUa_sidechatStatusText{font:var(--dsw-font-xxs-12);background-image:linear-gradient(90deg, var(--dsw-alias-label-tertiary) 0%, var(--dsw-alias-label-primary) 50%, var(--dsw-alias-label-tertiary) 100%);color:#0000;background-size:200% 100%;-webkit-background-clip:text;background-clip:text;animation:2.6s linear infinite _64UoUa_sidechatSweep}._64UoUa_sidechatComposer{border:1px solid var(--dsw-alias-border-l2-darkmode-thin,var(--dsw-alias-border-l));background:var(--dsw-specific-input-major,var(--dsw-alias-bg-base));box-shadow:var(--dsw-shadow-lv2,none);border-radius:16px;flex-direction:column;flex:none;gap:4px;margin:0 8px 8px;padding:8px 8px 6px 14px;display:flex}._64UoUa_sidechatComposerInput{box-sizing:border-box;width:100%;color:var(--dsw-alias-label-primary);font:var(--dsw-font-s-14);resize:none;background:0 0;border:none;outline:none;max-height:132px;padding:2px 0;line-height:22px}._64UoUa_sidechatComposerInput::placeholder{color:var(--dsw-alias-label-tertiary)}._64UoUa_sidechatComposerBar{flex:none;align-items:center;gap:8px;min-height:28px;display:flex}._64UoUa_sidechatComposerMeta{min-width:0;font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}._64UoUa_sidechatSendBtn{background:var(--dsw-alias-button-info-fill,var(--dsw-alias-interactive-bg-hover-solid));color:#fff;cursor:pointer;border:none;border-radius:50%;flex:none;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:opacity .1s ease-out;animation:.12s ease-out _64UoUa_sidechatBtnIn;display:inline-flex}._64UoUa_sidechatSendBtn:hover:not(:disabled){opacity:.88}._64UoUa_sidechatSendBtn:disabled{opacity:.35;cursor:default}@keyframes _64UoUa_sidechatRowIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes _64UoUa_sidechatFadeIn{0%{opacity:0}to{opacity:1}}@keyframes _64UoUa_sidechatBtnIn{0%{opacity:0;transform:scale(.85)}to{opacity:1;transform:scale(1)}}@keyframes _64UoUa_sidechatSweep{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){._64UoUa_sidechatScroll>*,._64UoUa_sidechatHero,._64UoUa_sidechatStatus,._64UoUa_sidechatSendBtn{animation:none}._64UoUa_sidechatStatusText,._64UoUa_sidechatShimmerText{color:var(--dsw-alias-label-tertiary);background-image:none;animation:none}._64UoUa_sidechatRowChevron{transition:none}}";
16238
15858
  const tagId$1 = "dsh-external/dsh-coding-sidebar/SideChatView.module.css";
16239
15859
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
16240
15860
  const tag = document.createElement("style");
@@ -16244,45 +15864,45 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
16244
15864
  document.head.appendChild(tag);
16245
15865
  }
16246
15866
  var SideChatView_module_css_default = {
16247
- "sidechatRowLine": "_64UoUa_sidechatRowLine",
16248
- "sidechatRowProse": "_64UoUa_sidechatRowProse",
15867
+ "sidechatComposerInput": "_64UoUa_sidechatComposerInput",
15868
+ "sidechatComposerBar": "_64UoUa_sidechatComposerBar",
15869
+ "sidechatHeaderSpacer": "_64UoUa_sidechatHeaderSpacer",
15870
+ "sidechatHeroTitle": "_64UoUa_sidechatHeroTitle",
15871
+ "sidechatPrimaryBtn": "_64UoUa_sidechatPrimaryBtn",
15872
+ "sidechatStatus": "_64UoUa_sidechatStatus",
15873
+ "sidechatComposer": "_64UoUa_sidechatComposer",
15874
+ "sidechatBtnIn": "_64UoUa_sidechatBtnIn",
15875
+ "sidechat": "_64UoUa_sidechat",
16249
15876
  "sidechatRowMono": "_64UoUa_sidechatRowMono",
16250
- "sidechatSendBtn": "_64UoUa_sidechatSendBtn",
15877
+ "sidechatScroll": "_64UoUa_sidechatScroll",
15878
+ "sidechatHero": "_64UoUa_sidechatHero",
15879
+ "sidechatAgentBadge": "_64UoUa_sidechatAgentBadge",
15880
+ "sidechatDetailHeader": "_64UoUa_sidechatDetailHeader",
15881
+ "sidechatFadeIn": "_64UoUa_sidechatFadeIn",
15882
+ "sidechatHeaderDot": "_64UoUa_sidechatHeaderDot",
16251
15883
  "sidechatRowStatic": "_64UoUa_sidechatRowStatic",
16252
- "sidechatRowChevron": "_64UoUa_sidechatRowChevron",
16253
15884
  "sidechatShimmerText": "_64UoUa_sidechatShimmerText",
16254
- "sidechatComposerMeta": "_64UoUa_sidechatComposerMeta",
16255
- "sidechatRowSummary": "_64UoUa_sidechatRowSummary",
16256
- "sidechatRowLabel": "_64UoUa_sidechatRowLabel",
16257
- "sidechatAgentBadge": "_64UoUa_sidechatAgentBadge",
16258
- "sidechatScroll": "_64UoUa_sidechatScroll",
16259
- "sidechatComposer": "_64UoUa_sidechatComposer",
16260
- "sidechatPrimaryBtn": "_64UoUa_sidechatPrimaryBtn",
15885
+ "sidechatIconBtn": "_64UoUa_sidechatIconBtn",
15886
+ "sidechatHeroDesc": "_64UoUa_sidechatHeroDesc",
15887
+ "sidechatHint": "_64UoUa_sidechatHint",
16261
15888
  "sidechatRowIn": "_64UoUa_sidechatRowIn",
16262
- "sidechatError": "_64UoUa_sidechatError",
15889
+ "sidechatRow": "_64UoUa_sidechatRow",
15890
+ "sidechatRowProse": "_64UoUa_sidechatRowProse",
16263
15891
  "sidechatRowBody": "_64UoUa_sidechatRowBody",
15892
+ "sidechatRowChevron": "_64UoUa_sidechatRowChevron",
16264
15893
  "sidechatRowFailed": "_64UoUa_sidechatRowFailed",
16265
- "sidechatHeaderSpacer": "_64UoUa_sidechatHeaderSpacer",
16266
- "sidechatUser": "_64UoUa_sidechatUser",
15894
+ "sidechatRowLine": "_64UoUa_sidechatRowLine",
15895
+ "sidechatRowLabel": "_64UoUa_sidechatRowLabel",
15896
+ "sidechatRowSummary": "_64UoUa_sidechatRowSummary",
16267
15897
  "sidechatSweep": "_64UoUa_sidechatSweep",
16268
- "sidechatStatusText": "_64UoUa_sidechatStatusText",
16269
- "sidechatBtnIn": "_64UoUa_sidechatBtnIn",
16270
- "sidechatFadeIn": "_64UoUa_sidechatFadeIn",
16271
- "sidechatHeroDesc": "_64UoUa_sidechatHeroDesc",
16272
- "sidechatHint": "_64UoUa_sidechatHint",
16273
- "sidechatComposerInput": "_64UoUa_sidechatComposerInput",
16274
- "sidechatRowMeta": "_64UoUa_sidechatRowMeta",
16275
- "sidechatHeroTitle": "_64UoUa_sidechatHeroTitle",
16276
- "sidechatRowCode": "_64UoUa_sidechatRowCode",
16277
- "sidechatStatus": "_64UoUa_sidechatStatus",
16278
- "sidechat": "_64UoUa_sidechat",
15898
+ "sidechatSendBtn": "_64UoUa_sidechatSendBtn",
16279
15899
  "sidechatAssistant": "_64UoUa_sidechatAssistant",
16280
- "sidechatRow": "_64UoUa_sidechatRow",
16281
- "sidechatDetailHeader": "_64UoUa_sidechatDetailHeader",
16282
- "sidechatHero": "_64UoUa_sidechatHero",
16283
- "sidechatHeaderDot": "_64UoUa_sidechatHeaderDot",
16284
- "sidechatIconBtn": "_64UoUa_sidechatIconBtn",
16285
- "sidechatComposerBar": "_64UoUa_sidechatComposerBar"
15900
+ "sidechatComposerMeta": "_64UoUa_sidechatComposerMeta",
15901
+ "sidechatError": "_64UoUa_sidechatError",
15902
+ "sidechatUser": "_64UoUa_sidechatUser",
15903
+ "sidechatRowMeta": "_64UoUa_sidechatRowMeta",
15904
+ "sidechatStatusText": "_64UoUa_sidechatStatusText",
15905
+ "sidechatRowCode": "_64UoUa_sidechatRowCode"
16286
15906
  };
16287
15907
  //#endregion
16288
15908
  //#region src/client/SideChatView.tsx
@@ -16975,17 +16595,20 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
16975
16595
  //#endregion
16976
16596
  //#region src/client/SandboxStatusBar.tsx
16977
16597
  /**
16978
- * The live sandbox status row of the two built-in web surfaces (HTML
16979
- * preview and the browser tab): a green "sandbox on" state with a one-tap
16980
- * TEMPORARY unlock, or a RED "sandbox off" state (global setting or the
16981
- * temporary unlock) with a restore action.
16598
+ * The live sandbox status row of the built-in browser tab: a green
16599
+ * "sandbox on" state with a one-tap TEMPORARY unlock, or a RED "sandbox
16600
+ * off" state (global setting or the temporary unlock) with a restore
16601
+ * action.
16982
16602
  *
16983
16603
  * The temporary unlock is component state only — it never writes the
16984
- * global side card setting (`htmlViewerNoSandbox` / `browserNoSandbox`);
16985
- * it lasts until the surface unmounts (tab switch / file switch) or the
16986
- * user restores the sandbox from the row. When the global setting already
16987
- * drops the sandbox, no unlock/restore action is offered (changing the
16988
- * global setting is the settings page's job) — the red warning stands.
16604
+ * global side card setting (`browserNoSandbox`); it lasts until the
16605
+ * surface unmounts (tab switch) or the user restores the sandbox from the
16606
+ * row. When the global setting already drops the sandbox, no
16607
+ * unlock/restore action is offered (changing the global setting is the
16608
+ * settings page's job) — the red warning stands.
16609
+ *
16610
+ * (v1.0.4: the HTML preview surface was retired with the file-viewer line;
16611
+ * this row now serves the browser tab only.)
16989
16612
  */
16990
16613
  function SandboxStatusBar(props) {
16991
16614
  const { sandboxed, local, dangerCopy, onUnlock, onRestore } = props;
@@ -17575,252 +17198,14 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
17575
17198
  ];
17576
17199
  }
17577
17200
  //#endregion
17578
- //#region src/client/PdfView.tsx
17579
- /** Browser-native PDF preview with an always-available download fallback. */
17580
- function PdfView(props) {
17581
- const { scope, path, title } = props;
17582
- const [load, setLoad] = (0, react.useState)({ status: "loading" });
17583
- const [interactionBlocked, setInteractionBlocked] = (0, react.useState)(false);
17584
- const frameRef = (0, react.useRef)(null);
17585
- const shieldRef = (0, react.useRef)(null);
17586
- (0, react.useEffect)(() => {
17587
- const controller = new AbortController();
17588
- let objectUrl;
17589
- setLoad({ status: "loading" });
17590
- (async () => {
17591
- try {
17592
- const response = await fetch(mediaUrl(scope, path), { signal: controller.signal });
17593
- if (!response.ok) throw new Error(`HTTP ${response.status}`);
17594
- const bytes = await response.arrayBuffer();
17595
- if (controller.signal.aborted) return;
17596
- objectUrl = URL.createObjectURL(new Blob([bytes], { type: "application/pdf" }));
17597
- setLoad({
17598
- status: "ready",
17599
- url: objectUrl
17600
- });
17601
- } catch (error) {
17602
- if (controller.signal.aborted) return;
17603
- setLoad({
17604
- status: "error",
17605
- message: error instanceof Error ? error.message : String(error)
17606
- });
17607
- }
17608
- })();
17609
- return () => {
17610
- controller.abort();
17611
- if (objectUrl !== void 0) URL.revokeObjectURL(objectUrl);
17612
- };
17613
- }, [
17614
- scope.sessionId,
17615
- scope.cwd,
17616
- path
17617
- ]);
17618
- (0, react.useEffect)(() => {
17619
- const block = () => {
17620
- setInteractionBlocked(true);
17621
- if (frameRef.current !== null) frameRef.current.style.pointerEvents = "none";
17622
- if (shieldRef.current !== null) shieldRef.current.style.pointerEvents = "auto";
17623
- };
17624
- const unblock = () => {
17625
- setInteractionBlocked(false);
17626
- if (frameRef.current !== null) frameRef.current.style.pointerEvents = "";
17627
- if (shieldRef.current !== null) shieldRef.current.style.pointerEvents = "none";
17628
- };
17629
- const blockForResize = (event) => {
17630
- const target = event.target;
17631
- if (target instanceof Element && target.closest(`.${sidebar_module_css_default.panelResize}, .${sidebar_module_css_default.divider}`) !== null) block();
17632
- };
17633
- document.addEventListener("dragstart", block, true);
17634
- document.addEventListener("dragend", unblock, true);
17635
- document.addEventListener("drop", unblock, true);
17636
- window.addEventListener("pointerdown", blockForResize, true);
17637
- window.addEventListener("pointerup", unblock, true);
17638
- window.addEventListener("pointercancel", unblock, true);
17639
- window.addEventListener("blur", unblock);
17640
- return () => {
17641
- document.removeEventListener("dragstart", block, true);
17642
- document.removeEventListener("dragend", unblock, true);
17643
- document.removeEventListener("drop", unblock, true);
17644
- window.removeEventListener("pointerdown", blockForResize, true);
17645
- window.removeEventListener("pointerup", unblock, true);
17646
- window.removeEventListener("pointercancel", unblock, true);
17647
- window.removeEventListener("blur", unblock);
17648
- };
17649
- }, []);
17650
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
17651
- className: sidebar_module_css_default.editorPdf,
17652
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
17653
- className: sidebar_module_css_default.editorPdfToolbar,
17654
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
17655
- className: sidebar_module_css_default.editorDownloadLink,
17656
- href: downloadUrl(scope, path),
17657
- download: true,
17658
- children: t("downloadToView")
17659
- })
17660
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
17661
- className: sidebar_module_css_default.editorPdfStage,
17662
- children: [
17663
- load.status === "loading" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
17664
- className: sidebar_module_css_default.editorPlaceholder,
17665
- children: t("loading")
17666
- }),
17667
- load.status === "error" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
17668
- className: sidebar_module_css_default.editorError,
17669
- children: load.message
17670
- }),
17671
- load.status === "ready" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("iframe", {
17672
- ref: frameRef,
17673
- className: clsx(sidebar_module_css_default.editorPdfFrame, interactionBlocked && sidebar_module_css_default.editorPdfFrameBlocked),
17674
- src: load.url,
17675
- title
17676
- }),
17677
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
17678
- ref: shieldRef,
17679
- className: clsx(sidebar_module_css_default.editorPdfDragShield, interactionBlocked && sidebar_module_css_default.editorPdfDragShieldActive),
17680
- "aria-hidden": "true"
17681
- })
17682
- ]
17683
- })]
17684
- });
17685
- }
17686
- //#endregion
17687
- //#region src/client/builtins/viewers.tsx
17688
- /**
17689
- * The 6 built-in file viewer descriptors: every preview surface is a
17690
- * registered viewer (image / pdf / markdown / html / code /
17691
- * binary-download), exactly like external plugins register theirs. Office
17692
- * previews (.docx / .xlsx / .pptx) are NOT built in anymore — they moved to
17693
- * the recommended office plugin (see plugins-viewers.ts), which registers
17694
- * the same ids through this service.
17695
- *
17696
- * The `binary-download` viewer sniffs NUL bytes via `detect` for unknown
17697
- * binaries and serves legacy doc/xls/ppt by extension; `code` is the
17698
- * catch-all (`exts: []`, lowest priority) that claims any file no other
17699
- * viewer did.
17700
- *
17701
- * The heavy viewers (the CodeMirror-backed markdown/html/code) render
17702
- * through {@link lazyChunkComponent} wrappers — their libraries are fetched
17703
- * only when such a file is first opened (see chunk-loader.ts). The
17704
- * descriptor metadata (id/exts/priority/detect) is identical either way,
17705
- * so matching semantics and external-plugin overrides are unaffected; the
17706
- * `component` wrapper keeps the descriptor contract `(props) => ReactNode`.
17707
- *
17708
- * Every viewer carries the declarative settings-surface fields — `title`
17709
- * and `icon` — so the Side card settings page can render the enable/disable
17710
- * inventory without hardcoding (eating our own dogfood).
17711
- */
17712
- /**
17713
- * Lazy wrapper over the chunk-resident viewer component. The `pick`
17714
- * function is module-level (stable identity — the wrapper effect depends
17715
- * on it); the cast bridges the chunk exports record to the descriptor prop
17716
- * shape (the view reads only its own subset of FileViewerProps).
17717
- */
17718
- const LazyTextEditor = lazyChunkComponent("editor", (mod) => mod.TextEditor);
17719
- /** The 6 built-in file viewer descriptors. */
17720
- function builtinViewers() {
17721
- return [
17722
- {
17723
- id: "image",
17724
- title: () => t("viewerImage"),
17725
- icon: (size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconImageOutline16, { size }),
17726
- exts: [
17727
- "png",
17728
- "jpg",
17729
- "jpeg",
17730
- "gif",
17731
- "webp",
17732
- "svg",
17733
- "bmp",
17734
- "ico",
17735
- "avif"
17736
- ],
17737
- fetchStrategy: "mediaUrl",
17738
- component: ({ mediaUrl: url, title }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
17739
- className: sidebar_module_css_default.editorImageWrap,
17740
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
17741
- className: sidebar_module_css_default.editorImage,
17742
- src: url,
17743
- alt: title
17744
- })
17745
- })
17746
- },
17747
- {
17748
- id: "pdf",
17749
- title: () => t("viewerPdf"),
17750
- icon: (size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconPdfOutline16, { size }),
17751
- exts: ["pdf"],
17752
- fetchStrategy: "mediaUrl",
17753
- component: ({ scope, path, title }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PdfView, {
17754
- scope,
17755
- path,
17756
- title
17757
- })
17758
- },
17759
- {
17760
- id: "markdown",
17761
- title: () => t("viewerMarkdown"),
17762
- icon: (size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconMarkdownOutline16, { size }),
17763
- exts: ["md", "markdown"],
17764
- fetchStrategy: "fsRead",
17765
- component: (props) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(LazyTextEditor, { ...props })
17766
- },
17767
- {
17768
- id: "html",
17769
- title: () => t("viewerHtml"),
17770
- icon: (size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconHtmlOutline16, { size }),
17771
- exts: ["html", "htm"],
17772
- fetchStrategy: "fsRead",
17773
- settings: { toggles: [{
17774
- key: "htmlViewerNoSandbox",
17775
- title: () => t("settingsHtmlSandboxTitle"),
17776
- desc: () => t("settingsHtmlSandboxDesc")
17777
- }, {
17778
- key: "htmlViewerDefaultUnsafe",
17779
- title: () => t("settingsHtmlDefaultUnsafeTitle"),
17780
- desc: () => t("settingsHtmlDefaultUnsafeDesc")
17781
- }] },
17782
- component: (props) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(LazyTextEditor, { ...props })
17783
- },
17784
- {
17785
- id: "code",
17786
- title: () => t("viewerCode"),
17787
- icon: (size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCodeOutline16, { size }),
17788
- exts: [],
17789
- priority: -100,
17790
- fetchStrategy: "fsRead",
17791
- component: (props) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(LazyTextEditor, { ...props })
17792
- },
17793
- {
17794
- id: "binary-download",
17795
- title: () => t("viewerBinary"),
17796
- icon: (size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconDownloadOutline16, { size }),
17797
- exts: [
17798
- "doc",
17799
- "xls",
17800
- "ppt"
17801
- ],
17802
- priority: -50,
17803
- fetchStrategy: "binary-download",
17804
- detect: (_path, head) => head.includes(0),
17805
- component: ({ scope, path }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BinaryDownload, {
17806
- scope,
17807
- path
17808
- })
17809
- }
17810
- ];
17811
- }
17812
- //#endregion
17813
17201
  //#region src/client/builtins/index.ts
17814
17202
  /**
17815
- * Register all built-in tabs and viewers with the service. Returns a
17816
- * disposer that unregisters everything (cordis auto-invokes it on fiber
17817
- * disposal). The `ctx` is threaded into tab descriptors that need it
17818
- * (EditorHost reads `ctx.betterSidebar` for file-viewer matching).
17203
+ * Register all built-in tabs with the service. Returns a disposer that
17204
+ * unregisters everything (cordis auto-invokes it on fiber disposal).
17819
17205
  */
17820
17206
  function registerBuiltins(ctx, service, options = {}) {
17821
17207
  const disposers = [];
17822
17208
  for (const tab of builtinTabs(ctx, options)) disposers.push(service.registerTab(tab));
17823
- for (const viewer of builtinViewers()) disposers.push(service.registerFileViewer(viewer));
17824
17209
  return () => {
17825
17210
  for (const d of disposers) try {
17826
17211
  d();
@@ -20343,12 +19728,12 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
20343
19728
  //#endregion
20344
19729
  //#region src/client/plugins-shared.ts
20345
19730
  /**
20346
- * Shared vocabulary of the recommended plugin catalogs: the entry shape and
20347
- * the GitHub topic URL. The two catalogs live in sibling modules —
20348
- * `plugins-tabs.ts` (tab registrations) and `plugins-viewers.ts` (file
20349
- * previewer registrations) and are shown in the two "add plugin" modals
20350
- * (Side card settings → the dashed cards at the end of the 侧边栏内容 /
20351
- * 文件预览 grids).
19731
+ * Shared vocabulary of the recommended plugin catalog: the entry shape and
19732
+ * the GitHub topic URL. The catalog lives in the sibling module
19733
+ * `plugins-tabs.ts` (tab registrations) and is shown in the "add plugin"
19734
+ * modal (Side card settings the dashed card at the end of the 侧边栏内容
19735
+ * grid). (v1.0.4: the file-previewer catalog was retired with the
19736
+ * file-viewer registry.)
20352
19737
  */
20353
19738
  /** The GitHub topic page listing every repo tagged `dsh-coding-sidebar`. */
20354
19739
  const PLUGIN_TOPIC_URL = "https://github.com/topics/dsh-coding-sidebar";
@@ -20431,40 +19816,16 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
20431
19816
  }
20432
19817
  ];
20433
19818
  //#endregion
20434
- //#region src/client/plugins-viewers.ts
20435
- /**
20436
- * The built-in catalog of FILE-PREVIEWER plugins (file-type previewers),
20437
- * shown in the "add preview plugin" modal (Side card settings → 文件预览
20438
- * grid → the dashed card). Adding an entry: append one object here (unique
20439
- * `id` = npm package name, `url` = GitHub repo, `description` =
20440
- * i18n-friendly, `install` = the full shell command pre-filled into the
20441
- * install terminal — it starts with `cd ~/.dsh` so the install runs with
20442
- * the DSH home as the working directory). Data integrity is guarded by
20443
- * `tests/plugin-list.spec.ts`.
20444
- */
20445
- /** File-previewer plugins (alphabetical order). */
20446
- const builtinViewerPlugins = [{
20447
- id: "@huanlin/dsh-plugin-better-sidebar-plugin-office",
20448
- name: "Office 预览插件",
20449
- url: "https://github.com/HuanLinOTO/dsh-plugin-better-sidebar-plugin-office",
20450
- description: () => t("pluginOfficeDesc"),
20451
- install: "cd ~/.dsh && dsh plugin --profile web add @huanlin/dsh-plugin-better-sidebar-plugin-office"
20452
- }, {
20453
- id: "dsh-video-preview",
20454
- name: "视频预览插件",
20455
- url: "https://github.com/zemul/dsh-video-preview",
20456
- description: () => t("pluginVideoPreviewDesc"),
20457
- install: "cd ~/.dsh && dsh plugin --profile web add dsh-video-preview"
20458
- }];
20459
- //#endregion
20460
19819
  //#region src/client/add-plugin-modal.tsx
20461
19820
  /**
20462
- * The "add plugin" modals (Side card settings → the dashed cards at the
20463
- * end of the 侧边栏内容 / 文件预览 grids): declare that the sidebar's
20464
- * extension points tab pages and file previewers — are open to plugins
20465
- * (registered through `ctx.betterSidebar`), point at the GitHub topic page
20466
- * for discovery, and show the repo's recommended plugin catalog of the
20467
- * matching kind (name / url / description / install script).
19821
+ * The "add plugin" modal (Side card settings → the dashed card at the end
19822
+ * of the 侧边栏内容 grid): declares that the sidebar's tab extension point
19823
+ * is open to plugins (registered through `ctx.betterSidebar`), points at
19824
+ * the GitHub topic page for discovery, and shows the repo's recommended
19825
+ * plugin catalog (name / url / description / install script).
19826
+ *
19827
+ * (v1.0.4: the file-viewer extension point was retired with the file-viewer
19828
+ * registry — this modal now catalogs tab plugins only.)
20468
19829
  *
20469
19830
  * Per entry there are two actions:
20470
19831
  * - 「跳转」opens the plugin's repo in a REAL new browser tab (window.open
@@ -20479,20 +19840,15 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
20479
19840
  * Modal must never be renderToString'd (same rule as the settingsFor popup
20480
19841
  * in SideCardSection); the modal itself mounts only while open.
20481
19842
  */
20482
- /** The catalog of one kind (kept in two repo files: plugins-tabs.ts /
20483
- * plugins-viewers.ts). */
20484
- function catalogOf(kind) {
20485
- return kind === "tab" ? builtinTabPlugins : builtinViewerPlugins;
20486
- }
20487
19843
  /** How long the "已复制" feedback stays on the copy button. */
20488
19844
  const COPIED_FEEDBACK_MS = 1500;
20489
19845
  /** The modal body: the GitHub topic button + the recommended plugin list
20490
19846
  * with per-entry jump/copy buttons (extracted for direct testing). */
20491
19847
  function PluginListBody(props) {
20492
- const { service, kind } = props;
19848
+ const { service } = props;
20493
19849
  const [copiedId, setCopiedId] = (0, react.useState)(null);
20494
19850
  const [query, setQuery] = (0, react.useState)("");
20495
- const catalog = catalogOf(kind);
19851
+ const catalog = builtinTabPlugins;
20496
19852
  const needle = query.trim().toLowerCase();
20497
19853
  const matches = (entry) => {
20498
19854
  if (needle === "") return true;
@@ -20619,12 +19975,12 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
20619
19975
  }
20620
19976
  /** The modal itself (mounted only while open — see the module comment). */
20621
19977
  function AddPluginModal(props) {
20622
- const { service, onClose, kind } = props;
19978
+ const { service, onClose } = props;
20623
19979
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
20624
19980
  open: true,
20625
19981
  onClose,
20626
- title: kind === "tab" ? t("addPluginsTabCard") : t("addPluginsViewerCard"),
20627
- description: kind === "tab" ? t("addPluginsTabDesc") : t("addPluginsViewerDesc"),
19982
+ title: t("addPluginsTabCard"),
19983
+ description: t("addPluginsTabDesc"),
20628
19984
  closeLabel: t("close"),
20629
19985
  className: SideCardSection_module_css_default.pluginModal,
20630
19986
  footer: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
@@ -20633,10 +19989,7 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
20633
19989
  onClick: onClose,
20634
19990
  children: t("settingsDone")
20635
19991
  }),
20636
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PluginListBody, {
20637
- service,
20638
- kind
20639
- })
19992
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PluginListBody, { service })
20640
19993
  });
20641
19994
  }
20642
19995
  //#endregion
@@ -20655,8 +20008,9 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
20655
20008
  * external plugins alike), laid out in a responsive grid that wraps
20656
20009
  * several cards per row — icon chip + title + type id, clicked to toggle
20657
20010
  * the switch persisted in `prefs.tabsEnabled[id]`.
20658
- * - 文件预览: one SMALL CARD per REGISTERED file viewer — icon chip + title
20659
- * + the extensions it covers, clicked to toggle `prefs.viewersEnabled[id]`.
20011
+ *
20012
+ * (v1.0.4: the 文件预览 viewer inventory was retired with the file-viewer
20013
+ * registry — file preview is the host's job now.)
20660
20014
  *
20661
20015
  * Every group lives in a container card (the DSH PluginCard recipe: l2
20662
20016
  * hairline, 16px radius, layer-3 fill) with a heading and an inventory count
@@ -20713,18 +20067,14 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
20713
20067
  const preset = getShellPreset(prefs.titleBarPresetId);
20714
20068
  return preset !== void 0 ? `preset:${preset.id}` : "auto";
20715
20069
  }
20716
- /** Viewer inventory order: priority desc (the catch-all `code` comes last). */
20717
- function viewerOrder(a, b) {
20718
- return (b.priority ?? 0) - (a.priority ?? 0);
20719
- }
20720
20070
  /** Whether a feature declares any secondary settings (gear button shows). */
20721
20071
  function hasSettings(feature) {
20722
20072
  const settings = feature.settings;
20723
20073
  return settings !== void 0 && ((settings.toggles?.length ?? 0) > 0 || (settings.pluginToggles?.length ?? 0) > 0 || settings.render !== void 0);
20724
20074
  }
20725
- /** A feature's display name (viewers fall back to their id). */
20075
+ /** A feature's display name. */
20726
20076
  function featureNameOf(feature) {
20727
- return textOf("title" in feature ? feature.title : void 0) || feature.id;
20077
+ return textOf(feature.title) || feature.id;
20728
20078
  }
20729
20079
  /**
20730
20080
  * Merge one plugin-owned setting into a pluginSettings map (pure, v0.12.0+).
@@ -21034,7 +20384,7 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
21034
20384
  });
21035
20385
  }
21036
20386
  /**
21037
- * The secondary settings popup body of one feature (tab or viewer):
20387
+ * The secondary settings popup body of one registered tab:
21038
20388
  * - the host-prefs `toggles` rows, then the plugin-owned `pluginToggles`
21039
20389
  * rows (their values live in `pluginSettings[feature.id]`, projected onto
21040
20390
  * the prefs face so the shared row renderer reads them);
@@ -21090,16 +20440,14 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
21090
20440
  const [settingsFor, setSettingsFor] = (0, react.useState)(null);
21091
20441
  const [stripSettingsOpen, setStripSettingsOpen] = (0, react.useState)(false);
21092
20442
  const detectedEnv = (0, react.useMemo)(() => parseDesktopEnv(), []);
21093
- const [addPluginsOpen, setAddPluginsOpen] = (0, react.useState)(null);
20443
+ const [addPluginsOpen, setAddPluginsOpen] = (0, react.useState)(false);
21094
20444
  const optimisticRef = (0, react.useRef)(prefs);
21095
20445
  (0, react.useEffect)(() => {
21096
20446
  optimisticRef.current = prefs;
21097
20447
  }, [prefs]);
21098
20448
  const [tabs, setTabs] = (0, react.useState)(() => [...service.getTabs()].sort(tabOrder));
21099
- const [viewers, setViewers] = (0, react.useState)(() => [...service.getFileViewers()].sort(viewerOrder));
21100
20449
  (0, react.useEffect)(() => service.subscribe(() => {
21101
20450
  setTabs([...service.getTabs()].sort(tabOrder));
21102
- setViewers([...service.getFileViewers()].sort(viewerOrder));
21103
20451
  }), [service]);
21104
20452
  const revisionRef = (0, react.useRef)(void 0);
21105
20453
  const dirtyRef = (0, react.useRef)(false);
@@ -21168,13 +20516,6 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
21168
20516
  [id]: next
21169
20517
  } });
21170
20518
  };
21171
- /** Flip one per-viewer enable switch (merge into the viewersEnabled map). */
21172
- const onToggleViewer = (id, next) => {
21173
- applyPref({ viewersEnabled: {
21174
- ...optimisticRef.current.viewersEnabled,
21175
- [id]: next
21176
- } });
21177
- };
21178
20519
  /** Flip one declaratively-declared toggle (a SidebarPrefs boolean field). */
21179
20520
  const onToggleSetting = (toggle, next) => {
21180
20521
  applyPref({ [toggle.key]: next });
@@ -21520,7 +20861,7 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
21520
20861
  type: "button",
21521
20862
  className: clsx(SideCardSection_module_css_default.card, SideCardSection_module_css_default.addCard),
21522
20863
  onClick: () => {
21523
- setAddPluginsOpen("tab");
20864
+ setAddPluginsOpen(true);
21524
20865
  },
21525
20866
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
21526
20867
  className: SideCardSection_module_css_default.cardTop,
@@ -21538,49 +20879,6 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
21538
20879
  })]
21539
20880
  })]
21540
20881
  }),
21541
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
21542
- className: SideCardSection_module_css_default.group,
21543
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
21544
- className: SideCardSection_module_css_default.groupHeading,
21545
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("settingsViewersTitle") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
21546
- className: SideCardSection_module_css_default.count,
21547
- children: viewers.length
21548
- })]
21549
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
21550
- className: SideCardSection_module_css_default.grid,
21551
- children: [viewers.map((viewer) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react.Fragment, { children: renderCard({
21552
- title: textOf(viewer.title) || viewer.id,
21553
- desc: viewer.exts.length === 0 ? t("settingsViewerCatchAll") : viewer.exts.join(" · "),
21554
- icon: iconOf(viewer.icon, 16),
21555
- enabled: prefs.viewersEnabled[viewer.id] !== false,
21556
- onToggle: (next) => {
21557
- onToggleViewer(viewer.id, next);
21558
- },
21559
- onOpenSettings: prefs.viewersEnabled[viewer.id] !== false && hasSettings(viewer) ? () => {
21560
- setSettingsFor(viewer);
21561
- } : void 0
21562
- }) }, viewer.id)), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
21563
- type: "button",
21564
- className: clsx(SideCardSection_module_css_default.card, SideCardSection_module_css_default.addCard),
21565
- onClick: () => {
21566
- setAddPluginsOpen("viewer");
21567
- },
21568
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
21569
- className: SideCardSection_module_css_default.cardTop,
21570
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
21571
- className: SideCardSection_module_css_default.cardIconChip,
21572
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutline16, { size: 16 })
21573
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
21574
- className: SideCardSection_module_css_default.cardTitle,
21575
- children: t("addPluginsViewerCard")
21576
- })]
21577
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
21578
- className: SideCardSection_module_css_default.cardDesc,
21579
- children: t("addPluginsViewerCardDesc")
21580
- })]
21581
- })]
21582
- })]
21583
- }),
21584
20882
  settingsFor !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
21585
20883
  open: true,
21586
20884
  onClose: () => {
@@ -21661,12 +20959,11 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
21661
20959
  }, prefs.customCss)]
21662
20960
  })
21663
20961
  }),
21664
- addPluginsOpen !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AddPluginModal, {
20962
+ addPluginsOpen && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AddPluginModal, {
21665
20963
  service,
21666
20964
  onClose: () => {
21667
- setAddPluginsOpen(null);
21668
- },
21669
- kind: addPluginsOpen
20965
+ setAddPluginsOpen(false);
20966
+ }
21670
20967
  }),
21671
20968
  error !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
21672
20969
  className: SideCardSection_module_css_default.error,
@@ -21780,6 +21077,7 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
21780
21077
  const sidebarStore = createSidebarStore();
21781
21078
  const service = createBetterSidebarService(sidebarStore);
21782
21079
  ctx.provide("betterSidebar", service);
21080
+ ctx.effect(() => installNativeSidebarAvoidance(sidebarStore), "dsh-coding-sidebar: native-sidebar avoidance");
21783
21081
  const fallbackTitle = t("terminal");
21784
21082
  let terminalTitle = fallbackTitle;
21785
21083
  api.shellGet().then(({ name }) => {
@@ -21789,7 +21087,7 @@ Mode: this is a continuable side conversation. Your answers stay in this side th
21789
21087
  const tabs = allLeaves(snapshot.state.splits).flatMap((leaf) => leaf.tabs);
21790
21088
  for (const tab of tabs) if (tab.type === "terminal" && !isAgentTabId(tab.id) && tab.title === fallbackTitle) service.updateTab(tab.id, { title: name });
21791
21089
  }).catch(() => {});
21792
- ctx.effect(() => registerBuiltins(ctx, service, { terminalTitle: () => terminalTitle }), "dsh-coding-sidebar: register built-in tabs and viewers");
21090
+ ctx.effect(() => registerBuiltins(ctx, service, { terminalTitle: () => terminalTitle }), "dsh-coding-sidebar: register built-in tabs");
21793
21091
  const fail = (phase, error) => {
21794
21092
  console.error(`[dsh-coding-sidebar] ${phase} error:`, error);
21795
21093
  try {