@chatcode/cco-better-sidebar 0.18.0-alpha.4 → 0.18.0-rc.2

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 (44) hide show
  1. package/README.md +3 -3
  2. package/README_EN.md +3 -3
  3. package/cordis.patch.yml +6 -5
  4. package/lib/client-editor.js +11140 -724
  5. package/lib/client-mermaid.js +10730 -317
  6. package/lib/client-registry.js +2258 -1652
  7. package/lib/client-terminal.js +257 -257
  8. package/lib/client.js +2254 -1648
  9. package/lib/index.js +61 -40
  10. package/lib/types/client/builtins/tabs.d.ts +9 -0
  11. package/lib/types/client/icons.d.ts +26 -8
  12. package/lib/types/client/service.d.ts +1 -1
  13. package/lib/types/config.d.ts +4 -3
  14. package/lib/types/context-types.d.ts +12 -14
  15. package/lib/types/prefs-shared.d.ts +1 -1
  16. package/lib/types/ui-tweaks/index.d.ts +2 -3
  17. package/package.json +1 -1
  18. package/src/client/BrowserView.tsx +1 -1
  19. package/src/client/DiffTab.tsx +1 -1
  20. package/src/client/EditorHost.tsx +1 -1
  21. package/src/client/FileTree.tsx +10 -5
  22. package/src/client/FreeWindow.tsx +2 -1
  23. package/src/client/GitView.tsx +7 -3
  24. package/src/client/SideCardSection.tsx +2 -8
  25. package/src/client/Sidebar.tsx +2 -2
  26. package/src/client/TabBar.tsx +2 -4
  27. package/src/client/TextEditor.tsx +2 -1
  28. package/src/client/TreePanel.tsx +1 -2
  29. package/src/client/UsageHeatmapSection.tsx +1 -1
  30. package/src/client/builtins/tabs.tsx +9 -2
  31. package/src/client/builtins/viewers.tsx +2 -1
  32. package/src/client/icons.tsx +57 -4
  33. package/src/client/intercept.tsx +1 -1
  34. package/src/client/md-toc.tsx +1 -1
  35. package/src/client/mermaid.tsx +2 -1
  36. package/src/client/open-with-settings.tsx +1 -1
  37. package/src/client/service.ts +1 -1
  38. package/src/client/ui-tweaks/branding.tsx +2 -2
  39. package/src/config.ts +22 -2
  40. package/src/context-types.ts +5 -15
  41. package/src/index.ts +22 -20
  42. package/src/prefs-shared.ts +1 -1
  43. package/src/ui-tweaks/config.ts +1 -1
  44. package/src/ui-tweaks/index.ts +7 -13
package/lib/client.js CHANGED
@@ -29,8 +29,8 @@ window.__ModuleLoader__.load({
29
29
  let react = require("react");
30
30
  react = __toESM(react, 1);
31
31
  let react_dom_client = require("react-dom/client");
32
- let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
33
32
  let react_jsx_runtime = require("react/jsx-runtime");
33
+ let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
34
34
  let react_dom = require("react-dom");
35
35
  /** The title-bar / shell compatibility schemes (see {@link SidebarPrefs.titleBarScheme}). */
36
36
  const TITLE_BAR_SCHEMES = [
@@ -1503,7 +1503,7 @@ window.__ModuleLoader__.load({
1503
1503
  * The plugin version this service instance reports. Keep in lockstep with
1504
1504
  * `package.json`'s version — `tests/service.spec.ts` asserts the pair.
1505
1505
  */
1506
- const SIDEBAR_SERVICE_VERSION = "0.18.0-alpha.0";
1506
+ const SIDEBAR_SERVICE_VERSION = "0.18.0-alpha.4";
1507
1507
  /**
1508
1508
  * Monotonic capability list consumers use to gate new API usage (features
1509
1509
  * are never removed). Each string names a v0.12.0+ capability:
@@ -10770,1528 +10770,906 @@ window.__ModuleLoader__.load({
10770
10770
  return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
10771
10771
  }
10772
10772
  //#endregion
10773
- //#region src/client/paths.ts
10774
- /**
10775
- * Path projection helpers shared by the explorer rows: a path relative to
10776
- * the session cwd (for the @-reference button and "copy relative path").
10777
- * The fs-tree joins with '/' even on Windows, so both separators normalize
10778
- * to '/' before comparison.
10779
- *
10780
- * This module is dependency-free (no node:path in the client bundle): the
10781
- * host is the authority for path semantics, so this mirror deliberately
10782
- * accepts a SUPERSET of absolute forms — anything a Windows host would emit
10783
- * (drive letters, UNC) plus POSIX roots. A form the host would reject
10784
- * (e.g. a backslash UNC path on a POSIX host) passes through here and then
10785
- * fails loudly in the host's requireAbsolute instead of being silently
10786
- * joined onto the cwd.
10787
- */
10788
- /**
10789
- * Mirror of the host's absolute-path notion (see fs-tree.requireAbsolute):
10790
- * POSIX roots, Windows drive letters, and Windows UNC network shares in
10791
- * both backslash (`\\server\share\...`) and forward-slash
10792
- * (`//server/share/...`) form. Deliberately a superset — see the module
10793
- * comment — so a produced UNC path is never joined onto the cwd.
10794
- */
10795
- function isAbsolutePath(path) {
10796
- return path.startsWith("/") || /^[A-Za-z]:[\\/]/.test(path) || /^[\\/]{2}[^\\/]/.test(path);
10773
+ //#region node_modules/.pnpm/react-icons@5.7.0_react@18.2.0/node_modules/react-icons/lib/iconContext.mjs
10774
+ var DefaultContext = {
10775
+ color: void 0,
10776
+ size: void 0,
10777
+ className: void 0,
10778
+ style: void 0,
10779
+ attr: void 0
10780
+ };
10781
+ var IconContext = react.default.createContext && /*#__PURE__*/ react.default.createContext(DefaultContext);
10782
+ //#endregion
10783
+ //#region node_modules/.pnpm/react-icons@5.7.0_react@18.2.0/node_modules/react-icons/lib/iconBase.mjs
10784
+ var _excluded = [
10785
+ "attr",
10786
+ "size",
10787
+ "title"
10788
+ ];
10789
+ function _objectWithoutProperties(e, t) {
10790
+ if (null == e) return {};
10791
+ var o, r, i = _objectWithoutPropertiesLoose(e, t);
10792
+ if (Object.getOwnPropertySymbols) {
10793
+ var n = Object.getOwnPropertySymbols(e);
10794
+ for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);
10795
+ }
10796
+ return i;
10797
10797
  }
10798
- /**
10799
- * The path relative to the session's working directory.
10800
- * @param cwd - the explorer root (absolute).
10801
- * @param path - an absolute entry path from the fs-tree.
10802
- * @returns the relative path with '/' separators ('.' for the cwd itself),
10803
- * or `path` unchanged when it lies outside the cwd.
10804
- *
10805
- * The prefix test is case-insensitive: Windows paths (and macOS's
10806
- * case-insensitive volumes) may arrive with different casing than the cwd
10807
- * row, and the containment decision must not depend on it. The returned
10808
- * relative text keeps the caller's own casing.
10809
- */
10810
- function relativeTo(cwd, path) {
10811
- const base = cwd.replace(/[\\/]+$/, "");
10812
- const norm = (value) => value.replace(/\\/g, "/");
10813
- const nBase = norm(base);
10814
- const nPath = norm(path);
10815
- if (nPath === nBase) return ".";
10816
- if (nPath.toLowerCase().startsWith(`${nBase.toLowerCase()}/`)) return nPath.slice(nBase.length + 1);
10817
- return path;
10798
+ function _objectWithoutPropertiesLoose(r, e) {
10799
+ if (null == r) return {};
10800
+ var t = {};
10801
+ for (var n in r) if ({}.hasOwnProperty.call(r, n)) {
10802
+ if (-1 !== e.indexOf(n)) continue;
10803
+ t[n] = r[n];
10804
+ }
10805
+ return t;
10818
10806
  }
10819
- /**
10820
- * Whether `target` lies under `base` (or equals it), tolerant of separator
10821
- * style and — on Windows-style drive paths — of letter case. A client-side
10822
- * mirror of the host's `isWithin` (fs-tree.ts) used to decide whether a
10823
- * git-derived path can be opened in the editor (a linked worktree outside
10824
- * the session workspace cannot: the host's workspace fence would reject it).
10825
- */
10826
- function isWithinWorkspace(base, target) {
10827
- const norm = (value) => value.replace(/[\\/]+/g, "/").replace(/\/$/, "");
10828
- const b = norm(base);
10829
- const t = norm(target);
10830
- const lb = b.toLowerCase();
10831
- const lt = t.toLowerCase();
10832
- return lt === lb || lt.startsWith(`${lb}/`);
10807
+ function _extends() {
10808
+ return _extends = Object.assign ? Object.assign.bind() : function(n) {
10809
+ for (var e = 1; e < arguments.length; e++) {
10810
+ var t = arguments[e];
10811
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
10812
+ }
10813
+ return n;
10814
+ }, _extends.apply(null, arguments);
10833
10815
  }
10834
- //#endregion
10835
- //#region src/client/produced-files.ts
10836
- /**
10837
- * Pure derivation of one turn's produced files from finalized conversation
10838
- * nodes — a structural replica of ui-deliverables' `producedForClosing`
10839
- * (the mutation tools' follow-along `locations`, by render intent: a diff
10840
- * card or a generic edit card; reads/deletes/failures produce nothing).
10841
- * Kept dependency-free so the takeover logic is unit-testable and the
10842
- * replica is easy to diff against upstream when it drifts.
10843
- */
10844
- /** Paths a tool-result view reports as produced, by render intent. */
10845
- function producedPaths(view) {
10846
- if (view === null || typeof view !== "object") return [];
10847
- const record = view;
10848
- if (!(record.card === "diff" || record.card === "generic" && record.kind === "edit")) return [];
10849
- if (!Array.isArray(record.locations)) return [];
10850
- const paths = [];
10851
- for (const location of record.locations) if (location !== null && typeof location === "object" && typeof location.path === "string") paths.push(location.path);
10852
- return paths;
10816
+ function ownKeys(e, r) {
10817
+ var t = Object.keys(e);
10818
+ if (Object.getOwnPropertySymbols) {
10819
+ var o = Object.getOwnPropertySymbols(e);
10820
+ r && (o = o.filter(function(r) {
10821
+ return Object.getOwnPropertyDescriptor(e, r).enumerable;
10822
+ })), t.push.apply(t, o);
10823
+ }
10824
+ return t;
10853
10825
  }
10854
- /**
10855
- * Files produced by the turn the assistant at `seq` closes. Accumulation
10856
- * resets on turn boundaries (a user message, or a node reporting a different
10857
- * turn number); paths keep first-seen order and appear once.
10858
- * @param nodes - snapshot nodes in surface order (structural, unknown-safe).
10859
- * @param seq - the closing assistant's seq (the render site's anchor).
10860
- * @returns produced paths; empty when the turn wrote nothing.
10861
- */
10862
- function producedForClosing(nodes, seq) {
10863
- let pending = [];
10864
- let seen = /* @__PURE__ */ new Set();
10865
- let turn;
10866
- for (const node of nodes) {
10867
- if (node === null || typeof node !== "object") continue;
10868
- const record = node;
10869
- if (record.kind === "tool-result") {
10870
- if (record.isError === true) continue;
10871
- for (const path of producedPaths(record.callView)) {
10872
- if (seen.has(path)) continue;
10873
- seen.add(path);
10874
- pending.push(path);
10875
- }
10876
- continue;
10877
- }
10878
- if (record.kind === "user") {
10879
- turn = void 0;
10880
- pending = [];
10881
- seen = /* @__PURE__ */ new Set();
10882
- } else if (typeof record.turn === "number") {
10883
- if (turn !== void 0 && record.turn !== turn) {
10884
- pending = [];
10885
- seen = /* @__PURE__ */ new Set();
10886
- }
10887
- turn = record.turn;
10888
- }
10889
- if (record.kind === "assistant" && record.seq === seq) return pending;
10826
+ function _objectSpread(e) {
10827
+ for (var r = 1; r < arguments.length; r++) {
10828
+ var t = null != arguments[r] ? arguments[r] : {};
10829
+ r % 2 ? ownKeys(Object(t), !0).forEach(function(r) {
10830
+ _defineProperty(e, r, t[r]);
10831
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r) {
10832
+ Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
10833
+ });
10890
10834
  }
10891
- return [];
10835
+ return e;
10892
10836
  }
10893
- /**
10894
- * Claim the turn-tail chain only when the closing turn produced files.
10895
- *
10896
- * The authoritative source is the engine Turn data — the same value
10897
- * ui-deliverables reads (`owner.turn.data.get('deliverables')`): a
10898
- * `{ produced: [{ seq, path }, ...] }` record accumulated per Turn. The
10899
- * node-based replica below stays as a fallback for compositions that do not
10900
- * publish it.
10901
- * @param owner - the turn-tail owner currency ({turn, seq, openFile}).
10902
- * @returns produced paths as the matched value, or null to decline.
10903
- */
10904
- function selectProducedFiles(owner) {
10905
- const record = owner;
10906
- if (record === null || typeof record !== "object") return null;
10907
- const seq = typeof record.seq === "number" ? record.seq : Number.POSITIVE_INFINITY;
10908
- const data = record.turn?.data?.get?.("deliverables");
10909
- if (data !== null && typeof data === "object" && Array.isArray(data.produced)) {
10910
- const paths = [];
10911
- const seen = /* @__PURE__ */ new Set();
10912
- for (const item of data.produced) {
10913
- if (item === null || typeof item !== "object") continue;
10914
- const produced = item;
10915
- if (typeof produced.path !== "string" || produced.path === "") continue;
10916
- if (typeof produced.seq === "number" && produced.seq > seq) continue;
10917
- if (seen.has(produced.path)) continue;
10918
- seen.add(produced.path);
10919
- paths.push(produced.path);
10920
- }
10921
- return paths.length === 0 ? null : paths;
10837
+ function _defineProperty(e, r, t) {
10838
+ return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
10839
+ value: t,
10840
+ enumerable: !0,
10841
+ configurable: !0,
10842
+ writable: !0
10843
+ }) : e[r] = t, e;
10844
+ }
10845
+ function _toPropertyKey(t) {
10846
+ var i = _toPrimitive(t, "string");
10847
+ return "symbol" == typeof i ? i : i + "";
10848
+ }
10849
+ function _toPrimitive(t, r) {
10850
+ if ("object" != typeof t || !t) return t;
10851
+ var e = t[Symbol.toPrimitive];
10852
+ if (void 0 !== e) {
10853
+ var i = e.call(t, r || "default");
10854
+ if ("object" != typeof i) return i;
10855
+ throw new TypeError("@@toPrimitive must return a primitive value.");
10922
10856
  }
10923
- if (!Array.isArray(record.nodes)) return null;
10924
- const paths = producedForClosing(record.nodes, seq);
10925
- return paths.length === 0 ? null : paths;
10857
+ return ("string" === r ? String : Number)(t);
10926
10858
  }
10927
- /**
10928
- * Resolve a (possibly relative) path against the session cwd for the sidebar.
10929
- * Absolute detection mirrors the host (see client/paths.isAbsolutePath):
10930
- * POSIX roots, drive letters and UNC shares must not be joined onto the cwd.
10931
- */
10932
- function resolveSidebarPath(cwd, path) {
10933
- if (isAbsolutePath(path)) return path;
10934
- const base = cwd ?? "";
10935
- if (base === "") return path;
10936
- const separator = base.includes("\\") ? "\\" : "/";
10937
- return `${base.replace(/[\\/]+$/, "")}${separator}${path}`;
10859
+ function Tree2Element(tree) {
10860
+ return tree && tree.map((node, i) => /*#__PURE__*/ react.default.createElement(node.tag, _objectSpread({ key: i }, node.attr), Tree2Element(node.child)));
10938
10861
  }
10939
- //#endregion
10940
- //#region src/client/openpath-intercept.ts
10941
- /**
10942
- * Whether a path is the "Show in folder" folder-reveal gesture. The stock
10943
- * ui-deliverables row passes `'.'` (the session workspace root, resolved by
10944
- * the chat view to `"<cwd>/."`); any path whose final segment is `.` is the
10945
- * same gesture. A directory has no editor content, so these opens must reach
10946
- * the explorer instead of an editor tab.
10947
- */
10948
- function isFolderRevealPath(path) {
10949
- if (path === "." || path === "./") return true;
10950
- const trimmed = path.replace(/[\\/]+$/, "");
10951
- return trimmed === "." || /[\\/]\.$/.test(trimmed);
10862
+ function GenIcon(data) {
10863
+ return (props) => /*#__PURE__*/ react.default.createElement(IconBase, _extends({ attr: _objectSpread({}, data.attr) }, props), Tree2Element(data.child));
10952
10864
  }
10953
- /**
10954
- * Wrap `workspaces.openPath`: intercepted calls open the file in the sidebar
10955
- * editor instead of the Host OS and resolve as success (the original's
10956
- * callers ignore the result); anything that declines falls through to the
10957
- * original method untouched. The one exception is the folder-reveal gesture,
10958
- * which is routed to {@link OpenPathInterceptDeps.revealInExplorer} instead.
10959
- * @param workspaces - the client workspaces service to wrap.
10960
- * @param deps - per-call takeover decisions.
10961
- * @returns the disposer restoring the original method (HMR-safe).
10962
- */
10963
- function wrapOpenPath(workspaces, deps) {
10964
- const original = workspaces.openPath;
10965
- workspaces.openPath = (path) => {
10966
- if (deps.takeoverEnabled()) {
10967
- const sessionId = deps.currentSessionId();
10968
- if (sessionId !== void 0) {
10969
- if (isFolderRevealPath(path)) deps.revealInExplorer(path, sessionId);
10970
- else deps.openInSidebar(path, sessionId);
10971
- return Promise.resolve();
10972
- }
10973
- }
10974
- return original.call(workspaces, path);
10975
- };
10976
- return () => {
10977
- workspaces.openPath = original;
10865
+ function IconBase(props) {
10866
+ var elem = (conf) => {
10867
+ var attr = props.attr, size = props.size, title = props.title, svgProps = _objectWithoutProperties(props, _excluded);
10868
+ var computedSize = size || conf.size || "1em";
10869
+ var className;
10870
+ if (conf.className) className = conf.className;
10871
+ if (props.className) className = (className ? className + " " : "") + props.className;
10872
+ return /*#__PURE__*/ react.default.createElement("svg", _extends({
10873
+ stroke: "currentColor",
10874
+ fill: "currentColor",
10875
+ strokeWidth: "0"
10876
+ }, conf.attr, attr, svgProps, {
10877
+ className,
10878
+ style: _objectSpread(_objectSpread({ color: props.color || conf.color }, conf.style), props.style),
10879
+ height: computedSize,
10880
+ width: computedSize,
10881
+ xmlns: "http://www.w3.org/2000/svg"
10882
+ }), title && /*#__PURE__*/ react.default.createElement("title", null, title), props.children);
10978
10883
  };
10884
+ return IconContext !== void 0 ? /*#__PURE__*/ react.default.createElement(IconContext.Consumer, null, (conf) => elem(conf)) : elem(DefaultContext);
10979
10885
  }
10980
10886
  //#endregion
10981
- //#region src/client/current-session.ts
10982
- /**
10983
- * Read the session selected by the host's scoped-session adapter.
10984
- *
10985
- * Newer hosts deliberately removed `sessions.list.current`: selection is UI
10986
- * scope state, not catalog state. The adapter is authoritative on both old
10987
- * and new hosts and tracks main-view retain/release transitions.
10988
- */
10989
- function currentSessionId(ctx) {
10990
- return ctx.uiSession.adapter.current.getSnapshot().key;
10887
+ //#region node_modules/.pnpm/react-icons@5.7.0_react@18.2.0/node_modules/react-icons/fi/index.mjs
10888
+ function FiX(props) {
10889
+ return GenIcon({
10890
+ "tag": "svg",
10891
+ "attr": {
10892
+ "viewBox": "0 0 24 24",
10893
+ "fill": "none",
10894
+ "stroke": "currentColor",
10895
+ "strokeWidth": "2",
10896
+ "strokeLinecap": "round",
10897
+ "strokeLinejoin": "round"
10898
+ },
10899
+ "child": [{
10900
+ "tag": "line",
10901
+ "attr": {
10902
+ "x1": "18",
10903
+ "y1": "6",
10904
+ "x2": "6",
10905
+ "y2": "18"
10906
+ },
10907
+ "child": []
10908
+ }, {
10909
+ "tag": "line",
10910
+ "attr": {
10911
+ "x1": "6",
10912
+ "y1": "6",
10913
+ "x2": "18",
10914
+ "y2": "18"
10915
+ },
10916
+ "child": []
10917
+ }]
10918
+ })(props);
10991
10919
  }
10992
- /** React subscription to the same authoritative current-session source. */
10993
- function useCurrentSessionId(ctx) {
10994
- const source = ctx.uiSession.adapter.current;
10995
- return (0, react.useSyncExternalStore)((0, react.useCallback)((listener) => source.subscribe(listener), [source]), (0, react.useCallback)(() => source.getSnapshot().key, [source]));
10920
+ function FiTrash2(props) {
10921
+ return GenIcon({
10922
+ "tag": "svg",
10923
+ "attr": {
10924
+ "viewBox": "0 0 24 24",
10925
+ "fill": "none",
10926
+ "stroke": "currentColor",
10927
+ "strokeWidth": "2",
10928
+ "strokeLinecap": "round",
10929
+ "strokeLinejoin": "round"
10930
+ },
10931
+ "child": [
10932
+ {
10933
+ "tag": "polyline",
10934
+ "attr": { "points": "3 6 5 6 21 6" },
10935
+ "child": []
10936
+ },
10937
+ {
10938
+ "tag": "path",
10939
+ "attr": { "d": "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" },
10940
+ "child": []
10941
+ },
10942
+ {
10943
+ "tag": "line",
10944
+ "attr": {
10945
+ "x1": "10",
10946
+ "y1": "11",
10947
+ "x2": "10",
10948
+ "y2": "17"
10949
+ },
10950
+ "child": []
10951
+ },
10952
+ {
10953
+ "tag": "line",
10954
+ "attr": {
10955
+ "x1": "14",
10956
+ "y1": "11",
10957
+ "x2": "14",
10958
+ "y2": "17"
10959
+ },
10960
+ "child": []
10961
+ }
10962
+ ]
10963
+ })(props);
10996
10964
  }
10997
- //#endregion
10998
- //#region \0dsh-css:/Users/shiguifeng/IdeaProjects/chonggou/DSH-better-sidebar/src/client/sidebar.module.css.mjs
10999
- const css$5 = ".FV0QMq_releaseNotesOverlay{z-index:120;pointer-events:auto;background:color-mix(in srgb, var(--dsw-alias-bg-base) 72%, transparent);place-items:center;padding:24px;display:grid;position:fixed;inset:0}.FV0QMq_releaseNotesDialog{width:min(720px,100%);max-height:min(760px,100vh - 48px);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);border-radius:12px;flex-direction:column;display:flex;overflow:hidden}.FV0QMq_releaseNotesHeader,.FV0QMq_releaseNotesFooter{align-items:center;padding:16px 20px;display:flex}.FV0QMq_releaseNotesHeader{border-bottom:1px solid var(--dsw-alias-border-l1);justify-content:space-between;gap:16px}.FV0QMq_releaseNotesHeader h2{font:var(--dsw-font-s-18);margin:0}.FV0QMq_releaseNotesContent{min-height:120px;font:var(--dsw-font-s-14);padding:20px;overflow:auto}.FV0QMq_releaseNotesFooter{border-top:1px solid var(--dsw-alias-border-l1);justify-content:flex-end}.FV0QMq_releaseNotesIconButton,.FV0QMq_releaseNotesButton{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);cursor:pointer}.FV0QMq_releaseNotesIconButton:hover,.FV0QMq_releaseNotesButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_releaseNotesIconButton{width:32px;height:32px;font:var(--dsw-font-s-18);border-radius:50%;padding:0}.FV0QMq_releaseNotesButton{min-width:84px;min-height:36px;font:var(--dsw-font-s-14);border-radius:8px;padding:6px 16px}.FV0QMq_updateList{flex-direction:column;gap:10px;margin:0;padding:0;list-style:none;display:flex}.FV0QMq_updateList li{font:var(--dsw-font-s-14);justify-content:space-between;align-items:center;gap:16px;display:flex}.FV0QMq_updateVersions{font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-secondary)}.FV0QMq_updateOk{color:var(--dsw-alias-state-success-primary)}.FV0QMq_updateError,.FV0QMq_updateErrorText{color:var(--dsw-alias-state-error-primary)}.FV0QMq_updateErrorText{white-space:pre-wrap;font:var(--dsw-font-s-14);margin:12px 0 0}.FV0QMq_updateCommand{background:var(--dsw-alias-bg-layer-3);font-family:var(--dsw-font-code,var(--ds-font-family-code,monospace));white-space:pre-wrap;word-break:break-all;user-select:all;border-radius:6px;margin:8px 0 0;padding:8px 10px;font-size:12px;overflow-x:auto}.FV0QMq_updateSettingsRow{justify-content:space-between;align-items:center;gap:16px;display:flex}.FV0QMq_updateSettingsText{flex-direction:column;gap:2px;min-width:0;display:flex}.FV0QMq_updateSettingsTitle{font:var(--dsw-font-s-14)}.FV0QMq_updateSettingsDesc{font:var(--dsw-font-s-13);color:var(--dsw-alias-label-secondary)}.FV0QMq_updateSettingsBlock{flex-direction:column;gap:12px;display:flex}.FV0QMq_updateBody{font:var(--dsw-font-s-14);margin:20px 0 0}.FV0QMq_updateFooter{justify-content:flex-end;gap:8px;margin-top:4px;display:flex}.FV0QMq_updateInline{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;padding:16px}[data-dsh-panel-host]{z-index:25;pointer-events:none;position:fixed;inset:0;overflow:clip}[data-dsh-panel-host][data-dsh-panel-host-degraded]{position:absolute;top:0;left:0}[data-dsh-pinned-sessions]{flex:none;min-width:0}.FV0QMq_pinnedSessions{border-bottom:1px solid var(--dsw-alias-border-l1);margin:0 0 6px;padding:4px 0 6px}.FV0QMq_pinnedSessionsHeading{height:36px;color:var(--dsw-alias-label-primary);font:var(--dsw-font-s-14);align-items:center;padding:0 4px;display:flex}.FV0QMq_pinnedSessionsList{gap:1px;display:grid}[data-slot=sidebar\\.workspaces] [class*=_sessionRow][data-dsh-session-pinned]{display:none}.FV0QMq_pinnedSessionRow{border-radius:8px;align-items:center;min-width:0;height:32px;display:flex;position:relative}.FV0QMq_pinnedSessionRow:hover,.FV0QMq_pinnedSessionRow:focus-within{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_pinnedSessionOpen,.FV0QMq_pinnedSessionMore,.FV0QMq_pinnedSessionMenu button{font:inherit;cursor:pointer;border:0}.FV0QMq_pinnedSessionOpen{min-width:0;height:100%;color:var(--dsw-alias-label-primary);text-align:left;font:var(--dsw-font-s-14);background:0 0;flex:1;align-items:center;gap:8px;padding:0 6px 0 8px;display:flex}.FV0QMq_pinnedSessionOpen[aria-current=page]{color:var(--dsw-alias-brand-primary)}.FV0QMq_pinnedSessionDot{background:var(--dsw-alias-label-tertiary);border-radius:50%;flex:none;width:6px;height:6px}.FV0QMq_pinnedSessionDot[data-running]{background:var(--dsw-alias-state-success-primary)}.FV0QMq_pinnedSessionTitle{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.FV0QMq_pinnedSessionMore{width:28px;height:28px;color:var(--dsw-alias-label-secondary);letter-spacing:1px;background:0 0;border-radius:50%;justify-content:center;align-items:center;margin-right:2px;padding:0;display:inline-flex}.FV0QMq_pinnedSessionMore:hover,.FV0QMq_pinnedSessionMore[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_pinnedSessionMenu{z-index:1101;box-sizing:border-box;border:1px solid var(--dsw-alias-border-inverted);background:var(--dsw-alias-bg-layer-2);border-radius:10px;min-width:150px;padding:4px;position:absolute;top:calc(100% + 2px);right:0}.FV0QMq_pinnedSessionMenu button{width:100%;min-height:32px;color:var(--dsw-alias-label-primary);text-align:left;font:var(--dsw-font-xxs-12);background:0 0;border-radius:7px;align-items:center;gap:8px;padding:5px 8px;display:flex}.FV0QMq_pinnedSessionMenu button:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_pinnedSessionMenuDivider{background:var(--dsw-alias-border-l1);height:1px;margin:4px}.FV0QMq_accountMenu{z-index:3;box-sizing:border-box;width:var(--dsh-account-menu-width,280px);border-top:1px solid var(--dsw-alias-border-l2);border-right:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);pointer-events:auto;position:absolute;bottom:0;left:0}.FV0QMq_accountTrigger,.FV0QMq_accountItem{color:var(--dsw-alias-fg-base);font:inherit;cursor:pointer;border:0}.FV0QMq_accountTrigger{box-sizing:border-box;width:100%;min-height:52px;padding:10px 14px max(10px, env(safe-area-inset-bottom));background:var(--dsw-alias-bg-layer-1);font-family:var(--dsw-font-family-body);font-size:var(--dsw-font-size-body-sm);line-height:var(--dsw-font-line-height-body-sm);transition:background var(--ds-transition-duration-slow) var(--ds-ease-in-out);border-radius:0;align-items:center;gap:8px;display:flex}.FV0QMq_accountTrigger:hover,.FV0QMq_accountTrigger[aria-expanded=true]{background:var(--dsw-alias-bg-hover)}.FV0QMq_accountTrigger:focus-visible,.FV0QMq_accountItem:focus-visible{outline:2px solid var(--dsw-alias-border-accent);outline-offset:2px}.FV0QMq_accountAvatar{background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);width:28px;height:28px;color:var(--dsw-alias-fg-accent);border-radius:50%;flex:none;place-items:center;font-weight:600;display:grid;position:relative}.FV0QMq_accountName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.FV0QMq_accountDropdown{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);z-index:1;border-radius:12px;width:min(252px,100% - 16px);padding:10px 8px 8px;display:grid;position:absolute;bottom:calc(100% + 8px);left:8px}.FV0QMq_accountDropdownHeader{min-height:36px;font-family:var(--dsw-font-family-body);font-size:var(--dsw-font-size-body-sm);line-height:var(--dsw-font-line-height-body-sm);align-items:center;gap:8px;padding:0 8px 8px;display:flex}.FV0QMq_accountMenuDivider{background:var(--dsw-alias-border-l2);height:1px;margin:0 4px 6px}.FV0QMq_accountItem{text-align:left;min-height:32px;font:var(--dsw-font-s-14);background:0 0;border-radius:7px;align-items:center;gap:8px;padding:0 10px;display:flex}.FV0QMq_accountItem:hover{background:var(--dsw-alias-bg-hover)}.FV0QMq_accountPresence{box-sizing:content-box;border:2px solid var(--dsw-alias-bg-layer-2);background:var(--dsw-alias-fg-accent);border-radius:50%;flex:none;width:6px;height:6px;margin-left:auto}.FV0QMq_accountTrigger .FV0QMq_accountPresence{border-color:var(--dsw-alias-bg-layer-1)}.FV0QMq_toggleCluster{top:var(--dsh-native-sidebar-toggle-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}.FV0QMq_toggleClusterNative{z-index:auto;flex:none;align-items:center;position:static;inset:auto}button[data-dsh-better-sidebar-toggle]{display:none}body:not([data-dsh-native-sidebar-toggle]) .FV0QMq_panel:not(.FV0QMq_panelHidden) .FV0QMq_tabBar{padding-right:var(--dsh-sidebar-toggle-reserve,188px)}.FV0QMq_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}.FV0QMq_manualButton{min-width:94px;height:28px;color:var(--dsw-alias-label-secondary);font:var(--dsw-font-xxs-12);white-space:nowrap;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:6px;flex:none;justify-content:center;align-items:center;gap:6px;margin-right:4px;padding:0 10px;display:inline-flex}.FV0QMq_manualButton:hover,.FV0QMq_toggleButton:hover:not(:disabled):not([aria-disabled=true]){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_toggleButton:disabled,.FV0QMq_toggleButton[aria-disabled=true]{opacity:.4;cursor:default}.FV0QMq_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}.FV0QMq_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%)}.FV0QMq_panel[data-dragging]{transition:none}.FV0QMq_panelResize{cursor:col-resize;z-index:2;touch-action:none;width:8px;position:absolute;top:0;bottom:0;left:-4px}.FV0QMq_panelResizeActive{background:var(--dsw-alias-interactive-bg-hover-accent)}.FV0QMq_panelBody{flex:1;min-width:0;min-height:0;display:flex}.FV0QMq_bottomPanel{z-index:40;background:var(--dsw-alias-bg-layer-1);border-top:1px solid var(--dsw-alias-border-l2);pointer-events:auto;padding-bottom:env(safe-area-inset-bottom);transition:transform var(--ds-transition-duration-slow) var(--ds-ease-in-out), height var(--ds-transition-duration-slow) var(--ds-ease-in-out);flex-direction:column;display:flex;position:absolute;bottom:0}.FV0QMq_bottomPanelHidden{pointer-events:none;visibility:hidden;transition:transform var(--ds-transition-duration-slow) var(--ds-ease-in-out), height var(--ds-transition-duration-slow) var(--ds-ease-in-out), visibility 0s linear var(--ds-transition-duration-slow);transform:translateY(102%)}.FV0QMq_bottomPanel[data-dragging]{transition:none}.FV0QMq_panel,.FV0QMq_bottomPanel{contain:layout style}body[data-dsh-sidebar-dragging] .FV0QMq_panel,body[data-dsh-sidebar-dragging] .FV0QMq_bottomPanel{will-change:transform}.FV0QMq_bottomResize{cursor:row-resize;z-index:2;touch-action:none;height:8px;position:absolute;top:-4px;left:0;right:0}.FV0QMq_bottomResizeActive{background:var(--dsw-alias-interactive-bg-hover-accent)}.FV0QMq_bottomClose{z-index:4;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;position:absolute;top:3px;right:6px}.FV0QMq_bottomClose:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_bottomPanel .FV0QMq_tabBar{padding-right:40px}.FV0QMq_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}.FV0QMq_floatWindowDragging{will-change:left, top, width, height}.FV0QMq_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}.FV0QMq_floatWindowDragging .FV0QMq_floatHeader{cursor:grabbing}.FV0QMq_floatTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.FV0QMq_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}.FV0QMq_floatClose:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_floatContent{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;overflow:hidden}.FV0QMq_floatResize{z-index:2;cursor:nwse-resize;touch-action:none;width:14px;height:14px;position:absolute;bottom:0;right:0}.FV0QMq_floatResize:hover{background:var(--dsw-alias-interactive-bg-hover-accent)}.FV0QMq_pane[data-dsh-float-dock-over]{outline:2px dashed var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-2px}.FV0QMq_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}.FV0QMq_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}.FV0QMq_toggleCluster,.FV0QMq_toggleButton,.FV0QMq_manualButton,.FV0QMq_tabBar,.FV0QMq_floatHeader{-webkit-app-region:no-drag}body[data-dsh-title-bar-compat] .FV0QMq_toggleCluster{top:var(--dsh-native-sidebar-toggle-top,calc(var(--dsh-title-bar-strip,40px) + 3px))}body[data-dsh-title-bar-compat] .FV0QMq_panel{padding-top:var(--dsh-title-bar-strip,40px)}.FV0QMq_cornerHandle{left:-6px;bottom:calc(var(--dsh-sidebar-height,0px) + 6px);z-index:2;cursor:nwse-resize;touch-action:none;width:12px;height:12px;position:absolute}.FV0QMq_cornerHandle:hover,.FV0QMq_cornerHandle[data-dragging]{background:var(--dsw-alias-interactive-bg-hover-accent)}.FV0QMq_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}.FV0QMq_iconButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_iconButton:disabled{opacity:.4;cursor:default}.FV0QMq_workbench,.FV0QMq_split{flex:1;min-width:0;min-height:0;display:flex}.FV0QMq_splitRow{flex-direction:row}.FV0QMq_splitCol{flex-direction:column}.FV0QMq_splitChild{display:flex;position:relative;overflow:hidden}.FV0QMq_divider{z-index:3;touch-action:none;flex:none;position:relative}.FV0QMq_dividerRow:after,.FV0QMq_dividerCol:after{content:\"\";background:var(--dsw-alias-border-l2);transition:background var(--ds-transition-duration-slow) var(--ds-ease-in-out);position:absolute}.FV0QMq_dividerRow{cursor:col-resize;width:7px;margin:0 -2px}.FV0QMq_dividerRow:after{width:1px;top:0;bottom:0;left:50%;transform:translate(-50%)}.FV0QMq_dividerCol{cursor:row-resize;height:7px;margin:-2px 0}.FV0QMq_dividerCol:after{height:1px;top:50%;left:0;right:0;transform:translateY(-50%)}.FV0QMq_divider:hover:after,.FV0QMq_dividerActive:after{background:var(--dsw-alias-interactive-bg-hover-accent)}.FV0QMq_pane{background:var(--dsw-alias-bg-base);flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;position:relative}.FV0QMq_paneDrop{outline:1px solid var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-1px}.FV0QMq_dropOverlay{z-index:6;pointer-events:none;background:var(--dsw-alias-interactive-bg-hover-accent);opacity:.5;position:absolute}.FV0QMq_dropLeft{width:25%;top:0;bottom:0;left:0}.FV0QMq_dropRight{width:25%;top:0;bottom:0;right:0}.FV0QMq_dropUp{height:25%;top:0;left:0;right:0}.FV0QMq_dropDown{height:25%;bottom:0;left:0;right:0}.FV0QMq_dropCenter{outline:2px dashed var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-2px;background:0 0;inset:25%}.FV0QMq_paneContent{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.FV0QMq_paneTab{flex-direction:column;flex:1;min-height:0;display:flex}.FV0QMq_paneTabHidden{display:none}.FV0QMq_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}.FV0QMq_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}.FV0QMq_paneCard:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l2)}.FV0QMq_paneCard:disabled{opacity:.45;cursor:default}.FV0QMq_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}.FV0QMq_tabBarDrop{outline:1px dashed var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-1px}.FV0QMq_tabList{scrollbar-width:none;flex:1;min-width:0;display:flex;overflow-x:auto}.FV0QMq_tabList::-webkit-scrollbar{display:none}.FV0QMq_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}.FV0QMq_tab:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_tabActive{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-active)}.FV0QMq_tabTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.FV0QMq_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}.FV0QMq_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}.FV0QMq_tabClose:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_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}.FV0QMq_tabBarPlus:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_pinnedTab{color:var(--dsw-alias-label-tertiary);font-style:italic}.FV0QMq_pinnedTab:hover{color:var(--dsw-alias-label-secondary)}.FV0QMq_explorer{flex-direction:column;flex:1;min-height:0;display:flex}.FV0QMq_explorerHeader{flex:none;justify-content:space-between;align-items:center;gap:8px;height:36px;padding:0 8px 0 12px;display:flex}.FV0QMq_explorerRoot{font:var(--dsw-font-s-14);color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.FV0QMq_explorerBody{flex:1;min-height:0;padding:4px 8px 8px;overflow:hidden auto}.FV0QMq_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:FV0QMq_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}.FV0QMq_explorerRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_explorerRowRevealed{background:var(--dsw-alias-state-business-tertiary)}.FV0QMq_explorerRowRevealed+.FV0QMq_explorerRowRevealed{border-top-left-radius:0;border-top-right-radius:0}.FV0QMq_explorerRowRevealed:has(+.FV0QMq_explorerRowRevealed){border-bottom-right-radius:0;border-bottom-left-radius:0}.FV0QMq_explorerDir{font:var(--dsw-font-s-strong-14)}.FV0QMq_explorerHidden{opacity:.45}.FV0QMq_explorerSymlink{color:var(--dsw-alias-label-tertiary);flex:none}.FV0QMq_explorerBroken .FV0QMq_explorerName{color:var(--dsw-alias-state-error-primary)}.FV0QMq_explorerName{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.FV0QMq_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}.FV0QMq_explorerRef:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_explorerRow:hover .FV0QMq_explorerRef,.FV0QMq_explorerRow:focus-within .FV0QMq_explorerRef{display:inline-flex}.FV0QMq_explorerCopied{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary);flex:none}.FV0QMq_explorerError{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-error-primary);cursor:default}@keyframes FV0QMq_dsh-row-in{0%{opacity:0}}.FV0QMq_explorerEmpty{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);text-align:center;padding:16px}.FV0QMq_explorerRowDropTarget{background:var(--dsw-alias-interactive-bg-hover);outline:1px dashed var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-1px}.FV0QMq_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:FV0QMq_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}.FV0QMq_uploadDropHero{flex-direction:column;align-items:center;gap:10px;max-width:100%;padding-top:8px;display:flex}.FV0QMq_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}.FV0QMq_uploadDropZoneText{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.FV0QMq_uploadDropChatHint{z-index:1002;pointer-events:none;animation:FV0QMq_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}.FV0QMq_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}.FV0QMq_uploadOverlay{z-index:30;background:var(--dsw-alias-bg-mask-1);backdrop-filter:var(--dsw-mask-blur);animation:FV0QMq_dsh-row-in .15s var(--ds-ease-in-out);justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.FV0QMq_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}.FV0QMq_uploadOverlayTitle{font:var(--dsw-font-s-strong-14);color:var(--dsw-alias-label-primary);align-items:center;gap:8px;display:flex}.FV0QMq_uploadOverlayTitle>svg{flex:none}.FV0QMq_uploadOverlayTitle>span{white-space:nowrap;text-overflow:ellipsis;min-width:0;overflow:hidden}.FV0QMq_uploadOverlayProgress{background:var(--dsw-alias-border-l2);border-radius:3px;height:6px;overflow:hidden}.FV0QMq_uploadOverlayProgressFill{background:var(--dsw-alias-interactive-bg-hover-accent);height:100%;transition:width .15s var(--ds-ease-in-out);border-radius:3px}.FV0QMq_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}.FV0QMq_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}.FV0QMq_uploadOverlayCancel:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l2)}.FV0QMq_uploadOverlayCancel:disabled{opacity:.4;cursor:default}.FV0QMq_editor{flex-direction:column;flex:1;min-height:0;display:flex}.FV0QMq_editorHeader{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:6px;padding:6px 8px;display:flex}.FV0QMq_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}.FV0QMq_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}.FV0QMq_editorPathInput:focus{border-color:var(--dsw-alias-border-l2);outline:none}.FV0QMq_editorTreeToggleActive{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-active)}.FV0QMq_editorBody{flex:1;min-height:0;display:flex}.FV0QMq_editorMain{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.FV0QMq_editorTreeDock{border-left:1px solid var(--dsw-alias-border-l1);flex:none;min-height:0;display:flex;position:relative}.FV0QMq_editorTreeResize{cursor:col-resize;touch-action:none;z-index:3;width:6px;position:absolute;top:0;bottom:0;left:0}.FV0QMq_editorTreeResize:hover{background:var(--dsw-alias-border-l2)}.FV0QMq_editorTreePanel{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;position:relative}.FV0QMq_editorTreePanelFull{flex:1}.FV0QMq_editorTreeSearch{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:6px;padding:6px 8px;display:flex}.FV0QMq_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}.FV0QMq_editorSearchInput:focus{border-color:var(--dsw-alias-border-l2);outline:none}.FV0QMq_editorSearchHint{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);padding:8px 12px}.FV0QMq_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}.FV0QMq_editorSearchResult:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_editorStatus{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary)}.FV0QMq_editorStatusError{color:var(--dsw-alias-state-error-primary)}.FV0QMq_dirtyDot{background:var(--dsw-alias-state-warn-primary);border-radius:50%;flex:none;width:7px;height:7px}.FV0QMq_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}.FV0QMq_orphanedType{opacity:.7;overflow-wrap:anywhere;margin-top:8px;font-size:12px;display:block}.FV0QMq_editorBinary{text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;padding:24px 16px;display:flex}.FV0QMq_editorBinaryNotice{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary)}.FV0QMq_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}.FV0QMq_editorDownloadLink:hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l2)}.FV0QMq_editorError{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-error-primary);padding:12px 16px}.FV0QMq_fenceError{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-error-primary);flex-wrap:wrap;align-items:center;gap:8px;padding:8px 16px;display:flex}.FV0QMq_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}.FV0QMq_sandboxStatus{font:var(--dsw-font-xxxs-11);flex:none;align-items:center;gap:8px;padding:4px 10px;display:flex}.FV0QMq_sandboxStatusOn{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);border-bottom:1px solid var(--dsw-alias-border-l1)}.FV0QMq_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)}.FV0QMq_sandboxDot{background:var(--dsw-alias-state-success-primary);border-radius:50%;flex:none;width:6px;height:6px}.FV0QMq_sandboxStatusOff .FV0QMq_sandboxDot{background:var(--dsw-alias-state-error-primary)}.FV0QMq_sandboxStatusText{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.FV0QMq_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}.FV0QMq_sandboxAction:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_editorHtml{background:var(--dsw-alias-bg-base);border:none;flex:1;width:100%;min-height:0}.FV0QMq_browser{flex-direction:column;flex:1;min-height:0;display:flex}.FV0QMq_browserBar{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:4px;padding:6px 8px;display:flex}.FV0QMq_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}.FV0QMq_browserInput:focus{border-color:var(--dsw-alias-border-l2);outline:none}.FV0QMq_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}.FV0QMq_browserFrame{background:var(--dsw-alias-bg-base);border:none;flex:1;width:100%;min-height:0}.FV0QMq_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}.FV0QMq_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}.FV0QMq_browserBlockedTitle{font:var(--dsw-font-xxs-strong-12);color:var(--dsw-alias-label-primary)}.FV0QMq_browserBlockedDesc{max-width:280px;font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-secondary)}.FV0QMq_browserBlockedActions{gap:8px;margin-top:6px;display:flex}.FV0QMq_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}.FV0QMq_browserBlockedButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_editorCm{background:0 0;flex:1;min-height:0;overflow:hidden}.FV0QMq_editorCmHidden{display:none}.FV0QMq_editorCm .cm-editor{height:100%}.FV0QMq_editorCm .cm-scroller{padding:12px 16px}.FV0QMq_editorCm .cm-editor.cm-focused{outline:none}.FV0QMq_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}.FV0QMq_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}.FV0QMq_editorModeButton:hover{color:var(--dsw-alias-label-primary)}.FV0QMq_editorModeActive{background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary)}.FV0QMq_editorImageWrap{flex:1;justify-content:center;align-items:center;min-height:0;padding:12px;display:flex;overflow:auto}.FV0QMq_editorImage{object-fit:contain;max-width:100%;max-height:100%}.FV0QMq_editorMd{min-height:0;font:var(--dsw-font-xs-13);flex:1;padding:12px 16px;overflow-y:auto}.FV0QMq_mermaidWrap{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:6px;margin:6px 0;overflow:hidden}.FV0QMq_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}.FV0QMq_mermaidInfo{font:var(--dsw-font-xxxs-strong-11);color:var(--dsw-alias-label-tertiary)}.FV0QMq_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}.FV0QMq_mermaidCopy:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_mermaidBody{cursor:zoom-in;justify-content:center;padding:10px;display:flex;overflow:auto}.FV0QMq_mermaidBody svg{max-width:100%;height:auto}.FV0QMq_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}.FV0QMq_mermaidCode{font:var(--dsw-font-xxxs-11);margin:0;padding:8px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;overflow:auto}.FV0QMq_mermaidMarkdown .md-code-block[data-mermaid-processed]{display:contents}.FV0QMq_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}.FV0QMq_mermaidModalToolbar{z-index:10;gap:8px;display:flex;position:absolute;top:16px;right:16px}.FV0QMq_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}.FV0QMq_mermaidModalButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_mermaidModalStage{justify-content:center;align-items:center;width:90vw;height:80vh;display:flex;position:relative;overflow:hidden}.FV0QMq_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}.FV0QMq_mermaidModalStage svg:active{cursor:grabbing}.FV0QMq_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%)}.FV0QMq_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))}.FV0QMq_selectionPopup:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_editorPdf{background:var(--dsw-alias-bg-base);flex-direction:column;flex:1;min-height:0;display:flex}.FV0QMq_editorPdfToolbar{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;justify-content:flex-end;padding:6px 8px;display:flex}.FV0QMq_editorPdfStage{flex:1;min-height:0;display:flex;position:relative}.FV0QMq_editorPdfFrame{background:var(--dsw-alias-bg-base);border:none;flex:1;width:100%;min-height:0}.FV0QMq_editorPdfFrameBlocked{pointer-events:none}.FV0QMq_editorPdfDragShield{z-index:4;pointer-events:none;background:0 0;position:absolute;inset:0}.FV0QMq_editorPdfDragShieldActive{pointer-events:auto}body[data-dsh-tab-dragging] .FV0QMq_editorPdfFrame{pointer-events:none!important}body[data-dsh-tab-dragging] .FV0QMq_editorPdfDragShield{pointer-events:auto!important}.FV0QMq_terminalWrap{background:var(--dsw-alias-bg-base);flex-direction:column;flex:1;min-height:0;display:flex;position:relative}.FV0QMq_terminal{flex:1;min-height:0;padding:6px 4px 6px 8px}.FV0QMq_terminal .xterm{height:100%}.FV0QMq_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}.FV0QMq_terminalBannerUrl{word-break:break-all;opacity:.85;flex-basis:100%;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.FV0QMq_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}.FV0QMq_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}.FV0QMq_terminalRetry:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_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}.FV0QMq_terminalDepsTitle{font:var(--dsw-font-xxs-strong-12);color:var(--dsw-alias-state-warn-primary)}.FV0QMq_terminalDepsHint{opacity:.9}.FV0QMq_terminalDepsCommandRow{align-items:flex-start;gap:8px;display:flex}.FV0QMq_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}.FV0QMq_terminalDepsNote{opacity:.85}.FV0QMq_terminalDepsActions{align-items:center;gap:8px;display:flex}.FV0QMq_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}.FV0QMq_git{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;overflow:hidden auto}.FV0QMq_gitHeader{flex:none;align-items:center;gap:8px;height:36px;padding:0 8px 0 12px;display:flex}.FV0QMq_gitWorktreeRow{flex:none;align-items:center;gap:8px;padding:6px 8px 0 12px;display:flex}.FV0QMq_gitWorktreeLabel{color:var(--dsw-alias-label-tertiary);font:var(--dsw-font-xxxs-11);flex:none}.FV0QMq_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}.FV0QMq_gitSection{border-top:1px solid var(--dsw-alias-border-l1)}.FV0QMq_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}.FV0QMq_gitLink{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-brand-primary);cursor:pointer;background:0 0;border:none;padding:0}.FV0QMq_gitLink:hover:not(:disabled){text-decoration:underline}.FV0QMq_gitLink:disabled{opacity:.4;cursor:default}.FV0QMq_gitRow{min-height:34px;animation:FV0QMq_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}.FV0QMq_gitRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_gitRowSelected{background:var(--dsw-alias-interactive-bg-active)}.FV0QMq_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}.FV0QMq_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}.FV0QMq_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}.FV0QMq_gitEmpty{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);padding:4px 12px 8px}.FV0QMq_gitPlaceholder{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);text-align:center;padding:16px}.FV0QMq_gitError{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-error-primary);white-space:pre-wrap;padding:8px 12px}.FV0QMq_gitDiff{border-top:1px solid var(--dsw-alias-border-l1);padding:8px}.FV0QMq_gitDiffTab{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;overflow:hidden auto}.FV0QMq_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}.FV0QMq_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}.FV0QMq_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}.FV0QMq_gitDiffFile:disabled{cursor:default}.FV0QMq_gitDiffFile:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_gitDiffFileChevron{color:var(--dsw-alias-label-tertiary);flex:none;transform:rotate(0)}.FV0QMq_gitDiffFileChevronExpanded{transform:rotate(90deg)}.FV0QMq_gitDiffFilePath{font:var(--dsw-font-xxs-strong-12);color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.FV0QMq_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}.FV0QMq_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}.FV0QMq_gitDiffHunk{font:var(--dsw-font-markdown-code-block-small);color:var(--dsw-alias-label-tertiary);gap:8px;padding:3px 2px;display:flex}.FV0QMq_gitDiffHunkHeader{color:var(--dsw-alias-label-secondary);flex:none}.FV0QMq_gitDiffHunkSection{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.FV0QMq_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}.FV0QMq_gitDiffNum{text-align:right;width:36px;color:var(--dsw-alias-label-tertiary);user-select:none;flex:none;padding-right:8px}.FV0QMq_gitDiffCode{flex:1;min-width:0;overflow:visible}.FV0QMq_gitDiffCtx{color:var(--dsw-alias-label-primary)}.FV0QMq_gitDiffDel{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent)}.FV0QMq_gitDiffAdd{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent)}.FV0QMq_gitDiffMeta{padding-left:2px}.FV0QMq_gitDiffMetaText{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary);font-style:italic}.FV0QMq_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}.FV0QMq_gitDiffExpand:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_gitConfirmDesc{font:var(--dsw-font-s-14);color:var(--dsw-alias-label-primary);white-space:pre-wrap;margin:0}.FV0QMq_gitCommit{border-top:1px solid var(--dsw-alias-border-l1);align-items:center;gap:6px;padding:8px 12px;display:flex}.FV0QMq_gitCommitInput{flex:1;min-width:0}.FV0QMq_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}.FV0QMq_gitCommitButton:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)}.FV0QMq_gitCommitButton:disabled{opacity:.45;cursor:default}.FV0QMq_gitLogRow{cursor:pointer;border-radius:8px;flex-direction:column;gap:2px;padding:5px 12px;display:flex}.FV0QMq_gitLogRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_gitLogLine1{align-items:baseline;gap:8px;min-width:0;display:flex}.FV0QMq_gitLogHash{font:var(--dsw-font-markdown-code-block-small);color:var(--dsw-alias-label-tertiary);flex:none}.FV0QMq_gitLogLine2{flex-wrap:wrap;align-items:center;gap:6px;min-width:0;display:flex}.FV0QMq_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}.FV0QMq_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}.FV0QMq_gitLogMeta{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary)}.FV0QMq_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}.FV0QMq_gitLogMore:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_gitLogMore:disabled{opacity:.5;cursor:default}.FV0QMq_producedRow{flex-wrap:wrap;align-items:center;gap:8px;padding:4px 0;display:flex}.FV0QMq_producedLabel{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary)}.FV0QMq_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}.FV0QMq_producedChip:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_producedChip span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.FV0QMq_producedMore{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary)}.FV0QMq_toggleButton:focus-visible,.FV0QMq_manualButton:focus-visible,.FV0QMq_bottomClose:focus-visible,.FV0QMq_iconButton:focus-visible,.FV0QMq_tab:focus-visible,.FV0QMq_tabClose:focus-visible,.FV0QMq_tabBarPlus:focus-visible,.FV0QMq_paneCard:focus-visible,.FV0QMq_explorerRow:focus-visible,.FV0QMq_explorerRef:focus-visible,.FV0QMq_gitRowMain:focus-visible,.FV0QMq_gitLink:focus-visible,.FV0QMq_gitCommitButton:focus-visible,.FV0QMq_gitLogRow:focus-visible,.FV0QMq_gitLogMore:focus-visible,.FV0QMq_gitDiffFile:focus-visible,.FV0QMq_gitDiffExpand:focus-visible,.FV0QMq_terminalRetry:focus-visible,.FV0QMq_editorModeButton:focus-visible,.FV0QMq_editorDownloadLink:focus-visible,.FV0QMq_editorPptxButton:focus-visible,.FV0QMq_editorDocxZoomRange:focus-visible{outline:2px solid var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-1px}@media (prefers-reduced-motion:reduce){.FV0QMq_panel,.FV0QMq_panelHidden,.FV0QMq_bottomPanel,.FV0QMq_bottomPanelHidden,.FV0QMq_toggleCluster,.FV0QMq_toggleButton,.FV0QMq_tab,.FV0QMq_tabBarPlus,.FV0QMq_paneCard,.FV0QMq_explorerRow,.FV0QMq_gitRow,.FV0QMq_divider,.FV0QMq_dividerRow:after,.FV0QMq_dividerCol:after{transition:none;animation:none}}@media (width<=767px){.FV0QMq_panel:not(.FV0QMq_panelHidden) .FV0QMq_tabBar{padding-right:148px}.FV0QMq_tab{min-width:48px;max-width:128px}}.FV0QMq_openWithLabel{align-items:center;gap:8px;width:100%;min-width:0;display:flex}.FV0QMq_openWithName{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}.FV0QMq_openWithChevron{color:var(--dsw-alias-label-tertiary);flex:none}.FV0QMq_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}.FV0QMq_openWithPin:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_openWithPinActive{color:var(--dsw-alias-state-business-primary)}.FV0QMq_editorHtmlBlock{margin:8px 0}.FV0QMq_editorHtmlBlock img,.FV0QMq_editorHtmlBlock video{max-width:100%}.FV0QMq_editorHtmlBlock details{margin:4px 0;padding:4px 0}.FV0QMq_editorHtmlBlock summary{cursor:pointer}.FV0QMq_tocBar{z-index:3;pointer-events:none;justify-content:flex-end;height:0;display:flex;position:sticky;top:0}.FV0QMq_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}.FV0QMq_tocButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_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}.FV0QMq_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}.FV0QMq_tocItem:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_tocItem[data-level=\"2\"]{padding-left:18px}.FV0QMq_tocItem[data-level=\"3\"]{padding-left:28px}.FV0QMq_tocItem[data-level=\"4\"]{padding-left:38px}.FV0QMq_tocItem[data-level=\"5\"]{padding-left:48px}.FV0QMq_tocItem[data-level=\"6\"]{padding-left:58px}.FV0QMq_tocItemLevel{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary);flex:none}.FV0QMq_tocItemText{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}@keyframes FV0QMq_dsh-toc-flash{0%,60%{background:var(--dsw-alias-interactive-bg-hover)}to{background:0 0}}.FV0QMq_tocFlash{border-radius:4px;animation:1.2s ease-out FV0QMq_dsh-toc-flash}.FV0QMq_chatcodeGate{z-index:2147483000;isolation:isolate;background-color:var(--dsw-alias-tooltip-bg);background-image:linear-gradient(135deg, var(--dsw-alias-tooltip-bg) 0%, var(--dsw-alias-brand-primary) 48%, var(--dsw-alias-tooltip-bg) 100%);color:var(--dsw-alias-fg-base);pointer-events:auto;place-items:center;padding:24px;display:grid;position:fixed;inset:0;overflow:hidden}.FV0QMq_chatcodeGateCard{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:linear-gradient(145deg, var(--dsw-alias-bg-layer-2), var(--dsw-alias-bg-layer-1));width:min(460px,100%);box-shadow:var(--dsw-shadow-lv3);text-align:center;border-radius:20px;padding:40px 36px;position:relative}.FV0QMq_chatcodeGateContent{position:relative}.FV0QMq_chatcodeGateCard h1{font:var(--dsw-font-heading-lg);letter-spacing:-.02em;margin:0 0 12px;font-size:clamp(32px,5vw,46px);line-height:1.1}.FV0QMq_chatcodeGateCard p{max-width:29em;color:var(--dsw-alias-label-secondary);font:var(--dsw-font-s-14);margin:0 auto;line-height:1.7}.FV0QMq_chatcodeGateError{border:1px solid color-mix(in srgb, var(--dsw-alias-fg-error) 36%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-fg-error) 8%, transparent);border-radius:10px;padding:9px 11px;position:relative;color:var(--dsw-alias-fg-error)!important;font:var(--dsw-font-xxs-12)!important;margin-top:16px!important;line-height:1.5!important}.FV0QMq_chatcodeGateActions{justify-content:center;gap:10px;margin:28px 0 14px;display:flex;position:relative}.FV0QMq_chatcodeGateActions button,.FV0QMq_chatcodeGateCard a{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);min-height:42px;color:var(--dsw-alias-fg-base);font:var(--dsw-font-xxs-strong-12);cursor:pointer;transition:transform var(--ds-transition-duration-slow) var(--ds-ease-in-out), 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:10px;padding:9px 17px}.FV0QMq_chatcodeGateActions button:first-child{border-color:var(--dsw-alias-state-error-primary);background:var(--dsw-alias-state-error-primary);min-width:152px;min-height:46px;color:var(--dsw-alias-label-primary-inverted)}.FV0QMq_chatcodeGateActions button:first-child:hover:not(:disabled){box-shadow:var(--dsw-shadow-lv2);transform:translateY(-2px);border-color:var(--dsw-alias-state-error-primary)!important;background:var(--dsw-alias-state-error-primary)!important;color:var(--dsw-alias-label-primary-inverted)!important}.FV0QMq_chatcodeGateActions button:not(:first-child):hover:not(:disabled),.FV0QMq_chatcodeGateCard a:hover{border-color:var(--dsw-alias-button-primary-hover);background:var(--dsw-alias-button-primary-hover);color:var(--dsw-alias-label-primary-inverted);transform:translateY(-1px)}.FV0QMq_chatcodeGateActions button:disabled{cursor:default;opacity:.55}.FV0QMq_chatcodeGateCard a{align-items:center;text-decoration:none;display:inline-flex;position:relative}.FV0QMq_chatcodeGateActions button:focus-visible,.FV0QMq_chatcodeGateCard a:focus-visible{outline:2px solid var(--dsw-alias-border-accent);outline-offset:3px}@media (width<=480px){.FV0QMq_chatcodeGate{padding:16px}.FV0QMq_chatcodeGateCard{padding:32px 24px}.FV0QMq_chatcodeGateActions{flex-direction:column;align-items:stretch}.FV0QMq_chatcodeGateActions button,.FV0QMq_chatcodeGateCard a{justify-content:center}}";
11000
- const tagId$5 = "@chatcode/cco-better-sidebar/sidebar.module.css";
11001
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$5) + "]") === null) {
11002
- const tag = document.createElement("style");
11003
- tag.dataset.plugin = "@chatcode/cco-better-sidebar";
11004
- tag.dataset.pluginCss = tagId$5;
11005
- tag.textContent = css$5;
11006
- document.head.appendChild(tag);
10965
+ function FiSidebar(props) {
10966
+ return GenIcon({
10967
+ "tag": "svg",
10968
+ "attr": {
10969
+ "viewBox": "0 0 24 24",
10970
+ "fill": "none",
10971
+ "stroke": "currentColor",
10972
+ "strokeWidth": "2",
10973
+ "strokeLinecap": "round",
10974
+ "strokeLinejoin": "round"
10975
+ },
10976
+ "child": [{
10977
+ "tag": "rect",
10978
+ "attr": {
10979
+ "x": "3",
10980
+ "y": "3",
10981
+ "width": "18",
10982
+ "height": "18",
10983
+ "rx": "2",
10984
+ "ry": "2"
10985
+ },
10986
+ "child": []
10987
+ }, {
10988
+ "tag": "line",
10989
+ "attr": {
10990
+ "x1": "9",
10991
+ "y1": "3",
10992
+ "x2": "9",
10993
+ "y2": "21"
10994
+ },
10995
+ "child": []
10996
+ }]
10997
+ })(props);
11007
10998
  }
11008
- var sidebar_module_css_default = {
11009
- "browserStart": "FV0QMq_browserStart",
11010
- "paneDrop": "FV0QMq_paneDrop",
11011
- "gitWorktreeLabel": "FV0QMq_gitWorktreeLabel",
11012
- "openWithChevron": "FV0QMq_openWithChevron",
11013
- "updateBody": "FV0QMq_updateBody",
11014
- "browser": "FV0QMq_browser",
11015
- "floatDropHint": "FV0QMq_floatDropHint",
11016
- "editorDocxZoomRange": "FV0QMq_editorDocxZoomRange",
11017
- "gitRowSelected": "FV0QMq_gitRowSelected",
11018
- "tabTitle": "FV0QMq_tabTitle",
11019
- "gitDiffHunkSection": "FV0QMq_gitDiffHunkSection",
11020
- "sandboxDot": "FV0QMq_sandboxDot",
11021
- "producedMore": "FV0QMq_producedMore",
11022
- "splitChild": "FV0QMq_splitChild",
11023
- "editorTreeDock": "FV0QMq_editorTreeDock",
11024
- "browserBlockedActions": "FV0QMq_browserBlockedActions",
11025
- "paneTab": "FV0QMq_paneTab",
11026
- "explorerRowDropTarget": "FV0QMq_explorerRowDropTarget",
11027
- "editor": "FV0QMq_editor",
11028
- "dropLeft": "FV0QMq_dropLeft",
11029
- "uploadOverlayProgress": "FV0QMq_uploadOverlayProgress",
11030
- "editorPdfStage": "FV0QMq_editorPdfStage",
11031
- "panelResize": "FV0QMq_panelResize",
11032
- "gitLogMeta": "FV0QMq_gitLogMeta",
11033
- "pinnedSessionMenu": "FV0QMq_pinnedSessionMenu",
11034
- "orphanedType": "FV0QMq_orphanedType",
11035
- "tabBar": "FV0QMq_tabBar",
11036
- "panelResizeActive": "FV0QMq_panelResizeActive",
11037
- "sandboxStatusOff": "FV0QMq_sandboxStatusOff",
11038
- "tabBarDrop": "FV0QMq_tabBarDrop",
11039
- "accountName": "FV0QMq_accountName",
11040
- "accountDropdown": "FV0QMq_accountDropdown",
11041
- "splitCol": "FV0QMq_splitCol",
11042
- "gitLogRef": "FV0QMq_gitLogRef",
11043
- "terminalBannerUrl": "FV0QMq_terminalBannerUrl",
11044
- "pinnedSessions": "FV0QMq_pinnedSessions",
11045
- "dirtyDot": "FV0QMq_dirtyDot",
11046
- "pinnedSessionMore": "FV0QMq_pinnedSessionMore",
11047
- "updateSettingsBlock": "FV0QMq_updateSettingsBlock",
11048
- "browserBlockedDesc": "FV0QMq_browserBlockedDesc",
11049
- "mermaidBody": "FV0QMq_mermaidBody",
11050
- "panelHidden": "FV0QMq_panelHidden",
11051
- "dropRight": "FV0QMq_dropRight",
11052
- "editorSearchInput": "FV0QMq_editorSearchInput",
11053
- "gitBadge": "FV0QMq_gitBadge",
11054
- "uploadOverlayCard": "FV0QMq_uploadOverlayCard",
11055
- "terminalRetry": "FV0QMq_terminalRetry",
11056
- "gitError": "FV0QMq_gitError",
11057
- "pinnedSessionsList": "FV0QMq_pinnedSessionsList",
11058
- "divider": "FV0QMq_divider",
11059
- "tabBadge": "FV0QMq_tabBadge",
11060
- "editorHtml": "FV0QMq_editorHtml",
11061
- "git": "FV0QMq_git",
11062
- "gitDiffTab": "FV0QMq_gitDiffTab",
11063
- "gitDiffFileTag": "FV0QMq_gitDiffFileTag",
11064
- "gitDiffLine": "FV0QMq_gitDiffLine",
11065
- "mermaidModal": "FV0QMq_mermaidModal",
11066
- "editorBanner": "FV0QMq_editorBanner",
11067
- "editorPdfDragShieldActive": "FV0QMq_editorPdfDragShieldActive",
11068
- "gitDiffFile": "FV0QMq_gitDiffFile",
11069
- "gitRow": "FV0QMq_gitRow",
11070
- "paneEmptyCards": "FV0QMq_paneEmptyCards",
11071
- "editorPlaceholder": "FV0QMq_editorPlaceholder",
11072
- "explorerRef": "FV0QMq_explorerRef",
11073
- "updateList": "FV0QMq_updateList",
11074
- "bottomResize": "FV0QMq_bottomResize",
11075
- "dsh-row-in": "FV0QMq_dsh-row-in",
11076
- "gitDiffHunkHeader": "FV0QMq_gitDiffHunkHeader",
11077
- "producedRow": "FV0QMq_producedRow",
11078
- "gitLogMore": "FV0QMq_gitLogMore",
11079
- "toggleButton": "FV0QMq_toggleButton",
11080
- "boundaryError": "FV0QMq_boundaryError",
11081
- "dropUp": "FV0QMq_dropUp",
11082
- "chatcodeGateContent": "FV0QMq_chatcodeGateContent",
11083
- "terminalDepsNote": "FV0QMq_terminalDepsNote",
11084
- "editorTreeToggleActive": "FV0QMq_editorTreeToggleActive",
11085
- "gitDiffMeta": "FV0QMq_gitDiffMeta",
11086
- "dividerCol": "FV0QMq_dividerCol",
11087
- "bottomResizeActive": "FV0QMq_bottomResizeActive",
11088
- "dropCenter": "FV0QMq_dropCenter",
11089
- "editorError": "FV0QMq_editorError",
11090
- "workbench": "FV0QMq_workbench",
11091
- "gitLogHash": "FV0QMq_gitLogHash",
11092
- "editorModeButton": "FV0QMq_editorModeButton",
11093
- "gitDiffMetaText": "FV0QMq_gitDiffMetaText",
11094
- "gitDiffFileOld": "FV0QMq_gitDiffFileOld",
11095
- "mermaidHeader": "FV0QMq_mermaidHeader",
11096
- "gitLogLine2": "FV0QMq_gitLogLine2",
11097
- "explorer": "FV0QMq_explorer",
11098
- "editorStatusError": "FV0QMq_editorStatusError",
11099
- "editorPdfDragShield": "FV0QMq_editorPdfDragShield",
11100
- "sandboxAction": "FV0QMq_sandboxAction",
11101
- "pinnedSessionTitle": "FV0QMq_pinnedSessionTitle",
11102
- "mermaidCopy": "FV0QMq_mermaidCopy",
11103
- "terminal": "FV0QMq_terminal",
11104
- "editorPdfToolbar": "FV0QMq_editorPdfToolbar",
11105
- "explorerDir": "FV0QMq_explorerDir",
11106
- "pinnedSessionOpen": "FV0QMq_pinnedSessionOpen",
11107
- "releaseNotesContent": "FV0QMq_releaseNotesContent",
11108
- "explorerRoot": "FV0QMq_explorerRoot",
11109
- "mermaidMarkdown": "FV0QMq_mermaidMarkdown",
11110
- "editorSearchResult": "FV0QMq_editorSearchResult",
11111
- "gitHeader": "FV0QMq_gitHeader",
11112
- "split": "FV0QMq_split",
11113
- "gitDiffTabTitle": "FV0QMq_gitDiffTabTitle",
11114
- "tocBar": "FV0QMq_tocBar",
11115
- "explorerBroken": "FV0QMq_explorerBroken",
11116
- "editorStatus": "FV0QMq_editorStatus",
11117
- "gitDiffFileChevronExpanded": "FV0QMq_gitDiffFileChevronExpanded",
11118
- "editorModeActive": "FV0QMq_editorModeActive",
11119
- "gitDiffCode": "FV0QMq_gitDiffCode",
11120
- "browserBar": "FV0QMq_browserBar",
11121
- "gitDiff": "FV0QMq_gitDiff",
11122
- "tocButton": "FV0QMq_tocButton",
11123
- "uploadOverlayStatus": "FV0QMq_uploadOverlayStatus",
11124
- "gitDiffFileChevron": "FV0QMq_gitDiffFileChevron",
11125
- "editorTreePanel": "FV0QMq_editorTreePanel",
11126
- "tabList": "FV0QMq_tabList",
11127
- "gitDiffDel": "FV0QMq_gitDiffDel",
11128
- "gitLogRow": "FV0QMq_gitLogRow",
11129
- "paneCard": "FV0QMq_paneCard",
11130
- "dividerActive": "FV0QMq_dividerActive",
11131
- "chatcodeGate": "FV0QMq_chatcodeGate",
11132
- "terminalWrap": "FV0QMq_terminalWrap",
11133
- "terminalRepairCommand": "FV0QMq_terminalRepairCommand",
11134
- "floatClose": "FV0QMq_floatClose",
11135
- "panel": "FV0QMq_panel",
11136
- "gitPlaceholder": "FV0QMq_gitPlaceholder",
11137
- "dsh-toc-flash": "FV0QMq_dsh-toc-flash",
11138
- "cornerHandle": "FV0QMq_cornerHandle",
11139
- "producedChip": "FV0QMq_producedChip",
11140
- "toggleClusterNative": "FV0QMq_toggleClusterNative",
11141
- "terminalDepsHint": "FV0QMq_terminalDepsHint",
11142
- "producedLabel": "FV0QMq_producedLabel",
11143
- "mermaidInfo": "FV0QMq_mermaidInfo",
11144
- "accountMenu": "FV0QMq_accountMenu",
11145
- "panelBody": "FV0QMq_panelBody",
11146
- "floatContent": "FV0QMq_floatContent",
11147
- "updateInline": "FV0QMq_updateInline",
11148
- "pane": "FV0QMq_pane",
11149
- "uploadDropZone": "FV0QMq_uploadDropZone",
11150
- "tocItem": "FV0QMq_tocItem",
11151
- "browserBlockedTitle": "FV0QMq_browserBlockedTitle",
11152
- "pinnedTab": "FV0QMq_pinnedTab",
11153
- "accountMenuDivider": "FV0QMq_accountMenuDivider",
11154
- "terminalBanner": "FV0QMq_terminalBanner",
11155
- "mermaidModalToolbar": "FV0QMq_mermaidModalToolbar",
11156
- "releaseNotesFooter": "FV0QMq_releaseNotesFooter",
11157
- "pinnedSessionDot": "FV0QMq_pinnedSessionDot",
11158
- "bottomClose": "FV0QMq_bottomClose",
11159
- "uploadOverlay": "FV0QMq_uploadOverlay",
11160
- "updateSettingsDesc": "FV0QMq_updateSettingsDesc",
11161
- "pinnedSessionRow": "FV0QMq_pinnedSessionRow",
11162
- "openWithPin": "FV0QMq_openWithPin",
11163
- "editorBody": "FV0QMq_editorBody",
11164
- "browserMessage": "FV0QMq_browserMessage",
11165
- "bottomPanelHidden": "FV0QMq_bottomPanelHidden",
11166
- "tabBarPlus": "FV0QMq_tabBarPlus",
11167
- "explorerRow": "FV0QMq_explorerRow",
11168
- "gitDiffTabHeader": "FV0QMq_gitDiffTabHeader",
11169
- "dropOverlay": "FV0QMq_dropOverlay",
11170
- "gitBranchSelect": "FV0QMq_gitBranchSelect",
11171
- "editorDownloadLink": "FV0QMq_editorDownloadLink",
11172
- "tabActive": "FV0QMq_tabActive",
11173
- "tabBoundaryError": "FV0QMq_tabBoundaryError",
11174
- "chatcodeGateActions": "FV0QMq_chatcodeGateActions",
11175
- "gitSection": "FV0QMq_gitSection",
11176
- "mermaidCode": "FV0QMq_mermaidCode",
11177
- "gitEmpty": "FV0QMq_gitEmpty",
11178
- "explorerHeader": "FV0QMq_explorerHeader",
11179
- "selectionPopup": "FV0QMq_selectionPopup",
11180
- "gitDiffExpand": "FV0QMq_gitDiffExpand",
11181
- "uploadDropChatCard": "FV0QMq_uploadDropChatCard",
11182
- "openWithPinActive": "FV0QMq_openWithPinActive",
11183
- "explorerCopied": "FV0QMq_explorerCopied",
11184
- "gitConfirmDesc": "FV0QMq_gitConfirmDesc",
11185
- "editorModeToggle": "FV0QMq_editorModeToggle",
11186
- "releaseNotesHeader": "FV0QMq_releaseNotesHeader",
11187
- "mermaidModalButton": "FV0QMq_mermaidModalButton",
11188
- "gitDiffHunk": "FV0QMq_gitDiffHunk",
11189
- "editorHtmlBlock": "FV0QMq_editorHtmlBlock",
11190
- "floatDropHintLabel": "FV0QMq_floatDropHintLabel",
11191
- "gitRowMain": "FV0QMq_gitRowMain",
11192
- "updateVersions": "FV0QMq_updateVersions",
11193
- "explorerHidden": "FV0QMq_explorerHidden",
11194
- "editorTreeSearch": "FV0QMq_editorTreeSearch",
11195
- "terminalDepsCommandRow": "FV0QMq_terminalDepsCommandRow",
11196
- "manualButton": "FV0QMq_manualButton",
11197
- "tabClose": "FV0QMq_tabClose",
11198
- "explorerBody": "FV0QMq_explorerBody",
11199
- "editorBinaryNotice": "FV0QMq_editorBinaryNotice",
11200
- "pinnedSessionMenuDivider": "FV0QMq_pinnedSessionMenuDivider",
11201
- "releaseNotesIconButton": "FV0QMq_releaseNotesIconButton",
11202
- "gitName": "FV0QMq_gitName",
11203
- "gitLink": "FV0QMq_gitLink",
11204
- "editorImageWrap": "FV0QMq_editorImageWrap",
11205
- "sandboxStatusOn": "FV0QMq_sandboxStatusOn",
11206
- "editorImage": "FV0QMq_editorImage",
11207
- "gitSectionHeader": "FV0QMq_gitSectionHeader",
11208
- "browserBlockedButton": "FV0QMq_browserBlockedButton",
11209
- "accountDropdownHeader": "FV0QMq_accountDropdownHeader",
11210
- "editorCmHidden": "FV0QMq_editorCmHidden",
11211
- "terminalDepsActions": "FV0QMq_terminalDepsActions",
11212
- "updateErrorText": "FV0QMq_updateErrorText",
11213
- "explorerRowRevealed": "FV0QMq_explorerRowRevealed",
11214
- "editorMain": "FV0QMq_editorMain",
11215
- "floatResize": "FV0QMq_floatResize",
11216
- "updateFooter": "FV0QMq_updateFooter",
11217
- "gitCommit": "FV0QMq_gitCommit",
11218
- "dropDown": "FV0QMq_dropDown",
11219
- "uploadOverlayCancel": "FV0QMq_uploadOverlayCancel",
11220
- "uploadDropZoneText": "FV0QMq_uploadDropZoneText",
11221
- "paneTabHidden": "FV0QMq_paneTabHidden",
11222
- "splitRow": "FV0QMq_splitRow",
11223
- "openWithName": "FV0QMq_openWithName",
11224
- "mermaidModalHint": "FV0QMq_mermaidModalHint",
11225
- "pinnedSessionsHeading": "FV0QMq_pinnedSessionsHeading",
11226
- "uploadOverlayProgressFill": "FV0QMq_uploadOverlayProgressFill",
11227
- "editorTreeResize": "FV0QMq_editorTreeResize",
11228
- "releaseNotesButton": "FV0QMq_releaseNotesButton",
11229
- "accountItem": "FV0QMq_accountItem",
11230
- "chatcodeGateError": "FV0QMq_chatcodeGateError",
11231
- "fenceError": "FV0QMq_fenceError",
11232
- "floatTitle": "FV0QMq_floatTitle",
11233
- "tocItemText": "FV0QMq_tocItemText",
11234
- "paneContent": "FV0QMq_paneContent",
11235
- "editorCm": "FV0QMq_editorCm",
11236
- "gitWorktreeRow": "FV0QMq_gitWorktreeRow",
11237
- "releaseNotesOverlay": "FV0QMq_releaseNotesOverlay",
11238
- "accountTrigger": "FV0QMq_accountTrigger",
11239
- "tab": "FV0QMq_tab",
11240
- "updateSettingsText": "FV0QMq_updateSettingsText",
11241
- "updateSettingsRow": "FV0QMq_updateSettingsRow",
11242
- "editorTitle": "FV0QMq_editorTitle",
11243
- "mermaidModalStage": "FV0QMq_mermaidModalStage",
11244
- "gitLogSubject": "FV0QMq_gitLogSubject",
11245
- "updateOk": "FV0QMq_updateOk",
11246
- "explorerSymlink": "FV0QMq_explorerSymlink",
11247
- "dividerRow": "FV0QMq_dividerRow",
11248
- "explorerName": "FV0QMq_explorerName",
11249
- "gitDiffCtx": "FV0QMq_gitDiffCtx",
11250
- "sandboxStatusText": "FV0QMq_sandboxStatusText",
11251
- "gitDiffNum": "FV0QMq_gitDiffNum",
11252
- "updateCommand": "FV0QMq_updateCommand",
11253
- "gitCommitInput": "FV0QMq_gitCommitInput",
11254
- "browserBlocked": "FV0QMq_browserBlocked",
11255
- "bottomPanel": "FV0QMq_bottomPanel",
11256
- "tocPanel": "FV0QMq_tocPanel",
11257
- "editorPdfFrameBlocked": "FV0QMq_editorPdfFrameBlocked",
11258
- "editorBinary": "FV0QMq_editorBinary",
11259
- "browserInput": "FV0QMq_browserInput",
11260
- "updateSettingsTitle": "FV0QMq_updateSettingsTitle",
11261
- "terminalDepsBanner": "FV0QMq_terminalDepsBanner",
11262
- "tocItemLevel": "FV0QMq_tocItemLevel",
11263
- "gitCommitButton": "FV0QMq_gitCommitButton",
11264
- "releaseNotesDialog": "FV0QMq_releaseNotesDialog",
11265
- "sandboxStatus": "FV0QMq_sandboxStatus",
11266
- "explorerEmpty": "FV0QMq_explorerEmpty",
11267
- "editorPptxButton": "FV0QMq_editorPptxButton",
11268
- "explorerError": "FV0QMq_explorerError",
11269
- "gitLogLine1": "FV0QMq_gitLogLine1",
11270
- "toggleCluster": "FV0QMq_toggleCluster",
11271
- "floatHeader": "FV0QMq_floatHeader",
11272
- "tocFlash": "FV0QMq_tocFlash",
11273
- "openWithLabel": "FV0QMq_openWithLabel",
11274
- "editorMd": "FV0QMq_editorMd",
11275
- "updateError": "FV0QMq_updateError",
11276
- "editorPathInput": "FV0QMq_editorPathInput",
11277
- "iconButton": "FV0QMq_iconButton",
11278
- "uploadOverlayTitle": "FV0QMq_uploadOverlayTitle",
11279
- "editorTreePanelFull": "FV0QMq_editorTreePanelFull",
11280
- "editorPdfFrame": "FV0QMq_editorPdfFrame",
11281
- "editorSearchHint": "FV0QMq_editorSearchHint",
11282
- "gitDiffAdd": "FV0QMq_gitDiffAdd",
11283
- "chatcodeGateCard": "FV0QMq_chatcodeGateCard",
11284
- "editorPdf": "FV0QMq_editorPdf",
11285
- "mermaidError": "FV0QMq_mermaidError",
11286
- "gitDiffFilePath": "FV0QMq_gitDiffFilePath",
11287
- "uploadDropChatHint": "FV0QMq_uploadDropChatHint",
11288
- "floatWindow": "FV0QMq_floatWindow",
11289
- "accountPresence": "FV0QMq_accountPresence",
11290
- "uploadDropHero": "FV0QMq_uploadDropHero",
11291
- "editorHeader": "FV0QMq_editorHeader",
11292
- "mermaidWrap": "FV0QMq_mermaidWrap",
11293
- "terminalDepsTitle": "FV0QMq_terminalDepsTitle",
11294
- "accountAvatar": "FV0QMq_accountAvatar",
11295
- "uploadDropZonePill": "FV0QMq_uploadDropZonePill",
11296
- "floatWindowDragging": "FV0QMq_floatWindowDragging",
11297
- "browserFrame": "FV0QMq_browserFrame"
11298
- };
11299
- //#endregion
11300
- //#region src/client/intercept.tsx
11301
- /**
11302
- * Contribution of the chat's produced-files row. Current Hosts expose the
11303
- * turn-tail surface as a list; older Hosts exposed it as a chain. The
11304
- * registration supplies both shapes' routing fields so one bundle remains
11305
- * compatible across that transition. The chips open the file in the sidebar
11306
- * instead of the host OS.
11307
- */
11308
- /** Open a file in the sidebar's editor (used by the intercepted row and the explorer). */
11309
- function openSidebarFile(ctx, store, sessionId, path) {
11310
- const summary = ctx.sessions.list.getSnapshot().byId[sessionId];
11311
- const absolute = resolveSidebarPath(summary?.cwd, path);
11312
- const at = Math.max(absolute.lastIndexOf("/"), absolute.lastIndexOf("\\"));
11313
- const title = at === -1 ? absolute : absolute.slice(at + 1);
11314
- ctx.get("betterSidebar")?.openTab({
11315
- type: "editor",
11316
- title,
11317
- path: absolute,
11318
- id: `editor:${absolute}`
11319
- });
11320
- }
11321
- /**
11322
- * The produced files the turn-tail selector last matched for the visible
11323
- * session. The "Show in folder" gesture carries no file path of its own
11324
- * (`'.'`), so the reveal highlights exactly these rows when available.
11325
- */
11326
- let lastProduced = [];
11327
- /**
11328
- * Reveal the produced files in the sidebar explorer: expand their parent
11329
- * directories, highlight the rows, and focus the explorer tab (expanding the
11330
- * hosting panel when it is collapsed). Unknown files fall back to revealing
11331
- * the workspace root itself.
11332
- */
11333
- function revealInExplorer(ctx, store, sessionId, files) {
11334
- const cwd = ctx.sessions.list.getSnapshot().byId[sessionId]?.cwd;
11335
- const targets = files.length > 0 ? files.map((path) => resolveSidebarPath(cwd, path)) : cwd === void 0 ? [] : [cwd];
11336
- store.reduce((state) => revealPaths(state, cwd, targets));
11337
- store.reduce((s) => s.panelOpen ? s : togglePanel(s));
11338
- store.reduce((s) => ({
11339
- ...s,
11340
- activePane: firstLeaf(s.splits).id
11341
- }));
11342
- ctx.get("betterSidebar")?.openTab({
11343
- type: "editor",
11344
- title: t("files")
11345
- });
10999
+ function FiSettings(props) {
11000
+ return GenIcon({
11001
+ "tag": "svg",
11002
+ "attr": {
11003
+ "viewBox": "0 0 24 24",
11004
+ "fill": "none",
11005
+ "stroke": "currentColor",
11006
+ "strokeWidth": "2",
11007
+ "strokeLinecap": "round",
11008
+ "strokeLinejoin": "round"
11009
+ },
11010
+ "child": [{
11011
+ "tag": "circle",
11012
+ "attr": {
11013
+ "cx": "12",
11014
+ "cy": "12",
11015
+ "r": "3"
11016
+ },
11017
+ "child": []
11018
+ }, {
11019
+ "tag": "path",
11020
+ "attr": { "d": "M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z" },
11021
+ "child": []
11022
+ }]
11023
+ })(props);
11346
11024
  }
11347
- /** The intercepted produced-files row (visual twin of the deliverables chips). */
11348
- function SidebarProducedFiles(props) {
11349
- const { matched, openInSidebar, onShowInFolder } = props;
11350
- const shown = matched.slice(0, 6);
11351
- const hidden = matched.length - shown.length;
11352
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11353
- className: sidebar_module_css_default.producedRow,
11354
- children: [
11355
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11356
- className: sidebar_module_css_default.producedLabel,
11357
- children: t("produced")
11358
- }),
11359
- shown.map((path) => {
11360
- const at = Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\"));
11361
- const name = at === -1 ? path : path.slice(at + 1);
11362
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
11363
- type: "button",
11364
- className: sidebar_module_css_default.producedChip,
11365
- title: path,
11366
- onClick: () => {
11367
- openInSidebar(path);
11368
- },
11369
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCodeOutline16, { size: 12 }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: name })]
11370
- }, path);
11371
- }),
11372
- hidden > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
11373
- className: sidebar_module_css_default.producedMore,
11374
- children: ["+", hidden]
11375
- }),
11376
- hidden > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
11377
- type: "button",
11378
- className: sidebar_module_css_default.producedMore,
11379
- style: {
11380
- cursor: "pointer",
11381
- textDecoration: "underline",
11382
- textUnderlineOffset: 2
11383
- },
11384
- onClick: () => {
11385
- onShowInFolder(matched);
11386
- },
11387
- children: t("showInFolder")
11388
- })
11025
+ function FiRefreshCw(props) {
11026
+ return GenIcon({
11027
+ "tag": "svg",
11028
+ "attr": {
11029
+ "viewBox": "0 0 24 24",
11030
+ "fill": "none",
11031
+ "stroke": "currentColor",
11032
+ "strokeWidth": "2",
11033
+ "strokeLinecap": "round",
11034
+ "strokeLinejoin": "round"
11035
+ },
11036
+ "child": [
11037
+ {
11038
+ "tag": "polyline",
11039
+ "attr": { "points": "23 4 23 10 17 10" },
11040
+ "child": []
11041
+ },
11042
+ {
11043
+ "tag": "polyline",
11044
+ "attr": { "points": "1 20 1 14 7 14" },
11045
+ "child": []
11046
+ },
11047
+ {
11048
+ "tag": "path",
11049
+ "attr": { "d": "M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15" },
11050
+ "child": []
11051
+ }
11389
11052
  ]
11390
- });
11053
+ })(props);
11391
11054
  }
11392
- /** Adapt both the legacy chain match and the current list owner to the row. */
11393
- function SidebarProducedFilesEntry(props) {
11394
- if (props.store.getSuspended() || props.store.getPrefs().tabsEnabled["editor"] === false) return null;
11395
- const matched = props.matched ?? selectProducedFiles(props);
11396
- if (matched === null) return null;
11397
- lastProduced = matched;
11398
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarProducedFiles, {
11399
- matched,
11400
- openInSidebar: props.openInSidebar,
11401
- onShowInFolder: props.onShowInFolder
11402
- });
11055
+ function FiPlus(props) {
11056
+ return GenIcon({
11057
+ "tag": "svg",
11058
+ "attr": {
11059
+ "viewBox": "0 0 24 24",
11060
+ "fill": "none",
11061
+ "stroke": "currentColor",
11062
+ "strokeWidth": "2",
11063
+ "strokeLinecap": "round",
11064
+ "strokeLinejoin": "round"
11065
+ },
11066
+ "child": [{
11067
+ "tag": "line",
11068
+ "attr": {
11069
+ "x1": "12",
11070
+ "y1": "5",
11071
+ "x2": "12",
11072
+ "y2": "19"
11073
+ },
11074
+ "child": []
11075
+ }, {
11076
+ "tag": "line",
11077
+ "attr": {
11078
+ "x1": "5",
11079
+ "y1": "12",
11080
+ "x2": "19",
11081
+ "y2": "12"
11082
+ },
11083
+ "child": []
11084
+ }]
11085
+ })(props);
11403
11086
  }
11404
- /**
11405
- * Register the turn-tail interception (returns the disposer).
11406
- *
11407
- * The slot is a CHILD slot the host's ui-conversation declares in its
11408
- * `conversation.chat.node` children table (currently kind: list, scope:
11409
- * session; older compatible Hosts declared a chain).
11410
- * Registering it directly races the declaration — the ui-slots core's
11411
- * load-time validation throws "not declared (a parent entry's children
11412
- * table must declare it)" when the parent entry is not on the ledger yet.
11413
- * slots.inject waits for the declaration: the callback runs synchronously
11414
- * when the slot is already declared, otherwise it runs inside the declaring
11415
- * register() call once the declaration commits; declaration collapse
11416
- * disposes the entry and a later declaration re-registers it. This mirrors
11417
- * @deepseek-ai/dsh-client-ui-deliverables' registration of the same slot.
11418
- */
11419
- function registerTurnTailInterception(ctx, store) {
11420
- return ctx.slots.inject("conversation.chat.turnTail", () => ctx.slots.register({
11421
- name: "conversation.chat.turnTail",
11422
- id: "dsh-better-sidebar:produced-files",
11423
- select: (owner) => {
11424
- if (store.getSuspended()) return null;
11425
- if (store.getPrefs().tabsEnabled["editor"] === false) return null;
11426
- const matched = selectProducedFiles(owner);
11427
- if (matched !== null) lastProduced = matched;
11428
- return matched;
11087
+ function FiLoader(props) {
11088
+ return GenIcon({
11089
+ "tag": "svg",
11090
+ "attr": {
11091
+ "viewBox": "0 0 24 24",
11092
+ "fill": "none",
11093
+ "stroke": "currentColor",
11094
+ "strokeWidth": "2",
11095
+ "strokeLinecap": "round",
11096
+ "strokeLinejoin": "round"
11429
11097
  },
11430
- priority: -1,
11431
- registrant: "dsh-better-sidebar",
11432
- inject: (sessionId) => ({
11433
- store,
11434
- openInSidebar: (path) => {
11435
- openSidebarFile(ctx, store, sessionId, path);
11098
+ "child": [
11099
+ {
11100
+ "tag": "line",
11101
+ "attr": {
11102
+ "x1": "12",
11103
+ "y1": "2",
11104
+ "x2": "12",
11105
+ "y2": "6"
11106
+ },
11107
+ "child": []
11436
11108
  },
11437
- onShowInFolder: (files) => {
11438
- revealInExplorer(ctx, store, sessionId, files);
11109
+ {
11110
+ "tag": "line",
11111
+ "attr": {
11112
+ "x1": "12",
11113
+ "y1": "18",
11114
+ "x2": "12",
11115
+ "y2": "22"
11116
+ },
11117
+ "child": []
11118
+ },
11119
+ {
11120
+ "tag": "line",
11121
+ "attr": {
11122
+ "x1": "4.93",
11123
+ "y1": "4.93",
11124
+ "x2": "7.76",
11125
+ "y2": "7.76"
11126
+ },
11127
+ "child": []
11128
+ },
11129
+ {
11130
+ "tag": "line",
11131
+ "attr": {
11132
+ "x1": "16.24",
11133
+ "y1": "16.24",
11134
+ "x2": "19.07",
11135
+ "y2": "19.07"
11136
+ },
11137
+ "child": []
11138
+ },
11139
+ {
11140
+ "tag": "line",
11141
+ "attr": {
11142
+ "x1": "2",
11143
+ "y1": "12",
11144
+ "x2": "6",
11145
+ "y2": "12"
11146
+ },
11147
+ "child": []
11148
+ },
11149
+ {
11150
+ "tag": "line",
11151
+ "attr": {
11152
+ "x1": "18",
11153
+ "y1": "12",
11154
+ "x2": "22",
11155
+ "y2": "12"
11156
+ },
11157
+ "child": []
11158
+ },
11159
+ {
11160
+ "tag": "line",
11161
+ "attr": {
11162
+ "x1": "4.93",
11163
+ "y1": "19.07",
11164
+ "x2": "7.76",
11165
+ "y2": "16.24"
11166
+ },
11167
+ "child": []
11168
+ },
11169
+ {
11170
+ "tag": "line",
11171
+ "attr": {
11172
+ "x1": "16.24",
11173
+ "y1": "7.76",
11174
+ "x2": "19.07",
11175
+ "y2": "4.93"
11176
+ },
11177
+ "child": []
11439
11178
  }
11440
- })
11441
- }, SidebarProducedFilesEntry));
11179
+ ]
11180
+ })(props);
11442
11181
  }
11443
- /**
11444
- * Register the chat file-open interception: wraps `ctx.workspaces.openPath`
11445
- * — the single funnel every chat-side file open goes through (tool-row path
11446
- * links, the produced-files row, prose mentions) — so opens land in the
11447
- * sidebar editor instead of the Host OS. The folder-reveal gesture ("Show in
11448
- * folder" passes `'.'`) is the one exception: it is routed to the explorer.
11449
- * Gated by BOTH the `interceptOpenPath` pref and the editor tab's enable
11450
- * switch; declined opens fall through to the original method. Returns the
11451
- * disposer restoring the original (HMR-safe).
11452
- */
11453
- function registerOpenPathInterception(ctx, store) {
11454
- return wrapOpenPath(ctx.workspaces, {
11455
- takeoverEnabled: () => !store.getSuspended() && store.getPrefs().interceptOpenPath !== false && store.getPrefs().tabsEnabled["editor"] !== false,
11456
- currentSessionId: () => currentSessionId(ctx),
11457
- openInSidebar: (path, sessionId) => {
11458
- openSidebarFile(ctx, store, sessionId, path);
11182
+ function FiLink(props) {
11183
+ return GenIcon({
11184
+ "tag": "svg",
11185
+ "attr": {
11186
+ "viewBox": "0 0 24 24",
11187
+ "fill": "none",
11188
+ "stroke": "currentColor",
11189
+ "strokeWidth": "2",
11190
+ "strokeLinecap": "round",
11191
+ "strokeLinejoin": "round"
11459
11192
  },
11460
- revealInExplorer: (_path, sessionId) => {
11461
- revealInExplorer(ctx, store, sessionId, lastProduced);
11462
- }
11463
- });
11464
- }
11465
- //#endregion
11466
- //#region node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
11467
- function r(e) {
11468
- var t, f, n = "";
11469
- if ("string" == typeof e || "number" == typeof e) n += e;
11470
- else if ("object" == typeof e) if (Array.isArray(e)) {
11471
- var o = e.length;
11472
- for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f);
11473
- } else for (f in e) e[f] && (n && (n += " "), n += f);
11474
- return n;
11193
+ "child": [{
11194
+ "tag": "path",
11195
+ "attr": { "d": "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" },
11196
+ "child": []
11197
+ }, {
11198
+ "tag": "path",
11199
+ "attr": { "d": "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" },
11200
+ "child": []
11201
+ }]
11202
+ })(props);
11475
11203
  }
11476
- function clsx() {
11477
- for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t);
11478
- return n;
11204
+ function FiGitBranch(props) {
11205
+ return GenIcon({
11206
+ "tag": "svg",
11207
+ "attr": {
11208
+ "viewBox": "0 0 24 24",
11209
+ "fill": "none",
11210
+ "stroke": "currentColor",
11211
+ "strokeWidth": "2",
11212
+ "strokeLinecap": "round",
11213
+ "strokeLinejoin": "round"
11214
+ },
11215
+ "child": [
11216
+ {
11217
+ "tag": "line",
11218
+ "attr": {
11219
+ "x1": "6",
11220
+ "y1": "3",
11221
+ "x2": "6",
11222
+ "y2": "15"
11223
+ },
11224
+ "child": []
11225
+ },
11226
+ {
11227
+ "tag": "circle",
11228
+ "attr": {
11229
+ "cx": "18",
11230
+ "cy": "6",
11231
+ "r": "3"
11232
+ },
11233
+ "child": []
11234
+ },
11235
+ {
11236
+ "tag": "circle",
11237
+ "attr": {
11238
+ "cx": "6",
11239
+ "cy": "18",
11240
+ "r": "3"
11241
+ },
11242
+ "child": []
11243
+ },
11244
+ {
11245
+ "tag": "path",
11246
+ "attr": { "d": "M18 9a9 9 0 0 1-9 9" },
11247
+ "child": []
11248
+ }
11249
+ ]
11250
+ })(props);
11479
11251
  }
11480
- //#endregion
11481
- //#region src/client/api.ts
11482
- /** One wire failure. */
11483
- var SidebarApiError = class extends Error {
11484
- code;
11485
- constructor(code, message) {
11486
- super(message);
11487
- this.code = code;
11488
- }
11489
- };
11490
- /** Message-level variant for surfaces that stored the raw text (file-tree level errors). */
11491
- function isOutsideWorkspaceMessage(message) {
11492
- return message.includes("outside workspace");
11252
+ function FiFolder(props) {
11253
+ return GenIcon({
11254
+ "tag": "svg",
11255
+ "attr": {
11256
+ "viewBox": "0 0 24 24",
11257
+ "fill": "none",
11258
+ "stroke": "currentColor",
11259
+ "strokeWidth": "2",
11260
+ "strokeLinecap": "round",
11261
+ "strokeLinejoin": "round"
11262
+ },
11263
+ "child": [{
11264
+ "tag": "path",
11265
+ "attr": { "d": "M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z" },
11266
+ "child": []
11267
+ }]
11268
+ })(props);
11493
11269
  }
11494
- async function call(method, payload, signal) {
11495
- let response;
11496
- try {
11497
- response = await fetch(`/sidebar/api/${method}`, {
11498
- method: "POST",
11499
- headers: { "content-type": "application/json" },
11500
- body: JSON.stringify(payload),
11501
- signal
11502
- });
11503
- } catch (error) {
11504
- throw new SidebarApiError("network", error instanceof Error ? error.message : String(error));
11505
- }
11506
- const parsed = await response.json().catch(() => null);
11507
- if (!response.ok || parsed === null || parsed.ok !== true || parsed.value === void 0) throw new SidebarApiError(parsed?.error?.code ?? "http", parsed?.error?.message ?? `HTTP ${response.status}`);
11508
- return parsed.value;
11270
+ function FiDownload(props) {
11271
+ return GenIcon({
11272
+ "tag": "svg",
11273
+ "attr": {
11274
+ "viewBox": "0 0 24 24",
11275
+ "fill": "none",
11276
+ "stroke": "currentColor",
11277
+ "strokeWidth": "2",
11278
+ "strokeLinecap": "round",
11279
+ "strokeLinejoin": "round"
11280
+ },
11281
+ "child": [
11282
+ {
11283
+ "tag": "path",
11284
+ "attr": { "d": "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" },
11285
+ "child": []
11286
+ },
11287
+ {
11288
+ "tag": "polyline",
11289
+ "attr": { "points": "7 10 12 15 17 10" },
11290
+ "child": []
11291
+ },
11292
+ {
11293
+ "tag": "line",
11294
+ "attr": {
11295
+ "x1": "12",
11296
+ "y1": "15",
11297
+ "x2": "12",
11298
+ "y2": "3"
11299
+ },
11300
+ "child": []
11301
+ }
11302
+ ]
11303
+ })(props);
11509
11304
  }
11510
- /**
11511
- * Upload one file to the sidebar's raw upload route: the File goes straight
11512
- * into the POST body (no JSON/base64 re-encoding — the host streams it into
11513
- * the workspace). Failure surfaces as {@link SidebarApiError} with the wire
11514
- * code, exactly like every `/sidebar/api` call. An aborted `signal` rejects
11515
- * with the DOMException as-is (the caller decides whether that is an error).
11516
- */
11517
- async function fetchUpload(scope, dir, relativePath, body, signal) {
11518
- const params = new URLSearchParams({
11519
- sessionId: scope.sessionId,
11520
- dir,
11521
- relativePath
11522
- });
11523
- if (scope.cwd !== void 0 && scope.cwd !== "") params.set("cwd", scope.cwd);
11524
- let response;
11525
- try {
11526
- response = await fetch(`/sidebar/upload?${params.toString()}`, {
11527
- method: "POST",
11528
- headers: { "content-type": "application/octet-stream" },
11529
- body,
11530
- signal
11531
- });
11532
- } catch (error) {
11533
- if (error instanceof DOMException && error.name === "AbortError") throw error;
11534
- throw new SidebarApiError("network", error instanceof Error ? error.message : String(error));
11535
- }
11536
- const parsed = await response.json().catch(() => null);
11537
- if (!response.ok || parsed === null || parsed.ok !== true || parsed.value === void 0) throw new SidebarApiError(parsed?.error?.code ?? "http", parsed?.error?.message ?? `HTTP ${response.status}`);
11538
- return parsed.value;
11305
+ function FiCopy(props) {
11306
+ return GenIcon({
11307
+ "tag": "svg",
11308
+ "attr": {
11309
+ "viewBox": "0 0 24 24",
11310
+ "fill": "none",
11311
+ "stroke": "currentColor",
11312
+ "strokeWidth": "2",
11313
+ "strokeLinecap": "round",
11314
+ "strokeLinejoin": "round"
11315
+ },
11316
+ "child": [{
11317
+ "tag": "rect",
11318
+ "attr": {
11319
+ "x": "9",
11320
+ "y": "9",
11321
+ "width": "13",
11322
+ "height": "13",
11323
+ "rx": "2",
11324
+ "ry": "2"
11325
+ },
11326
+ "child": []
11327
+ }, {
11328
+ "tag": "path",
11329
+ "attr": { "d": "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" },
11330
+ "child": []
11331
+ }]
11332
+ })(props);
11539
11333
  }
11540
- /** Fold a scope into a JSON payload ({cwd} only when present). */
11541
- function scopePayload(scope, extra) {
11542
- return {
11543
- sessionId: scope.sessionId,
11544
- ...scope.cwd !== void 0 && scope.cwd !== "" ? { cwd: scope.cwd } : {},
11545
- ...scope.repoRoot !== void 0 && scope.repoRoot !== "" ? { repoRoot: scope.repoRoot } : {},
11546
- ...extra
11547
- };
11334
+ function FiCode(props) {
11335
+ return GenIcon({
11336
+ "tag": "svg",
11337
+ "attr": {
11338
+ "viewBox": "0 0 24 24",
11339
+ "fill": "none",
11340
+ "stroke": "currentColor",
11341
+ "strokeWidth": "2",
11342
+ "strokeLinecap": "round",
11343
+ "strokeLinejoin": "round"
11344
+ },
11345
+ "child": [{
11346
+ "tag": "polyline",
11347
+ "attr": { "points": "16 18 22 12 16 6" },
11348
+ "child": []
11349
+ }, {
11350
+ "tag": "polyline",
11351
+ "attr": { "points": "8 6 2 12 8 18" },
11352
+ "child": []
11353
+ }]
11354
+ })(props);
11548
11355
  }
11549
- /** Add a linked-worktree selection to a scoped Git request. The host validates
11550
- * membership before using it as a command cwd. */
11551
- function gitPayload(scope, worktree, extra) {
11552
- return scopePayload(scope, {
11553
- ...worktree !== void 0 && worktree !== "" ? { worktree } : {},
11554
- ...extra
11555
- });
11356
+ function FiChevronRight(props) {
11357
+ return GenIcon({
11358
+ "tag": "svg",
11359
+ "attr": {
11360
+ "viewBox": "0 0 24 24",
11361
+ "fill": "none",
11362
+ "stroke": "currentColor",
11363
+ "strokeWidth": "2",
11364
+ "strokeLinecap": "round",
11365
+ "strokeLinejoin": "round"
11366
+ },
11367
+ "child": [{
11368
+ "tag": "polyline",
11369
+ "attr": { "points": "9 18 15 12 9 6" },
11370
+ "child": []
11371
+ }]
11372
+ })(props);
11556
11373
  }
11557
- /** The sidebar API surface (session scope threaded through every call). */
11558
- const api = {
11559
- chatcodeStatus: (signal) => call("chatcode.status", {}, signal),
11560
- chatcodeStart: () => call("chatcode.start", {}),
11561
- chatcodeCancel: (sessionId) => call("chatcode.cancel", { sessionId }),
11562
- chatcodeLogout: () => call("chatcode.logout", {}),
11563
- /** Check both ChatCode packages (web + CLI) against the npm registry. */
11564
- chatcodeUpdateCheck: (signal) => call("chatcode.update.check", {}, signal),
11565
- /** Upgrade both ChatCode packages to their npm-latest versions. */
11566
- chatcodeUpdatePerform: (signal) => call("chatcode.update.perform", {}, signal),
11567
- releaseNoteCurrent: (packageName, versionNum, signal) => call("release-note.current", {
11568
- packageName,
11569
- versionNum
11570
- }, signal),
11571
- /** Per-day token usage of one day range (`YYYY-MM-DD`). */
11572
- chatcodeTokenTrend: (begin, end, signal) => call("chatcode.token-trend", {
11573
- begin,
11574
- end
11575
- }, signal),
11576
- /** Personal commit records of one day range (AI-ratio view). */
11577
- chatcodeGitCommitStats: (begin, end, signal) => call("chatcode.git-commit-stats", {
11578
- begin,
11579
- end
11580
- }, signal),
11581
- sessionCwd: (scope, signal) => call("session.cwd", scopePayload(scope, {}), signal),
11582
- fsTree: (scope, path, signal) => call("fs.tree", scopePayload(scope, { path }), signal),
11583
- /** Global recursive file-name search rooted at the session cwd (the editor
11584
- * side panel's search box); matches are cwd-relative '/'-separated paths. */
11585
- fsSearch: (scope, query, signal) => call("fs.search", scopePayload(scope, { query }), signal),
11586
- fsRead: (scope, path, signal) => call("fs.read", scopePayload(scope, { path }), signal),
11587
- fsWrite: (scope, path, content) => call("fs.write", scopePayload(scope, {
11588
- path,
11589
- content
11590
- })),
11591
- /** Upload one file's raw bytes into `dir` (keeps the folder tree via
11592
- * `relativePath`); the host streams it under the session workspace. */
11593
- uploadFile: (scope, dir, relativePath, body, signal) => fetchUpload(scope, dir, relativePath, body, signal),
11594
- gitWorktrees: (scope, signal) => call("git.worktrees", scopePayload(scope, {}), signal),
11595
- gitStatus: (scope, worktree, signal) => call("git.status", gitPayload(scope, worktree, {}), signal),
11596
- gitDiff: (scope, path, staged, worktree, signal) => call("git.diff", gitPayload(scope, worktree, {
11597
- ...path !== void 0 ? { path } : {},
11598
- staged
11599
- }), signal),
11600
- gitStage: (scope, path, worktree) => call("git.stage", gitPayload(scope, worktree, { ...path !== void 0 ? { path } : {} })),
11601
- gitUnstage: (scope, path, worktree) => call("git.unstage", gitPayload(scope, worktree, { ...path !== void 0 ? { path } : {} })),
11602
- gitCommit: (scope, message, worktree) => call("git.commit", gitPayload(scope, worktree, { message })),
11603
- gitBranch: (scope, worktree, signal) => call("git.branch", gitPayload(scope, worktree, {}), signal),
11604
- gitCheckout: (scope, branch, worktree) => call("git.checkout", gitPayload(scope, worktree, { branch })),
11605
- /** Recent commit history, lazily pageable (skip/count; defaults 0/30). */
11606
- gitLog: (scope, count, skip, worktree, signal) => call("git.log", gitPayload(scope, worktree, {
11607
- ...count !== void 0 ? { count } : {},
11608
- ...skip !== void 0 ? { skip } : {}
11609
- }), signal),
11610
- /** Full patch text of one commit (diff display for the history rows). */
11611
- gitCommitDiff: (scope, hash, worktree, signal) => call("git.commit-diff", gitPayload(scope, worktree, { hash }), signal),
11612
- /** Discard the worktree changes of one file (the index is untouched). */
11613
- gitDiscard: (scope, path, worktree) => call("git.discard", gitPayload(scope, worktree, { path })),
11614
- /** Revert one commit onto the current branch. */
11615
- gitRevert: (scope, hash, worktree) => call("git.revert", gitPayload(scope, worktree, { hash })),
11616
- /** Cherry-pick one commit onto the current branch. */
11617
- gitCherryPick: (scope, hash, worktree) => call("git.cherry-pick", gitPayload(scope, worktree, { hash })),
11618
- /** Release a terminal's process immediately (tab closed; the WS close frame
11619
- * may be unreachable while the socket is down, so the host also accepts
11620
- * this explicit route). */
11621
- ptyClose: (scope, tab) => call("pty.close", scopePayload(scope, { tab })),
11622
- /** Release an agent terminal by uuid (tab closed while WS was down). */
11623
- agentPtyClose: (uuid) => call("agent-pty.close", { uuid }),
11624
- /** Terminal dependency status (issue #140): after a WS close 1011 with
11625
- * reason `pty-deps-missing` the view fetches the full repair details here
11626
- * (the close reason itself is capped at 123 bytes). */
11627
- terminalDeps: () => call("terminal.deps", {}),
11628
- /** The effective terminal shell and its display name (plugin-global). */
11629
- shellGet: () => call("shell.get", {}),
11630
- /** The local display name used by the bottom-left account menu. */
11631
- accountGet: () => call("account.get", {}),
11632
- /** Read the host-cached CodingPlan model catalogue. */
11633
- codingPlanModels: () => call("codingplan.models", {}),
11634
- /** Refresh the host-cached CodingPlan catalogue. */
11635
- codingPlanRefresh: () => call("codingplan.refresh", {}),
11636
- /** Read the side card preferences (plugin-global, no session scope). */
11637
- settingsGet: () => call("settings.get", {}),
11638
- /** Merge a patch into the side card preferences (revision-guarded). */
11639
- settingsUpdate: (patch, expectedRevision) => call("settings.update", {
11640
- patch,
11641
- ...expectedRevision !== void 0 ? { expectedRevision } : {}
11642
- }),
11643
- /** Probe a URL's response headers (the sidebar browser's embeddability
11644
- * check; see the host's browser.probe route). */
11645
- browserProbe: (url, signal) => call("browser.probe", { url }, signal),
11646
- /** External open for the file tree's "open with" menu: reveal a path in
11647
- * the OS file manager, or hand a custom-scheme URL (vscode://, cursor://,
11648
- * zed://, custom editors) to its registered handler. The host launches
11649
- * the platform opener (argv, no shell). */
11650
- openExternal: (payload) => call("open.external", payload)
11651
- };
11652
- /** Absolute URL of the media route for one path (images only). */
11653
- function mediaUrl(scope, path) {
11654
- return fileUrl(scope, path, false);
11374
+ function FiChevronLeft(props) {
11375
+ return GenIcon({
11376
+ "tag": "svg",
11377
+ "attr": {
11378
+ "viewBox": "0 0 24 24",
11379
+ "fill": "none",
11380
+ "stroke": "currentColor",
11381
+ "strokeWidth": "2",
11382
+ "strokeLinecap": "round",
11383
+ "strokeLinejoin": "round"
11384
+ },
11385
+ "child": [{
11386
+ "tag": "polyline",
11387
+ "attr": { "points": "15 18 9 12 15 6" },
11388
+ "child": []
11389
+ }]
11390
+ })(props);
11655
11391
  }
11656
- /** Absolute URL of the download route: serves raw bytes (binary-safe) with
11657
- * `Content-Disposition: attachment`, so the browser saves the file. */
11658
- function downloadUrl(scope, path) {
11659
- return fileUrl(scope, path, true);
11392
+ function FiChevronDown(props) {
11393
+ return GenIcon({
11394
+ "tag": "svg",
11395
+ "attr": {
11396
+ "viewBox": "0 0 24 24",
11397
+ "fill": "none",
11398
+ "stroke": "currentColor",
11399
+ "strokeWidth": "2",
11400
+ "strokeLinecap": "round",
11401
+ "strokeLinejoin": "round"
11402
+ },
11403
+ "child": [{
11404
+ "tag": "polyline",
11405
+ "attr": { "points": "6 9 12 15 18 9" },
11406
+ "child": []
11407
+ }]
11408
+ })(props);
11660
11409
  }
11661
- /** Shared URL builder for the /sidebar/file route (media vs download). */
11662
- function fileUrl(scope, path, download) {
11663
- const params = new URLSearchParams({
11664
- sessionId: scope.sessionId,
11665
- path
11666
- });
11667
- if (scope.cwd !== void 0 && scope.cwd !== "") params.set("cwd", scope.cwd);
11668
- if (download) params.set("download", "1");
11669
- return `/sidebar/file?${params.toString()}`;
11410
+ function FiCheck(props) {
11411
+ return GenIcon({
11412
+ "tag": "svg",
11413
+ "attr": {
11414
+ "viewBox": "0 0 24 24",
11415
+ "fill": "none",
11416
+ "stroke": "currentColor",
11417
+ "strokeWidth": "2",
11418
+ "strokeLinecap": "round",
11419
+ "strokeLinejoin": "round"
11420
+ },
11421
+ "child": [{
11422
+ "tag": "polyline",
11423
+ "attr": { "points": "20 6 9 17 4 12" },
11424
+ "child": []
11425
+ }]
11426
+ })(props);
11670
11427
  }
11671
- //#endregion
11672
- //#region src/client/binary-download.tsx
11673
- function BinaryDownload(props) {
11674
- const { scope, path } = props;
11675
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11676
- className: sidebar_module_css_default.editorBinary,
11677
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11678
- className: sidebar_module_css_default.editorBinaryNotice,
11679
- children: t("binaryNoPreview")
11680
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
11681
- className: sidebar_module_css_default.editorDownloadLink,
11682
- href: downloadUrl(scope, path),
11683
- download: true,
11684
- children: t("downloadToView")
11685
- })]
11686
- });
11428
+ function FiAlertTriangle(props) {
11429
+ return GenIcon({
11430
+ "tag": "svg",
11431
+ "attr": {
11432
+ "viewBox": "0 0 24 24",
11433
+ "fill": "none",
11434
+ "stroke": "currentColor",
11435
+ "strokeWidth": "2",
11436
+ "strokeLinecap": "round",
11437
+ "strokeLinejoin": "round"
11438
+ },
11439
+ "child": [
11440
+ {
11441
+ "tag": "path",
11442
+ "attr": { "d": "M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z" },
11443
+ "child": []
11444
+ },
11445
+ {
11446
+ "tag": "line",
11447
+ "attr": {
11448
+ "x1": "12",
11449
+ "y1": "9",
11450
+ "x2": "12",
11451
+ "y2": "13"
11452
+ },
11453
+ "child": []
11454
+ },
11455
+ {
11456
+ "tag": "line",
11457
+ "attr": {
11458
+ "x1": "12",
11459
+ "y1": "17",
11460
+ "x2": "12.01",
11461
+ "y2": "17"
11462
+ },
11463
+ "child": []
11464
+ }
11465
+ ]
11466
+ })(props);
11687
11467
  }
11688
11468
  //#endregion
11689
- //#region src/client/prefs.ts
11690
- /** Validate one raw resolved value into {@link SidebarPrefs}. Used for the
11691
- * settings.get payload AND the settings.update response (both carry the
11692
- * layered resolved value); any malformed field falls back to its default.
11693
- * @param value - the raw resolved section from the settings wire.
11694
- * @returns validated prefs (always well-formed).
11695
- */
11696
- function parsePrefs(value) {
11697
- if (value === null || typeof value !== "object") return { ...SIDEBAR_PREFS_DEFAULTS };
11698
- const record = value;
11699
- return {
11700
- openByDefault: typeof record.openByDefault === "boolean" ? record.openByDefault : SIDEBAR_PREFS_DEFAULTS.openByDefault,
11701
- defaultWidthPercent: typeof record.defaultWidthPercent === "number" && Number.isFinite(record.defaultWidthPercent) ? clampWidthPercent(record.defaultWidthPercent) : SIDEBAR_PREFS_DEFAULTS.defaultWidthPercent,
11702
- autoOpenSubagent: typeof record.autoOpenSubagent === "boolean" ? record.autoOpenSubagent : SIDEBAR_PREFS_DEFAULTS.autoOpenSubagent,
11703
- autoOpenJobs: typeof record.autoOpenJobs === "boolean" ? record.autoOpenJobs : SIDEBAR_PREFS_DEFAULTS.autoOpenJobs,
11704
- agentTerminalTools: typeof record.agentTerminalTools === "boolean" ? record.agentTerminalTools : SIDEBAR_PREFS_DEFAULTS.agentTerminalTools,
11705
- agentOpenTools: typeof record.agentOpenTools === "boolean" ? record.agentOpenTools : SIDEBAR_PREFS_DEFAULTS.agentOpenTools,
11706
- bottomPanelAutoTerminal: typeof record.bottomPanelAutoTerminal === "boolean" ? record.bottomPanelAutoTerminal : SIDEBAR_PREFS_DEFAULTS.bottomPanelAutoTerminal,
11707
- terminalFontFamily: typeof record.terminalFontFamily === "string" ? record.terminalFontFamily : SIDEBAR_PREFS_DEFAULTS.terminalFontFamily,
11708
- terminalShell: typeof record.terminalShell === "string" ? record.terminalShell : SIDEBAR_PREFS_DEFAULTS.terminalShell,
11709
- terminalShellArgs: typeof record.terminalShellArgs === "string" ? record.terminalShellArgs : SIDEBAR_PREFS_DEFAULTS.terminalShellArgs,
11710
- terminalFontSize: typeof record.terminalFontSize === "number" && Number.isFinite(record.terminalFontSize) ? clampTerminalFontSize(record.terminalFontSize) : SIDEBAR_PREFS_DEFAULTS.terminalFontSize,
11711
- interceptOpenPath: typeof record.interceptOpenPath === "boolean" ? record.interceptOpenPath : SIDEBAR_PREFS_DEFAULTS.interceptOpenPath,
11712
- editorExplorer: typeof record.editorExplorer === "boolean" ? record.editorExplorer : SIDEBAR_PREFS_DEFAULTS.editorExplorer,
11713
- workspaceFence: typeof record.workspaceFence === "boolean" ? record.workspaceFence : SIDEBAR_PREFS_DEFAULTS.workspaceFence,
11714
- titleBarScheme: isTitleBarScheme(record.titleBarScheme) ? record.titleBarScheme : record.titleBarCompat === true || hasLegacyStripValue(record.titleBarStripPx) ? "custom" : "auto",
11715
- titleBarPresetId: typeof record.titleBarPresetId === "string" ? record.titleBarPresetId : SIDEBAR_PREFS_DEFAULTS.titleBarPresetId,
11716
- customCss: typeof record.customCss === "string" ? record.customCss : SIDEBAR_PREFS_DEFAULTS.customCss,
11717
- titleBarCompat: typeof record.titleBarCompat === "boolean" ? record.titleBarCompat : SIDEBAR_PREFS_DEFAULTS.titleBarCompat,
11718
- titleBarStripPx: typeof record.titleBarStripPx === "number" && Number.isFinite(record.titleBarStripPx) ? clampTitleBarStrip(record.titleBarStripPx) : SIDEBAR_PREFS_DEFAULTS.titleBarStripPx,
11719
- htmlViewerNoSandbox: typeof record.htmlViewerNoSandbox === "boolean" ? record.htmlViewerNoSandbox : SIDEBAR_PREFS_DEFAULTS.htmlViewerNoSandbox,
11720
- htmlViewerDefaultUnsafe: typeof record.htmlViewerDefaultUnsafe === "boolean" ? record.htmlViewerDefaultUnsafe : SIDEBAR_PREFS_DEFAULTS.htmlViewerDefaultUnsafe,
11721
- browserNoSandbox: typeof record.browserNoSandbox === "boolean" ? record.browserNoSandbox : SIDEBAR_PREFS_DEFAULTS.browserNoSandbox,
11722
- browserInterceptLinks: typeof record.browserInterceptLinks === "boolean" ? record.browserInterceptLinks : SIDEBAR_PREFS_DEFAULTS.browserInterceptLinks,
11723
- browserInterceptHttp: typeof record.browserInterceptHttp === "boolean" ? record.browserInterceptHttp : SIDEBAR_PREFS_DEFAULTS.browserInterceptHttp,
11724
- browserInterceptHttps: typeof record.browserInterceptHttps === "boolean" ? record.browserInterceptHttps : SIDEBAR_PREFS_DEFAULTS.browserInterceptHttps,
11725
- browserAllowedLoopback: typeof record.browserAllowedLoopback === "string" ? record.browserAllowedLoopback : SIDEBAR_PREFS_DEFAULTS.browserAllowedLoopback,
11726
- tabsEnabled: booleanMapOf(record.tabsEnabled),
11727
- viewersEnabled: booleanMapOf(record.viewersEnabled),
11728
- pluginSettings: pluginSettingsMapOf(record.pluginSettings)
11729
- };
11730
- }
11469
+ //#region src/client/icons.tsx
11731
11470
  /**
11732
- * Validate the plugin-owned settings map (v0.12.0+): `{ descriptorId: { key:
11733
- * value } }`, nested open maps. Any non-object value (or a malformed whole)
11734
- * falls back to the empty map — the schema defaults already guard the wire
11735
- * shape, this is the client's second line.
11471
+ * Icons owned by the sidebar. DSH 0.1.7 stopped exporting the old Icon*
11472
+ * components from dsh-client-ui-primitives, so keeping every glyph local
11473
+ * makes the browser bundle work against both the 0.1.2 and 0.1.7 hosts.
11474
+ * Per-tab icons live on the tab descriptors
11475
+ * (`descriptor.icon`), not in a type-keyed switch — the icon mapping was
11476
+ * registry-ized with the tab types.
11736
11477
  */
11737
- function pluginSettingsMapOf(value) {
11738
- if (value === null || typeof value !== "object" || Array.isArray(value)) return {};
11739
- const out = {};
11740
- for (const [id, blob] of Object.entries(value)) if (blob !== null && typeof blob === "object" && !Array.isArray(blob)) out[id] = blob;
11741
- return out;
11742
- }
11478
+ const wrapIcon = (Icon, defaultSize) => ({ size = defaultSize, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Icon, {
11479
+ size,
11480
+ className
11481
+ });
11482
+ const IconRefreshOutline16 = wrapIcon(FiRefreshCw, 16);
11483
+ const IconRefreshOutline14 = wrapIcon(FiRefreshCw, 14);
11484
+ const IconChevronRightOutline14 = wrapIcon(FiChevronRight, 14);
11485
+ const IconChevronLeftOutline14 = wrapIcon(FiChevronLeft, 14);
11486
+ const IconChevronDownOutline14 = wrapIcon(FiChevronDown, 14);
11487
+ const IconCodeOutline16 = wrapIcon(FiCode, 16);
11488
+ const IconCopyOutline16 = wrapIcon(FiCopy, 16);
11489
+ const IconDownloadOutline16 = wrapIcon(FiDownload, 16);
11490
+ const IconLinkOutline16 = wrapIcon(FiLink, 16);
11491
+ const IconLinkOutline14 = wrapIcon(FiLink, 14);
11492
+ const IconBranchOutline16 = wrapIcon(FiGitBranch, 16);
11493
+ const IconTrashOutline16 = wrapIcon(FiTrash2, 16);
11494
+ const IconWarningOutline16 = wrapIcon(FiAlertTriangle, 16);
11495
+ const IconCloseFill14 = wrapIcon(FiX, 14);
11496
+ const IconCloseOutline16 = wrapIcon(FiX, 16);
11497
+ const IconLoadingOutline16 = wrapIcon(FiLoader, 16);
11498
+ const IconPlusOutline16 = wrapIcon(FiPlus, 16);
11499
+ const IconSettingsOutline16 = wrapIcon(FiSettings, 16);
11500
+ const IconFolderOpen16 = wrapIcon(FiFolder, 16);
11501
+ const IconPanelLeftOutline16 = wrapIcon(FiSidebar, 16);
11502
+ const IconCheckOutline16 = wrapIcon(FiCheck, 16);
11503
+ /** User-manual glyph: an open book in the sidebar's 1.5px outline style. */
11504
+ const IconBookOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
11505
+ width: size,
11506
+ height: size,
11507
+ className,
11508
+ viewBox: "0 0 16 16",
11509
+ fill: "none",
11510
+ xmlns: "http://www.w3.org/2000/svg",
11511
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11512
+ d: "M2.25 3.5A1.5 1.5 0 0 1 3.75 2H7.5v11H3.75a1.5 1.5 0 0 0-1.5 1.5zM13.75 3.5A1.5 1.5 0 0 0 12.25 2H8.5v11h3.75a1.5 1.5 0 0 1 1.5 1.5z",
11513
+ stroke: "currentColor",
11514
+ strokeWidth: "1.5",
11515
+ strokeLinejoin: "round"
11516
+ })
11517
+ });
11743
11518
  /**
11744
- * Validate one enable-switch map (per-tab / per-viewer). Only boolean values
11745
- * survive; a non-object or a non-boolean entry falls back to the empty map /
11746
- * drops the entry — an absent key means the feature stays enabled.
11519
+ * Right-panel toggle glyph (the "侧拉" button): a frame with a filled strip
11520
+ * along its RIGHT edge, in the app's outline style (1.5px stroke,
11521
+ * currentColor).
11747
11522
  */
11748
- function booleanMapOf(value) {
11749
- if (value === null || typeof value !== "object" || Array.isArray(value)) return {};
11750
- const out = {};
11751
- for (const [key, item] of Object.entries(value)) if (typeof item === "boolean") out[key] = item;
11752
- return out;
11753
- }
11754
- /** Type guard for the title-bar scheme union (anything else falls back). */
11755
- function isTitleBarScheme(value) {
11756
- return typeof value === "string" && TITLE_BAR_SCHEMES.includes(value);
11757
- }
11758
- /**
11759
- * Whether the legacy document carries an explicit strip value (only
11760
- * reachable through the old gear popup): a stored number different from the
11761
- * default counts as "the user already configured something" and migrates to
11762
- * the `custom` scheme.
11763
- */
11764
- function hasLegacyStripValue(value) {
11765
- return typeof value === "number" && Number.isFinite(value) && value !== 40;
11766
- }
11767
- /**
11768
- * Read the resolved side card preferences through the plugin's settings route.
11769
- * @param settings - the settings wire face (the plugin api by default).
11770
- * @returns validated prefs, or the schema defaults when the route rejects,
11771
- * the namespace is absent, or a stored value violates the contract.
11772
- */
11773
- async function loadPrefs(settings) {
11774
- try {
11775
- return parsePrefs((await settings.settingsGet()).value);
11776
- } catch {
11777
- return { ...SIDEBAR_PREFS_DEFAULTS };
11778
- }
11779
- }
11523
+ const IconPanelRightOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
11524
+ width: size,
11525
+ height: size,
11526
+ className,
11527
+ viewBox: "0 0 16 16",
11528
+ fill: "none",
11529
+ xmlns: "http://www.w3.org/2000/svg",
11530
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
11531
+ x: "1.5",
11532
+ y: "2",
11533
+ width: "13",
11534
+ height: "12",
11535
+ rx: "2.5",
11536
+ stroke: "currentColor",
11537
+ strokeWidth: "1.5"
11538
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
11539
+ x: "10.5",
11540
+ y: "3.25",
11541
+ width: "2.75",
11542
+ height: "9.5",
11543
+ rx: "1",
11544
+ fill: "currentColor",
11545
+ stroke: "none"
11546
+ })]
11547
+ });
11780
11548
  /**
11781
- * Read the external-disable flag from the same settings route: the
11782
- * dsh-web-ui family's aionui-panel provider choice. True only when the host
11783
- * resolved `aionui-panel.rightPanel` to 'aionui-panel' — while true the
11784
- * sidebar must not mount (the two right panels are mutually exclusive). Any
11785
- * failure (route rejected, aionui absent, malformed response) reads false,
11786
- * so a missing family never hides the sidebar.
11787
- * @param settings - the settings wire face (the plugin api by default).
11788
- * @returns the external-disable flag (false on any failure).
11549
+ * Bottom-panel toggle glyph (the "底栏" button): a frame with a filled strip
11550
+ * along its BOTTOM edge, in the app's outline style.
11789
11551
  */
11790
- async function loadExternalDisable(settings) {
11791
- try {
11792
- return (await settings.settingsGet()).externalDisable === true;
11793
- } catch {
11794
- return false;
11795
- }
11796
- }
11797
- //#endregion
11798
- //#region src/client/FenceErrorNotice.tsx
11552
+ const IconPanelBottomOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
11553
+ width: size,
11554
+ height: size,
11555
+ className,
11556
+ viewBox: "0 0 16 16",
11557
+ fill: "none",
11558
+ xmlns: "http://www.w3.org/2000/svg",
11559
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
11560
+ x: "1.5",
11561
+ y: "2",
11562
+ width: "13",
11563
+ height: "12",
11564
+ rx: "2.5",
11565
+ stroke: "currentColor",
11566
+ strokeWidth: "1.5"
11567
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
11568
+ x: "3.25",
11569
+ y: "10",
11570
+ width: "9.5",
11571
+ height: "2.75",
11572
+ rx: "1",
11573
+ fill: "currentColor",
11574
+ stroke: "none"
11575
+ })]
11576
+ });
11799
11577
  /**
11800
- * The workspace-fence refusal surface. The raw wire text (`path "..." is
11801
- * outside workspace`) is never shown as-is: the editor / file-tree error
11802
- * slots render the localized reason plus a one-click global off — the click
11803
- * flips the `workspaceFence` pref through the settings route, adopts the
11804
- * returned document into the store (so every prefs reader — GitView's open
11805
- * guard, the settings page — flips with it), and calls `onDisabled` so the
11806
- * caller retries the failed operation immediately.
11578
+ * Terminal glyph in the app's outline style (1.5px stroke, currentColor):
11579
+ * a rounded frame with a prompt chevron and underscore cursor.
11807
11580
  */
11808
- function FenceErrorNotice(props) {
11809
- const { store, onDisabled } = props;
11810
- const [busy, setBusy] = (0, react.useState)(false);
11811
- const disable = () => {
11812
- if (busy) return;
11813
- setBusy(true);
11814
- api.settingsUpdate({ workspaceFence: false }).then((view) => {
11815
- store.setPrefs(parsePrefs(view.value));
11816
- onDisabled();
11817
- }).catch((error) => {
11818
- console.error("workspace fence disable failed", error);
11819
- setBusy(false);
11820
- });
11821
- };
11822
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11823
- className: sidebar_module_css_default.fenceError,
11824
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("fenceErrorReason") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
11825
- variant: "outline",
11826
- disabled: busy,
11827
- onClick: disable,
11828
- children: t("fenceDisableAction")
11829
- })]
11830
- });
11831
- }
11832
- //#endregion
11833
- //#region src/client/editor-load.ts
11834
- /** Decode the host's base64 head bytes into the sniffing buffer. */
11835
- function decodeHead(headBase64) {
11836
- const binary = atob(headBase64);
11837
- const bytes = new Uint8Array(binary.length);
11838
- for (let i = 0; i < binary.length; i += 1) bytes[i] = binary.charCodeAt(i);
11839
- return bytes;
11840
- }
11581
+ const IconTerminalOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
11582
+ width: size,
11583
+ height: size,
11584
+ className,
11585
+ viewBox: "0 0 16 16",
11586
+ fill: "none",
11587
+ xmlns: "http://www.w3.org/2000/svg",
11588
+ children: [
11589
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
11590
+ x: "1.5",
11591
+ y: "2.5",
11592
+ width: "13",
11593
+ height: "11",
11594
+ rx: "2",
11595
+ stroke: "currentColor",
11596
+ strokeWidth: "1.5"
11597
+ }),
11598
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11599
+ d: "M4.5 6.25 6.75 8 4.5 9.75",
11600
+ stroke: "currentColor",
11601
+ strokeWidth: "1.5",
11602
+ strokeLinecap: "round",
11603
+ strokeLinejoin: "round"
11604
+ }),
11605
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11606
+ d: "M8.5 10.4h3",
11607
+ stroke: "currentColor",
11608
+ strokeWidth: "1.5",
11609
+ strokeLinecap: "round"
11610
+ })
11611
+ ]
11612
+ });
11613
+ /** Diff glyph in the app's outline style: a file frame with a plus and a minus row. */
11614
+ const IconDiffOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
11615
+ width: size,
11616
+ height: size,
11617
+ className,
11618
+ viewBox: "0 0 16 16",
11619
+ fill: "none",
11620
+ xmlns: "http://www.w3.org/2000/svg",
11621
+ children: [
11622
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
11623
+ x: "1.5",
11624
+ y: "1.5",
11625
+ width: "13",
11626
+ height: "13",
11627
+ rx: "2.5",
11628
+ stroke: "currentColor",
11629
+ strokeWidth: "1.5"
11630
+ }),
11631
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11632
+ d: "M4 5h3M5.5 3.5v3",
11633
+ stroke: "currentColor",
11634
+ strokeWidth: "1.5",
11635
+ strokeLinecap: "round"
11636
+ }),
11637
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11638
+ d: "M9.5 12.5h2.5",
11639
+ stroke: "currentColor",
11640
+ strokeWidth: "1.5",
11641
+ strokeLinecap: "round"
11642
+ })
11643
+ ]
11644
+ });
11645
+ /** Upload glyph in the app's outline style: an arrow rising into a tray
11646
+ * (the file-manager "upload into the workspace" action). */
11647
+ const IconUploadOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
11648
+ width: size,
11649
+ height: size,
11650
+ className,
11651
+ viewBox: "0 0 16 16",
11652
+ fill: "none",
11653
+ xmlns: "http://www.w3.org/2000/svg",
11654
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11655
+ d: "M8 10V2.75M4.75 5.5 8 2.25 11.25 5.5",
11656
+ stroke: "currentColor",
11657
+ strokeWidth: "1.5",
11658
+ strokeLinecap: "round",
11659
+ strokeLinejoin: "round"
11660
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
11661
+ d: "M2.75 10.5v2.25A1.25 1.25 0 0 0 4 14h8a1.25 1.25 0 0 0 1.25-1.25V10.5",
11662
+ stroke: "currentColor",
11663
+ strokeWidth: "1.5",
11664
+ strokeLinecap: "round"
11665
+ })]
11666
+ });
11841
11667
  /**
11842
- * Dispatch one matched viewer's fetchStrategy. A missing viewer or a
11843
- * `binary-download` strategy both mean "no client-side renderer" → the
11844
- * download UI. `mediaUrlOf` builds the media URL for `mediaUrl`/`none`
11845
- * strategies (pure, but scope-bound — injected by the host).
11668
+ * Pin glyph in the app's outline style (1.5px stroke, currentColor): a pushpin
11669
+ * tilted to the lower-right. Used by the PinnedRail and the tab context menu's
11670
+ * pin entry (v0.17.0+).
11846
11671
  */
11847
- function planFirstMatch(viewer, mediaUrlOf) {
11848
- if (viewer === void 0 || viewer.fetchStrategy === "binary-download") return { kind: "binary" };
11849
- switch (viewer.fetchStrategy) {
11850
- case "mediaUrl":
11851
- case "none": return {
11852
- kind: "render",
11853
- viewer,
11854
- mediaUrl: mediaUrlOf()
11855
- };
11856
- case "custom": return {
11857
- kind: "customLoad",
11858
- viewer
11859
- };
11860
- case "fsRead": return {
11861
- kind: "fetchFsRead",
11862
- viewer
11863
- };
11864
- }
11865
- }
11866
- /**
11867
- * Decide what an fsRead result means for the editor.
11868
- * - Text: the first match stands (content is valid for any fsRead viewer).
11869
- * - Binary: the host head bytes enable a re-match — a `detect` viewer (e.g.
11870
- * a plugin sniffing a binary format) may claim the file. `custom` viewers
11871
- * load their own bytes; `mediaUrl`/`none` viewers render the media route;
11872
- * an fsRead viewer or nothing cannot render binary → download UI.
11873
- */
11874
- function planFsReadOutcome(viewer, result, rematch, mediaUrlOf) {
11875
- if (!result.binary) return {
11876
- kind: "render",
11877
- viewer,
11878
- content: result.content,
11879
- truncated: result.truncated
11880
- };
11881
- const claimed = result.head === void 0 ? void 0 : rematch(decodeHead(result.head));
11882
- if (claimed !== void 0 && claimed.fetchStrategy === "custom") return {
11883
- kind: "customLoad",
11884
- viewer: claimed
11885
- };
11886
- if (claimed !== void 0 && (claimed.fetchStrategy === "mediaUrl" || claimed.fetchStrategy === "none")) return {
11887
- kind: "render",
11888
- viewer: claimed,
11889
- mediaUrl: mediaUrlOf()
11890
- };
11891
- return { kind: "binary" };
11892
- }
11893
- //#endregion
11894
- //#region node_modules/.pnpm/react-icons@5.7.0_react@18.2.0/node_modules/react-icons/lib/iconContext.mjs
11895
- var DefaultContext = {
11896
- color: void 0,
11897
- size: void 0,
11898
- className: void 0,
11899
- style: void 0,
11900
- attr: void 0
11901
- };
11902
- var IconContext = react.default.createContext && /*#__PURE__*/ react.default.createContext(DefaultContext);
11903
- //#endregion
11904
- //#region node_modules/.pnpm/react-icons@5.7.0_react@18.2.0/node_modules/react-icons/lib/iconBase.mjs
11905
- var _excluded = [
11906
- "attr",
11907
- "size",
11908
- "title"
11909
- ];
11910
- function _objectWithoutProperties(e, t) {
11911
- if (null == e) return {};
11912
- var o, r, i = _objectWithoutPropertiesLoose(e, t);
11913
- if (Object.getOwnPropertySymbols) {
11914
- var n = Object.getOwnPropertySymbols(e);
11915
- for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);
11916
- }
11917
- return i;
11918
- }
11919
- function _objectWithoutPropertiesLoose(r, e) {
11920
- if (null == r) return {};
11921
- var t = {};
11922
- for (var n in r) if ({}.hasOwnProperty.call(r, n)) {
11923
- if (-1 !== e.indexOf(n)) continue;
11924
- t[n] = r[n];
11925
- }
11926
- return t;
11927
- }
11928
- function _extends() {
11929
- return _extends = Object.assign ? Object.assign.bind() : function(n) {
11930
- for (var e = 1; e < arguments.length; e++) {
11931
- var t = arguments[e];
11932
- for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
11933
- }
11934
- return n;
11935
- }, _extends.apply(null, arguments);
11936
- }
11937
- function ownKeys(e, r) {
11938
- var t = Object.keys(e);
11939
- if (Object.getOwnPropertySymbols) {
11940
- var o = Object.getOwnPropertySymbols(e);
11941
- r && (o = o.filter(function(r) {
11942
- return Object.getOwnPropertyDescriptor(e, r).enumerable;
11943
- })), t.push.apply(t, o);
11944
- }
11945
- return t;
11946
- }
11947
- function _objectSpread(e) {
11948
- for (var r = 1; r < arguments.length; r++) {
11949
- var t = null != arguments[r] ? arguments[r] : {};
11950
- r % 2 ? ownKeys(Object(t), !0).forEach(function(r) {
11951
- _defineProperty(e, r, t[r]);
11952
- }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r) {
11953
- Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
11954
- });
11955
- }
11956
- return e;
11957
- }
11958
- function _defineProperty(e, r, t) {
11959
- return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
11960
- value: t,
11961
- enumerable: !0,
11962
- configurable: !0,
11963
- writable: !0
11964
- }) : e[r] = t, e;
11965
- }
11966
- function _toPropertyKey(t) {
11967
- var i = _toPrimitive(t, "string");
11968
- return "symbol" == typeof i ? i : i + "";
11969
- }
11970
- function _toPrimitive(t, r) {
11971
- if ("object" != typeof t || !t) return t;
11972
- var e = t[Symbol.toPrimitive];
11973
- if (void 0 !== e) {
11974
- var i = e.call(t, r || "default");
11975
- if ("object" != typeof i) return i;
11976
- throw new TypeError("@@toPrimitive must return a primitive value.");
11977
- }
11978
- return ("string" === r ? String : Number)(t);
11979
- }
11980
- function Tree2Element(tree) {
11981
- return tree && tree.map((node, i) => /*#__PURE__*/ react.default.createElement(node.tag, _objectSpread({ key: i }, node.attr), Tree2Element(node.child)));
11982
- }
11983
- function GenIcon(data) {
11984
- return (props) => /*#__PURE__*/ react.default.createElement(IconBase, _extends({ attr: _objectSpread({}, data.attr) }, props), Tree2Element(data.child));
11985
- }
11986
- function IconBase(props) {
11987
- var elem = (conf) => {
11988
- var attr = props.attr, size = props.size, title = props.title, svgProps = _objectWithoutProperties(props, _excluded);
11989
- var computedSize = size || conf.size || "1em";
11990
- var className;
11991
- if (conf.className) className = conf.className;
11992
- if (props.className) className = (className ? className + " " : "") + props.className;
11993
- return /*#__PURE__*/ react.default.createElement("svg", _extends({
11994
- stroke: "currentColor",
11995
- fill: "currentColor",
11996
- strokeWidth: "0"
11997
- }, conf.attr, attr, svgProps, {
11998
- className,
11999
- style: _objectSpread(_objectSpread({ color: props.color || conf.color }, conf.style), props.style),
12000
- height: computedSize,
12001
- width: computedSize,
12002
- xmlns: "http://www.w3.org/2000/svg"
12003
- }), title && /*#__PURE__*/ react.default.createElement("title", null, title), props.children);
12004
- };
12005
- return IconContext !== void 0 ? /*#__PURE__*/ react.default.createElement(IconContext.Consumer, null, (conf) => elem(conf)) : elem(DefaultContext);
12006
- }
12007
- //#endregion
12008
- //#region node_modules/.pnpm/react-icons@5.7.0_react@18.2.0/node_modules/react-icons/si/index.mjs
12009
- function SiZedindustries(props) {
12010
- return GenIcon({
12011
- "tag": "svg",
12012
- "attr": {
12013
- "role": "img",
12014
- "viewBox": "0 0 24 24"
12015
- },
12016
- "child": [{
12017
- "tag": "path",
12018
- "attr": { "d": "M2.25 1.5a.75.75 0 0 0-.75.75v16.5H0V2.25A2.25 2.25 0 0 1 2.25 0h20.095c1.002 0 1.504 1.212.795 1.92L10.764 14.298h3.486V12.75h1.5v1.922a1.125 1.125 0 0 1-1.125 1.125H9.264l-2.578 2.578h11.689V9h1.5v9.375a1.5 1.5 0 0 1-1.5 1.5H5.185L2.562 22.5H21.75a.75.75 0 0 0 .75-.75V5.25H24v16.5A2.25 2.25 0 0 1 21.75 24H1.655C.653 24 .151 22.788.86 22.08L13.19 9.75H9.75v1.5h-1.5V9.375A1.125 1.125 0 0 1 9.375 8.25h5.314l2.625-2.625H5.625V15h-1.5V5.625a1.5 1.5 0 0 1 1.5-1.5h13.19L21.438 1.5z" },
12019
- "child": []
12020
- }]
12021
- })(props);
12022
- }
12023
- function SiCursor(props) {
12024
- return GenIcon({
12025
- "tag": "svg",
12026
- "attr": {
12027
- "role": "img",
12028
- "viewBox": "0 0 24 24"
12029
- },
12030
- "child": [{
12031
- "tag": "path",
12032
- "attr": { "d": "M11.503.131 1.891 5.678a.84.84 0 0 0-.42.726v11.188c0 .3.162.575.42.724l9.609 5.55a1 1 0 0 0 .998 0l9.61-5.55a.84.84 0 0 0 .42-.724V6.404a.84.84 0 0 0-.42-.726L12.497.131a1.01 1.01 0 0 0-.996 0M2.657 6.338h18.55c.263 0 .43.287.297.515L12.23 22.918c-.062.107-.229.064-.229-.06V12.335a.59.59 0 0 0-.295-.51l-9.11-5.257c-.109-.063-.064-.23.061-.23" },
12033
- "child": []
12034
- }]
12035
- })(props);
12036
- }
12037
- //#endregion
12038
- //#region node_modules/.pnpm/react-icons@5.7.0_react@18.2.0/node_modules/react-icons/vsc/index.mjs
12039
- function VscPinned(props) {
12040
- return GenIcon({
12041
- "tag": "svg",
12042
- "attr": {
12043
- "viewBox": "0 0 16 16",
12044
- "fill": "currentColor"
12045
- },
12046
- "child": [{
12047
- "tag": "path",
12048
- "attr": { "d": "M10.0589 2.44511C9.34701 1.73063 8.14697 1.90829 7.67261 2.79839L5.6526 6.58878L2.8419 7.52568C2.6775 7.58048 2.5532 7.71649 2.51339 7.88514C2.47357 8.0538 2.52392 8.23104 2.64646 8.35357L4.79291 10.5L2.14645 13.1465L2 14L2.85356 13.8536L5.50002 11.2071L7.64646 13.3536C7.76899 13.4761 7.94623 13.5265 8.11489 13.4866C8.28354 13.4468 8.41955 13.3225 8.47435 13.1581L9.41143 10.3469L13.1897 8.32423C14.0759 7.84982 14.2538 6.6551 13.5443 5.94305L10.0589 2.44511ZM8.55511 3.2687C8.71323 2.972 9.11324 2.91278 9.35055 3.15094L12.836 6.64889C13.0725 6.88624 13.0131 7.28448 12.7178 7.44262L8.76403 9.55921C8.65137 9.61952 8.56608 9.72068 8.52567 9.84191L7.7815 12.0744L3.92562 8.21853L6.15812 7.47436C6.27966 7.43385 6.38101 7.34823 6.44126 7.23518L8.55511 3.2687Z" },
12049
- "child": []
12050
- }]
12051
- })(props);
12052
- }
12053
- function VscPin(props) {
12054
- return GenIcon({
12055
- "tag": "svg",
12056
- "attr": {
12057
- "viewBox": "0 0 16 16",
12058
- "fill": "currentColor"
12059
- },
12060
- "child": [{
12061
- "tag": "path",
12062
- "attr": { "d": "M13.5 3C13.303 3 13.109 3.038 12.923 3.114L8.481 4.967L5.659 4.026C5.505 3.976 5.339 4.001 5.209 4.095C5.078 4.189 5.001 4.339 5.001 4.5V7H1.257L0.5 7.5L1.257 8H5V10.5C5 10.661 5.077 10.812 5.208 10.905C5.338 11 5.504 11.023 5.658 10.974L8.48 10.033L12.925 11.887C13.109 11.962 13.302 12 13.499 12C14.326 12 14.999 11.327 14.999 10.5V4.5C14.999 3.673 14.326 3 13.499 3H13.5ZM14 10.5C14 10.843 13.615 11.09 13.308 10.962L8.693 9.038C8.631 9.013 8.566 9 8.501 9C8.447 9 8.395 9.009 8.343 9.025L6.001 9.806V5.193L8.343 5.974C8.457 6.011 8.581 6.007 8.694 5.961L13.306 4.038C13.629 3.902 14.001 4.156 14.001 4.499V10.499L14 10.5Z" },
12063
- "child": []
12064
- }]
12065
- })(props);
12066
- }
12067
- function VscLinkExternal(props) {
12068
- return GenIcon({
12069
- "tag": "svg",
12070
- "attr": {
12071
- "viewBox": "0 0 16 16",
12072
- "fill": "currentColor"
12073
- },
12074
- "child": [{
12075
- "tag": "path",
12076
- "attr": { "d": "M15 9.5V12.5C15 13.879 13.879 15 12.5 15H3.5C2.121 15 1 13.879 1 12.5V3.5C1 2.121 2.121 1 3.5 1H6.5C6.776 1 7 1.224 7 1.5C7 1.776 6.776 2 6.5 2H3.5C2.673 2 2 2.673 2 3.5V12.5C2 13.327 2.673 14 3.5 14H12.5C13.327 14 14 13.327 14 12.5V9.5C14 9.224 14.224 9 14.5 9C14.776 9 15 9.224 15 9.5ZM14.5 1H9.5C9.224 1 9 1.224 9 1.5C9 1.776 9.224 2 9.5 2H13.293L9.147 6.146C8.952 6.341 8.952 6.658 9.147 6.853C9.245 6.951 9.373 6.999 9.501 6.999C9.629 6.999 9.757 6.95 9.855 6.853L14.001 2.707V6.5C14.001 6.776 14.225 7 14.501 7C14.777 7 15.001 6.776 15.001 6.5V1.5C15.001 1.224 14.777 1 14.501 1H14.5Z" },
12077
- "child": []
12078
- }]
12079
- })(props);
12080
- }
12081
- function VscFolder(props) {
12082
- return GenIcon({
12083
- "tag": "svg",
12084
- "attr": {
12085
- "viewBox": "0 0 16 16",
12086
- "fill": "currentColor"
12087
- },
12088
- "child": [{
12089
- "tag": "path",
12090
- "attr": { "d": "M2 4.5V6H5.58579C5.71839 6 5.84557 5.94732 5.93934 5.85355L7.29289 4.5L5.93934 3.14645C5.84557 3.05268 5.71839 3 5.58579 3H3.5C2.67157 3 2 3.67157 2 4.5ZM1 4.5C1 3.11929 2.11929 2 3.5 2H5.58579C5.98361 2 6.36514 2.15804 6.64645 2.43934L8.20711 4H12.5C13.8807 4 15 5.11929 15 6.5V11.5C15 12.8807 13.8807 14 12.5 14H3.5C2.11929 14 1 12.8807 1 11.5V4.5ZM2 7V11.5C2 12.3284 2.67157 13 3.5 13H12.5C13.3284 13 14 12.3284 14 11.5V6.5C14 5.67157 13.3284 5 12.5 5H8.20711L6.64645 6.56066C6.36514 6.84197 5.98361 7 5.58579 7H2Z" },
12091
- "child": []
12092
- }]
12093
- })(props);
12094
- }
12095
- function VscFolderOpened(props) {
12096
- return GenIcon({
12097
- "tag": "svg",
12098
- "attr": {
12099
- "viewBox": "0 0 16 16",
12100
- "fill": "currentColor"
12101
- },
12102
- "child": [{
12103
- "tag": "path",
12104
- "attr": { "d": "M2 4.5V9.10022L2.92389 7.5C3.45979 6.5718 4.45017 6 5.52196 6L11.9146 6C11.7087 5.4174 11.1531 5 10.5 5H7C6.86739 5 6.74021 4.94732 6.64645 4.85355L4.93934 3.14645C4.84557 3.05268 4.71839 3 4.58579 3H3.5C2.67157 3 2 3.67157 2 4.5ZM7.06895 13.9953C7.04641 13.9984 7.02339 14 7 14H3.5C2.11929 14 1 12.8807 1 11.5V4.5C1 3.11929 2.11929 2 3.5 2H4.58579C4.98361 2 5.36514 2.15804 5.64645 2.43934L7.20711 4H10.5C11.724 4 12.7426 4.87965 12.958 6.04127C14.605 6.34148 15.5443 8.22106 14.6616 9.75L13.0766 12.4953C12.5407 13.4235 11.5503 13.9953 10.4785 13.9953H7.06895ZM5.52196 7C4.80743 7 4.14718 7.3812 3.78991 8L2.20492 10.7453C1.62757 11.7453 2.34926 12.9953 3.50396 12.9953L10.4785 12.9953C11.193 12.9953 11.8533 12.6141 12.2105 11.9953L13.7955 9.25C14.3729 8.25 13.6512 7 12.4965 7L5.52196 7Z" },
12105
- "child": []
12106
- }]
12107
- })(props);
12108
- }
12109
- function VscFile(props) {
12110
- return GenIcon({
12111
- "tag": "svg",
12112
- "attr": {
12113
- "viewBox": "0 0 16 16",
12114
- "fill": "currentColor"
12115
- },
12116
- "child": [{
12117
- "tag": "path",
12118
- "attr": { "d": "M5 1C3.89543 1 3 1.89543 3 3V13C3 14.1046 3.89543 15 5 15H11C12.1046 15 13 14.1046 13 13V5.41421C13 5.01639 12.842 4.63486 12.5607 4.35355L9.64645 1.43934C9.36514 1.15804 8.98361 1 8.58579 1H5ZM4 3C4 2.44772 4.44772 2 5 2H8V4.5C8 5.32843 8.67157 6 9.5 6H12V13C12 13.5523 11.5523 14 11 14H5C4.44772 14 4 13.5523 4 13V3ZM11.7929 5H9.5C9.22386 5 9 4.77614 9 4.5V2.20711L11.7929 5Z" },
12119
- "child": []
12120
- }]
12121
- })(props);
12122
- }
12123
- //#endregion
12124
- //#region src/client/icons.tsx
12125
- /** User-manual glyph: an open book in the sidebar's 1.5px outline style. */
12126
- const IconBookOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
12127
- width: size,
12128
- height: size,
12129
- className,
12130
- viewBox: "0 0 16 16",
12131
- fill: "none",
12132
- xmlns: "http://www.w3.org/2000/svg",
12133
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
12134
- d: "M2.25 3.5A1.5 1.5 0 0 1 3.75 2H7.5v11H3.75a1.5 1.5 0 0 0-1.5 1.5zM13.75 3.5A1.5 1.5 0 0 0 12.25 2H8.5v11h3.75a1.5 1.5 0 0 1 1.5 1.5z",
12135
- stroke: "currentColor",
12136
- strokeWidth: "1.5",
12137
- strokeLinejoin: "round"
12138
- })
12139
- });
12140
- /**
12141
- * Right-panel toggle glyph (the "侧拉" button): a frame with a filled strip
12142
- * along its RIGHT edge, in the app's outline style (1.5px stroke,
12143
- * currentColor).
12144
- */
12145
- const IconPanelRightOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
12146
- width: size,
12147
- height: size,
12148
- className,
12149
- viewBox: "0 0 16 16",
12150
- fill: "none",
12151
- xmlns: "http://www.w3.org/2000/svg",
12152
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
12153
- x: "1.5",
12154
- y: "2",
12155
- width: "13",
12156
- height: "12",
12157
- rx: "2.5",
12158
- stroke: "currentColor",
12159
- strokeWidth: "1.5"
12160
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
12161
- x: "10.5",
12162
- y: "3.25",
12163
- width: "2.75",
12164
- height: "9.5",
12165
- rx: "1",
12166
- fill: "currentColor",
12167
- stroke: "none"
12168
- })]
12169
- });
12170
- /**
12171
- * Bottom-panel toggle glyph (the "底栏" button): a frame with a filled strip
12172
- * along its BOTTOM edge, in the app's outline style.
12173
- */
12174
- const IconPanelBottomOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
12175
- width: size,
12176
- height: size,
12177
- className,
12178
- viewBox: "0 0 16 16",
12179
- fill: "none",
12180
- xmlns: "http://www.w3.org/2000/svg",
12181
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
12182
- x: "1.5",
12183
- y: "2",
12184
- width: "13",
12185
- height: "12",
12186
- rx: "2.5",
12187
- stroke: "currentColor",
12188
- strokeWidth: "1.5"
12189
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
12190
- x: "3.25",
12191
- y: "10",
12192
- width: "9.5",
12193
- height: "2.75",
12194
- rx: "1",
12195
- fill: "currentColor",
12196
- stroke: "none"
12197
- })]
12198
- });
12199
- /**
12200
- * Terminal glyph in the app's outline style (1.5px stroke, currentColor):
12201
- * a rounded frame with a prompt chevron and underscore cursor.
12202
- */
12203
- const IconTerminalOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
12204
- width: size,
12205
- height: size,
12206
- className,
12207
- viewBox: "0 0 16 16",
12208
- fill: "none",
12209
- xmlns: "http://www.w3.org/2000/svg",
12210
- children: [
12211
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
12212
- x: "1.5",
12213
- y: "2.5",
12214
- width: "13",
12215
- height: "11",
12216
- rx: "2",
12217
- stroke: "currentColor",
12218
- strokeWidth: "1.5"
12219
- }),
12220
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
12221
- d: "M4.5 6.25 6.75 8 4.5 9.75",
12222
- stroke: "currentColor",
12223
- strokeWidth: "1.5",
12224
- strokeLinecap: "round",
12225
- strokeLinejoin: "round"
12226
- }),
12227
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
12228
- d: "M8.5 10.4h3",
12229
- stroke: "currentColor",
12230
- strokeWidth: "1.5",
12231
- strokeLinecap: "round"
12232
- })
12233
- ]
12234
- });
12235
- /** Diff glyph in the app's outline style: a file frame with a plus and a minus row. */
12236
- const IconDiffOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
12237
- width: size,
12238
- height: size,
12239
- className,
12240
- viewBox: "0 0 16 16",
12241
- fill: "none",
12242
- xmlns: "http://www.w3.org/2000/svg",
12243
- children: [
12244
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
12245
- x: "1.5",
12246
- y: "1.5",
12247
- width: "13",
12248
- height: "13",
12249
- rx: "2.5",
12250
- stroke: "currentColor",
12251
- strokeWidth: "1.5"
12252
- }),
12253
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
12254
- d: "M4 5h3M5.5 3.5v3",
12255
- stroke: "currentColor",
12256
- strokeWidth: "1.5",
12257
- strokeLinecap: "round"
12258
- }),
12259
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
12260
- d: "M9.5 12.5h2.5",
12261
- stroke: "currentColor",
12262
- strokeWidth: "1.5",
12263
- strokeLinecap: "round"
12264
- })
12265
- ]
12266
- });
12267
- /** Upload glyph in the app's outline style: an arrow rising into a tray
12268
- * (the file-manager "upload into the workspace" action). */
12269
- const IconUploadOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
12270
- width: size,
12271
- height: size,
12272
- className,
12273
- viewBox: "0 0 16 16",
12274
- fill: "none",
12275
- xmlns: "http://www.w3.org/2000/svg",
12276
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
12277
- d: "M8 10V2.75M4.75 5.5 8 2.25 11.25 5.5",
12278
- stroke: "currentColor",
12279
- strokeWidth: "1.5",
12280
- strokeLinecap: "round",
12281
- strokeLinejoin: "round"
12282
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
12283
- d: "M2.75 10.5v2.25A1.25 1.25 0 0 0 4 14h8a1.25 1.25 0 0 0 1.25-1.25V10.5",
12284
- stroke: "currentColor",
12285
- strokeWidth: "1.5",
12286
- strokeLinecap: "round"
12287
- })]
12288
- });
12289
- /**
12290
- * Pin glyph in the app's outline style (1.5px stroke, currentColor): a pushpin
12291
- * tilted to the lower-right. Used by the PinnedRail and the tab context menu's
12292
- * pin entry (v0.17.0+).
12293
- */
12294
- const IconPinOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
11672
+ const IconPinOutline16 = ({ size = 16, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
12295
11673
  width: size,
12296
11674
  height: size,
12297
11675
  className,
@@ -12485,6 +11863,1243 @@ window.__ModuleLoader__.load({
12485
11863
  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" })
12486
11864
  });
12487
11865
  //#endregion
11866
+ //#region src/client/paths.ts
11867
+ /**
11868
+ * Path projection helpers shared by the explorer rows: a path relative to
11869
+ * the session cwd (for the @-reference button and "copy relative path").
11870
+ * The fs-tree joins with '/' even on Windows, so both separators normalize
11871
+ * to '/' before comparison.
11872
+ *
11873
+ * This module is dependency-free (no node:path in the client bundle): the
11874
+ * host is the authority for path semantics, so this mirror deliberately
11875
+ * accepts a SUPERSET of absolute forms — anything a Windows host would emit
11876
+ * (drive letters, UNC) plus POSIX roots. A form the host would reject
11877
+ * (e.g. a backslash UNC path on a POSIX host) passes through here and then
11878
+ * fails loudly in the host's requireAbsolute instead of being silently
11879
+ * joined onto the cwd.
11880
+ */
11881
+ /**
11882
+ * Mirror of the host's absolute-path notion (see fs-tree.requireAbsolute):
11883
+ * POSIX roots, Windows drive letters, and Windows UNC network shares in
11884
+ * both backslash (`\\server\share\...`) and forward-slash
11885
+ * (`//server/share/...`) form. Deliberately a superset — see the module
11886
+ * comment — so a produced UNC path is never joined onto the cwd.
11887
+ */
11888
+ function isAbsolutePath(path) {
11889
+ return path.startsWith("/") || /^[A-Za-z]:[\\/]/.test(path) || /^[\\/]{2}[^\\/]/.test(path);
11890
+ }
11891
+ /**
11892
+ * The path relative to the session's working directory.
11893
+ * @param cwd - the explorer root (absolute).
11894
+ * @param path - an absolute entry path from the fs-tree.
11895
+ * @returns the relative path with '/' separators ('.' for the cwd itself),
11896
+ * or `path` unchanged when it lies outside the cwd.
11897
+ *
11898
+ * The prefix test is case-insensitive: Windows paths (and macOS's
11899
+ * case-insensitive volumes) may arrive with different casing than the cwd
11900
+ * row, and the containment decision must not depend on it. The returned
11901
+ * relative text keeps the caller's own casing.
11902
+ */
11903
+ function relativeTo(cwd, path) {
11904
+ const base = cwd.replace(/[\\/]+$/, "");
11905
+ const norm = (value) => value.replace(/\\/g, "/");
11906
+ const nBase = norm(base);
11907
+ const nPath = norm(path);
11908
+ if (nPath === nBase) return ".";
11909
+ if (nPath.toLowerCase().startsWith(`${nBase.toLowerCase()}/`)) return nPath.slice(nBase.length + 1);
11910
+ return path;
11911
+ }
11912
+ /**
11913
+ * Whether `target` lies under `base` (or equals it), tolerant of separator
11914
+ * style and — on Windows-style drive paths — of letter case. A client-side
11915
+ * mirror of the host's `isWithin` (fs-tree.ts) used to decide whether a
11916
+ * git-derived path can be opened in the editor (a linked worktree outside
11917
+ * the session workspace cannot: the host's workspace fence would reject it).
11918
+ */
11919
+ function isWithinWorkspace(base, target) {
11920
+ const norm = (value) => value.replace(/[\\/]+/g, "/").replace(/\/$/, "");
11921
+ const b = norm(base);
11922
+ const t = norm(target);
11923
+ const lb = b.toLowerCase();
11924
+ const lt = t.toLowerCase();
11925
+ return lt === lb || lt.startsWith(`${lb}/`);
11926
+ }
11927
+ //#endregion
11928
+ //#region src/client/produced-files.ts
11929
+ /**
11930
+ * Pure derivation of one turn's produced files from finalized conversation
11931
+ * nodes — a structural replica of ui-deliverables' `producedForClosing`
11932
+ * (the mutation tools' follow-along `locations`, by render intent: a diff
11933
+ * card or a generic edit card; reads/deletes/failures produce nothing).
11934
+ * Kept dependency-free so the takeover logic is unit-testable and the
11935
+ * replica is easy to diff against upstream when it drifts.
11936
+ */
11937
+ /** Paths a tool-result view reports as produced, by render intent. */
11938
+ function producedPaths(view) {
11939
+ if (view === null || typeof view !== "object") return [];
11940
+ const record = view;
11941
+ if (!(record.card === "diff" || record.card === "generic" && record.kind === "edit")) return [];
11942
+ if (!Array.isArray(record.locations)) return [];
11943
+ const paths = [];
11944
+ for (const location of record.locations) if (location !== null && typeof location === "object" && typeof location.path === "string") paths.push(location.path);
11945
+ return paths;
11946
+ }
11947
+ /**
11948
+ * Files produced by the turn the assistant at `seq` closes. Accumulation
11949
+ * resets on turn boundaries (a user message, or a node reporting a different
11950
+ * turn number); paths keep first-seen order and appear once.
11951
+ * @param nodes - snapshot nodes in surface order (structural, unknown-safe).
11952
+ * @param seq - the closing assistant's seq (the render site's anchor).
11953
+ * @returns produced paths; empty when the turn wrote nothing.
11954
+ */
11955
+ function producedForClosing(nodes, seq) {
11956
+ let pending = [];
11957
+ let seen = /* @__PURE__ */ new Set();
11958
+ let turn;
11959
+ for (const node of nodes) {
11960
+ if (node === null || typeof node !== "object") continue;
11961
+ const record = node;
11962
+ if (record.kind === "tool-result") {
11963
+ if (record.isError === true) continue;
11964
+ for (const path of producedPaths(record.callView)) {
11965
+ if (seen.has(path)) continue;
11966
+ seen.add(path);
11967
+ pending.push(path);
11968
+ }
11969
+ continue;
11970
+ }
11971
+ if (record.kind === "user") {
11972
+ turn = void 0;
11973
+ pending = [];
11974
+ seen = /* @__PURE__ */ new Set();
11975
+ } else if (typeof record.turn === "number") {
11976
+ if (turn !== void 0 && record.turn !== turn) {
11977
+ pending = [];
11978
+ seen = /* @__PURE__ */ new Set();
11979
+ }
11980
+ turn = record.turn;
11981
+ }
11982
+ if (record.kind === "assistant" && record.seq === seq) return pending;
11983
+ }
11984
+ return [];
11985
+ }
11986
+ /**
11987
+ * Claim the turn-tail chain only when the closing turn produced files.
11988
+ *
11989
+ * The authoritative source is the engine Turn data — the same value
11990
+ * ui-deliverables reads (`owner.turn.data.get('deliverables')`): a
11991
+ * `{ produced: [{ seq, path }, ...] }` record accumulated per Turn. The
11992
+ * node-based replica below stays as a fallback for compositions that do not
11993
+ * publish it.
11994
+ * @param owner - the turn-tail owner currency ({turn, seq, openFile}).
11995
+ * @returns produced paths as the matched value, or null to decline.
11996
+ */
11997
+ function selectProducedFiles(owner) {
11998
+ const record = owner;
11999
+ if (record === null || typeof record !== "object") return null;
12000
+ const seq = typeof record.seq === "number" ? record.seq : Number.POSITIVE_INFINITY;
12001
+ const data = record.turn?.data?.get?.("deliverables");
12002
+ if (data !== null && typeof data === "object" && Array.isArray(data.produced)) {
12003
+ const paths = [];
12004
+ const seen = /* @__PURE__ */ new Set();
12005
+ for (const item of data.produced) {
12006
+ if (item === null || typeof item !== "object") continue;
12007
+ const produced = item;
12008
+ if (typeof produced.path !== "string" || produced.path === "") continue;
12009
+ if (typeof produced.seq === "number" && produced.seq > seq) continue;
12010
+ if (seen.has(produced.path)) continue;
12011
+ seen.add(produced.path);
12012
+ paths.push(produced.path);
12013
+ }
12014
+ return paths.length === 0 ? null : paths;
12015
+ }
12016
+ if (!Array.isArray(record.nodes)) return null;
12017
+ const paths = producedForClosing(record.nodes, seq);
12018
+ return paths.length === 0 ? null : paths;
12019
+ }
12020
+ /**
12021
+ * Resolve a (possibly relative) path against the session cwd for the sidebar.
12022
+ * Absolute detection mirrors the host (see client/paths.isAbsolutePath):
12023
+ * POSIX roots, drive letters and UNC shares must not be joined onto the cwd.
12024
+ */
12025
+ function resolveSidebarPath(cwd, path) {
12026
+ if (isAbsolutePath(path)) return path;
12027
+ const base = cwd ?? "";
12028
+ if (base === "") return path;
12029
+ const separator = base.includes("\\") ? "\\" : "/";
12030
+ return `${base.replace(/[\\/]+$/, "")}${separator}${path}`;
12031
+ }
12032
+ //#endregion
12033
+ //#region src/client/openpath-intercept.ts
12034
+ /**
12035
+ * Whether a path is the "Show in folder" folder-reveal gesture. The stock
12036
+ * ui-deliverables row passes `'.'` (the session workspace root, resolved by
12037
+ * the chat view to `"<cwd>/."`); any path whose final segment is `.` is the
12038
+ * same gesture. A directory has no editor content, so these opens must reach
12039
+ * the explorer instead of an editor tab.
12040
+ */
12041
+ function isFolderRevealPath(path) {
12042
+ if (path === "." || path === "./") return true;
12043
+ const trimmed = path.replace(/[\\/]+$/, "");
12044
+ return trimmed === "." || /[\\/]\.$/.test(trimmed);
12045
+ }
12046
+ /**
12047
+ * Wrap `workspaces.openPath`: intercepted calls open the file in the sidebar
12048
+ * editor instead of the Host OS and resolve as success (the original's
12049
+ * callers ignore the result); anything that declines falls through to the
12050
+ * original method untouched. The one exception is the folder-reveal gesture,
12051
+ * which is routed to {@link OpenPathInterceptDeps.revealInExplorer} instead.
12052
+ * @param workspaces - the client workspaces service to wrap.
12053
+ * @param deps - per-call takeover decisions.
12054
+ * @returns the disposer restoring the original method (HMR-safe).
12055
+ */
12056
+ function wrapOpenPath(workspaces, deps) {
12057
+ const original = workspaces.openPath;
12058
+ workspaces.openPath = (path) => {
12059
+ if (deps.takeoverEnabled()) {
12060
+ const sessionId = deps.currentSessionId();
12061
+ if (sessionId !== void 0) {
12062
+ if (isFolderRevealPath(path)) deps.revealInExplorer(path, sessionId);
12063
+ else deps.openInSidebar(path, sessionId);
12064
+ return Promise.resolve();
12065
+ }
12066
+ }
12067
+ return original.call(workspaces, path);
12068
+ };
12069
+ return () => {
12070
+ workspaces.openPath = original;
12071
+ };
12072
+ }
12073
+ //#endregion
12074
+ //#region src/client/current-session.ts
12075
+ /**
12076
+ * Read the session selected by the host's scoped-session adapter.
12077
+ *
12078
+ * Newer hosts deliberately removed `sessions.list.current`: selection is UI
12079
+ * scope state, not catalog state. The adapter is authoritative on both old
12080
+ * and new hosts and tracks main-view retain/release transitions.
12081
+ */
12082
+ function currentSessionId(ctx) {
12083
+ return ctx.uiSession.adapter.current.getSnapshot().key;
12084
+ }
12085
+ /** React subscription to the same authoritative current-session source. */
12086
+ function useCurrentSessionId(ctx) {
12087
+ const source = ctx.uiSession.adapter.current;
12088
+ return (0, react.useSyncExternalStore)((0, react.useCallback)((listener) => source.subscribe(listener), [source]), (0, react.useCallback)(() => source.getSnapshot().key, [source]));
12089
+ }
12090
+ //#endregion
12091
+ //#region \0dsh-css:/Users/shiguifeng/IdeaProjects/chonggou/DSH-better-sidebar/src/client/sidebar.module.css.mjs
12092
+ const css$5 = ".FV0QMq_releaseNotesOverlay{z-index:120;pointer-events:auto;background:color-mix(in srgb, var(--dsw-alias-bg-base) 72%, transparent);place-items:center;padding:24px;display:grid;position:fixed;inset:0}.FV0QMq_releaseNotesDialog{width:min(720px,100%);max-height:min(760px,100vh - 48px);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);border-radius:12px;flex-direction:column;display:flex;overflow:hidden}.FV0QMq_releaseNotesHeader,.FV0QMq_releaseNotesFooter{align-items:center;padding:16px 20px;display:flex}.FV0QMq_releaseNotesHeader{border-bottom:1px solid var(--dsw-alias-border-l1);justify-content:space-between;gap:16px}.FV0QMq_releaseNotesHeader h2{font:var(--dsw-font-s-18);margin:0}.FV0QMq_releaseNotesContent{min-height:120px;font:var(--dsw-font-s-14);padding:20px;overflow:auto}.FV0QMq_releaseNotesFooter{border-top:1px solid var(--dsw-alias-border-l1);justify-content:flex-end}.FV0QMq_releaseNotesIconButton,.FV0QMq_releaseNotesButton{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);cursor:pointer}.FV0QMq_releaseNotesIconButton:hover,.FV0QMq_releaseNotesButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_releaseNotesIconButton{width:32px;height:32px;font:var(--dsw-font-s-18);border-radius:50%;padding:0}.FV0QMq_releaseNotesButton{min-width:84px;min-height:36px;font:var(--dsw-font-s-14);border-radius:8px;padding:6px 16px}.FV0QMq_updateList{flex-direction:column;gap:10px;margin:0;padding:0;list-style:none;display:flex}.FV0QMq_updateList li{font:var(--dsw-font-s-14);justify-content:space-between;align-items:center;gap:16px;display:flex}.FV0QMq_updateVersions{font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-secondary)}.FV0QMq_updateOk{color:var(--dsw-alias-state-success-primary)}.FV0QMq_updateError,.FV0QMq_updateErrorText{color:var(--dsw-alias-state-error-primary)}.FV0QMq_updateErrorText{white-space:pre-wrap;font:var(--dsw-font-s-14);margin:12px 0 0}.FV0QMq_updateCommand{background:var(--dsw-alias-bg-layer-3);font-family:var(--dsw-font-code,var(--ds-font-family-code,monospace));white-space:pre-wrap;word-break:break-all;user-select:all;border-radius:6px;margin:8px 0 0;padding:8px 10px;font-size:12px;overflow-x:auto}.FV0QMq_updateSettingsRow{justify-content:space-between;align-items:center;gap:16px;display:flex}.FV0QMq_updateSettingsText{flex-direction:column;gap:2px;min-width:0;display:flex}.FV0QMq_updateSettingsTitle{font:var(--dsw-font-s-14)}.FV0QMq_updateSettingsDesc{font:var(--dsw-font-s-13);color:var(--dsw-alias-label-secondary)}.FV0QMq_updateSettingsBlock{flex-direction:column;gap:12px;display:flex}.FV0QMq_updateBody{font:var(--dsw-font-s-14);margin:20px 0 0}.FV0QMq_updateFooter{justify-content:flex-end;gap:8px;margin-top:4px;display:flex}.FV0QMq_updateInline{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;padding:16px}[data-dsh-panel-host]{z-index:25;pointer-events:none;position:fixed;inset:0;overflow:clip}[data-dsh-panel-host][data-dsh-panel-host-degraded]{position:absolute;top:0;left:0}[data-dsh-pinned-sessions]{flex:none;min-width:0}.FV0QMq_pinnedSessions{border-bottom:1px solid var(--dsw-alias-border-l1);margin:0 0 6px;padding:4px 0 6px}.FV0QMq_pinnedSessionsHeading{height:36px;color:var(--dsw-alias-label-primary);font:var(--dsw-font-s-14);align-items:center;padding:0 4px;display:flex}.FV0QMq_pinnedSessionsList{gap:1px;display:grid}[data-slot=sidebar\\.workspaces] [class*=_sessionRow][data-dsh-session-pinned]{display:none}.FV0QMq_pinnedSessionRow{border-radius:8px;align-items:center;min-width:0;height:32px;display:flex;position:relative}.FV0QMq_pinnedSessionRow:hover,.FV0QMq_pinnedSessionRow:focus-within{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_pinnedSessionOpen,.FV0QMq_pinnedSessionMore,.FV0QMq_pinnedSessionMenu button{font:inherit;cursor:pointer;border:0}.FV0QMq_pinnedSessionOpen{min-width:0;height:100%;color:var(--dsw-alias-label-primary);text-align:left;font:var(--dsw-font-s-14);background:0 0;flex:1;align-items:center;gap:8px;padding:0 6px 0 8px;display:flex}.FV0QMq_pinnedSessionOpen[aria-current=page]{color:var(--dsw-alias-brand-primary)}.FV0QMq_pinnedSessionDot{background:var(--dsw-alias-label-tertiary);border-radius:50%;flex:none;width:6px;height:6px}.FV0QMq_pinnedSessionDot[data-running]{background:var(--dsw-alias-state-success-primary)}.FV0QMq_pinnedSessionTitle{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.FV0QMq_pinnedSessionMore{width:28px;height:28px;color:var(--dsw-alias-label-secondary);letter-spacing:1px;background:0 0;border-radius:50%;justify-content:center;align-items:center;margin-right:2px;padding:0;display:inline-flex}.FV0QMq_pinnedSessionMore:hover,.FV0QMq_pinnedSessionMore[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_pinnedSessionMenu{z-index:1101;box-sizing:border-box;border:1px solid var(--dsw-alias-border-inverted);background:var(--dsw-alias-bg-layer-2);border-radius:10px;min-width:150px;padding:4px;position:absolute;top:calc(100% + 2px);right:0}.FV0QMq_pinnedSessionMenu button{width:100%;min-height:32px;color:var(--dsw-alias-label-primary);text-align:left;font:var(--dsw-font-xxs-12);background:0 0;border-radius:7px;align-items:center;gap:8px;padding:5px 8px;display:flex}.FV0QMq_pinnedSessionMenu button:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_pinnedSessionMenuDivider{background:var(--dsw-alias-border-l1);height:1px;margin:4px}.FV0QMq_accountMenu{z-index:3;box-sizing:border-box;width:var(--dsh-account-menu-width,280px);border-top:1px solid var(--dsw-alias-border-l2);border-right:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);pointer-events:auto;position:absolute;bottom:0;left:0}.FV0QMq_accountTrigger,.FV0QMq_accountItem{color:var(--dsw-alias-fg-base);font:inherit;cursor:pointer;border:0}.FV0QMq_accountTrigger{box-sizing:border-box;width:100%;min-height:52px;padding:10px 14px max(10px, env(safe-area-inset-bottom));background:var(--dsw-alias-bg-layer-1);font-family:var(--dsw-font-family-body);font-size:var(--dsw-font-size-body-sm);line-height:var(--dsw-font-line-height-body-sm);transition:background var(--ds-transition-duration-slow) var(--ds-ease-in-out);border-radius:0;align-items:center;gap:8px;display:flex}.FV0QMq_accountTrigger:hover,.FV0QMq_accountTrigger[aria-expanded=true]{background:var(--dsw-alias-bg-hover)}.FV0QMq_accountTrigger:focus-visible,.FV0QMq_accountItem:focus-visible{outline:2px solid var(--dsw-alias-border-accent);outline-offset:2px}.FV0QMq_accountAvatar{background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);width:28px;height:28px;color:var(--dsw-alias-fg-accent);border-radius:50%;flex:none;place-items:center;font-weight:600;display:grid;position:relative}.FV0QMq_accountName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.FV0QMq_accountDropdown{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);z-index:1;border-radius:12px;width:min(252px,100% - 16px);padding:10px 8px 8px;display:grid;position:absolute;bottom:calc(100% + 8px);left:8px}.FV0QMq_accountDropdownHeader{min-height:36px;font-family:var(--dsw-font-family-body);font-size:var(--dsw-font-size-body-sm);line-height:var(--dsw-font-line-height-body-sm);align-items:center;gap:8px;padding:0 8px 8px;display:flex}.FV0QMq_accountMenuDivider{background:var(--dsw-alias-border-l2);height:1px;margin:0 4px 6px}.FV0QMq_accountItem{text-align:left;min-height:32px;font:var(--dsw-font-s-14);background:0 0;border-radius:7px;align-items:center;gap:8px;padding:0 10px;display:flex}.FV0QMq_accountItem:hover{background:var(--dsw-alias-bg-hover)}.FV0QMq_accountPresence{box-sizing:content-box;border:2px solid var(--dsw-alias-bg-layer-2);background:var(--dsw-alias-fg-accent);border-radius:50%;flex:none;width:6px;height:6px;margin-left:auto}.FV0QMq_accountTrigger .FV0QMq_accountPresence{border-color:var(--dsw-alias-bg-layer-1)}.FV0QMq_toggleCluster{top:var(--dsh-native-sidebar-toggle-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}.FV0QMq_toggleClusterNative{z-index:auto;flex:none;align-items:center;position:static;inset:auto}button[data-dsh-better-sidebar-toggle]{display:none}body:not([data-dsh-native-sidebar-toggle]) .FV0QMq_panel:not(.FV0QMq_panelHidden) .FV0QMq_tabBar{padding-right:var(--dsh-sidebar-toggle-reserve,188px)}.FV0QMq_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}.FV0QMq_manualButton{min-width:94px;height:28px;color:var(--dsw-alias-label-secondary);font:var(--dsw-font-xxs-12);white-space:nowrap;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:6px;flex:none;justify-content:center;align-items:center;gap:6px;margin-right:4px;padding:0 10px;display:inline-flex}.FV0QMq_manualButton:hover,.FV0QMq_toggleButton:hover:not(:disabled):not([aria-disabled=true]){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_toggleButton:disabled,.FV0QMq_toggleButton[aria-disabled=true]{opacity:.4;cursor:default}.FV0QMq_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}.FV0QMq_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%)}.FV0QMq_panel[data-dragging]{transition:none}.FV0QMq_panelResize{cursor:col-resize;z-index:2;touch-action:none;width:8px;position:absolute;top:0;bottom:0;left:-4px}.FV0QMq_panelResizeActive{background:var(--dsw-alias-interactive-bg-hover-accent)}.FV0QMq_panelBody{flex:1;min-width:0;min-height:0;display:flex}.FV0QMq_bottomPanel{z-index:40;background:var(--dsw-alias-bg-layer-1);border-top:1px solid var(--dsw-alias-border-l2);pointer-events:auto;padding-bottom:env(safe-area-inset-bottom);transition:transform var(--ds-transition-duration-slow) var(--ds-ease-in-out), height var(--ds-transition-duration-slow) var(--ds-ease-in-out);flex-direction:column;display:flex;position:absolute;bottom:0}.FV0QMq_bottomPanelHidden{pointer-events:none;visibility:hidden;transition:transform var(--ds-transition-duration-slow) var(--ds-ease-in-out), height var(--ds-transition-duration-slow) var(--ds-ease-in-out), visibility 0s linear var(--ds-transition-duration-slow);transform:translateY(102%)}.FV0QMq_bottomPanel[data-dragging]{transition:none}.FV0QMq_panel,.FV0QMq_bottomPanel{contain:layout style}body[data-dsh-sidebar-dragging] .FV0QMq_panel,body[data-dsh-sidebar-dragging] .FV0QMq_bottomPanel{will-change:transform}.FV0QMq_bottomResize{cursor:row-resize;z-index:2;touch-action:none;height:8px;position:absolute;top:-4px;left:0;right:0}.FV0QMq_bottomResizeActive{background:var(--dsw-alias-interactive-bg-hover-accent)}.FV0QMq_bottomClose{z-index:4;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;position:absolute;top:3px;right:6px}.FV0QMq_bottomClose:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_bottomPanel .FV0QMq_tabBar{padding-right:40px}.FV0QMq_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}.FV0QMq_floatWindowDragging{will-change:left, top, width, height}.FV0QMq_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}.FV0QMq_floatWindowDragging .FV0QMq_floatHeader{cursor:grabbing}.FV0QMq_floatTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.FV0QMq_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}.FV0QMq_floatClose:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_floatContent{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;overflow:hidden}.FV0QMq_floatResize{z-index:2;cursor:nwse-resize;touch-action:none;width:14px;height:14px;position:absolute;bottom:0;right:0}.FV0QMq_floatResize:hover{background:var(--dsw-alias-interactive-bg-hover-accent)}.FV0QMq_pane[data-dsh-float-dock-over]{outline:2px dashed var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-2px}.FV0QMq_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}.FV0QMq_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}.FV0QMq_toggleCluster,.FV0QMq_toggleButton,.FV0QMq_manualButton,.FV0QMq_tabBar,.FV0QMq_floatHeader{-webkit-app-region:no-drag}body[data-dsh-title-bar-compat] .FV0QMq_toggleCluster{top:var(--dsh-native-sidebar-toggle-top,calc(var(--dsh-title-bar-strip,40px) + 3px))}body[data-dsh-title-bar-compat] .FV0QMq_panel{padding-top:var(--dsh-title-bar-strip,40px)}.FV0QMq_cornerHandle{left:-6px;bottom:calc(var(--dsh-sidebar-height,0px) + 6px);z-index:2;cursor:nwse-resize;touch-action:none;width:12px;height:12px;position:absolute}.FV0QMq_cornerHandle:hover,.FV0QMq_cornerHandle[data-dragging]{background:var(--dsw-alias-interactive-bg-hover-accent)}.FV0QMq_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}.FV0QMq_iconButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_iconButton:disabled{opacity:.4;cursor:default}.FV0QMq_workbench,.FV0QMq_split{flex:1;min-width:0;min-height:0;display:flex}.FV0QMq_splitRow{flex-direction:row}.FV0QMq_splitCol{flex-direction:column}.FV0QMq_splitChild{display:flex;position:relative;overflow:hidden}.FV0QMq_divider{z-index:3;touch-action:none;flex:none;position:relative}.FV0QMq_dividerRow:after,.FV0QMq_dividerCol:after{content:\"\";background:var(--dsw-alias-border-l2);transition:background var(--ds-transition-duration-slow) var(--ds-ease-in-out);position:absolute}.FV0QMq_dividerRow{cursor:col-resize;width:7px;margin:0 -2px}.FV0QMq_dividerRow:after{width:1px;top:0;bottom:0;left:50%;transform:translate(-50%)}.FV0QMq_dividerCol{cursor:row-resize;height:7px;margin:-2px 0}.FV0QMq_dividerCol:after{height:1px;top:50%;left:0;right:0;transform:translateY(-50%)}.FV0QMq_divider:hover:after,.FV0QMq_dividerActive:after{background:var(--dsw-alias-interactive-bg-hover-accent)}.FV0QMq_pane{background:var(--dsw-alias-bg-base);flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;position:relative}.FV0QMq_paneDrop{outline:1px solid var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-1px}.FV0QMq_dropOverlay{z-index:6;pointer-events:none;background:var(--dsw-alias-interactive-bg-hover-accent);opacity:.5;position:absolute}.FV0QMq_dropLeft{width:25%;top:0;bottom:0;left:0}.FV0QMq_dropRight{width:25%;top:0;bottom:0;right:0}.FV0QMq_dropUp{height:25%;top:0;left:0;right:0}.FV0QMq_dropDown{height:25%;bottom:0;left:0;right:0}.FV0QMq_dropCenter{outline:2px dashed var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-2px;background:0 0;inset:25%}.FV0QMq_paneContent{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.FV0QMq_paneTab{flex-direction:column;flex:1;min-height:0;display:flex}.FV0QMq_paneTabHidden{display:none}.FV0QMq_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}.FV0QMq_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}.FV0QMq_paneCard:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l2)}.FV0QMq_paneCard:disabled{opacity:.45;cursor:default}.FV0QMq_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}.FV0QMq_tabBarDrop{outline:1px dashed var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-1px}.FV0QMq_tabList{scrollbar-width:none;flex:1;min-width:0;display:flex;overflow-x:auto}.FV0QMq_tabList::-webkit-scrollbar{display:none}.FV0QMq_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}.FV0QMq_tab:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_tabActive{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-active)}.FV0QMq_tabTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.FV0QMq_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}.FV0QMq_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}.FV0QMq_tabClose:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_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}.FV0QMq_tabBarPlus:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_pinnedTab{color:var(--dsw-alias-label-tertiary);font-style:italic}.FV0QMq_pinnedTab:hover{color:var(--dsw-alias-label-secondary)}.FV0QMq_explorer{flex-direction:column;flex:1;min-height:0;display:flex}.FV0QMq_explorerHeader{flex:none;justify-content:space-between;align-items:center;gap:8px;height:36px;padding:0 8px 0 12px;display:flex}.FV0QMq_explorerRoot{font:var(--dsw-font-s-14);color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.FV0QMq_explorerBody{flex:1;min-height:0;padding:4px 8px 8px;overflow:hidden auto}.FV0QMq_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:FV0QMq_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}.FV0QMq_explorerRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_explorerRowRevealed{background:var(--dsw-alias-state-business-tertiary)}.FV0QMq_explorerRowRevealed+.FV0QMq_explorerRowRevealed{border-top-left-radius:0;border-top-right-radius:0}.FV0QMq_explorerRowRevealed:has(+.FV0QMq_explorerRowRevealed){border-bottom-right-radius:0;border-bottom-left-radius:0}.FV0QMq_explorerDir{font:var(--dsw-font-s-strong-14)}.FV0QMq_explorerHidden{opacity:.45}.FV0QMq_explorerSymlink{color:var(--dsw-alias-label-tertiary);flex:none}.FV0QMq_explorerBroken .FV0QMq_explorerName{color:var(--dsw-alias-state-error-primary)}.FV0QMq_explorerName{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.FV0QMq_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}.FV0QMq_explorerRef:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_explorerRow:hover .FV0QMq_explorerRef,.FV0QMq_explorerRow:focus-within .FV0QMq_explorerRef{display:inline-flex}.FV0QMq_explorerCopied{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary);flex:none}.FV0QMq_explorerError{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-error-primary);cursor:default}@keyframes FV0QMq_dsh-row-in{0%{opacity:0}}.FV0QMq_explorerEmpty{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);text-align:center;padding:16px}.FV0QMq_explorerRowDropTarget{background:var(--dsw-alias-interactive-bg-hover);outline:1px dashed var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-1px}.FV0QMq_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:FV0QMq_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}.FV0QMq_uploadDropHero{flex-direction:column;align-items:center;gap:10px;max-width:100%;padding-top:8px;display:flex}.FV0QMq_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}.FV0QMq_uploadDropZoneText{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.FV0QMq_uploadDropChatHint{z-index:1002;pointer-events:none;animation:FV0QMq_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}.FV0QMq_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}.FV0QMq_uploadOverlay{z-index:30;background:var(--dsw-alias-bg-mask-1);backdrop-filter:var(--dsw-mask-blur);animation:FV0QMq_dsh-row-in .15s var(--ds-ease-in-out);justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.FV0QMq_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}.FV0QMq_uploadOverlayTitle{font:var(--dsw-font-s-strong-14);color:var(--dsw-alias-label-primary);align-items:center;gap:8px;display:flex}.FV0QMq_uploadOverlayTitle>svg{flex:none}.FV0QMq_uploadOverlayTitle>span{white-space:nowrap;text-overflow:ellipsis;min-width:0;overflow:hidden}.FV0QMq_uploadOverlayProgress{background:var(--dsw-alias-border-l2);border-radius:3px;height:6px;overflow:hidden}.FV0QMq_uploadOverlayProgressFill{background:var(--dsw-alias-interactive-bg-hover-accent);height:100%;transition:width .15s var(--ds-ease-in-out);border-radius:3px}.FV0QMq_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}.FV0QMq_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}.FV0QMq_uploadOverlayCancel:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l2)}.FV0QMq_uploadOverlayCancel:disabled{opacity:.4;cursor:default}.FV0QMq_editor{flex-direction:column;flex:1;min-height:0;display:flex}.FV0QMq_editorHeader{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:6px;padding:6px 8px;display:flex}.FV0QMq_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}.FV0QMq_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}.FV0QMq_editorPathInput:focus{border-color:var(--dsw-alias-border-l2);outline:none}.FV0QMq_editorTreeToggleActive{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-active)}.FV0QMq_editorBody{flex:1;min-height:0;display:flex}.FV0QMq_editorMain{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.FV0QMq_editorTreeDock{border-left:1px solid var(--dsw-alias-border-l1);flex:none;min-height:0;display:flex;position:relative}.FV0QMq_editorTreeResize{cursor:col-resize;touch-action:none;z-index:3;width:6px;position:absolute;top:0;bottom:0;left:0}.FV0QMq_editorTreeResize:hover{background:var(--dsw-alias-border-l2)}.FV0QMq_editorTreePanel{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;position:relative}.FV0QMq_editorTreePanelFull{flex:1}.FV0QMq_editorTreeSearch{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:6px;padding:6px 8px;display:flex}.FV0QMq_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}.FV0QMq_editorSearchInput:focus{border-color:var(--dsw-alias-border-l2);outline:none}.FV0QMq_editorSearchHint{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);padding:8px 12px}.FV0QMq_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}.FV0QMq_editorSearchResult:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_editorStatus{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary)}.FV0QMq_editorStatusError{color:var(--dsw-alias-state-error-primary)}.FV0QMq_dirtyDot{background:var(--dsw-alias-state-warn-primary);border-radius:50%;flex:none;width:7px;height:7px}.FV0QMq_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}.FV0QMq_orphanedType{opacity:.7;overflow-wrap:anywhere;margin-top:8px;font-size:12px;display:block}.FV0QMq_editorBinary{text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;padding:24px 16px;display:flex}.FV0QMq_editorBinaryNotice{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary)}.FV0QMq_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}.FV0QMq_editorDownloadLink:hover{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l2)}.FV0QMq_editorError{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-error-primary);padding:12px 16px}.FV0QMq_fenceError{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-error-primary);flex-wrap:wrap;align-items:center;gap:8px;padding:8px 16px;display:flex}.FV0QMq_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}.FV0QMq_sandboxStatus{font:var(--dsw-font-xxxs-11);flex:none;align-items:center;gap:8px;padding:4px 10px;display:flex}.FV0QMq_sandboxStatusOn{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);border-bottom:1px solid var(--dsw-alias-border-l1)}.FV0QMq_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)}.FV0QMq_sandboxDot{background:var(--dsw-alias-state-success-primary);border-radius:50%;flex:none;width:6px;height:6px}.FV0QMq_sandboxStatusOff .FV0QMq_sandboxDot{background:var(--dsw-alias-state-error-primary)}.FV0QMq_sandboxStatusText{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.FV0QMq_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}.FV0QMq_sandboxAction:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_editorHtml{background:var(--dsw-alias-bg-base);border:none;flex:1;width:100%;min-height:0}.FV0QMq_browser{flex-direction:column;flex:1;min-height:0;display:flex}.FV0QMq_browserBar{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:4px;padding:6px 8px;display:flex}.FV0QMq_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}.FV0QMq_browserInput:focus{border-color:var(--dsw-alias-border-l2);outline:none}.FV0QMq_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}.FV0QMq_browserFrame{background:var(--dsw-alias-bg-base);border:none;flex:1;width:100%;min-height:0}.FV0QMq_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}.FV0QMq_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}.FV0QMq_browserBlockedTitle{font:var(--dsw-font-xxs-strong-12);color:var(--dsw-alias-label-primary)}.FV0QMq_browserBlockedDesc{max-width:280px;font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-secondary)}.FV0QMq_browserBlockedActions{gap:8px;margin-top:6px;display:flex}.FV0QMq_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}.FV0QMq_browserBlockedButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_editorCm{background:0 0;flex:1;min-height:0;overflow:hidden}.FV0QMq_editorCmHidden{display:none}.FV0QMq_editorCm .cm-editor{height:100%}.FV0QMq_editorCm .cm-scroller{padding:12px 16px}.FV0QMq_editorCm .cm-editor.cm-focused{outline:none}.FV0QMq_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}.FV0QMq_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}.FV0QMq_editorModeButton:hover{color:var(--dsw-alias-label-primary)}.FV0QMq_editorModeActive{background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary)}.FV0QMq_editorImageWrap{flex:1;justify-content:center;align-items:center;min-height:0;padding:12px;display:flex;overflow:auto}.FV0QMq_editorImage{object-fit:contain;max-width:100%;max-height:100%}.FV0QMq_editorMd{min-height:0;font:var(--dsw-font-xs-13);flex:1;padding:12px 16px;overflow-y:auto}.FV0QMq_mermaidWrap{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:6px;margin:6px 0;overflow:hidden}.FV0QMq_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}.FV0QMq_mermaidInfo{font:var(--dsw-font-xxxs-strong-11);color:var(--dsw-alias-label-tertiary)}.FV0QMq_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}.FV0QMq_mermaidCopy:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_mermaidBody{cursor:zoom-in;justify-content:center;padding:10px;display:flex;overflow:auto}.FV0QMq_mermaidBody svg{max-width:100%;height:auto}.FV0QMq_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}.FV0QMq_mermaidCode{font:var(--dsw-font-xxxs-11);margin:0;padding:8px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;overflow:auto}.FV0QMq_mermaidMarkdown .md-code-block[data-mermaid-processed]{display:contents}.FV0QMq_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}.FV0QMq_mermaidModalToolbar{z-index:10;gap:8px;display:flex;position:absolute;top:16px;right:16px}.FV0QMq_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}.FV0QMq_mermaidModalButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_mermaidModalStage{justify-content:center;align-items:center;width:90vw;height:80vh;display:flex;position:relative;overflow:hidden}.FV0QMq_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}.FV0QMq_mermaidModalStage svg:active{cursor:grabbing}.FV0QMq_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%)}.FV0QMq_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))}.FV0QMq_selectionPopup:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_editorPdf{background:var(--dsw-alias-bg-base);flex-direction:column;flex:1;min-height:0;display:flex}.FV0QMq_editorPdfToolbar{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;justify-content:flex-end;padding:6px 8px;display:flex}.FV0QMq_editorPdfStage{flex:1;min-height:0;display:flex;position:relative}.FV0QMq_editorPdfFrame{background:var(--dsw-alias-bg-base);border:none;flex:1;width:100%;min-height:0}.FV0QMq_editorPdfFrameBlocked{pointer-events:none}.FV0QMq_editorPdfDragShield{z-index:4;pointer-events:none;background:0 0;position:absolute;inset:0}.FV0QMq_editorPdfDragShieldActive{pointer-events:auto}body[data-dsh-tab-dragging] .FV0QMq_editorPdfFrame{pointer-events:none!important}body[data-dsh-tab-dragging] .FV0QMq_editorPdfDragShield{pointer-events:auto!important}.FV0QMq_terminalWrap{background:var(--dsw-alias-bg-base);flex-direction:column;flex:1;min-height:0;display:flex;position:relative}.FV0QMq_terminal{flex:1;min-height:0;padding:6px 4px 6px 8px}.FV0QMq_terminal .xterm{height:100%}.FV0QMq_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}.FV0QMq_terminalBannerUrl{word-break:break-all;opacity:.85;flex-basis:100%;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.FV0QMq_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}.FV0QMq_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}.FV0QMq_terminalRetry:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_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}.FV0QMq_terminalDepsTitle{font:var(--dsw-font-xxs-strong-12);color:var(--dsw-alias-state-warn-primary)}.FV0QMq_terminalDepsHint{opacity:.9}.FV0QMq_terminalDepsCommandRow{align-items:flex-start;gap:8px;display:flex}.FV0QMq_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}.FV0QMq_terminalDepsNote{opacity:.85}.FV0QMq_terminalDepsActions{align-items:center;gap:8px;display:flex}.FV0QMq_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}.FV0QMq_git{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;overflow:hidden auto}.FV0QMq_gitHeader{flex:none;align-items:center;gap:8px;height:36px;padding:0 8px 0 12px;display:flex}.FV0QMq_gitWorktreeRow{flex:none;align-items:center;gap:8px;padding:6px 8px 0 12px;display:flex}.FV0QMq_gitWorktreeLabel{color:var(--dsw-alias-label-tertiary);font:var(--dsw-font-xxxs-11);flex:none}.FV0QMq_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}.FV0QMq_gitSection{border-top:1px solid var(--dsw-alias-border-l1)}.FV0QMq_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}.FV0QMq_gitLink{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-brand-primary);cursor:pointer;background:0 0;border:none;padding:0}.FV0QMq_gitLink:hover:not(:disabled){text-decoration:underline}.FV0QMq_gitLink:disabled{opacity:.4;cursor:default}.FV0QMq_gitRow{min-height:34px;animation:FV0QMq_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}.FV0QMq_gitRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_gitRowSelected{background:var(--dsw-alias-interactive-bg-active)}.FV0QMq_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}.FV0QMq_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}.FV0QMq_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}.FV0QMq_gitEmpty{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);padding:4px 12px 8px}.FV0QMq_gitPlaceholder{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary);text-align:center;padding:16px}.FV0QMq_gitError{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-state-error-primary);white-space:pre-wrap;padding:8px 12px}.FV0QMq_gitDiff{border-top:1px solid var(--dsw-alias-border-l1);padding:8px}.FV0QMq_gitDiffTab{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;overflow:hidden auto}.FV0QMq_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}.FV0QMq_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}.FV0QMq_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}.FV0QMq_gitDiffFile:disabled{cursor:default}.FV0QMq_gitDiffFile:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_gitDiffFileChevron{color:var(--dsw-alias-label-tertiary);flex:none;transform:rotate(0)}.FV0QMq_gitDiffFileChevronExpanded{transform:rotate(90deg)}.FV0QMq_gitDiffFilePath{font:var(--dsw-font-xxs-strong-12);color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.FV0QMq_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}.FV0QMq_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}.FV0QMq_gitDiffHunk{font:var(--dsw-font-markdown-code-block-small);color:var(--dsw-alias-label-tertiary);gap:8px;padding:3px 2px;display:flex}.FV0QMq_gitDiffHunkHeader{color:var(--dsw-alias-label-secondary);flex:none}.FV0QMq_gitDiffHunkSection{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.FV0QMq_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}.FV0QMq_gitDiffNum{text-align:right;width:36px;color:var(--dsw-alias-label-tertiary);user-select:none;flex:none;padding-right:8px}.FV0QMq_gitDiffCode{flex:1;min-width:0;overflow:visible}.FV0QMq_gitDiffCtx{color:var(--dsw-alias-label-primary)}.FV0QMq_gitDiffDel{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent)}.FV0QMq_gitDiffAdd{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent)}.FV0QMq_gitDiffMeta{padding-left:2px}.FV0QMq_gitDiffMetaText{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary);font-style:italic}.FV0QMq_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}.FV0QMq_gitDiffExpand:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_gitConfirmDesc{font:var(--dsw-font-s-14);color:var(--dsw-alias-label-primary);white-space:pre-wrap;margin:0}.FV0QMq_gitCommit{border-top:1px solid var(--dsw-alias-border-l1);align-items:center;gap:6px;padding:8px 12px;display:flex}.FV0QMq_gitCommitInput{flex:1;min-width:0}.FV0QMq_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}.FV0QMq_gitCommitButton:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)}.FV0QMq_gitCommitButton:disabled{opacity:.45;cursor:default}.FV0QMq_gitLogRow{cursor:pointer;border-radius:8px;flex-direction:column;gap:2px;padding:5px 12px;display:flex}.FV0QMq_gitLogRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.FV0QMq_gitLogLine1{align-items:baseline;gap:8px;min-width:0;display:flex}.FV0QMq_gitLogHash{font:var(--dsw-font-markdown-code-block-small);color:var(--dsw-alias-label-tertiary);flex:none}.FV0QMq_gitLogLine2{flex-wrap:wrap;align-items:center;gap:6px;min-width:0;display:flex}.FV0QMq_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}.FV0QMq_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}.FV0QMq_gitLogMeta{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary)}.FV0QMq_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}.FV0QMq_gitLogMore:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_gitLogMore:disabled{opacity:.5;cursor:default}.FV0QMq_producedRow{flex-wrap:wrap;align-items:center;gap:8px;padding:4px 0;display:flex}.FV0QMq_producedLabel{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary)}.FV0QMq_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}.FV0QMq_producedChip:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_producedChip span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.FV0QMq_producedMore{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary)}.FV0QMq_toggleButton:focus-visible,.FV0QMq_manualButton:focus-visible,.FV0QMq_bottomClose:focus-visible,.FV0QMq_iconButton:focus-visible,.FV0QMq_tab:focus-visible,.FV0QMq_tabClose:focus-visible,.FV0QMq_tabBarPlus:focus-visible,.FV0QMq_paneCard:focus-visible,.FV0QMq_explorerRow:focus-visible,.FV0QMq_explorerRef:focus-visible,.FV0QMq_gitRowMain:focus-visible,.FV0QMq_gitLink:focus-visible,.FV0QMq_gitCommitButton:focus-visible,.FV0QMq_gitLogRow:focus-visible,.FV0QMq_gitLogMore:focus-visible,.FV0QMq_gitDiffFile:focus-visible,.FV0QMq_gitDiffExpand:focus-visible,.FV0QMq_terminalRetry:focus-visible,.FV0QMq_editorModeButton:focus-visible,.FV0QMq_editorDownloadLink:focus-visible,.FV0QMq_editorPptxButton:focus-visible,.FV0QMq_editorDocxZoomRange:focus-visible{outline:2px solid var(--dsw-alias-interactive-bg-hover-accent);outline-offset:-1px}@media (prefers-reduced-motion:reduce){.FV0QMq_panel,.FV0QMq_panelHidden,.FV0QMq_bottomPanel,.FV0QMq_bottomPanelHidden,.FV0QMq_toggleCluster,.FV0QMq_toggleButton,.FV0QMq_tab,.FV0QMq_tabBarPlus,.FV0QMq_paneCard,.FV0QMq_explorerRow,.FV0QMq_gitRow,.FV0QMq_divider,.FV0QMq_dividerRow:after,.FV0QMq_dividerCol:after{transition:none;animation:none}}@media (width<=767px){.FV0QMq_panel:not(.FV0QMq_panelHidden) .FV0QMq_tabBar{padding-right:148px}.FV0QMq_tab{min-width:48px;max-width:128px}}.FV0QMq_openWithLabel{align-items:center;gap:8px;width:100%;min-width:0;display:flex}.FV0QMq_openWithName{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}.FV0QMq_openWithChevron{color:var(--dsw-alias-label-tertiary);flex:none}.FV0QMq_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}.FV0QMq_openWithPin:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_openWithPinActive{color:var(--dsw-alias-state-business-primary)}.FV0QMq_editorHtmlBlock{margin:8px 0}.FV0QMq_editorHtmlBlock img,.FV0QMq_editorHtmlBlock video{max-width:100%}.FV0QMq_editorHtmlBlock details{margin:4px 0;padding:4px 0}.FV0QMq_editorHtmlBlock summary{cursor:pointer}.FV0QMq_tocBar{z-index:3;pointer-events:none;justify-content:flex-end;height:0;display:flex;position:sticky;top:0}.FV0QMq_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}.FV0QMq_tocButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_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}.FV0QMq_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}.FV0QMq_tocItem:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.FV0QMq_tocItem[data-level=\"2\"]{padding-left:18px}.FV0QMq_tocItem[data-level=\"3\"]{padding-left:28px}.FV0QMq_tocItem[data-level=\"4\"]{padding-left:38px}.FV0QMq_tocItem[data-level=\"5\"]{padding-left:48px}.FV0QMq_tocItem[data-level=\"6\"]{padding-left:58px}.FV0QMq_tocItemLevel{font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-label-tertiary);flex:none}.FV0QMq_tocItemText{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}@keyframes FV0QMq_dsh-toc-flash{0%,60%{background:var(--dsw-alias-interactive-bg-hover)}to{background:0 0}}.FV0QMq_tocFlash{border-radius:4px;animation:1.2s ease-out FV0QMq_dsh-toc-flash}.FV0QMq_chatcodeGate{z-index:2147483000;isolation:isolate;background-color:var(--dsw-alias-tooltip-bg);background-image:linear-gradient(135deg, var(--dsw-alias-tooltip-bg) 0%, var(--dsw-alias-brand-primary) 48%, var(--dsw-alias-tooltip-bg) 100%);color:var(--dsw-alias-fg-base);pointer-events:auto;place-items:center;padding:24px;display:grid;position:fixed;inset:0;overflow:hidden}.FV0QMq_chatcodeGateCard{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:linear-gradient(145deg, var(--dsw-alias-bg-layer-2), var(--dsw-alias-bg-layer-1));width:min(460px,100%);box-shadow:var(--dsw-shadow-lv3);text-align:center;border-radius:20px;padding:40px 36px;position:relative}.FV0QMq_chatcodeGateContent{position:relative}.FV0QMq_chatcodeGateCard h1{font:var(--dsw-font-heading-lg);letter-spacing:-.02em;margin:0 0 12px;font-size:clamp(32px,5vw,46px);line-height:1.1}.FV0QMq_chatcodeGateCard p{max-width:29em;color:var(--dsw-alias-label-secondary);font:var(--dsw-font-s-14);margin:0 auto;line-height:1.7}.FV0QMq_chatcodeGateError{border:1px solid color-mix(in srgb, var(--dsw-alias-fg-error) 36%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-fg-error) 8%, transparent);border-radius:10px;padding:9px 11px;position:relative;color:var(--dsw-alias-fg-error)!important;font:var(--dsw-font-xxs-12)!important;margin-top:16px!important;line-height:1.5!important}.FV0QMq_chatcodeGateActions{justify-content:center;gap:10px;margin:28px 0 14px;display:flex;position:relative}.FV0QMq_chatcodeGateActions button,.FV0QMq_chatcodeGateCard a{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);min-height:42px;color:var(--dsw-alias-fg-base);font:var(--dsw-font-xxs-strong-12);cursor:pointer;transition:transform var(--ds-transition-duration-slow) var(--ds-ease-in-out), 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:10px;padding:9px 17px}.FV0QMq_chatcodeGateActions button:first-child{border-color:var(--dsw-alias-state-error-primary);background:var(--dsw-alias-state-error-primary);min-width:152px;min-height:46px;color:var(--dsw-alias-label-primary-inverted)}.FV0QMq_chatcodeGateActions button:first-child:hover:not(:disabled){box-shadow:var(--dsw-shadow-lv2);transform:translateY(-2px);border-color:var(--dsw-alias-state-error-primary)!important;background:var(--dsw-alias-state-error-primary)!important;color:var(--dsw-alias-label-primary-inverted)!important}.FV0QMq_chatcodeGateActions button:not(:first-child):hover:not(:disabled),.FV0QMq_chatcodeGateCard a:hover{border-color:var(--dsw-alias-button-primary-hover);background:var(--dsw-alias-button-primary-hover);color:var(--dsw-alias-label-primary-inverted);transform:translateY(-1px)}.FV0QMq_chatcodeGateActions button:disabled{cursor:default;opacity:.55}.FV0QMq_chatcodeGateCard a{align-items:center;text-decoration:none;display:inline-flex;position:relative}.FV0QMq_chatcodeGateActions button:focus-visible,.FV0QMq_chatcodeGateCard a:focus-visible{outline:2px solid var(--dsw-alias-border-accent);outline-offset:3px}@media (width<=480px){.FV0QMq_chatcodeGate{padding:16px}.FV0QMq_chatcodeGateCard{padding:32px 24px}.FV0QMq_chatcodeGateActions{flex-direction:column;align-items:stretch}.FV0QMq_chatcodeGateActions button,.FV0QMq_chatcodeGateCard a{justify-content:center}}";
12093
+ const tagId$5 = "@chatcode/cco-better-sidebar/sidebar.module.css";
12094
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$5) + "]") === null) {
12095
+ const tag = document.createElement("style");
12096
+ tag.dataset.plugin = "@chatcode/cco-better-sidebar";
12097
+ tag.dataset.pluginCss = tagId$5;
12098
+ tag.textContent = css$5;
12099
+ document.head.appendChild(tag);
12100
+ }
12101
+ var sidebar_module_css_default = {
12102
+ "gitDiffHunkHeader": "FV0QMq_gitDiffHunkHeader",
12103
+ "bottomPanelHidden": "FV0QMq_bottomPanelHidden",
12104
+ "dividerRow": "FV0QMq_dividerRow",
12105
+ "uploadOverlayCancel": "FV0QMq_uploadOverlayCancel",
12106
+ "terminalDepsTitle": "FV0QMq_terminalDepsTitle",
12107
+ "releaseNotesContent": "FV0QMq_releaseNotesContent",
12108
+ "editorBinary": "FV0QMq_editorBinary",
12109
+ "gitCommitInput": "FV0QMq_gitCommitInput",
12110
+ "gitLogMeta": "FV0QMq_gitLogMeta",
12111
+ "openWithName": "FV0QMq_openWithName",
12112
+ "tocItemText": "FV0QMq_tocItemText",
12113
+ "dsh-row-in": "FV0QMq_dsh-row-in",
12114
+ "uploadDropHero": "FV0QMq_uploadDropHero",
12115
+ "tabTitle": "FV0QMq_tabTitle",
12116
+ "editorTreeToggleActive": "FV0QMq_editorTreeToggleActive",
12117
+ "editorSearchInput": "FV0QMq_editorSearchInput",
12118
+ "terminalDepsNote": "FV0QMq_terminalDepsNote",
12119
+ "updateBody": "FV0QMq_updateBody",
12120
+ "dropRight": "FV0QMq_dropRight",
12121
+ "explorerError": "FV0QMq_explorerError",
12122
+ "editorPdfDragShieldActive": "FV0QMq_editorPdfDragShieldActive",
12123
+ "accountTrigger": "FV0QMq_accountTrigger",
12124
+ "tabBarDrop": "FV0QMq_tabBarDrop",
12125
+ "explorerEmpty": "FV0QMq_explorerEmpty",
12126
+ "editorBody": "FV0QMq_editorBody",
12127
+ "tab": "FV0QMq_tab",
12128
+ "panelResizeActive": "FV0QMq_panelResizeActive",
12129
+ "toggleButton": "FV0QMq_toggleButton",
12130
+ "explorerRowRevealed": "FV0QMq_explorerRowRevealed",
12131
+ "gitDiffTabHeader": "FV0QMq_gitDiffTabHeader",
12132
+ "updateInline": "FV0QMq_updateInline",
12133
+ "gitConfirmDesc": "FV0QMq_gitConfirmDesc",
12134
+ "terminal": "FV0QMq_terminal",
12135
+ "paneContent": "FV0QMq_paneContent",
12136
+ "editorHtml": "FV0QMq_editorHtml",
12137
+ "floatClose": "FV0QMq_floatClose",
12138
+ "editorHeader": "FV0QMq_editorHeader",
12139
+ "panelBody": "FV0QMq_panelBody",
12140
+ "editor": "FV0QMq_editor",
12141
+ "mermaidModalHint": "FV0QMq_mermaidModalHint",
12142
+ "editorPdfDragShield": "FV0QMq_editorPdfDragShield",
12143
+ "gitBranchSelect": "FV0QMq_gitBranchSelect",
12144
+ "floatWindowDragging": "FV0QMq_floatWindowDragging",
12145
+ "gitDiffFileOld": "FV0QMq_gitDiffFileOld",
12146
+ "dropOverlay": "FV0QMq_dropOverlay",
12147
+ "editorSearchHint": "FV0QMq_editorSearchHint",
12148
+ "editorPlaceholder": "FV0QMq_editorPlaceholder",
12149
+ "mermaidBody": "FV0QMq_mermaidBody",
12150
+ "gitDiffFile": "FV0QMq_gitDiffFile",
12151
+ "terminalBanner": "FV0QMq_terminalBanner",
12152
+ "releaseNotesButton": "FV0QMq_releaseNotesButton",
12153
+ "tocItemLevel": "FV0QMq_tocItemLevel",
12154
+ "pinnedSessionsList": "FV0QMq_pinnedSessionsList",
12155
+ "terminalWrap": "FV0QMq_terminalWrap",
12156
+ "pinnedSessionMenuDivider": "FV0QMq_pinnedSessionMenuDivider",
12157
+ "explorer": "FV0QMq_explorer",
12158
+ "floatDropHint": "FV0QMq_floatDropHint",
12159
+ "divider": "FV0QMq_divider",
12160
+ "gitDiffFileChevronExpanded": "FV0QMq_gitDiffFileChevronExpanded",
12161
+ "pinnedSessionOpen": "FV0QMq_pinnedSessionOpen",
12162
+ "toggleCluster": "FV0QMq_toggleCluster",
12163
+ "gitDiffAdd": "FV0QMq_gitDiffAdd",
12164
+ "gitRow": "FV0QMq_gitRow",
12165
+ "updateSettingsTitle": "FV0QMq_updateSettingsTitle",
12166
+ "bottomClose": "FV0QMq_bottomClose",
12167
+ "browser": "FV0QMq_browser",
12168
+ "gitCommit": "FV0QMq_gitCommit",
12169
+ "editorMain": "FV0QMq_editorMain",
12170
+ "mermaidHeader": "FV0QMq_mermaidHeader",
12171
+ "paneEmptyCards": "FV0QMq_paneEmptyCards",
12172
+ "tocButton": "FV0QMq_tocButton",
12173
+ "openWithPin": "FV0QMq_openWithPin",
12174
+ "updateCommand": "FV0QMq_updateCommand",
12175
+ "updateSettingsText": "FV0QMq_updateSettingsText",
12176
+ "gitDiffExpand": "FV0QMq_gitDiffExpand",
12177
+ "editorHtmlBlock": "FV0QMq_editorHtmlBlock",
12178
+ "tocBar": "FV0QMq_tocBar",
12179
+ "panelHidden": "FV0QMq_panelHidden",
12180
+ "gitDiffFileTag": "FV0QMq_gitDiffFileTag",
12181
+ "editorTreePanelFull": "FV0QMq_editorTreePanelFull",
12182
+ "mermaidInfo": "FV0QMq_mermaidInfo",
12183
+ "tabBar": "FV0QMq_tabBar",
12184
+ "explorerCopied": "FV0QMq_explorerCopied",
12185
+ "gitDiffCode": "FV0QMq_gitDiffCode",
12186
+ "pinnedSessionRow": "FV0QMq_pinnedSessionRow",
12187
+ "fenceError": "FV0QMq_fenceError",
12188
+ "dropDown": "FV0QMq_dropDown",
12189
+ "uploadOverlay": "FV0QMq_uploadOverlay",
12190
+ "paneTab": "FV0QMq_paneTab",
12191
+ "releaseNotesIconButton": "FV0QMq_releaseNotesIconButton",
12192
+ "mermaidModalStage": "FV0QMq_mermaidModalStage",
12193
+ "terminalDepsBanner": "FV0QMq_terminalDepsBanner",
12194
+ "editorPdfFrame": "FV0QMq_editorPdfFrame",
12195
+ "accountItem": "FV0QMq_accountItem",
12196
+ "producedRow": "FV0QMq_producedRow",
12197
+ "orphanedType": "FV0QMq_orphanedType",
12198
+ "sandboxAction": "FV0QMq_sandboxAction",
12199
+ "uploadOverlayStatus": "FV0QMq_uploadOverlayStatus",
12200
+ "accountName": "FV0QMq_accountName",
12201
+ "sandboxStatusOff": "FV0QMq_sandboxStatusOff",
12202
+ "boundaryError": "FV0QMq_boundaryError",
12203
+ "gitHeader": "FV0QMq_gitHeader",
12204
+ "tabBadge": "FV0QMq_tabBadge",
12205
+ "uploadDropZone": "FV0QMq_uploadDropZone",
12206
+ "explorerHeader": "FV0QMq_explorerHeader",
12207
+ "gitSectionHeader": "FV0QMq_gitSectionHeader",
12208
+ "gitLogHash": "FV0QMq_gitLogHash",
12209
+ "dividerCol": "FV0QMq_dividerCol",
12210
+ "mermaidCode": "FV0QMq_mermaidCode",
12211
+ "cornerHandle": "FV0QMq_cornerHandle",
12212
+ "mermaidModalButton": "FV0QMq_mermaidModalButton",
12213
+ "uploadOverlayCard": "FV0QMq_uploadOverlayCard",
12214
+ "editorStatus": "FV0QMq_editorStatus",
12215
+ "editorPdfToolbar": "FV0QMq_editorPdfToolbar",
12216
+ "gitDiffCtx": "FV0QMq_gitDiffCtx",
12217
+ "mermaidMarkdown": "FV0QMq_mermaidMarkdown",
12218
+ "gitDiffHunk": "FV0QMq_gitDiffHunk",
12219
+ "editorModeActive": "FV0QMq_editorModeActive",
12220
+ "explorerBroken": "FV0QMq_explorerBroken",
12221
+ "chatcodeGateError": "FV0QMq_chatcodeGateError",
12222
+ "editorBanner": "FV0QMq_editorBanner",
12223
+ "chatcodeGateCard": "FV0QMq_chatcodeGateCard",
12224
+ "accountPresence": "FV0QMq_accountPresence",
12225
+ "editorPdf": "FV0QMq_editorPdf",
12226
+ "git": "FV0QMq_git",
12227
+ "terminalDepsCommandRow": "FV0QMq_terminalDepsCommandRow",
12228
+ "updateError": "FV0QMq_updateError",
12229
+ "bottomResize": "FV0QMq_bottomResize",
12230
+ "editorCm": "FV0QMq_editorCm",
12231
+ "terminalDepsActions": "FV0QMq_terminalDepsActions",
12232
+ "explorerRoot": "FV0QMq_explorerRoot",
12233
+ "producedLabel": "FV0QMq_producedLabel",
12234
+ "gitLink": "FV0QMq_gitLink",
12235
+ "tocPanel": "FV0QMq_tocPanel",
12236
+ "gitBadge": "FV0QMq_gitBadge",
12237
+ "gitError": "FV0QMq_gitError",
12238
+ "uploadDropChatHint": "FV0QMq_uploadDropChatHint",
12239
+ "paneDrop": "FV0QMq_paneDrop",
12240
+ "dropLeft": "FV0QMq_dropLeft",
12241
+ "mermaidCopy": "FV0QMq_mermaidCopy",
12242
+ "mermaidError": "FV0QMq_mermaidError",
12243
+ "gitRowMain": "FV0QMq_gitRowMain",
12244
+ "producedChip": "FV0QMq_producedChip",
12245
+ "dropUp": "FV0QMq_dropUp",
12246
+ "pinnedSessionDot": "FV0QMq_pinnedSessionDot",
12247
+ "browserFrame": "FV0QMq_browserFrame",
12248
+ "sandboxStatus": "FV0QMq_sandboxStatus",
12249
+ "browserMessage": "FV0QMq_browserMessage",
12250
+ "tabBoundaryError": "FV0QMq_tabBoundaryError",
12251
+ "floatResize": "FV0QMq_floatResize",
12252
+ "terminalBannerUrl": "FV0QMq_terminalBannerUrl",
12253
+ "gitDiffMetaText": "FV0QMq_gitDiffMetaText",
12254
+ "gitDiffFilePath": "FV0QMq_gitDiffFilePath",
12255
+ "accountMenu": "FV0QMq_accountMenu",
12256
+ "paneCard": "FV0QMq_paneCard",
12257
+ "toggleClusterNative": "FV0QMq_toggleClusterNative",
12258
+ "gitDiffHunkSection": "FV0QMq_gitDiffHunkSection",
12259
+ "bottomPanel": "FV0QMq_bottomPanel",
12260
+ "browserBlockedTitle": "FV0QMq_browserBlockedTitle",
12261
+ "editorPptxButton": "FV0QMq_editorPptxButton",
12262
+ "dsh-toc-flash": "FV0QMq_dsh-toc-flash",
12263
+ "editorTitle": "FV0QMq_editorTitle",
12264
+ "updateErrorText": "FV0QMq_updateErrorText",
12265
+ "floatWindow": "FV0QMq_floatWindow",
12266
+ "uploadDropChatCard": "FV0QMq_uploadDropChatCard",
12267
+ "gitWorktreeRow": "FV0QMq_gitWorktreeRow",
12268
+ "updateVersions": "FV0QMq_updateVersions",
12269
+ "explorerRowDropTarget": "FV0QMq_explorerRowDropTarget",
12270
+ "tabList": "FV0QMq_tabList",
12271
+ "splitCol": "FV0QMq_splitCol",
12272
+ "editorModeToggle": "FV0QMq_editorModeToggle",
12273
+ "tabClose": "FV0QMq_tabClose",
12274
+ "gitCommitButton": "FV0QMq_gitCommitButton",
12275
+ "accountDropdownHeader": "FV0QMq_accountDropdownHeader",
12276
+ "releaseNotesDialog": "FV0QMq_releaseNotesDialog",
12277
+ "uploadDropZoneText": "FV0QMq_uploadDropZoneText",
12278
+ "producedMore": "FV0QMq_producedMore",
12279
+ "editorImage": "FV0QMq_editorImage",
12280
+ "mermaidWrap": "FV0QMq_mermaidWrap",
12281
+ "sandboxStatusText": "FV0QMq_sandboxStatusText",
12282
+ "pinnedSessionsHeading": "FV0QMq_pinnedSessionsHeading",
12283
+ "sandboxDot": "FV0QMq_sandboxDot",
12284
+ "gitEmpty": "FV0QMq_gitEmpty",
12285
+ "gitLogLine1": "FV0QMq_gitLogLine1",
12286
+ "pane": "FV0QMq_pane",
12287
+ "gitRowSelected": "FV0QMq_gitRowSelected",
12288
+ "tocItem": "FV0QMq_tocItem",
12289
+ "editorTreeResize": "FV0QMq_editorTreeResize",
12290
+ "uploadOverlayProgress": "FV0QMq_uploadOverlayProgress",
12291
+ "editorPdfFrameBlocked": "FV0QMq_editorPdfFrameBlocked",
12292
+ "workbench": "FV0QMq_workbench",
12293
+ "pinnedTab": "FV0QMq_pinnedTab",
12294
+ "gitDiff": "FV0QMq_gitDiff",
12295
+ "accountMenuDivider": "FV0QMq_accountMenuDivider",
12296
+ "editorMd": "FV0QMq_editorMd",
12297
+ "terminalRetry": "FV0QMq_terminalRetry",
12298
+ "dirtyDot": "FV0QMq_dirtyDot",
12299
+ "accountDropdown": "FV0QMq_accountDropdown",
12300
+ "browserBlockedDesc": "FV0QMq_browserBlockedDesc",
12301
+ "editorStatusError": "FV0QMq_editorStatusError",
12302
+ "gitLogRef": "FV0QMq_gitLogRef",
12303
+ "dropCenter": "FV0QMq_dropCenter",
12304
+ "pinnedSessionMenu": "FV0QMq_pinnedSessionMenu",
12305
+ "editorImageWrap": "FV0QMq_editorImageWrap",
12306
+ "editorBinaryNotice": "FV0QMq_editorBinaryNotice",
12307
+ "selectionPopup": "FV0QMq_selectionPopup",
12308
+ "floatDropHintLabel": "FV0QMq_floatDropHintLabel",
12309
+ "editorSearchResult": "FV0QMq_editorSearchResult",
12310
+ "mermaidModal": "FV0QMq_mermaidModal",
12311
+ "explorerSymlink": "FV0QMq_explorerSymlink",
12312
+ "pinnedSessionTitle": "FV0QMq_pinnedSessionTitle",
12313
+ "explorerHidden": "FV0QMq_explorerHidden",
12314
+ "browserInput": "FV0QMq_browserInput",
12315
+ "bottomResizeActive": "FV0QMq_bottomResizeActive",
12316
+ "editorDownloadLink": "FV0QMq_editorDownloadLink",
12317
+ "browserBlockedButton": "FV0QMq_browserBlockedButton",
12318
+ "explorerBody": "FV0QMq_explorerBody",
12319
+ "gitSection": "FV0QMq_gitSection",
12320
+ "explorerDir": "FV0QMq_explorerDir",
12321
+ "uploadDropZonePill": "FV0QMq_uploadDropZonePill",
12322
+ "gitName": "FV0QMq_gitName",
12323
+ "dividerActive": "FV0QMq_dividerActive",
12324
+ "gitLogRow": "FV0QMq_gitLogRow",
12325
+ "editorDocxZoomRange": "FV0QMq_editorDocxZoomRange",
12326
+ "openWithLabel": "FV0QMq_openWithLabel",
12327
+ "updateSettingsDesc": "FV0QMq_updateSettingsDesc",
12328
+ "accountAvatar": "FV0QMq_accountAvatar",
12329
+ "paneTabHidden": "FV0QMq_paneTabHidden",
12330
+ "manualButton": "FV0QMq_manualButton",
12331
+ "gitWorktreeLabel": "FV0QMq_gitWorktreeLabel",
12332
+ "editorError": "FV0QMq_editorError",
12333
+ "browserBlocked": "FV0QMq_browserBlocked",
12334
+ "gitDiffTab": "FV0QMq_gitDiffTab",
12335
+ "floatContent": "FV0QMq_floatContent",
12336
+ "gitLogLine2": "FV0QMq_gitLogLine2",
12337
+ "chatcodeGateActions": "FV0QMq_chatcodeGateActions",
12338
+ "editorTreeSearch": "FV0QMq_editorTreeSearch",
12339
+ "updateList": "FV0QMq_updateList",
12340
+ "uploadOverlayTitle": "FV0QMq_uploadOverlayTitle",
12341
+ "chatcodeGateContent": "FV0QMq_chatcodeGateContent",
12342
+ "floatHeader": "FV0QMq_floatHeader",
12343
+ "explorerRef": "FV0QMq_explorerRef",
12344
+ "gitLogMore": "FV0QMq_gitLogMore",
12345
+ "openWithChevron": "FV0QMq_openWithChevron",
12346
+ "tocFlash": "FV0QMq_tocFlash",
12347
+ "gitDiffTabTitle": "FV0QMq_gitDiffTabTitle",
12348
+ "editorModeButton": "FV0QMq_editorModeButton",
12349
+ "updateOk": "FV0QMq_updateOk",
12350
+ "editorPdfStage": "FV0QMq_editorPdfStage",
12351
+ "splitChild": "FV0QMq_splitChild",
12352
+ "editorTreePanel": "FV0QMq_editorTreePanel",
12353
+ "chatcodeGate": "FV0QMq_chatcodeGate",
12354
+ "floatTitle": "FV0QMq_floatTitle",
12355
+ "gitLogSubject": "FV0QMq_gitLogSubject",
12356
+ "tabActive": "FV0QMq_tabActive",
12357
+ "gitPlaceholder": "FV0QMq_gitPlaceholder",
12358
+ "panelResize": "FV0QMq_panelResize",
12359
+ "terminalRepairCommand": "FV0QMq_terminalRepairCommand",
12360
+ "gitDiffFileChevron": "FV0QMq_gitDiffFileChevron",
12361
+ "sandboxStatusOn": "FV0QMq_sandboxStatusOn",
12362
+ "browserStart": "FV0QMq_browserStart",
12363
+ "gitDiffMeta": "FV0QMq_gitDiffMeta",
12364
+ "panel": "FV0QMq_panel",
12365
+ "splitRow": "FV0QMq_splitRow",
12366
+ "updateSettingsRow": "FV0QMq_updateSettingsRow",
12367
+ "pinnedSessions": "FV0QMq_pinnedSessions",
12368
+ "iconButton": "FV0QMq_iconButton",
12369
+ "updateFooter": "FV0QMq_updateFooter",
12370
+ "mermaidModalToolbar": "FV0QMq_mermaidModalToolbar",
12371
+ "updateSettingsBlock": "FV0QMq_updateSettingsBlock",
12372
+ "browserBar": "FV0QMq_browserBar",
12373
+ "explorerName": "FV0QMq_explorerName",
12374
+ "split": "FV0QMq_split",
12375
+ "uploadOverlayProgressFill": "FV0QMq_uploadOverlayProgressFill",
12376
+ "browserBlockedActions": "FV0QMq_browserBlockedActions",
12377
+ "releaseNotesFooter": "FV0QMq_releaseNotesFooter",
12378
+ "releaseNotesOverlay": "FV0QMq_releaseNotesOverlay",
12379
+ "terminalDepsHint": "FV0QMq_terminalDepsHint",
12380
+ "releaseNotesHeader": "FV0QMq_releaseNotesHeader",
12381
+ "gitDiffNum": "FV0QMq_gitDiffNum",
12382
+ "pinnedSessionMore": "FV0QMq_pinnedSessionMore",
12383
+ "editorTreeDock": "FV0QMq_editorTreeDock",
12384
+ "explorerRow": "FV0QMq_explorerRow",
12385
+ "openWithPinActive": "FV0QMq_openWithPinActive",
12386
+ "tabBarPlus": "FV0QMq_tabBarPlus",
12387
+ "gitDiffLine": "FV0QMq_gitDiffLine",
12388
+ "gitDiffDel": "FV0QMq_gitDiffDel",
12389
+ "editorCmHidden": "FV0QMq_editorCmHidden",
12390
+ "editorPathInput": "FV0QMq_editorPathInput"
12391
+ };
12392
+ //#endregion
12393
+ //#region src/client/intercept.tsx
12394
+ /**
12395
+ * Contribution of the chat's produced-files row. Current Hosts expose the
12396
+ * turn-tail surface as a list; older Hosts exposed it as a chain. The
12397
+ * registration supplies both shapes' routing fields so one bundle remains
12398
+ * compatible across that transition. The chips open the file in the sidebar
12399
+ * instead of the host OS.
12400
+ */
12401
+ /** Open a file in the sidebar's editor (used by the intercepted row and the explorer). */
12402
+ function openSidebarFile(ctx, store, sessionId, path) {
12403
+ const summary = ctx.sessions.list.getSnapshot().byId[sessionId];
12404
+ const absolute = resolveSidebarPath(summary?.cwd, path);
12405
+ const at = Math.max(absolute.lastIndexOf("/"), absolute.lastIndexOf("\\"));
12406
+ const title = at === -1 ? absolute : absolute.slice(at + 1);
12407
+ ctx.get("betterSidebar")?.openTab({
12408
+ type: "editor",
12409
+ title,
12410
+ path: absolute,
12411
+ id: `editor:${absolute}`
12412
+ });
12413
+ }
12414
+ /**
12415
+ * The produced files the turn-tail selector last matched for the visible
12416
+ * session. The "Show in folder" gesture carries no file path of its own
12417
+ * (`'.'`), so the reveal highlights exactly these rows when available.
12418
+ */
12419
+ let lastProduced = [];
12420
+ /**
12421
+ * Reveal the produced files in the sidebar explorer: expand their parent
12422
+ * directories, highlight the rows, and focus the explorer tab (expanding the
12423
+ * hosting panel when it is collapsed). Unknown files fall back to revealing
12424
+ * the workspace root itself.
12425
+ */
12426
+ function revealInExplorer(ctx, store, sessionId, files) {
12427
+ const cwd = ctx.sessions.list.getSnapshot().byId[sessionId]?.cwd;
12428
+ const targets = files.length > 0 ? files.map((path) => resolveSidebarPath(cwd, path)) : cwd === void 0 ? [] : [cwd];
12429
+ store.reduce((state) => revealPaths(state, cwd, targets));
12430
+ store.reduce((s) => s.panelOpen ? s : togglePanel(s));
12431
+ store.reduce((s) => ({
12432
+ ...s,
12433
+ activePane: firstLeaf(s.splits).id
12434
+ }));
12435
+ ctx.get("betterSidebar")?.openTab({
12436
+ type: "editor",
12437
+ title: t("files")
12438
+ });
12439
+ }
12440
+ /** The intercepted produced-files row (visual twin of the deliverables chips). */
12441
+ function SidebarProducedFiles(props) {
12442
+ const { matched, openInSidebar, onShowInFolder } = props;
12443
+ const shown = matched.slice(0, 6);
12444
+ const hidden = matched.length - shown.length;
12445
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12446
+ className: sidebar_module_css_default.producedRow,
12447
+ children: [
12448
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12449
+ className: sidebar_module_css_default.producedLabel,
12450
+ children: t("produced")
12451
+ }),
12452
+ shown.map((path) => {
12453
+ const at = Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\"));
12454
+ const name = at === -1 ? path : path.slice(at + 1);
12455
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
12456
+ type: "button",
12457
+ className: sidebar_module_css_default.producedChip,
12458
+ title: path,
12459
+ onClick: () => {
12460
+ openInSidebar(path);
12461
+ },
12462
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCodeOutline16, { size: 12 }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: name })]
12463
+ }, path);
12464
+ }),
12465
+ hidden > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
12466
+ className: sidebar_module_css_default.producedMore,
12467
+ children: ["+", hidden]
12468
+ }),
12469
+ hidden > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12470
+ type: "button",
12471
+ className: sidebar_module_css_default.producedMore,
12472
+ style: {
12473
+ cursor: "pointer",
12474
+ textDecoration: "underline",
12475
+ textUnderlineOffset: 2
12476
+ },
12477
+ onClick: () => {
12478
+ onShowInFolder(matched);
12479
+ },
12480
+ children: t("showInFolder")
12481
+ })
12482
+ ]
12483
+ });
12484
+ }
12485
+ /** Adapt both the legacy chain match and the current list owner to the row. */
12486
+ function SidebarProducedFilesEntry(props) {
12487
+ if (props.store.getSuspended() || props.store.getPrefs().tabsEnabled["editor"] === false) return null;
12488
+ const matched = props.matched ?? selectProducedFiles(props);
12489
+ if (matched === null) return null;
12490
+ lastProduced = matched;
12491
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarProducedFiles, {
12492
+ matched,
12493
+ openInSidebar: props.openInSidebar,
12494
+ onShowInFolder: props.onShowInFolder
12495
+ });
12496
+ }
12497
+ /**
12498
+ * Register the turn-tail interception (returns the disposer).
12499
+ *
12500
+ * The slot is a CHILD slot the host's ui-conversation declares in its
12501
+ * `conversation.chat.node` children table (currently kind: list, scope:
12502
+ * session; older compatible Hosts declared a chain).
12503
+ * Registering it directly races the declaration — the ui-slots core's
12504
+ * load-time validation throws "not declared (a parent entry's children
12505
+ * table must declare it)" when the parent entry is not on the ledger yet.
12506
+ * slots.inject waits for the declaration: the callback runs synchronously
12507
+ * when the slot is already declared, otherwise it runs inside the declaring
12508
+ * register() call once the declaration commits; declaration collapse
12509
+ * disposes the entry and a later declaration re-registers it. This mirrors
12510
+ * @deepseek-ai/dsh-client-ui-deliverables' registration of the same slot.
12511
+ */
12512
+ function registerTurnTailInterception(ctx, store) {
12513
+ return ctx.slots.inject("conversation.chat.turnTail", () => ctx.slots.register({
12514
+ name: "conversation.chat.turnTail",
12515
+ id: "dsh-better-sidebar:produced-files",
12516
+ select: (owner) => {
12517
+ if (store.getSuspended()) return null;
12518
+ if (store.getPrefs().tabsEnabled["editor"] === false) return null;
12519
+ const matched = selectProducedFiles(owner);
12520
+ if (matched !== null) lastProduced = matched;
12521
+ return matched;
12522
+ },
12523
+ priority: -1,
12524
+ registrant: "dsh-better-sidebar",
12525
+ inject: (sessionId) => ({
12526
+ store,
12527
+ openInSidebar: (path) => {
12528
+ openSidebarFile(ctx, store, sessionId, path);
12529
+ },
12530
+ onShowInFolder: (files) => {
12531
+ revealInExplorer(ctx, store, sessionId, files);
12532
+ }
12533
+ })
12534
+ }, SidebarProducedFilesEntry));
12535
+ }
12536
+ /**
12537
+ * Register the chat file-open interception: wraps `ctx.workspaces.openPath`
12538
+ * — the single funnel every chat-side file open goes through (tool-row path
12539
+ * links, the produced-files row, prose mentions) — so opens land in the
12540
+ * sidebar editor instead of the Host OS. The folder-reveal gesture ("Show in
12541
+ * folder" passes `'.'`) is the one exception: it is routed to the explorer.
12542
+ * Gated by BOTH the `interceptOpenPath` pref and the editor tab's enable
12543
+ * switch; declined opens fall through to the original method. Returns the
12544
+ * disposer restoring the original (HMR-safe).
12545
+ */
12546
+ function registerOpenPathInterception(ctx, store) {
12547
+ return wrapOpenPath(ctx.workspaces, {
12548
+ takeoverEnabled: () => !store.getSuspended() && store.getPrefs().interceptOpenPath !== false && store.getPrefs().tabsEnabled["editor"] !== false,
12549
+ currentSessionId: () => currentSessionId(ctx),
12550
+ openInSidebar: (path, sessionId) => {
12551
+ openSidebarFile(ctx, store, sessionId, path);
12552
+ },
12553
+ revealInExplorer: (_path, sessionId) => {
12554
+ revealInExplorer(ctx, store, sessionId, lastProduced);
12555
+ }
12556
+ });
12557
+ }
12558
+ //#endregion
12559
+ //#region node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
12560
+ function r(e) {
12561
+ var t, f, n = "";
12562
+ if ("string" == typeof e || "number" == typeof e) n += e;
12563
+ else if ("object" == typeof e) if (Array.isArray(e)) {
12564
+ var o = e.length;
12565
+ for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f);
12566
+ } else for (f in e) e[f] && (n && (n += " "), n += f);
12567
+ return n;
12568
+ }
12569
+ function clsx() {
12570
+ for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t);
12571
+ return n;
12572
+ }
12573
+ //#endregion
12574
+ //#region src/client/api.ts
12575
+ /** One wire failure. */
12576
+ var SidebarApiError = class extends Error {
12577
+ code;
12578
+ constructor(code, message) {
12579
+ super(message);
12580
+ this.code = code;
12581
+ }
12582
+ };
12583
+ /** Message-level variant for surfaces that stored the raw text (file-tree level errors). */
12584
+ function isOutsideWorkspaceMessage(message) {
12585
+ return message.includes("outside workspace");
12586
+ }
12587
+ async function call(method, payload, signal) {
12588
+ let response;
12589
+ try {
12590
+ response = await fetch(`/sidebar/api/${method}`, {
12591
+ method: "POST",
12592
+ headers: { "content-type": "application/json" },
12593
+ body: JSON.stringify(payload),
12594
+ signal
12595
+ });
12596
+ } catch (error) {
12597
+ throw new SidebarApiError("network", error instanceof Error ? error.message : String(error));
12598
+ }
12599
+ const parsed = await response.json().catch(() => null);
12600
+ if (!response.ok || parsed === null || parsed.ok !== true || parsed.value === void 0) throw new SidebarApiError(parsed?.error?.code ?? "http", parsed?.error?.message ?? `HTTP ${response.status}`);
12601
+ return parsed.value;
12602
+ }
12603
+ /**
12604
+ * Upload one file to the sidebar's raw upload route: the File goes straight
12605
+ * into the POST body (no JSON/base64 re-encoding — the host streams it into
12606
+ * the workspace). Failure surfaces as {@link SidebarApiError} with the wire
12607
+ * code, exactly like every `/sidebar/api` call. An aborted `signal` rejects
12608
+ * with the DOMException as-is (the caller decides whether that is an error).
12609
+ */
12610
+ async function fetchUpload(scope, dir, relativePath, body, signal) {
12611
+ const params = new URLSearchParams({
12612
+ sessionId: scope.sessionId,
12613
+ dir,
12614
+ relativePath
12615
+ });
12616
+ if (scope.cwd !== void 0 && scope.cwd !== "") params.set("cwd", scope.cwd);
12617
+ let response;
12618
+ try {
12619
+ response = await fetch(`/sidebar/upload?${params.toString()}`, {
12620
+ method: "POST",
12621
+ headers: { "content-type": "application/octet-stream" },
12622
+ body,
12623
+ signal
12624
+ });
12625
+ } catch (error) {
12626
+ if (error instanceof DOMException && error.name === "AbortError") throw error;
12627
+ throw new SidebarApiError("network", error instanceof Error ? error.message : String(error));
12628
+ }
12629
+ const parsed = await response.json().catch(() => null);
12630
+ if (!response.ok || parsed === null || parsed.ok !== true || parsed.value === void 0) throw new SidebarApiError(parsed?.error?.code ?? "http", parsed?.error?.message ?? `HTTP ${response.status}`);
12631
+ return parsed.value;
12632
+ }
12633
+ /** Fold a scope into a JSON payload ({cwd} only when present). */
12634
+ function scopePayload(scope, extra) {
12635
+ return {
12636
+ sessionId: scope.sessionId,
12637
+ ...scope.cwd !== void 0 && scope.cwd !== "" ? { cwd: scope.cwd } : {},
12638
+ ...scope.repoRoot !== void 0 && scope.repoRoot !== "" ? { repoRoot: scope.repoRoot } : {},
12639
+ ...extra
12640
+ };
12641
+ }
12642
+ /** Add a linked-worktree selection to a scoped Git request. The host validates
12643
+ * membership before using it as a command cwd. */
12644
+ function gitPayload(scope, worktree, extra) {
12645
+ return scopePayload(scope, {
12646
+ ...worktree !== void 0 && worktree !== "" ? { worktree } : {},
12647
+ ...extra
12648
+ });
12649
+ }
12650
+ /** The sidebar API surface (session scope threaded through every call). */
12651
+ const api = {
12652
+ chatcodeStatus: (signal) => call("chatcode.status", {}, signal),
12653
+ chatcodeStart: () => call("chatcode.start", {}),
12654
+ chatcodeCancel: (sessionId) => call("chatcode.cancel", { sessionId }),
12655
+ chatcodeLogout: () => call("chatcode.logout", {}),
12656
+ /** Check both ChatCode packages (web + CLI) against the npm registry. */
12657
+ chatcodeUpdateCheck: (signal) => call("chatcode.update.check", {}, signal),
12658
+ /** Upgrade both ChatCode packages to their npm-latest versions. */
12659
+ chatcodeUpdatePerform: (signal) => call("chatcode.update.perform", {}, signal),
12660
+ releaseNoteCurrent: (packageName, versionNum, signal) => call("release-note.current", {
12661
+ packageName,
12662
+ versionNum
12663
+ }, signal),
12664
+ /** Per-day token usage of one day range (`YYYY-MM-DD`). */
12665
+ chatcodeTokenTrend: (begin, end, signal) => call("chatcode.token-trend", {
12666
+ begin,
12667
+ end
12668
+ }, signal),
12669
+ /** Personal commit records of one day range (AI-ratio view). */
12670
+ chatcodeGitCommitStats: (begin, end, signal) => call("chatcode.git-commit-stats", {
12671
+ begin,
12672
+ end
12673
+ }, signal),
12674
+ sessionCwd: (scope, signal) => call("session.cwd", scopePayload(scope, {}), signal),
12675
+ fsTree: (scope, path, signal) => call("fs.tree", scopePayload(scope, { path }), signal),
12676
+ /** Global recursive file-name search rooted at the session cwd (the editor
12677
+ * side panel's search box); matches are cwd-relative '/'-separated paths. */
12678
+ fsSearch: (scope, query, signal) => call("fs.search", scopePayload(scope, { query }), signal),
12679
+ fsRead: (scope, path, signal) => call("fs.read", scopePayload(scope, { path }), signal),
12680
+ fsWrite: (scope, path, content) => call("fs.write", scopePayload(scope, {
12681
+ path,
12682
+ content
12683
+ })),
12684
+ /** Upload one file's raw bytes into `dir` (keeps the folder tree via
12685
+ * `relativePath`); the host streams it under the session workspace. */
12686
+ uploadFile: (scope, dir, relativePath, body, signal) => fetchUpload(scope, dir, relativePath, body, signal),
12687
+ gitWorktrees: (scope, signal) => call("git.worktrees", scopePayload(scope, {}), signal),
12688
+ gitStatus: (scope, worktree, signal) => call("git.status", gitPayload(scope, worktree, {}), signal),
12689
+ gitDiff: (scope, path, staged, worktree, signal) => call("git.diff", gitPayload(scope, worktree, {
12690
+ ...path !== void 0 ? { path } : {},
12691
+ staged
12692
+ }), signal),
12693
+ gitStage: (scope, path, worktree) => call("git.stage", gitPayload(scope, worktree, { ...path !== void 0 ? { path } : {} })),
12694
+ gitUnstage: (scope, path, worktree) => call("git.unstage", gitPayload(scope, worktree, { ...path !== void 0 ? { path } : {} })),
12695
+ gitCommit: (scope, message, worktree) => call("git.commit", gitPayload(scope, worktree, { message })),
12696
+ gitBranch: (scope, worktree, signal) => call("git.branch", gitPayload(scope, worktree, {}), signal),
12697
+ gitCheckout: (scope, branch, worktree) => call("git.checkout", gitPayload(scope, worktree, { branch })),
12698
+ /** Recent commit history, lazily pageable (skip/count; defaults 0/30). */
12699
+ gitLog: (scope, count, skip, worktree, signal) => call("git.log", gitPayload(scope, worktree, {
12700
+ ...count !== void 0 ? { count } : {},
12701
+ ...skip !== void 0 ? { skip } : {}
12702
+ }), signal),
12703
+ /** Full patch text of one commit (diff display for the history rows). */
12704
+ gitCommitDiff: (scope, hash, worktree, signal) => call("git.commit-diff", gitPayload(scope, worktree, { hash }), signal),
12705
+ /** Discard the worktree changes of one file (the index is untouched). */
12706
+ gitDiscard: (scope, path, worktree) => call("git.discard", gitPayload(scope, worktree, { path })),
12707
+ /** Revert one commit onto the current branch. */
12708
+ gitRevert: (scope, hash, worktree) => call("git.revert", gitPayload(scope, worktree, { hash })),
12709
+ /** Cherry-pick one commit onto the current branch. */
12710
+ gitCherryPick: (scope, hash, worktree) => call("git.cherry-pick", gitPayload(scope, worktree, { hash })),
12711
+ /** Release a terminal's process immediately (tab closed; the WS close frame
12712
+ * may be unreachable while the socket is down, so the host also accepts
12713
+ * this explicit route). */
12714
+ ptyClose: (scope, tab) => call("pty.close", scopePayload(scope, { tab })),
12715
+ /** Release an agent terminal by uuid (tab closed while WS was down). */
12716
+ agentPtyClose: (uuid) => call("agent-pty.close", { uuid }),
12717
+ /** Terminal dependency status (issue #140): after a WS close 1011 with
12718
+ * reason `pty-deps-missing` the view fetches the full repair details here
12719
+ * (the close reason itself is capped at 123 bytes). */
12720
+ terminalDeps: () => call("terminal.deps", {}),
12721
+ /** The effective terminal shell and its display name (plugin-global). */
12722
+ shellGet: () => call("shell.get", {}),
12723
+ /** The local display name used by the bottom-left account menu. */
12724
+ accountGet: () => call("account.get", {}),
12725
+ /** Read the host-cached CodingPlan model catalogue. */
12726
+ codingPlanModels: () => call("codingplan.models", {}),
12727
+ /** Refresh the host-cached CodingPlan catalogue. */
12728
+ codingPlanRefresh: () => call("codingplan.refresh", {}),
12729
+ /** Read the side card preferences (plugin-global, no session scope). */
12730
+ settingsGet: () => call("settings.get", {}),
12731
+ /** Merge a patch into the side card preferences (revision-guarded). */
12732
+ settingsUpdate: (patch, expectedRevision) => call("settings.update", {
12733
+ patch,
12734
+ ...expectedRevision !== void 0 ? { expectedRevision } : {}
12735
+ }),
12736
+ /** Probe a URL's response headers (the sidebar browser's embeddability
12737
+ * check; see the host's browser.probe route). */
12738
+ browserProbe: (url, signal) => call("browser.probe", { url }, signal),
12739
+ /** External open for the file tree's "open with" menu: reveal a path in
12740
+ * the OS file manager, or hand a custom-scheme URL (vscode://, cursor://,
12741
+ * zed://, custom editors) to its registered handler. The host launches
12742
+ * the platform opener (argv, no shell). */
12743
+ openExternal: (payload) => call("open.external", payload)
12744
+ };
12745
+ /** Absolute URL of the media route for one path (images only). */
12746
+ function mediaUrl(scope, path) {
12747
+ return fileUrl(scope, path, false);
12748
+ }
12749
+ /** Absolute URL of the download route: serves raw bytes (binary-safe) with
12750
+ * `Content-Disposition: attachment`, so the browser saves the file. */
12751
+ function downloadUrl(scope, path) {
12752
+ return fileUrl(scope, path, true);
12753
+ }
12754
+ /** Shared URL builder for the /sidebar/file route (media vs download). */
12755
+ function fileUrl(scope, path, download) {
12756
+ const params = new URLSearchParams({
12757
+ sessionId: scope.sessionId,
12758
+ path
12759
+ });
12760
+ if (scope.cwd !== void 0 && scope.cwd !== "") params.set("cwd", scope.cwd);
12761
+ if (download) params.set("download", "1");
12762
+ return `/sidebar/file?${params.toString()}`;
12763
+ }
12764
+ //#endregion
12765
+ //#region src/client/binary-download.tsx
12766
+ function BinaryDownload(props) {
12767
+ const { scope, path } = props;
12768
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12769
+ className: sidebar_module_css_default.editorBinary,
12770
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12771
+ className: sidebar_module_css_default.editorBinaryNotice,
12772
+ children: t("binaryNoPreview")
12773
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
12774
+ className: sidebar_module_css_default.editorDownloadLink,
12775
+ href: downloadUrl(scope, path),
12776
+ download: true,
12777
+ children: t("downloadToView")
12778
+ })]
12779
+ });
12780
+ }
12781
+ //#endregion
12782
+ //#region src/client/prefs.ts
12783
+ /** Validate one raw resolved value into {@link SidebarPrefs}. Used for the
12784
+ * settings.get payload AND the settings.update response (both carry the
12785
+ * layered resolved value); any malformed field falls back to its default.
12786
+ * @param value - the raw resolved section from the settings wire.
12787
+ * @returns validated prefs (always well-formed).
12788
+ */
12789
+ function parsePrefs(value) {
12790
+ if (value === null || typeof value !== "object") return { ...SIDEBAR_PREFS_DEFAULTS };
12791
+ const record = value;
12792
+ return {
12793
+ openByDefault: typeof record.openByDefault === "boolean" ? record.openByDefault : SIDEBAR_PREFS_DEFAULTS.openByDefault,
12794
+ defaultWidthPercent: typeof record.defaultWidthPercent === "number" && Number.isFinite(record.defaultWidthPercent) ? clampWidthPercent(record.defaultWidthPercent) : SIDEBAR_PREFS_DEFAULTS.defaultWidthPercent,
12795
+ autoOpenSubagent: typeof record.autoOpenSubagent === "boolean" ? record.autoOpenSubagent : SIDEBAR_PREFS_DEFAULTS.autoOpenSubagent,
12796
+ autoOpenJobs: typeof record.autoOpenJobs === "boolean" ? record.autoOpenJobs : SIDEBAR_PREFS_DEFAULTS.autoOpenJobs,
12797
+ agentTerminalTools: typeof record.agentTerminalTools === "boolean" ? record.agentTerminalTools : SIDEBAR_PREFS_DEFAULTS.agentTerminalTools,
12798
+ agentOpenTools: typeof record.agentOpenTools === "boolean" ? record.agentOpenTools : SIDEBAR_PREFS_DEFAULTS.agentOpenTools,
12799
+ bottomPanelAutoTerminal: typeof record.bottomPanelAutoTerminal === "boolean" ? record.bottomPanelAutoTerminal : SIDEBAR_PREFS_DEFAULTS.bottomPanelAutoTerminal,
12800
+ terminalFontFamily: typeof record.terminalFontFamily === "string" ? record.terminalFontFamily : SIDEBAR_PREFS_DEFAULTS.terminalFontFamily,
12801
+ terminalShell: typeof record.terminalShell === "string" ? record.terminalShell : SIDEBAR_PREFS_DEFAULTS.terminalShell,
12802
+ terminalShellArgs: typeof record.terminalShellArgs === "string" ? record.terminalShellArgs : SIDEBAR_PREFS_DEFAULTS.terminalShellArgs,
12803
+ terminalFontSize: typeof record.terminalFontSize === "number" && Number.isFinite(record.terminalFontSize) ? clampTerminalFontSize(record.terminalFontSize) : SIDEBAR_PREFS_DEFAULTS.terminalFontSize,
12804
+ interceptOpenPath: typeof record.interceptOpenPath === "boolean" ? record.interceptOpenPath : SIDEBAR_PREFS_DEFAULTS.interceptOpenPath,
12805
+ editorExplorer: typeof record.editorExplorer === "boolean" ? record.editorExplorer : SIDEBAR_PREFS_DEFAULTS.editorExplorer,
12806
+ workspaceFence: typeof record.workspaceFence === "boolean" ? record.workspaceFence : SIDEBAR_PREFS_DEFAULTS.workspaceFence,
12807
+ titleBarScheme: isTitleBarScheme(record.titleBarScheme) ? record.titleBarScheme : record.titleBarCompat === true || hasLegacyStripValue(record.titleBarStripPx) ? "custom" : "auto",
12808
+ titleBarPresetId: typeof record.titleBarPresetId === "string" ? record.titleBarPresetId : SIDEBAR_PREFS_DEFAULTS.titleBarPresetId,
12809
+ customCss: typeof record.customCss === "string" ? record.customCss : SIDEBAR_PREFS_DEFAULTS.customCss,
12810
+ titleBarCompat: typeof record.titleBarCompat === "boolean" ? record.titleBarCompat : SIDEBAR_PREFS_DEFAULTS.titleBarCompat,
12811
+ titleBarStripPx: typeof record.titleBarStripPx === "number" && Number.isFinite(record.titleBarStripPx) ? clampTitleBarStrip(record.titleBarStripPx) : SIDEBAR_PREFS_DEFAULTS.titleBarStripPx,
12812
+ htmlViewerNoSandbox: typeof record.htmlViewerNoSandbox === "boolean" ? record.htmlViewerNoSandbox : SIDEBAR_PREFS_DEFAULTS.htmlViewerNoSandbox,
12813
+ htmlViewerDefaultUnsafe: typeof record.htmlViewerDefaultUnsafe === "boolean" ? record.htmlViewerDefaultUnsafe : SIDEBAR_PREFS_DEFAULTS.htmlViewerDefaultUnsafe,
12814
+ browserNoSandbox: typeof record.browserNoSandbox === "boolean" ? record.browserNoSandbox : SIDEBAR_PREFS_DEFAULTS.browserNoSandbox,
12815
+ browserInterceptLinks: typeof record.browserInterceptLinks === "boolean" ? record.browserInterceptLinks : SIDEBAR_PREFS_DEFAULTS.browserInterceptLinks,
12816
+ browserInterceptHttp: typeof record.browserInterceptHttp === "boolean" ? record.browserInterceptHttp : SIDEBAR_PREFS_DEFAULTS.browserInterceptHttp,
12817
+ browserInterceptHttps: typeof record.browserInterceptHttps === "boolean" ? record.browserInterceptHttps : SIDEBAR_PREFS_DEFAULTS.browserInterceptHttps,
12818
+ browserAllowedLoopback: typeof record.browserAllowedLoopback === "string" ? record.browserAllowedLoopback : SIDEBAR_PREFS_DEFAULTS.browserAllowedLoopback,
12819
+ tabsEnabled: booleanMapOf(record.tabsEnabled),
12820
+ viewersEnabled: booleanMapOf(record.viewersEnabled),
12821
+ pluginSettings: pluginSettingsMapOf(record.pluginSettings)
12822
+ };
12823
+ }
12824
+ /**
12825
+ * Validate the plugin-owned settings map (v0.12.0+): `{ descriptorId: { key:
12826
+ * value } }`, nested open maps. Any non-object value (or a malformed whole)
12827
+ * falls back to the empty map — the schema defaults already guard the wire
12828
+ * shape, this is the client's second line.
12829
+ */
12830
+ function pluginSettingsMapOf(value) {
12831
+ if (value === null || typeof value !== "object" || Array.isArray(value)) return {};
12832
+ const out = {};
12833
+ for (const [id, blob] of Object.entries(value)) if (blob !== null && typeof blob === "object" && !Array.isArray(blob)) out[id] = blob;
12834
+ return out;
12835
+ }
12836
+ /**
12837
+ * Validate one enable-switch map (per-tab / per-viewer). Only boolean values
12838
+ * survive; a non-object or a non-boolean entry falls back to the empty map /
12839
+ * drops the entry — an absent key means the feature stays enabled.
12840
+ */
12841
+ function booleanMapOf(value) {
12842
+ if (value === null || typeof value !== "object" || Array.isArray(value)) return {};
12843
+ const out = {};
12844
+ for (const [key, item] of Object.entries(value)) if (typeof item === "boolean") out[key] = item;
12845
+ return out;
12846
+ }
12847
+ /** Type guard for the title-bar scheme union (anything else falls back). */
12848
+ function isTitleBarScheme(value) {
12849
+ return typeof value === "string" && TITLE_BAR_SCHEMES.includes(value);
12850
+ }
12851
+ /**
12852
+ * Whether the legacy document carries an explicit strip value (only
12853
+ * reachable through the old gear popup): a stored number different from the
12854
+ * default counts as "the user already configured something" and migrates to
12855
+ * the `custom` scheme.
12856
+ */
12857
+ function hasLegacyStripValue(value) {
12858
+ return typeof value === "number" && Number.isFinite(value) && value !== 40;
12859
+ }
12860
+ /**
12861
+ * Read the resolved side card preferences through the plugin's settings route.
12862
+ * @param settings - the settings wire face (the plugin api by default).
12863
+ * @returns validated prefs, or the schema defaults when the route rejects,
12864
+ * the namespace is absent, or a stored value violates the contract.
12865
+ */
12866
+ async function loadPrefs(settings) {
12867
+ try {
12868
+ return parsePrefs((await settings.settingsGet()).value);
12869
+ } catch {
12870
+ return { ...SIDEBAR_PREFS_DEFAULTS };
12871
+ }
12872
+ }
12873
+ /**
12874
+ * Read the external-disable flag from the same settings route: the
12875
+ * dsh-web-ui family's aionui-panel provider choice. True only when the host
12876
+ * resolved `aionui-panel.rightPanel` to 'aionui-panel' — while true the
12877
+ * sidebar must not mount (the two right panels are mutually exclusive). Any
12878
+ * failure (route rejected, aionui absent, malformed response) reads false,
12879
+ * so a missing family never hides the sidebar.
12880
+ * @param settings - the settings wire face (the plugin api by default).
12881
+ * @returns the external-disable flag (false on any failure).
12882
+ */
12883
+ async function loadExternalDisable(settings) {
12884
+ try {
12885
+ return (await settings.settingsGet()).externalDisable === true;
12886
+ } catch {
12887
+ return false;
12888
+ }
12889
+ }
12890
+ //#endregion
12891
+ //#region src/client/FenceErrorNotice.tsx
12892
+ /**
12893
+ * The workspace-fence refusal surface. The raw wire text (`path "..." is
12894
+ * outside workspace`) is never shown as-is: the editor / file-tree error
12895
+ * slots render the localized reason plus a one-click global off — the click
12896
+ * flips the `workspaceFence` pref through the settings route, adopts the
12897
+ * returned document into the store (so every prefs reader — GitView's open
12898
+ * guard, the settings page — flips with it), and calls `onDisabled` so the
12899
+ * caller retries the failed operation immediately.
12900
+ */
12901
+ function FenceErrorNotice(props) {
12902
+ const { store, onDisabled } = props;
12903
+ const [busy, setBusy] = (0, react.useState)(false);
12904
+ const disable = () => {
12905
+ if (busy) return;
12906
+ setBusy(true);
12907
+ api.settingsUpdate({ workspaceFence: false }).then((view) => {
12908
+ store.setPrefs(parsePrefs(view.value));
12909
+ onDisabled();
12910
+ }).catch((error) => {
12911
+ console.error("workspace fence disable failed", error);
12912
+ setBusy(false);
12913
+ });
12914
+ };
12915
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12916
+ className: sidebar_module_css_default.fenceError,
12917
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("fenceErrorReason") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
12918
+ variant: "outline",
12919
+ disabled: busy,
12920
+ onClick: disable,
12921
+ children: t("fenceDisableAction")
12922
+ })]
12923
+ });
12924
+ }
12925
+ //#endregion
12926
+ //#region src/client/editor-load.ts
12927
+ /** Decode the host's base64 head bytes into the sniffing buffer. */
12928
+ function decodeHead(headBase64) {
12929
+ const binary = atob(headBase64);
12930
+ const bytes = new Uint8Array(binary.length);
12931
+ for (let i = 0; i < binary.length; i += 1) bytes[i] = binary.charCodeAt(i);
12932
+ return bytes;
12933
+ }
12934
+ /**
12935
+ * Dispatch one matched viewer's fetchStrategy. A missing viewer or a
12936
+ * `binary-download` strategy both mean "no client-side renderer" → the
12937
+ * download UI. `mediaUrlOf` builds the media URL for `mediaUrl`/`none`
12938
+ * strategies (pure, but scope-bound — injected by the host).
12939
+ */
12940
+ function planFirstMatch(viewer, mediaUrlOf) {
12941
+ if (viewer === void 0 || viewer.fetchStrategy === "binary-download") return { kind: "binary" };
12942
+ switch (viewer.fetchStrategy) {
12943
+ case "mediaUrl":
12944
+ case "none": return {
12945
+ kind: "render",
12946
+ viewer,
12947
+ mediaUrl: mediaUrlOf()
12948
+ };
12949
+ case "custom": return {
12950
+ kind: "customLoad",
12951
+ viewer
12952
+ };
12953
+ case "fsRead": return {
12954
+ kind: "fetchFsRead",
12955
+ viewer
12956
+ };
12957
+ }
12958
+ }
12959
+ /**
12960
+ * Decide what an fsRead result means for the editor.
12961
+ * - Text: the first match stands (content is valid for any fsRead viewer).
12962
+ * - Binary: the host head bytes enable a re-match — a `detect` viewer (e.g.
12963
+ * a plugin sniffing a binary format) may claim the file. `custom` viewers
12964
+ * load their own bytes; `mediaUrl`/`none` viewers render the media route;
12965
+ * an fsRead viewer or nothing cannot render binary → download UI.
12966
+ */
12967
+ function planFsReadOutcome(viewer, result, rematch, mediaUrlOf) {
12968
+ if (!result.binary) return {
12969
+ kind: "render",
12970
+ viewer,
12971
+ content: result.content,
12972
+ truncated: result.truncated
12973
+ };
12974
+ const claimed = result.head === void 0 ? void 0 : rematch(decodeHead(result.head));
12975
+ if (claimed !== void 0 && claimed.fetchStrategy === "custom") return {
12976
+ kind: "customLoad",
12977
+ viewer: claimed
12978
+ };
12979
+ if (claimed !== void 0 && (claimed.fetchStrategy === "mediaUrl" || claimed.fetchStrategy === "none")) return {
12980
+ kind: "render",
12981
+ viewer: claimed,
12982
+ mediaUrl: mediaUrlOf()
12983
+ };
12984
+ return { kind: "binary" };
12985
+ }
12986
+ //#endregion
12987
+ //#region node_modules/.pnpm/react-icons@5.7.0_react@18.2.0/node_modules/react-icons/si/index.mjs
12988
+ function SiZedindustries(props) {
12989
+ return GenIcon({
12990
+ "tag": "svg",
12991
+ "attr": {
12992
+ "role": "img",
12993
+ "viewBox": "0 0 24 24"
12994
+ },
12995
+ "child": [{
12996
+ "tag": "path",
12997
+ "attr": { "d": "M2.25 1.5a.75.75 0 0 0-.75.75v16.5H0V2.25A2.25 2.25 0 0 1 2.25 0h20.095c1.002 0 1.504 1.212.795 1.92L10.764 14.298h3.486V12.75h1.5v1.922a1.125 1.125 0 0 1-1.125 1.125H9.264l-2.578 2.578h11.689V9h1.5v9.375a1.5 1.5 0 0 1-1.5 1.5H5.185L2.562 22.5H21.75a.75.75 0 0 0 .75-.75V5.25H24v16.5A2.25 2.25 0 0 1 21.75 24H1.655C.653 24 .151 22.788.86 22.08L13.19 9.75H9.75v1.5h-1.5V9.375A1.125 1.125 0 0 1 9.375 8.25h5.314l2.625-2.625H5.625V15h-1.5V5.625a1.5 1.5 0 0 1 1.5-1.5h13.19L21.438 1.5z" },
12998
+ "child": []
12999
+ }]
13000
+ })(props);
13001
+ }
13002
+ function SiCursor(props) {
13003
+ return GenIcon({
13004
+ "tag": "svg",
13005
+ "attr": {
13006
+ "role": "img",
13007
+ "viewBox": "0 0 24 24"
13008
+ },
13009
+ "child": [{
13010
+ "tag": "path",
13011
+ "attr": { "d": "M11.503.131 1.891 5.678a.84.84 0 0 0-.42.726v11.188c0 .3.162.575.42.724l9.609 5.55a1 1 0 0 0 .998 0l9.61-5.55a.84.84 0 0 0 .42-.724V6.404a.84.84 0 0 0-.42-.726L12.497.131a1.01 1.01 0 0 0-.996 0M2.657 6.338h18.55c.263 0 .43.287.297.515L12.23 22.918c-.062.107-.229.064-.229-.06V12.335a.59.59 0 0 0-.295-.51l-9.11-5.257c-.109-.063-.064-.23.061-.23" },
13012
+ "child": []
13013
+ }]
13014
+ })(props);
13015
+ }
13016
+ //#endregion
13017
+ //#region node_modules/.pnpm/react-icons@5.7.0_react@18.2.0/node_modules/react-icons/vsc/index.mjs
13018
+ function VscPinned(props) {
13019
+ return GenIcon({
13020
+ "tag": "svg",
13021
+ "attr": {
13022
+ "viewBox": "0 0 16 16",
13023
+ "fill": "currentColor"
13024
+ },
13025
+ "child": [{
13026
+ "tag": "path",
13027
+ "attr": { "d": "M10.0589 2.44511C9.34701 1.73063 8.14697 1.90829 7.67261 2.79839L5.6526 6.58878L2.8419 7.52568C2.6775 7.58048 2.5532 7.71649 2.51339 7.88514C2.47357 8.0538 2.52392 8.23104 2.64646 8.35357L4.79291 10.5L2.14645 13.1465L2 14L2.85356 13.8536L5.50002 11.2071L7.64646 13.3536C7.76899 13.4761 7.94623 13.5265 8.11489 13.4866C8.28354 13.4468 8.41955 13.3225 8.47435 13.1581L9.41143 10.3469L13.1897 8.32423C14.0759 7.84982 14.2538 6.6551 13.5443 5.94305L10.0589 2.44511ZM8.55511 3.2687C8.71323 2.972 9.11324 2.91278 9.35055 3.15094L12.836 6.64889C13.0725 6.88624 13.0131 7.28448 12.7178 7.44262L8.76403 9.55921C8.65137 9.61952 8.56608 9.72068 8.52567 9.84191L7.7815 12.0744L3.92562 8.21853L6.15812 7.47436C6.27966 7.43385 6.38101 7.34823 6.44126 7.23518L8.55511 3.2687Z" },
13028
+ "child": []
13029
+ }]
13030
+ })(props);
13031
+ }
13032
+ function VscPin(props) {
13033
+ return GenIcon({
13034
+ "tag": "svg",
13035
+ "attr": {
13036
+ "viewBox": "0 0 16 16",
13037
+ "fill": "currentColor"
13038
+ },
13039
+ "child": [{
13040
+ "tag": "path",
13041
+ "attr": { "d": "M13.5 3C13.303 3 13.109 3.038 12.923 3.114L8.481 4.967L5.659 4.026C5.505 3.976 5.339 4.001 5.209 4.095C5.078 4.189 5.001 4.339 5.001 4.5V7H1.257L0.5 7.5L1.257 8H5V10.5C5 10.661 5.077 10.812 5.208 10.905C5.338 11 5.504 11.023 5.658 10.974L8.48 10.033L12.925 11.887C13.109 11.962 13.302 12 13.499 12C14.326 12 14.999 11.327 14.999 10.5V4.5C14.999 3.673 14.326 3 13.499 3H13.5ZM14 10.5C14 10.843 13.615 11.09 13.308 10.962L8.693 9.038C8.631 9.013 8.566 9 8.501 9C8.447 9 8.395 9.009 8.343 9.025L6.001 9.806V5.193L8.343 5.974C8.457 6.011 8.581 6.007 8.694 5.961L13.306 4.038C13.629 3.902 14.001 4.156 14.001 4.499V10.499L14 10.5Z" },
13042
+ "child": []
13043
+ }]
13044
+ })(props);
13045
+ }
13046
+ function VscLinkExternal(props) {
13047
+ return GenIcon({
13048
+ "tag": "svg",
13049
+ "attr": {
13050
+ "viewBox": "0 0 16 16",
13051
+ "fill": "currentColor"
13052
+ },
13053
+ "child": [{
13054
+ "tag": "path",
13055
+ "attr": { "d": "M15 9.5V12.5C15 13.879 13.879 15 12.5 15H3.5C2.121 15 1 13.879 1 12.5V3.5C1 2.121 2.121 1 3.5 1H6.5C6.776 1 7 1.224 7 1.5C7 1.776 6.776 2 6.5 2H3.5C2.673 2 2 2.673 2 3.5V12.5C2 13.327 2.673 14 3.5 14H12.5C13.327 14 14 13.327 14 12.5V9.5C14 9.224 14.224 9 14.5 9C14.776 9 15 9.224 15 9.5ZM14.5 1H9.5C9.224 1 9 1.224 9 1.5C9 1.776 9.224 2 9.5 2H13.293L9.147 6.146C8.952 6.341 8.952 6.658 9.147 6.853C9.245 6.951 9.373 6.999 9.501 6.999C9.629 6.999 9.757 6.95 9.855 6.853L14.001 2.707V6.5C14.001 6.776 14.225 7 14.501 7C14.777 7 15.001 6.776 15.001 6.5V1.5C15.001 1.224 14.777 1 14.501 1H14.5Z" },
13056
+ "child": []
13057
+ }]
13058
+ })(props);
13059
+ }
13060
+ function VscFolder(props) {
13061
+ return GenIcon({
13062
+ "tag": "svg",
13063
+ "attr": {
13064
+ "viewBox": "0 0 16 16",
13065
+ "fill": "currentColor"
13066
+ },
13067
+ "child": [{
13068
+ "tag": "path",
13069
+ "attr": { "d": "M2 4.5V6H5.58579C5.71839 6 5.84557 5.94732 5.93934 5.85355L7.29289 4.5L5.93934 3.14645C5.84557 3.05268 5.71839 3 5.58579 3H3.5C2.67157 3 2 3.67157 2 4.5ZM1 4.5C1 3.11929 2.11929 2 3.5 2H5.58579C5.98361 2 6.36514 2.15804 6.64645 2.43934L8.20711 4H12.5C13.8807 4 15 5.11929 15 6.5V11.5C15 12.8807 13.8807 14 12.5 14H3.5C2.11929 14 1 12.8807 1 11.5V4.5ZM2 7V11.5C2 12.3284 2.67157 13 3.5 13H12.5C13.3284 13 14 12.3284 14 11.5V6.5C14 5.67157 13.3284 5 12.5 5H8.20711L6.64645 6.56066C6.36514 6.84197 5.98361 7 5.58579 7H2Z" },
13070
+ "child": []
13071
+ }]
13072
+ })(props);
13073
+ }
13074
+ function VscFolderOpened(props) {
13075
+ return GenIcon({
13076
+ "tag": "svg",
13077
+ "attr": {
13078
+ "viewBox": "0 0 16 16",
13079
+ "fill": "currentColor"
13080
+ },
13081
+ "child": [{
13082
+ "tag": "path",
13083
+ "attr": { "d": "M2 4.5V9.10022L2.92389 7.5C3.45979 6.5718 4.45017 6 5.52196 6L11.9146 6C11.7087 5.4174 11.1531 5 10.5 5H7C6.86739 5 6.74021 4.94732 6.64645 4.85355L4.93934 3.14645C4.84557 3.05268 4.71839 3 4.58579 3H3.5C2.67157 3 2 3.67157 2 4.5ZM7.06895 13.9953C7.04641 13.9984 7.02339 14 7 14H3.5C2.11929 14 1 12.8807 1 11.5V4.5C1 3.11929 2.11929 2 3.5 2H4.58579C4.98361 2 5.36514 2.15804 5.64645 2.43934L7.20711 4H10.5C11.724 4 12.7426 4.87965 12.958 6.04127C14.605 6.34148 15.5443 8.22106 14.6616 9.75L13.0766 12.4953C12.5407 13.4235 11.5503 13.9953 10.4785 13.9953H7.06895ZM5.52196 7C4.80743 7 4.14718 7.3812 3.78991 8L2.20492 10.7453C1.62757 11.7453 2.34926 12.9953 3.50396 12.9953L10.4785 12.9953C11.193 12.9953 11.8533 12.6141 12.2105 11.9953L13.7955 9.25C14.3729 8.25 13.6512 7 12.4965 7L5.52196 7Z" },
13084
+ "child": []
13085
+ }]
13086
+ })(props);
13087
+ }
13088
+ function VscFile(props) {
13089
+ return GenIcon({
13090
+ "tag": "svg",
13091
+ "attr": {
13092
+ "viewBox": "0 0 16 16",
13093
+ "fill": "currentColor"
13094
+ },
13095
+ "child": [{
13096
+ "tag": "path",
13097
+ "attr": { "d": "M5 1C3.89543 1 3 1.89543 3 3V13C3 14.1046 3.89543 15 5 15H11C12.1046 15 13 14.1046 13 13V5.41421C13 5.01639 12.842 4.63486 12.5607 4.35355L9.64645 1.43934C9.36514 1.15804 8.98361 1 8.58579 1H5ZM4 3C4 2.44772 4.44772 2 5 2H8V4.5C8 5.32843 8.67157 6 9.5 6H12V13C12 13.5523 11.5523 14 11 14H5C4.44772 14 4 13.5523 4 13V3ZM11.7929 5H9.5C9.22386 5 9 4.77614 9 4.5V2.20711L11.7929 5Z" },
13098
+ "child": []
13099
+ }]
13100
+ })(props);
13101
+ }
13102
+ //#endregion
12488
13103
  //#region src/client/upload.ts
12489
13104
  /**
12490
13105
  * File-upload plumbing for the files window: turn a file picker or a drag-drop
@@ -13005,7 +13620,7 @@ window.__ModuleLoader__.load({
13005
13620
  if (target.id === "vscode") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconVscode16, { size: 16 });
13006
13621
  if (target.id === "cursor") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SiCursor, { size: 16 });
13007
13622
  if (target.id === "zed") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SiZedindustries, { size: 16 });
13008
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCodeOutline16, { size: 16 });
13623
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCodeOutline16, { size: 16 });
13009
13624
  };
13010
13625
  const pinned = openWithTargets.filter((target) => pinnedIds.includes(target.id)).map((target) => ({
13011
13626
  id: `open-with:${target.id}`,
@@ -13051,7 +13666,7 @@ window.__ModuleLoader__.load({
13051
13666
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
13052
13667
  className: sidebar_module_css_default.openWithName,
13053
13668
  children: t("openWithMenu")
13054
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutline14, {
13669
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronRightOutline14, {
13055
13670
  size: 14,
13056
13671
  className: sidebar_module_css_default.openWithChevron,
13057
13672
  "aria-hidden": true
@@ -13119,7 +13734,7 @@ window.__ModuleLoader__.load({
13119
13734
  className: sidebar_module_css_default.explorerName,
13120
13735
  children: entry.name
13121
13736
  }),
13122
- entry.isSymlink && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconLinkOutline16, {
13737
+ entry.isSymlink && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconLinkOutline16, {
13123
13738
  size: 12,
13124
13739
  className: sidebar_module_css_default.explorerSymlink
13125
13740
  }),
@@ -13158,7 +13773,7 @@ window.__ModuleLoader__.load({
13158
13773
  className: sidebar_module_css_default.explorerName,
13159
13774
  children: entry.name
13160
13775
  }),
13161
- entry.isSymlink && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconLinkOutline16, {
13776
+ entry.isSymlink && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconLinkOutline16, {
13162
13777
  size: 12,
13163
13778
  className: sidebar_module_css_default.explorerSymlink
13164
13779
  }),
@@ -13259,7 +13874,7 @@ window.__ModuleLoader__.load({
13259
13874
  ...rowMenu?.isDir === false && onOpenFileNewTab !== void 0 ? [{
13260
13875
  id: "open-new-tab",
13261
13876
  label: t("openFileNewTab"),
13262
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCodeOutline16, { size: 16 })
13877
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCodeOutline16, { size: 16 })
13263
13878
  }] : [],
13264
13879
  ...rowMenu?.isDir === false && onOpenFileSide !== void 0 ? [{
13265
13880
  id: "open-side",
@@ -13270,7 +13885,7 @@ window.__ModuleLoader__.load({
13270
13885
  ...rowMenu?.isDir === false ? [{
13271
13886
  id: "download",
13272
13887
  label: t("download"),
13273
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconDownloadOutline16, { size: 16 })
13888
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconDownloadOutline16, { size: 16 })
13274
13889
  }] : [],
13275
13890
  ...rowMenu?.isDir === true ? [{
13276
13891
  id: "upload-here",
@@ -13280,12 +13895,12 @@ window.__ModuleLoader__.load({
13280
13895
  {
13281
13896
  id: "relative",
13282
13897
  label: t("copyRelative"),
13283
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCopyOutline16, { size: 16 })
13898
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCopyOutline16, { size: 16 })
13284
13899
  },
13285
13900
  {
13286
13901
  id: "absolute",
13287
13902
  label: t("copyAbsolute"),
13288
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCopyOutline16, { size: 16 })
13903
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCopyOutline16, { size: 16 })
13289
13904
  }
13290
13905
  ],
13291
13906
  onSelect: (id) => {
@@ -13735,7 +14350,7 @@ window.__ModuleLoader__.load({
13735
14350
  onClick: () => {
13736
14351
  setRefreshTick((tick) => tick + 1);
13737
14352
  },
13738
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutline16, { size: 14 })
14353
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconRefreshOutline16, { size: 14 })
13739
14354
  }),
13740
14355
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
13741
14356
  type: "button",
@@ -13757,7 +14372,7 @@ window.__ModuleLoader__.load({
13757
14372
  onClick: () => {
13758
14373
  folderInputRef.current?.click();
13759
14374
  },
13760
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconFolderOpen16, { size: 14 })
14375
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconFolderOpen16, { size: 14 })
13761
14376
  }),
13762
14377
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
13763
14378
  ref: fileInputRef,
@@ -14192,7 +14807,7 @@ window.__ModuleLoader__.load({
14192
14807
  onClick: () => {
14193
14808
  controlsRef.current?.save();
14194
14809
  },
14195
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutline16, { size: 14 })
14810
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCheckOutline16, { size: 14 })
14196
14811
  }),
14197
14812
  saveLabel !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
14198
14813
  className: clsx(sidebar_module_css_default.editorStatus, toolbar?.saveState === "failed" && sidebar_module_css_default.editorStatusError),
@@ -14204,7 +14819,7 @@ window.__ModuleLoader__.load({
14204
14819
  "aria-label": t("refresh"),
14205
14820
  title: t("refresh"),
14206
14821
  onClick: refreshFile,
14207
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutline14, { size: 14 })
14822
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconRefreshOutline14, { size: 14 })
14208
14823
  }),
14209
14824
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
14210
14825
  type: "button",
@@ -14213,7 +14828,7 @@ window.__ModuleLoader__.load({
14213
14828
  title: t("editorTreeToggle"),
14214
14829
  "aria-pressed": treeOpen,
14215
14830
  onClick: toggleTree,
14216
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconFolderOpen16, { size: 14 })
14831
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconFolderOpen16, { size: 14 })
14217
14832
  })
14218
14833
  ]
14219
14834
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -14344,72 +14959,72 @@ window.__ModuleLoader__.load({
14344
14959
  document.head.appendChild(tag);
14345
14960
  }
14346
14961
  var SideCardSection_module_css_default = {
14347
- "popupRow": "N4aF0W_popupRow",
14348
- "card": "N4aF0W_card",
14349
- "typedInput": "N4aF0W_typedInput",
14350
- "error": "N4aF0W_error",
14351
- "count": "N4aF0W_count",
14352
- "selectOptionText": "N4aF0W_selectOptionText",
14353
- "openWithRemove": "N4aF0W_openWithRemove",
14962
+ "selectAnchorIcon": "N4aF0W_selectAnchorIcon",
14963
+ "cardSwitchThumb": "N4aF0W_cardSwitchThumb",
14964
+ "switchThumb": "N4aF0W_switchThumb",
14965
+ "switchInput": "N4aF0W_switchInput",
14354
14966
  "cardSwitch": "N4aF0W_cardSwitch",
14355
- "pluginCopyBtn": "N4aF0W_pluginCopyBtn",
14356
- "cardDesc": "N4aF0W_cardDesc",
14357
- "selectAnchorText": "N4aF0W_selectAnchorText",
14358
- "openWithEditorRow": "N4aF0W_openWithEditorRow",
14359
- "openWithFamily": "N4aF0W_openWithFamily",
14967
+ "pluginModal": "N4aF0W_pluginModal",
14360
14968
  "pluginGroupHeading": "N4aF0W_pluginGroupHeading",
14969
+ "percentInput": "N4aF0W_percentInput",
14970
+ "error": "N4aF0W_error",
14971
+ "groupHeading": "N4aF0W_groupHeading",
14361
14972
  "addCard": "N4aF0W_addCard",
14362
- "cardSwitchThumb": "N4aF0W_cardSwitchThumb",
14363
- "intro": "N4aF0W_intro",
14364
- "cardIconChip": "N4aF0W_cardIconChip",
14973
+ "control": "N4aF0W_control",
14974
+ "count": "N4aF0W_count",
14975
+ "row": "N4aF0W_row",
14365
14976
  "pluginJumpBtn": "N4aF0W_pluginJumpBtn",
14366
- "openWithEditorTemplate": "N4aF0W_openWithEditorTemplate",
14367
- "pluginInstall": "N4aF0W_pluginInstall",
14368
- "title": "N4aF0W_title",
14977
+ "openWithFamily": "N4aF0W_openWithFamily",
14978
+ "intro": "N4aF0W_intro",
14979
+ "pluginName": "N4aF0W_pluginName",
14369
14980
  "section": "N4aF0W_section",
14981
+ "card": "N4aF0W_card",
14370
14982
  "selectAnchor": "N4aF0W_selectAnchor",
14983
+ "typedInputNumber": "N4aF0W_typedInputNumber",
14984
+ "openWithHint": "N4aF0W_openWithHint",
14985
+ "title": "N4aF0W_title",
14986
+ "suffix": "N4aF0W_suffix",
14987
+ "cardTop": "N4aF0W_cardTop",
14988
+ "openWithRemove": "N4aF0W_openWithRemove",
14989
+ "pluginCopyBtn": "N4aF0W_pluginCopyBtn",
14990
+ "pluginTopicBtn": "N4aF0W_pluginTopicBtn",
14991
+ "openWithEditorInput": "N4aF0W_openWithEditorInput",
14371
14992
  "cardTitle": "N4aF0W_cardTitle",
14372
- "pluginEntryActions": "N4aF0W_pluginEntryActions",
14373
- "switchTrack": "N4aF0W_switchTrack",
14374
14993
  "pluginList": "N4aF0W_pluginList",
14375
- "pluginModal": "N4aF0W_pluginModal",
14376
- "cardSettings": "N4aF0W_cardSettings",
14377
- "cardOn": "N4aF0W_cardOn",
14378
- "row": "N4aF0W_row",
14379
- "pluginEmpty": "N4aF0W_pluginEmpty",
14380
- "popupDialog": "N4aF0W_popupDialog",
14381
- "pluginDesc": "N4aF0W_pluginDesc",
14382
14994
  "done": "N4aF0W_done",
14995
+ "openWithEditorTemplate": "N4aF0W_openWithEditorTemplate",
14383
14996
  "pluginEntry": "N4aF0W_pluginEntry",
14384
- "grid": "N4aF0W_grid",
14385
- "selectAnchorIcon": "N4aF0W_selectAnchorIcon",
14386
- "cardMain": "N4aF0W_cardMain",
14387
- "popupRows": "N4aF0W_popupRows",
14388
- "cardSwitchTrack": "N4aF0W_cardSwitchTrack",
14389
- "openWithEditorInput": "N4aF0W_openWithEditorInput",
14390
- "percentInput": "N4aF0W_percentInput",
14997
+ "switch": "N4aF0W_switch",
14391
14998
  "rowText": "N4aF0W_rowText",
14392
- "cardTop": "N4aF0W_cardTop",
14393
- "switchThumb": "N4aF0W_switchThumb",
14394
- "selectOption": "N4aF0W_selectOption",
14395
- "control": "N4aF0W_control",
14396
- "typedInputNumber": "N4aF0W_typedInputNumber",
14397
- "cssTextArea": "N4aF0W_cssTextArea",
14398
- "openWithHint": "N4aF0W_openWithHint",
14399
14999
  "selectOptionIcon": "N4aF0W_selectOptionIcon",
14400
- "groupHeading": "N4aF0W_groupHeading",
14401
- "suffix": "N4aF0W_suffix",
14402
- "pluginEntries": "N4aF0W_pluginEntries",
14403
- "desc": "N4aF0W_desc",
14404
- "pluginGroup": "N4aF0W_pluginGroup",
14405
- "switch": "N4aF0W_switch",
14406
- "pluginTopicBtn": "N4aF0W_pluginTopicBtn",
14407
- "group": "N4aF0W_group",
14408
15000
  "pluginEntryHead": "N4aF0W_pluginEntryHead",
14409
15001
  "rowGear": "N4aF0W_rowGear",
14410
- "switchInput": "N4aF0W_switchInput",
14411
- "pluginName": "N4aF0W_pluginName",
14412
- "pluginSearch": "N4aF0W_pluginSearch"
15002
+ "selectOptionText": "N4aF0W_selectOptionText",
15003
+ "desc": "N4aF0W_desc",
15004
+ "selectAnchorText": "N4aF0W_selectAnchorText",
15005
+ "cardDesc": "N4aF0W_cardDesc",
15006
+ "popupDialog": "N4aF0W_popupDialog",
15007
+ "popupRow": "N4aF0W_popupRow",
15008
+ "pluginEmpty": "N4aF0W_pluginEmpty",
15009
+ "group": "N4aF0W_group",
15010
+ "cardOn": "N4aF0W_cardOn",
15011
+ "cardSettings": "N4aF0W_cardSettings",
15012
+ "pluginSearch": "N4aF0W_pluginSearch",
15013
+ "pluginEntries": "N4aF0W_pluginEntries",
15014
+ "openWithEditorRow": "N4aF0W_openWithEditorRow",
15015
+ "pluginDesc": "N4aF0W_pluginDesc",
15016
+ "grid": "N4aF0W_grid",
15017
+ "pluginGroup": "N4aF0W_pluginGroup",
15018
+ "cardIconChip": "N4aF0W_cardIconChip",
15019
+ "cardSwitchTrack": "N4aF0W_cardSwitchTrack",
15020
+ "popupRows": "N4aF0W_popupRows",
15021
+ "selectOption": "N4aF0W_selectOption",
15022
+ "pluginEntryActions": "N4aF0W_pluginEntryActions",
15023
+ "cardMain": "N4aF0W_cardMain",
15024
+ "pluginInstall": "N4aF0W_pluginInstall",
15025
+ "typedInput": "N4aF0W_typedInput",
15026
+ "switchTrack": "N4aF0W_switchTrack",
15027
+ "cssTextArea": "N4aF0W_cssTextArea"
14413
15028
  };
14414
15029
  //#endregion
14415
15030
  //#region src/client/open-with-settings.tsx
@@ -14548,7 +15163,7 @@ window.__ModuleLoader__.load({
14548
15163
  onClick: () => {
14549
15164
  removeCustom(editor.id);
14550
15165
  },
14551
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCloseOutline16, { size: 14 })
15166
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCloseOutline16, { size: 14 })
14552
15167
  })
14553
15168
  ]
14554
15169
  }, editor.id)),
@@ -15029,7 +15644,7 @@ window.__ModuleLoader__.load({
15029
15644
  onClick: () => {
15030
15645
  stageEntry(entry, staged);
15031
15646
  },
15032
- children: staged ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutline16, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, {})
15647
+ children: staged ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconTrashOutline16, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconBranchOutline16, {})
15033
15648
  })]
15034
15649
  }, `${staged ? "s" : "u"}:${entry.path}`);
15035
15650
  };
@@ -15101,7 +15716,7 @@ window.__ModuleLoader__.load({
15101
15716
  onClick: () => {
15102
15717
  refresh();
15103
15718
  },
15104
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutline16, { size: 14 })
15719
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconRefreshOutline16, { size: 14 })
15105
15720
  })
15106
15721
  ]
15107
15722
  }),
@@ -15272,21 +15887,21 @@ window.__ModuleLoader__.load({
15272
15887
  ...fileMenu !== null && (store.getPrefs().workspaceFence === false || isWithinWorkspace(scope.cwd ?? "", resolveSidebarPath(repoRoot ?? selectedWorktree ?? scope.cwd, fileMenu.entry.path))) ? [{
15273
15888
  id: "open",
15274
15889
  label: t("openEditor"),
15275
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCodeOutline16, { size: 14 })
15890
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCodeOutline16, { size: 14 })
15276
15891
  }] : [],
15277
15892
  fileMenu?.staged === true ? {
15278
15893
  id: "stage",
15279
15894
  label: t("unstage"),
15280
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutline16, { size: 14 })
15895
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconTrashOutline16, { size: 14 })
15281
15896
  } : {
15282
15897
  id: "stage",
15283
15898
  label: t("stage"),
15284
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, { size: 14 })
15899
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconBranchOutline16, { size: 14 })
15285
15900
  },
15286
15901
  ...fileMenu !== null && !isUntracked(fileMenu.entry) ? [{
15287
15902
  id: "discard",
15288
15903
  label: t("discard"),
15289
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutline16, { size: 14 }),
15904
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconTrashOutline16, { size: 14 }),
15290
15905
  danger: true
15291
15906
  }] : [],
15292
15907
  {
@@ -15296,12 +15911,12 @@ window.__ModuleLoader__.load({
15296
15911
  {
15297
15912
  id: "relative",
15298
15913
  label: t("copyRelative"),
15299
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCopyOutline16, { size: 14 })
15914
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCopyOutline16, { size: 14 })
15300
15915
  },
15301
15916
  {
15302
15917
  id: "absolute",
15303
15918
  label: t("copyAbsolute"),
15304
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCopyOutline16, { size: 14 })
15919
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCopyOutline16, { size: 14 })
15305
15920
  }
15306
15921
  ],
15307
15922
  onSelect: (id) => {
@@ -15351,17 +15966,17 @@ window.__ModuleLoader__.load({
15351
15966
  {
15352
15967
  id: "copyShort",
15353
15968
  label: t("copyShortHash"),
15354
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCopyOutline16, { size: 14 })
15969
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCopyOutline16, { size: 14 })
15355
15970
  },
15356
15971
  {
15357
15972
  id: "copyFull",
15358
15973
  label: t("copyFullHash"),
15359
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCopyOutline16, { size: 14 })
15974
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCopyOutline16, { size: 14 })
15360
15975
  },
15361
15976
  {
15362
15977
  id: "copySubject",
15363
15978
  label: t("copySubject"),
15364
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCopyOutline16, { size: 14 })
15979
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCopyOutline16, { size: 14 })
15365
15980
  },
15366
15981
  {
15367
15982
  type: "separator",
@@ -15877,7 +16492,7 @@ window.__ModuleLoader__.load({
15877
16492
  "aria-label": t("refresh"),
15878
16493
  title: t("refresh"),
15879
16494
  onClick: refresh,
15880
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutline16, { size: 14 })
16495
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconRefreshOutline16, { size: 14 })
15881
16496
  })]
15882
16497
  }),
15883
16498
  loading && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -16241,7 +16856,7 @@ window.__ModuleLoader__.load({
16241
16856
  title: t("browserBack"),
16242
16857
  disabled: cursor <= 0,
16243
16858
  onClick: goBack,
16244
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronLeftOutline14, {})
16859
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronLeftOutline14, {})
16245
16860
  }),
16246
16861
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
16247
16862
  type: "button",
@@ -16250,7 +16865,7 @@ window.__ModuleLoader__.load({
16250
16865
  title: t("browserForward"),
16251
16866
  disabled: cursor >= history.length - 1,
16252
16867
  onClick: goForward,
16253
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutline14, {})
16868
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronRightOutline14, {})
16254
16869
  }),
16255
16870
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
16256
16871
  type: "button",
@@ -16260,7 +16875,7 @@ window.__ModuleLoader__.load({
16260
16875
  onClick: () => {
16261
16876
  setReloadKey((key) => key + 1);
16262
16877
  },
16263
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutline14, {})
16878
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconRefreshOutline14, {})
16264
16879
  }),
16265
16880
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
16266
16881
  className: sidebar_module_css_default.browserInput,
@@ -16282,7 +16897,7 @@ window.__ModuleLoader__.load({
16282
16897
  onClick: () => {
16283
16898
  navigateTo(input);
16284
16899
  },
16285
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconLinkOutline14, {})
16900
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconLinkOutline14, {})
16286
16901
  }),
16287
16902
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
16288
16903
  type: "button",
@@ -16350,7 +16965,7 @@ window.__ModuleLoader__.load({
16350
16965
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
16351
16966
  className: sidebar_module_css_default.browserBlocked,
16352
16967
  children: [
16353
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutline16, { size: 16 }),
16968
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconWarningOutline16, { size: 16 }),
16354
16969
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
16355
16970
  className: sidebar_module_css_default.browserBlockedTitle,
16356
16971
  children: t("browserEmbedBlocked", { host })
@@ -16379,15 +16994,6 @@ window.__ModuleLoader__.load({
16379
16994
  //#endregion
16380
16995
  //#region src/client/builtins/tabs.tsx
16381
16996
  /**
16382
- * The 7 built-in tab descriptors: the plugin registers its own pages
16383
- * (editor / git / terminal / browser / diff) through
16384
- * the same {@link BetterSidebarService} external plugins use — eating its
16385
- * own dogfood. The terminal descriptor owns its quota (`TERMINAL_LIMIT`)
16386
- * and mints `terminal:<uuid>` ids through `createTab`; the browser mints
16387
- * `browser:<n>` the same way (no quota). The editor IS the files window
16388
- * (the old standalone explorer merged into it).
16389
- */
16390
- /**
16391
16997
  * Lazy wrapper over the terminal view: xterm (and its stylesheet) is fetched
16392
16998
  * only when a terminal tab is first opened (see chunk-loader.ts). The
16393
16999
  * wrapper keeps the descriptor contract `(props) => ReactNode` — Sidebar
@@ -16415,7 +17021,7 @@ window.__ModuleLoader__.load({
16415
17021
  {
16416
17022
  id: "editor",
16417
17023
  title: () => t("files"),
16418
- icon: (size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconFolderOpen16, { size }),
17024
+ icon: (size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconFolderOpen16, { size }),
16419
17025
  order: 10,
16420
17026
  hidden: false,
16421
17027
  dedupeKey: (tab) => tab.path,
@@ -16427,12 +17033,12 @@ window.__ModuleLoader__.load({
16427
17033
  desc: () => t("editorExplorerDesc"),
16428
17034
  options: [{
16429
17035
  value: true,
16430
- icon: (size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPanelLeftOutline16, { size }),
17036
+ icon: (size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconPanelLeftOutline16, { size }),
16431
17037
  title: () => t("editorExplorerMerged"),
16432
17038
  desc: () => t("editorExplorerMergedDesc")
16433
17039
  }, {
16434
17040
  value: false,
16435
- icon: (size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCodeOutline16, { size }),
17041
+ icon: (size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCodeOutline16, { size }),
16436
17042
  title: () => t("editorExplorerSplit"),
16437
17043
  desc: () => t("editorExplorerSplitDesc")
16438
17044
  }]
@@ -16460,7 +17066,7 @@ window.__ModuleLoader__.load({
16460
17066
  {
16461
17067
  id: "git",
16462
17068
  title: () => t("git"),
16463
- icon: (size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, { size }),
17069
+ icon: (size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconBranchOutline16, { size }),
16464
17070
  order: 20,
16465
17071
  single: true,
16466
17072
  component: ({ ctx, store, scope, visible, onOpenDiff }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(GitView, {
@@ -16807,7 +17413,7 @@ window.__ModuleLoader__.load({
16807
17413
  {
16808
17414
  id: "code",
16809
17415
  title: () => t("viewerCode"),
16810
- icon: (size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCodeOutline16, { size }),
17416
+ icon: (size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCodeOutline16, { size }),
16811
17417
  exts: [],
16812
17418
  priority: -100,
16813
17419
  fetchStrategy: "fsRead",
@@ -16816,7 +17422,7 @@ window.__ModuleLoader__.load({
16816
17422
  {
16817
17423
  id: "binary-download",
16818
17424
  title: () => t("viewerBinary"),
16819
- icon: (size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconDownloadOutline16, { size }),
17425
+ icon: (size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconDownloadOutline16, { size }),
16820
17426
  exts: [
16821
17427
  "doc",
16822
17428
  "xls",
@@ -17161,7 +17767,7 @@ window.__ModuleLoader__.load({
17161
17767
  event.stopPropagation();
17162
17768
  onClose(tab.id);
17163
17769
  },
17164
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCloseFill14, {})
17770
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCloseFill14, {})
17165
17771
  })
17166
17772
  ]
17167
17773
  }, tab.id);
@@ -17192,7 +17798,7 @@ window.__ModuleLoader__.load({
17192
17798
  setMenuOpen((v) => !v);
17193
17799
  setTabMenu(null);
17194
17800
  },
17195
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutline16, {})
17801
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconPlusOutline16, {})
17196
17802
  })
17197
17803
  }),
17198
17804
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
@@ -17904,7 +18510,7 @@ window.__ModuleLoader__.load({
17904
18510
  event.stopPropagation();
17905
18511
  onClose();
17906
18512
  },
17907
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCloseFill14, {})
18513
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCloseFill14, {})
17908
18514
  }),
17909
18515
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
17910
18516
  open: menu !== null,
@@ -19967,7 +20573,7 @@ window.__ModuleLoader__.load({
19967
20573
  onClick: () => {
19968
20574
  store.reduce(toggleBottomPanel);
19969
20575
  },
19970
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCloseFill14, {})
20576
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCloseFill14, {})
19971
20577
  })
19972
20578
  }),
19973
20579
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -21124,21 +21730,21 @@ window.__ModuleLoader__.load({
21124
21730
  document.head.appendChild(tag);
21125
21731
  }
21126
21732
  var CodingPlanModelsSettings_module_css_default = {
21127
- "modelTop": "kn_HcG_modelTop",
21733
+ "models": "kn_HcG_models",
21734
+ "modelSelected": "kn_HcG_modelSelected",
21735
+ "modelDescription": "kn_HcG_modelDescription",
21736
+ "group": "kn_HcG_group",
21128
21737
  "modelId": "kn_HcG_modelId",
21129
- "refresh": "kn_HcG_refresh",
21130
21738
  "meta": "kn_HcG_meta",
21131
- "modelSelected": "kn_HcG_modelSelected",
21132
- "models": "kn_HcG_models",
21133
- "modelName": "kn_HcG_modelName",
21134
- "description": "kn_HcG_description",
21135
- "model": "kn_HcG_model",
21136
21739
  "headingRow": "kn_HcG_headingRow",
21740
+ "description": "kn_HcG_description",
21741
+ "modelName": "kn_HcG_modelName",
21742
+ "refresh": "kn_HcG_refresh",
21137
21743
  "heading": "kn_HcG_heading",
21138
- "modelDescription": "kn_HcG_modelDescription",
21139
- "group": "kn_HcG_group",
21140
- "selected": "kn_HcG_selected",
21141
- "status": "kn_HcG_status"
21744
+ "model": "kn_HcG_model",
21745
+ "status": "kn_HcG_status",
21746
+ "modelTop": "kn_HcG_modelTop",
21747
+ "selected": "kn_HcG_selected"
21142
21748
  };
21143
21749
  //#endregion
21144
21750
  //#region src/client/CodingPlanModelsSettings.tsx
@@ -21584,7 +22190,7 @@ window.__ModuleLoader__.load({
21584
22190
  className: SideCardSection_module_css_default.selectAnchorText,
21585
22191
  children: selected.length === 0 ? placeholder ?? "—" : selected.map((option) => textOf$1(option.title)).join(", ")
21586
22192
  }),
21587
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, { size: 12 })
22193
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronDownOutline14, { size: 12 })
21588
22194
  ]
21589
22195
  });
21590
22196
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
@@ -21948,7 +22554,7 @@ window.__ModuleLoader__.load({
21948
22554
  className: SideCardSection_module_css_default.cardSettings,
21949
22555
  "aria-label": `${props.title} ${t("settingsPopup")}`,
21950
22556
  onClick: props.onOpenSettings,
21951
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconSettingsOutline16, { size: 12 }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("settingsPopup") })]
22557
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconSettingsOutline16, { size: 12 }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("settingsPopup") })]
21952
22558
  })]
21953
22559
  });
21954
22560
  };
@@ -22102,7 +22708,7 @@ window.__ModuleLoader__.load({
22102
22708
  onClick: () => {
22103
22709
  setStripSettingsOpen(true);
22104
22710
  },
22105
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconSettingsOutline16, { size: 14 })
22711
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconSettingsOutline16, { size: 14 })
22106
22712
  })]
22107
22713
  })]
22108
22714
  })
@@ -22145,7 +22751,7 @@ window.__ModuleLoader__.load({
22145
22751
  className: SideCardSection_module_css_default.cardTop,
22146
22752
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
22147
22753
  className: SideCardSection_module_css_default.cardIconChip,
22148
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutline16, { size: 16 })
22754
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconPlusOutline16, { size: 16 })
22149
22755
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
22150
22756
  className: SideCardSection_module_css_default.cardTitle,
22151
22757
  children: t("addPluginsTabCard")
@@ -22188,7 +22794,7 @@ window.__ModuleLoader__.load({
22188
22794
  className: SideCardSection_module_css_default.cardTop,
22189
22795
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
22190
22796
  className: SideCardSection_module_css_default.cardIconChip,
22191
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutline16, { size: 16 })
22797
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconPlusOutline16, { size: 16 })
22192
22798
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
22193
22799
  className: SideCardSection_module_css_default.cardTitle,
22194
22800
  children: t("addPluginsViewerCard")
@@ -22307,48 +22913,48 @@ window.__ModuleLoader__.load({
22307
22913
  document.head.appendChild(tag);
22308
22914
  }
22309
22915
  var UsageHeatmapSection_module_css_default = {
22310
- "stateError": "iUwB6a_stateError",
22311
- "total": "iUwB6a_total",
22312
- "dshSidebarUsageSpin": "iUwB6a_dshSidebarUsageSpin",
22916
+ "headerRow": "iUwB6a_headerRow",
22313
22917
  "retry": "iUwB6a_retry",
22314
- "gridBody": "iUwB6a_gridBody",
22918
+ "grid": "iUwB6a_grid",
22919
+ "cellDay": "iUwB6a_cellDay",
22315
22920
  "cellFuture": "iUwB6a_cellFuture",
22316
- "state": "iUwB6a_state",
22317
- "spin": "iUwB6a_spin",
22318
- "tooltipTokens": "iUwB6a_tooltipTokens",
22921
+ "section": "iUwB6a_section",
22319
22922
  "tooltip": "iUwB6a_tooltip",
22320
- "todayDot": "iUwB6a_todayDot",
22321
- "empty": "iUwB6a_empty",
22322
- "footer": "iUwB6a_footer",
22323
- "tooltipToday": "iUwB6a_tooltipToday",
22324
22923
  "totalValue": "iUwB6a_totalValue",
22924
+ "tooltipTokens": "iUwB6a_tooltipTokens",
22925
+ "statLabel": "iUwB6a_statLabel",
22926
+ "spin": "iUwB6a_spin",
22325
22927
  "monthLabel": "iUwB6a_monthLabel",
22326
- "tooltipBelow": "iUwB6a_tooltipBelow",
22928
+ "tooltipToday": "iUwB6a_tooltipToday",
22929
+ "state": "iUwB6a_state",
22930
+ "todayDot": "iUwB6a_todayDot",
22931
+ "cellToday": "iUwB6a_cellToday",
22932
+ "dshSidebarUsageSpin": "iUwB6a_dshSidebarUsageSpin",
22933
+ "refreshButton": "iUwB6a_refreshButton",
22327
22934
  "group": "iUwB6a_group",
22328
- "grid": "iUwB6a_grid",
22329
- "section": "iUwB6a_section",
22935
+ "tooltipSplit": "iUwB6a_tooltipSplit",
22936
+ "total": "iUwB6a_total",
22330
22937
  "cellTokens": "iUwB6a_cellTokens",
22331
- "statValue": "iUwB6a_statValue",
22332
- "refreshButton": "iUwB6a_refreshButton",
22333
22938
  "overview": "iUwB6a_overview",
22334
- "headerRow": "iUwB6a_headerRow",
22335
- "tooltipDate": "iUwB6a_tooltipDate",
22336
- "tooltipSplit": "iUwB6a_tooltipSplit",
22939
+ "monthButton": "iUwB6a_monthButton",
22940
+ "stateError": "iUwB6a_stateError",
22337
22941
  "todayLabel": "iUwB6a_todayLabel",
22338
- "cellToday": "iUwB6a_cellToday",
22942
+ "tooltipBelow": "iUwB6a_tooltipBelow",
22943
+ "tooltipDate": "iUwB6a_tooltipDate",
22944
+ "statValue": "iUwB6a_statValue",
22945
+ "totalUnit": "iUwB6a_totalUnit",
22339
22946
  "weekdays": "iUwB6a_weekdays",
22340
- "cellDay": "iUwB6a_cellDay",
22341
- "cellHover": "iUwB6a_cellHover",
22947
+ "cell": "iUwB6a_cell",
22342
22948
  "monthNav": "iUwB6a_monthNav",
22343
- "totalUnit": "iUwB6a_totalUnit",
22344
22949
  "totalNumber": "iUwB6a_totalNumber",
22950
+ "legend": "iUwB6a_legend",
22951
+ "footer": "iUwB6a_footer",
22952
+ "gridBody": "iUwB6a_gridBody",
22345
22953
  "legendSwatch": "iUwB6a_legendSwatch",
22346
- "statLabel": "iUwB6a_statLabel",
22347
- "cell": "iUwB6a_cell",
22348
- "stat": "iUwB6a_stat",
22954
+ "cellHover": "iUwB6a_cellHover",
22349
22955
  "stats": "iUwB6a_stats",
22350
- "legend": "iUwB6a_legend",
22351
- "monthButton": "iUwB6a_monthButton"
22956
+ "stat": "iUwB6a_stat",
22957
+ "empty": "iUwB6a_empty"
22352
22958
  };
22353
22959
  //#endregion
22354
22960
  //#region src/client/UsageHeatmapSection.tsx
@@ -22505,7 +23111,7 @@ window.__ModuleLoader__.load({
22505
23111
  className: UsageHeatmapSection_module_css_default.monthButton,
22506
23112
  "aria-label": t("usagePrevMonth"),
22507
23113
  onClick: goPrev,
22508
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronLeftOutline14, { size: 14 })
23114
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronLeftOutline14, { size: 14 })
22509
23115
  }),
22510
23116
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
22511
23117
  className: UsageHeatmapSection_module_css_default.monthLabel,
@@ -22518,7 +23124,7 @@ window.__ModuleLoader__.load({
22518
23124
  "aria-label": t("usageNextMonth"),
22519
23125
  onClick: goNext,
22520
23126
  disabled: nextMonthDisabled,
22521
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutline14, { size: 14 })
23127
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronRightOutline14, { size: 14 })
22522
23128
  })
22523
23129
  ]
22524
23130
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
@@ -22526,7 +23132,7 @@ window.__ModuleLoader__.load({
22526
23132
  className: UsageHeatmapSection_module_css_default.refreshButton,
22527
23133
  onClick: reload,
22528
23134
  disabled: load.kind === "loading",
22529
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutline14, {
23135
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconRefreshOutline14, {
22530
23136
  size: 14,
22531
23137
  className: load.kind === "loading" ? UsageHeatmapSection_module_css_default.spin : void 0
22532
23138
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("usageRefresh") })]
@@ -22668,7 +23274,7 @@ window.__ModuleLoader__.load({
22668
23274
  ] }) : load.kind === "loading" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
22669
23275
  className: UsageHeatmapSection_module_css_default.state,
22670
23276
  role: "status",
22671
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconLoadingOutline16, {
23277
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconLoadingOutline16, {
22672
23278
  className: UsageHeatmapSection_module_css_default.spin,
22673
23279
  size: 16
22674
23280
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("usageLoading") })]
@@ -22724,34 +23330,34 @@ window.__ModuleLoader__.load({
22724
23330
  document.head.appendChild(tag);
22725
23331
  }
22726
23332
  var AiRatioSection_module_css_default = {
22727
- "queryRow": "JtMahq_queryRow",
22728
- "overview": "JtMahq_overview",
22729
- "section": "JtMahq_section",
22730
- "dash": "JtMahq_dash",
23333
+ "primaryButton": "JtMahq_primaryButton",
23334
+ "ratioBar": "JtMahq_ratioBar",
22731
23335
  "card": "JtMahq_card",
23336
+ "addedValue": "JtMahq_addedValue",
22732
23337
  "ratioCardHigh": "JtMahq_ratioCardHigh",
23338
+ "dateCell": "JtMahq_dateCell",
23339
+ "cardLabel": "JtMahq_cardLabel",
23340
+ "pageInfo": "JtMahq_pageInfo",
23341
+ "dateInput": "JtMahq_dateInput",
23342
+ "dash": "JtMahq_dash",
22733
23343
  "commitsValue": "JtMahq_commitsValue",
23344
+ "cardValue": "JtMahq_cardValue",
23345
+ "stateError": "JtMahq_stateError",
23346
+ "overview": "JtMahq_overview",
22734
23347
  "table": "JtMahq_table",
23348
+ "aiValue": "JtMahq_aiValue",
23349
+ "section": "JtMahq_section",
23350
+ "adoptedValue": "JtMahq_adoptedValue",
23351
+ "exportButton": "JtMahq_exportButton",
23352
+ "pager": "JtMahq_pager",
22735
23353
  "ratioCardLow": "JtMahq_ratioCardLow",
23354
+ "queryRow": "JtMahq_queryRow",
23355
+ "state": "JtMahq_state",
22736
23356
  "cardRatio": "JtMahq_cardRatio",
22737
- "aiValue": "JtMahq_aiValue",
22738
- "dateCell": "JtMahq_dateCell",
22739
23357
  "tableHeading": "JtMahq_tableHeading",
22740
23358
  "tableWrap": "JtMahq_tableWrap",
22741
- "cardLabel": "JtMahq_cardLabel",
22742
- "pageInfo": "JtMahq_pageInfo",
22743
- "exportButton": "JtMahq_exportButton",
22744
- "state": "JtMahq_state",
22745
- "stateError": "JtMahq_stateError",
22746
- "primaryButton": "JtMahq_primaryButton",
22747
- "addedValue": "JtMahq_addedValue",
22748
23359
  "num": "JtMahq_num",
22749
- "pager": "JtMahq_pager",
22750
- "dateInput": "JtMahq_dateInput",
22751
- "ratioBar": "JtMahq_ratioBar",
22752
- "ratioValue": "JtMahq_ratioValue",
22753
- "adoptedValue": "JtMahq_adoptedValue",
22754
- "cardValue": "JtMahq_cardValue"
23360
+ "ratioValue": "JtMahq_ratioValue"
22755
23361
  };
22756
23362
  //#endregion
22757
23363
  //#region src/client/AiRatioSection.tsx
@@ -27930,7 +28536,7 @@ to{transform:translateX(-8px)}
27930
28536
  const PROJECT_NAME = "ChatCode CLI";
27931
28537
  const HERO_TITLE = "与世界,深一度对话";
27932
28538
  const LEGACY_HOST_BRAND_TEXT = /DSH\s*(?:Local\s*Build|本地构建)|DeepSeek\s*Harness|ChatCode\s*CLI/giu;
27933
- const HOST_BRAND_LABEL_TEXT = /^(?:DSH\s*(?:Local\s*Build|本地构建)|ChatCode\s*CLI)$/iu;
28539
+ const LEGACY_HOST_BRAND_LABEL_TEXT = /^(?:DSH\s*(?:Local\s*Build|本地构建)|ChatCode\s*CLI)$/iu;
27934
28540
  const HOST_BUILD_VERSION_TEXT = /^v?\d+\.\d+\.\d+(?:[-+][0-9a-z.-]+)*$/iu;
27935
28541
  const HERO_HEADLINE = /探索未至之境/u;
27936
28542
  const HERO_PREVIEW_TEXT = /^(?:预览版|Preview)$/iu;
@@ -28082,7 +28688,7 @@ body[data-ds-dark-theme] .dut-unicom-primary-action:not(:hover){background:#9B0B
28082
28688
  badge.setAttribute("aria-hidden", "true");
28083
28689
  });
28084
28690
  document.querySelectorAll("body *").forEach((element) => {
28085
- if (element.childElementCount !== 0 || !HOST_BRAND_LABEL_TEXT.test(element.textContent?.trim() ?? "")) return;
28691
+ if (element.childElementCount !== 0 || !LEGACY_HOST_BRAND_LABEL_TEXT.test(element.textContent?.trim() ?? "")) return;
28086
28692
  if (element.textContent !== PROJECT_NAME) element.textContent = PROJECT_NAME;
28087
28693
  element.classList.add("dut-brand-title");
28088
28694
  replaceLogoBesideBrandLabel(element);