@dsh-workbench/core 0.3.10 → 0.3.11

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 (82) hide show
  1. package/README.md +19 -7
  2. package/bin/dsh-workbench +2 -2
  3. package/client.js +1648 -973
  4. package/cordis.patch.yml +60 -35
  5. package/dist/client/client.body.js +1648 -973
  6. package/dist/client/index.js +1333 -658
  7. package/dist/host/index.js +2896 -2334
  8. package/dist/types/app/client.d.ts +2 -1
  9. package/dist/types/app/layouts/env-gate/boot-gate.d.ts +1 -1
  10. package/dist/types/app/layouts/market/use-module-versions.d.ts +13 -2
  11. package/dist/types/app/layouts/rightbar/MarketView.d.ts +6 -3
  12. package/dist/types/app/layouts/rightbar/market-act.d.ts +6 -3
  13. package/dist/types/app/layouts/rightbar/market-settle-hold.d.ts +2 -0
  14. package/dist/types/app/layouts/rightbar/market-settle.d.ts +20 -0
  15. package/dist/types/app/layouts/rightbar/market-update-verdict.d.ts +41 -0
  16. package/dist/types/app/layouts/rightbar/market-view-text.d.ts +4 -1
  17. package/dist/types/app/layouts/rightbar/store.d.ts +14 -0
  18. package/dist/types/app/layouts/sidebar/LongTaskDot.d.ts +12 -0
  19. package/dist/types/app/layouts/sidebar/LongTaskHover.d.ts +12 -0
  20. package/dist/types/app/layouts/sidebar/edition-boot.d.ts +24 -0
  21. package/dist/types/app/layouts/sidebar/edition.d.ts +22 -0
  22. package/dist/types/app/layouts/workbench-settings/ConfigSyncItem.d.ts +5 -0
  23. package/dist/types/app/layouts/workbench-settings/SettingsItem.d.ts +17 -0
  24. package/dist/types/app/layouts/workbench-settings/SidebarEditionItem.d.ts +11 -0
  25. package/dist/types/app/layouts/workbench-settings/WorkbenchSettingsSection.d.ts +11 -0
  26. package/dist/types/modules/panels/model/approval.d.ts +12 -4
  27. package/dist/types/modules/panels/model/diy-browser-tools.d.ts +1 -1
  28. package/dist/types/modules/panels/model/diy-context.d.ts +31 -14
  29. package/dist/types/modules/panels/model/diy-page.d.ts +3 -2
  30. package/dist/types/modules/panels/model/diy-record.d.ts +3 -3
  31. package/dist/types/modules/panels/model/diy-report.d.ts +6 -7
  32. package/dist/types/modules/panels/model/market-dependency-update.d.ts +21 -0
  33. package/dist/types/modules/panels/model/market-dispatch.d.ts +1 -0
  34. package/dist/types/modules/panels/model/market-types.d.ts +1 -0
  35. package/dist/types/modules/panels/model/market-update-bundle.d.ts +25 -0
  36. package/dist/types/modules/panels/model/market-verify.d.ts +31 -0
  37. package/dist/types/modules/panels/unit.d.ts +3 -4
  38. package/dist/types/shared/api/bundle-install.d.ts +13 -0
  39. package/dist/types/shared/api/host/approval-gate.d.ts +39 -0
  40. package/dist/types/shared/api/host/bundle-routes.d.ts +2 -1
  41. package/dist/types/shared/api/host/diy-artifacts.d.ts +14 -0
  42. package/dist/types/shared/api/host/diy-modules.d.ts +41 -0
  43. package/dist/types/shared/api/host/host-routes.d.ts +13 -0
  44. package/dist/types/shared/api/host/permission-mode.d.ts +9 -0
  45. package/dist/types/shared/api/host/runtime-seed.d.ts +2 -0
  46. package/dist/types/shared/api/host/self-update.d.ts +9 -2
  47. package/dist/types/shared/api/host/sidebar-edition.d.ts +46 -0
  48. package/dist/types/shared/api/host/workspace-root.d.ts +13 -0
  49. package/dist/types/shared/api/sidebar-edition.d.ts +14 -0
  50. package/dist/types/shared/api/unit-board.d.ts +20 -0
  51. package/dist/types/shared/api/write-outcome.d.ts +15 -0
  52. package/dist/types/shared/components/IconModules.d.ts +8 -0
  53. package/dist/types/shared/components/blocker-action.d.ts +16 -0
  54. package/dist/types/shared/hooks/sidebar-edition.d.ts +7 -0
  55. package/dist/types/shared/hooks/use-capabilities.d.ts +5 -0
  56. package/dist/types/shared/hooks/use-capability-gate.d.ts +1 -2
  57. package/dist/types/shared/hooks/use-host-write.d.ts +1 -1
  58. package/dist/types/shared/hooks/use-unit-board.d.ts +1 -1
  59. package/docs/HANDOFF.md +3 -3
  60. package/docs/OPERATIONS.md +16 -5
  61. package/package.json +3 -3
  62. package/preset/diy.patch.yml +2 -2
  63. package/profile/isolation.patch.yml +11 -0
  64. package/skills/workbench-module-diy/BUILD.md +62 -131
  65. package/skills/workbench-module-diy/COPY.md +89 -0
  66. package/skills/workbench-module-diy/DATASOURCE.md +84 -112
  67. package/skills/workbench-module-diy/DESIGN.md +75 -109
  68. package/skills/workbench-module-diy/FAMILY.md +70 -54
  69. package/skills/workbench-module-diy/KIT.md +77 -133
  70. package/skills/workbench-module-diy/LINKAGE.md +66 -105
  71. package/skills/workbench-module-diy/PANEL.md +79 -171
  72. package/skills/workbench-module-diy/REVIEW.md +67 -81
  73. package/skills/workbench-module-diy/SKILL.md +57 -96
  74. package/skills/workbench-module-diy/STEPS.md +66 -69
  75. package/skills/workbench-module-diy/TOOLING.md +34 -51
  76. package/skills/workbench-module-diy/TOOLS.md +110 -103
  77. package/skills/workbench-module-diy/WIRING.md +51 -83
  78. package/skills/workbench-module-diy/WRITES.md +89 -142
  79. package/dist/types/app/layouts/config-sync/ConfigSyncSection.d.ts +0 -5
  80. package/dist/types/shared/api/host/diy-workshop.d.ts +0 -23
  81. package/dist/types/shared/api/host/workshop-root.d.ts +0 -16
  82. /package/dist/types/shared/{api/host/diy-workshop.test.d.ts → components/blocker-action.test.d.ts} +0 -0
@@ -1,4 +1,5 @@
1
1
  import { Button, Checkbox, CodeBlock, DiffBlock, DisclosureRow, HoverCard, IconCheckCircleFillRegular, IconCheckOutlineRegular, IconChevronDownOutlineRegular, IconCodeOutlineRegular, IconCordisPluginOutlineRegular, IconDownloadOutlineRegular, IconEditOutlineRegular, IconEllipsisOutlineRegular, IconFlatListOutlineRegular, IconFolderCloseRegular, IconFolderOpenRegular, IconInfoOutlineRegular, IconLinkOutlineRegular, IconNewChatOutlineRegular, IconPanelLeftOutlineRegular, IconPauseOutlineRegular, IconPinFillRegular, IconPlayOutlineRegular, IconPlusOutlineRegular, IconRefreshOutlineRegular, IconRightUpOutlineRegular, IconSearchOutlineRegular, IconSettingsOutlineRegular, IconStopFillRegular, IconTrashOutlineRegular, IconWarningOutlineRegular, Menu, Modal, RiskConfirmation, StateDot, Switch, Tag, TextShimmer, Tooltip, useAnchoredPosition, useDismissOnOutsidePointer, writeClipboard } from "@deepseek-ai/dsh-client-ui-primitives";
2
+ import { Fragment, createElement, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
2
3
  //#region \0rolldown/runtime.js
3
4
  var __defProp = Object.defineProperty;
4
5
  var __exportAll = (all, no_symbols) => {
@@ -459,47 +460,6 @@ function factOfRoute(route) {
459
460
  return route;
460
461
  }
461
462
  //#endregion
462
- //#region ../shared/dist/api/host-write.js
463
- /**
464
- * 由通道与资源拼出写路由。
465
- * @param channel 写通道。
466
- * @param resource 该通道下的资源名。
467
- * @returns 路由字符串;provision 只有一段,其余是 channel/resource。
468
- */
469
- function writeRoute(channel, resource) {
470
- if (channel === "provision") return "provision";
471
- return `${channel}/${resource}`;
472
- }
473
- /**
474
- * 把写通道的响应翻成 WriteOutcome。
475
- * @param response 写口回的响应;null 表示请求本身没成(网络断了,宿主没答)。
476
- * @param networkText 拿不到任何服务端文案时兜底的那句。
477
- * @returns 失败时 message 优先用服务端自己的话,没有才用响应正文或 networkText。
478
- */
479
- function writeOutcomeOf(response, networkText) {
480
- if (response === null) return {
481
- ok: false,
482
- message: networkText
483
- };
484
- if (!response.ok) {
485
- const box = response;
486
- const own = typeof box.error?.message === "string" && box.error.message !== "" ? box.error.message : void 0;
487
- const fallback = typeof box.text === "string" && box.text !== "" ? box.text : networkText;
488
- const detail = typeof box.error?.detail === "string" ? box.error.detail : void 0;
489
- const helpUrl = typeof box.error?.helpUrl === "string" && box.error.helpUrl !== "" ? box.error.helpUrl : void 0;
490
- return {
491
- ok: false,
492
- message: own ?? fallback,
493
- ...detail === void 0 ? {} : { detail },
494
- ...helpUrl === void 0 ? {} : { helpUrl }
495
- };
496
- }
497
- return {
498
- ok: true,
499
- value: response
500
- };
501
- }
502
- //#endregion
503
463
  //#region ../shared/dist/api/long-task.js
504
464
  /**
505
465
  * 单元的长任务读口路由。
@@ -587,49 +547,6 @@ function longTaskStopPress(stage) {
587
547
  */
588
548
  var LONG_TASK_STOP_ARM_MS = 3e3;
589
549
  //#endregion
590
- //#region ../shared/dist/api/unit-board.js
591
- /**
592
- * 判这张卡现在能不能画。
593
- * @param capability 环境读数;还没读到给 null。
594
- * @param mode 闸档。
595
- * @returns mode 为 none 或读数还没到都放行(先放行让它读);读到明确不通过(ok 与 unchecked 之外)才拦。
596
- */
597
- function gateOf(capability, mode) {
598
- if (mode === "none") return { gated: true };
599
- if (capability === null) return { gated: true };
600
- return { gated: capability.status === "ok" || capability.status === "unchecked" };
601
- }
602
- /**
603
- * 把候选卡住态分档,每档只留第一个。
604
- * @param candidates 候选(可能含 undefined),按优先级从高到低给。
605
- * @returns 分出的 blocker 与 notice;已经有 blocker 时不带 notice(挡住就不必再提示)。
606
- */
607
- function splitBlocker(candidates) {
608
- let blocker;
609
- let notice;
610
- for (const candidate of candidates) {
611
- if (candidate === void 0) continue;
612
- if (candidate.severity === "block") {
613
- blocker ??= candidate;
614
- continue;
615
- }
616
- notice ??= candidate;
617
- }
618
- return {
619
- ...blocker === void 0 ? {} : { blocker },
620
- ...blocker !== void 0 || notice === void 0 ? {} : { notice }
621
- };
622
- }
623
- /**
624
- * 由读口错误算出「出错搭车强探」的防抖键:同一个键只自动重探一次。
625
- * @param error 读口错误;undefined 表示这次没有错误。
626
- * @returns 键字符串;空 code 归一到 unknown。
627
- */
628
- function probeKeyOf(error) {
629
- if (error === void 0) return null;
630
- return error.code === "" ? "unknown" : error.code;
631
- }
632
- //#endregion
633
550
  //#region ../shared/dist/api/unit.js
634
551
  /**
635
552
  * 判这个模块要不要往外装东西。
@@ -727,43 +644,34 @@ var react = __require("react");
727
644
  */
728
645
  var h = react.createElement;
729
646
  /**
730
- * React 的 `Fragment` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
647
+ * React 的 `Fragment` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
731
648
  */
732
- var Fragment = react.Fragment;
649
+ var Fragment$1 = react.Fragment;
733
650
  /**
734
- * React 的 `Component` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
651
+ * React 的 `Component` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
735
652
  */
736
653
  var Component = react.Component;
737
654
  react.createContext;
738
655
  react.useContext;
739
656
  /**
740
- * React 的 `useState` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
657
+ * React 的 `useState` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
741
658
  */
742
- var useState = react.useState;
659
+ var useState$1 = react.useState;
743
660
  /**
744
- * React 的 `useEffect` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
661
+ * React 的 `useEffect` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
745
662
  */
746
- var useEffect = react.useEffect;
663
+ var useEffect$1 = react.useEffect;
664
+ react.useLayoutEffect;
747
665
  /**
748
- * React 的 `useLayoutEffect` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
666
+ * React 的 `useMemo` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
749
667
  */
750
- var useLayoutEffect = react.useLayoutEffect;
668
+ var useMemo$1 = react.useMemo;
669
+ react.useCallback;
751
670
  /**
752
- * React 的 `useMemo` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
671
+ * React 的 `useRef` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
753
672
  */
754
- var useMemo = react.useMemo;
755
- /**
756
- * React 的 `useCallback` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
757
- */
758
- var useCallback = react.useCallback;
759
- /**
760
- * React 的 `useRef` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
761
- */
762
- var useRef = react.useRef;
763
- /**
764
- * React 的 `useSyncExternalStore` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
765
- */
766
- var useSyncExternalStore = react.useSyncExternalStore;
673
+ var useRef$1 = react.useRef;
674
+ react.useSyncExternalStore;
767
675
  //#endregion
768
676
  //#region ../shared/dist/components/Activity.js
769
677
  /**
@@ -944,7 +852,7 @@ function ApprovalDetail(props) {
944
852
  }));
945
853
  }
946
854
  const shell = props.renderShell?.(input, t);
947
- if (shell !== void 0 && shell !== null) return h(Fragment, null, shell);
855
+ if (shell !== void 0 && shell !== null) return h(Fragment$1, null, shell);
948
856
  if (command === "") return null;
949
857
  return h(CodeBlock, {
950
858
  code: command,
@@ -1100,7 +1008,7 @@ function ChoiceMenu(input) {
1100
1008
  role: "status"
1101
1009
  }, h(Spinner, { size: 14 }), h("span", { className: "wb-choiceLoadingText" }, input.loadingText ?? "…")) : input.options.length === 0 ? input.emptyText === void 0 ? null : h("span", { className: "wb-choiceEmpty" }, input.emptyText) : input.options.map((option) => {
1102
1010
  const row = input.rowOf(option.value);
1103
- return h(Fragment, { key: option.value }, h("label", { className: `wb-choiceOption${row.checked ? " wb-choiceOptionOn" : ""}` }, h("input", {
1011
+ return h(Fragment$1, { key: option.value }, h("label", { className: `wb-choiceOption${row.checked ? " wb-choiceOptionOn" : ""}` }, h("input", {
1104
1012
  className: input.multi ? "wb-checkbox" : "wb-radio",
1105
1013
  type: input.multi ? "checkbox" : "radio",
1106
1014
  name: input.name,
@@ -1537,13 +1445,13 @@ function revealFirstProblem(root) {
1537
1445
  */
1538
1446
  function Form(props) {
1539
1447
  const { fields, onSubmit, submit, cancel, extra, busy = false, disabled = false, problem } = props;
1540
- const [done, setDone] = useState(false);
1541
- const [reveal, setReveal] = useState(0);
1542
- const rootRef = useRef(null);
1448
+ const [done, setDone] = useState$1(false);
1449
+ const [reveal, setReveal] = useState$1(0);
1450
+ const rootRef = useRef$1(null);
1543
1451
  const shown = visibleFieldsOf(fields);
1544
1452
  const problems = formProblemsOf(shown, done);
1545
1453
  reportDuplicateKeys(shown);
1546
- useEffect(() => {
1454
+ useEffect$1(() => {
1547
1455
  if (reveal === 0) return;
1548
1456
  const root = rootRef.current;
1549
1457
  if (root !== null) revealFirstProblem(root);
@@ -1628,9 +1536,9 @@ function RowLink({ href, text }) {
1628
1536
  * @returns 一行长任务。
1629
1537
  */
1630
1538
  function LongTaskRow(props) {
1631
- const [stepsOpen, setStepsOpen] = useState(false);
1632
- const [rawOpen, setRawOpen] = useState(false);
1633
- const [armed, setArmed] = useState(false);
1539
+ const [stepsOpen, setStepsOpen] = useState$1(false);
1540
+ const [rawOpen, setRawOpen] = useState$1(false);
1541
+ const [armed, setArmed] = useState$1(false);
1634
1542
  const failed = props.status === "failed";
1635
1543
  const problem = props.problem ?? "";
1636
1544
  const raw = (props.raw ?? "").trim();
@@ -1638,7 +1546,7 @@ function LongTaskRow(props) {
1638
1546
  const stop = props.stop;
1639
1547
  const busy = stop?.busy === true;
1640
1548
  const stopWhy = stop?.failed ?? "";
1641
- useEffect(() => {
1549
+ useEffect$1(() => {
1642
1550
  if (!armed) return void 0;
1643
1551
  const timer = setTimeout(() => setArmed(false), LONG_TASK_STOP_ARM_MS);
1644
1552
  return () => clearTimeout(timer);
@@ -1675,7 +1583,7 @@ function LongTaskRow(props) {
1675
1583
  disabled: busy,
1676
1584
  onClick: onStopPress,
1677
1585
  onBlur: () => setArmed(false)
1678
- }, h(IconStopFillRegular, { size: 12 }), armed ? h("span", { className: "wb-longTaskStopLabel" }, stop.askLabel) : null)), problem === "" ? null : h("p", { className: "wb-longTaskProblem" }, problem), stopWhy === "" ? null : h("p", { className: "wb-longTaskStopWhy" }, stopWhy), !failed ? null : h(Fragment, null, steps.length === 0 || props.stepsTitle === void 0 ? null : h(DisclosureRow, {
1586
+ }, h(IconStopFillRegular, { size: 12 }), armed ? h("span", { className: "wb-longTaskStopLabel" }, stop.askLabel) : null)), problem === "" ? null : h("p", { className: "wb-longTaskProblem" }, problem), stopWhy === "" ? null : h("p", { className: "wb-longTaskStopWhy" }, stopWhy), !failed ? null : h(Fragment$1, null, steps.length === 0 || props.stepsTitle === void 0 ? null : h(DisclosureRow, {
1679
1587
  className: "wb-longTaskDump",
1680
1588
  icon: h(IconFlatListOutlineRegular, { size: 14 }),
1681
1589
  title: props.stepsTitle,
@@ -1812,7 +1720,7 @@ function selectTriggerNode(args) {
1812
1720
  "aria-label": args.ariaLabel,
1813
1721
  title: args.title,
1814
1722
  onClick: args.onOpen
1815
- }, args.iconOnly ? h("span", { className: "wb-selectIcon" }, args.icon) : h(Fragment, null, args.icon === void 0 ? null : h("span", { className: "wb-selectIcon" }, args.icon), h("span", { className: "wb-selectValue" }, args.value), h("span", { className: "wb-selectChevron" }, h(IconChevronDownOutlineRegular, { size: 14 }))));
1723
+ }, args.iconOnly ? h("span", { className: "wb-selectIcon" }, args.icon) : h(Fragment$1, null, args.icon === void 0 ? null : h("span", { className: "wb-selectIcon" }, args.icon), h("span", { className: "wb-selectValue" }, args.value), h("span", { className: "wb-selectChevron" }, h(IconChevronDownOutlineRegular, { size: 14 }))));
1816
1724
  }
1817
1725
  /**
1818
1726
  * 名单还没读到时的触发器:禁用 + `aria-busy` 的按钮,`SelectField` 在 `loading` 那档画它。
@@ -1882,7 +1790,7 @@ function revealNode() {
1882
1790
  return found instanceof HTMLElement ? found : null;
1883
1791
  }
1884
1792
  function useRevealOnOpen(open, revealId) {
1885
- useEffect(() => {
1793
+ useEffect$1(() => {
1886
1794
  if (!open || revealId === void 0) return;
1887
1795
  revealNode()?.scrollIntoView({ block: "nearest" });
1888
1796
  }, [open, revealId]);
@@ -1983,24 +1891,24 @@ function selectEntries(shown, emptyText, revealId) {
1983
1891
  }
1984
1892
  function useSelectState(props) {
1985
1893
  const { options, filter = defaultSelectFilter, emptyText, open: openProp, onOpenChange } = props;
1986
- const [openState, setOpenState] = useState(false);
1987
- const [query, setQuery] = useState("");
1988
- const [cursor, setCursor] = useState(null);
1989
- const boxRef = useRef(null);
1990
- const triggerRef = useRef(null);
1991
- const wasOpenRef = useRef(false);
1992
- const pickedRef = useRef(false);
1993
- const closedByUsRef = useRef(false);
1894
+ const [openState, setOpenState] = useState$1(false);
1895
+ const [query, setQuery] = useState$1("");
1896
+ const [cursor, setCursor] = useState$1(null);
1897
+ const boxRef = useRef$1(null);
1898
+ const triggerRef = useRef$1(null);
1899
+ const wasOpenRef = useRef$1(false);
1900
+ const pickedRef = useRef$1(false);
1901
+ const closedByUsRef = useRef$1(false);
1994
1902
  const open = openProp ?? openState;
1995
1903
  const setOpen = (next) => {
1996
1904
  if (openProp === void 0) setOpenState(next);
1997
1905
  onOpenChange?.(next);
1998
1906
  };
1999
- useEffect(() => {
1907
+ useEffect$1(() => {
2000
1908
  if (!open || props.search === false) return;
2001
1909
  boxRef.current?.querySelector("input")?.focus();
2002
1910
  }, [open, props.search]);
2003
- useEffect(() => {
1911
+ useEffect$1(() => {
2004
1912
  if (open) {
2005
1913
  wasOpenRef.current = true;
2006
1914
  return;
@@ -2014,7 +1922,7 @@ function useSelectState(props) {
2014
1922
  if (!closedByUs || picked) return;
2015
1923
  triggerRef.current?.focus();
2016
1924
  }, [open]);
2017
- const shown = useMemo(() => filterSelectOptions(options, query, filter), [
1925
+ const shown = useMemo$1(() => filterSelectOptions(options, query, filter), [
2018
1926
  options,
2019
1927
  query,
2020
1928
  filter
@@ -2291,52 +2199,6 @@ function IconNpm({ size = 16 }) {
2291
2199
  }));
2292
2200
  }
2293
2201
  /**
2294
- * 四宫格:"模块"这个概念的通用单色图标(侧栏、面板那颗钮、市场节的标题);默认 16px。
2295
- * @param props.size - 边长像素,同时给 `width` 与 `height`。
2296
- * @returns 一枚 `aria-hidden` 的 svg。
2297
- */
2298
- function IconModules({ size = 16 }) {
2299
- return h("svg", {
2300
- width: size,
2301
- height: size,
2302
- viewBox: "0 0 16 16",
2303
- fill: "none",
2304
- "aria-hidden": "true"
2305
- }, h("rect", {
2306
- x: "2.5",
2307
- y: "2.5",
2308
- width: "4.6",
2309
- height: "4.6",
2310
- rx: "1.2",
2311
- stroke: "currentColor",
2312
- strokeWidth: "1.2"
2313
- }), h("rect", {
2314
- x: "8.9",
2315
- y: "2.5",
2316
- width: "4.6",
2317
- height: "4.6",
2318
- rx: "1.2",
2319
- stroke: "currentColor",
2320
- strokeWidth: "1.2"
2321
- }), h("rect", {
2322
- x: "2.5",
2323
- y: "8.9",
2324
- width: "4.6",
2325
- height: "4.6",
2326
- rx: "1.2",
2327
- stroke: "currentColor",
2328
- strokeWidth: "1.2"
2329
- }), h("rect", {
2330
- x: "8.9",
2331
- y: "8.9",
2332
- width: "4.6",
2333
- height: "4.6",
2334
- rx: "1.2",
2335
- stroke: "currentColor",
2336
- strokeWidth: "1.2"
2337
- }));
2338
- }
2339
- /**
2340
2202
  * 模块类型标:渐变方块 + 白四宫格,用在"这是个模块"的行首;品牌物,颜色不跟主题走。默认 16px。
2341
2203
  * @param props.size - 边长像素,同时给 `width` 与 `height`。
2342
2204
  * @returns 一枚 `aria-hidden` 的 svg。
@@ -2433,16 +2295,6 @@ function writeText(key, value) {
2433
2295
  else window.localStorage.setItem(key, value);
2434
2296
  } catch {}
2435
2297
  }
2436
- /** 读一个布尔开关:键不存在时返回 `fallback`,只有存进去的 `'true'` 算真。 */
2437
- function readFlag(key, fallback) {
2438
- const raw = readText(key);
2439
- if (raw === null) return fallback;
2440
- return raw === "true";
2441
- }
2442
- /** 把一个布尔开关写进 localStorage(存 `'true'` / `'false'`);失败静默。 */
2443
- function writeFlag(key, value) {
2444
- writeText(key, value ? "true" : "false");
2445
- }
2446
2298
  //#endregion
2447
2299
  //#region ../shared/dist/i18n/index.js
2448
2300
  /** 外壳自带的两份词表(`zh` 为基准、`en` 同构):`client.tsx` 拿它当合并各套件词表的底座。 */
@@ -2535,7 +2387,7 @@ var dictionaries = {
2535
2387
  "panels.buildModule": "造一个模块",
2536
2388
  "panels.failed": "改配置失败了,再试一次。",
2537
2389
  "panels.dragHint": "拖动调整顺序",
2538
- "panels.unknownStep": "这一层没有套件提供",
2390
+ "panels.unknownStep": "这一块还没有面板",
2539
2391
  "panels.labelWithHint": "{label}({hint})",
2540
2392
  "panels.hintJoin": ";",
2541
2393
  "panels.dep.failed": "⚠ 起不来",
@@ -2570,6 +2422,14 @@ var dictionaries = {
2570
2422
  "panels.market.install": "安装",
2571
2423
  "panels.market.update": "更新",
2572
2424
  "panels.market.swapSlow": "还没换上:可能网慢或没装上。再点一次「更新」;一直这样就把 dsh 重启一遍。",
2425
+ "panels.market.updateNoChange": "没换成:点下去是 {from},跑完盘上还是这一版;源上最新是 {latest}。",
2426
+ "panels.market.updateUnknownVersion": "(问不到)",
2427
+ "panels.market.updateGone": "没换成:更新跑完盘上读不到这个模块。",
2428
+ "panels.market.updateRestored": "没换成:盘上已经读不到新版本,已把 {version} 装回去。",
2429
+ "panels.market.updateBehind": "装上了 {installed},但源上最新是 {latest} —— 没更到最新,可以再点一次。",
2430
+ "panels.market.selfUpdateFailed": "自更新没成:{reason}",
2431
+ "panels.market.selfUpdateUnknown": "外部进程没留下原因(看 ~/.dsh/workbench/self-update.log)",
2432
+ "panels.market.selfUpdateRolledBack": "没换成,已回滚到 {version}。",
2573
2433
  "panels.market.uninstall": "卸载",
2574
2434
  "panels.market.uninstallLabel": "卸载 {name}",
2575
2435
  "panels.market.installing": "正在安装…",
@@ -2600,7 +2460,7 @@ var dictionaries = {
2600
2460
  "panels.market.pluginKeptUnsure": "文件先留着:这台机器上还有模块看不出用了什么,说不准谁在用它。",
2601
2461
  "panels.market.pluginKeptHeld": "文件留着:你自己装的那一份,模块放手不动它。",
2602
2462
  "panels.market.pluginKeptUnnamed": "文件先留着:看不出这是哪个插件,说不准谁在用它。",
2603
- "panels.market.pluginBroken": "这份装坏了:看不出它是个插件。可以卸载,或者直接跟 agent 说:用 workbench_modules_install_bundle 按包名再装一次。",
2463
+ "panels.market.pluginBroken": "这份插件装坏了:认不出它是什么。可以先卸载,再让 agent 按包名重装一次。",
2604
2464
  "panels.market.restartNeeded": "新版装好了,重启一次才生效。",
2605
2465
  "panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
2606
2466
  "panels.market.recheck": "重新检查更新",
@@ -2645,7 +2505,7 @@ var dictionaries = {
2645
2505
  "panels.market.add.cancelledTitle": "已取消",
2646
2506
  "panels.market.add.failureNetworkHost": "无法连接 {host}。Git 地址和 .tgz 直链不经过安装源,需要本机能直接访问它或配置代理;如果这个模块也发布到了 npm,请改填包名。",
2647
2507
  "panels.market.add.problemInvalid": "无法识别这个包名或地址:{reason}",
2648
- "panels.market.add.problemInstalled": "该模块已安装",
2508
+ "panels.market.add.problemInstalled": "这个模块已经装过了(要换版本请带上 @版本)",
2649
2509
  "panels.market.add.problemNotFound": "未找到相关模块",
2650
2510
  "panels.market.add.problemNotPackage": "该路径不存在或不是有效的模块包",
2651
2511
  "panels.market.add.problemNotBundle": "这个包装不进这里:{reason}。这个入口按包名认工作台模块和 opencli 插件,两种都能装;但 git 地址和 tarball 判断不出它是什么 —— 要是它其实是这两样之一,请改填包名或本地目录。",
@@ -2666,7 +2526,7 @@ var dictionaries = {
2666
2526
  "panels.market.add.failureIntegrity": "下载的安装包校验失败",
2667
2527
  "panels.market.add.failureTimeout": "安装超时",
2668
2528
  "panels.market.add.failurePnpmMissing": "没有找到 pnpm,无法安装",
2669
- "panels.market.add.failureInstalled": "它已经在这份 profile 里了:这一版 dsh 开着热更新,同一个包不许就地覆盖装(得先卸载再装),而这次也没能把它卸下来",
2529
+ "panels.market.add.failureInstalled": "它已经装在这份工作台里了。同一个包不能就地覆盖,得先卸载再装;这次卸载也没成功。",
2670
2530
  "panels.market.add.failureGeneric": "安装过程中出错,原因见安装详情",
2671
2531
  "panels.market.add.approveTitle": "需要你允许安装脚本",
2672
2532
  "panels.market.add.approveCaution": "只允许你信得过的包:安装脚本会以你的权限在这台机器上运行。",
@@ -2704,7 +2564,7 @@ var dictionaries = {
2704
2564
  "panels.market.add.doneApplied": "装好了,已经生效。",
2705
2565
  "panels.market.add.doneRestart": "装好了,重启一次才生效。",
2706
2566
  "panels.market.add.restartWhy": "为什么这一版要重启:{reason}",
2707
- "panels.market.add.restartWhy.no-hmr": "这个 profile 只在启动时应用改动(没开热换)",
2567
+ "panels.market.add.restartWhy.no-hmr": "这个配置只在启动时应用改动(没开热更新)",
2708
2568
  "panels.market.add.restartWhy.package-moved": "某个已经装着的包换到了新的目录,或者这一下换掉了 dsh 自己提供的那份",
2709
2569
  "panels.market.add.restartWhy.host-module": "这一下动到了 dsh 自己加载的模块",
2710
2570
  "panels.market.add.restartWhy.unmanaged-plugin": "这一下动到了插件清单之外正在跑的插件",
@@ -2719,17 +2579,17 @@ var dictionaries = {
2719
2579
  "panels.market.add.remove": "移除它",
2720
2580
  "panels.market.add.problem.invalidSpec": "这个写法不认:不能是空的,也不能以横杠开头。",
2721
2581
  "panels.market.add.problem.alreadyInstalled": "这个包已经在 profile 里了(要换版本请带上 @版本)。",
2722
- "panels.market.add.problem.notFound": "源上没有这个包。",
2723
- "panels.market.add.problem.notAPackage": "这个位置没有包。",
2724
- "panels.market.add.problem.notABundle": "它是一个 npm 包,但不是 dsh 插件包(没有 bundle patch)。",
2725
- "panels.market.add.problem.network": "源连不上。",
2726
- "panels.market.add.problem.unknown": "预检没通过(原因未知)。",
2582
+ "panels.market.add.problem.notFound": "源上没有这个包。换个包名或版本再试。",
2583
+ "panels.market.add.problem.notAPackage": "这个位置没有包。选一个包含 package.json 的目录。",
2584
+ "panels.market.add.problem.notABundle": "它是一个 npm 包,但不是 dsh 插件包(缺 dsh 的接线声明)。",
2585
+ "panels.market.add.problem.network": "源连不上。检查网络后重试。",
2586
+ "panels.market.add.problem.unknown": "预检没通过(原因未知)。展开安装详情看原始输出,或重试。",
2727
2587
  "panels.market.add.reason.invalidSpec": "写法不认",
2728
2588
  "panels.market.add.reason.incompatible": "它要的 dsh 版本和这台机器上的不一致",
2729
2589
  "panels.market.add.reason.notBundle": "它不是一个 dsh 插件包",
2730
2590
  "panels.market.add.reason.notRemovable": "它是安装自带的组合包,不能卸",
2731
2591
  "panels.market.add.reason.bundleInUse": "还有东西在用它,卸不掉",
2732
- "panels.market.add.reason.stopProfile": "这个 profile 没开热更新,得先停掉进程",
2592
+ "panels.market.add.reason.stopProfile": "这个配置没开热更新,得先停掉进程",
2733
2593
  "panels.market.add.reason.staleApproval": "要允许的安装脚本已经变了,重新来一次",
2734
2594
  "panels.market.add.reason.operationError": "pnpm 执行出错(详情见安装输出)",
2735
2595
  "panels.market.add.reason.buildBlocked": "pnpm 拦下了安装脚本",
@@ -2784,11 +2644,11 @@ var dictionaries = {
2784
2644
  "env.bridge.extensionLink": "去 Chrome 应用商店装扩展",
2785
2645
  "env.bridge.profile": "连上了多个浏览器 profile,但没选默认的那个:先看有哪些(下面这条命令),再选一个。",
2786
2646
  "env.bridge.stale": "默认的浏览器 profile 已经失效(它记的是上一次的扩展实例):重新选一个。",
2787
- "env.bridge.unknown": "没认出是哪种问题:下面原始输出里有 opencli 自己给的步骤。",
2647
+ "env.bridge.unknown": "没认出是哪种问题:展开原始输出,按里面的步骤处理。",
2788
2648
  "env.fix.title": "怎么解决",
2789
2649
  "env.fix.why": "工作台用它自己那份 opencli(与你在终端里那套分开装,互不影响),这台机器上还没装好它。",
2790
2650
  "env.fix.whyPath": "opencli 装上了,但当前环境还找不到它 —— 通常是 PATH 或终端会话的问题。",
2791
- "env.fix.whyShell": "工作台拿不到执行命令的通道,所以取不了数据 —— 这一步用户自己装不了。",
2651
+ "env.fix.whyShell": "工作台拿不到执行命令的通道,所以取不了数据 —— 这一步你装不了,需要有人处理后台环境。",
2792
2652
  "env.fix.step": "在终端里运行下面这条命令,装好之后点「重试」:",
2793
2653
  "env.fix.stepPath": "新开一个终端窗口(或确认 npm 的全局 bin 目录在 PATH 里),然后点「重试」。",
2794
2654
  "env.fix.stepShell": "重启一次工作台(或 dsh);如果反复出现,说明执行通道没配好。",
@@ -2800,9 +2660,9 @@ var dictionaries = {
2800
2660
  "env.diy.ok": "可用",
2801
2661
  "env.diy.short": "挂不起来",
2802
2662
  "env.diy.hold": "DIY 模式挂不起来 —— 升级 dsh 后点「重试」,也可以先进工作台。",
2803
- "env.diy.why": "「工作台 DIY」是 dsh 的一个 agent preset,而它是照这份外壳验过的那一代 dsh 生成的:这台机器上的 dsh 比它旧,其中几行 dsh 根本没有,于是这个模式整个挂不起来。dsh 的模式选择器只列挂得起来的,进去之后它会整个不出现 —— 面板与其它功能不受影响。",
2804
- "env.diy.rows": "这一代 dsh 缺这几行:{rows}",
2805
- "env.diy.noRow": "体检没在 dsh 的 preset 名单里看到「工作台 DIY」—— 多半是这份 bundle 的 preset 补丁没生效。",
2663
+ "env.diy.why": "这台机器上的 dsh 比工作台验过的旧,DIY 模式挂不起来;面板和其它功能不受影响。升级 dsh 后重启再试。",
2664
+ "env.diy.rows": "这一代 dsh 缺这几项:{rows}",
2665
+ "env.diy.noRow": "体检没在 dsh 的模式名单里看到「工作台 DIY 模式」—— 多半是工作台这份安装没带上对应的模式补丁。",
2806
2666
  "env.diy.step": "升级 dsh,然后重启一次工作台:",
2807
2667
  "env.diy.continue": "先进入工作台",
2808
2668
  "env.copyCommand": "复制命令",
@@ -2838,6 +2698,18 @@ var dictionaries = {
2838
2698
  "board.title": "工作台面板",
2839
2699
  "panel.conversation": "对话",
2840
2700
  "panels.label": "全局面板",
2701
+ "workbenchSettings.nav": "工作台设置",
2702
+ "workbenchSettings.lead": "工作台自己这一侧的配置都收在这里。",
2703
+ "sidebarEdition.nav": "会话列表",
2704
+ "sidebarEdition.lead": "左栏整条用哪一套:官方 dsh 的,还是工作台自己的。",
2705
+ "sidebarEdition.official": "官方",
2706
+ "sidebarEdition.officialHint": "跟 dsh 官方一致、最稳:搜索、视图选项、显示更多、归档、添加工作区都齐,升级也不等我们适配。想省心就选它。",
2707
+ "sidebarEdition.custom": "自定义",
2708
+ "sidebarEdition.customHint": "为多项目工作流做的:项目下拉一屏一个项目,会话按最近更新排,两端淡出、跑马灯、工坊 DIY 新会话。项目多时更顺手。",
2709
+ "sidebarEdition.saving": "配置中…",
2710
+ "sidebarEdition.reloadRequired": "已写入。刷新页面后生效(不用重启工作台)。",
2711
+ "sidebarEdition.reload": "刷新页面",
2712
+ "sidebarEdition.failed": "这一档没写进去,再试一次。",
2841
2713
  "configSync.nav": "配置同步",
2842
2714
  "configSync.lead": "把另一个 profile 里显式配过的行搬过来 —— 来源随你选。",
2843
2715
  "configSync.source": "来源",
@@ -2860,8 +2732,8 @@ var dictionaries = {
2860
2732
  "configSync.code.expandAria": "展开差异(还有 {count} 行)",
2861
2733
  "configSync.code.expand": "展开剩余 {count} 行",
2862
2734
  "configSync.missing": "{pkg} 还没装:这一行搬过来也不会生效 —— 先 `dsh plugin --profile {profile} add {pkg}`,或在模块市场里装",
2863
- "configSync.apply": "同步选中的 {count} 行",
2864
- "configSync.applyNone": "先勾几行",
2735
+ "configSync.apply": "同步选中的 {count} 项",
2736
+ "configSync.applyNone": "请选择同步内容",
2865
2737
  "configSync.applying": "正在写入…",
2866
2738
  "configSync.applied": "已写入工作台配置 · 已生效",
2867
2739
  "configSync.appliedIds": "这次写进去:{ids}",
@@ -2869,7 +2741,7 @@ var dictionaries = {
2869
2741
  "configSync.nothing": "没有需要同步的内容",
2870
2742
  "configSync.unreadable": "读不到 {path}:{reason}",
2871
2743
  "configSync.noSource": "这台机器上只有工作台这一个 profile,没有可同步的来源",
2872
- "configSync.emptyProviders": "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把 llm- 那几行搬过来,或自己去「模型」里配。",
2744
+ "configSync.emptyProviders": "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把模型供应商那几行搬过来,或自己去「模型」里配。",
2873
2745
  "configSync.failed": "同步没成功,再试一次。",
2874
2746
  "debug.workspace": "这个工作区",
2875
2747
  "debug.status": "「{title}」调试中",
@@ -2990,7 +2862,7 @@ var dictionaries = {
2990
2862
  "panels.buildModule": "Build a module",
2991
2863
  "panels.failed": "Could not save the change. Try again.",
2992
2864
  "panels.dragHint": "Drag to reorder",
2993
- "panels.unknownStep": "No suite provides this view",
2865
+ "panels.unknownStep": "No panel for this view yet",
2994
2866
  "panels.labelWithHint": "{label} ({hint})",
2995
2867
  "panels.hintJoin": "; ",
2996
2868
  "panels.dep.failed": "⚠ failed to start",
@@ -3025,6 +2897,14 @@ var dictionaries = {
3025
2897
  "panels.market.install": "Install",
3026
2898
  "panels.market.update": "Update",
3027
2899
  "panels.market.swapSlow": "Not swapped yet — maybe a slow or failed download. Press Update again; if it stays like this, restart dsh.",
2900
+ "panels.market.updateNoChange": "Not updated: you were on {from}, and after the run the disk still has that version; the newest on the registry is {latest}.",
2901
+ "panels.market.updateUnknownVersion": "(unknown)",
2902
+ "panels.market.updateGone": "Not updated: after the run the module cannot be read from disk.",
2903
+ "panels.market.updateRestored": "Not updated: the new version was missing from disk, so {version} was put back.",
2904
+ "panels.market.updateBehind": "Installed {installed}, but the newest on the registry is {latest} — not the latest; you can update once more.",
2905
+ "panels.market.selfUpdateFailed": "Self-update failed: {reason}",
2906
+ "panels.market.selfUpdateUnknown": "the outside process left no reason (see ~/.dsh/workbench/self-update.log)",
2907
+ "panels.market.selfUpdateRolledBack": "Not swapped; rolled back to {version}.",
3028
2908
  "panels.market.uninstall": "Uninstall",
3029
2909
  "panels.market.uninstallLabel": "Uninstall {name}",
3030
2910
  "panels.market.installing": "Installing…",
@@ -3055,7 +2935,7 @@ var dictionaries = {
3055
2935
  "panels.market.pluginKeptUnsure": "Files kept for now: some modules on this machine do not say what they use, so it is unclear who needs it.",
3056
2936
  "panels.market.pluginKeptHeld": "Files kept: this one is yours, and a module letting go will not remove it.",
3057
2937
  "panels.market.pluginKeptUnnamed": "Files kept for now: this one cannot be identified as a plugin, so it is unclear who needs it.",
3058
- "panels.market.pluginBroken": "This install is broken: it cannot be identified as a plugin. Uninstall it, or tell the agent to reinstall it by package name with workbench_modules_install_bundle.",
2938
+ "panels.market.pluginBroken": "This plugin install is broken: it cannot be identified. Uninstall it first, then ask the agent to reinstall it by package name.",
3059
2939
  "panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
3060
2940
  "panels.market.foot": "After installing, enable it in the panel page of that project.",
3061
2941
  "panels.market.recheck": "Check for updates",
@@ -3100,7 +2980,7 @@ var dictionaries = {
3100
2980
  "panels.market.add.cancelledTitle": "Cancelled",
3101
2981
  "panels.market.add.failureNetworkHost": "Cannot reach {host}. Git URLs and .tgz links bypass the registry, so this machine needs direct access or a proxy; if the module is also on npm, use its package name instead.",
3102
2982
  "panels.market.add.problemInvalid": "Cannot read this package name or address: {reason}",
3103
- "panels.market.add.problemInstalled": "This module is already installed",
2983
+ "panels.market.add.problemInstalled": "This module is already installed (add @version to switch versions)",
3104
2984
  "panels.market.add.problemNotFound": "No such module found",
3105
2985
  "panels.market.add.problemNotPackage": "That path does not exist or is not a valid module package",
3106
2986
  "panels.market.add.problemNotBundle": "This package cannot be installed here: {reason}. This entry recognises workbench modules and opencli plugins by package name, and installs either; but a git URL or a tarball does not reveal what it is — if it is really one of those two, use its package name or a local folder instead.",
@@ -3121,7 +3001,7 @@ var dictionaries = {
3121
3001
  "panels.market.add.failureIntegrity": "The downloaded package failed its integrity check",
3122
3002
  "panels.market.add.failureTimeout": "The install timed out",
3123
3003
  "panels.market.add.failurePnpmMissing": "pnpm was not found, cannot install",
3124
- "panels.market.add.failureInstalled": "It is already in this profile: this dsh runs with hot reload, which refuses to install over the same package (remove it first) — and removing it failed too",
3004
+ "panels.market.add.failureInstalled": "It is already installed in this workbench. The same package cannot be installed over itself: uninstall it first, then install again. The uninstall did not succeed this time.",
3125
3005
  "panels.market.add.failureGeneric": "Something went wrong during install — see the install details",
3126
3006
  "panels.market.add.approveTitle": "Your approval is needed for install scripts",
3127
3007
  "panels.market.add.approveCaution": "Only allow packages you trust: install scripts run on this machine with your permissions.",
@@ -3159,7 +3039,7 @@ var dictionaries = {
3159
3039
  "panels.market.add.doneApplied": "Installed and live.",
3160
3040
  "panels.market.add.doneRestart": "Installed — restart once to pick it up.",
3161
3041
  "panels.market.add.restartWhy": "Why this needs a restart: {reason}",
3162
- "panels.market.add.restartWhy.no-hmr": "this profile only applies changes at startup (no hot reload)",
3042
+ "panels.market.add.restartWhy.no-hmr": "this configuration only applies changes at startup (hot reload is off)",
3163
3043
  "panels.market.add.restartWhy.package-moved": "an installed package now resolves to another directory, or the change replaced something dsh itself provides",
3164
3044
  "panels.market.add.restartWhy.host-module": "the change reaches modules dsh itself loaded",
3165
3045
  "panels.market.add.restartWhy.unmanaged-plugin": "the change reaches a plugin running outside the plugin list",
@@ -3174,17 +3054,17 @@ var dictionaries = {
3174
3054
  "panels.market.add.remove": "Remove it",
3175
3055
  "panels.market.add.problem.invalidSpec": "That is not a spec we accept: it cannot be empty or start with a dash.",
3176
3056
  "panels.market.add.problem.alreadyInstalled": "That package is already in the profile (add @version to switch versions).",
3177
- "panels.market.add.problem.notFound": "No such package on that source.",
3178
- "panels.market.add.problem.notAPackage": "There is no package at that location.",
3179
- "panels.market.add.problem.notABundle": "It is an npm package, but not a dsh plugin (no bundle patch).",
3180
- "panels.market.add.problem.network": "The source is unreachable.",
3181
- "panels.market.add.problem.unknown": "The check did not pass (reason unknown).",
3057
+ "panels.market.add.problem.notFound": "No such package on that source. Try another name or version.",
3058
+ "panels.market.add.problem.notAPackage": "There is no package at that location. Pick a folder that contains a package.json.",
3059
+ "panels.market.add.problem.notABundle": "It is an npm package, but not a dsh plugin (it is missing the dsh wiring declaration).",
3060
+ "panels.market.add.problem.network": "The source is unreachable. Check the network and retry.",
3061
+ "panels.market.add.problem.unknown": "The check did not pass (reason unknown). Open the install details for the raw output, or retry.",
3182
3062
  "panels.market.add.reason.invalidSpec": "the spec is not accepted",
3183
3063
  "panels.market.add.reason.incompatible": "it wants a different dsh version than this machine runs",
3184
3064
  "panels.market.add.reason.notBundle": "it is not a dsh plugin package",
3185
3065
  "panels.market.add.reason.notRemovable": "it ships with the installation and cannot be removed",
3186
3066
  "panels.market.add.reason.bundleInUse": "something is still using it",
3187
- "panels.market.add.reason.stopProfile": "this profile has no hot reload, so stop the process first",
3067
+ "panels.market.add.reason.stopProfile": "this configuration has no hot reload, so stop the process first",
3188
3068
  "panels.market.add.reason.staleApproval": "the scripts to allow changed — start over",
3189
3069
  "panels.market.add.reason.operationError": "pnpm failed (see the install output)",
3190
3070
  "panels.market.add.reason.buildBlocked": "pnpm blocked install scripts",
@@ -3239,11 +3119,11 @@ var dictionaries = {
3239
3119
  "env.bridge.extensionLink": "Get the extension in the Chrome Web Store",
3240
3120
  "env.bridge.profile": "Several browser profiles are connected but none is the default: list them (command below), then pick one.",
3241
3121
  "env.bridge.stale": "The default browser profile is stale (it names an extension instance that no longer exists): pick one again.",
3242
- "env.bridge.unknown": "Could not tell what went wrong: the raw output below has the steps opencli itself suggests.",
3122
+ "env.bridge.unknown": "Could not tell what went wrong. Expand the raw output and follow the steps in it.",
3243
3123
  "env.fix.title": "How to fix it",
3244
3124
  "env.fix.why": "The workbench uses its own opencli (installed separately from the one in your terminal), and it is not set up on this machine yet.",
3245
3125
  "env.fix.whyPath": "opencli is installed, but this environment cannot find it — usually a PATH or shell-session issue.",
3246
- "env.fix.whyShell": "The workbench has no shell channel, so it cannot fetch data — nothing the user can install.",
3126
+ "env.fix.whyShell": "The workbench has no shell channel, so it cannot fetch data — you cannot install this from here; someone needs to fix the background environment.",
3247
3127
  "env.fix.step": "Run this in a terminal, then hit Retry:",
3248
3128
  "env.fix.stepPath": "Open a new terminal window (or make sure npm’s global bin directory is on PATH), then hit Retry.",
3249
3129
  "env.fix.stepShell": "Restart the workbench (or dsh); if it keeps happening, the shell channel is not wired up.",
@@ -3255,9 +3135,9 @@ var dictionaries = {
3255
3135
  "env.diy.ok": "Available",
3256
3136
  "env.diy.short": "Cannot load",
3257
3137
  "env.diy.hold": "DIY mode cannot load — upgrade dsh, then hit Retry; or enter the workbench first.",
3258
- "env.diy.why": "“Workbench DIY” is a dsh agent preset, and it is generated from the dsh generation this shell was verified against. The dsh on this machine is older and does not ship some of those rows, so the whole preset fails to mount. dsh lists only the presets that mount, so the mode will simply not appear — panels and everything else are unaffected.",
3259
- "env.diy.rows": "This dsh is missing these rows: {rows}",
3260
- "env.diy.noRow": "The health check did not find “Workbench DIY” in dsh’s preset roster — most likely this bundle’s preset patch did not apply.",
3138
+ "env.diy.why": "The dsh on this machine is older than the one this workbench was verified against, so DIY mode cannot load. Panels and everything else are unaffected. Upgrade dsh and restart.",
3139
+ "env.diy.rows": "This dsh is missing these items: {rows}",
3140
+ "env.diy.noRow": "The health check did not find “Workbench DIY mode” in dsh’s mode roster — the workbench install most likely did not include the matching mode patch.",
3261
3141
  "env.diy.step": "Upgrade dsh, then restart the workbench:",
3262
3142
  "env.diy.continue": "Enter the workbench anyway",
3263
3143
  "env.copyCommand": "Copy command",
@@ -3293,6 +3173,18 @@ var dictionaries = {
3293
3173
  "board.title": "Workbench panel",
3294
3174
  "panel.conversation": "Conversation",
3295
3175
  "panels.label": "Global panels",
3176
+ "workbenchSettings.nav": "Workbench settings",
3177
+ "workbenchSettings.lead": "Settings the workbench itself owns live here.",
3178
+ "sidebarEdition.nav": "Session list",
3179
+ "sidebarEdition.lead": "Which whole left column to use: the official dsh one, or the workbench’s own.",
3180
+ "sidebarEdition.official": "Official",
3181
+ "sidebarEdition.officialHint": "Matches dsh exactly and stays stable: search, view options, show more, archive, add workspace — no waiting for us to catch up. Pick it to keep things simple.",
3182
+ "sidebarEdition.custom": "Custom",
3183
+ "sidebarEdition.customHint": "Built for multi-project work: one project per dropdown, recency-first sessions, edge fades, marquee, DIY new session. Easier when you juggle projects.",
3184
+ "sidebarEdition.saving": "Configuring…",
3185
+ "sidebarEdition.reloadRequired": "Saved. Reload the page to apply — no workbench restart needed.",
3186
+ "sidebarEdition.reload": "Reload page",
3187
+ "sidebarEdition.failed": "That choice did not save; try again.",
3296
3188
  "configSync.nav": "Config sync",
3297
3189
  "configSync.lead": "Bring over the rows another profile configures explicitly — pick any profile as the source.",
3298
3190
  "configSync.source": "Source",
@@ -3315,8 +3207,8 @@ var dictionaries = {
3315
3207
  "configSync.code.expandAria": "Expand the diff ({count} more lines)",
3316
3208
  "configSync.code.expand": "Show {count} more lines",
3317
3209
  "configSync.missing": "{pkg} is not installed: the row will not take effect — run `dsh plugin --profile {profile} add {pkg}`, or install it from the module market",
3318
- "configSync.apply": "Sync {count} selected",
3319
- "configSync.applyNone": "Pick some rows first",
3210
+ "configSync.apply": "Sync {count} selected items",
3211
+ "configSync.applyNone": "Choose what to sync",
3320
3212
  "configSync.applying": "Writing…",
3321
3213
  "configSync.applied": "Written to the workbench config · applied",
3322
3214
  "configSync.appliedIds": "Written this time: {ids}",
@@ -3324,7 +3216,7 @@ var dictionaries = {
3324
3216
  "configSync.nothing": "Nothing to sync",
3325
3217
  "configSync.unreadable": "Cannot read {path}: {reason}",
3326
3218
  "configSync.noSource": "This machine has no other profile to sync from",
3327
- "configSync.emptyProviders": "The workbench has no model provider yet — sync the llm- rows from some profile, or configure one under Models.",
3219
+ "configSync.emptyProviders": "The workbench has no model provider yet — sync the model-provider rows from some profile, or configure one under Models.",
3328
3220
  "configSync.failed": "The sync did not go through; try again.",
3329
3221
  "debug.workspace": "this workspace",
3330
3222
  "debug.status": "Debugging “{title}”",
@@ -3416,30 +3308,6 @@ function mergeMessagesSkipping(base, contributions) {
3416
3308
  };
3417
3309
  }
3418
3310
  //#endregion
3419
- //#region ../shared/dist/lib/blocker-action.js
3420
- /**
3421
- * 这颗钮此刻该不该按成等待态:这一轮忙还没收,或有一支正在跑。
3422
- * @param busy - 这一轮忙是不是还在。
3423
- * @param running - 正在跑的那一支的 label;没有就给 `null`。
3424
- * @returns 该等待给 `true`,否则 `false`。
3425
- */
3426
- function blockerPending(busy, running) {
3427
- return busy || running !== null;
3428
- }
3429
- /**
3430
- * 这颗钮此刻该显示什么字:正在重试说「重试中…」,正在跑的那一支说「修复中…」,刚复制过的说「已复制」,其余原样。
3431
- * @param action - 这颗钮的形状(行为 + 平时文案)。
3432
- * @param state - 此刻的运行态。
3433
- * @param t - i18n 取词函数。
3434
- * @returns 要显示的文案;三种临时态都不成立时就是 `action.label`。
3435
- */
3436
- function blockerActionLabel(action, state, t) {
3437
- if (action.kind === "retry" && state.retrying) return t("blocker.retry.running");
3438
- if (state.running === action.label) return t("blocker.fix.running");
3439
- if (action.kind === "copy" && state.copied === action.text) return t("env.copied");
3440
- return action.label;
3441
- }
3442
- //#endregion
3443
3311
  //#region ../shared/dist/lib/board-fact.js
3444
3312
  /**
3445
3313
  * 判一个路径落不落在这个工作区里(按路径前缀比,不是字符串包含)。
@@ -3555,7 +3423,7 @@ function excerpt(text, limit = 80) {
3555
3423
  * @param props.children - 单个锚点元素;`label` / `shortcutKeys` / `openOnClick` 等其余 prop 与 dsh 同形。
3556
3424
  */
3557
3425
  function Tip({ side = "bottom", align = "end", gap = 6, portal = true, ...rest }) {
3558
- return /* @__PURE__ */ h(Tooltip, {
3426
+ return /* @__PURE__ */ createElement(Tooltip, {
3559
3427
  side,
3560
3428
  align,
3561
3429
  gap,
@@ -3564,6 +3432,55 @@ function Tip({ side = "bottom", align = "end", gap = 6, portal = true, ...rest }
3564
3432
  });
3565
3433
  }
3566
3434
  //#endregion
3435
+ //#region src/shared/components/IconModules.tsx
3436
+ /**
3437
+ * 四宫格:"模块"这个概念的通用单色图标(侧栏、面板那颗钮、市场节的标题);默认 16px。
3438
+ * 外壳自己用(`IconBrandMark` 那几枚在 kit 上,这枚不出口)。
3439
+ * @param props.size - 边长像素,同时给 `width` 与 `height`。
3440
+ * @returns 一枚 `aria-hidden` 的 svg。
3441
+ */
3442
+ function IconModules({ size = 16 }) {
3443
+ return /* @__PURE__ */ createElement("svg", {
3444
+ width: size,
3445
+ height: size,
3446
+ viewBox: "0 0 16 16",
3447
+ fill: "none",
3448
+ "aria-hidden": "true"
3449
+ }, /* @__PURE__ */ createElement("rect", {
3450
+ x: "2.5",
3451
+ y: "2.5",
3452
+ width: "4.6",
3453
+ height: "4.6",
3454
+ rx: "1.2",
3455
+ stroke: "currentColor",
3456
+ strokeWidth: "1.2"
3457
+ }), /* @__PURE__ */ createElement("rect", {
3458
+ x: "8.9",
3459
+ y: "2.5",
3460
+ width: "4.6",
3461
+ height: "4.6",
3462
+ rx: "1.2",
3463
+ stroke: "currentColor",
3464
+ strokeWidth: "1.2"
3465
+ }), /* @__PURE__ */ createElement("rect", {
3466
+ x: "2.5",
3467
+ y: "8.9",
3468
+ width: "4.6",
3469
+ height: "4.6",
3470
+ rx: "1.2",
3471
+ stroke: "currentColor",
3472
+ strokeWidth: "1.2"
3473
+ }), /* @__PURE__ */ createElement("rect", {
3474
+ x: "8.9",
3475
+ y: "8.9",
3476
+ width: "4.6",
3477
+ height: "4.6",
3478
+ rx: "1.2",
3479
+ stroke: "currentColor",
3480
+ strokeWidth: "1.2"
3481
+ }));
3482
+ }
3483
+ //#endregion
3567
3484
  //#region src/shared/hooks/fact-transports.ts
3568
3485
  function sseTransport(options) {
3569
3486
  return { start({ onFrame, cursor }) {
@@ -3656,7 +3573,9 @@ var channel = createFactChannel({ transport: createAdaptiveTransport() });
3656
3573
  * 卡片读数默认订的 `factOfRoute(route)` 已经接好,只有要订别的事实才显式传 `fact`。
3657
3574
  */
3658
3575
  function useFactRevision(fact) {
3659
- return useSyncExternalStore(useCallback((listener) => channel.subscribe(fact, listener), [fact]), useCallback(() => channel.revisionOf(fact), [fact]));
3576
+ const subscribe = useCallback((listener) => channel.subscribe(fact, listener), [fact]);
3577
+ const snapshot = useCallback(() => channel.revisionOf(fact), [fact]);
3578
+ return useSyncExternalStore(subscribe, snapshot);
3660
3579
  }
3661
3580
  /**
3662
3581
  * 不在渲染里的地方(宿主事件、定时器里看到的旧值)要听事实变化时用它;返回值就是退订函数,用完记得退。
@@ -3716,8 +3635,16 @@ function setProbe(next) {
3716
3635
  */
3717
3636
  var CAPABILITY_FACT = "capability";
3718
3637
  var shared = null;
3638
+ var epoch$1 = 0;
3639
+ /**
3640
+ * 写完之后把读数作废:写之前发出去的在飞探测即使回来也不许发布(它探的是改之前的样子)。
3641
+ * 配一次 `force` 的读,界面才不会拿着旧能力表再摆一次「更新」。
3642
+ */
3643
+ function bumpCapabilityEpoch() {
3644
+ epoch$1 += 1;
3645
+ }
3719
3646
  var current$1 = null;
3720
- var listeners$5 = /* @__PURE__ */ new Set();
3647
+ var listeners$6 = /* @__PURE__ */ new Set();
3721
3648
  /**
3722
3649
  * 当前整张能力表的取值口(没探过是 `null`),给 `useSyncExternalStore` 用;渲染里请用 `useCapabilities`。
3723
3650
  */
@@ -3728,9 +3655,9 @@ function capabilityValue() {
3728
3655
  * 能力表的订阅口,返回退订函数;渲染里请用 `useCapabilities`。
3729
3656
  */
3730
3657
  function subscribeCapabilities(listener) {
3731
- listeners$5.add(listener);
3658
+ listeners$6.add(listener);
3732
3659
  return () => {
3733
- listeners$5.delete(listener);
3660
+ listeners$6.delete(listener);
3734
3661
  };
3735
3662
  }
3736
3663
  /**
@@ -3744,7 +3671,7 @@ function setCapabilities(next, rechecked = false) {
3744
3671
  });
3745
3672
  if (next === current$1) return;
3746
3673
  current$1 = next;
3747
- for (const listener of [...listeners$5]) listener();
3674
+ for (const listener of [...listeners$6]) listener();
3748
3675
  }
3749
3676
  /**
3750
3677
  * 一次强探开始:点亮“正在探”;已经在探就跳过。
@@ -3788,12 +3715,14 @@ function publishCapability(result, rechecked = false) {
3788
3715
  * 下一次强探会真的再跑一遍;`force` 不同不搭车。
3789
3716
  */
3790
3717
  function shareCapabilityFetch(force, load) {
3791
- if (shared !== null && shared.force === force) return shared.promise;
3718
+ const at = epoch$1;
3719
+ if (shared !== null && shared.force === force && shared.epoch === at) return shared.promise;
3792
3720
  const promise = load(force).finally(() => {
3793
3721
  if (shared?.promise === promise) shared = null;
3794
3722
  });
3795
3723
  shared = {
3796
3724
  force,
3725
+ epoch: at,
3797
3726
  promise
3798
3727
  };
3799
3728
  return promise;
@@ -3806,10 +3735,12 @@ var newestForceSeq$1 = -1;
3806
3735
  */
3807
3736
  function runCapabilityRead(options) {
3808
3737
  const { force, silent = false, load = fetchAll } = options;
3738
+ const at = epoch$1;
3809
3739
  const seq = readSeq$1 += 1;
3810
3740
  if (force) newestForceSeq$1 = seq;
3811
3741
  if (force && !silent) beginProbe();
3812
3742
  return shareCapabilityFetch(force, load).then((result) => {
3743
+ if (at !== epoch$1) return;
3813
3744
  if (!force && seq < newestForceSeq$1) return;
3814
3745
  publishCapability(result, force);
3815
3746
  }).finally(() => {
@@ -3823,6 +3754,7 @@ function runCapabilityRead(options) {
3823
3754
  function useCapabilities(refreshToken, reloadToken = 0) {
3824
3755
  const value = useSyncExternalStore(subscribeCapabilities, capabilityValue);
3825
3756
  const previous = useRef(refreshToken);
3757
+ const factRev = useFactRevision(CAPABILITY_FACT);
3826
3758
  useEffect(() => {
3827
3759
  const force = shouldForce(refreshToken, previous.current);
3828
3760
  previous.current = refreshToken;
@@ -3834,7 +3766,7 @@ function useCapabilities(refreshToken, reloadToken = 0) {
3834
3766
  });
3835
3767
  }, [
3836
3768
  refreshToken,
3837
- useFactRevision(CAPABILITY_FACT),
3769
+ factRev,
3838
3770
  reloadToken
3839
3771
  ]);
3840
3772
  return value;
@@ -3846,6 +3778,49 @@ function useCapabilityProbe() {
3846
3778
  return useSyncExternalStore(subscribeProbe, probeValue);
3847
3779
  }
3848
3780
  //#endregion
3781
+ //#region src/shared/api/unit-board.ts
3782
+ /**
3783
+ * 判这张卡现在能不能画。
3784
+ * @param capability 环境读数;还没读到给 null。
3785
+ * @param mode 闸档。
3786
+ * @returns mode 为 none 或读数还没到都放行(先放行让它读);读到明确不通过(ok 与 unchecked 之外)才拦。
3787
+ */
3788
+ function gateOf(capability, mode) {
3789
+ if (mode === "none") return { gated: true };
3790
+ if (capability === null) return { gated: true };
3791
+ return { gated: capability.status === "ok" || capability.status === "unchecked" };
3792
+ }
3793
+ /**
3794
+ * 把候选卡住态分档,每档只留第一个。
3795
+ * @param candidates 候选(可能含 undefined),按优先级从高到低给。
3796
+ * @returns 分出的 blocker 与 notice;已经有 blocker 时不带 notice(挡住就不必再提示)。
3797
+ */
3798
+ function splitBlocker(candidates) {
3799
+ let blocker;
3800
+ let notice;
3801
+ for (const candidate of candidates) {
3802
+ if (candidate === void 0) continue;
3803
+ if (candidate.severity === "block") {
3804
+ blocker ??= candidate;
3805
+ continue;
3806
+ }
3807
+ notice ??= candidate;
3808
+ }
3809
+ return {
3810
+ ...blocker === void 0 ? {} : { blocker },
3811
+ ...blocker !== void 0 || notice === void 0 ? {} : { notice }
3812
+ };
3813
+ }
3814
+ /**
3815
+ * 由读口错误算出「出错搭车强探」的防抖键:同一个键只自动重探一次。
3816
+ * @param error 读口错误;undefined 表示这次没有错误。
3817
+ * @returns 键字符串;空 code 归一到 unknown。
3818
+ */
3819
+ function probeKeyOf(error) {
3820
+ if (error === void 0) return null;
3821
+ return error.code === "" ? "unknown" : error.code;
3822
+ }
3823
+ //#endregion
3849
3824
  //#region src/shared/hooks/use-capability-gate.ts
3850
3825
  var use_capability_gate_exports = /* @__PURE__ */ __exportAll({
3851
3826
  useCapabilityGate: () => useCapabilityGate,
@@ -3916,7 +3891,7 @@ var devSurface = {
3916
3891
  //#endregion
3917
3892
  //#region src/app/layouts/panel-hint.ts
3918
3893
  var hints = /* @__PURE__ */ new Map();
3919
- var listeners$4 = /* @__PURE__ */ new Set();
3894
+ var listeners$5 = /* @__PURE__ */ new Set();
3920
3895
  function sameHint(left, right) {
3921
3896
  if (left === null || right === null) return left === right;
3922
3897
  if (left.labelKey !== right.labelKey || left.tone !== right.tone) return false;
@@ -3928,15 +3903,15 @@ function publishPanelHint(id, hint) {
3928
3903
  if (sameHint(hints.get(id) ?? null, hint)) return;
3929
3904
  if (hint === null) hints.delete(id);
3930
3905
  else hints.set(id, hint);
3931
- for (const listener of [...listeners$4]) listener();
3906
+ for (const listener of [...listeners$5]) listener();
3932
3907
  }
3933
3908
  function panelHintOf(id) {
3934
3909
  return id === null ? null : hints.get(id) ?? null;
3935
3910
  }
3936
3911
  function subscribePanelHints(listener) {
3937
- listeners$4.add(listener);
3912
+ listeners$5.add(listener);
3938
3913
  return () => {
3939
- listeners$4.delete(listener);
3914
+ listeners$5.delete(listener);
3940
3915
  };
3941
3916
  }
3942
3917
  function usePanelHint(id) {
@@ -3975,9 +3950,15 @@ function swapUntil(action, application, latest) {
3975
3950
  if (action !== "update-workbench" || application !== "restart-required") return void 0;
3976
3951
  return latest;
3977
3952
  }
3978
- var READ_BACK_ACTIONS = /* @__PURE__ */ new Set(["update", "update-bundle"]);
3953
+ var READ_BACK_ACTIONS = /* @__PURE__ */ new Set([
3954
+ "update",
3955
+ "update-bundle",
3956
+ "update-dependency",
3957
+ "update-plugin"
3958
+ ]);
3979
3959
  function awaitsReadBack(action, application, version) {
3980
- return application === "applied" && version !== void 0 && READ_BACK_ACTIONS.has(action);
3960
+ if (application !== "applied" || !READ_BACK_ACTIONS.has(action)) return false;
3961
+ return action === "update-bundle" ? version !== void 0 : true;
3981
3962
  }
3982
3963
  function readBackDone(input) {
3983
3964
  if (input.action === "update") return !input.outdated;
@@ -3989,6 +3970,9 @@ function readBackDone(input) {
3989
3970
  function settleLanded(input) {
3990
3971
  if (input.until !== void 0) return swapLanded(input.until, input.installed);
3991
3972
  if (input.readBack !== true) return true;
3973
+ const settled = (state) => state !== void 0 && state !== "outdated" && state !== "unsatisfied" && state !== "checking" && state !== "unchecked";
3974
+ if (input.action === "update-dependency") return settled(input.sharedState);
3975
+ if (input.action === "update-plugin") return input.pluginOutdated === false;
3992
3976
  return readBackDone({
3993
3977
  action: input.action,
3994
3978
  entry: input.entry,
@@ -3996,6 +3980,33 @@ function settleLanded(input) {
3996
3980
  outdated: input.outdated
3997
3981
  });
3998
3982
  }
3983
+ function tailReason(tail) {
3984
+ if (tail === void 0) return void 0;
3985
+ const last = tail.split(" / ").map((part) => part.trim()).filter((part) => part !== "").at(-1);
3986
+ if (last === void 0) return void 0;
3987
+ return last.length <= 240 ? last : `${last.slice(0, 240)}…`;
3988
+ }
3989
+ /**
3990
+ * 工作台自更新是不是已经由外面那个进程判死了:`failed` / `rolled-back` 都算收尾,
3991
+ * 不必再等盘上版本追上来(最多 3 分钟的等待里用户不该一直看「正在更新」)。
3992
+ * `since` 是点下去那一刻(毫秒),marker 比它早太多说明是上一次的现场,不算。
3993
+ * @returns `undefined` = 还在跑或没有现场;否则 `kind` 与日志尾里最后一句原因。
3994
+ */
3995
+ function selfUpdateStop(input) {
3996
+ const { until, since, update } = input;
3997
+ if (until === void 0 || update === void 0 || update === null) return void 0;
3998
+ if (update.state !== "failed" && update.state !== "rolled-back") return void 0;
3999
+ if (update.to !== until && update.version !== until) return void 0;
4000
+ if (since !== void 0 && update.at !== void 0) {
4001
+ const at = Date.parse(update.at);
4002
+ if (Number.isFinite(at) && at < since - 5e3) return void 0;
4003
+ }
4004
+ return {
4005
+ kind: update.state,
4006
+ ...update.version === void 0 ? {} : { version: update.version },
4007
+ ...update.state === "failed" && tailReason(update.tail) !== void 0 ? { reason: tailReason(update.tail) } : {}
4008
+ };
4009
+ }
3999
4010
  function holdWindowMs(until) {
4000
4011
  return until === void 0 ? MODULE_SETTLE_MS : WORKBENCH_SWAP_MS;
4001
4012
  }
@@ -4480,7 +4491,7 @@ function marketHintOf(input) {
4480
4491
  }
4481
4492
  //#endregion
4482
4493
  //#region src/app/layouts/rightbar/market-busy.ts
4483
- var listeners$3 = /* @__PURE__ */ new Set();
4494
+ var listeners$4 = /* @__PURE__ */ new Set();
4484
4495
  var published = /* @__PURE__ */ new Map();
4485
4496
  var live$2 = /* @__PURE__ */ new Set();
4486
4497
  var timer$1;
@@ -4511,9 +4522,9 @@ function publishMarketBusy(ids) {
4511
4522
  * 订阅这份事实的变化(发布内容真变了、或有条目到期才通知)。返回退订函数。
4512
4523
  */
4513
4524
  function subscribeMarketBusy(listener) {
4514
- listeners$3.add(listener);
4525
+ listeners$4.add(listener);
4515
4526
  return () => {
4516
- listeners$3.delete(listener);
4527
+ listeners$4.delete(listener);
4517
4528
  };
4518
4529
  }
4519
4530
  /**
@@ -4549,11 +4560,52 @@ function refresh(now) {
4549
4560
  const next = new Set(published.keys());
4550
4561
  if (!sameSet(live$2, next)) {
4551
4562
  live$2 = next;
4552
- for (const listener of [...listeners$3]) listener();
4563
+ for (const listener of [...listeners$4]) listener();
4553
4564
  }
4554
4565
  schedule(now);
4555
4566
  }
4556
4567
  //#endregion
4568
+ //#region src/shared/api/write-outcome.ts
4569
+ /**
4570
+ * 由通道与资源拼出写路由。
4571
+ * @param channel 写通道。
4572
+ * @param resource 该通道下的资源名。
4573
+ * @returns 路由字符串;provision 只有一段,其余是 channel/resource。
4574
+ */
4575
+ function writeRoute(channel, resource) {
4576
+ if (channel === "provision") return "provision";
4577
+ return `${channel}/${resource}`;
4578
+ }
4579
+ /**
4580
+ * 把写通道的响应翻成 WriteOutcome。
4581
+ * @param response 写口回的响应;null 表示请求本身没成(网络断了,宿主没答)。
4582
+ * @param networkText 拿不到任何服务端文案时兜底的那句。
4583
+ * @returns 失败时 message 优先用服务端自己的话,没有才用响应正文或 networkText。
4584
+ */
4585
+ function writeOutcomeOf(response, networkText) {
4586
+ if (response === null) return {
4587
+ ok: false,
4588
+ message: networkText
4589
+ };
4590
+ if (!response.ok) {
4591
+ const box = response;
4592
+ const own = typeof box.error?.message === "string" && box.error.message !== "" ? box.error.message : void 0;
4593
+ const fallback = typeof box.text === "string" && box.text !== "" ? box.text : networkText;
4594
+ const detail = typeof box.error?.detail === "string" ? box.error.detail : void 0;
4595
+ const helpUrl = typeof box.error?.helpUrl === "string" && box.error.helpUrl !== "" ? box.error.helpUrl : void 0;
4596
+ return {
4597
+ ok: false,
4598
+ message: own ?? fallback,
4599
+ ...detail === void 0 ? {} : { detail },
4600
+ ...helpUrl === void 0 ? {} : { helpUrl }
4601
+ };
4602
+ }
4603
+ return {
4604
+ ok: true,
4605
+ value: response
4606
+ };
4607
+ }
4608
+ //#endregion
4557
4609
  //#region src/shared/hooks/use-host-write.ts
4558
4610
  var use_host_write_exports = /* @__PURE__ */ __exportAll({ useHostWrite: () => useHostWrite });
4559
4611
  /**
@@ -4660,11 +4712,19 @@ function useVisibleBusy(active, floorMs) {
4660
4712
  //#endregion
4661
4713
  //#region src/app/layouts/rightbar/market-settle-hold.ts
4662
4714
  function useSettleHold(input) {
4663
- const { pending, landed, t, onChanged, setPending, setFailed } = input;
4715
+ const { pending, landed, t, onChanged, selfUpdate, setPending, setFailed } = input;
4664
4716
  const until = pending?.until;
4665
4717
  const id = pending?.id ?? "";
4666
4718
  const watching = pending !== null && (pending.until !== void 0 || pending.readBack === true);
4667
4719
  const sinceRef = useRef(0);
4720
+ const stop = selfUpdateStop({
4721
+ until,
4722
+ since: pending?.since,
4723
+ update: selfUpdate
4724
+ });
4725
+ const stopKind = stop?.kind;
4726
+ const stopReason = stop?.reason;
4727
+ const stopVersion = stop?.version;
4668
4728
  useEffect(() => {
4669
4729
  if (!watching || !landed) return;
4670
4730
  setPending(null);
@@ -4673,6 +4733,22 @@ function useSettleHold(input) {
4673
4733
  landed,
4674
4734
  setPending
4675
4735
  ]);
4736
+ useEffect(() => {
4737
+ if (stopKind === void 0) return;
4738
+ setPending(null);
4739
+ setFailed({
4740
+ id,
4741
+ message: stopKind === "failed" ? t("panels.market.selfUpdateFailed", { reason: stopReason ?? t("panels.market.selfUpdateUnknown") }) : t("panels.market.selfUpdateRolledBack", { version: stopVersion ?? "?" })
4742
+ });
4743
+ }, [
4744
+ stopKind,
4745
+ stopReason,
4746
+ stopVersion,
4747
+ id,
4748
+ setPending,
4749
+ setFailed,
4750
+ t
4751
+ ]);
4676
4752
  useEffect(() => {
4677
4753
  if (!watching) {
4678
4754
  sinceRef.current = 0;
@@ -4767,20 +4843,20 @@ var MarketPage_module_default = {
4767
4843
  //#endregion
4768
4844
  //#region src/app/layouts/rightbar/MarketStates.tsx
4769
4845
  function MarketChecking({ t }) {
4770
- return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketChecking }, /* @__PURE__ */ h(Spinner, { size: 14 }), t("panels.market.checking")));
4846
+ return /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketChecking }, /* @__PURE__ */ createElement(Spinner, { size: 14 }), t("panels.market.checking")));
4771
4847
  }
4772
4848
  function MarketEmpty({ t }) {
4773
- return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmptyTitle }, t("panels.market.empty")));
4849
+ return /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketEmptyTitle }, t("panels.market.empty")));
4774
4850
  }
4775
4851
  //#endregion
4776
4852
  //#region src/app/layouts/rightbar/market-section-icon.ts
4777
4853
  var SIZE$1 = 14;
4778
4854
  function marketSectionIcon(kind) {
4779
4855
  switch (kind) {
4780
- case "installed": return h(IconModules, { size: SIZE$1 });
4781
- case "pending": return h(IconDownloadOutlineRegular, { size: SIZE$1 });
4782
- case "plugins": return h(IconCordisPluginOutlineRegular, { size: SIZE$1 });
4783
- case "shared": return h(IconLinkOutlineRegular, { size: SIZE$1 });
4856
+ case "installed": return createElement(IconModules, { size: SIZE$1 });
4857
+ case "pending": return createElement(IconDownloadOutlineRegular, { size: SIZE$1 });
4858
+ case "plugins": return createElement(IconCordisPluginOutlineRegular, { size: SIZE$1 });
4859
+ case "shared": return createElement(IconLinkOutlineRegular, { size: SIZE$1 });
4784
4860
  }
4785
4861
  }
4786
4862
  //#endregion
@@ -4788,10 +4864,10 @@ function marketSectionIcon(kind) {
4788
4864
  var SIZE = 18;
4789
4865
  function packageIcon(kind) {
4790
4866
  switch (kind) {
4791
- case "module": return h(IconModuleMark, { size: SIZE });
4792
- case "plugin": return h(IconOpencli, { size: SIZE });
4793
- case "lib": return h(IconNpm, { size: SIZE });
4794
- case "workbench": return h(IconPanelScreen, { size: SIZE });
4867
+ case "module": return createElement(IconModuleMark, { size: SIZE });
4868
+ case "plugin": return createElement(IconOpencli, { size: SIZE });
4869
+ case "lib": return createElement(IconNpm, { size: SIZE });
4870
+ case "workbench": return createElement(IconPanelScreen, { size: SIZE });
4795
4871
  }
4796
4872
  }
4797
4873
  function marketRowKind(row) {
@@ -4834,8 +4910,9 @@ function holdOf(pending, application) {
4834
4910
  row: pending.row
4835
4911
  };
4836
4912
  }
4837
- function pendingLanded(pending, updates, capabilities, installed) {
4913
+ function pendingLanded(pending, updates, capabilities, installed, shared = [], plugins = null) {
4838
4914
  if (pending === null) return true;
4915
+ if (pending.action === "update" && capabilities === null) return false;
4839
4916
  return settleLanded({
4840
4917
  action: pending.action,
4841
4918
  until: pending.until,
@@ -4843,7 +4920,9 @@ function pendingLanded(pending, updates, capabilities, installed) {
4843
4920
  installed,
4844
4921
  entry: updates[pending.id],
4845
4922
  clicked: pending.version,
4846
- outdated: capabilityOutdated(capabilities, pending.id)
4923
+ outdated: capabilityOutdated(capabilities, pending.id),
4924
+ ...pending.action === "update-dependency" ? { sharedState: shared.find((row) => row.id === pending.id)?.state } : {},
4925
+ ...pending.action === "update-plugin" ? { pluginOutdated: plugins === null ? null : plugins.find((row) => row.id === pending.id)?.canUpdate ?? false } : {}
4847
4926
  });
4848
4927
  }
4849
4928
  function holdExpired(held, backInRoster, elapsedMs) {
@@ -4924,32 +5003,32 @@ function SharedLine({ t, row, pending, failure, onAct }) {
4924
5003
  const actions = sharedActions(row);
4925
5004
  const stateText = t(SHARED_STATE_KEY[row.state]);
4926
5005
  const version = row.version;
4927
- const name = /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketName }, row.label, version === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketVersion }, version.installed !== void 0 && version.latest !== void 0 && version.installed !== version.latest ? t("panels.market.versionArrow", {
5006
+ const name = /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketName }, row.label, version === void 0 ? null : /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketVersion }, version.installed !== void 0 && version.latest !== void 0 && version.installed !== version.latest ? t("panels.market.versionArrow", {
4928
5007
  from: version.installed,
4929
5008
  to: version.latest
4930
5009
  }) : version.installed ?? version.latest ?? ""));
4931
- return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
5010
+ return /* @__PURE__ */ createElement("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ createElement("span", {
4932
5011
  className: MarketPage_module_default.marketIcon,
4933
5012
  "aria-hidden": "true"
4934
- }, packageIcon(sharedRowKind(row))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketMain }, row.detail === void 0 ? name : /* @__PURE__ */ h(Tip, { label: row.detail }, name), /* @__PURE__ */ h("span", {
5013
+ }, packageIcon(sharedRowKind(row))), /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketMain }, row.detail === void 0 ? name : /* @__PURE__ */ createElement(Tip, { label: row.detail }, name), /* @__PURE__ */ createElement("span", {
4935
5014
  className: MarketPage_module_default.marketDesc,
4936
5015
  role: "img",
4937
5016
  "aria-label": stateText
4938
- }, row.state === "checking" ? /* @__PURE__ */ h(Spinner, { size: 14 }) : null, stateText, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketUsedBy }, t("panels.market.sharedUsedBy", { modules: row.usedByKeys.map((key) => t(key)).join(t("panels.market.listSeparator")) })))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ h(Spinner, { size: 14 }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => /* @__PURE__ */ h(Button, {
5017
+ }, row.state === "checking" ? /* @__PURE__ */ createElement(Spinner, { size: 14 }) : null, stateText, /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketUsedBy }, t("panels.market.sharedUsedBy", { modules: row.usedByKeys.map((key) => t(key)).join(t("panels.market.listSeparator")) })))), /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ createElement(Spinner, { size: 14 }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => /* @__PURE__ */ createElement(Button, {
4939
5018
  key: action,
4940
5019
  type: "button",
4941
5020
  size: "sm",
4942
5021
  variant: "outline",
4943
5022
  disabled: locked,
4944
5023
  onClick: () => onAct(action)
4945
- }, t(ACTION_LABEL_KEY[action]))))), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
5024
+ }, t(ACTION_LABEL_KEY[action]))))), failure === null ? null : /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketFailure }, failure));
4946
5025
  }
4947
5026
  function SharedSection({ t, rows, pending, failureOf, act }) {
4948
5027
  if (rows.length === 0) return null;
4949
- return /* @__PURE__ */ h("section", { className: `${MarketPage_module_default.marketSection} ${MarketPage_module_default.marketSectionQuiet}` }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ h("span", {
5028
+ return /* @__PURE__ */ createElement("section", { className: `${MarketPage_module_default.marketSection} ${MarketPage_module_default.marketSectionQuiet}` }, /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ createElement("span", {
4950
5029
  className: MarketPage_module_default.marketSectionIcon,
4951
5030
  "aria-hidden": "true"
4952
- }, marketSectionIcon("shared")), /* @__PURE__ */ h("h2", { className: MarketPage_module_default.marketSectionTitle }, t("panels.market.sectionShared")), /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketSectionCount }, rows.length)), /* @__PURE__ */ h("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ h(SharedLine, {
5031
+ }, marketSectionIcon("shared")), /* @__PURE__ */ createElement("h2", { className: MarketPage_module_default.marketSectionTitle }, t("panels.market.sectionShared")), /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketSectionCount }, rows.length)), /* @__PURE__ */ createElement("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ createElement(SharedLine, {
4953
5032
  key: row.id,
4954
5033
  t,
4955
5034
  row,
@@ -5013,49 +5092,49 @@ function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy }) {
5013
5092
  const actions = marketActions$1(row);
5014
5093
  const switchLocked = marketSwitchLocked(row);
5015
5094
  const stateText = t(MARKET_STATE_KEY[row.state]);
5016
- return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
5095
+ return /* @__PURE__ */ createElement("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ createElement("span", {
5017
5096
  className: MarketPage_module_default.marketIcon,
5018
5097
  "aria-hidden": "true"
5019
- }, packageIcon(marketRowKind(row))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketMain }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketName }, marketRowTitle(row, t), row.versionLabel === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketVersion }, row.versionLabel), row.version === void 0 || row.versionLabel !== void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketVersion }, row.version.installed !== void 0 && row.version.latest !== void 0 && row.version.installed !== row.version.latest ? t("panels.market.versionArrow", {
5098
+ }, packageIcon(marketRowKind(row))), /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketMain }, /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketName }, marketRowTitle(row, t), row.versionLabel === void 0 ? null : /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketVersion }, row.versionLabel), row.version === void 0 || row.versionLabel !== void 0 ? null : /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketVersion }, row.version.installed !== void 0 && row.version.latest !== void 0 && row.version.installed !== row.version.latest ? t("panels.market.versionArrow", {
5020
5099
  from: row.version.installed,
5021
5100
  to: row.version.latest
5022
- }) : row.version.installed ?? row.version.latest ?? ""), row.local === true ? /* @__PURE__ */ h(Tip, { label: t("panels.market.localHint") }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketLocalTag }, t("panels.market.localMark"))) : null), quiet ? null : /* @__PURE__ */ h("span", {
5101
+ }) : row.version.installed ?? row.version.latest ?? ""), row.local === true ? /* @__PURE__ */ createElement(Tip, { label: t("panels.market.localHint") }, /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketLocalTag }, t("panels.market.localMark"))) : null), quiet ? null : /* @__PURE__ */ createElement("span", {
5023
5102
  className: MarketPage_module_default.marketDesc,
5024
5103
  role: "img",
5025
5104
  "aria-label": stateText
5026
- }, row.state === "checking" ? /* @__PURE__ */ h(Spinner, { size: 14 }) : /* @__PURE__ */ h(StateDot, {
5105
+ }, row.state === "checking" ? /* @__PURE__ */ createElement(Spinner, { size: 14 }) : /* @__PURE__ */ createElement(StateDot, {
5027
5106
  state: MARKET_DOT[row.state],
5028
5107
  size: 9
5029
- }), stateText, row.hint === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketUsedBy }, t(row.hint)))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ h(Spinner, { size: 14 }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => {
5108
+ }), stateText, row.hint === void 0 ? null : /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketUsedBy }, t(row.hint)))), /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ createElement(Spinner, { size: 14 }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => {
5030
5109
  const danger = dangerActions.includes(action);
5031
5110
  const update = updateActions.includes(action);
5032
- return /* @__PURE__ */ h(Button, {
5111
+ return /* @__PURE__ */ createElement(Button, {
5033
5112
  key: action,
5034
5113
  type: "button",
5035
5114
  size: "sm",
5036
5115
  variant: action === "install" ? "primary" : "outline",
5037
5116
  className: danger ? "wb-dangerAction" : update ? MarketPage_module_default.marketUpdateAction : void 0,
5038
- icon: danger ? /* @__PURE__ */ h(IconTrashOutlineRegular, { size: 13 }) : void 0,
5117
+ icon: danger ? /* @__PURE__ */ createElement(IconTrashOutlineRegular, { size: 13 }) : void 0,
5039
5118
  "aria-label": danger ? t("panels.market.uninstallLabel", { name: marketRowTitle(row, t) }) : void 0,
5040
5119
  disabled: locked,
5041
5120
  onClick: () => onAct(action)
5042
5121
  }, t(ACTION_LABEL_KEY[action]));
5043
- })), row.defaultShown === void 0 ? null : /* @__PURE__ */ h(Tip, { label: t(switchLocked ? "panels.market.defaultLocked" : "panels.market.defaultHint") }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketSwitchSeat }, /* @__PURE__ */ h(Switch, {
5122
+ })), row.defaultShown === void 0 ? null : /* @__PURE__ */ createElement(Tip, { label: t(switchLocked ? "panels.market.defaultLocked" : "panels.market.defaultHint") }, /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketSwitchSeat }, /* @__PURE__ */ createElement(Switch, {
5044
5123
  checked: row.defaultShown,
5045
5124
  disabled: boardBusy === true || locked || switchLocked,
5046
5125
  label: `${marketRowTitle(row, t)} · ${t("panels.market.defaultLabel")}`,
5047
5126
  onChange: (next) => onDefault?.(next)
5048
- })))), row.note === void 0 ? null : /* @__PURE__ */ h("div", {
5127
+ })))), row.note === void 0 ? null : /* @__PURE__ */ createElement("div", {
5049
5128
  className: row.note.tone === "plain" ? MarketPage_module_default.marketNotePlain : MarketPage_module_default.marketNote,
5050
5129
  title: row.note.params.reason === void 0 ? void 0 : t("panels.market.moduleRefusedDetail", row.note.params)
5051
- }, t(row.note.key, row.note.params)), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
5130
+ }, t(row.note.key, row.note.params)), failure === null ? null : /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketFailure }, failure));
5052
5131
  }
5053
5132
  function MarketSection({ t, titleKey, icon, rows, pending, failureOf, act, confirmActions, onConfirming, onDefault, boardBusy }) {
5054
5133
  if (rows.length === 0) return null;
5055
- return /* @__PURE__ */ h("section", { className: MarketPage_module_default.marketSection }, titleKey === void 0 ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ h("span", {
5134
+ return /* @__PURE__ */ createElement("section", { className: MarketPage_module_default.marketSection }, titleKey === void 0 ? null : /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ createElement("span", {
5056
5135
  className: MarketPage_module_default.marketSectionIcon,
5057
5136
  "aria-hidden": "true"
5058
- }, icon), /* @__PURE__ */ h("h2", { className: MarketPage_module_default.marketSectionTitle }, t(titleKey)), rows.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketSectionCount }, rows.length)), rows.length === 0 ? null : /* @__PURE__ */ h("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ h(MarketLine, {
5137
+ }, icon), /* @__PURE__ */ createElement("h2", { className: MarketPage_module_default.marketSectionTitle }, t(titleKey)), rows.length === 0 ? null : /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketSectionCount }, rows.length)), rows.length === 0 ? null : /* @__PURE__ */ createElement("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ createElement(MarketLine, {
5059
5138
  key: row.id,
5060
5139
  t,
5061
5140
  row,
@@ -5289,8 +5368,63 @@ function changeFailure(change, t) {
5289
5368
  return failureReason(failureCode(change), change.application, t);
5290
5369
  }
5291
5370
  //#endregion
5371
+ //#region src/app/layouts/rightbar/market-update-verdict.ts
5372
+ /**
5373
+ * 更新那一拍到底算不算成了:只认**盘上这一版**,不认 `applied` 这个字。
5374
+ * `no-change` = 点下去那版和盘上一样;`gone` = 跑完读不到模块(`restored` 是回滚成功的版本);
5375
+ * `behind` = 版本动了但没到源上最新。`ok` 之外都要给用户一句失败原因。
5376
+ * @param input.clicked 点下去那一刻盘上的版本;`latest` 当时源上最新那一版。
5377
+ */
5378
+ function updateVerdictOf(input) {
5379
+ if (input.action !== "update-bundle") return { kind: "ok" };
5380
+ if (input.restored !== void 0 || input.change?.errorCode === "module-gone" || input.module !== void 0 && input.module.kind !== "module") return {
5381
+ kind: "gone",
5382
+ ...input.restored === void 0 ? {} : { restored: input.restored }
5383
+ };
5384
+ const installed = input.module?.version;
5385
+ if (input.change?.errorCode === "no-change") return { kind: "no-change" };
5386
+ if (installed === void 0) return { kind: "ok" };
5387
+ if (input.clicked !== void 0 && installed === input.clicked) return { kind: "no-change" };
5388
+ if (input.latest !== void 0 && installed !== input.latest) return {
5389
+ kind: "behind",
5390
+ installed
5391
+ };
5392
+ return { kind: "ok" };
5393
+ }
5394
+ /**
5395
+ * 把判死的更新结果翻成那一行底下的一句人话;`ok` 给 `undefined`。
5396
+ * @param input.from 点下去那版(`no-change` 要说清"还是它")。
5397
+ */
5398
+ function updateVerdictText(verdict, t, input) {
5399
+ if (verdict.kind === "no-change") return t("panels.market.updateNoChange", {
5400
+ from: input.from ?? "?",
5401
+ latest: input.latest ?? t("panels.market.updateUnknownVersion")
5402
+ });
5403
+ if (verdict.kind === "gone") return verdict.restored === void 0 ? t("panels.market.updateGone") : t("panels.market.updateRestored", { version: verdict.restored });
5404
+ if (verdict.kind === "behind") return t("panels.market.updateBehind", {
5405
+ installed: verdict.installed,
5406
+ latest: input.latest ?? t("panels.market.updateUnknownVersion")
5407
+ });
5408
+ }
5409
+ //#endregion
5292
5410
  //#region src/app/layouts/rightbar/market-act.ts
5293
5411
  var STEADY_ACTIONS = /* @__PURE__ */ new Set(["update", "update-bundle"]);
5412
+ function recordOf(value) {
5413
+ return typeof value === "object" && value !== null ? value : void 0;
5414
+ }
5415
+ function moduleOf(value) {
5416
+ const module = recordOf(recordOf(value)?.module);
5417
+ if (module === void 0) return void 0;
5418
+ return {
5419
+ ...typeof module.kind === "string" ? { kind: module.kind } : {},
5420
+ ...typeof module.pkg === "string" ? { pkg: module.pkg } : {},
5421
+ ...typeof module.version === "string" ? { version: module.version } : {}
5422
+ };
5423
+ }
5424
+ function restoredOf(value) {
5425
+ const restored = recordOf(value)?.restored;
5426
+ return typeof restored === "string" && restored !== "" ? restored : void 0;
5427
+ }
5294
5428
  function marketActOf(options) {
5295
5429
  const { t, mocked, rowOf, seats, send, onChanged } = options;
5296
5430
  return async (id, action) => {
@@ -5300,10 +5434,12 @@ function marketActOf(options) {
5300
5434
  const next = {
5301
5435
  id,
5302
5436
  action,
5437
+ since: Date.now(),
5303
5438
  ...row?.titleKey === void 0 ? {} : { titleKey: row.titleKey },
5304
5439
  ...label === void 0 ? {} : { label },
5305
5440
  ...row?.pkg === void 0 ? {} : { pkg: row.pkg },
5306
5441
  ...row?.version?.installed === void 0 ? {} : { version: row.version.installed },
5442
+ ...row?.version?.latest === void 0 ? {} : { latest: row.version.latest },
5307
5443
  ...row === void 0 || !STEADY_ACTIONS.has(action) ? {} : { row: label === void 0 ? row : {
5308
5444
  ...row,
5309
5445
  label
@@ -5324,27 +5460,48 @@ function marketActOf(options) {
5324
5460
  unit: id
5325
5461
  });
5326
5462
  if (!outcome.ok) {
5463
+ onChanged({ force: true });
5327
5464
  seats.setPending(null);
5328
5465
  seats.setHeld(void 0);
5329
- onChanged();
5330
5466
  seats.setFailed({
5331
5467
  id,
5332
5468
  message: t("panels.market.failed", { reason: outcome.message })
5333
5469
  });
5334
5470
  return;
5335
5471
  }
5336
- const change = changeOf(outcome.value);
5337
- const until = swapUntil(action, change?.application, row?.version?.latest);
5338
- const readBack = awaitsReadBack(action, change?.application, next.version);
5472
+ const value = outcome.value;
5473
+ const change = changeOf(value);
5474
+ const failure = updateVerdictText(updateVerdictOf({
5475
+ action,
5476
+ change,
5477
+ module: moduleOf(value),
5478
+ restored: restoredOf(value),
5479
+ clicked: next.version,
5480
+ latest: next.latest
5481
+ }), t, {
5482
+ ...next.version === void 0 ? {} : { from: next.version },
5483
+ ...next.latest === void 0 ? {} : { latest: next.latest }
5484
+ });
5485
+ onChanged({ force: true });
5486
+ if (failure !== void 0) {
5487
+ seats.setPending(null);
5488
+ seats.setHeld(void 0);
5489
+ seats.setFailed({
5490
+ id,
5491
+ message: failure
5492
+ });
5493
+ return;
5494
+ }
5495
+ const until = swapUntil(action, change?.application, next.latest);
5496
+ const readBack = awaitsReadBack(action, change?.application ?? (action === "update" || action === "update-dependency" || action === "update-plugin" ? "applied" : void 0), next.version);
5339
5497
  seats.setPending(until === void 0 && !readBack ? null : {
5340
5498
  ...next,
5341
5499
  ...until === void 0 ? {} : { until },
5342
5500
  ...readBack ? { readBack: true } : {}
5343
5501
  });
5344
5502
  seats.setHeld(readBack ? void 0 : holdOf(next, change?.application));
5345
- if (action === "uninstall-plugin") seats.setNotice(installedPluginNotice(outcome.value, t));
5503
+ if (action === "uninstall-plugin") seats.setNotice(installedPluginNotice(value, t));
5346
5504
  const reason = changeFailure(change, t);
5347
- onChanged();
5348
5505
  if (reason !== void 0) seats.setFailed({
5349
5506
  id,
5350
5507
  message: t("panels.market.failed", { reason })
@@ -5365,7 +5522,7 @@ var PanelFoot_module_default = {
5365
5522
  * @param props.children - 右侧那一格内容(一般是按钮或状态),可省略。
5366
5523
  */
5367
5524
  function PanelFoot({ text, size = "sm", children }) {
5368
- return /* @__PURE__ */ h("footer", { className: PanelFoot_module_default.foot }, text === void 0 ? null : /* @__PURE__ */ h("span", { className: size === "md" ? PanelFoot_module_default.footTextMd : PanelFoot_module_default.footText }, text), children ?? null);
5525
+ return /* @__PURE__ */ createElement("footer", { className: PanelFoot_module_default.foot }, text === void 0 ? null : /* @__PURE__ */ createElement("span", { className: size === "md" ? PanelFoot_module_default.footTextMd : PanelFoot_module_default.footText }, text), children ?? null);
5369
5526
  }
5370
5527
  //#endregion
5371
5528
  //#region src/app/layouts/rightbar/MarketView.tsx
@@ -5376,7 +5533,7 @@ var CONFIRM_UNINSTALL = [
5376
5533
  ];
5377
5534
  function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
5378
5535
  const [acknowledged, setAcknowledged] = useState(false);
5379
- return /* @__PURE__ */ h(RiskConfirmation, {
5536
+ return /* @__PURE__ */ createElement(RiskConfirmation, {
5380
5537
  open: name !== null,
5381
5538
  title: t("panels.market.confirmUninstallTitle", { name: name ?? "" }),
5382
5539
  description: t("panels.market.confirmUninstallDetail"),
@@ -5393,7 +5550,7 @@ function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
5393
5550
  function MarketBody({ t, self, shown, pluginList, installedList, shared, pending, failed, notice, act, onConfirming, setDefault, boardBusy }) {
5394
5551
  const failureOf = (id) => failed?.id === id ? failed.message : null;
5395
5552
  const foot = marketFootVisible(shown, installedList);
5396
- return /* @__PURE__ */ h(Fragment, null, notice === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketNote }, notice), /* @__PURE__ */ h(MarketSection, {
5553
+ return /* @__PURE__ */ createElement(Fragment, null, notice === null ? null : /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketNote }, notice), /* @__PURE__ */ createElement(MarketSection, {
5397
5554
  t,
5398
5555
  rows: self === void 0 ? [] : [self],
5399
5556
  onDefault: setDefault,
@@ -5403,10 +5560,10 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
5403
5560
  act,
5404
5561
  confirmActions: CONFIRM_UNINSTALL,
5405
5562
  onConfirming
5406
- }), self === void 0 ? null : /* @__PURE__ */ h("div", {
5563
+ }), self === void 0 ? null : /* @__PURE__ */ createElement("div", {
5407
5564
  className: MarketPage_module_default.marketSelfDivider,
5408
5565
  "aria-hidden": "true"
5409
- }), marketSections(marketOrder([...shown, ...installedList], (row) => marketRowTitle(row, t))).map((section) => /* @__PURE__ */ h(MarketSection, {
5566
+ }), marketSections(marketOrder([...shown, ...installedList], (row) => marketRowTitle(row, t))).map((section) => /* @__PURE__ */ createElement(MarketSection, {
5410
5567
  key: section.id,
5411
5568
  t,
5412
5569
  titleKey: section.titleKey,
@@ -5419,7 +5576,7 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
5419
5576
  act,
5420
5577
  confirmActions: CONFIRM_UNINSTALL,
5421
5578
  onConfirming
5422
- })), /* @__PURE__ */ h(MarketSection, {
5579
+ })), /* @__PURE__ */ createElement(MarketSection, {
5423
5580
  t,
5424
5581
  titleKey: "panels.market.sectionPlugins",
5425
5582
  icon: marketSectionIcon("plugins"),
@@ -5431,10 +5588,10 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
5431
5588
  act,
5432
5589
  confirmActions: CONFIRM_UNINSTALL,
5433
5590
  onConfirming
5434
- }), foot ? /* @__PURE__ */ h(PanelFoot, {
5591
+ }), foot ? /* @__PURE__ */ createElement(PanelFoot, {
5435
5592
  size: "md",
5436
5593
  text: t("panels.market.foot")
5437
- }) : null, /* @__PURE__ */ h(SharedSection, {
5594
+ }) : null, /* @__PURE__ */ createElement(SharedSection, {
5438
5595
  t,
5439
5596
  rows: shared,
5440
5597
  pending,
@@ -5442,7 +5599,8 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
5442
5599
  act
5443
5600
  }));
5444
5601
  }
5445
- function MarketView({ t, manifests, installable, capabilities, freshness, onChanged, onPending, updates, installed, installedRead, workbench, plugins, settling, mock, defaults = [], changed = {} }) {
5602
+ function useMarketScene(input) {
5603
+ const { manifests, installable, capabilities, updates, installed, settling, mock, defaults, changed, pending, failed } = input;
5446
5604
  const titles = useMarketTitles(manifests, mock !== void 0);
5447
5605
  const catalog = mock?.manifests ?? manifests;
5448
5606
  const marketable = mock === void 0 ? marketCatalog(manifests, installable) : catalog;
@@ -5452,10 +5610,44 @@ function MarketView({ t, manifests, installable, capabilities, freshness, onChan
5452
5610
  const updateMap = mock?.updates ?? updates ?? {};
5453
5611
  const rows = marketRows(source, effective, updateMap, byDefault, changed);
5454
5612
  const shared = sharedRows(source, effective);
5613
+ const removing = removingIdOf(pending, failed);
5614
+ const steady = useHeldRow(pending, (id) => catalog.some((manifest) => manifest.id === id));
5615
+ const pinned = pinnedRowOf(pending, steady.held);
5616
+ const busyId = heldIdOf(pending, steady.held);
5617
+ return {
5618
+ titles,
5619
+ catalog,
5620
+ effective,
5621
+ updateMap,
5622
+ rows,
5623
+ shared,
5624
+ installedList: installedRows((mock?.installed ?? installed ?? []).filter((module) => module.unit !== pinned?.id && (!(settling?.has(module.unit) ?? false) || module.unit === busyId) && module.unit !== removing), catalog, new Set(rows.map((row) => row.id)), titles, byDefault, changed),
5625
+ byDefault,
5626
+ steady,
5627
+ pinned,
5628
+ removing,
5629
+ busyId
5630
+ };
5631
+ }
5632
+ function MarketView({ t, manifests, installable, capabilities, freshness, onChanged, onPending, updates, installed, installedRead, workbench, selfUpdate, plugins, settling, mock, defaults = [], changed = {} }) {
5455
5633
  const { pending, setPending, confirming, setConfirming, failed, setFailed, notice, setNotice } = useMarketTransient({
5456
5634
  mock,
5457
5635
  onPending
5458
5636
  });
5637
+ const { titles, effective, updateMap, rows, shared, installedList, byDefault, steady, pinned, removing, busyId } = useMarketScene({
5638
+ manifests,
5639
+ installable,
5640
+ capabilities,
5641
+ updates,
5642
+ installed,
5643
+ settling,
5644
+ mock,
5645
+ defaults,
5646
+ changed,
5647
+ pending,
5648
+ failed
5649
+ });
5650
+ usePublishMarketBusy(busyId);
5459
5651
  const provision = useHostWrite({
5460
5652
  channel: "provision",
5461
5653
  networkText: t("panels.failed")
@@ -5483,21 +5675,16 @@ function MarketView({ t, manifests, installable, capabilities, freshness, onChan
5483
5675
  setNotice(t("panels.failed"));
5484
5676
  }
5485
5677
  };
5486
- const removing = removingIdOf(pending, failed);
5487
- const steady = useHeldRow(pending, (id) => catalog.some((manifest) => manifest.id === id));
5488
- const pinned = pinnedRowOf(pending, steady.held);
5489
- usePublishMarketBusy(heldIdOf(pending, steady.held));
5490
- const installedList = installedRows((mock?.installed ?? installed ?? []).filter((module) => module.unit !== pinned?.id && (!(settling?.has(module.unit) ?? false) || module.unit === heldIdOf(pending, steady.held)) && module.unit !== removing), catalog, new Set(rows.map((row) => row.id)), titles, byDefault, changed);
5491
5678
  const pendingRow = pendingRowOf({
5492
5679
  pending,
5493
5680
  removing,
5494
5681
  rows,
5495
5682
  titles
5496
5683
  });
5497
- const selfRow = workbenchRow(mock === void 0 ? workbench : mock.workbench);
5684
+ const self = workbenchRow(mock === void 0 ? workbench : mock.workbench);
5498
5685
  const shown = withPinnedRow(pendingRow === void 0 ? rows : [...rows, pendingRow], pinned);
5499
- const self = selfRow;
5500
- const pluginList = installedPluginRows(mock?.plugins ?? plugins ?? [], byDefault, changed);
5686
+ const pluginSource = mock?.plugins ?? plugins ?? null;
5687
+ const pluginList = installedPluginRows(pluginSource ?? [], byDefault, changed);
5501
5688
  const rowById = new Map([
5502
5689
  ...shown,
5503
5690
  ...self === void 0 ? [] : [self],
@@ -5522,17 +5709,18 @@ function MarketView({ t, manifests, installable, capabilities, freshness, onChan
5522
5709
  });
5523
5710
  useSettleHold({
5524
5711
  pending,
5525
- landed: pendingLanded(pending, updateMap, effective, workbench?.installed),
5712
+ landed: pendingLanded(pending, updateMap, effective, workbench?.installed, shared, pluginSource === null ? null : pluginList),
5526
5713
  t,
5527
5714
  onChanged,
5715
+ selfUpdate: mock?.selfUpdate ?? selfUpdate,
5528
5716
  setPending,
5529
5717
  setFailed
5530
5718
  });
5531
5719
  const settled = marketSettled(freshness, installedRead);
5532
5720
  const nothing = shown.length === 0 && self === void 0 && installedList.length === 0 && pluginList.length === 0;
5533
- if (!settled || (settling?.size ?? 0) > 0 && shown.length === 0 && installedList.length === 0) return /* @__PURE__ */ h(MarketChecking, { t });
5534
- if (nothing) return /* @__PURE__ */ h(MarketEmpty, { t });
5535
- return /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(MarketBody, {
5721
+ if (!settled || (settling?.size ?? 0) > 0 && shown.length === 0 && installedList.length === 0) return /* @__PURE__ */ createElement(MarketChecking, { t });
5722
+ if (nothing) return /* @__PURE__ */ createElement(MarketEmpty, { t });
5723
+ return /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement(MarketBody, {
5536
5724
  t,
5537
5725
  self,
5538
5726
  shown,
@@ -5546,7 +5734,7 @@ function MarketView({ t, manifests, installable, capabilities, freshness, onChan
5546
5734
  onConfirming: setConfirming,
5547
5735
  setDefault,
5548
5736
  boardBusy
5549
- }), /* @__PURE__ */ h(ConfirmUninstall, {
5737
+ }), /* @__PURE__ */ createElement(ConfirmUninstall, {
5550
5738
  key: confirming ?? "",
5551
5739
  t,
5552
5740
  name: confirmingRow === void 0 ? null : marketRowTitle(confirmingRow, t),
@@ -5850,23 +6038,61 @@ function attentionWordLabel(attention, t) {
5850
6038
  }
5851
6039
  //#endregion
5852
6040
  //#region src/app/layouts/project-selection.ts
5853
- var listeners$2 = /* @__PURE__ */ new Set();
6041
+ var listeners$3 = /* @__PURE__ */ new Set();
5854
6042
  function selectedProjectId() {
5855
6043
  const stored = readText(STORAGE_KEY_PROJECT);
5856
6044
  return stored === "" ? null : stored;
5857
6045
  }
5858
6046
  function selectProject(workspaceId) {
5859
6047
  writeText(STORAGE_KEY_PROJECT, workspaceId);
5860
- for (const listener of [...listeners$2]) try {
6048
+ for (const listener of [...listeners$3]) try {
5861
6049
  listener();
5862
6050
  } catch {}
5863
6051
  }
5864
6052
  function subscribeProject(listener) {
6053
+ listeners$3.add(listener);
6054
+ return () => {
6055
+ listeners$3.delete(listener);
6056
+ };
6057
+ }
6058
+ //#endregion
6059
+ //#region src/app/layouts/sidebar/edition.ts
6060
+ var runtime$1 = "official";
6061
+ var listeners$2 = /* @__PURE__ */ new Set();
6062
+ /**
6063
+ * 这一屏启动时按哪一档左栏渲染;组合层决定的,改它要刷新页面。
6064
+ * @returns 运行态档位(默认官方)。
6065
+ */
6066
+ function runtimeSidebarEdition() {
6067
+ return runtime$1;
6068
+ }
6069
+ /**
6070
+ * 记下这一屏的左栏档位(只在启动时由客户端调用一次)。
6071
+ * @param next 读到的档位。
6072
+ */
6073
+ function setRuntimeSidebarEdition(next) {
6074
+ if (next === runtime$1) return;
6075
+ runtime$1 = next;
6076
+ for (const listener of listeners$2) listener();
6077
+ }
6078
+ /**
6079
+ * 订阅运行态档位的变化(目前只在启动时变一次)。
6080
+ * @param listener 变化时的回调。
6081
+ * @returns 取消订阅。
6082
+ */
6083
+ function subscribeSidebarEdition(listener) {
5865
6084
  listeners$2.add(listener);
5866
6085
  return () => {
5867
6086
  listeners$2.delete(listener);
5868
6087
  };
5869
6088
  }
6089
+ /**
6090
+ * 组件里读运行态档位(启动后解析出来才变一次,变了会重渲染)。
6091
+ * @returns 运行态档位。
6092
+ */
6093
+ function useRuntimeSidebarEdition() {
6094
+ return useSyncExternalStore(subscribeSidebarEdition, runtimeSidebarEdition, runtimeSidebarEdition);
6095
+ }
5870
6096
  //#endregion
5871
6097
  //#region src/app/layouts/rightbar/use-panels.ts
5872
6098
  function shouldDropPanels(workspace, previous) {
@@ -5875,6 +6101,7 @@ function shouldDropPanels(workspace, previous) {
5875
6101
  function useEnabledUnits(refreshToken, workspace) {
5876
6102
  const [enabled, setEnabled] = useState(null);
5877
6103
  const lastWorkspace = useRef(workspace);
6104
+ const factRev = useFactRevision("panels");
5878
6105
  useEffect(() => {
5879
6106
  let cancelled = false;
5880
6107
  if (shouldDropPanels(workspace, lastWorkspace.current)) {
@@ -5898,7 +6125,7 @@ function useEnabledUnits(refreshToken, workspace) {
5898
6125
  };
5899
6126
  }, [
5900
6127
  refreshToken,
5901
- useFactRevision("panels"),
6128
+ factRev,
5902
6129
  workspace
5903
6130
  ]);
5904
6131
  return enabled;
@@ -5910,7 +6137,10 @@ function useSelectedProjectId() {
5910
6137
  }
5911
6138
  function useBoardWorkspace(workspaces, sessions) {
5912
6139
  const projectId = useSelectedProjectId();
5913
- const workspace = workspaces.items.find((item) => item.workspaceId === projectId) ?? workspaceOfSession(workspaces.items, currentSessionId(sessions, false));
6140
+ const edition = useRuntimeSidebarEdition();
6141
+ const fromProject = workspaces.items.find((item) => item.workspaceId === projectId) ?? null;
6142
+ const fromSession = workspaceOfSession(workspaces.items, currentSessionId(sessions, false));
6143
+ const workspace = edition === "official" ? fromSession ?? fromProject : fromProject ?? fromSession;
5914
6144
  return {
5915
6145
  workspace,
5916
6146
  path: workspace?.path ?? null
@@ -5953,12 +6183,11 @@ function readModuleVersions(force = false) {
5953
6183
  function readInstalledPlugins(force = false) {
5954
6184
  return apiGet(INSTALLED_PLUGINS_ROUTE, force ? { force: "1" } : void 0);
5955
6185
  }
5956
- //#endregion
5957
- //#region src/app/layouts/market/use-module-versions.ts
5958
6186
  var state = {
5959
6187
  modules: null,
5960
6188
  plugins: null,
5961
6189
  workbench: null,
6190
+ selfUpdate: null,
5962
6191
  read: false,
5963
6192
  checkedAt: null
5964
6193
  };
@@ -5966,6 +6195,14 @@ var listeners$1 = /* @__PURE__ */ new Set();
5966
6195
  var inFlight = null;
5967
6196
  var readSeq = 0;
5968
6197
  var newestForceSeq = -1;
6198
+ var epoch = 0;
6199
+ /**
6200
+ * 写完之后把读数作废:这之前发出去的在飞读取即使回来也不许再发布(它读的是改之前的盘)。
6201
+ * 每次写成功都调用一次,再配一次 `force + fresh` 的读。
6202
+ */
6203
+ function bumpModuleVersionsEpoch() {
6204
+ epoch += 1;
6205
+ }
5969
6206
  function moduleVersionsValue() {
5970
6207
  return state;
5971
6208
  }
@@ -5979,11 +6216,13 @@ function publish(next) {
5979
6216
  state = next;
5980
6217
  for (const listener of [...listeners$1]) listener();
5981
6218
  }
5982
- function runModuleVersionsRead(force = false) {
5983
- if (inFlight !== null && inFlight.force === force) return inFlight.promise;
6219
+ function runModuleVersionsRead(force = false, fresh = false) {
6220
+ const at = epoch;
6221
+ if (!fresh && inFlight !== null && inFlight.force === force && inFlight.epoch === at) return inFlight.promise;
5984
6222
  const seq = readSeq += 1;
5985
6223
  if (force) newestForceSeq = seq;
5986
6224
  const promise = Promise.all([readModuleVersions(force), readInstalledPlugins(force)]).catch(() => null).then((responses) => {
6225
+ if (at !== epoch) return;
5987
6226
  if (!force && seq < newestForceSeq) return;
5988
6227
  const versions = responses?.[0];
5989
6228
  const plugins = responses?.[1];
@@ -5991,6 +6230,7 @@ function runModuleVersionsRead(force = false) {
5991
6230
  modules: versions?.ok === true ? versions.modules : state.modules,
5992
6231
  plugins: plugins?.ok === true ? plugins.plugins : state.plugins,
5993
6232
  workbench: versions?.ok === true ? versions.workbench ?? null : state.workbench,
6233
+ selfUpdate: versions?.ok === true ? versions.selfUpdate ?? null : state.selfUpdate,
5994
6234
  read: true,
5995
6235
  checkedAt: Date.now()
5996
6236
  });
@@ -5999,6 +6239,7 @@ function runModuleVersionsRead(force = false) {
5999
6239
  });
6000
6240
  inFlight = {
6001
6241
  force,
6242
+ epoch: at,
6002
6243
  promise
6003
6244
  };
6004
6245
  return promise;
@@ -6018,12 +6259,13 @@ function useModuleVersions() {
6018
6259
  runModuleVersionsRead(false);
6019
6260
  }, [factRev]);
6020
6261
  const reload = useCallback((options) => {
6021
- runModuleVersionsRead(options?.force === true);
6262
+ runModuleVersionsRead(options?.force === true, options?.fresh === true);
6022
6263
  }, []);
6023
6264
  return {
6024
6265
  modules: value.modules,
6025
6266
  plugins: value.plugins,
6026
6267
  workbench: value.workbench,
6268
+ selfUpdate: value.selfUpdate,
6027
6269
  read: value.read,
6028
6270
  checkedAt: value.checkedAt,
6029
6271
  reload
@@ -6101,7 +6343,7 @@ function AddModuleRegistry({ t, state }) {
6101
6343
  useDismissOnOutsidePointer(registryRoot, state.registryOpen, (next) => {
6102
6344
  if (!next) state.closeRegistry();
6103
6345
  });
6104
- return /* @__PURE__ */ h("div", {
6346
+ return /* @__PURE__ */ createElement("div", {
6105
6347
  className: AddModule_module_default.registryWrap,
6106
6348
  ref: registryRoot,
6107
6349
  onKeyDown: (event) => {
@@ -6109,7 +6351,7 @@ function AddModuleRegistry({ t, state }) {
6109
6351
  event.stopPropagation();
6110
6352
  state.closeRegistry();
6111
6353
  }
6112
- }, /* @__PURE__ */ h("button", {
6354
+ }, /* @__PURE__ */ createElement("button", {
6113
6355
  type: "button",
6114
6356
  ref: registryAnchor,
6115
6357
  className: AddModule_module_default.registryToggle,
@@ -6118,7 +6360,7 @@ function AddModuleRegistry({ t, state }) {
6118
6360
  "aria-controls": REGISTRY_ID,
6119
6361
  disabled: state.phase === "inspecting",
6120
6362
  onClick: state.toggleRegistry
6121
- }, /* @__PURE__ */ h("span", null, t("panels.market.add.registryToggle")), " ", /* @__PURE__ */ h("span", { className: AddModule_module_default.registryChosen }, chosen === void 0 ? t("panels.market.add.registryDefault") : registryName(chosen, t)), /* @__PURE__ */ h(IconChevronDownOutlineRegular, { size: 14 })), state.registryOpen ? /* @__PURE__ */ h("div", {
6363
+ }, /* @__PURE__ */ createElement("span", null, t("panels.market.add.registryToggle")), " ", /* @__PURE__ */ createElement("span", { className: AddModule_module_default.registryChosen }, chosen === void 0 ? t("panels.market.add.registryDefault") : registryName(chosen, t)), /* @__PURE__ */ createElement(IconChevronDownOutlineRegular, { size: 14 })), state.registryOpen ? /* @__PURE__ */ createElement("div", {
6122
6364
  id: REGISTRY_ID,
6123
6365
  className: AddModule_module_default.registry,
6124
6366
  ref: registryPanel,
@@ -6127,17 +6369,17 @@ function AddModuleRegistry({ t, state }) {
6127
6369
  style: registryPosition ?? void 0
6128
6370
  }, state.choices.map((option) => {
6129
6371
  const active = option.choice.kind === state.choice.kind && option.choice.value === state.choice.value;
6130
- if (!(option.choice.kind === "custom")) return /* @__PURE__ */ h("label", {
6372
+ if (!(option.choice.kind === "custom")) return /* @__PURE__ */ createElement("label", {
6131
6373
  key: `${option.choice.kind}|${option.choice.value}`,
6132
6374
  className: AddModule_module_default.registryOption,
6133
6375
  "data-checked": active
6134
- }, /* @__PURE__ */ h("input", {
6376
+ }, /* @__PURE__ */ createElement("input", {
6135
6377
  type: "radio",
6136
6378
  name: REGISTRY_ID,
6137
6379
  checked: active,
6138
6380
  onChange: () => state.setChoice(option.choice)
6139
- }), /* @__PURE__ */ h("span", { className: AddModule_module_default.registryTitle }, /* @__PURE__ */ h("span", null, optionLabel(option, t))));
6140
- return /* @__PURE__ */ h("div", {
6381
+ }), /* @__PURE__ */ createElement("span", { className: AddModule_module_default.registryTitle }, /* @__PURE__ */ createElement("span", null, optionLabel(option, t))));
6382
+ return /* @__PURE__ */ createElement("div", {
6141
6383
  key: `${option.choice.kind}|${option.choice.value}`,
6142
6384
  className: AddModule_module_default.registryOption,
6143
6385
  "data-checked": active,
@@ -6147,12 +6389,12 @@ function AddModuleRegistry({ t, state }) {
6147
6389
  onFocusCapture: () => {
6148
6390
  if (!active) state.setChoice(option.choice);
6149
6391
  }
6150
- }, /* @__PURE__ */ h("label", { className: AddModule_module_default.registryPick }, /* @__PURE__ */ h("input", {
6392
+ }, /* @__PURE__ */ createElement("label", { className: AddModule_module_default.registryPick }, /* @__PURE__ */ createElement("input", {
6151
6393
  type: "radio",
6152
6394
  name: REGISTRY_ID,
6153
6395
  checked: active,
6154
6396
  onChange: () => state.setChoice(option.choice)
6155
- }), /* @__PURE__ */ h("span", { className: AddModule_module_default.registryTitle }, /* @__PURE__ */ h("span", null, t("panels.market.add.registryCustom")))), /* @__PURE__ */ h(TextField, {
6397
+ }), /* @__PURE__ */ createElement("span", { className: AddModule_module_default.registryTitle }, /* @__PURE__ */ createElement("span", null, t("panels.market.add.registryCustom")))), /* @__PURE__ */ createElement(TextField, {
6156
6398
  type: "text",
6157
6399
  className: AddModule_module_default.registryField,
6158
6400
  "aria-label": t("panels.market.add.registryCustom"),
@@ -6160,16 +6402,16 @@ function AddModuleRegistry({ t, state }) {
6160
6402
  value: state.custom,
6161
6403
  invalid: customBad,
6162
6404
  onChange: (event) => state.setCustom(event.target.value)
6163
- }), customBad ? /* @__PURE__ */ h("span", {
6405
+ }), customBad ? /* @__PURE__ */ createElement("span", {
6164
6406
  className: AddModule_module_default.inputError,
6165
6407
  role: "alert"
6166
- }, t("panels.market.add.registryCustomInvalid")) : null, /* @__PURE__ */ h("span", { className: AddModule_module_default.registryHint }, t("panels.market.add.registryCustomHint")));
6408
+ }, t("panels.market.add.registryCustomInvalid")) : null, /* @__PURE__ */ createElement("span", { className: AddModule_module_default.registryHint }, t("panels.market.add.registryCustomHint")));
6167
6409
  })) : null);
6168
6410
  }
6169
6411
  //#endregion
6170
6412
  //#region src/app/layouts/market/AddModuleForm.tsx
6171
6413
  function AddModuleForm({ t, state }) {
6172
- return /* @__PURE__ */ h("div", { className: AddModule_module_default.body }, /* @__PURE__ */ h("div", { className: AddModule_module_default.field }, /* @__PURE__ */ h(TextField, {
6414
+ return /* @__PURE__ */ createElement("div", { className: AddModule_module_default.body }, /* @__PURE__ */ createElement("div", { className: AddModule_module_default.field }, /* @__PURE__ */ createElement(TextField, {
6173
6415
  type: "text",
6174
6416
  className: AddModule_module_default.input,
6175
6417
  value: state.spec,
@@ -6182,27 +6424,27 @@ function AddModuleForm({ t, state }) {
6182
6424
  onKeyDown: (event) => {
6183
6425
  if (event.key === "Enter" && state.spec.trim() !== "") state.check();
6184
6426
  }
6185
- })), state.problem === null ? null : /* @__PURE__ */ h("p", {
6427
+ })), state.problem === null ? null : /* @__PURE__ */ createElement("p", {
6186
6428
  className: AddModule_module_default.problem,
6187
6429
  role: "alert"
6188
- }, t(problemKey(state.problem.problem), { reason: state.problem.reason })), state.failure === null ? null : /* @__PURE__ */ h("p", {
6430
+ }, t(problemKey(state.problem.problem), { reason: state.problem.reason })), state.failure === null ? null : /* @__PURE__ */ createElement("p", {
6189
6431
  className: AddModule_module_default.problem,
6190
6432
  role: "alert"
6191
- }, state.failure), /* @__PURE__ */ h("div", { className: AddModule_module_default.options }, /* @__PURE__ */ h("button", {
6433
+ }, state.failure), /* @__PURE__ */ createElement("div", { className: AddModule_module_default.options }, /* @__PURE__ */ createElement("button", {
6192
6434
  type: "button",
6193
6435
  className: AddModule_module_default.guideToggle,
6194
6436
  "aria-expanded": state.guideOpen,
6195
6437
  onClick: state.toggleGuide
6196
- }, /* @__PURE__ */ h(IconChevronDownOutlineRegular, { size: 14 }), /* @__PURE__ */ h("span", null, t(state.guideOpen ? "panels.market.add.guideHide" : "panels.market.add.guideToggle"))), /* @__PURE__ */ h(AddModuleRegistry, {
6438
+ }, /* @__PURE__ */ createElement(IconChevronDownOutlineRegular, { size: 14 }), /* @__PURE__ */ createElement("span", null, t(state.guideOpen ? "panels.market.add.guideHide" : "panels.market.add.guideToggle"))), /* @__PURE__ */ createElement(AddModuleRegistry, {
6197
6439
  t,
6198
6440
  state
6199
- })), state.guideOpen ? /* @__PURE__ */ h("div", { className: AddModule_module_default.guide }, /* @__PURE__ */ h("ol", { className: AddModule_module_default.guideList }, GUIDE_ITEMS.map((item, index) => /* @__PURE__ */ h("li", {
6441
+ })), state.guideOpen ? /* @__PURE__ */ createElement("div", { className: AddModule_module_default.guide }, /* @__PURE__ */ createElement("ol", { className: AddModule_module_default.guideList }, GUIDE_ITEMS.map((item, index) => /* @__PURE__ */ createElement("li", {
6200
6442
  className: AddModule_module_default.guideItem,
6201
6443
  key: item.exampleKey
6202
- }, /* @__PURE__ */ h("span", {
6444
+ }, /* @__PURE__ */ createElement("span", {
6203
6445
  className: AddModule_module_default.guideIndex,
6204
6446
  "aria-hidden": "true"
6205
- }, index + 1), /* @__PURE__ */ h("span", { className: AddModule_module_default.guideMain }, /* @__PURE__ */ h("span", { className: AddModule_module_default.guideTitle }, t(item.titleKey)), /* @__PURE__ */ h("span", { className: AddModule_module_default.guideHint }, t(item.hintKey)), /* @__PURE__ */ h("span", { className: AddModule_module_default.guideExample }, /* @__PURE__ */ h("span", { className: AddModule_module_default.guideExampleLabel }, t("panels.market.add.guideExampleLabel")), /* @__PURE__ */ h("code", null, t(item.exampleKey)))), /* @__PURE__ */ h(Button, {
6447
+ }, index + 1), /* @__PURE__ */ createElement("span", { className: AddModule_module_default.guideMain }, /* @__PURE__ */ createElement("span", { className: AddModule_module_default.guideTitle }, t(item.titleKey)), /* @__PURE__ */ createElement("span", { className: AddModule_module_default.guideHint }, t(item.hintKey)), /* @__PURE__ */ createElement("span", { className: AddModule_module_default.guideExample }, /* @__PURE__ */ createElement("span", { className: AddModule_module_default.guideExampleLabel }, t("panels.market.add.guideExampleLabel")), /* @__PURE__ */ createElement("code", null, t(item.exampleKey)))), /* @__PURE__ */ createElement(Button, {
6206
6448
  type: "button",
6207
6449
  size: "sm",
6208
6450
  variant: "outline",
@@ -6214,13 +6456,13 @@ var SafetyNote_module_default = { note: "_note_1enlz_1" };
6214
6456
  //#endregion
6215
6457
  //#region src/app/layouts/market/SafetyNote.tsx
6216
6458
  function SafetyNote({ t }) {
6217
- return /* @__PURE__ */ h("p", {
6459
+ return /* @__PURE__ */ createElement("p", {
6218
6460
  className: SafetyNote_module_default.note,
6219
6461
  role: "note"
6220
- }, /* @__PURE__ */ h(IconWarningOutlineRegular, {
6462
+ }, /* @__PURE__ */ createElement(IconWarningOutlineRegular, {
6221
6463
  size: 14,
6222
6464
  "aria-hidden": "true"
6223
- }), /* @__PURE__ */ h("span", null, t("panels.market.add.guideSafety")));
6465
+ }), /* @__PURE__ */ createElement("span", null, t("panels.market.add.guideSafety")));
6224
6466
  }
6225
6467
  //#endregion
6226
6468
  //#region src/app/layouts/market/AddModuleStages.tsx
@@ -6233,11 +6475,11 @@ function supplyTone(state) {
6233
6475
  return SUPPLY_TONES[state] ?? AddModule_module_default.note;
6234
6476
  }
6235
6477
  function AddModulePending({ t, kind }) {
6236
- return /* @__PURE__ */ h("div", { className: AddModule_module_default.body }, /* @__PURE__ */ h("div", { className: AddModule_module_default.hero }, /* @__PURE__ */ h("span", {
6478
+ return /* @__PURE__ */ createElement("div", { className: AddModule_module_default.body }, /* @__PURE__ */ createElement("div", { className: AddModule_module_default.hero }, /* @__PURE__ */ createElement("span", {
6237
6479
  className: AddModule_module_default.heroIcon,
6238
6480
  "data-state": "ongoing",
6239
6481
  "aria-hidden": "true"
6240
- }, /* @__PURE__ */ h(Spinner, { size: 28 })), /* @__PURE__ */ h("h2", {
6482
+ }, /* @__PURE__ */ createElement(Spinner, { size: 28 })), /* @__PURE__ */ createElement("h2", {
6241
6483
  className: AddModule_module_default.pendingTitle,
6242
6484
  role: "status"
6243
6485
  }, kind === "inspecting" ? t("panels.market.add.classifying") : t("panels.market.add.installingTitle"))));
@@ -6248,7 +6490,7 @@ function AddModulePreview({ t, state }) {
6248
6490
  const source = preview.registry === "" ? t("panels.market.add.registryDefault") : preview.registry;
6249
6491
  const plugin = preview.kind === "plugin";
6250
6492
  const pluginName = plugin ? preview.pluginName : void 0;
6251
- return /* @__PURE__ */ h("div", { className: AddModule_module_default.body }, /* @__PURE__ */ h("div", { className: AddModule_module_default.subject }, /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectName }, preview.name), preview.version === "" ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectMeta }, t("panels.market.add.installVersion", { version: preview.version })), pluginName === void 0 || pluginName === preview.name ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectMeta }, t("panels.market.add.pluginAlias", { name: pluginName })), preview.description === "" ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectDesc }, preview.description), /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectMeta }, source)), plugin ? /* @__PURE__ */ h("p", { className: AddModule_module_default.result }, t("panels.market.add.pluginPreview")) : null);
6493
+ return /* @__PURE__ */ createElement("div", { className: AddModule_module_default.body }, /* @__PURE__ */ createElement("div", { className: AddModule_module_default.subject }, /* @__PURE__ */ createElement("p", { className: AddModule_module_default.subjectName }, preview.name), preview.version === "" ? null : /* @__PURE__ */ createElement("p", { className: AddModule_module_default.subjectMeta }, t("panels.market.add.installVersion", { version: preview.version })), pluginName === void 0 || pluginName === preview.name ? null : /* @__PURE__ */ createElement("p", { className: AddModule_module_default.subjectMeta }, t("panels.market.add.pluginAlias", { name: pluginName })), preview.description === "" ? null : /* @__PURE__ */ createElement("p", { className: AddModule_module_default.subjectDesc }, preview.description), /* @__PURE__ */ createElement("p", { className: AddModule_module_default.subjectMeta }, source)), plugin ? /* @__PURE__ */ createElement("p", { className: AddModule_module_default.result }, t("panels.market.add.pluginPreview")) : null);
6252
6494
  }
6253
6495
  function AddModuleResult({ t, state }) {
6254
6496
  const outcome = state.outcome;
@@ -6264,20 +6506,20 @@ function AddModuleResult({ t, state }) {
6264
6506
  });
6265
6507
  const name = outcome.module.kind === "module" ? outcome.module.unit : outcome.module.pkg;
6266
6508
  const why = restartWhy(outcome.change, t);
6267
- return /* @__PURE__ */ h("div", { className: AddModule_module_default.body }, /* @__PURE__ */ h("div", { className: AddModule_module_default.hero }, /* @__PURE__ */ h("span", {
6509
+ return /* @__PURE__ */ createElement("div", { className: AddModule_module_default.body }, /* @__PURE__ */ createElement("div", { className: AddModule_module_default.hero }, /* @__PURE__ */ createElement("span", {
6268
6510
  className: AddModule_module_default.heroIcon,
6269
6511
  "data-state": kind === "failed" ? "error" : kind === "cancelled" ? "idle" : "done",
6270
6512
  "aria-hidden": "true"
6271
- }, kind === "failed" ? /* @__PURE__ */ h(IconWarningOutlineRegular, { size: 28 }) : kind === "cancelled" ? /* @__PURE__ */ h(StateDot, {
6513
+ }, kind === "failed" ? /* @__PURE__ */ createElement(IconWarningOutlineRegular, { size: 28 }) : kind === "cancelled" ? /* @__PURE__ */ createElement(StateDot, {
6272
6514
  state: "idle",
6273
6515
  size: 28
6274
- }) : /* @__PURE__ */ h(IconCheckCircleFillRegular, { size: 28 })), /* @__PURE__ */ h("h2", {
6516
+ }) : /* @__PURE__ */ createElement(IconCheckCircleFillRegular, { size: 28 })), /* @__PURE__ */ createElement("h2", {
6275
6517
  className: AddModule_module_default.wizardTitle,
6276
6518
  role: kind === "failed" ? "alert" : "status"
6277
- }, kind === "failed" ? t("panels.market.add.failedTitle") : kind === "cancelled" ? t("panels.market.add.cancelledTitle") : t("panels.market.add.installedTitle"))), /* @__PURE__ */ h("div", { className: AddModule_module_default.subject }, /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectName }, outcome.module.pkg), name === outcome.module.pkg ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectMeta }, name), outcome.module.version === void 0 ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectMeta }, t("panels.market.add.installVersion", { version: outcome.module.version }))), kind === "plugin" && plugin !== void 0 ? /* @__PURE__ */ h("p", { className: AddModule_module_default.result }, t("panels.market.add.installedPlugin", { name: plugin.name ?? plugin.pkg })) : kind === "failed" ? /* @__PURE__ */ h("p", {
6519
+ }, kind === "failed" ? t("panels.market.add.failedTitle") : kind === "cancelled" ? t("panels.market.add.cancelledTitle") : t("panels.market.add.installedTitle"))), /* @__PURE__ */ createElement("div", { className: AddModule_module_default.subject }, /* @__PURE__ */ createElement("p", { className: AddModule_module_default.subjectName }, outcome.module.pkg), name === outcome.module.pkg ? null : /* @__PURE__ */ createElement("p", { className: AddModule_module_default.subjectMeta }, name), outcome.module.version === void 0 ? null : /* @__PURE__ */ createElement("p", { className: AddModule_module_default.subjectMeta }, t("panels.market.add.installVersion", { version: outcome.module.version }))), kind === "plugin" && plugin !== void 0 ? /* @__PURE__ */ createElement("p", { className: AddModule_module_default.result }, t("panels.market.add.installedPlugin", { name: plugin.name ?? plugin.pkg })) : kind === "failed" ? /* @__PURE__ */ createElement("p", {
6278
6520
  className: AddModule_module_default.resultWarn,
6279
6521
  role: "alert"
6280
- }, t("panels.market.add.failed", { reason })) : kind === "restart" ? /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h("p", { className: AddModule_module_default.resultWarn }, t("panels.market.add.doneRestart")), why === void 0 ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.resultMeta }, why)) : kind === "quiet" ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.result }, t("panels.market.add.tookEffect")), builds.length === 0 ? null : /* @__PURE__ */ h("div", { className: AddModule_module_default.approval }, /* @__PURE__ */ h("p", { className: AddModule_module_default.approvalTitle }, t("panels.market.add.approveTitle")), /* @__PURE__ */ h("p", { className: AddModule_module_default.approvalText }, t("panels.market.add.approveHint", { packages: builds.join("、") })), /* @__PURE__ */ h("p", { className: AddModule_module_default.approvalCaution }, t("panels.market.add.approveCaution"))), supply === void 0 || outcome.supply.state !== "failed" && (kind === "failed" || kind === "cancelled") ? null : /* @__PURE__ */ h("p", { className: supplyTone(outcome.supply.state) }, t(supply, { reason: outcome.supply.reason ?? "" })), state.failure === null ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.problem }, state.failure), outcome.change.errorDetail === void 0 ? null : /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h("p", { className: AddModule_module_default.detailLabel }, t("panels.market.add.details")), /* @__PURE__ */ h("p", { className: AddModule_module_default.detail }, outcome.change.errorDetail)));
6522
+ }, t("panels.market.add.failed", { reason })) : kind === "restart" ? /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement("p", { className: AddModule_module_default.resultWarn }, t("panels.market.add.doneRestart")), why === void 0 ? null : /* @__PURE__ */ createElement("p", { className: AddModule_module_default.resultMeta }, why)) : kind === "quiet" ? null : /* @__PURE__ */ createElement("p", { className: AddModule_module_default.result }, t("panels.market.add.tookEffect")), builds.length === 0 ? null : /* @__PURE__ */ createElement("div", { className: AddModule_module_default.approval }, /* @__PURE__ */ createElement("p", { className: AddModule_module_default.approvalTitle }, t("panels.market.add.approveTitle")), /* @__PURE__ */ createElement("p", { className: AddModule_module_default.approvalText }, t("panels.market.add.approveHint", { packages: builds.join("、") })), /* @__PURE__ */ createElement("p", { className: AddModule_module_default.approvalCaution }, t("panels.market.add.approveCaution"))), supply === void 0 || outcome.supply.state !== "failed" && (kind === "failed" || kind === "cancelled") ? null : /* @__PURE__ */ createElement("p", { className: supplyTone(outcome.supply.state) }, t(supply, { reason: outcome.supply.reason ?? "" })), state.failure === null ? null : /* @__PURE__ */ createElement("p", { className: AddModule_module_default.problem }, state.failure), outcome.change.errorDetail === void 0 ? null : /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement("p", { className: AddModule_module_default.detailLabel }, t("panels.market.add.details")), /* @__PURE__ */ createElement("p", { className: AddModule_module_default.detail }, outcome.change.errorDetail)));
6281
6523
  }
6282
6524
  //#endregion
6283
6525
  //#region src/app/layouts/market/use-add-module.ts
@@ -6489,7 +6731,7 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
6489
6731
  const failed = state.outcome?.change.application === "failed";
6490
6732
  const builds = state.builds;
6491
6733
  const notModule = state.outcome?.supply.state === "not-a-module";
6492
- const footer = /* @__PURE__ */ h(Fragment, null, state.phase === "idle" ? /* @__PURE__ */ h("div", { className: AddModule_module_default.footer }, /* @__PURE__ */ h(SafetyNote, { t }), /* @__PURE__ */ h(Button, {
6734
+ const footer = /* @__PURE__ */ createElement(Fragment, null, state.phase === "idle" ? /* @__PURE__ */ createElement("div", { className: AddModule_module_default.footer }, /* @__PURE__ */ createElement(SafetyNote, { t }), /* @__PURE__ */ createElement(Button, {
6493
6735
  type: "button",
6494
6736
  variant: "primary",
6495
6737
  size: "md",
@@ -6497,27 +6739,27 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
6497
6739
  disabled: empty || checking,
6498
6740
  "aria-busy": checking,
6499
6741
  onClick: state.check
6500
- }, checking ? /* @__PURE__ */ h(Spinner, { size: 12 }) : null, t(checking ? "panels.market.add.checking" : "panels.market.add.run"))) : null, state.phase === "preview" ? /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(Button, {
6742
+ }, checking ? /* @__PURE__ */ createElement(Spinner, { size: 12 }) : null, t(checking ? "panels.market.add.checking" : "panels.market.add.run"))) : null, state.phase === "preview" ? /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement(Button, {
6501
6743
  type: "button",
6502
6744
  variant: "outline",
6503
6745
  size: "md",
6504
6746
  onClick: state.edit
6505
- }, t("panels.market.add.edit")), /* @__PURE__ */ h(Button, {
6747
+ }, t("panels.market.add.edit")), /* @__PURE__ */ createElement(Button, {
6506
6748
  type: "button",
6507
6749
  variant: "primary",
6508
6750
  size: "md",
6509
6751
  onClick: () => state.install()
6510
- }, t("panels.market.add.run"))) : null, installing ? /* @__PURE__ */ h(Button, {
6752
+ }, t("panels.market.add.run"))) : null, installing ? /* @__PURE__ */ createElement(Button, {
6511
6753
  type: "button",
6512
6754
  variant: "outline",
6513
6755
  size: "md",
6514
6756
  onClick: state.cancelInstall
6515
- }, t("panels.market.add.cancel")) : null, state.phase === "result" ? /* @__PURE__ */ h(Fragment, null, failed && builds.length === 0 ? /* @__PURE__ */ h(Button, {
6757
+ }, t("panels.market.add.cancel")) : null, state.phase === "result" ? /* @__PURE__ */ createElement(Fragment, null, failed && builds.length === 0 ? /* @__PURE__ */ createElement(Button, {
6516
6758
  type: "button",
6517
6759
  variant: "outline",
6518
6760
  size: "md",
6519
6761
  onClick: state.edit
6520
- }, t("panels.market.add.changeRegistry")) : null, notModule ? /* @__PURE__ */ h(Button, {
6762
+ }, t("panels.market.add.changeRegistry")) : null, notModule ? /* @__PURE__ */ createElement(Button, {
6521
6763
  type: "button",
6522
6764
  variant: "outline",
6523
6765
  size: "md",
@@ -6525,23 +6767,23 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
6525
6767
  disabled: state.removing,
6526
6768
  "aria-busy": state.removing,
6527
6769
  onClick: state.removeIt
6528
- }, state.removing ? /* @__PURE__ */ h(Spinner, { size: 12 }) : null, t(state.removing ? "panels.market.uninstalling" : "panels.market.add.remove")) : null, /* @__PURE__ */ h(Button, {
6770
+ }, state.removing ? /* @__PURE__ */ createElement(Spinner, { size: 12 }) : null, t(state.removing ? "panels.market.uninstalling" : "panels.market.add.remove")) : null, /* @__PURE__ */ createElement(Button, {
6529
6771
  type: "button",
6530
6772
  variant: "outline",
6531
6773
  size: "md",
6532
6774
  onClick: onClose
6533
- }, t("panels.market.add.close")), builds.length === 0 ? null : /* @__PURE__ */ h(Button, {
6775
+ }, t("panels.market.add.close")), builds.length === 0 ? null : /* @__PURE__ */ createElement(Button, {
6534
6776
  type: "button",
6535
6777
  variant: "primary",
6536
6778
  size: "md",
6537
6779
  onClick: () => state.install(builds)
6538
- }, t("panels.market.add.approveRun")), failed && builds.length === 0 ? /* @__PURE__ */ h(Button, {
6780
+ }, t("panels.market.add.approveRun")), failed && builds.length === 0 ? /* @__PURE__ */ createElement(Button, {
6539
6781
  type: "button",
6540
6782
  variant: "primary",
6541
6783
  size: "md",
6542
6784
  onClick: () => state.install()
6543
6785
  }, t("panels.market.add.retry")) : null) : null);
6544
- return /* @__PURE__ */ h(Modal, {
6786
+ return /* @__PURE__ */ createElement(Modal, {
6545
6787
  open,
6546
6788
  onClose: () => {
6547
6789
  if (!installing) onClose();
@@ -6552,19 +6794,19 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
6552
6794
  className: AddModule_module_default.dialog,
6553
6795
  contentClassName: AddModule_module_default.content,
6554
6796
  footer
6555
- }, /* @__PURE__ */ h("div", { className: AddModule_module_default.stack }, devAdd.strip, state.phase === "idle" ? /* @__PURE__ */ h(AddModuleForm, {
6797
+ }, /* @__PURE__ */ createElement("div", { className: AddModule_module_default.stack }, devAdd.strip, state.phase === "idle" ? /* @__PURE__ */ createElement(AddModuleForm, {
6556
6798
  t,
6557
6799
  state
6558
- }) : null, state.phase === "inspecting" ? /* @__PURE__ */ h(AddModulePending, {
6800
+ }) : null, state.phase === "inspecting" ? /* @__PURE__ */ createElement(AddModulePending, {
6559
6801
  t,
6560
6802
  kind: "inspecting"
6561
- }) : null, state.phase === "preview" ? /* @__PURE__ */ h(AddModulePreview, {
6803
+ }) : null, state.phase === "preview" ? /* @__PURE__ */ createElement(AddModulePreview, {
6562
6804
  t,
6563
6805
  state
6564
- }) : null, state.phase === "installing" ? /* @__PURE__ */ h(AddModulePending, {
6806
+ }) : null, state.phase === "installing" ? /* @__PURE__ */ createElement(AddModulePending, {
6565
6807
  t,
6566
6808
  kind: "installing"
6567
- }) : null, state.phase === "result" ? /* @__PURE__ */ h(AddModuleResult, {
6809
+ }) : null, state.phase === "result" ? /* @__PURE__ */ createElement(AddModuleResult, {
6568
6810
  t,
6569
6811
  state
6570
6812
  }) : null));
@@ -6579,11 +6821,15 @@ var MOCK_FRESHNESS = {
6579
6821
  };
6580
6822
  var NO_UNITS = /* @__PURE__ */ new Set();
6581
6823
  function useLiveManifests(units) {
6582
- useSyncExternalStore(useCallback((listener) => units.subscribe(listener), [units]), useCallback(() => units.version(), [units]));
6824
+ const subscribe = useCallback((listener) => units.subscribe(listener), [units]);
6825
+ const revision = useCallback(() => units.version(), [units]);
6826
+ useSyncExternalStore(subscribe, revision);
6583
6827
  return units.manifests();
6584
6828
  }
6585
6829
  function useInstallableUnits(units) {
6586
- useSyncExternalStore(useCallback((listener) => units.subscribe(listener), [units]), useCallback(() => units.version(), [units]));
6830
+ const subscribe = useCallback((listener) => units.subscribe(listener), [units]);
6831
+ const revision = useCallback(() => units.version(), [units]);
6832
+ useSyncExternalStore(subscribe, revision);
6587
6833
  return units.installable();
6588
6834
  }
6589
6835
  function makeMarketEntryIcon(units) {
@@ -6608,24 +6854,38 @@ function makeMarketEntryIcon(units) {
6608
6854
  useEffect(() => () => {
6609
6855
  publishPanelHint(MARKET_PANEL_ID, null);
6610
6856
  }, []);
6611
- return /* @__PURE__ */ h(IconModules, { size });
6857
+ return /* @__PURE__ */ createElement(IconModules, { size });
6612
6858
  };
6613
6859
  }
6614
6860
  function MarketPanel({ t, units }) {
6615
6861
  const manifests = useLiveManifests(units);
6616
6862
  const installable = useInstallableUnits(units);
6617
6863
  const { capabilities, checkedAt, checking, forceProbe, reload: reloadCapability } = useCapabilityMap(0);
6618
- const { modules, plugins, workbench, read: installedRead, reload: reloadVersions } = useModuleVersions();
6864
+ const { modules, plugins, workbench, selfUpdate, read: installedRead, reload: reloadVersions } = useModuleVersions();
6619
6865
  const machineBoard = useEnabledUnits(0, null);
6620
6866
  const [adding, setAdding] = useState(false);
6621
6867
  const [acting, setActing] = useState(false);
6622
6868
  const openAddModule = useCallback(() => setAdding(true), []);
6623
6869
  const updates = useMemo(() => marketUpdatesOf(modules), [modules]);
6624
6870
  const installed = modules === null ? void 0 : withClientRefusals(modules, units.refusals());
6625
- const reload = useCallback(() => {
6871
+ const reload = useCallback((options) => {
6872
+ if (options?.force === true) {
6873
+ bumpModuleVersionsEpoch();
6874
+ bumpCapabilityEpoch();
6875
+ forceProbe();
6876
+ reloadVersions({
6877
+ force: true,
6878
+ fresh: true
6879
+ });
6880
+ return;
6881
+ }
6626
6882
  reloadCapability();
6627
6883
  reloadVersions();
6628
- }, [reloadCapability, reloadVersions]);
6884
+ }, [
6885
+ reloadCapability,
6886
+ reloadVersions,
6887
+ forceProbe
6888
+ ]);
6629
6889
  const enteredRef = useRef(false);
6630
6890
  useEffect(() => {
6631
6891
  if (enteredRef.current) return;
@@ -6677,26 +6937,23 @@ function MarketPanel({ t, units }) {
6677
6937
  const shownFreshness = mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS;
6678
6938
  const shownRead = mock === void 0 ? installedRead : mock.installedRead ?? true;
6679
6939
  const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking || acting;
6680
- return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketPage }, /* @__PURE__ */ h("header", { className: MarketPage_module_default.marketPageHead }, /* @__PURE__ */ h("div", null, /* @__PURE__ */ h("h1", { className: MarketPage_module_default.marketPageTitle }, t("panels.tab.market")), /* @__PURE__ */ h("p", { className: MarketPage_module_default.marketPageIntro }, t("panels.market.lead"))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketPageTools }, /* @__PURE__ */ h(Tip, { label: t("panels.market.recheck") }, /* @__PURE__ */ h("button", {
6940
+ return /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketPage }, /* @__PURE__ */ createElement("header", { className: MarketPage_module_default.marketPageHead }, /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("h1", { className: MarketPage_module_default.marketPageTitle }, t("panels.tab.market")), /* @__PURE__ */ createElement("p", { className: MarketPage_module_default.marketPageIntro }, t("panels.market.lead"))), /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketPageTools }, /* @__PURE__ */ createElement(Tip, { label: t("panels.market.recheck") }, /* @__PURE__ */ createElement("button", {
6681
6941
  type: "button",
6682
6942
  className: `${MarketPage_module_default.marketIconButton}${shownFreshness.checking ? ` ${MarketPage_module_default.marketIconButtonSpinning}` : ""}`,
6683
6943
  "aria-label": t("panels.market.checkUpdates"),
6684
6944
  disabled: busy,
6685
- onClick: () => {
6686
- forceProbe();
6687
- reloadVersions({ force: true });
6688
- }
6689
- }, /* @__PURE__ */ h("span", {
6945
+ onClick: () => reload({ force: true })
6946
+ }, /* @__PURE__ */ createElement("span", {
6690
6947
  className: MarketPage_module_default.marketIconWrap,
6691
6948
  "aria-hidden": "true"
6692
- }, /* @__PURE__ */ h(IconRefreshOutlineRegular, null)))), /* @__PURE__ */ h(Button, {
6949
+ }, /* @__PURE__ */ createElement(IconRefreshOutlineRegular, null)))), /* @__PURE__ */ createElement(Button, {
6693
6950
  variant: "primary",
6694
6951
  size: "sm",
6695
6952
  className: MarketPage_module_default.marketAddButton,
6696
- icon: /* @__PURE__ */ h(IconPlusOutlineRegular, { size: 13 }),
6953
+ icon: /* @__PURE__ */ createElement(IconPlusOutlineRegular, { size: 13 }),
6697
6954
  disabled: busy,
6698
6955
  onClick: openAddModule
6699
- }, t("panels.market.add.open")))), devMarket.strip, /* @__PURE__ */ h(MarketView, {
6956
+ }, t("panels.market.add.open")))), devMarket.strip, /* @__PURE__ */ createElement(MarketView, {
6700
6957
  key: `${mock?.id ?? "real-market"}-${mockNonce}`,
6701
6958
  t,
6702
6959
  manifests,
@@ -6709,16 +6966,17 @@ function MarketPanel({ t, units }) {
6709
6966
  installed,
6710
6967
  installedRead: shownRead,
6711
6968
  workbench,
6969
+ selfUpdate,
6712
6970
  plugins,
6713
6971
  settling: mock === void 0 ? settling : void 0,
6714
6972
  mock,
6715
6973
  defaults: machineBoard?.defaults ?? [],
6716
6974
  changed: machineBoard?.changed ?? {}
6717
- }), /* @__PURE__ */ h(AddModuleDialog, {
6975
+ }), /* @__PURE__ */ createElement(AddModuleDialog, {
6718
6976
  t,
6719
6977
  open: adding,
6720
6978
  onClose: () => setAdding(false),
6721
- onInstalled: reload
6979
+ onInstalled: () => reload({ force: true })
6722
6980
  }));
6723
6981
  }
6724
6982
  function registerMarketPanel(ctx, units) {
@@ -7093,7 +7351,7 @@ function DebugFooterAction({ wide, t, useWorkspaces, useSessions }) {
7093
7351
  where: here.path ?? ""
7094
7352
  }, workspacePath);
7095
7353
  const view = debugFooterView(state, t, situation === "off-workspace" || situation === "other-board" ? "workspace" : situation === "panel-closed" ? "panel" : "none");
7096
- const dot = /* @__PURE__ */ h(StateDot, {
7354
+ const dot = /* @__PURE__ */ createElement(StateDot, {
7097
7355
  state: view.trouble !== "none" ? "error" : view.stalled ? "warning" : "done",
7098
7356
  className: view.trouble === "none" && !view.stalled ? DebugFooterAction_module_default.pulse : void 0
7099
7357
  });
@@ -7111,37 +7369,37 @@ function DebugFooterAction({ wide, t, useWorkspaces, useSessions }) {
7111
7369
  setArmed(false);
7112
7370
  act.send({ intent: "stop" });
7113
7371
  };
7114
- const acts = /* @__PURE__ */ h("span", { className: DebugFooterAction_module_default.acts }, view.stalled ? /* @__PURE__ */ h("button", {
7372
+ const acts = /* @__PURE__ */ createElement("span", { className: DebugFooterAction_module_default.acts }, view.stalled ? /* @__PURE__ */ createElement("button", {
7115
7373
  type: "button",
7116
7374
  className: DebugFooterAction_module_default.act,
7117
7375
  "aria-label": t("debug.act.resume"),
7118
7376
  onClick: press("resume")
7119
- }, /* @__PURE__ */ h(IconPlayOutlineRegular, { size: 12 })) : /* @__PURE__ */ h("button", {
7377
+ }, /* @__PURE__ */ createElement(IconPlayOutlineRegular, { size: 12 })) : /* @__PURE__ */ createElement("button", {
7120
7378
  type: "button",
7121
7379
  className: DebugFooterAction_module_default.act,
7122
7380
  "aria-label": t("debug.act.pause"),
7123
7381
  onClick: press("pause")
7124
- }, /* @__PURE__ */ h(IconPauseOutlineRegular, { size: 12 })), /* @__PURE__ */ h("button", {
7382
+ }, /* @__PURE__ */ createElement(IconPauseOutlineRegular, { size: 12 })), /* @__PURE__ */ createElement("button", {
7125
7383
  type: "button",
7126
7384
  className: cx(DebugFooterAction_module_default.act, DebugFooterAction_module_default.actStop, armed ? DebugFooterAction_module_default.actArmed : void 0),
7127
7385
  "data-act-state": armed ? "armed" : "idle",
7128
7386
  "aria-label": armed ? t("debug.act.stop.ask") : t("debug.act.stop"),
7129
7387
  onClick: onStop,
7130
7388
  onBlur: () => setArmed(false)
7131
- }, /* @__PURE__ */ h(IconStopFillRegular, { size: 12 }), armed ? /* @__PURE__ */ h("span", { className: DebugFooterAction_module_default.actLabel }, t("debug.act.stop.ask")) : null));
7132
- const status = /* @__PURE__ */ h("span", { className: DebugFooterAction_module_default.entryInner }, dot, wide === true ? /* @__PURE__ */ h("span", { className: DebugFooterAction_module_default.entryLine }, view.label) : null);
7133
- const row = /* @__PURE__ */ h("div", { className: cx(DebugFooterAction_module_default.action, wide === true ? void 0 : DebugFooterAction_module_default.actionRail, tone) }, /* @__PURE__ */ h("span", {
7389
+ }, /* @__PURE__ */ createElement(IconStopFillRegular, { size: 12 }), armed ? /* @__PURE__ */ createElement("span", { className: DebugFooterAction_module_default.actLabel }, t("debug.act.stop.ask")) : null));
7390
+ const status = /* @__PURE__ */ createElement("span", { className: DebugFooterAction_module_default.entryInner }, dot, wide === true ? /* @__PURE__ */ createElement("span", { className: DebugFooterAction_module_default.entryLine }, view.label) : null);
7391
+ const row = /* @__PURE__ */ createElement("div", { className: cx(DebugFooterAction_module_default.action, wide === true ? void 0 : DebugFooterAction_module_default.actionRail, tone) }, /* @__PURE__ */ createElement("span", {
7134
7392
  className: DebugFooterAction_module_default.entry,
7135
7393
  role: "status",
7136
7394
  "aria-label": `${view.label},${view.note}`
7137
- }, wide === true ? /* @__PURE__ */ h(Tip, {
7395
+ }, wide === true ? /* @__PURE__ */ createElement(Tip, {
7138
7396
  label: view.note,
7139
7397
  side: "top"
7140
7398
  }, status) : status), wide === true ? acts : null);
7141
- if (wide === true) return /* @__PURE__ */ h("span", { className: DebugFooterAction_module_default.slot }, row);
7142
- return /* @__PURE__ */ h("span", { className: DebugFooterAction_module_default.slot }, /* @__PURE__ */ h(HoverCard, {
7399
+ if (wide === true) return /* @__PURE__ */ createElement("span", { className: DebugFooterAction_module_default.slot }, row);
7400
+ return /* @__PURE__ */ createElement("span", { className: DebugFooterAction_module_default.slot }, /* @__PURE__ */ createElement(HoverCard, {
7143
7401
  anchor: row,
7144
- content: /* @__PURE__ */ h("div", { className: DebugFooterAction_module_default.card }, /* @__PURE__ */ h("div", { className: DebugFooterAction_module_default.cardTitle }, view.title), /* @__PURE__ */ h("div", { className: DebugFooterAction_module_default.cardNote }, view.note), acts),
7402
+ content: /* @__PURE__ */ createElement("div", { className: DebugFooterAction_module_default.card }, /* @__PURE__ */ createElement("div", { className: DebugFooterAction_module_default.cardTitle }, view.title), /* @__PURE__ */ createElement("div", { className: DebugFooterAction_module_default.cardNote }, view.note), acts),
7145
7403
  openDelayMs: 200
7146
7404
  }));
7147
7405
  }
@@ -7238,12 +7496,12 @@ function RecordFooterAction({ wide, t }) {
7238
7496
  const act = useDiyRecordAct();
7239
7497
  if (state === null) return null;
7240
7498
  const view = recordFooterView(state, t);
7241
- const dot = /* @__PURE__ */ h(StateDot, {
7499
+ const dot = /* @__PURE__ */ createElement(StateDot, {
7242
7500
  state: state.phase === "finished" ? "done" : "warning",
7243
7501
  className: state.phase === "armed" ? RecordFooterAction_module_default.pulse : void 0
7244
7502
  });
7245
7503
  const tone = state.phase === "finished" ? RecordFooterAction_module_default.done : RecordFooterAction_module_default.live;
7246
- const acts = /* @__PURE__ */ h("span", { className: RecordFooterAction_module_default.acts }, view.acts.map((one) => /* @__PURE__ */ h("button", {
7504
+ const acts = /* @__PURE__ */ createElement("span", { className: RecordFooterAction_module_default.acts }, view.acts.map((one) => /* @__PURE__ */ createElement("button", {
7247
7505
  key: one.intent,
7248
7506
  type: "button",
7249
7507
  className: RecordFooterAction_module_default.act,
@@ -7253,19 +7511,19 @@ function RecordFooterAction({ wide, t }) {
7253
7511
  act.send({ intent: one.intent });
7254
7512
  }
7255
7513
  }, one.label)));
7256
- const status = /* @__PURE__ */ h("span", { className: RecordFooterAction_module_default.entryInner }, dot, wide === true ? /* @__PURE__ */ h("span", { className: RecordFooterAction_module_default.entryLine }, view.label) : null);
7257
- const row = /* @__PURE__ */ h("div", { className: cx(RecordFooterAction_module_default.action, wide === true ? void 0 : RecordFooterAction_module_default.actionRail, tone) }, /* @__PURE__ */ h("span", {
7514
+ const status = /* @__PURE__ */ createElement("span", { className: RecordFooterAction_module_default.entryInner }, dot, wide === true ? /* @__PURE__ */ createElement("span", { className: RecordFooterAction_module_default.entryLine }, view.label) : null);
7515
+ const row = /* @__PURE__ */ createElement("div", { className: cx(RecordFooterAction_module_default.action, wide === true ? void 0 : RecordFooterAction_module_default.actionRail, tone) }, /* @__PURE__ */ createElement("span", {
7258
7516
  className: RecordFooterAction_module_default.entry,
7259
7517
  role: "status",
7260
7518
  "aria-label": `${view.label},${view.note}`
7261
- }, wide === true ? /* @__PURE__ */ h(Tip, {
7519
+ }, wide === true ? /* @__PURE__ */ createElement(Tip, {
7262
7520
  label: view.note,
7263
7521
  side: "top"
7264
7522
  }, status) : status), wide === true ? acts : null);
7265
- if (wide === true) return /* @__PURE__ */ h("span", { className: RecordFooterAction_module_default.slot }, row);
7266
- return /* @__PURE__ */ h("span", { className: RecordFooterAction_module_default.slot }, /* @__PURE__ */ h(HoverCard, {
7523
+ if (wide === true) return /* @__PURE__ */ createElement("span", { className: RecordFooterAction_module_default.slot }, row);
7524
+ return /* @__PURE__ */ createElement("span", { className: RecordFooterAction_module_default.slot }, /* @__PURE__ */ createElement(HoverCard, {
7267
7525
  anchor: row,
7268
- content: /* @__PURE__ */ h("div", { className: RecordFooterAction_module_default.card }, /* @__PURE__ */ h("div", { className: RecordFooterAction_module_default.cardTitle }, view.label), /* @__PURE__ */ h("div", { className: RecordFooterAction_module_default.cardNote }, view.note), acts),
7526
+ content: /* @__PURE__ */ createElement("div", { className: RecordFooterAction_module_default.card }, /* @__PURE__ */ createElement("div", { className: RecordFooterAction_module_default.cardTitle }, view.label), /* @__PURE__ */ createElement("div", { className: RecordFooterAction_module_default.cardNote }, view.note), acts),
7269
7527
  openDelayMs: 200
7270
7528
  }));
7271
7529
  }
@@ -7284,30 +7542,52 @@ function registerRecordFooter(ctx) {
7284
7542
  //#region src/shared/api/config-sync.ts
7285
7543
  var CONFIG_SYNC_ROUTE = "config-sync";
7286
7544
  var CONFIG_SYNC_RESOURCE = "configSync";
7287
- var ConfigSyncSection_module_default = {
7288
- body: "_body_lw2ph_1",
7289
- lead: "_lead_lw2ph_7",
7290
- sources: "_sources_lw2ph_14",
7291
- sourcesLabel: "_sourcesLabel_lw2ph_21",
7292
- sourceOn: "_sourceOn_lw2ph_26",
7293
- sourceCount: "_sourceCount_lw2ph_29",
7294
- reading: "_reading_lw2ph_36",
7295
- status: "_status_lw2ph_42",
7296
- failure: "_failure_lw2ph_52",
7297
- failureTitle: "_failureTitle_lw2ph_62",
7298
- failureHint: "_failureHint_lw2ph_69",
7299
- failureAction: "_failureAction_lw2ph_74",
7300
- rows: "_rows_lw2ph_80",
7301
- row: "_row_lw2ph_80",
7302
- head: "_head_lw2ph_99",
7303
- pick: "_pick_lw2ph_106",
7304
- code: "_code_lw2ph_118",
7305
- missing: "_missing_lw2ph_123",
7306
- conflict: "_conflict_lw2ph_124",
7307
- foot: "_foot_lw2ph_130"
7545
+ var SettingsItem_module_default = {
7546
+ item: "_item_lyox9_1",
7547
+ head: "_head_lyox9_12",
7548
+ title: "_title_lyox9_19",
7549
+ description: "_description_lyox9_31"
7550
+ };
7551
+ //#endregion
7552
+ //#region src/app/layouts/workbench-settings/SettingsItem.tsx
7553
+ /**
7554
+ * 设置一节里的一个配置项:自己的标题、一句说明、右上动作与内容。
7555
+ * 多个配置项叠在同一节里,项与项之间由样式画分隔线。
7556
+ * @param props.title - 这一项的名字(同时给读屏,`aria-label`)。
7557
+ * @param props.description - 项下面那句说明;不给不占位。
7558
+ * @param props.action - 标题右侧的动作(如"重新读一遍");不给不占位。
7559
+ * @param props.children - 这一项的内容。
7560
+ * @returns 一个 `aria-label` 为标题的 `section`。
7561
+ */
7562
+ function SettingsItem({ title, description, action, children }) {
7563
+ return /* @__PURE__ */ createElement("section", {
7564
+ className: SettingsItem_module_default.item,
7565
+ "aria-label": title
7566
+ }, /* @__PURE__ */ createElement("header", { className: SettingsItem_module_default.head }, /* @__PURE__ */ createElement("span", { className: SettingsItem_module_default.title }, title), action), description === void 0 ? null : /* @__PURE__ */ createElement("p", { className: SettingsItem_module_default.description }, description), children);
7567
+ }
7568
+ var ConfigSyncItem_module_default = {
7569
+ body: "_body_1rhdh_1",
7570
+ sources: "_sources_1rhdh_7",
7571
+ sourcesLabel: "_sourcesLabel_1rhdh_14",
7572
+ sourceOn: "_sourceOn_1rhdh_19",
7573
+ sourceCount: "_sourceCount_1rhdh_22",
7574
+ reading: "_reading_1rhdh_29",
7575
+ status: "_status_1rhdh_35",
7576
+ failure: "_failure_1rhdh_45",
7577
+ failureTitle: "_failureTitle_1rhdh_55",
7578
+ failureHint: "_failureHint_1rhdh_62",
7579
+ failureAction: "_failureAction_1rhdh_67",
7580
+ rows: "_rows_1rhdh_73",
7581
+ row: "_row_1rhdh_73",
7582
+ head: "_head_1rhdh_92",
7583
+ pick: "_pick_1rhdh_99",
7584
+ code: "_code_1rhdh_111",
7585
+ missing: "_missing_1rhdh_116",
7586
+ conflict: "_conflict_1rhdh_117",
7587
+ foot: "_foot_1rhdh_123"
7308
7588
  };
7309
7589
  //#endregion
7310
- //#region src/app/layouts/config-sync/ConfigSyncSection.tsx
7590
+ //#region src/app/layouts/workbench-settings/ConfigSyncItem.tsx
7311
7591
  var AUTO_RETRY_MS = 1200;
7312
7592
  var DIFF_MAX_LINES = 9;
7313
7593
  var TAG_KEYS = {
@@ -7334,41 +7614,41 @@ function diffLabels(t) {
7334
7614
  }
7335
7615
  function SourcePicker({ t, profiles, source, onPick }) {
7336
7616
  if (profiles.length === 0) return null;
7337
- return /* @__PURE__ */ h("div", {
7338
- className: ConfigSyncSection_module_default.sources,
7617
+ return /* @__PURE__ */ createElement("div", {
7618
+ className: ConfigSyncItem_module_default.sources,
7339
7619
  role: "group",
7340
7620
  "aria-label": t("configSync.source")
7341
- }, /* @__PURE__ */ h("span", { className: ConfigSyncSection_module_default.sourcesLabel }, t("configSync.source")), profiles.map((profile) => /* @__PURE__ */ h(Button, {
7621
+ }, /* @__PURE__ */ createElement("span", { className: ConfigSyncItem_module_default.sourcesLabel }, t("configSync.source")), profiles.map((profile) => /* @__PURE__ */ createElement(Button, {
7342
7622
  key: profile.name,
7343
7623
  variant: profile.name === source ? "outline" : "ghost",
7344
7624
  size: "sm",
7345
- className: profile.name === source ? ConfigSyncSection_module_default.sourceOn : void 0,
7625
+ className: profile.name === source ? ConfigSyncItem_module_default.sourceOn : void 0,
7346
7626
  "aria-pressed": profile.name === source,
7347
7627
  title: profile.readable ? t("configSync.sourceRows", {
7348
7628
  name: profile.name,
7349
7629
  count: profile.candidates
7350
7630
  }) : t("configSync.sourceBroken"),
7351
7631
  onClick: () => onPick(profile.name)
7352
- }, profile.name, /* @__PURE__ */ h("span", { className: ConfigSyncSection_module_default.sourceCount }, profile.readable ? profile.candidates : t("configSync.sourceDead")))));
7632
+ }, profile.name, /* @__PURE__ */ createElement("span", { className: ConfigSyncItem_module_default.sourceCount }, profile.readable ? profile.candidates : t("configSync.sourceDead")))));
7353
7633
  }
7354
7634
  function SourceRows({ t, rows, picked, profile, onToggle }) {
7355
- return /* @__PURE__ */ h("ul", { className: ConfigSyncSection_module_default.rows }, rows.map((row) => /* @__PURE__ */ h("li", {
7635
+ return /* @__PURE__ */ createElement("ul", { className: ConfigSyncItem_module_default.rows }, rows.map((row) => /* @__PURE__ */ createElement("li", {
7356
7636
  key: row.key,
7357
- className: ConfigSyncSection_module_default.row
7358
- }, /* @__PURE__ */ h("div", { className: ConfigSyncSection_module_default.head }, /* @__PURE__ */ h(Checkbox, {
7637
+ className: ConfigSyncItem_module_default.row
7638
+ }, /* @__PURE__ */ createElement("div", { className: ConfigSyncItem_module_default.head }, /* @__PURE__ */ createElement(Checkbox, {
7359
7639
  checked: picked.includes(row.key),
7360
7640
  label: row.id,
7361
7641
  title: row.state === "differs" ? t("configSync.conflictNote") : void 0,
7362
- className: ConfigSyncSection_module_default.pick,
7642
+ className: ConfigSyncItem_module_default.pick,
7363
7643
  onChange: (next) => onToggle(row.key, next)
7364
- }), /* @__PURE__ */ h(Tag, { tone: row.state === "differs" ? "warning" : "success" }, t(TAG_KEYS[row.state] ?? "configSync.tag.new"))), row.ownBody === null ? /* @__PURE__ */ h(CodeBlock, {
7644
+ }), /* @__PURE__ */ createElement(Tag, { tone: row.state === "differs" ? "warning" : "success" }, t(TAG_KEYS[row.state] ?? "configSync.tag.new"))), row.ownBody === null ? /* @__PURE__ */ createElement(CodeBlock, {
7365
7645
  code: row.body,
7366
7646
  lang: "yaml",
7367
- className: ConfigSyncSection_module_default.code,
7647
+ className: ConfigSyncItem_module_default.code,
7368
7648
  copyLabel: t("configSync.code.copy"),
7369
7649
  copiedLabel: t("configSync.code.copied"),
7370
7650
  toolbarLabels: codeToolbarLabels(t)
7371
- }) : /* @__PURE__ */ h(DiffBlock, {
7651
+ }) : /* @__PURE__ */ createElement(DiffBlock, {
7372
7652
  diffs: [{
7373
7653
  path: row.id,
7374
7654
  oldText: row.ownBody,
@@ -7376,37 +7656,37 @@ function SourceRows({ t, rows, picked, profile, onToggle }) {
7376
7656
  }],
7377
7657
  labels: diffLabels(t),
7378
7658
  maxLines: DIFF_MAX_LINES,
7379
- className: ConfigSyncSection_module_default.code
7380
- }), row.missing.map((pkg) => /* @__PURE__ */ h("span", {
7659
+ className: ConfigSyncItem_module_default.code
7660
+ }), row.missing.map((pkg) => /* @__PURE__ */ createElement("span", {
7381
7661
  key: pkg,
7382
- className: ConfigSyncSection_module_default.missing
7662
+ className: ConfigSyncItem_module_default.missing
7383
7663
  }, t("configSync.missing", {
7384
7664
  pkg,
7385
7665
  profile
7386
- }))), row.state === "differs" && picked.includes(row.key) ? /* @__PURE__ */ h("span", { className: ConfigSyncSection_module_default.conflict }, t("configSync.conflictNote")) : null)));
7666
+ }))), row.state === "differs" && picked.includes(row.key) ? /* @__PURE__ */ createElement("span", { className: ConfigSyncItem_module_default.conflict }, t("configSync.conflictNote")) : null)));
7387
7667
  }
7388
7668
  function AppliedRows({ t, applied }) {
7389
- return /* @__PURE__ */ h(Note, null, t("configSync.applied"), applied.written.length === 0 ? "" : ` · ${t("configSync.appliedIds", { ids: applied.written.join("、") })}`, applied.skipped.length === 0 ? "" : ` · ${t("configSync.skippedIds", { ids: applied.skipped.join("、") })}`);
7669
+ return /* @__PURE__ */ createElement(Note, null, t("configSync.applied"), applied.written.length === 0 ? "" : ` · ${t("configSync.appliedIds", { ids: applied.written.join("、") })}`, applied.skipped.length === 0 ? "" : ` · ${t("configSync.skippedIds", { ids: applied.skipped.join("、") })}`);
7390
7670
  }
7391
7671
  function ReadingRow({ t }) {
7392
- return /* @__PURE__ */ h("div", { className: ConfigSyncSection_module_default.reading }, /* @__PURE__ */ h("p", {
7393
- className: ConfigSyncSection_module_default.status,
7672
+ return /* @__PURE__ */ createElement("div", { className: ConfigSyncItem_module_default.reading }, /* @__PURE__ */ createElement("p", {
7673
+ className: ConfigSyncItem_module_default.status,
7394
7674
  role: "status"
7395
- }, /* @__PURE__ */ h(Spinner, null), t("configSync.loading")), /* @__PURE__ */ h(SkeletonRows, { rows: 3 }));
7675
+ }, /* @__PURE__ */ createElement(Spinner, null), t("configSync.loading")), /* @__PURE__ */ createElement(SkeletonRows, { rows: 3 }));
7396
7676
  }
7397
7677
  function FailureRow({ t, blocker, onRetry }) {
7398
- return /* @__PURE__ */ h("div", {
7399
- className: ConfigSyncSection_module_default.failure,
7678
+ return /* @__PURE__ */ createElement("div", {
7679
+ className: ConfigSyncItem_module_default.failure,
7400
7680
  role: "alert",
7401
7681
  "data-config-sync-failure": ""
7402
- }, /* @__PURE__ */ h("span", { className: ConfigSyncSection_module_default.failureTitle }, /* @__PURE__ */ h(StateDot, { state: "error" }), blocker.title), blocker.hint === void 0 ? null : /* @__PURE__ */ h("span", { className: ConfigSyncSection_module_default.failureHint }, blocker.hint), /* @__PURE__ */ h(Button, {
7682
+ }, /* @__PURE__ */ createElement("span", { className: ConfigSyncItem_module_default.failureTitle }, /* @__PURE__ */ createElement(StateDot, { state: "error" }), blocker.title), blocker.hint === void 0 ? null : /* @__PURE__ */ createElement("span", { className: ConfigSyncItem_module_default.failureHint }, blocker.hint), /* @__PURE__ */ createElement(Button, {
7403
7683
  size: "sm",
7404
7684
  variant: "ghost",
7405
- className: ConfigSyncSection_module_default.failureAction,
7685
+ className: ConfigSyncItem_module_default.failureAction,
7406
7686
  onClick: onRetry
7407
7687
  }, t("blocker.retry")));
7408
7688
  }
7409
- function ConfigSyncSection({ t }) {
7689
+ function ConfigSyncItem({ t }) {
7410
7690
  const [source, setSource] = useState("");
7411
7691
  const [revision, setRevision] = useState(0);
7412
7692
  const [guard, setGuard] = useState(0);
@@ -7482,13 +7762,13 @@ function ConfigSyncSection({ t }) {
7482
7762
  setRevision((current) => current + 1);
7483
7763
  });
7484
7764
  };
7485
- return /* @__PURE__ */ h(SettingsSection, {
7486
- label: t("configSync.nav"),
7765
+ return /* @__PURE__ */ createElement(SettingsItem, {
7487
7766
  title: t("configSync.nav"),
7488
- action: failure === null ? /* @__PURE__ */ h(Button, {
7767
+ description: t("configSync.lead"),
7768
+ action: failure === null ? /* @__PURE__ */ createElement(Button, {
7489
7769
  variant: "ghost",
7490
7770
  size: "sm",
7491
- icon: /* @__PURE__ */ h(IconRefreshOutlineRegular, {
7771
+ icon: /* @__PURE__ */ createElement(IconRefreshOutlineRegular, {
7492
7772
  size: 16,
7493
7773
  "aria-hidden": "true"
7494
7774
  }),
@@ -7496,42 +7776,319 @@ function ConfigSyncSection({ t }) {
7496
7776
  disabled: reading.busy,
7497
7777
  title: t("configSync.refresh")
7498
7778
  }, t("configSync.refresh")) : void 0
7499
- }, /* @__PURE__ */ h("div", { className: ConfigSyncSection_module_default.body }, /* @__PURE__ */ h("p", { className: ConfigSyncSection_module_default.lead }, t("configSync.lead")), value === void 0 ? null : /* @__PURE__ */ h(SourcePicker, {
7779
+ }, /* @__PURE__ */ createElement("div", { className: ConfigSyncItem_module_default.body }, value === void 0 ? null : /* @__PURE__ */ createElement(SourcePicker, {
7500
7780
  t,
7501
7781
  profiles: value.profiles,
7502
7782
  source: value.source,
7503
7783
  onPick: pickSource
7504
- }), reading.busy ? /* @__PURE__ */ h(ReadingRow, { t }) : null, failure !== null && !reading.busy ? /* @__PURE__ */ h(FailureRow, {
7784
+ }), reading.busy ? /* @__PURE__ */ createElement(ReadingRow, { t }) : null, failure !== null && !reading.busy ? /* @__PURE__ */ createElement(FailureRow, {
7505
7785
  t,
7506
7786
  blocker: failure,
7507
7787
  onRetry: reread
7508
- }) : null, write.failed !== null ? /* @__PURE__ */ h(Note, {
7788
+ }) : null, write.failed !== null ? /* @__PURE__ */ createElement(Note, {
7509
7789
  tone: "problem",
7510
7790
  role: "alert"
7511
- }, write.failed) : null, applied !== null ? /* @__PURE__ */ h(AppliedRows, {
7791
+ }, write.failed) : null, applied !== null ? /* @__PURE__ */ createElement(AppliedRows, {
7512
7792
  t,
7513
7793
  applied
7514
- }) : null, value !== void 0 && !reading.busy ? /* @__PURE__ */ h(Fragment, null, value.profiles.length === 0 ? /* @__PURE__ */ h(Note, { tone: "problem" }, t("configSync.noSource")) : null, broken !== null ? /* @__PURE__ */ h(Note, { tone: "problem" }, t("configSync.unreadable", {
7794
+ }) : null, value !== void 0 && !reading.busy ? /* @__PURE__ */ createElement(Fragment, null, value.profiles.length === 0 ? /* @__PURE__ */ createElement(Note, { tone: "problem" }, t("configSync.noSource")) : null, broken !== null ? /* @__PURE__ */ createElement(Note, { tone: "problem" }, t("configSync.unreadable", {
7515
7795
  path: broken.path,
7516
7796
  reason: broken.reason
7517
- })) : null, value.emptyProviders ? /* @__PURE__ */ h(Note, { tone: "problem" }, t("configSync.emptyProviders")) : null, rows.length === 0 ? /* @__PURE__ */ h(Note, null, t("configSync.nothing")) : null, rows.length > 0 ? /* @__PURE__ */ h(SourceRows, {
7797
+ })) : null, value.emptyProviders ? /* @__PURE__ */ createElement(Note, { tone: "problem" }, t("configSync.emptyProviders")) : null, rows.length === 0 ? /* @__PURE__ */ createElement(Note, null, t("configSync.nothing")) : null, rows.length > 0 ? /* @__PURE__ */ createElement(SourceRows, {
7518
7798
  t,
7519
7799
  rows,
7520
7800
  picked,
7521
7801
  profile: value.self,
7522
7802
  onToggle: toggle
7523
- }) : null, rows.length > 0 ? /* @__PURE__ */ h("div", { className: ConfigSyncSection_module_default.foot }, /* @__PURE__ */ h(Button, {
7803
+ }) : null, rows.length > 0 ? /* @__PURE__ */ createElement("div", { className: ConfigSyncItem_module_default.foot }, /* @__PURE__ */ createElement(Button, {
7524
7804
  variant: "primary",
7525
7805
  size: "md",
7526
- icon: /* @__PURE__ */ h(IconRefreshOutlineRegular, {
7527
- size: 16,
7528
- "aria-hidden": "true"
7529
- }),
7530
7806
  disabled: chosen.length === 0 || busy.busy,
7531
7807
  onClick: apply
7532
7808
  }, chosen.length === 0 ? t("configSync.applyNone") : busy.busy ? t("configSync.applying") : t("configSync.apply", { count: chosen.length }))) : null) : null));
7533
7809
  }
7534
7810
  //#endregion
7811
+ //#region src/shared/api/sidebar-edition.ts
7812
+ var SIDEBAR_EDITION_ROUTE = "sidebar-edition";
7813
+ var SIDEBAR_EDITION_RESOURCE = "sidebarEdition";
7814
+ //#endregion
7815
+ //#region src/shared/hooks/sidebar-edition.ts
7816
+ /**
7817
+ * 启动时读一次「左栏用哪一档」:这是静态组合决定的值(改了要刷新页面),不是事实流,
7818
+ * 所以不走 `useApiResource` 的订阅那一路;调用点只在客户端 apply 里一次。
7819
+ * @returns 宿主写的档位;读不到时 `undefined`(按官方 + 官方没落地再兜底)。
7820
+ */
7821
+ async function readSidebarEdition() {
7822
+ try {
7823
+ const answer = await apiGet(SIDEBAR_EDITION_ROUTE);
7824
+ return answer.ok ? answer : void 0;
7825
+ } catch {
7826
+ return;
7827
+ }
7828
+ }
7829
+ //#endregion
7830
+ //#region src/app/layouts/sidebar/edition-boot.ts
7831
+ var RETRY_KEY = "dsh-workbench.sidebar-edition-retry";
7832
+ var PENDING_KEY = "dsh-workbench.sidebar-edition-pending";
7833
+ function retryCount() {
7834
+ try {
7835
+ return Number(globalThis.sessionStorage?.getItem(RETRY_KEY) ?? "0") || 0;
7836
+ } catch {
7837
+ return 0;
7838
+ }
7839
+ }
7840
+ function setRetryCount(value) {
7841
+ try {
7842
+ globalThis.sessionStorage?.setItem(RETRY_KEY, String(value));
7843
+ } catch {
7844
+ return;
7845
+ }
7846
+ }
7847
+ function pendingEdition() {
7848
+ try {
7849
+ const value = globalThis.sessionStorage?.getItem(PENDING_KEY);
7850
+ return value === "official" || value === "custom" ? value : null;
7851
+ } catch {
7852
+ return null;
7853
+ }
7854
+ }
7855
+ function clearPending() {
7856
+ try {
7857
+ globalThis.sessionStorage?.removeItem(PENDING_KEY);
7858
+ } catch {
7859
+ return;
7860
+ }
7861
+ }
7862
+ /**
7863
+ * 设置项点下去之后记一笔“想切到哪一档”,刷新后据此等组合跟上;
7864
+ * 不用它区分“刚切换”和“旧组合兜底”,否则官方档会被当成切坏了。
7865
+ * @param edition 用户选的目标档位。
7866
+ */
7867
+ function markSidebarEditionPending(edition) {
7868
+ try {
7869
+ globalThis.sessionStorage?.setItem(PENDING_KEY, edition);
7870
+ } catch {
7871
+ return;
7872
+ }
7873
+ }
7874
+ var sideOwner = null;
7875
+ var takeoverArmed = false;
7876
+ var takeoverStop = null;
7877
+ var takeoverPoll = null;
7878
+ function settleCustomTakeover() {
7879
+ if (sideOwner === null) return false;
7880
+ if ((sideOwner.ctx.slots.entriesOfSlot?.("sidebar") ?? []).length > 0) return false;
7881
+ const owner = sideOwner;
7882
+ takeoverArmed = false;
7883
+ takeoverStop?.();
7884
+ takeoverStop = null;
7885
+ if (takeoverPoll !== null) {
7886
+ clearInterval(takeoverPoll);
7887
+ takeoverPoll = null;
7888
+ }
7889
+ clearPending();
7890
+ setRetryCount(0);
7891
+ setRuntimeSidebarEdition("custom");
7892
+ owner.register();
7893
+ return true;
7894
+ }
7895
+ /**
7896
+ * 切自定义时先把“官方被摘掉就接管”挂上,再发写口——这样组合一生效就原地换成
7897
+ * 我们的左栏,不必刷新,也不会出现左栏空一拍。
7898
+ */
7899
+ function armCustomSidebarTakeover() {
7900
+ if (sideOwner === null || takeoverArmed) return;
7901
+ takeoverArmed = true;
7902
+ if (settleCustomTakeover()) return;
7903
+ takeoverStop = sideOwner.ctx.slots.subscribe("sidebar", () => {
7904
+ if (takeoverArmed) settleCustomTakeover();
7905
+ });
7906
+ takeoverPoll = setInterval(() => {
7907
+ if (takeoverArmed) settleCustomTakeover();
7908
+ }, 100);
7909
+ setTimeout(() => {
7910
+ if (!takeoverArmed) return;
7911
+ takeoverArmed = false;
7912
+ takeoverStop?.();
7913
+ takeoverStop = null;
7914
+ if (takeoverPoll !== null) {
7915
+ clearInterval(takeoverPoll);
7916
+ takeoverPoll = null;
7917
+ }
7918
+ if (!settleCustomTakeover() && (sideOwner?.ctx.slots.entriesOfSlot?.("sidebar") ?? []).length > 0) globalThis.location?.reload();
7919
+ }, 3e3);
7920
+ }
7921
+ /**
7922
+ * 写口没成时把待接管撤掉,别在 3 秒后误刷新。
7923
+ */
7924
+ function disarmCustomSidebarTakeover() {
7925
+ takeoverArmed = false;
7926
+ takeoverStop?.();
7927
+ takeoverStop = null;
7928
+ if (takeoverPoll !== null) {
7929
+ clearInterval(takeoverPoll);
7930
+ takeoverPoll = null;
7931
+ }
7932
+ }
7933
+ /**
7934
+ * 启动时按组合决定左栏:先把官方座位让出来;官方没落地才注册我们自己的。
7935
+ * 官方 → 自定义刚写完时组合可能还没跟上,官方座位还在;这时最多自刷 2 次等它。
7936
+ * @param ctx 客户端上下文(只读 slots)。
7937
+ * @param registerOwn 注册工作台自己那套左栏(调用方保证幂等)。
7938
+ */
7939
+ function bootSidebarEdition(ctx, registerOwn) {
7940
+ sideOwner = {
7941
+ ctx,
7942
+ register: registerOwn
7943
+ };
7944
+ const settle = () => {
7945
+ const official = (ctx.slots.entriesOfSlot?.("sidebar") ?? []).length > 0;
7946
+ const edition = runtimeSidebarEdition();
7947
+ const pending = pendingEdition();
7948
+ if (pending !== null && pending !== edition) clearPending();
7949
+ const wanted = pending === edition ? pending : null;
7950
+ if (wanted !== null) {
7951
+ if (wanted === "official" ? official : !official) {
7952
+ clearPending();
7953
+ setRetryCount(0);
7954
+ if (!official) registerOwn();
7955
+ return;
7956
+ }
7957
+ if (wanted === "custom") {
7958
+ let done = false;
7959
+ const takeOver = () => {
7960
+ if (done) return;
7961
+ done = true;
7962
+ clearPending();
7963
+ setRetryCount(0);
7964
+ registerOwn();
7965
+ };
7966
+ ctx.slots.subscribe("sidebar", () => {
7967
+ if (done) return;
7968
+ if ((ctx.slots.entriesOfSlot?.("sidebar") ?? []).length === 0) takeOver();
7969
+ });
7970
+ setTimeout(() => {
7971
+ if (done) return;
7972
+ if ((ctx.slots.entriesOfSlot?.("sidebar") ?? []).length === 0) {
7973
+ takeOver();
7974
+ return;
7975
+ }
7976
+ if (retryCount() < 2) {
7977
+ setRetryCount(retryCount() + 1);
7978
+ globalThis.location?.reload();
7979
+ }
7980
+ }, 2500);
7981
+ return;
7982
+ }
7983
+ if (retryCount() < 3) {
7984
+ setRetryCount(retryCount() + 1);
7985
+ setTimeout(() => globalThis.location?.reload(), 300);
7986
+ return;
7987
+ }
7988
+ clearPending();
7989
+ }
7990
+ if (edition === "custom" && official) {
7991
+ if (retryCount() >= 2) return;
7992
+ setRetryCount(retryCount() + 1);
7993
+ setTimeout(() => globalThis.location?.reload(), 200);
7994
+ return;
7995
+ }
7996
+ setRetryCount(0);
7997
+ if (official) return;
7998
+ registerOwn();
7999
+ };
8000
+ setTimeout(settle, 1200);
8001
+ readSidebarEdition().then((snapshot) => {
8002
+ if (snapshot !== void 0) setRuntimeSidebarEdition(snapshot.edition);
8003
+ });
8004
+ }
8005
+ //#endregion
8006
+ //#region src/app/layouts/workbench-settings/SidebarEditionItem.tsx
8007
+ /**
8008
+ * 「工作台设置」里的「会话列表」项:选官方还是自定义左栏。
8009
+ * 写入的是 profile patch 那一行;与当前这一屏的档位不同就提示刷新页面。
8010
+ * @param props.t - 这一项的词表。
8011
+ * @returns 一个配置项。
8012
+ */
8013
+ function SidebarEditionItem({ t }) {
8014
+ const [runtime, setRuntime] = useState(runtimeSidebarEdition);
8015
+ const [switching, setSwitching] = useState(false);
8016
+ const snapshot = useApiResource(SIDEBAR_EDITION_ROUTE, {}, 0);
8017
+ const write = useHostWrite({
8018
+ channel: "actions",
8019
+ resource: SIDEBAR_EDITION_RESOURCE,
8020
+ networkText: t("sidebarEdition.failed")
8021
+ });
8022
+ const busy = useVisibleBusy(write.busy, 500);
8023
+ const stored = snapshot.phase === "ready" && snapshot.value !== void 0 ? snapshot.value.edition : void 0;
8024
+ useEffect(() => subscribeSidebarEdition(() => setRuntime(runtimeSidebarEdition())), []);
8025
+ const choose = (next) => {
8026
+ if (next !== "official" && next !== "custom") return;
8027
+ if (next === "custom") armCustomSidebarTakeover();
8028
+ write.send({ edition: next }).then((outcome) => {
8029
+ if (!outcome.ok) {
8030
+ if (next === "custom") disarmCustomSidebarTakeover();
8031
+ return;
8032
+ }
8033
+ setSwitching(true);
8034
+ if (next === "official") {
8035
+ markSidebarEditionPending("official");
8036
+ setTimeout(() => globalThis.location?.reload(), 50);
8037
+ return;
8038
+ }
8039
+ setTimeout(() => setSwitching(false), 4e3);
8040
+ });
8041
+ };
8042
+ return /* @__PURE__ */ createElement(SettingsItem, {
8043
+ title: t("sidebarEdition.nav"),
8044
+ description: t("sidebarEdition.lead")
8045
+ }, /* @__PURE__ */ createElement(ChoiceGroup, {
8046
+ label: t("sidebarEdition.nav"),
8047
+ name: "sidebar-edition",
8048
+ value: stored ?? runtime,
8049
+ variant: "boxed",
8050
+ disabled: stored === void 0 || switching,
8051
+ loading: busy.busy || switching,
8052
+ loadingText: t("sidebarEdition.saving"),
8053
+ options: [{
8054
+ value: "official",
8055
+ label: t("sidebarEdition.official"),
8056
+ description: t("sidebarEdition.officialHint")
8057
+ }, {
8058
+ value: "custom",
8059
+ label: t("sidebarEdition.custom"),
8060
+ description: t("sidebarEdition.customHint")
8061
+ }],
8062
+ onChange: choose
8063
+ }), write.failed === null ? null : /* @__PURE__ */ createElement(Note, {
8064
+ tone: "problem",
8065
+ role: "alert"
8066
+ }, write.failed), stored === void 0 || stored === runtime ? null : /* @__PURE__ */ createElement(Note, null, t("sidebarEdition.reloadRequired"), " ", /* @__PURE__ */ createElement(Button, {
8067
+ variant: "ghost",
8068
+ size: "sm",
8069
+ onClick: () => globalThis.location?.reload()
8070
+ }, t("sidebarEdition.reload"))));
8071
+ }
8072
+ var WorkbenchSettingsSection_module_default = {
8073
+ body: "_body_zi2j5_1",
8074
+ lead: "_lead_zi2j5_7",
8075
+ title: "_title_zi2j5_14"
8076
+ };
8077
+ //#endregion
8078
+ //#region src/app/layouts/workbench-settings/WorkbenchSettingsSection.tsx
8079
+ /**
8080
+ * 设置页里「工作台设置」这一节:工作台自己这一侧的配置都收在这里,一项一张。
8081
+ * 现在是「会话列表」与「配置同步」两项;再加配置项时按 `SettingsItem` 的形状往下排。
8082
+ * @param props.t - 这一节的词表。
8083
+ * @returns 设置页的一节。
8084
+ */
8085
+ function WorkbenchSettingsSection({ t }) {
8086
+ return /* @__PURE__ */ createElement(SettingsSection, {
8087
+ label: t("workbenchSettings.nav"),
8088
+ title: /* @__PURE__ */ createElement("span", { className: WorkbenchSettingsSection_module_default.title }, t("workbenchSettings.nav"))
8089
+ }, /* @__PURE__ */ createElement("div", { className: WorkbenchSettingsSection_module_default.body }, /* @__PURE__ */ createElement("p", { className: WorkbenchSettingsSection_module_default.lead }, t("workbenchSettings.lead")), /* @__PURE__ */ createElement(SidebarEditionItem, { t }), /* @__PURE__ */ createElement(ConfigSyncItem, { t })));
8090
+ }
8091
+ //#endregion
7535
8092
  //#region src/shared/api/diy.ts
7536
8093
  var DIY_PRESET_ID = "workbench-diy";
7537
8094
  var WORKSHOP_RELATIVE = "workbench/diy";
@@ -7938,7 +8495,7 @@ function createForcePlan() {
7938
8495
  * 拿到这一拍之后门该怎么办:`close` 撤掉放行、`hold` 停在原地等用户动手、`wait` 接着轮询。
7939
8496
  * 桥接坏了(`bridgeIssues` 非空)与 DIY 模式挂不起来(`diyGap` 非空)都是**不拦路**的,
7940
8497
  * 但那块「怎么解决」得先真的画出来 —— 停在原地 + 一颗「先进入工作台」才叫不拦路,
7941
- * 就绪即撤等于把那块提示连同修法一起丢掉,用户进去只会发现「工作台 DIY」整个不在。
8498
+ * 就绪即撤等于把那块提示连同修法一起丢掉,用户进去只会发现「工作台 DIY 模式」整个不在。
7942
8499
  */
7943
8500
  function gateActionOf(snapshot) {
7944
8501
  if (snapshot.phase === "failed") return "hold";
@@ -8239,7 +8796,6 @@ var MODULES_UPDATE_DEPENDENCY_TOOL = "workbench_modules_update_dependency";
8239
8796
  var MODULES_UPDATE_PLUGIN_TOOL = "workbench_modules_update_plugin";
8240
8797
  var MODULES_UNINSTALL_PLUGIN_TOOL = "workbench_modules_uninstall_plugin";
8241
8798
  var MODULES_UPDATE_WORKBENCH_TOOL = "workbench_modules_update_workbench";
8242
- var DIY_LIST_TOOL = "workbench_diy_list";
8243
8799
  var DIY_STATUS_TOOL = "workbench_diy_status";
8244
8800
  var DIY_PANEL_TOOL = "workbench_diy_panel";
8245
8801
  var DIY_COMPONENTS_TOOL = "workbench_diy_components";
@@ -8290,7 +8846,6 @@ var ALL_TOOLS = [
8290
8846
  MODULES_UPDATE_PLUGIN_TOOL,
8291
8847
  MODULES_UNINSTALL_PLUGIN_TOOL,
8292
8848
  MODULES_UPDATE_WORKBENCH_TOOL,
8293
- DIY_LIST_TOOL,
8294
8849
  DIY_STATUS_TOOL,
8295
8850
  DIY_PANEL_TOOL,
8296
8851
  DIY_COMPONENTS_TOOL,
@@ -8329,7 +8884,6 @@ var ALL_TOOLS = [
8329
8884
  var READ_TOOLS = [
8330
8885
  PANELS_LIST_TOOL,
8331
8886
  MODULES_LIST_TOOL,
8332
- DIY_LIST_TOOL,
8333
8887
  DIY_STATUS_TOOL,
8334
8888
  DIY_PANEL_TOOL,
8335
8889
  DIY_COMPONENTS_TOOL,
@@ -8437,14 +8991,34 @@ function shellApprovalPlan(input, t) {
8437
8991
  function shellApprovalDetail(input, t) {
8438
8992
  const plan = shellApprovalPlan(input, t);
8439
8993
  if (plan === void 0) return void 0;
8440
- if (plan.rows.length === 0) return h(Fragment, null);
8441
- return /* @__PURE__ */ h(ApprovalPlan, {
8994
+ if (plan.rows.length === 0) return createElement(Fragment, null);
8995
+ return /* @__PURE__ */ createElement(ApprovalPlan, {
8442
8996
  rows: plan.rows,
8443
8997
  warn: plan.warn
8444
8998
  });
8445
8999
  }
8446
9000
  //#endregion
8447
9001
  //#region src/app/layouts/rightbar/store.ts
9002
+ /**
9003
+ * 读一个布尔开关:键不存在时返回 `fallback`,只有存进去的 `'true'` 算真。
9004
+ * 外壳自己那几个开合态用它(kit 上的 `readText` / `writeText` 是给模块的文本档)。
9005
+ * @param key - localStorage 键。
9006
+ * @param fallback - 没有这个键时的值。
9007
+ * @returns 开关状态。
9008
+ */
9009
+ function readFlag(key, fallback) {
9010
+ const raw = readText(key);
9011
+ if (raw === null) return fallback;
9012
+ return raw === "true";
9013
+ }
9014
+ /**
9015
+ * 把一个布尔开关写进 localStorage(存 `'true'` / `'false'`);写不进去静默作罢。
9016
+ * @param key - localStorage 键。
9017
+ * @param value - 开关状态。
9018
+ */
9019
+ function writeFlag(key, value) {
9020
+ writeText(key, value ? "true" : "false");
9021
+ }
8448
9022
  var browserPersistence = {
8449
9023
  readFlag,
8450
9024
  writeFlag,
@@ -8538,27 +9112,27 @@ var ColumnSwitch_module_default = {
8538
9112
  function ColumnSwitch({ useRightbar, selectColumn, dshColumn, t }) {
8539
9113
  const pressed = pressedColumns(useRightbar((snapshot) => snapshot), useSyncExternalStore(dshColumn.subscribe, dshColumn.getSnapshot));
8540
9114
  const workbenchLabel = pressed.workbench ? t("rightbar.collapse") : t("rightbar.column.workbench");
8541
- return /* @__PURE__ */ h("span", {
9115
+ return /* @__PURE__ */ createElement("span", {
8542
9116
  className: ColumnSwitch_module_default.group,
8543
9117
  role: "group",
8544
9118
  "aria-label": t("rightbar.column.label")
8545
- }, /* @__PURE__ */ h(Tip, { label: workbenchLabel }, /* @__PURE__ */ h(Button, {
9119
+ }, /* @__PURE__ */ createElement(Tip, { label: workbenchLabel }, /* @__PURE__ */ createElement(Button, {
8546
9120
  type: "button",
8547
9121
  size: "sm",
8548
9122
  variant: "ghost",
8549
9123
  className: pressed.workbench ? `${ColumnSwitch_module_default.button} ${ColumnSwitch_module_default.active}` : ColumnSwitch_module_default.button,
8550
9124
  "aria-pressed": pressed.workbench,
8551
9125
  "aria-label": workbenchLabel,
8552
- icon: /* @__PURE__ */ h("span", { className: ColumnSwitch_module_default.icon }, /* @__PURE__ */ h(IconPanelScreen, { size: 15 })),
9126
+ icon: /* @__PURE__ */ createElement("span", { className: ColumnSwitch_module_default.icon }, /* @__PURE__ */ createElement(IconPanelScreen, { size: 15 })),
8553
9127
  onClick: () => selectColumn("workbench")
8554
- })), /* @__PURE__ */ h(Tip, { label: t("rightbar.column.dsh") }, /* @__PURE__ */ h(Button, {
9128
+ })), /* @__PURE__ */ createElement(Tip, { label: t("rightbar.column.dsh") }, /* @__PURE__ */ createElement(Button, {
8555
9129
  type: "button",
8556
9130
  size: "sm",
8557
9131
  variant: "ghost",
8558
9132
  className: pressed.dsh ? `${ColumnSwitch_module_default.button} ${ColumnSwitch_module_default.active}` : ColumnSwitch_module_default.button,
8559
9133
  "aria-pressed": pressed.dsh,
8560
9134
  "aria-label": t("rightbar.column.dsh"),
8561
- icon: /* @__PURE__ */ h("span", { className: `${ColumnSwitch_module_default.icon} ${ColumnSwitch_module_default.mirror}` }, /* @__PURE__ */ h(IconPanelLeftOutlineRegular, { size: 15 })),
9135
+ icon: /* @__PURE__ */ createElement("span", { className: `${ColumnSwitch_module_default.icon} ${ColumnSwitch_module_default.mirror}` }, /* @__PURE__ */ createElement(IconPanelLeftOutlineRegular, { size: 15 })),
8562
9136
  onClick: () => selectColumn("dsh")
8563
9137
  })));
8564
9138
  }
@@ -8730,42 +9304,42 @@ function stepLabel(step, titleKeyOf, t) {
8730
9304
  return titleKey === void 0 ? t("panels.unknownStep") : t(titleKey);
8731
9305
  }
8732
9306
  function Breadcrumbs({ trail, onGoTo, titleKeyOf, t }) {
8733
- return /* @__PURE__ */ h("div", {
9307
+ return /* @__PURE__ */ createElement("div", {
8734
9308
  className: Breadcrumbs_module_default.stripTabs,
8735
9309
  role: "presentation"
8736
9310
  }, trail.map((step, index) => {
8737
9311
  const current = index === trail.length - 1;
8738
- return /* @__PURE__ */ h(Fragment, { key: `${step.kind}-${index}` }, index > 0 ? /* @__PURE__ */ h("span", {
9312
+ return /* @__PURE__ */ createElement(Fragment, { key: `${step.kind}-${index}` }, index > 0 ? /* @__PURE__ */ createElement("span", {
8739
9313
  className: Breadcrumbs_module_default.sep,
8740
9314
  "aria-hidden": "true"
8741
- }, "›") : null, current ? /* @__PURE__ */ h("div", {
9315
+ }, "›") : null, current ? /* @__PURE__ */ createElement("div", {
8742
9316
  className: `${Breadcrumbs_module_default.tab} ${Breadcrumbs_module_default.tabActive}`,
8743
9317
  "aria-current": "page"
8744
- }, /* @__PURE__ */ h("span", { className: Breadcrumbs_module_default.tabTitle }, stepLabel(step, titleKeyOf, t))) : /* @__PURE__ */ h("button", {
9318
+ }, /* @__PURE__ */ createElement("span", { className: Breadcrumbs_module_default.tabTitle }, stepLabel(step, titleKeyOf, t))) : /* @__PURE__ */ createElement("button", {
8745
9319
  type: "button",
8746
9320
  className: `${Breadcrumbs_module_default.tab} ${Breadcrumbs_module_default.tabQuiet}`,
8747
9321
  onClick: () => onGoTo(index)
8748
- }, /* @__PURE__ */ h("span", { className: Breadcrumbs_module_default.tabTitle }, stepLabel(step, titleKeyOf, t))));
9322
+ }, /* @__PURE__ */ createElement("span", { className: Breadcrumbs_module_default.tabTitle }, stepLabel(step, titleKeyOf, t))));
8749
9323
  }));
8750
9324
  }
8751
9325
  //#endregion
8752
9326
  //#region src/app/layouts/rightbar/BoardEmpty.tsx
8753
9327
  function BoardEmpty({ t, onBuildModule, onOpenModules, onOpenMarket }) {
8754
- return /* @__PURE__ */ h(CenteredState, {
8755
- icon: /* @__PURE__ */ h(IconBrandMark, { size: 32 }),
9328
+ return /* @__PURE__ */ createElement(CenteredState, {
9329
+ icon: /* @__PURE__ */ createElement(IconBrandMark, { size: 32 }),
8756
9330
  title: t("panels.empty"),
8757
9331
  hint: t("panels.emptyHint"),
8758
- action: /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(Button, {
9332
+ action: /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement(Button, {
8759
9333
  type: "button",
8760
9334
  size: "sm",
8761
9335
  variant: "primary",
8762
9336
  onClick: onBuildModule
8763
- }, t("panels.buildModule")), /* @__PURE__ */ h(Button, {
9337
+ }, t("panels.buildModule")), /* @__PURE__ */ createElement(Button, {
8764
9338
  type: "button",
8765
9339
  size: "sm",
8766
9340
  variant: "toolbar",
8767
9341
  onClick: onOpenModules
8768
- }, t("panels.choose")), /* @__PURE__ */ h(Button, {
9342
+ }, t("panels.choose")), /* @__PURE__ */ createElement(Button, {
8769
9343
  type: "button",
8770
9344
  size: "sm",
8771
9345
  variant: "toolbar",
@@ -8871,7 +9445,7 @@ function aggregateSummaries(summaries) {
8871
9445
  //#endregion
8872
9446
  //#region src/app/layouts/rightbar/PanelRowControls.tsx
8873
9447
  function PanelRowControls({ t, unit, label, busy, onWrite }) {
8874
- return /* @__PURE__ */ h("span", { className: ModulesPage_module_default.rowControls }, /* @__PURE__ */ h(Switch, {
9448
+ return /* @__PURE__ */ createElement("span", { className: ModulesPage_module_default.rowControls }, /* @__PURE__ */ createElement(Switch, {
8875
9449
  checked: unit.shown,
8876
9450
  label: `${label} · ${unit.shown ? t("panels.enabled") : t("panels.disabled")}`,
8877
9451
  disabled: busy,
@@ -8885,12 +9459,12 @@ function PanelRowControls({ t, unit, label, busy, onWrite }) {
8885
9459
  //#region src/app/layouts/rightbar/PanelGroupRows.tsx
8886
9460
  function PanelGroupRows({ t, rows, titleKey, busy, onWrite }) {
8887
9461
  if (rows.length === 0) return null;
8888
- return /* @__PURE__ */ h("div", { className: ModulesPage_module_default.group }, /* @__PURE__ */ h("h3", { className: ModulesPage_module_default.groupTitle }, t(titleKey)), /* @__PURE__ */ h("ul", { className: ModulesPage_module_default.list }, rows.map((row) => {
9462
+ return /* @__PURE__ */ createElement("div", { className: ModulesPage_module_default.group }, /* @__PURE__ */ createElement("h3", { className: ModulesPage_module_default.groupTitle }, t(titleKey)), /* @__PURE__ */ createElement("ul", { className: ModulesPage_module_default.list }, rows.map((row) => {
8889
9463
  const title = row.title ?? t(row.titleKey ?? row.id);
8890
- return /* @__PURE__ */ h("li", {
9464
+ return /* @__PURE__ */ createElement("li", {
8891
9465
  key: row.id,
8892
9466
  className: `${ModulesPage_module_default.row} ${row.shown ? "" : ModulesPage_module_default.rowOff}`
8893
- }, /* @__PURE__ */ h("span", { "aria-hidden": "true" }), /* @__PURE__ */ h("span", { className: ModulesPage_module_default.label }, /* @__PURE__ */ h("span", { className: ModulesPage_module_default.name }, title), row.badgeKey === void 0 ? null : /* @__PURE__ */ h("span", { className: ModulesPage_module_default.dep }, t(row.badgeKey))), /* @__PURE__ */ h(PanelRowControls, {
9467
+ }, /* @__PURE__ */ createElement("span", { "aria-hidden": "true" }), /* @__PURE__ */ createElement("span", { className: ModulesPage_module_default.label }, /* @__PURE__ */ createElement("span", { className: ModulesPage_module_default.name }, title), row.badgeKey === void 0 ? null : /* @__PURE__ */ createElement("span", { className: ModulesPage_module_default.dep }, t(row.badgeKey))), /* @__PURE__ */ createElement(PanelRowControls, {
8894
9468
  t,
8895
9469
  unit: row,
8896
9470
  label: title,
@@ -8940,14 +9514,14 @@ function gripClass(drag) {
8940
9514
  return `${ModulesPage_module_default.grip} ${drag.over === null ? ModulesPage_module_default.gripBlocked : ModulesPage_module_default.gripDragging}`;
8941
9515
  }
8942
9516
  function RowLabel({ t, row }) {
8943
- return /* @__PURE__ */ h("span", { className: ModulesPage_module_default.label }, /* @__PURE__ */ h("span", { className: ModulesPage_module_default.name }, t(row.titleKey ?? row.id)), row.badgeKey === void 0 ? null : /* @__PURE__ */ h("span", { className: ModulesPage_module_default.dep }, t(row.badgeKey)));
9517
+ return /* @__PURE__ */ createElement("span", { className: ModulesPage_module_default.label }, /* @__PURE__ */ createElement("span", { className: ModulesPage_module_default.name }, t(row.titleKey ?? row.id)), row.badgeKey === void 0 ? null : /* @__PURE__ */ createElement("span", { className: ModulesPage_module_default.dep }, t(row.badgeKey)));
8944
9518
  }
8945
9519
  function PanelRowItem({ t, row, index, drag, handlers, tipEpoch, busy, onWrite }) {
8946
- return /* @__PURE__ */ h("li", { className: rowClass(row, index, drag) }, row.shown && row.hasCard !== false ? /* @__PURE__ */ h(Tip, {
9520
+ return /* @__PURE__ */ createElement("li", { className: rowClass(row, index, drag) }, row.shown && row.hasCard !== false ? /* @__PURE__ */ createElement(Tip, {
8947
9521
  key: tipEpoch,
8948
9522
  label: t("panels.dragHint"),
8949
9523
  disabled: drag !== null
8950
- }, /* @__PURE__ */ h("span", {
9524
+ }, /* @__PURE__ */ createElement("span", {
8951
9525
  className: gripClass(drag),
8952
9526
  "aria-hidden": "true",
8953
9527
  onPointerDown: (event) => {
@@ -8956,10 +9530,10 @@ function PanelRowItem({ t, row, index, drag, handlers, tipEpoch, busy, onWrite }
8956
9530
  event.currentTarget.setPointerCapture(event.pointerId);
8957
9531
  handlers.begin(index, event.clientX, event.clientY);
8958
9532
  }
8959
- }, "⠿")) : /* @__PURE__ */ h("span", { "aria-hidden": "true" }), /* @__PURE__ */ h(RowLabel, {
9533
+ }, "⠿")) : /* @__PURE__ */ createElement("span", { "aria-hidden": "true" }), /* @__PURE__ */ createElement(RowLabel, {
8960
9534
  t,
8961
9535
  row
8962
- }), /* @__PURE__ */ h(PanelRowControls, {
9536
+ }), /* @__PURE__ */ createElement(PanelRowControls, {
8963
9537
  t,
8964
9538
  unit: row,
8965
9539
  label: t(row.titleKey ?? row.id),
@@ -8968,12 +9542,12 @@ function PanelRowItem({ t, row, index, drag, handlers, tipEpoch, busy, onWrite }
8968
9542
  }));
8969
9543
  }
8970
9544
  function PanelEmpty({ t, onOpenMarket }) {
8971
- return /* @__PURE__ */ h(CenteredState, {
9545
+ return /* @__PURE__ */ createElement(CenteredState, {
8972
9546
  compact: true,
8973
9547
  icon: null,
8974
9548
  title: t("panels.noneInstalled"),
8975
9549
  hint: t("panels.noneInstalledHint"),
8976
- action: /* @__PURE__ */ h(Button, {
9550
+ action: /* @__PURE__ */ createElement(Button, {
8977
9551
  type: "button",
8978
9552
  size: "sm",
8979
9553
  variant: "outline",
@@ -8982,7 +9556,7 @@ function PanelEmpty({ t, onOpenMarket }) {
8982
9556
  });
8983
9557
  }
8984
9558
  function DragGhost({ label, at }) {
8985
- return /* @__PURE__ */ h("div", {
9559
+ return /* @__PURE__ */ createElement("div", {
8986
9560
  className: ModulesPage_module_default.ghost,
8987
9561
  style: {
8988
9562
  left: `${at.x + 12}px`,
@@ -8996,7 +9570,7 @@ function ResetConfirmation({ t, open, busy, onCancel, onConfirm }) {
8996
9570
  setAcknowledged(false);
8997
9571
  next();
8998
9572
  };
8999
- return /* @__PURE__ */ h(RiskConfirmation, {
9573
+ return /* @__PURE__ */ createElement(RiskConfirmation, {
9000
9574
  open,
9001
9575
  title: t("panels.followAllConfirmTitle"),
9002
9576
  description: t("panels.followAllConfirmDetail"),
@@ -9096,16 +9670,17 @@ function ModulesPage({ t, units, plugins = [], workspace, capabilities, loading
9096
9670
  };
9097
9671
  useDragListeners(drag !== null, handlers);
9098
9672
  const dragged = drag === null ? void 0 : carded[drag.from];
9099
- return /* @__PURE__ */ h(Fragment, null, drag?.at === void 0 || dragged === void 0 ? null : /* @__PURE__ */ h(DragGhost, {
9673
+ const ghost = drag?.at === void 0 || dragged === void 0 ? null : /* @__PURE__ */ createElement(DragGhost, {
9100
9674
  label: t(dragged.titleKey ?? dragged.id),
9101
9675
  at: drag.at
9102
- }), empty ? /* @__PURE__ */ h(PanelEmpty, {
9676
+ });
9677
+ return /* @__PURE__ */ createElement(Fragment, null, ghost, empty ? /* @__PURE__ */ createElement(PanelEmpty, {
9103
9678
  t,
9104
9679
  onOpenMarket
9105
- }) : null, carded.length === 0 ? null : /* @__PURE__ */ h("ul", {
9680
+ }) : null, carded.length === 0 ? null : /* @__PURE__ */ createElement("ul", {
9106
9681
  ref: listRef,
9107
9682
  className: `${ModulesPage_module_default.list}${drag === null ? "" : ` ${ModulesPage_module_default.listDragging}`}`
9108
- }, carded.map((row, index) => /* @__PURE__ */ h(PanelRowItem, {
9683
+ }, carded.map((row, index) => /* @__PURE__ */ createElement(PanelRowItem, {
9109
9684
  key: row.id,
9110
9685
  t,
9111
9686
  row,
@@ -9115,24 +9690,24 @@ function ModulesPage({ t, units, plugins = [], workspace, capabilities, loading
9115
9690
  tipEpoch,
9116
9691
  busy,
9117
9692
  onWrite: writeRow
9118
- }))), /* @__PURE__ */ h(PanelGroupRows, {
9693
+ }))), /* @__PURE__ */ createElement(PanelGroupRows, {
9119
9694
  t,
9120
9695
  rows: boardless,
9121
9696
  titleKey: "panels.groupBoardless",
9122
9697
  busy,
9123
9698
  onWrite: writeRow
9124
- }), /* @__PURE__ */ h(PanelGroupRows, {
9699
+ }), /* @__PURE__ */ createElement(PanelGroupRows, {
9125
9700
  t,
9126
9701
  rows: pluginRows,
9127
9702
  titleKey: "panels.groupPlugins",
9128
9703
  busy,
9129
9704
  onWrite: writeRow
9130
- }), own ? /* @__PURE__ */ h(PanelFoot, null, /* @__PURE__ */ h("button", {
9705
+ }), own ? /* @__PURE__ */ createElement(PanelFoot, null, /* @__PURE__ */ createElement("button", {
9131
9706
  type: "button",
9132
9707
  className: ModulesPage_module_default.reset,
9133
9708
  disabled: busy,
9134
9709
  onClick: () => setConfirmingReset(true)
9135
- }, t("panels.followAll"))) : null, /* @__PURE__ */ h(ResetConfirmation, {
9710
+ }, t("panels.followAll"))) : null, /* @__PURE__ */ createElement(ResetConfirmation, {
9136
9711
  t,
9137
9712
  open: confirmingReset,
9138
9713
  busy,
@@ -9141,7 +9716,7 @@ function ModulesPage({ t, units, plugins = [], workspace, capabilities, loading
9141
9716
  setConfirmingReset(false);
9142
9717
  write({ action: "reset" });
9143
9718
  }
9144
- }), failed ? /* @__PURE__ */ h("p", { className: ModulesPage_module_default.error }, t("panels.failed")) : null);
9719
+ }), failed ? /* @__PURE__ */ createElement("p", { className: ModulesPage_module_default.error }, t("panels.failed")) : null);
9145
9720
  }
9146
9721
  //#endregion
9147
9722
  //#region src/app/layouts/rightbar/panel-dismiss.ts
@@ -9179,23 +9754,23 @@ function PanelModules({ t, open, onOpenChange, enabledUnits, workspace, refreshT
9179
9754
  const mockNonce = devPanel.pick.nonce;
9180
9755
  useDismissOnOutsidePointer(root, open, (next) => dismissPanelByPointer(next, document, onOpenChange));
9181
9756
  const units = enabledUnits?.units ?? [];
9182
- return /* @__PURE__ */ h("div", {
9757
+ return /* @__PURE__ */ createElement("div", {
9183
9758
  className: ModulesPage_module_default.trigger,
9184
9759
  ref: root
9185
- }, /* @__PURE__ */ h(Tip, { label: t("panels.title") }, /* @__PURE__ */ h(Button, {
9760
+ }, /* @__PURE__ */ createElement(Tip, { label: t("panels.title") }, /* @__PURE__ */ createElement(Button, {
9186
9761
  type: "button",
9187
9762
  size: "sm",
9188
9763
  variant: "ghost",
9189
9764
  className: `wb-stripButton${open ? " wb-stripButtonActive" : ""}`,
9190
9765
  "aria-label": t("panels.title"),
9191
9766
  "aria-expanded": open,
9192
- icon: /* @__PURE__ */ h(IconModules, { size: 16 }),
9767
+ icon: /* @__PURE__ */ createElement(IconModules, { size: 16 }),
9193
9768
  onClick: () => onOpenChange(!open)
9194
- })), open ? /* @__PURE__ */ h("div", {
9769
+ })), open ? /* @__PURE__ */ createElement("div", {
9195
9770
  className: ModulesPage_module_default.pop,
9196
9771
  role: "dialog",
9197
9772
  "aria-label": t("panels.title")
9198
- }, /* @__PURE__ */ h("header", { className: ModulesPage_module_default.head }, /* @__PURE__ */ h("span", { className: ModulesPage_module_default.title }, t("panels.tab.modules"))), devPanel.strip, /* @__PURE__ */ h(ModulesPage, {
9773
+ }, /* @__PURE__ */ createElement("header", { className: ModulesPage_module_default.head }, /* @__PURE__ */ createElement("span", { className: ModulesPage_module_default.title }, t("panels.tab.modules"))), devPanel.strip, /* @__PURE__ */ createElement(ModulesPage, {
9199
9774
  key: `${panelMock?.id ?? "real-modules"}-${mockNonce}`,
9200
9775
  t,
9201
9776
  units: panelMock?.units ?? units,
@@ -9491,7 +10066,8 @@ function workspacePathOf(world) {
9491
10066
  }
9492
10067
  function ModuleHost({ module, step, panelToken, onPanelRefresh, onSummary, ...rest }) {
9493
10068
  const [ownToken, setOwnToken] = useState(0);
9494
- return /* @__PURE__ */ h(step === void 0 ? module.View : module.steps?.[step]?.View ?? module.View, {
10069
+ const View = step === void 0 ? module.View : module.steps?.[step]?.View ?? module.View;
10070
+ return /* @__PURE__ */ createElement(View, {
9495
10071
  ...rest,
9496
10072
  refreshToken: panelToken + ownToken,
9497
10073
  onRefresh: () => setOwnToken((value) => value + 1),
@@ -9508,13 +10084,13 @@ function BoardGrid({ entries, panelWidth, world, panelToken, onPanelRefresh, onN
9508
10084
  trailing: false
9509
10085
  }));
9510
10086
  const order = slots !== null && slots.length === entries.length ? slots : plain;
9511
- return /* @__PURE__ */ h("div", {
10087
+ return /* @__PURE__ */ createElement("div", {
9512
10088
  className: Rightbar_module_default.columns,
9513
10089
  ref: root,
9514
10090
  style: { columnCount }
9515
10091
  }, order.map((slot) => {
9516
10092
  const entry = entries[slot.index];
9517
- return /* @__PURE__ */ h("div", {
10093
+ return /* @__PURE__ */ createElement("div", {
9518
10094
  className: Rightbar_module_default.cell,
9519
10095
  key: entry.key,
9520
10096
  "data-wb-cell": entry.key,
@@ -9522,12 +10098,12 @@ function BoardGrid({ entries, panelWidth, world, panelToken, onPanelRefresh, onN
9522
10098
  breakBefore: slot.breakBefore ? "column" : void 0,
9523
10099
  marginBottom: slot.trailing ? 0 : void 0
9524
10100
  }
9525
- }, /* @__PURE__ */ h(CardAnchor, { unit: entry.module.id }, /* @__PURE__ */ h(CardBoundary, {
10101
+ }, /* @__PURE__ */ createElement(CardAnchor, { unit: entry.module.id }, /* @__PURE__ */ createElement(CardBoundary, {
9526
10102
  unit: entry.module.id,
9527
10103
  resetKey: `${entry.key}:${panelToken}:${workspacePathOf(world)}`,
9528
10104
  t,
9529
10105
  onFailure: (reason) => onCardFailure(entry.module.id, reason)
9530
- }, /* @__PURE__ */ h(ModuleHost, {
10106
+ }, /* @__PURE__ */ createElement(ModuleHost, {
9531
10107
  module: entry.module,
9532
10108
  world,
9533
10109
  panelToken,
@@ -9567,21 +10143,21 @@ function createSuiteWorld(input) {
9567
10143
  //#endregion
9568
10144
  //#region src/app/layouts/rightbar/Rightbar.tsx
9569
10145
  function PanelHeader({ t, trail, onGoTo, titleKeyOf, refreshing, at, refreshEnabled, onRefresh, modulesOpen, onModulesOpenChange, enabledUnits, manifests, workspace, refreshToken, onOpenMarket, onCollapse }) {
9570
- return /* @__PURE__ */ h("header", { className: "wb-panelHeader" }, /* @__PURE__ */ h("div", { className: "wb-tabStrip" }, /* @__PURE__ */ h(Breadcrumbs, {
10146
+ return /* @__PURE__ */ createElement("header", { className: "wb-panelHeader" }, /* @__PURE__ */ createElement("div", { className: "wb-tabStrip" }, /* @__PURE__ */ createElement(Breadcrumbs, {
9571
10147
  trail,
9572
10148
  onGoTo,
9573
10149
  titleKeyOf,
9574
10150
  t
9575
- }), /* @__PURE__ */ h("span", { className: "wb-stripFill" }), /* @__PURE__ */ h("div", { className: "wb-stripChrome" }, /* @__PURE__ */ h(Tip, { label: refreshing ? t("rightbar.refreshing") : at === null ? t("rightbar.refresh") : `${t("rightbar.refresh")} · ${t("rightbar.updatedAt", { time: new Date(at).toLocaleTimeString().slice(0, 5) })}` }, /* @__PURE__ */ h(Button, {
10151
+ }), /* @__PURE__ */ createElement("span", { className: "wb-stripFill" }), /* @__PURE__ */ createElement("div", { className: "wb-stripChrome" }, /* @__PURE__ */ createElement(Tip, { label: refreshing ? t("rightbar.refreshing") : at === null ? t("rightbar.refresh") : `${t("rightbar.refresh")} · ${t("rightbar.updatedAt", { time: new Date(at).toLocaleTimeString().slice(0, 5) })}` }, /* @__PURE__ */ createElement(Button, {
9576
10152
  type: "button",
9577
10153
  size: "sm",
9578
10154
  variant: "ghost",
9579
10155
  className: `wb-stripButton${refreshing ? " wb-spinning" : ""}`,
9580
10156
  "aria-label": refreshing ? t("rightbar.refreshing") : t("rightbar.refresh"),
9581
10157
  disabled: refreshing || !refreshEnabled,
9582
- icon: /* @__PURE__ */ h(IconRefreshOutlineRegular, { size: 16 }),
10158
+ icon: /* @__PURE__ */ createElement(IconRefreshOutlineRegular, { size: 16 }),
9583
10159
  onClick: onRefresh
9584
- })), /* @__PURE__ */ h(PanelModules, {
10160
+ })), /* @__PURE__ */ createElement(PanelModules, {
9585
10161
  t,
9586
10162
  open: modulesOpen,
9587
10163
  onOpenChange: onModulesOpenChange,
@@ -9590,33 +10166,33 @@ function PanelHeader({ t, trail, onGoTo, titleKeyOf, refreshing, at, refreshEnab
9590
10166
  refreshToken,
9591
10167
  manifests,
9592
10168
  onOpenMarket
9593
- }), /* @__PURE__ */ h(Tip, { label: t("rightbar.collapse") }, /* @__PURE__ */ h(Button, {
10169
+ }), /* @__PURE__ */ createElement(Tip, { label: t("rightbar.collapse") }, /* @__PURE__ */ createElement(Button, {
9594
10170
  type: "button",
9595
10171
  size: "sm",
9596
10172
  variant: "ghost",
9597
10173
  className: "wb-stripButton",
9598
10174
  "aria-label": t("rightbar.collapse"),
9599
- icon: /* @__PURE__ */ h("span", { className: "wb-stripIconFlip" }, /* @__PURE__ */ h(IconPanelLeftOutlineRegular, { size: 16 })),
10175
+ icon: /* @__PURE__ */ createElement("span", { className: "wb-stripIconFlip" }, /* @__PURE__ */ createElement(IconPanelLeftOutlineRegular, { size: 16 })),
9600
10176
  onClick: onCollapse
9601
10177
  })))));
9602
10178
  }
9603
10179
  function BoardContent({ top, plan, world, board, panelWidth, panelToken, onPanelRefresh, onNavigate, onOpenMarket, onSummary, onOpenModules, onCardFailure, buildModule, t }) {
9604
10180
  if (top.kind !== "board") {
9605
10181
  const owner = board.stepOwner(top.kind);
9606
- if (owner === void 0) return /* @__PURE__ */ h(CenteredState, {
9607
- icon: /* @__PURE__ */ h(IconBrandMark, { size: 32 }),
10182
+ if (owner === void 0) return /* @__PURE__ */ createElement(CenteredState, {
10183
+ icon: /* @__PURE__ */ createElement(IconBrandMark, { size: 32 }),
9608
10184
  title: t("panels.unknownStep")
9609
10185
  });
9610
10186
  const key = `${owner.id}:${top.kind}`;
9611
- return /* @__PURE__ */ h(CardAnchor, {
10187
+ return /* @__PURE__ */ createElement(CardAnchor, {
9612
10188
  key,
9613
10189
  unit: owner.id
9614
- }, /* @__PURE__ */ h(CardBoundary, {
10190
+ }, /* @__PURE__ */ createElement(CardBoundary, {
9615
10191
  unit: owner.id,
9616
10192
  resetKey: `${key}:${panelToken}:${workspacePathOf(world)}`,
9617
10193
  t,
9618
10194
  onFailure: (reason) => onCardFailure(owner.id, reason)
9619
- }, /* @__PURE__ */ h(ModuleHost, {
10195
+ }, /* @__PURE__ */ createElement(ModuleHost, {
9620
10196
  module: owner,
9621
10197
  step: top.kind,
9622
10198
  world,
@@ -9628,15 +10204,15 @@ function BoardContent({ top, plan, world, board, panelWidth, panelToken, onPanel
9628
10204
  t
9629
10205
  })));
9630
10206
  }
9631
- return /* @__PURE__ */ h(Fragment, null, plan.reading ? /* @__PURE__ */ h(CenteredState, {
10207
+ return /* @__PURE__ */ createElement(Fragment, null, plan.reading ? /* @__PURE__ */ createElement(CenteredState, {
9632
10208
  icon: null,
9633
- title: /* @__PURE__ */ h(TextShimmer, { active: true }, t("panels.reading"))
9634
- }) : null, plan.empty ? /* @__PURE__ */ h(BoardEmpty, {
10209
+ title: /* @__PURE__ */ createElement(TextShimmer, { active: true }, t("panels.reading"))
10210
+ }) : null, plan.empty ? /* @__PURE__ */ createElement(BoardEmpty, {
9635
10211
  t,
9636
10212
  onBuildModule: buildModule,
9637
10213
  onOpenModules,
9638
10214
  onOpenMarket
9639
- }) : null, /* @__PURE__ */ h(BoardGrid, {
10215
+ }) : null, /* @__PURE__ */ createElement(BoardGrid, {
9640
10216
  entries: plan.modules,
9641
10217
  panelWidth,
9642
10218
  world,
@@ -9748,7 +10324,7 @@ function Rightbar(props) {
9748
10324
  const top = state.trail[state.trail.length - 1] ?? { kind: "board" };
9749
10325
  const navigate = (step) => props.openPanel(step);
9750
10326
  const openMarket = () => props.openMarket();
9751
- return /* @__PURE__ */ h("aside", {
10327
+ return /* @__PURE__ */ createElement("aside", {
9752
10328
  ref: asideRef,
9753
10329
  className: `wb-rightbar ${Rightbar_module_default.panel}`,
9754
10330
  style: { width: panelWidth },
@@ -9757,7 +10333,7 @@ function Rightbar(props) {
9757
10333
  "data-wb-board": fixtureMode ? void 0 : boardWorkspace ?? void 0,
9758
10334
  "data-wb-open": fixtureMode || !shown ? void 0 : "",
9759
10335
  "aria-label": props.t("rightbar.label")
9760
- }, /* @__PURE__ */ h(PanelHeader, {
10336
+ }, /* @__PURE__ */ createElement(PanelHeader, {
9761
10337
  t: props.t,
9762
10338
  trail: state.trail,
9763
10339
  onGoTo: props.goToPanel,
@@ -9774,7 +10350,7 @@ function Rightbar(props) {
9774
10350
  refreshToken: panelToken,
9775
10351
  onOpenMarket: openMarket,
9776
10352
  onCollapse: props.toggleRightbar
9777
- }), devBoard.strip(top.kind === "board"), /* @__PURE__ */ h("div", { className: `wb-panelBody${plan.repeated ? " wb-panelMany" : ""}` }, /* @__PURE__ */ h(BoardContent, {
10353
+ }), devBoard.strip(top.kind === "board"), /* @__PURE__ */ createElement("div", { className: `wb-panelBody${plan.repeated ? " wb-panelMany" : ""}` }, /* @__PURE__ */ createElement(BoardContent, {
9778
10354
  top,
9779
10355
  plan,
9780
10356
  world,
@@ -10049,29 +10625,29 @@ function openNewSession(input) {
10049
10625
  //#region src/app/layouts/sidebar/SidebarHeader.tsx
10050
10626
  function SidebarHeader(props) {
10051
10627
  const { collapsed, wide, attention, t, renderSlot } = props;
10052
- return /* @__PURE__ */ h("div", { className: "wb-logoRow" }, wide ? /* @__PURE__ */ h(Tip, { label: t("panel.conversation") }, /* @__PURE__ */ h("button", {
10628
+ return /* @__PURE__ */ createElement("div", { className: "wb-logoRow" }, wide ? /* @__PURE__ */ createElement(Tip, { label: t("panel.conversation") }, /* @__PURE__ */ createElement("button", {
10053
10629
  type: "button",
10054
10630
  className: "wb-brand",
10055
10631
  onClick: () => props.onSelectPanel(null)
10056
- }, /* @__PURE__ */ h("span", { className: "wb-brandIdentity" }, /* @__PURE__ */ h("span", { className: "wb-brandMark" }, renderSlot("sidebar.brand.mark", { size: 24 }, { fallback: /* @__PURE__ */ h(IconBrandMark, { size: 24 }) })), /* @__PURE__ */ h("span", { className: "wb-brandName" }, renderSlot("sidebar.brand.name", {}, { fallback: t("brand.name") }))))) : null, /* @__PURE__ */ h("button", {
10632
+ }, /* @__PURE__ */ createElement("span", { className: "wb-brandIdentity" }, /* @__PURE__ */ createElement("span", { className: "wb-brandMark" }, renderSlot("sidebar.brand.mark", { size: 24 }, { fallback: /* @__PURE__ */ createElement(IconBrandMark, { size: 24 }) })), /* @__PURE__ */ createElement("span", { className: "wb-brandName" }, renderSlot("sidebar.brand.name", {}, { fallback: t("brand.name") }))))) : null, /* @__PURE__ */ createElement("button", {
10057
10633
  type: "button",
10058
10634
  className: "wb-iconButton wb-toggle",
10059
10635
  "aria-label": t(collapsed ? "toggle.open" : "toggle.collapse"),
10060
10636
  onClick: props.onToggle
10061
- }, !wide ? /* @__PURE__ */ h("span", {
10637
+ }, !wide ? /* @__PURE__ */ createElement("span", {
10062
10638
  className: "wb-railMark",
10063
10639
  "aria-hidden": "true"
10064
- }, renderSlot("sidebar.brand.mark", { size: 24 }, { fallback: /* @__PURE__ */ h(IconBrandMark, { size: 24 }) })) : null, /* @__PURE__ */ h("span", { className: "wb-panelIcon" }, /* @__PURE__ */ h(IconPanelLeftOutlineRegular, { size: wide ? 16 : 18 })), !wide ? renderSlot("sidebar.toggle.badge", { attention }) : null));
10640
+ }, renderSlot("sidebar.brand.mark", { size: 24 }, { fallback: /* @__PURE__ */ createElement(IconBrandMark, { size: 24 }) })) : null, /* @__PURE__ */ createElement("span", { className: "wb-panelIcon" }, /* @__PURE__ */ createElement(IconPanelLeftOutlineRegular, { size: wide ? 16 : 18 })), !wide ? renderSlot("sidebar.toggle.badge", { attention }) : null));
10065
10641
  }
10066
10642
  //#endregion
10067
10643
  //#region src/app/layouts/sidebar/WorkspaceSection.tsx
10068
10644
  function WorkspaceSection({ t, wide, onNewSession }) {
10069
- return /* @__PURE__ */ h("div", { className: "wb-wsSection" }, /* @__PURE__ */ h("div", { className: "wb-sectionHeader" }, wide ? /* @__PURE__ */ h("span", { className: "wb-sectionLabel" }, t("workspace.section")) : null, /* @__PURE__ */ h(Tip, { label: t("session.new.label") }, /* @__PURE__ */ h("button", {
10645
+ return /* @__PURE__ */ createElement("div", { className: "wb-wsSection" }, /* @__PURE__ */ createElement("div", { className: "wb-sectionHeader" }, wide ? /* @__PURE__ */ createElement("span", { className: "wb-sectionLabel" }, t("workspace.section")) : null, /* @__PURE__ */ createElement(Tip, { label: t("session.new.label") }, /* @__PURE__ */ createElement("button", {
10070
10646
  type: "button",
10071
10647
  className: "wb-iconButton wb-wsNew",
10072
10648
  "aria-label": t("session.new"),
10073
10649
  onClick: onNewSession
10074
- }, /* @__PURE__ */ h(IconNewChatOutlineRegular, { size: 16 })))));
10650
+ }, /* @__PURE__ */ createElement(IconNewChatOutlineRegular, { size: 16 })))));
10075
10651
  }
10076
10652
  //#endregion
10077
10653
  //#region src/shared/hooks/use-shell-long-tasks.ts
@@ -10143,22 +10719,22 @@ function PanelRow({ id, label, active, wide, onSelect, fallbackGlyph, renderEntr
10143
10719
  const glyph = fallbackGlyph ?? (id !== null && renderEntry !== void 0 ? renderEntry(id, active, wide) : null);
10144
10720
  const hint = usePanelHint(id);
10145
10721
  const name = panelRowName(label, hint, t);
10146
- return /* @__PURE__ */ h(Tip, {
10722
+ return /* @__PURE__ */ createElement(Tip, {
10147
10723
  label: name,
10148
10724
  disabled: !(hint !== null || !wide)
10149
- }, /* @__PURE__ */ h("button", {
10725
+ }, /* @__PURE__ */ createElement("button", {
10150
10726
  type: "button",
10151
10727
  className: cx("wb-panelRow", active && "wb-panelActive"),
10152
10728
  "aria-current": active ? "page" : void 0,
10153
10729
  "aria-label": name,
10154
10730
  onClick: () => onSelect(id)
10155
- }, /* @__PURE__ */ h("span", {
10731
+ }, /* @__PURE__ */ createElement("span", {
10156
10732
  className: "wb-panelGlyph",
10157
10733
  "aria-hidden": "true"
10158
- }, glyph, hint !== null && !wide ? /* @__PURE__ */ h("span", { className: "wb-panelDot" }, /* @__PURE__ */ h(StateDot, {
10734
+ }, glyph, hint !== null && !wide ? /* @__PURE__ */ createElement("span", { className: "wb-panelDot" }, /* @__PURE__ */ createElement(StateDot, {
10159
10735
  state: hint.tone === "danger" ? "error" : "warning",
10160
10736
  size: 9
10161
- })) : null), wide ? /* @__PURE__ */ h("span", { className: "wb-panelTitle" }, label) : null, hint === null || !wide ? null : /* @__PURE__ */ h(Tag, {
10737
+ })) : null), wide ? /* @__PURE__ */ createElement("span", { className: "wb-panelTitle" }, label) : null, hint === null || !wide ? null : /* @__PURE__ */ createElement(Tag, {
10162
10738
  tone: hint.tone,
10163
10739
  className: "wb-panelTag"
10164
10740
  }, t(hint.labelKey))));
@@ -10186,22 +10762,22 @@ var WorkspaceAttentionDot_module_default = {
10186
10762
  function WorkspaceAttentionDot({ attention, t, variant = "inline", tip = false }) {
10187
10763
  if (attention === null) return null;
10188
10764
  const label = attentionLabel(attention, t);
10189
- const dot = /* @__PURE__ */ h("span", {
10765
+ const dot = /* @__PURE__ */ createElement("span", {
10190
10766
  className: variant === "overlay" ? cx(WorkspaceAttentionDot_module_default.dot, WorkspaceAttentionDot_module_default.overlay) : WorkspaceAttentionDot_module_default.dot,
10191
10767
  role: "img",
10192
10768
  "aria-label": label
10193
- }, /* @__PURE__ */ h(StateDot, {
10769
+ }, /* @__PURE__ */ createElement(StateDot, {
10194
10770
  state: attention.severity,
10195
10771
  size: variant === "overlay" ? 9 : void 0
10196
10772
  }));
10197
- return tip ? /* @__PURE__ */ h(Tip, { label }, dot) : dot;
10773
+ return tip ? /* @__PURE__ */ createElement(Tip, { label }, dot) : dot;
10198
10774
  }
10199
10775
  var WorkspaceAttentionTag_module_default = { tag: "_tag_g9dg8_1" };
10200
10776
  //#endregion
10201
10777
  //#region src/app/layouts/sidebar/WorkspaceAttentionTag.tsx
10202
10778
  function WorkspaceAttentionTag({ attention, t }) {
10203
10779
  if (attention === null) return null;
10204
- return /* @__PURE__ */ h(Tip, { label: attentionLabel(attention, t) }, /* @__PURE__ */ h(Tag, {
10780
+ return /* @__PURE__ */ createElement(Tip, { label: attentionLabel(attention, t) }, /* @__PURE__ */ createElement(Tag, {
10205
10781
  tone: attention.severity === "warning" ? "warning" : "success",
10206
10782
  className: WorkspaceAttentionTag_module_default.tag
10207
10783
  }, attentionWordLabel(attention, t)));
@@ -10259,7 +10835,7 @@ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
10259
10835
  else setFailed(true);
10260
10836
  });
10261
10837
  };
10262
- return /* @__PURE__ */ h(Modal, {
10838
+ return /* @__PURE__ */ createElement(Modal, {
10263
10839
  open: true,
10264
10840
  onClose: () => {
10265
10841
  if (!busy) onClose();
@@ -10268,13 +10844,13 @@ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
10268
10844
  description: t("project.rename.description"),
10269
10845
  closeLabel: t("project.rename.cancel"),
10270
10846
  className: WorkspaceRenameDialog_module_default.dialog,
10271
- footer: /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(Button, {
10847
+ footer: /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement(Button, {
10272
10848
  type: "button",
10273
10849
  variant: "outline",
10274
10850
  size: "md",
10275
10851
  disabled: busy,
10276
10852
  onClick: onClose
10277
- }, t("project.rename.cancel")), /* @__PURE__ */ h(Button, {
10853
+ }, t("project.rename.cancel")), /* @__PURE__ */ createElement(Button, {
10278
10854
  type: "button",
10279
10855
  variant: "primary",
10280
10856
  size: "md",
@@ -10282,7 +10858,7 @@ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
10282
10858
  "aria-busy": busy,
10283
10859
  onClick: save
10284
10860
  }, t(busy ? "project.rename.saving" : "project.rename.save")))
10285
- }, /* @__PURE__ */ h("div", { className: WorkspaceRenameDialog_module_default.stack }, /* @__PURE__ */ h(TextField, {
10861
+ }, /* @__PURE__ */ createElement("div", { className: WorkspaceRenameDialog_module_default.stack }, /* @__PURE__ */ createElement(TextField, {
10286
10862
  className: WorkspaceRenameDialog_module_default.input,
10287
10863
  "data-modal-autofocus": "",
10288
10864
  id: "wb-workspace-name",
@@ -10298,10 +10874,10 @@ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
10298
10874
  event.preventDefault();
10299
10875
  save();
10300
10876
  }
10301
- }), /* @__PURE__ */ h("div", { className: WorkspaceRenameDialog_module_default.meta }, /* @__PURE__ */ h(Note, { as: "span" }, t("project.rename.hint")), /* @__PURE__ */ h(Note, {
10877
+ }), /* @__PURE__ */ createElement("div", { className: WorkspaceRenameDialog_module_default.meta }, /* @__PURE__ */ createElement(Note, { as: "span" }, t("project.rename.hint")), /* @__PURE__ */ createElement(Note, {
10302
10878
  as: "span",
10303
10879
  tone: tooLong ? "problem" : "muted"
10304
- }, `${draft.trim().length}/20`)), failed ? /* @__PURE__ */ h(Note, { tone: "problem" }, t("project.rename.failed")) : null));
10880
+ }, `${draft.trim().length}/20`)), failed ? /* @__PURE__ */ createElement(Note, { tone: "problem" }, t("project.rename.failed")) : null));
10305
10881
  }
10306
10882
  //#endregion
10307
10883
  //#region src/app/layouts/sidebar/workspace-groups.ts
@@ -10334,12 +10910,12 @@ function workspaceSections(items, headings) {
10334
10910
  //#endregion
10335
10911
  //#region src/app/layouts/sidebar/WorkspaceRowAction.tsx
10336
10912
  function WorkspaceRowAction({ workspace, t, onEdit }) {
10337
- return /* @__PURE__ */ h(Button, {
10913
+ return /* @__PURE__ */ createElement(Button, {
10338
10914
  type: "button",
10339
10915
  variant: "ghost",
10340
10916
  size: "sm",
10341
10917
  className: ProjectSwitcher_module_default.rowAction,
10342
- icon: /* @__PURE__ */ h(IconEditOutlineRegular, { size: 14 }),
10918
+ icon: /* @__PURE__ */ createElement(IconEditOutlineRegular, { size: 14 }),
10343
10919
  "aria-label": t("project.rename.row", { name: displayNameOf(workspace).dir }),
10344
10920
  onClick: (event) => {
10345
10921
  event.stopPropagation();
@@ -10368,13 +10944,13 @@ function WorkspaceRowLabel({ workspace, current, action, onHover }) {
10368
10944
  row.removeEventListener("mouseleave", leave);
10369
10945
  };
10370
10946
  }, []);
10371
- return /* @__PURE__ */ h("span", {
10947
+ return /* @__PURE__ */ createElement("span", {
10372
10948
  ref: hostRef,
10373
10949
  className: ProjectSwitcher_module_default.row
10374
- }, /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.dir }, dir), name === "" ? null : /* @__PURE__ */ h("span", {
10950
+ }, /* @__PURE__ */ createElement("span", { className: ProjectSwitcher_module_default.dir }, dir), name === "" ? null : /* @__PURE__ */ createElement("span", {
10375
10951
  className: ProjectSwitcher_module_default.name,
10376
10952
  title: name
10377
- }, name), /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.trailing }, action ?? (current ? /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.current }, /* @__PURE__ */ h(IconCheckOutlineRegular, { size: 12 })) : null)));
10953
+ }, name), /* @__PURE__ */ createElement("span", { className: ProjectSwitcher_module_default.trailing }, action ?? (current ? /* @__PURE__ */ createElement("span", { className: ProjectSwitcher_module_default.current }, /* @__PURE__ */ createElement(IconCheckOutlineRegular, { size: 12 })) : null)));
10378
10954
  }
10379
10955
  //#endregion
10380
10956
  //#region src/app/layouts/sidebar/workspace-items.tsx
@@ -10385,15 +10961,15 @@ function workspaceOptions(options) {
10385
10961
  return {
10386
10962
  value: workspace.workspaceId,
10387
10963
  group,
10388
- icon: own === null ? /* @__PURE__ */ h(IconFolderOpenRegular, { size: 16 }) : /* @__PURE__ */ h(WorkspaceAttentionDot, {
10964
+ icon: own === null ? /* @__PURE__ */ createElement(IconFolderOpenRegular, { size: 16 }) : /* @__PURE__ */ createElement(WorkspaceAttentionDot, {
10389
10965
  attention: own,
10390
10966
  t
10391
10967
  }),
10392
- label: /* @__PURE__ */ h(WorkspaceRowLabel, {
10968
+ label: /* @__PURE__ */ createElement(WorkspaceRowLabel, {
10393
10969
  workspace,
10394
10970
  current: workspace.workspaceId === currentId,
10395
10971
  onHover: (hovering) => onHover(hovering ? workspace.workspaceId : null),
10396
- action: hoverId === workspace.workspaceId ? /* @__PURE__ */ h(WorkspaceRowAction, {
10972
+ action: hoverId === workspace.workspaceId ? /* @__PURE__ */ createElement(WorkspaceRowAction, {
10397
10973
  workspace,
10398
10974
  t,
10399
10975
  onEdit: () => onEdit(workspace)
@@ -10439,26 +11015,26 @@ function ProjectSwitcher({ items, current, attention, compact = false, onPick, o
10439
11015
  const out = /* @__PURE__ */ new Map();
10440
11016
  for (const workspace of items) {
10441
11017
  const { dir, name } = displayNameOf(workspace);
10442
- out.set(workspace.workspaceId, /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.triggerName }, /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.dir }, dir), name === "" ? null : /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.name }, name)));
11018
+ out.set(workspace.workspaceId, /* @__PURE__ */ createElement("span", { className: ProjectSwitcher_module_default.triggerName }, /* @__PURE__ */ createElement("span", { className: ProjectSwitcher_module_default.dir }, dir), name === "" ? null : /* @__PURE__ */ createElement("span", { className: ProjectSwitcher_module_default.name }, name)));
10443
11019
  }
10444
11020
  return out;
10445
11021
  }, [items]);
10446
- return /* @__PURE__ */ h("div", { className: cx(ProjectSwitcher_module_default.root, compact && ProjectSwitcher_module_default.rail) }, /* @__PURE__ */ h(SelectField, {
11022
+ return /* @__PURE__ */ createElement("div", { className: cx(ProjectSwitcher_module_default.root, compact && ProjectSwitcher_module_default.rail) }, /* @__PURE__ */ createElement(SelectField, {
10447
11023
  value: currentId,
10448
11024
  options,
10449
11025
  onChange: onPick,
10450
11026
  open,
10451
11027
  onOpenChange: setOpen,
10452
- icon: /* @__PURE__ */ h(Tip, {
11028
+ icon: /* @__PURE__ */ createElement(Tip, {
10453
11029
  label: current?.path ?? "",
10454
11030
  disabled: current === null
10455
- }, /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.glyphBox }, /* @__PURE__ */ h("span", { className: cx(ProjectSwitcher_module_default.glyph, ProjectSwitcher_module_default.glyphActive) }, /* @__PURE__ */ h(IconFolderCloseRegular, { size: 16 }), compact ? /* @__PURE__ */ h(WorkspaceAttentionDot, {
11031
+ }, /* @__PURE__ */ createElement("span", { className: ProjectSwitcher_module_default.glyphBox }, /* @__PURE__ */ createElement("span", { className: cx(ProjectSwitcher_module_default.glyph, ProjectSwitcher_module_default.glyphActive) }, /* @__PURE__ */ createElement(IconFolderCloseRegular, { size: 16 }), compact ? /* @__PURE__ */ createElement(WorkspaceAttentionDot, {
10456
11032
  attention: attention.overall,
10457
11033
  t,
10458
11034
  variant: "overlay",
10459
11035
  tip: true
10460
11036
  }) : null))),
10461
- renderValue: compact ? void 0 : (option) => /* @__PURE__ */ h(Fragment, null, option === void 0 ? t("project.none") : valueNodes.get(option.value) ?? option.label, /* @__PURE__ */ h(WorkspaceAttentionTag, {
11037
+ renderValue: compact ? void 0 : (option) => /* @__PURE__ */ createElement(Fragment, null, option === void 0 ? t("project.none") : valueNodes.get(option.value) ?? option.label, /* @__PURE__ */ createElement(WorkspaceAttentionTag, {
10462
11038
  attention: attention.elsewhere,
10463
11039
  t
10464
11040
  })),
@@ -10477,10 +11053,10 @@ function ProjectSwitcher({ items, current, attention, compact = false, onPick, o
10477
11053
  },
10478
11054
  footer: {
10479
11055
  label: t("project.add"),
10480
- icon: /* @__PURE__ */ h(IconPlusOutlineRegular, { size: 14 })
11056
+ icon: /* @__PURE__ */ createElement(IconPlusOutlineRegular, { size: 14 })
10481
11057
  },
10482
11058
  onFooter: onAdd
10483
- }), naming === null ? null : /* @__PURE__ */ h(WorkspaceRenameDialog, {
11059
+ }), naming === null ? null : /* @__PURE__ */ createElement(WorkspaceRenameDialog, {
10484
11060
  key: naming.workspaceId,
10485
11061
  workspace: naming,
10486
11062
  t,
@@ -10551,17 +11127,17 @@ function useTitleMarquee(title) {
10551
11127
  function SessionLeading({ node, statuses, renderSlot }) {
10552
11128
  if (node.blank) return null;
10553
11129
  const primary = statuses[0];
10554
- if (primary === void 0 || primary.state === "idle") return /* @__PURE__ */ h(Fragment, null, renderSlot("sidebar.session.row.leading", { sessionId: node.id }));
10555
- return /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(StateDot, { state: primary.state }), statuses.map((status) => /* @__PURE__ */ h("span", {
11130
+ if (primary === void 0 || primary.state === "idle") return /* @__PURE__ */ createElement(Fragment, null, renderSlot("sidebar.session.row.leading", { sessionId: node.id }));
11131
+ return /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement(StateDot, { state: primary.state }), statuses.map((status) => /* @__PURE__ */ createElement("span", {
10556
11132
  className: "wb-visuallyHidden",
10557
11133
  key: status.label
10558
11134
  }, status.label)));
10559
11135
  }
10560
11136
  function SessionHoverContent({ node, statuses, renderSlot, t }) {
10561
- return /* @__PURE__ */ h("div", { className: "wb-sessionHover" }, /* @__PURE__ */ h("div", { className: "wb-sessionHoverTitle" }, node.blank ? t("session.new") : node.title), node.blank ? null : /* @__PURE__ */ h("div", { className: "wb-sessionHoverTime" }, relativeTimeAgo(node.updatedAt, t)), renderSlot("sidebar.session.row.hover", { sessionId: node.id }), statuses.map((status) => /* @__PURE__ */ h("div", {
11137
+ return /* @__PURE__ */ createElement("div", { className: "wb-sessionHover" }, /* @__PURE__ */ createElement("div", { className: "wb-sessionHoverTitle" }, node.blank ? t("session.new") : node.title), node.blank ? null : /* @__PURE__ */ createElement("div", { className: "wb-sessionHoverTime" }, relativeTimeAgo(node.updatedAt, t)), renderSlot("sidebar.session.row.hover", { sessionId: node.id }), statuses.map((status) => /* @__PURE__ */ createElement("div", {
10562
11138
  className: "wb-sessionHoverStatus",
10563
11139
  key: status.label
10564
- }, /* @__PURE__ */ h(StateDot, { state: status.state }), /* @__PURE__ */ h("span", null, status.label))));
11140
+ }, /* @__PURE__ */ createElement(StateDot, { state: status.state }), /* @__PURE__ */ createElement("span", null, status.label))));
10565
11141
  }
10566
11142
  function SessionRow({ node, active, onOpen, renderSlot, t }) {
10567
11143
  const [menuOpen, setMenuOpen] = useState(false);
@@ -10575,36 +11151,36 @@ function SessionRow({ node, active, onOpen, renderSlot, t }) {
10575
11151
  sessionId: node.id,
10576
11152
  displayTitle: node.title
10577
11153
  };
10578
- return /* @__PURE__ */ h(HoverCard, {
10579
- anchor: /* @__PURE__ */ h("div", {
11154
+ return /* @__PURE__ */ createElement(HoverCard, {
11155
+ anchor: /* @__PURE__ */ createElement("div", {
10580
11156
  className: cx("wb-sessionRow", active && "wb-selected", menuOpen && "wb-menuOpen"),
10581
11157
  role: "treeitem",
10582
11158
  "aria-selected": active,
10583
11159
  onClick: () => onOpen(node.id),
10584
11160
  onPointerEnter: marquee.enter,
10585
11161
  onPointerLeave: marquee.leave
10586
- }, /* @__PURE__ */ h("span", { className: "wb-sessionLeading" }, /* @__PURE__ */ h(SessionLeading, {
11162
+ }, /* @__PURE__ */ createElement("span", { className: "wb-sessionLeading" }, /* @__PURE__ */ createElement(SessionLeading, {
10587
11163
  node,
10588
11164
  statuses,
10589
11165
  renderSlot
10590
- })), /* @__PURE__ */ h("span", {
11166
+ })), /* @__PURE__ */ createElement("span", {
10591
11167
  className: "wb-sessionTitle",
10592
11168
  ref: titleRef
10593
- }, label), node.blank ? null : /* @__PURE__ */ h("span", {
11169
+ }, label), node.blank ? null : /* @__PURE__ */ createElement("span", {
10594
11170
  className: "wb-sessionTime",
10595
11171
  "aria-hidden": trailing === void 0 ? void 0 : true
10596
- }, trailing ?? relativeTimeCompact(node.updatedAt, t)), node.pinned ? /* @__PURE__ */ h(Tip, { label: t("session.pinned") }, /* @__PURE__ */ h("span", {
11172
+ }, trailing ?? relativeTimeCompact(node.updatedAt, t)), node.pinned ? /* @__PURE__ */ createElement(Tip, { label: t("session.pinned") }, /* @__PURE__ */ createElement("span", {
10597
11173
  className: "wb-sessionPin",
10598
11174
  role: "img",
10599
11175
  "aria-label": t("session.pinned")
10600
- }, /* @__PURE__ */ h(IconPinFillRegular, { size: 14 }))) : null, node.blank ? null : /* @__PURE__ */ h("span", {
11176
+ }, /* @__PURE__ */ createElement(IconPinFillRegular, { size: 14 }))) : null, node.blank ? null : /* @__PURE__ */ createElement("span", {
10601
11177
  className: "wb-rowActions",
10602
11178
  onClick: (event) => event.stopPropagation()
10603
- }, /* @__PURE__ */ h(Menu, {
11179
+ }, /* @__PURE__ */ createElement(Menu, {
10604
11180
  open: menuOpen,
10605
11181
  portal: true,
10606
11182
  closeOnPointerLeave: true,
10607
- anchor: /* @__PURE__ */ h("button", {
11183
+ anchor: /* @__PURE__ */ createElement("button", {
10608
11184
  type: "button",
10609
11185
  className: "wb-iconButton",
10610
11186
  "aria-haspopup": "menu",
@@ -10614,10 +11190,10 @@ function SessionRow({ node, active, onOpen, renderSlot, t }) {
10614
11190
  event.stopPropagation();
10615
11191
  setMenuOpen((value) => !value);
10616
11192
  }
10617
- }, /* @__PURE__ */ h(IconEllipsisOutlineRegular, { size: 16 })),
11193
+ }, /* @__PURE__ */ createElement(IconEllipsisOutlineRegular, { size: 16 })),
10618
11194
  onClose: () => setMenuOpen(false)
10619
11195
  }, renderSlot("sidebar.workspaces.session.menu.item", owner, { hookContext: menuState })), renderSlot("sidebar.workspaces.session.row.action", owner))),
10620
- content: /* @__PURE__ */ h(SessionHoverContent, {
11196
+ content: /* @__PURE__ */ createElement(SessionHoverContent, {
10621
11197
  node,
10622
11198
  statuses,
10623
11199
  renderSlot,
@@ -10668,14 +11244,14 @@ function SessionList({ workspace, pinnedIds, archived, panelActive, longTasks, u
10668
11244
  ]);
10669
11245
  const listRef = useRef(null);
10670
11246
  const edges = useScrollEdges(listRef, rows);
10671
- if (workspace === null) return /* @__PURE__ */ h("div", { className: "wb-empty" }, t("session.noProject"));
10672
- if (rows.length === 0) return /* @__PURE__ */ h("div", { className: "wb-empty" }, t("session.empty"));
10673
- return /* @__PURE__ */ h("div", {
11247
+ if (workspace === null) return /* @__PURE__ */ createElement("div", { className: "wb-empty" }, t("session.noProject"));
11248
+ if (rows.length === 0) return /* @__PURE__ */ createElement("div", { className: "wb-empty" }, t("session.empty"));
11249
+ return /* @__PURE__ */ createElement("div", {
10674
11250
  ref: listRef,
10675
11251
  className: cx("wb-sessions", edges.canScrollUp && "wb-fadeTop", edges.canScrollDown && "wb-fadeBottom"),
10676
11252
  role: "tree",
10677
11253
  "aria-label": t("session.list.label")
10678
- }, rows.map((row) => /* @__PURE__ */ h(SessionRow, {
11254
+ }, rows.map((row) => /* @__PURE__ */ createElement(SessionRow, {
10679
11255
  key: row.id,
10680
11256
  node: sessionNode(row, statusById, list, pinned, archivedSet, longTasks.bySession),
10681
11257
  active: row.id === currentId,
@@ -10758,10 +11334,10 @@ function Sidebar(props) {
10758
11334
  });
10759
11335
  };
10760
11336
  const wide = !collapsed;
10761
- return /* @__PURE__ */ h("div", {
11337
+ return /* @__PURE__ */ createElement("div", {
10762
11338
  className: cx("wb-root", collapsed && "wb-collapsed"),
10763
11339
  "data-wb-where": board.path ?? void 0
10764
- }, /* @__PURE__ */ h(SidebarHeader, {
11340
+ }, /* @__PURE__ */ createElement(SidebarHeader, {
10765
11341
  collapsed,
10766
11342
  wide,
10767
11343
  attention: attention.overall,
@@ -10769,10 +11345,10 @@ function Sidebar(props) {
10769
11345
  renderSlot,
10770
11346
  onToggle: props.toggleSidebar,
10771
11347
  onSelectPanel: props.selectPanel
10772
- }), /* @__PURE__ */ h("nav", {
11348
+ }), /* @__PURE__ */ createElement("nav", {
10773
11349
  className: "wb-panelList",
10774
11350
  "aria-label": t("panels.label")
10775
- }, panelEntries.map((entry) => /* @__PURE__ */ h(PanelRow, {
11351
+ }, panelEntries.map((entry) => /* @__PURE__ */ createElement(PanelRow, {
10776
11352
  key: entry.id,
10777
11353
  id: entry.id,
10778
11354
  label: panelLabel(entry),
@@ -10784,7 +11360,7 @@ function Sidebar(props) {
10784
11360
  size: isWide ? 16 : 18,
10785
11361
  active
10786
11362
  }, { only: id })
10787
- }))), wide ? /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(ProjectSwitcher, {
11363
+ }))), wide ? /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement(ProjectSwitcher, {
10788
11364
  items,
10789
11365
  current,
10790
11366
  attention,
@@ -10792,10 +11368,10 @@ function Sidebar(props) {
10792
11368
  onAdd: addProject,
10793
11369
  onRename: props.renameWorkspace,
10794
11370
  t
10795
- }), creating ? /* @__PURE__ */ h("p", {
11371
+ }), creating ? /* @__PURE__ */ createElement("p", {
10796
11372
  className: "wb-workspaceBusy",
10797
11373
  role: "status"
10798
- }, /* @__PURE__ */ h(Spinner, { size: 12 }), t("project.add.busy")) : null, createFailed ? /* @__PURE__ */ h("p", { className: "wb-workspaceError" }, t("project.add.failed")) : null) : /* @__PURE__ */ h(ProjectSwitcher, {
11374
+ }, /* @__PURE__ */ createElement(Spinner, { size: 12 }), t("project.add.busy")) : null, createFailed ? /* @__PURE__ */ createElement("p", { className: "wb-workspaceError" }, t("project.add.failed")) : null) : /* @__PURE__ */ createElement(ProjectSwitcher, {
10799
11375
  items,
10800
11376
  current,
10801
11377
  attention,
@@ -10804,7 +11380,7 @@ function Sidebar(props) {
10804
11380
  onAdd: addProject,
10805
11381
  onRename: props.renameWorkspace,
10806
11382
  t
10807
- }), /* @__PURE__ */ h(WorkspaceSection, {
11383
+ }), /* @__PURE__ */ createElement(WorkspaceSection, {
10808
11384
  t,
10809
11385
  wide,
10810
11386
  onNewSession: () => {
@@ -10817,7 +11393,7 @@ function Sidebar(props) {
10817
11393
  startSession
10818
11394
  });
10819
11395
  }
10820
- }), /* @__PURE__ */ h("div", { className: "wb-regionArea" }, wide ? /* @__PURE__ */ h(SessionList, {
11396
+ }), /* @__PURE__ */ createElement("div", { className: "wb-regionArea" }, wide ? /* @__PURE__ */ createElement(SessionList, {
10821
11397
  workspace: current,
10822
11398
  pinnedIds,
10823
11399
  archived,
@@ -10828,7 +11404,41 @@ function Sidebar(props) {
10828
11404
  onOpen: props.openSession,
10829
11405
  renderSlot,
10830
11406
  t
10831
- }) : null), /* @__PURE__ */ h("div", { className: "wb-footArea" }, /* @__PURE__ */ h("div", { className: "wb-footerActions" }, renderSlot("sidebar.footer.action", { wide })), /* @__PURE__ */ h("div", { className: "wb-settingsArea" }, renderSlot("sidebar.settings", { wide }))));
11407
+ }) : null), /* @__PURE__ */ createElement("div", { className: "wb-footArea" }, /* @__PURE__ */ createElement("div", { className: "wb-footerActions" }, renderSlot("sidebar.footer.action", { wide })), /* @__PURE__ */ createElement("div", { className: "wb-settingsArea" }, renderSlot("sidebar.settings", { wide }))));
11408
+ }
11409
+ var LongTaskDot_module_default = {
11410
+ dot: "_dot_14w1n_1",
11411
+ hover: "_hover_14w1n_6"
11412
+ };
11413
+ //#endregion
11414
+ //#region src/app/layouts/sidebar/LongTaskDot.tsx
11415
+ /**
11416
+ * 会话行前面那颗「长任务还在跑」的点;两种左栏共用同一个 `sidebar.session.row.leading` 座位。
11417
+ * @param props.sessionId - 这一行的会话。
11418
+ * @param props.t - 词表(只在提示里用)。
11419
+ * @returns 有长任务时一个状态点,否则 `null`。
11420
+ */
11421
+ function LongTaskDot({ sessionId, t }) {
11422
+ if (!useLongTaskPresence().bySession.has(sessionId)) return null;
11423
+ return /* @__PURE__ */ createElement(Tip, { label: t("status.longTask") }, /* @__PURE__ */ createElement("span", {
11424
+ className: LongTaskDot_module_default.dot,
11425
+ role: "img",
11426
+ "aria-label": t("status.longTask")
11427
+ }, /* @__PURE__ */ createElement(StateDot, { state: "ongoing" })));
11428
+ }
11429
+ //#endregion
11430
+ //#region src/app/layouts/sidebar/LongTaskHover.tsx
11431
+ /**
11432
+ * 悬停卡里那行「长任务在跑」;两种左栏共用一个 `sidebar.session.row.hover` 座位。
11433
+ * @param props.sessionId - 这一行的会话。
11434
+ * @param props.t - 词表。
11435
+ * @returns 有长任务时一行灰字,否则 `null`。
11436
+ */
11437
+ function LongTaskHover({ sessionId, t }) {
11438
+ const edition = useRuntimeSidebarEdition();
11439
+ const presence = useLongTaskPresence();
11440
+ if (edition !== "official" || !presence.bySession.has(sessionId)) return null;
11441
+ return /* @__PURE__ */ createElement("div", { className: LongTaskDot_module_default.hover }, /* @__PURE__ */ createElement(StateDot, { state: "ongoing" }), /* @__PURE__ */ createElement("span", null, t("status.longTask")));
10832
11442
  }
10833
11443
  //#endregion
10834
11444
  //#region src/shared/styles/rightbar.css?raw
@@ -11030,6 +11640,30 @@ function useBlockerActions(onRetry, onOpenMarket) {
11030
11640
  failure
11031
11641
  };
11032
11642
  }
11643
+ //#endregion
11644
+ //#region src/shared/components/blocker-action.ts
11645
+ /**
11646
+ * 这颗钮此刻该不该按成等待态:这一轮忙还没收,或有一支正在跑。
11647
+ * @param busy - 这一轮忙是不是还在。
11648
+ * @param running - 正在跑的那一支的 label;没有就给 `null`。
11649
+ * @returns 该等待给 `true`,否则 `false`。
11650
+ */
11651
+ function blockerPending(busy, running) {
11652
+ return busy || running !== null;
11653
+ }
11654
+ /**
11655
+ * 这颗钮此刻该显示什么字:正在重试说「重试中…」,正在跑的那一支说「修复中…」,刚复制过的说「已复制」,其余原样。
11656
+ * @param action - 这颗钮的形状(行为 + 平时文案)。
11657
+ * @param state - 此刻的运行态。
11658
+ * @param t - i18n 取词函数。
11659
+ * @returns 要显示的文案;三种临时态都不成立时就是 `action.label`。
11660
+ */
11661
+ function blockerActionLabel(action, state, t) {
11662
+ if (action.kind === "retry" && state.retrying) return t("blocker.retry.running");
11663
+ if (state.running === action.label) return t("blocker.fix.running");
11664
+ if (action.kind === "copy" && state.copied === action.text) return t("env.copied");
11665
+ return action.label;
11666
+ }
11033
11667
  var BlockerState_module_default = {
11034
11668
  blocker: "_blocker_1oaj0_1",
11035
11669
  icon: "_icon_1oaj0_10",
@@ -11067,7 +11701,7 @@ function BlockerState({ blocker, t, onRetry, busy = false, flush = false, onOpen
11067
11701
  const pending = blockerPending(busy, running);
11068
11702
  const inlineActions = blocker.actions.filter((action) => action.kind === "open-url" && action.inline === true);
11069
11703
  const buttonActions = blocker.actions.filter((action) => !(action.kind === "open-url" && action.inline === true) || blocker.hint === void 0);
11070
- const buttons = buttonActions.map((action, index) => /* @__PURE__ */ h(Button, {
11704
+ const buttons = buttonActions.map((action, index) => /* @__PURE__ */ createElement(Button, {
11071
11705
  key: `${action.kind}:${action.label}`,
11072
11706
  type: "button",
11073
11707
  size: "sm",
@@ -11079,35 +11713,35 @@ function BlockerState({ blocker, t, onRetry, busy = false, flush = false, onOpen
11079
11713
  running,
11080
11714
  copied
11081
11715
  }, t)));
11082
- const failureBlock = failure === null ? null : /* @__PURE__ */ h("p", { className: BlockerState_module_default.failure }, t("blocker.fix.failed"), failure.message, failure.detail === void 0 ? null : /* @__PURE__ */ h("span", { className: BlockerState_module_default.failureDetail }, failure.detail));
11083
- if (blocker.severity === "notice") return /* @__PURE__ */ h("div", {
11716
+ const failureBlock = failure === null ? null : /* @__PURE__ */ createElement("p", { className: BlockerState_module_default.failure }, t("blocker.fix.failed"), failure.message, failure.detail === void 0 ? null : /* @__PURE__ */ createElement("span", { className: BlockerState_module_default.failureDetail }, failure.detail));
11717
+ if (blocker.severity === "notice") return /* @__PURE__ */ createElement("div", {
11084
11718
  className: `${BlockerState_module_default.notice}${flush ? ` ${BlockerState_module_default.noticeFlat}` : ""}`,
11085
11719
  role: "status",
11086
11720
  "aria-busy": pending
11087
- }, /* @__PURE__ */ h("span", { className: BlockerState_module_default.noticeText }, /* @__PURE__ */ h("span", { className: BlockerState_module_default.noticeTitle }, blocker.title), blocker.hint === void 0 ? null : /* @__PURE__ */ h("span", { className: BlockerState_module_default.noticeHint }, blocker.hint)), /* @__PURE__ */ h("span", { className: BlockerState_module_default.noticeActions }, buttons), failureBlock);
11088
- return /* @__PURE__ */ h("div", {
11721
+ }, /* @__PURE__ */ createElement("span", { className: BlockerState_module_default.noticeText }, /* @__PURE__ */ createElement("span", { className: BlockerState_module_default.noticeTitle }, blocker.title), blocker.hint === void 0 ? null : /* @__PURE__ */ createElement("span", { className: BlockerState_module_default.noticeHint }, blocker.hint)), /* @__PURE__ */ createElement("span", { className: BlockerState_module_default.noticeActions }, buttons), failureBlock);
11722
+ return /* @__PURE__ */ createElement("div", {
11089
11723
  className: `${BlockerState_module_default.blocker}${flush ? ` ${BlockerState_module_default.blockerInline}` : ""}`,
11090
11724
  role: "status",
11091
11725
  "aria-busy": pending
11092
- }, flush ? null : /* @__PURE__ */ h("span", {
11726
+ }, flush ? null : /* @__PURE__ */ createElement("span", {
11093
11727
  className: BlockerState_module_default.icon,
11094
11728
  "aria-hidden": "true"
11095
- }, /* @__PURE__ */ h(IconBrandMark, { size: 32 })), /* @__PURE__ */ h("p", { className: BlockerState_module_default.title }, blocker.title), blocker.hint === void 0 && inlineActions.length === 0 ? null : /* @__PURE__ */ h("p", { className: BlockerState_module_default.hint }, blocker.hint, inlineActions.map((action) => /* @__PURE__ */ h("button", {
11729
+ }, /* @__PURE__ */ createElement(IconBrandMark, { size: 32 })), /* @__PURE__ */ createElement("p", { className: BlockerState_module_default.title }, blocker.title), blocker.hint === void 0 && inlineActions.length === 0 ? null : /* @__PURE__ */ createElement("p", { className: BlockerState_module_default.hint }, blocker.hint, inlineActions.map((action) => /* @__PURE__ */ createElement("button", {
11096
11730
  key: `inline:${action.kind}:${action.label}`,
11097
11731
  type: "button",
11098
11732
  className: `wb-link ${BlockerState_module_default.inlineAction}`,
11099
11733
  disabled: pending,
11100
11734
  onClick: () => run(action)
11101
- }, action.label, /* @__PURE__ */ h(IconRightUpOutlineRegular, { size: 12 })))), buttonActions.length === 0 ? null : /* @__PURE__ */ h("div", { className: BlockerState_module_default.actions }, buttons), failureBlock, blocker.detail === void 0 ? null : /* @__PURE__ */ h(DisclosureRow, {
11735
+ }, action.label, /* @__PURE__ */ createElement(IconRightUpOutlineRegular, { size: 12 })))), buttonActions.length === 0 ? null : /* @__PURE__ */ createElement("div", { className: BlockerState_module_default.actions }, buttons), failureBlock, blocker.detail === void 0 ? null : /* @__PURE__ */ createElement(DisclosureRow, {
11102
11736
  className: BlockerState_module_default.raw,
11103
- icon: /* @__PURE__ */ h(IconInfoOutlineRegular, { size: 14 }),
11737
+ icon: /* @__PURE__ */ createElement(IconInfoOutlineRegular, { size: 14 }),
11104
11738
  title: t("env.fix.details"),
11105
11739
  open: rawOpen,
11106
11740
  expandable: true,
11107
11741
  expandOnRowClick: true,
11108
11742
  previewChevron: true,
11109
11743
  onToggle: () => setRawOpen(!rawOpen)
11110
- }, /* @__PURE__ */ h(CodeBlock, {
11744
+ }, /* @__PURE__ */ createElement(CodeBlock, {
11111
11745
  code: blocker.detail,
11112
11746
  className: BlockerState_module_default.rawText,
11113
11747
  copyLabel: t("blocker.copy"),
@@ -11171,6 +11805,7 @@ var kit = {
11171
11805
  api: {
11172
11806
  apiGet,
11173
11807
  apiPost,
11808
+ factOfRoute,
11174
11809
  ...context_chips_exports
11175
11810
  },
11176
11811
  lib: {
@@ -11211,7 +11846,7 @@ function messagesOf(units) {
11211
11846
  ...face.messages === void 0 ? {} : { messages: face.messages }
11212
11847
  }));
11213
11848
  }
11214
- var COMPONENT_CSS_MARKER = "\n.wb-activityBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding-top: var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-activityBlock:first-child {\n padding-top: 0;\n border-top: none;\n}\n\n.wb-activityBlockHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8);\n}\n\n.wb-activityLine {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-activityLineText {\n flex: none;\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n max-height: var(--wb-len-72);\n overflow-y: auto;\n}\n\n.wb-activityLineAt {\n flex: none;\n margin-left: auto;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-16);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-activityLine > .wb-activityLineAt,\n.wb-activityLine > .wb-activityLineActions {\n margin-left: auto;\n}\n\n.wb-activityLine > .wb-activityLineAt + .wb-activityLineActions {\n margin-left: 0;\n}\n\n.wb-activityLineActions {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n.wb-activityActionFailed {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-note {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-problem {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-approvalCommand {\n max-width: 100%;\n}\n.wb-approvalPlan {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-approvalHint {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n.wb-approvalRows {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n}\n.wb-approvalRow {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n.wb-approvalLabel {\n flex: none;\n width: var(--wb-len-56);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-approvalValue {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-approvalWarn {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-8) var(--wb-card-gutter);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-cardTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardMeta {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-cardMeta::before {\n content: '\\00b7';\n margin-right: var(--wb-len-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen ~ .wb-cardRefresh {\n margin-left: 0;\n}\n\n.wb-cardOpen:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh {\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardRefresh:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-cardGear {\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-3);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardGear:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-card {\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n flex: none;\n}\n.wb-cardBody {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-card-gutter);\n font-size: var(--dsw-font-xxs-12-font-size);\n}\n.wb-cardBleed {\n margin-inline: calc(-1 * var(--wb-card-gutter));\n}\n._anchor_yq4s2_1 {\n display: contents;\n}\n\n.wb-spinner {\n display: inline-flex;\n align-items: center;\n flex: none;\n}\n\n.wb-choiceMenu {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n background: transparent;\n}\n\n.wb-choiceMenu[data-variant='boxed'] {\n padding: var(--wb-len-4);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n}\n\n.wb-choiceOption {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: pointer;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-choiceOptionOn {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-checkbox {\n position: absolute;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.wb-checkboxBox {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xs);\n corner-shape: round;\n color: var(--dsw-alias-label-primary-foreground);\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-choiceOption:hover .wb-checkboxBox {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-checkbox:checked + .wb-checkboxBox {\n border-color: var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n}\n\n.wb-checkbox:disabled + .wb-checkboxBox {\n cursor: default;\n}\n\n.wb-checkbox:focus-visible + .wb-checkboxBox {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}\n\n.wb-choiceOption:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-choiceOption:has(:disabled) {\n cursor: default;\n opacity: 0.5;\n}\n\n.wb-choiceOption:has(:disabled),\n.wb-choiceOption:has(:disabled):hover {\n background: transparent;\n}\n\n.wb-choiceLabel {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.wb-choiceLabelText {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-choiceLabel:has(.wb-choiceDescription) .wb-choiceLabelText {\n overflow: visible;\n white-space: normal;\n overflow-wrap: anywhere;\n}\n\n.wb-choiceDescription {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n.wb-choiceLoading {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-choiceLoadingText {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-choiceEmpty {\n display: flex;\n align-items: center;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio {\n appearance: none;\n -webkit-appearance: none;\n flex: none;\n box-sizing: border-box;\n width: var(--wb-len-12);\n height: var(--wb-len-12);\n margin: 0;\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: 50%;\n corner-shape: round;\n background-color: transparent;\n cursor: pointer;\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-radio:not(:checked):hover {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio:checked {\n border-color: var(--dsw-alias-brand-primary);\n background-image: radial-gradient(\n circle at center,\n var(--dsw-alias-brand-primary) 0 3px,\n transparent 3px\n );\n}\n\n.wb-radio:disabled {\n cursor: default;\n}\n\n.wb-radio:focus-visible {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}.wb-formActions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n}\n\n.wb-formActionDanger {\n color: var(--dsw-alias-state-error-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent);\n}\n.wb-rows {\n display: grid;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n column-gap: var(--wb-len-8);\n}\n.wb-rows > :not(.wb-row) {\n grid-column: 1 / -1;\n}\n.wb-row {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n align-items: baseline;\n gap: var(--wb-len-8);\n padding: var(--wb-len-4) 0;\n}\n.wb-row + .wb-row {\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n.wb-rowKey {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-rowValue {\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-rows > .wb-row {\n grid-template-columns: subgrid;\n}\n\n@supports not (grid-template-columns: subgrid) {\n .wb-rows > .wb-row {\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n }\n}\n.wb-confirmBar {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n width: 100%;\n box-sizing: border-box;\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-1);\n}\n.wb-confirmBarTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 600;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-confirmBarHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n.wb-field {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n.wb-fieldLabel {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-fieldHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-field:has(:disabled) .wb-fieldLabel {\n opacity: 0.4;\n}\n.wb-formRows {\n display: grid;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n column-gap: var(--wb-len-8);\n row-gap: var(--wb-len-12);\n}\n\n.wb-formRows > :not(.wb-formRow) {\n grid-column: 1 / -1;\n}\n\n.wb-formRow {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n align-items: center;\n column-gap: var(--wb-len-8);\n row-gap: var(--wb-len-8);\n}\n\n.wb-formRow[data-layout='stacked'] {\n grid-template-columns: minmax(0, 1fr);\n align-items: stretch;\n gap: var(--wb-len-6);\n}\n\n.wb-formRows > .wb-formRow[data-layout='stacked'] {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.wb-formLabel {\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: nowrap;\n}\n\n.wb-formRow[data-layout='stacked'] .wb-formLabel {\n white-space: normal;\n}\n\n.wb-formRow[data-layout='stacked'] .wb-formHint,\n.wb-formRow[data-layout='stacked'] .wb-formProblem {\n grid-column: 1 / -1;\n}\n\n.wb-formControl {\n display: flex;\n align-items: center;\n min-width: 0;\n}\n\n.wb-formControl\n > :where(\n .wb-selectAnchor,\n .wb-choiceMenu,\n input:not(\n [type='checkbox'],\n [type='radio'],\n [type='button'],\n [type='submit'],\n [type='reset'],\n [type='image'],\n [type='color'],\n [type='range']\n ),\n select,\n textarea\n ) {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n}\n\n.wb-formHint {\n grid-column: 2;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-formProblem {\n grid-column: 2;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-formRow:has(.wb-formProblem) .wb-formLabel {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-formRow:has(:disabled) .wb-formLabel {\n opacity: 0.4;\n}\n\n.wb-formRows > .wb-formRow {\n grid-template-columns: subgrid;\n}\n\n@supports not (grid-template-columns: subgrid) {\n .wb-formRows > .wb-formRow {\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n }\n}\n.wb-form {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n width: 100%;\n}:where(.wb-link) {\n margin-left: var(--wb-len-2);\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n white-space: nowrap;\n vertical-align: baseline;\n}\n\n:where(.wb-link:hover) {\n text-decoration: underline;\n}\n\n:where(.wb-link:focus-visible) {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n.wb-longTask {\n padding-top: var(--wb-len-12);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n.wb-longTaskHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n}\n\n.wb-longTaskLink {\n flex: none;\n}\n\n.wb-longTaskHeadline {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-longTaskProblem {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-longTaskDump {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-longTaskDump pre {\n margin: var(--wb-len-4) 0 0;\n max-height: var(--wb-len-220);\n overflow: auto;\n}\n\n.wb-longTaskStop {\n display: inline-flex;\n flex: none;\n align-items: center;\n align-self: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n padding: 0;\n margin-left: auto;\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-specific-menu);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n.wb-longTaskStop:hover:not(:disabled),\n.wb-longTaskStop:focus-visible {\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-longTaskStop:disabled {\n cursor: default;\n}\n\n.wb-longTaskStopArmed,\n.wb-longTaskStopArmed:hover:not(:disabled),\n.wb-longTaskStopArmed:focus-visible {\n gap: var(--wb-len-4);\n width: auto;\n padding: 0 var(--wb-len-7);\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-longTaskStopLabel {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n.wb-longTaskStopWhy {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n.wb-centered.wb-centeredCompact {\n flex: none;\n min-height: 0;\n gap: var(--wb-len-8);\n padding: var(--wb-len-20) var(--wb-len-16);\n}\n\n.wb-centered.wb-centeredCompact .wb-centeredHero {\n margin-bottom: var(--wb-len-4);\n}\n\n.wb-skeleton {\n display: flex;\n flex-direction: column;\n}\n\n.wb-skeletonRow {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n}\n\n.wb-skeletonRow + .wb-skeletonRow::before {\n content: '';\n align-self: stretch;\n height: var(--wb-len-0-5);\n margin: 0 var(--wb-len-8) var(--wb-len-neg-0-5);\n background: var(--dsw-alias-border-l2);\n}\n\n.wb-skeletonBar {\n display: block;\n height: var(--wb-len-13);\n border-radius: var(--dsw-radius-xs);\n background: var(--dsw-alias-bg-skeleton);\n animation: wb-skeleton-pulse var(--wb-dur-1-4) var(--ds-ease-in-out) infinite;\n}\n\n.wb-skeletonBarTitle {\n width: 62%;\n}\n\n.wb-skeletonBarMeta {\n width: 32%;\n height: var(--wb-len-10);\n}\n\n.wb-skeletonRow:nth-child(2n) .wb-skeletonBarTitle {\n width: 74%;\n}\n\n.wb-skeletonRow:nth-child(3n) .wb-skeletonBarTitle {\n width: 52%;\n}\n\n@keyframes wb-skeleton-pulse {\n 50% {\n opacity: 0.45;\n }\n}\n\n.wb-centered {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: var(--wb-len-14);\n flex: 1;\n min-height: var(--wb-len-240);\n padding: 0 var(--wb-len-24) var(--wb-len-24);\n text-align: center;\n}\n\n.wb-centeredHero {\n display: flex;\n margin-bottom: var(--wb-len-16);\n color: var(--dsw-alias-label-dimmed);\n}\n\n.wb-centeredTitle {\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-centeredHint {\n max-width: var(--wb-len-300);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-centeredDetail {\n max-width: var(--wb-len-320);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-dimmed);\n word-break: break-all;\n}\n\n.wb-centeredAction {\n display: flex;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n@media (prefers-reduced-motion: reduce) {\n .wb-skeletonBar {\n animation: none;\n }}\n.wb-textField {\n box-sizing: border-box;\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n outline: none;\n}\n\n.wb-textField:focus {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-textField:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-textField[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-textField[aria-invalid='true']:focus {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n:where(.wb-textField) {\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n}\n:where(.wb-selectTrigger) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n text-align: left;\n cursor: pointer;\n}\n\n.wb-selectTrigger:focus-visible {\n outline: none;\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectTrigger[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-selectTrigger[aria-invalid='true']:focus-visible {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n.wb-selectTrigger:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-selectLoading:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: none;\n background: transparent;\n font-size: var(--wb-font-row);\n}\n\n.wb-selectGhost:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-selectGhost:focus-visible {\n outline: var(--dsw-focus-ring-width) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n border-color: transparent;\n box-shadow: none;\n}\n\n.wb-selectIconOnly {\n width: var(--wb-len-36);\n height: var(--wb-len-36);\n min-height: 0;\n gap: 0;\n padding: 0;\n justify-content: center;\n}\n\n.wb-selectReveal {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.wb-selectIconOnly .wb-selectIcon {\n width: 100%;\n height: 100%;\n}\n\n.wb-selectAnchor {\n display: block;\n width: 100%;\n}\n\n.wb-selectIcon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectValue {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n.wb-selectPlaceholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectChevron {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n}\n\n.wb-selectMenu {\n min-width: var(--wb-len-240);\n max-width: var(--wb-len-360);\n max-height: min(var(--wb-len-320), calc(100vh - var(--wb-len-24)));\n}\n\n:where(.wb-selectSearch) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n.wb-selectSearch:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectSearch.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-selectSearch.wb-selectGhost:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: none;\n}\n\n.wb-selectSearchIcon {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-textField.wb-selectSearchInput {\n flex: 1;\n min-width: 0;\n min-height: 0;\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.wb-textField.wb-selectSearchInput:focus {\n box-shadow: none;\n}\n\n.wb-selectFallback {\n width: 100%;\n}\n\n.wb-selectHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\nsection.wb-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-len-16);\n border: 0;\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-settings-card-fill);\n}\n.wb-settingsHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n.wb-settings .wb-settingsTitle {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-s-strong-14-font-size);\n line-height: var(--wb-line-24);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-stack {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n min-height: 0;\n}\n\n.wb-stateBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-stateBlockTitle {\n margin: 0;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n.wb-stateBlockHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-stateBlockActions {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n.wb-stateBlockResolving {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n._marketList_1rftb_1 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._marketRow_1rftb_10 {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--wb-len-14);\n row-gap: var(--wb-len-4);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-lg);\n}\n\n._marketIcon_1rftb_20 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-40);\n height: var(--wb-len-40);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketMain_1rftb_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_1rftb_39 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketDesc_1rftb_48 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketUsedBy_1rftb_59 {\n margin-left: var(--wb-len-8);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n opacity: 0.75;\n}\n\n._marketUsedBy_1rftb_59::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_1rftb_39 ._marketVersion_1rftb_73 {\n margin-left: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n}\n\n._marketVersion_1rftb_73 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_1rftb_73::before {\n content: '';\n display: inline-block;\n width: var(--wb-len-1);\n height: var(--wb-len-10);\n margin: 0 var(--wb-len-8) 0 var(--wb-len-2);\n vertical-align: -1px;\n background: var(--dsw-alias-border-l2);\n}\n\n._marketLocalTag_1rftb_95 {\n margin-left: var(--wb-len-8);\n padding: 0 var(--wb-len-6);\n border: var(--wb-len-1) solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n}\n\n._marketEnd_1rftb_106 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_1rftb_113 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_1rftb_113::before {\n content: '';\n width: 0;\n height: var(--wb-len-14);\n border-left: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketActions_1rftb_126 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_1rftb_132 {\n color: var(--dsw-alias-state-warn-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._marketSelfDivider_1rftb_138 {\n height: 0;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_1rftb_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_1rftb_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_1rftb_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_1rftb_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_1rftb_169 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionQuiet_1rftb_175 ._marketSectionTitle_1rftb_163 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSectionQuiet_1rftb_175 ._marketName_1rftb_39 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSectionQuiet_1rftb_175 ._marketDesc_1rftb_48 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._marketSectionQuiet_1rftb_175 ._marketIcon_1rftb_20 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n\n._marketProgress_1rftb_192 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-height: var(--wb-len-32);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketNote_1rftb_202 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-warn-primary);\n overflow-wrap: anywhere;\n}\n\n._marketNotePlain_1rftb_209 {\n grid-column: 2 / -1;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n overflow-wrap: anywhere;\n}\n\n._marketFailure_1rftb_217 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._marketEmpty_1rftb_224 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_1rftb_229 {\n box-sizing: border-box;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-32);\n padding: 0 clamp(var(--wb-len-24), 4vw, var(--wb-len-48)) var(--wb-len-48);\n overflow-x: hidden;\n overflow-y: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_1rftb_229 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_1rftb_247 {\n box-sizing: border-box;\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-16);\n padding-top: var(--wb-len-28);\n}\n\n._marketPageTitle_1rftb_255 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_1rftb_260 {\n margin: var(--wb-len-4) 0 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketPageTools_1rftb_266 {\n flex: none;\n align-self: center;\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--wb-len-16);\n}\n\n._marketIconButton_1rftb_275 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n color: var(--dsw-alias-label-caption);\n cursor: pointer;\n}\n\n._marketIconButton_1rftb_275:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_1rftb_275:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_1rftb_300 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_1rftb_304 svg {\n animation: _wb-spin_1rftb_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_1rftb_308 {\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n border-radius: var(--dsw-radius-md);\n}\n\n._marketEmpty_1rftb_224 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-64) var(--wb-len-16);\n text-align: center;\n}\n\n._marketChecking_1rftb_325 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketEmptyTitle_1rftb_333 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_1rftb_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._foot_1ud1j_1 {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._footText_1ud1j_13 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1ud1j_18 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._wide_1lv8f_1 {\n justify-content: center;\n width: 100%;\n height: var(--wb-len-40);\n border-radius: var(--dsw-radius-md);\n}\n\n._dialog_1lv8f_8 {\n width: min(var(--wb-len-560), 100%);\n max-height: min(var(--wb-len-800), 100%);\n}\n\n._content_1lv8f_13 {\n min-height: 0;\n overflow: auto;\n}\n\n._stack_1lv8f_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._body_1lv8f_25 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._field_1lv8f_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._input_1lv8f_39 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-14);\n}\n\n._registryField_1lv8f_45 {\n height: var(--wb-len-32);\n margin-left: var(--wb-len-26);\n padding: 0 var(--wb-len-10);\n}\n\n._options_1lv8f_51 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8) var(--wb-len-12);\n}\n\n._guideToggle_1lv8f_59 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-4);\n align-self: flex-start;\n margin-top: var(--wb-len-4);\n padding: 0;\n border: 0;\n background: transparent;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._guideToggle_1lv8f_59:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._guideToggle_1lv8f_59 svg,\n._registryToggle_1lv8f_78 svg {\n transition: transform var(--wb-dur-0-12) ease;\n}\n\n._guideToggle_1lv8f_59[aria-expanded='true'] svg,\n._registryToggle_1lv8f_78[aria-expanded='true'] svg {\n transform: rotate(180deg);\n}\n\n._registryWrap_1lv8f_87 {\n position: relative;\n flex: none;\n}\n\n._registryToggle_1lv8f_78 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n height: var(--wb-len-26);\n padding: 0 var(--wb-len-8) 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n font: inherit;\n font-size: var(--wb-font-12-5);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._registryToggle_1lv8f_78:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._registryToggle_1lv8f_78:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n._registryToggle_1lv8f_78[aria-expanded='true'] {\n border-color: var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n._registryChosen_1lv8f_121 {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n._registry_1lv8f_45 {\n position: fixed;\n z-index: var(--wb-z-1100);\n box-sizing: border-box;\n width: min(var(--wb-len-440), 100vw - var(--wb-len-24));\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-12);\n border: 0;\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-2);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l3);\n box-shadow: var(--dsw-elevation-prominent);\n}\n\n._registryOption_1lv8f_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid transparent;\n border-radius: var(--dsw-radius-lg);\n cursor: pointer;\n}\n\nlabel._registryOption_1lv8f_143 {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wb-len-10);\n}\n\n._registryPick_1lv8f_159 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n cursor: pointer;\n}\n\n._registryOption_1lv8f_143[data-checked='true'] {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 40%, transparent);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._registryOption_1lv8f_143 input[type='radio'] {\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: var(--wb-len-2) 0 0;\n accent-color: var(--dsw-alias-brand-primary);\n}\n\n._registryTitle_1lv8f_179 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n font: var(--dsw-font-xs-13);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n._registryHint_1lv8f_189 {\n margin-left: var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._inputError_1lv8f_197 {\n margin: var(--wb-len-neg-4) 0 0 var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._guide_1lv8f_59 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._guideList_1lv8f_214 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._guideItem_1lv8f_223 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0;\n}\n\n._guideIndex_1lv8f_230 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n border-radius: var(--wb-radius-pill);\n corner-shape: round;\n background: var(--dsw-alias-bg-module-platform);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._guideMain_1lv8f_244 {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0;\n min-width: 0;\n}\n\n._guideTitle_1lv8f_252 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._guideHint_1lv8f_258 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._guideExample_1lv8f_264 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._guideExample_1lv8f_264 code {\n font-family: var(--dsw-font-mono, monospace);\n}\n\n._guideExampleLabel_1lv8f_274 {\n color: var(--dsw-alias-label-caption);\n}\n\n._footer_1lv8f_278 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-20);\n width: 100%;\n}\n\n._hero_1lv8f_285 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0 var(--wb-len-4);\n text-align: center;\n}\n\n._heroIcon_1lv8f_294 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-44);\n height: var(--wb-len-44);\n color: var(--dsw-alias-label-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='done'] {\n color: var(--dsw-alias-state-success-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='error'] {\n color: var(--dsw-alias-state-warn-label);\n}\n\n._pendingTitle_1lv8f_311 {\n margin: 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n._wizardTitle_1lv8f_319 {\n margin: 0;\n font-size: var(--wb-font-18);\n line-height: var(--wb-len-26);\n font-weight: 600;\n}\n\n._subject_1lv8f_326 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\n text-align: center;\n}\n\n._subjectName_1lv8f_337 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n overflow-wrap: anywhere;\n}\n\n._subjectMeta_1lv8f_343,\n._subjectDesc_1lv8f_344 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._result_1lv8f_351,\n._resultWarn_1lv8f_352 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-primary);\n}\n\n._resultWarn_1lv8f_352 {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n}\n\n._resultMeta_1lv8f_365 {\n margin: 0;\n padding: 0 var(--wb-len-12);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._approval_1lv8f_373 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-state-warn-primary);\n border-radius: var(--dsw-radius-lg);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._approvalTitle_1lv8f_383 {\n margin: 0;\n font: var(--dsw-font-s-14);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._approvalText_1lv8f_390 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._approvalCaution_1lv8f_396 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._note_1lv8f_403 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._noteWarn_1lv8f_410 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._noteError_1lv8f_414 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._problem_1lv8f_418 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._detailLabel_1lv8f_425 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._detail_1lv8f_425 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-3);\n font-family: var(--dsw-font-mono, monospace);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n._note_1enlz_1 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-8);\n margin: 0;\n padding: var(--wb-len-10) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-state-warn-tertiary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._note_1enlz_1 > svg {\n flex: none;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-state-warn-primary);\n}\n._slot_1t7dx_1 {\n display: flex;\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._slot_1t7dx_1 > * {\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._action_1t7dx_12 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex: 1 1 0;\n width: 100%;\n min-width: 0;\n min-height: var(--wb-len-36);\n margin: 0 var(--wb-len-2);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: default;\n overflow: hidden;\n gap: var(--wb-len-4);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n}\n\n._live_1t7dx_31 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._paused_1t7dx_35 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._trouble_1t7dx_39 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._pulse_1t7dx_43 {\n animation: _wb-debug-breathe_1t7dx_1 var(--wb-dur-1-5) var(--ds-ease-in-out, ease-in-out) infinite;\n}\n\n@keyframes _wb-debug-breathe_1t7dx_1 {\n 0%,\n 100% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0.35;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._pulse_1t7dx_43 {\n animation: none;\n }\n}\n\n._entry_1t7dx_64 {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._entryInner_1t7dx_71 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._acts_1t7dx_78 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-2);\n flex: none;\n}\n\n._act_1t7dx_12 {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: 0;\n border-radius: var(--dsw-radius-sm, var(--wb-len-6));\n flex: none;\n cursor: pointer;\n}\n\n._act_1t7dx_12:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._act_1t7dx_12:focus-visible {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n._actStop_1t7dx_110:hover,\n._actStop_1t7dx_110:focus-visible {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._actArmed_1t7dx_115,\n._actArmed_1t7dx_115:hover,\n._actArmed_1t7dx_115:focus-visible {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);\n width: auto;\n color: var(--dsw-alias-state-error-primary);\n gap: var(--wb-len-4);\n padding: 0 var(--wb-len-7);\n}\n\n._actLabel_1t7dx_125 {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n._entryLine_1t7dx_131 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._actionRail_1t7dx_138 {\n justify-content: center;\n flex: none;\n width: var(--wb-len-36);\n min-width: var(--wb-len-36);\n height: var(--wb-len-36);\n margin: 0;\n padding: 0;\n corner-shape: round;\n border-radius: 50%;\n}\n\n._card_1t7dx_150 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._cardTitle_1t7dx_156 {\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n}\n\n._cardNote_1t7dx_162 {\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n._slot_1gkj9_1 {\n display: flex;\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._slot_1gkj9_1 > * {\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._action_1gkj9_12 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex: 1 1 0;\n width: 100%;\n min-width: 0;\n min-height: var(--wb-len-36);\n margin: 0 var(--wb-len-2);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: default;\n overflow: hidden;\n gap: var(--wb-len-4);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n}\n\n._live_1gkj9_31 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._done_1gkj9_35 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._pulse_1gkj9_39 {\n animation: _wb-record-breathe_1gkj9_1 var(--wb-dur-1-5) var(--ds-ease-in-out, ease-in-out) infinite;\n}\n\n@keyframes _wb-record-breathe_1gkj9_1 {\n 0%,\n 100% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0.35;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._pulse_1gkj9_39 {\n animation: none;\n }\n}\n\n._entry_1gkj9_60 {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._entryInner_1gkj9_67 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._acts_1gkj9_74 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-2);\n flex: none;\n}\n\n._act_1gkj9_12 {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-22);\n padding: 0 var(--wb-len-7);\n border-radius: var(--dsw-radius-sm, var(--wb-len-6));\n flex: none;\n cursor: pointer;\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n._act_1gkj9_12:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._act_1gkj9_12:focus-visible {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n._entryLine_1gkj9_108 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._actionRail_1gkj9_115 {\n justify-content: center;\n flex: none;\n width: var(--wb-len-36);\n min-width: var(--wb-len-36);\n height: var(--wb-len-36);\n margin: 0;\n padding: 0;\n corner-shape: round;\n border-radius: 50%;\n}\n\n._card_1gkj9_127 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._cardTitle_1gkj9_133 {\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n}\n\n._cardNote_1gkj9_139 {\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n._body_lw2ph_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._lead_lw2ph_7 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._sources_lw2ph_14 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._sourcesLabel_lw2ph_21 {\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-secondary);\n}\n\nbutton._sourceOn_lw2ph_26 {\n border-color: var(--dsw-alias-brand-primary);\n}\n._sourceCount_lw2ph_29 {\n margin-left: var(--wb-len-4);\n font-variant-numeric: tabular-nums;\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._reading_lw2ph_36 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._status_lw2ph_42 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failure_lw2ph_52 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n column-gap: var(--wb-len-10);\n row-gap: var(--wb-len-2);\n color: var(--dsw-alias-state-error-primary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n\n._failureTitle_lw2ph_62 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._failureHint_lw2ph_69 {\n grid-column: 1;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failureAction_lw2ph_74 {\n grid-column: 2;\n grid-row: 1;\n justify-self: end;\n}\n\n._rows_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._row_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-settings-card-stroke);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-settings-card-fill);\n}\n\n._head_lw2ph_99 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._pick_lw2ph_106 {\n flex: 0 1 auto;\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._pick_lw2ph_106 > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._code_lw2ph_118 {\n --dsl-code-block-background: var(--dsw-alias-bg-layer-1);\n margin: 0;\n}\n\n._missing_lw2ph_123,\n._conflict_lw2ph_124 {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._foot_lw2ph_130 {\n display: flex;\n justify-content: flex-end;\n}\n._actions_jlw8j_1[hidden],\n._progress_jlw8j_2[hidden],\n._commandRow_jlw8j_3[hidden],\n._bridge_jlw8j_4[hidden],\n._raw_jlw8j_5[hidden] {\n display: none;\n}\n\n._gate_jlw8j_9 {\n position: fixed;\n inset: 0;\n z-index: var(--wb-z-top);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--wb-len-24);\n background: var(--dsw-alias-bg-base);\n}\n\n._card_jlw8j_20 {\n width: 100%;\n max-width: var(--wb-len-420);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-16);\n text-align: center;\n}\n\n._card_jlw8j_20:has(._actions_jlw8j_1:not([hidden])),\n._card_jlw8j_20:has(._bridge_jlw8j_4:not([hidden])) {\n max-width: var(--wb-len-520);\n}\n\n._title_jlw8j_35 {\n margin: 0;\n font-size: var(--dsw-font-base-16-font-size);\n line-height: var(--wb-line-24);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._steps_jlw8j_50 {\n list-style: none;\n margin: var(--wb-len-6) 0 0;\n padding: 0;\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n text-align: left;\n}\n\n._step_jlw8j_50 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-6) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._step_jlw8j_50[data-status='running'] {\n color: var(--dsw-alias-label-primary);\n}\n\n._mark_jlw8j_77 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-14);\n height: var(--wb-len-14);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._step_jlw8j_50[data-status='ok'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._step_jlw8j_50[data-status='warn'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._step_jlw8j_50[data-status='failed'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._label_jlw8j_102 {\n flex: none;\n}\n\n._detail_jlw8j_106 {\n margin-left: auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._progress_jlw8j_2 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._elapsed_jlw8j_124 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._error_jlw8j_132 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n max-height: var(--wb-len-120);\n overflow: auto;\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n white-space: pre-wrap;\n word-break: break-all;\n text-align: left;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._commandRow_jlw8j_3 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n margin: 0 0 var(--wb-len-8);\n padding-right: var(--wb-len-4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._copy_jlw8j_158 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n padding: 0;\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._copy_jlw8j_158:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._command_jlw8j_3 {\n flex: 1;\n min-width: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-primary);\n}\n\n._buttons_jlw8j_191 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-12);\n}\n\n._mockSlot_jlw8j_198 {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n justify-content: center;\n background: var(--dsw-alias-bg-base);\n}\n\n._button_jlw8j_191 {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n._button_jlw8j_191:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._button_jlw8j_191:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n._actions_jlw8j_1,\n._bridge_jlw8j_4 {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-4);\n padding: var(--wb-len-14) var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-1);\n text-align: left;\n}\n\n._fixTitle_jlw8j_249 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._actions_jlw8j_1 ._hint_jlw8j_43,\n._bridge_jlw8j_4 ._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._actions_jlw8j_1 ._commandRow_jlw8j_3,\n._bridge_jlw8j_4 ._commandRow_jlw8j_3 {\n margin: 0;\n}\n\n._actions_jlw8j_1 ._buttons_jlw8j_191,\n._bridge_jlw8j_4 ._buttons_jlw8j_191 {\n justify-content: flex-start;\n}\n\n._raw_jlw8j_5 {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._rawSummary_jlw8j_282 {\n cursor: pointer;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._actions_jlw8j_1 ._error_jlw8j_132,\n._bridge_jlw8j_4 ._error_jlw8j_132 {\n margin-top: var(--wb-len-6);\n}\n\n._bridgeLines_jlw8j_292 {\n margin: 0;\n padding-left: var(--wb-len-18);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._bridgeLine_jlw8j_292 a {\n display: block;\n margin-top: var(--wb-len-4);\n width: fit-content;\n}\n\n._link_jlw8j_309 {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n\n._link_jlw8j_309::after {\n content: '↗';\n margin-left: var(--wb-len-2);\n}\n\n._link_jlw8j_309:hover {\n text-decoration: underline;\n}\n\n._loading_jlw8j_323 {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._loading_jlw8j_323[hidden] {\n display: none;\n}\n\n._loadingMotion_jlw8j_332 {\n transform-origin: center;\n animation: _wb-spin_jlw8j_1 var(--wb-dur-1-5) linear infinite;\n}\n\n._loadingTrack_jlw8j_337,\n._loadingArc_jlw8j_338 {\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n}\n\n._loadingTrack_jlw8j_337 {\n opacity: 0.25;\n}\n\n._loadingArc_jlw8j_338 {\n stroke-dasharray: 12 150;\n animation: _wb-dash_jlw8j_1 var(--wb-dur-1-5) ease-in-out infinite;\n}\n\n@keyframes _wb-spin_jlw8j_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes _wb-dash_jlw8j_1 {\n 0% {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n 50% {\n stroke-dasharray: 24 150;\n stroke-dashoffset: -6;\n }\n to {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._loadingMotion_jlw8j_332,\n ._loadingArc_jlw8j_338 {\n animation: none;\n }\n}\n._group_1hxis_1 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n}\n\n._button_1hxis_7 {\n flex: none;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n}\n\n._button_1hxis_7:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._active_1hxis_19 {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._icon_1hxis_23 {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n._icon_1hxis_23 svg {\n display: block;\n width: var(--wb-len-15);\n height: var(--wb-len-15);\n}\n\n._mirror_1hxis_35 {\n transform: scaleX(-1);\n}\n._stripTabs_1dqp4_1 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n min-width: 0;\n overflow: hidden;\n}\n\n._tab_1dqp4_9 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: none;\n font: inherit;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-16);\n max-width: 100%;\n}\n\n._tabActive_1dqp4_25 {\n color: var(--dsw-alias-label-primary);\n}\n\n._tabQuiet_1dqp4_29 {\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._tabQuiet_1dqp4_29:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._tabTitle_1dqp4_39 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._sep_1dqp4_49 {\n flex: none;\n color: var(--dsw-alias-label-dimmed);\n}\n._trigger_15ptp_1 {\n display: flex;\n align-items: center;\n}\n\n._pop_15ptp_6 {\n position: absolute;\n top: calc(var(--wb-len-38) + var(--wb-len-8));\n right: var(--wb-len-6);\n z-index: var(--wb-z-30);\n width: min(var(--wb-len-360), calc(100% - var(--wb-len-12)));\n max-width: calc(100vw - var(--wb-len-48));\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-2);\n box-shadow: var(--dsw-shadow-lv3);\n overflow: hidden;\n}\n\n._head_15ptp_20 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10) var(--wb-len-12) var(--wb-len-9) var(--wb-len-14);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._title_15ptp_28 {\n flex: 1;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._rowControls_15ptp_36 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._reset_15ptp_43 {\n flex: none;\n padding: var(--wb-len-3) var(--wb-len-8);\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._reset_15ptp_43:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_15ptp_43:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_15ptp_65 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._row_15ptp_36 {\n position: relative;\n display: grid;\n grid-template-columns: 12px minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-sm);\n cursor: default;\n}\n\n._rowDragging_15ptp_85 {\n cursor: grabbing;\n}\n\n._rowBlocked_15ptp_89 {\n cursor: not-allowed;\n}\n\n._listDragging_15ptp_93 ._rowControls_15ptp_36 {\n pointer-events: none;\n}\n\n._row_15ptp_36:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOff_15ptp_101 {\n opacity: 0.55;\n}\n\n._rowOff_15ptp_101:hover {\n opacity: 1;\n}\n\n._rowOver_15ptp_109::before {\n content: '';\n position: absolute;\n top: var(--wb-len-neg-3);\n left: var(--wb-len-8);\n right: var(--wb-len-8);\n height: var(--wb-len-2);\n background: var(--dsw-alias-brand-primary);\n}\n\n._ghost_15ptp_119 {\n position: fixed;\n z-index: var(--wb-z-40);\n pointer-events: none;\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--wb-static-shadow-ghost);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n}\n\n._grip_15ptp_134 {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n text-align: center;\n color: var(--dsw-alias-label-tertiary);\n user-select: none;\n cursor: grab;\n touch-action: none;\n}\n\n._gripDragging_15ptp_144 {\n cursor: grabbing;\n}\n\n._gripBlocked_15ptp_148 {\n cursor: not-allowed;\n}\n\n._label_15ptp_152 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_15ptp_159 {\n min-width: 0;\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n\n._error_15ptp_170 {\n margin: 0;\n padding: 0 var(--wb-len-14) var(--wb-len-10);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._dep_15ptp_178 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n\n._group_15ptp_186 {\n padding-top: var(--wb-len-6);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._groupTitle_15ptp_191 {\n margin: 0;\n padding: var(--wb-len-2) var(--wb-len-8) 0 var(--wb-len-14);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n font-weight: 400;\n color: var(--dsw-alias-label-tertiary);\n}\n._panel_1whum_1 {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: var(--wb-z-10);\n visibility: hidden;\n}\n\n._panel_1whum_1[data-fullscreen] {\n z-index: var(--wb-z-40);\n}\n\n._panel_1whum_1[data-open] {\n visibility: visible;\n}\n\n._columns_1whum_18 {\n display: block;\n column-gap: var(--wb-len-12);\n}\n\n._cell_1whum_23 {\n display: flow-root;\n min-width: 0;\n break-inside: avoid;\n margin-bottom: var(--wb-len-12);\n}\n._root_1cmz0_1 {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}\n\n._rail_1cmz0_7 {\n margin: 0 0 var(--wb-len-4);\n}\n\n._glyphBox_1cmz0_11 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n}\n\n._glyph_1cmz0_11 {\n position: relative;\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._glyphActive_1cmz0_30 {\n color: var(--dsw-alias-state-business-primary);\n}\n\n._triggerName_1cmz0_34 {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n._dir_1cmz0_45 {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._name_1cmz0_53 {\n flex: 0 1 auto;\n max-width: 50%;\n font-size: var(--dsw-font-xxs-12-font-size);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._triggerName_1cmz0_34 ._name_1cmz0_53 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._row_1cmz0_66 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n width: 100%;\n min-width: 0;\n}\n\n._trailing_1cmz0_74 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n margin-inline-start: auto;\n}\n\n._trailing_1cmz0_74 ._rowAction_1cmz0_84 {\n width: var(--wb-len-20);\n min-width: var(--wb-len-20);\n height: var(--wb-len-20);\n min-height: var(--wb-len-20);\n padding: 0;\n border-radius: var(--dsw-radius-sm);\n}\n\n._row_1cmz0_66 ._name_1cmz0_53 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._current_1cmz0_97 {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-primary);\n}\n._dot_sosf1_1 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n._overlay_sosf1_8 {\n position: absolute;\n inset-block-start: var(--wb-len-neg-3);\n inset-inline-end: var(--wb-len-neg-3);\n}\n._tag_g9dg8_1 {\n flex: none;\n margin-inline-start: auto;\n}\n._dialog_1vye5_1 {\n width: min(var(--wb-len-420), 100%);\n}\n\n._stack_1vye5_5 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._input_1vye5_12 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-12);\n}\n\n._meta_1vye5_18 {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._blocker_1oaj0_1 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-20) var(--wb-len-16);\n text-align: center;\n}\n\n._icon_1oaj0_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_1oaj0_15 {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_1oaj0_23 {\n margin: 0;\n max-width: var(--wb-len-42em);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n text-wrap: pretty;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 {\n align-items: flex-start;\n gap: var(--wb-len-6);\n padding: var(--wb-len-4) 0 var(--wb-len-2);\n text-align: left;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._title_1oaj0_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._hint_1oaj0_23 {\n max-width: 100%;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._actions_1oaj0_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._raw_1oaj0_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_1oaj0_48 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-6);\n}\n\n._raw_1oaj0_52 {\n margin-top: var(--wb-len-10);\n width: 100%;\n max-width: var(--wb-len-360);\n text-align: left;\n}\n\n._notice_1oaj0_71 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n column-gap: var(--wb-len-10);\n margin: 0 0 var(--wb-len-10);\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-left: 2px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._notice_1oaj0_71._noticeFlat_1oaj0_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_1oaj0_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_1oaj0_98 {\n font-size: var(--wb-font-12-5);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._noticeHint_1oaj0_105 {\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._noticeActions_1oaj0_112 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin-top: var(--wb-len-neg-2);\n}\n\n._failure_1oaj0_119 {\n margin: var(--wb-len-8) 0 0;\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._failureDetail_1oaj0_127 {\n display: block;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-label-tertiary);\n white-space: pre-wrap;\n}\n\n._inlineAction_1oaj0_134 {\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n}\n\n._inlineAction_1oaj0_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n._rawText_1oaj0_146 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
11849
+ var COMPONENT_CSS_MARKER = "\n.wb-activityBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding-top: var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-activityBlock:first-child {\n padding-top: 0;\n border-top: none;\n}\n\n.wb-activityBlockHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8);\n}\n\n.wb-activityLine {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-activityLineText {\n flex: none;\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n max-height: var(--wb-len-72);\n overflow-y: auto;\n}\n\n.wb-activityLineAt {\n flex: none;\n margin-left: auto;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-16);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-activityLine > .wb-activityLineAt,\n.wb-activityLine > .wb-activityLineActions {\n margin-left: auto;\n}\n\n.wb-activityLine > .wb-activityLineAt + .wb-activityLineActions {\n margin-left: 0;\n}\n\n.wb-activityLineActions {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n.wb-activityActionFailed {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-note {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-problem {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-approvalCommand {\n max-width: 100%;\n}\n.wb-approvalPlan {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-approvalHint {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n.wb-approvalRows {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n}\n.wb-approvalRow {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n.wb-approvalLabel {\n flex: none;\n width: var(--wb-len-56);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-approvalValue {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-approvalWarn {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-8) var(--wb-card-gutter);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-cardTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardMeta {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-cardMeta::before {\n content: '\\00b7';\n margin-right: var(--wb-len-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen ~ .wb-cardRefresh {\n margin-left: 0;\n}\n\n.wb-cardOpen:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh {\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardRefresh:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-cardGear {\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-3);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardGear:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-card {\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n flex: none;\n}\n.wb-cardBody {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-card-gutter);\n font-size: var(--dsw-font-xxs-12-font-size);\n}\n.wb-cardBleed {\n margin-inline: calc(-1 * var(--wb-card-gutter));\n}\n._anchor_yq4s2_1 {\n display: contents;\n}\n\n.wb-spinner {\n display: inline-flex;\n align-items: center;\n flex: none;\n}\n\n.wb-choiceMenu {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n background: transparent;\n}\n\n.wb-choiceMenu[data-variant='boxed'] {\n padding: var(--wb-len-4);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n}\n\n.wb-choiceOption {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: pointer;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-choiceOptionOn {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-checkbox {\n position: absolute;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.wb-checkboxBox {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xs);\n corner-shape: round;\n color: var(--dsw-alias-label-primary-foreground);\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-choiceOption:hover .wb-checkboxBox {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-checkbox:checked + .wb-checkboxBox {\n border-color: var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n}\n\n.wb-checkbox:disabled + .wb-checkboxBox {\n cursor: default;\n}\n\n.wb-checkbox:focus-visible + .wb-checkboxBox {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}\n\n.wb-choiceOption:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-choiceOption:has(:disabled) {\n cursor: default;\n opacity: 0.5;\n}\n\n.wb-choiceOption:has(:disabled),\n.wb-choiceOption:has(:disabled):hover {\n background: transparent;\n}\n\n.wb-choiceLabel {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.wb-choiceLabelText {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-choiceLabel:has(.wb-choiceDescription) .wb-choiceLabelText {\n overflow: visible;\n white-space: normal;\n overflow-wrap: anywhere;\n}\n\n.wb-choiceDescription {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n.wb-choiceLoading {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-choiceLoadingText {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-choiceEmpty {\n display: flex;\n align-items: center;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio {\n appearance: none;\n -webkit-appearance: none;\n flex: none;\n box-sizing: border-box;\n width: var(--wb-len-12);\n height: var(--wb-len-12);\n margin: 0;\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: 50%;\n corner-shape: round;\n background-color: transparent;\n cursor: pointer;\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-radio:not(:checked):hover {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio:checked {\n border-color: var(--dsw-alias-brand-primary);\n background-image: radial-gradient(\n circle at center,\n var(--dsw-alias-brand-primary) 0 3px,\n transparent 3px\n );\n}\n\n.wb-radio:disabled {\n cursor: default;\n}\n\n.wb-radio:focus-visible {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}.wb-formActions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n}\n\n.wb-formActionDanger {\n color: var(--dsw-alias-state-error-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent);\n}\n.wb-rows {\n display: grid;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n column-gap: var(--wb-len-8);\n}\n.wb-rows > :not(.wb-row) {\n grid-column: 1 / -1;\n}\n.wb-row {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n align-items: baseline;\n gap: var(--wb-len-8);\n padding: var(--wb-len-4) 0;\n}\n.wb-row + .wb-row {\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n.wb-rowKey {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-rowValue {\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-rows > .wb-row {\n grid-template-columns: subgrid;\n}\n\n@supports not (grid-template-columns: subgrid) {\n .wb-rows > .wb-row {\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n }\n}\n.wb-confirmBar {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n width: 100%;\n box-sizing: border-box;\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-1);\n}\n.wb-confirmBarTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 600;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-confirmBarHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n.wb-field {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n.wb-fieldLabel {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-fieldHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-field:has(:disabled) .wb-fieldLabel {\n opacity: 0.4;\n}\n.wb-formRows {\n display: grid;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n column-gap: var(--wb-len-8);\n row-gap: var(--wb-len-12);\n}\n\n.wb-formRows > :not(.wb-formRow) {\n grid-column: 1 / -1;\n}\n\n.wb-formRow {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n align-items: center;\n column-gap: var(--wb-len-8);\n row-gap: var(--wb-len-8);\n}\n\n.wb-formRow[data-layout='stacked'] {\n grid-template-columns: minmax(0, 1fr);\n align-items: stretch;\n gap: var(--wb-len-6);\n}\n\n.wb-formRows > .wb-formRow[data-layout='stacked'] {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.wb-formLabel {\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: nowrap;\n}\n\n.wb-formRow[data-layout='stacked'] .wb-formLabel {\n white-space: normal;\n}\n\n.wb-formRow[data-layout='stacked'] .wb-formHint,\n.wb-formRow[data-layout='stacked'] .wb-formProblem {\n grid-column: 1 / -1;\n}\n\n.wb-formControl {\n display: flex;\n align-items: center;\n min-width: 0;\n}\n\n.wb-formControl\n > :where(\n .wb-selectAnchor,\n .wb-choiceMenu,\n input:not(\n [type='checkbox'],\n [type='radio'],\n [type='button'],\n [type='submit'],\n [type='reset'],\n [type='image'],\n [type='color'],\n [type='range']\n ),\n select,\n textarea\n ) {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n}\n\n.wb-formHint {\n grid-column: 2;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-formProblem {\n grid-column: 2;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-formRow:has(.wb-formProblem) .wb-formLabel {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-formRow:has(:disabled) .wb-formLabel {\n opacity: 0.4;\n}\n\n.wb-formRows > .wb-formRow {\n grid-template-columns: subgrid;\n}\n\n@supports not (grid-template-columns: subgrid) {\n .wb-formRows > .wb-formRow {\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n }\n}\n.wb-form {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n width: 100%;\n}:where(.wb-link) {\n margin-left: var(--wb-len-2);\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n white-space: nowrap;\n vertical-align: baseline;\n}\n\n:where(.wb-link:hover) {\n text-decoration: underline;\n}\n\n:where(.wb-link:focus-visible) {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n.wb-longTask {\n padding-top: var(--wb-len-12);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n.wb-longTaskHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n}\n\n.wb-longTaskLink {\n flex: none;\n}\n\n.wb-longTaskHeadline {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-longTaskProblem {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-longTaskDump {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-longTaskDump pre {\n margin: var(--wb-len-4) 0 0;\n max-height: var(--wb-len-220);\n overflow: auto;\n}\n\n.wb-longTaskStop {\n display: inline-flex;\n flex: none;\n align-items: center;\n align-self: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n padding: 0;\n margin-left: auto;\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-specific-menu);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n.wb-longTaskStop:hover:not(:disabled),\n.wb-longTaskStop:focus-visible {\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-longTaskStop:disabled {\n cursor: default;\n}\n\n.wb-longTaskStopArmed,\n.wb-longTaskStopArmed:hover:not(:disabled),\n.wb-longTaskStopArmed:focus-visible {\n gap: var(--wb-len-4);\n width: auto;\n padding: 0 var(--wb-len-7);\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-longTaskStopLabel {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n.wb-longTaskStopWhy {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n.wb-centered.wb-centeredCompact {\n flex: none;\n min-height: 0;\n gap: var(--wb-len-8);\n padding: var(--wb-len-20) var(--wb-len-16);\n}\n\n.wb-centered.wb-centeredCompact .wb-centeredHero {\n margin-bottom: var(--wb-len-4);\n}\n\n.wb-skeleton {\n display: flex;\n flex-direction: column;\n}\n\n.wb-skeletonRow {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n}\n\n.wb-skeletonRow + .wb-skeletonRow::before {\n content: '';\n align-self: stretch;\n height: var(--wb-len-0-5);\n margin: 0 var(--wb-len-8) var(--wb-len-neg-0-5);\n background: var(--dsw-alias-border-l2);\n}\n\n.wb-skeletonBar {\n display: block;\n height: var(--wb-len-13);\n border-radius: var(--dsw-radius-xs);\n background: var(--dsw-alias-bg-skeleton);\n animation: wb-skeleton-pulse var(--wb-dur-1-4) var(--ds-ease-in-out) infinite;\n}\n\n.wb-skeletonBarTitle {\n width: 62%;\n}\n\n.wb-skeletonBarMeta {\n width: 32%;\n height: var(--wb-len-10);\n}\n\n.wb-skeletonRow:nth-child(2n) .wb-skeletonBarTitle {\n width: 74%;\n}\n\n.wb-skeletonRow:nth-child(3n) .wb-skeletonBarTitle {\n width: 52%;\n}\n\n@keyframes wb-skeleton-pulse {\n 50% {\n opacity: 0.45;\n }\n}\n\n.wb-centered {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: var(--wb-len-14);\n flex: 1;\n min-height: var(--wb-len-240);\n padding: 0 var(--wb-len-24) var(--wb-len-24);\n text-align: center;\n}\n\n.wb-centeredHero {\n display: flex;\n margin-bottom: var(--wb-len-16);\n color: var(--dsw-alias-label-dimmed);\n}\n\n.wb-centeredTitle {\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-centeredHint {\n max-width: var(--wb-len-300);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-centeredDetail {\n max-width: var(--wb-len-320);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-dimmed);\n word-break: break-all;\n}\n\n.wb-centeredAction {\n display: flex;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n@media (prefers-reduced-motion: reduce) {\n .wb-skeletonBar {\n animation: none;\n }}\n.wb-textField {\n box-sizing: border-box;\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n outline: none;\n}\n\n.wb-textField:focus {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-textField:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-textField[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-textField[aria-invalid='true']:focus {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n:where(.wb-textField) {\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n}\n:where(.wb-selectTrigger) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n text-align: left;\n cursor: pointer;\n}\n\n.wb-selectTrigger:focus-visible {\n outline: none;\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectTrigger[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-selectTrigger[aria-invalid='true']:focus-visible {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n.wb-selectTrigger:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-selectLoading:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: none;\n background: transparent;\n font-size: var(--wb-font-row);\n}\n\n.wb-selectGhost:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-selectGhost:focus-visible {\n outline: var(--dsw-focus-ring-width) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n border-color: transparent;\n box-shadow: none;\n}\n\n.wb-selectIconOnly {\n width: var(--wb-len-36);\n height: var(--wb-len-36);\n min-height: 0;\n gap: 0;\n padding: 0;\n justify-content: center;\n}\n\n.wb-selectReveal {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.wb-selectIconOnly .wb-selectIcon {\n width: 100%;\n height: 100%;\n}\n\n.wb-selectAnchor {\n display: block;\n width: 100%;\n}\n\n.wb-selectIcon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectValue {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n.wb-selectPlaceholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectChevron {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n}\n\n.wb-selectMenu {\n min-width: var(--wb-len-240);\n max-width: var(--wb-len-360);\n max-height: min(var(--wb-len-320), calc(100vh - var(--wb-len-24)));\n}\n\n:where(.wb-selectSearch) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n.wb-selectSearch:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectSearch.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-selectSearch.wb-selectGhost:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: none;\n}\n\n.wb-selectSearchIcon {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-textField.wb-selectSearchInput {\n flex: 1;\n min-width: 0;\n min-height: 0;\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.wb-textField.wb-selectSearchInput:focus {\n box-shadow: none;\n}\n\n.wb-selectFallback {\n width: 100%;\n}\n\n.wb-selectHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\nsection.wb-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-len-16);\n border: 0;\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-settings-card-fill);\n}\n.wb-settingsHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n.wb-settings .wb-settingsTitle {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-s-strong-14-font-size);\n line-height: var(--wb-line-24);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-stack {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n min-height: 0;\n}\n\n.wb-stateBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-stateBlockTitle {\n margin: 0;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n.wb-stateBlockHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-stateBlockActions {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n.wb-stateBlockResolving {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n._marketList_1rftb_1 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._marketRow_1rftb_10 {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--wb-len-14);\n row-gap: var(--wb-len-4);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-lg);\n}\n\n._marketIcon_1rftb_20 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-40);\n height: var(--wb-len-40);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketMain_1rftb_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_1rftb_39 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketDesc_1rftb_48 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketUsedBy_1rftb_59 {\n margin-left: var(--wb-len-8);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n opacity: 0.75;\n}\n\n._marketUsedBy_1rftb_59::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_1rftb_39 ._marketVersion_1rftb_73 {\n margin-left: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n}\n\n._marketVersion_1rftb_73 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_1rftb_73::before {\n content: '';\n display: inline-block;\n width: var(--wb-len-1);\n height: var(--wb-len-10);\n margin: 0 var(--wb-len-8) 0 var(--wb-len-2);\n vertical-align: -1px;\n background: var(--dsw-alias-border-l2);\n}\n\n._marketLocalTag_1rftb_95 {\n margin-left: var(--wb-len-8);\n padding: 0 var(--wb-len-6);\n border: var(--wb-len-1) solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n}\n\n._marketEnd_1rftb_106 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_1rftb_113 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_1rftb_113::before {\n content: '';\n width: 0;\n height: var(--wb-len-14);\n border-left: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketActions_1rftb_126 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_1rftb_132 {\n color: var(--dsw-alias-state-warn-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._marketSelfDivider_1rftb_138 {\n height: 0;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_1rftb_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_1rftb_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_1rftb_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_1rftb_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_1rftb_169 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionQuiet_1rftb_175 ._marketSectionTitle_1rftb_163 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSectionQuiet_1rftb_175 ._marketName_1rftb_39 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSectionQuiet_1rftb_175 ._marketDesc_1rftb_48 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._marketSectionQuiet_1rftb_175 ._marketIcon_1rftb_20 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n\n._marketProgress_1rftb_192 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-height: var(--wb-len-32);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketNote_1rftb_202 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-warn-primary);\n overflow-wrap: anywhere;\n}\n\n._marketNotePlain_1rftb_209 {\n grid-column: 2 / -1;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n overflow-wrap: anywhere;\n}\n\n._marketFailure_1rftb_217 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._marketEmpty_1rftb_224 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_1rftb_229 {\n box-sizing: border-box;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-32);\n padding: 0 clamp(var(--wb-len-24), 4vw, var(--wb-len-48)) var(--wb-len-48);\n overflow-x: hidden;\n overflow-y: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_1rftb_229 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_1rftb_247 {\n box-sizing: border-box;\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-16);\n padding-top: var(--wb-len-28);\n}\n\n._marketPageTitle_1rftb_255 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_1rftb_260 {\n margin: var(--wb-len-4) 0 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketPageTools_1rftb_266 {\n flex: none;\n align-self: center;\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--wb-len-16);\n}\n\n._marketIconButton_1rftb_275 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n color: var(--dsw-alias-label-caption);\n cursor: pointer;\n}\n\n._marketIconButton_1rftb_275:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_1rftb_275:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_1rftb_300 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_1rftb_304 svg {\n animation: _wb-spin_1rftb_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_1rftb_308 {\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n border-radius: var(--dsw-radius-md);\n}\n\n._marketEmpty_1rftb_224 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-64) var(--wb-len-16);\n text-align: center;\n}\n\n._marketChecking_1rftb_325 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketEmptyTitle_1rftb_333 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_1rftb_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._foot_1ud1j_1 {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._footText_1ud1j_13 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1ud1j_18 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._wide_1lv8f_1 {\n justify-content: center;\n width: 100%;\n height: var(--wb-len-40);\n border-radius: var(--dsw-radius-md);\n}\n\n._dialog_1lv8f_8 {\n width: min(var(--wb-len-560), 100%);\n max-height: min(var(--wb-len-800), 100%);\n}\n\n._content_1lv8f_13 {\n min-height: 0;\n overflow: auto;\n}\n\n._stack_1lv8f_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._body_1lv8f_25 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._field_1lv8f_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._input_1lv8f_39 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-14);\n}\n\n._registryField_1lv8f_45 {\n height: var(--wb-len-32);\n margin-left: var(--wb-len-26);\n padding: 0 var(--wb-len-10);\n}\n\n._options_1lv8f_51 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8) var(--wb-len-12);\n}\n\n._guideToggle_1lv8f_59 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-4);\n align-self: flex-start;\n margin-top: var(--wb-len-4);\n padding: 0;\n border: 0;\n background: transparent;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._guideToggle_1lv8f_59:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._guideToggle_1lv8f_59 svg,\n._registryToggle_1lv8f_78 svg {\n transition: transform var(--wb-dur-0-12) ease;\n}\n\n._guideToggle_1lv8f_59[aria-expanded='true'] svg,\n._registryToggle_1lv8f_78[aria-expanded='true'] svg {\n transform: rotate(180deg);\n}\n\n._registryWrap_1lv8f_87 {\n position: relative;\n flex: none;\n}\n\n._registryToggle_1lv8f_78 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n height: var(--wb-len-26);\n padding: 0 var(--wb-len-8) 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n font: inherit;\n font-size: var(--wb-font-12-5);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._registryToggle_1lv8f_78:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._registryToggle_1lv8f_78:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n._registryToggle_1lv8f_78[aria-expanded='true'] {\n border-color: var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n._registryChosen_1lv8f_121 {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n._registry_1lv8f_45 {\n position: fixed;\n z-index: var(--wb-z-1100);\n box-sizing: border-box;\n width: min(var(--wb-len-440), 100vw - var(--wb-len-24));\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-12);\n border: 0;\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-2);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l3);\n box-shadow: var(--dsw-elevation-prominent);\n}\n\n._registryOption_1lv8f_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid transparent;\n border-radius: var(--dsw-radius-lg);\n cursor: pointer;\n}\n\nlabel._registryOption_1lv8f_143 {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wb-len-10);\n}\n\n._registryPick_1lv8f_159 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n cursor: pointer;\n}\n\n._registryOption_1lv8f_143[data-checked='true'] {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 40%, transparent);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._registryOption_1lv8f_143 input[type='radio'] {\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: var(--wb-len-2) 0 0;\n accent-color: var(--dsw-alias-brand-primary);\n}\n\n._registryTitle_1lv8f_179 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n font: var(--dsw-font-xs-13);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n._registryHint_1lv8f_189 {\n margin-left: var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._inputError_1lv8f_197 {\n margin: var(--wb-len-neg-4) 0 0 var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._guide_1lv8f_59 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._guideList_1lv8f_214 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._guideItem_1lv8f_223 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0;\n}\n\n._guideIndex_1lv8f_230 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n border-radius: var(--wb-radius-pill);\n corner-shape: round;\n background: var(--dsw-alias-bg-module-platform);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._guideMain_1lv8f_244 {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0;\n min-width: 0;\n}\n\n._guideTitle_1lv8f_252 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._guideHint_1lv8f_258 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._guideExample_1lv8f_264 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._guideExample_1lv8f_264 code {\n font-family: var(--dsw-font-mono, monospace);\n}\n\n._guideExampleLabel_1lv8f_274 {\n color: var(--dsw-alias-label-caption);\n}\n\n._footer_1lv8f_278 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-20);\n width: 100%;\n}\n\n._hero_1lv8f_285 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0 var(--wb-len-4);\n text-align: center;\n}\n\n._heroIcon_1lv8f_294 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-44);\n height: var(--wb-len-44);\n color: var(--dsw-alias-label-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='done'] {\n color: var(--dsw-alias-state-success-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='error'] {\n color: var(--dsw-alias-state-warn-label);\n}\n\n._pendingTitle_1lv8f_311 {\n margin: 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n._wizardTitle_1lv8f_319 {\n margin: 0;\n font-size: var(--wb-font-18);\n line-height: var(--wb-len-26);\n font-weight: 600;\n}\n\n._subject_1lv8f_326 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\n text-align: center;\n}\n\n._subjectName_1lv8f_337 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n overflow-wrap: anywhere;\n}\n\n._subjectMeta_1lv8f_343,\n._subjectDesc_1lv8f_344 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._result_1lv8f_351,\n._resultWarn_1lv8f_352 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-primary);\n}\n\n._resultWarn_1lv8f_352 {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n}\n\n._resultMeta_1lv8f_365 {\n margin: 0;\n padding: 0 var(--wb-len-12);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._approval_1lv8f_373 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-state-warn-primary);\n border-radius: var(--dsw-radius-lg);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._approvalTitle_1lv8f_383 {\n margin: 0;\n font: var(--dsw-font-s-14);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._approvalText_1lv8f_390 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._approvalCaution_1lv8f_396 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._note_1lv8f_403 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._noteWarn_1lv8f_410 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._noteError_1lv8f_414 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._problem_1lv8f_418 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._detailLabel_1lv8f_425 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._detail_1lv8f_425 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-3);\n font-family: var(--dsw-font-mono, monospace);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n._note_1enlz_1 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-8);\n margin: 0;\n padding: var(--wb-len-10) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-state-warn-tertiary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._note_1enlz_1 > svg {\n flex: none;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-state-warn-primary);\n}\n._slot_1t7dx_1 {\n display: flex;\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._slot_1t7dx_1 > * {\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._action_1t7dx_12 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex: 1 1 0;\n width: 100%;\n min-width: 0;\n min-height: var(--wb-len-36);\n margin: 0 var(--wb-len-2);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: default;\n overflow: hidden;\n gap: var(--wb-len-4);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n}\n\n._live_1t7dx_31 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._paused_1t7dx_35 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._trouble_1t7dx_39 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._pulse_1t7dx_43 {\n animation: _wb-debug-breathe_1t7dx_1 var(--wb-dur-1-5) var(--ds-ease-in-out, ease-in-out) infinite;\n}\n\n@keyframes _wb-debug-breathe_1t7dx_1 {\n 0%,\n 100% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0.35;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._pulse_1t7dx_43 {\n animation: none;\n }\n}\n\n._entry_1t7dx_64 {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._entryInner_1t7dx_71 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._acts_1t7dx_78 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-2);\n flex: none;\n}\n\n._act_1t7dx_12 {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: 0;\n border-radius: var(--dsw-radius-sm, var(--wb-len-6));\n flex: none;\n cursor: pointer;\n}\n\n._act_1t7dx_12:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._act_1t7dx_12:focus-visible {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n._actStop_1t7dx_110:hover,\n._actStop_1t7dx_110:focus-visible {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._actArmed_1t7dx_115,\n._actArmed_1t7dx_115:hover,\n._actArmed_1t7dx_115:focus-visible {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);\n width: auto;\n color: var(--dsw-alias-state-error-primary);\n gap: var(--wb-len-4);\n padding: 0 var(--wb-len-7);\n}\n\n._actLabel_1t7dx_125 {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n._entryLine_1t7dx_131 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._actionRail_1t7dx_138 {\n justify-content: center;\n flex: none;\n width: var(--wb-len-36);\n min-width: var(--wb-len-36);\n height: var(--wb-len-36);\n margin: 0;\n padding: 0;\n corner-shape: round;\n border-radius: 50%;\n}\n\n._card_1t7dx_150 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._cardTitle_1t7dx_156 {\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n}\n\n._cardNote_1t7dx_162 {\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n._slot_1gkj9_1 {\n display: flex;\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._slot_1gkj9_1 > * {\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._action_1gkj9_12 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex: 1 1 0;\n width: 100%;\n min-width: 0;\n min-height: var(--wb-len-36);\n margin: 0 var(--wb-len-2);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: default;\n overflow: hidden;\n gap: var(--wb-len-4);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n}\n\n._live_1gkj9_31 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._done_1gkj9_35 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._pulse_1gkj9_39 {\n animation: _wb-record-breathe_1gkj9_1 var(--wb-dur-1-5) var(--ds-ease-in-out, ease-in-out) infinite;\n}\n\n@keyframes _wb-record-breathe_1gkj9_1 {\n 0%,\n 100% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0.35;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._pulse_1gkj9_39 {\n animation: none;\n }\n}\n\n._entry_1gkj9_60 {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._entryInner_1gkj9_67 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._acts_1gkj9_74 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-2);\n flex: none;\n}\n\n._act_1gkj9_12 {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-22);\n padding: 0 var(--wb-len-7);\n border-radius: var(--dsw-radius-sm, var(--wb-len-6));\n flex: none;\n cursor: pointer;\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n._act_1gkj9_12:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._act_1gkj9_12:focus-visible {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n._entryLine_1gkj9_108 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._actionRail_1gkj9_115 {\n justify-content: center;\n flex: none;\n width: var(--wb-len-36);\n min-width: var(--wb-len-36);\n height: var(--wb-len-36);\n margin: 0;\n padding: 0;\n corner-shape: round;\n border-radius: 50%;\n}\n\n._card_1gkj9_127 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._cardTitle_1gkj9_133 {\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n}\n\n._cardNote_1gkj9_139 {\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n._item_lyox9_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n}\n\n._item_lyox9_1 + ._item_lyox9_1 {\n padding-top: var(--wb-len-14);\n border-top: var(--wb-len-0-5) solid var(--dsw-alias-settings-card-stroke);\n}\n\n._head_lyox9_12 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._title_lyox9_19 {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._description_lyox9_31 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n._body_1rhdh_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._sources_1rhdh_7 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._sourcesLabel_1rhdh_14 {\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-secondary);\n}\n\nbutton._sourceOn_1rhdh_19 {\n border-color: var(--dsw-alias-brand-primary);\n}\n._sourceCount_1rhdh_22 {\n margin-left: var(--wb-len-4);\n font-variant-numeric: tabular-nums;\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._reading_1rhdh_29 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._status_1rhdh_35 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failure_1rhdh_45 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n column-gap: var(--wb-len-10);\n row-gap: var(--wb-len-2);\n color: var(--dsw-alias-state-error-primary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n\n._failureTitle_1rhdh_55 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._failureHint_1rhdh_62 {\n grid-column: 1;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failureAction_1rhdh_67 {\n grid-column: 2;\n grid-row: 1;\n justify-self: end;\n}\n\n._rows_1rhdh_73 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._row_1rhdh_73 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-settings-card-stroke);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-settings-card-fill);\n}\n\n._head_1rhdh_92 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._pick_1rhdh_99 {\n flex: 0 1 auto;\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._pick_1rhdh_99 > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._code_1rhdh_111 {\n --dsl-code-block-background: var(--dsw-alias-bg-layer-1);\n margin: 0;\n}\n\n._missing_1rhdh_116,\n._conflict_1rhdh_117 {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._foot_1rhdh_123 {\n display: flex;\n justify-content: flex-end;\n}\n._body_zi2j5_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._lead_zi2j5_7 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._title_zi2j5_14 {\n font-size: var(--wb-font-18);\n line-height: var(--wb-line-24);\n}\n._actions_jlw8j_1[hidden],\n._progress_jlw8j_2[hidden],\n._commandRow_jlw8j_3[hidden],\n._bridge_jlw8j_4[hidden],\n._raw_jlw8j_5[hidden] {\n display: none;\n}\n\n._gate_jlw8j_9 {\n position: fixed;\n inset: 0;\n z-index: var(--wb-z-top);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--wb-len-24);\n background: var(--dsw-alias-bg-base);\n}\n\n._card_jlw8j_20 {\n width: 100%;\n max-width: var(--wb-len-420);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-16);\n text-align: center;\n}\n\n._card_jlw8j_20:has(._actions_jlw8j_1:not([hidden])),\n._card_jlw8j_20:has(._bridge_jlw8j_4:not([hidden])) {\n max-width: var(--wb-len-520);\n}\n\n._title_jlw8j_35 {\n margin: 0;\n font-size: var(--dsw-font-base-16-font-size);\n line-height: var(--wb-line-24);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._steps_jlw8j_50 {\n list-style: none;\n margin: var(--wb-len-6) 0 0;\n padding: 0;\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n text-align: left;\n}\n\n._step_jlw8j_50 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-6) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._step_jlw8j_50[data-status='running'] {\n color: var(--dsw-alias-label-primary);\n}\n\n._mark_jlw8j_77 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-14);\n height: var(--wb-len-14);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._step_jlw8j_50[data-status='ok'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._step_jlw8j_50[data-status='warn'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._step_jlw8j_50[data-status='failed'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._label_jlw8j_102 {\n flex: none;\n}\n\n._detail_jlw8j_106 {\n margin-left: auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._progress_jlw8j_2 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._elapsed_jlw8j_124 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._error_jlw8j_132 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n max-height: var(--wb-len-120);\n overflow: auto;\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n white-space: pre-wrap;\n word-break: break-all;\n text-align: left;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._commandRow_jlw8j_3 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n margin: 0 0 var(--wb-len-8);\n padding-right: var(--wb-len-4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._copy_jlw8j_158 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n padding: 0;\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._copy_jlw8j_158:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._command_jlw8j_3 {\n flex: 1;\n min-width: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-primary);\n}\n\n._buttons_jlw8j_191 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-12);\n}\n\n._mockSlot_jlw8j_198 {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n justify-content: center;\n background: var(--dsw-alias-bg-base);\n}\n\n._button_jlw8j_191 {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n._button_jlw8j_191:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._button_jlw8j_191:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n._actions_jlw8j_1,\n._bridge_jlw8j_4 {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-4);\n padding: var(--wb-len-14) var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-1);\n text-align: left;\n}\n\n._fixTitle_jlw8j_249 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._actions_jlw8j_1 ._hint_jlw8j_43,\n._bridge_jlw8j_4 ._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._actions_jlw8j_1 ._commandRow_jlw8j_3,\n._bridge_jlw8j_4 ._commandRow_jlw8j_3 {\n margin: 0;\n}\n\n._actions_jlw8j_1 ._buttons_jlw8j_191,\n._bridge_jlw8j_4 ._buttons_jlw8j_191 {\n justify-content: flex-start;\n}\n\n._raw_jlw8j_5 {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._rawSummary_jlw8j_282 {\n cursor: pointer;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._actions_jlw8j_1 ._error_jlw8j_132,\n._bridge_jlw8j_4 ._error_jlw8j_132 {\n margin-top: var(--wb-len-6);\n}\n\n._bridgeLines_jlw8j_292 {\n margin: 0;\n padding-left: var(--wb-len-18);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._bridgeLine_jlw8j_292 a {\n display: block;\n margin-top: var(--wb-len-4);\n width: fit-content;\n}\n\n._link_jlw8j_309 {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n\n._link_jlw8j_309::after {\n content: '↗';\n margin-left: var(--wb-len-2);\n}\n\n._link_jlw8j_309:hover {\n text-decoration: underline;\n}\n\n._loading_jlw8j_323 {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._loading_jlw8j_323[hidden] {\n display: none;\n}\n\n._loadingMotion_jlw8j_332 {\n transform-origin: center;\n animation: _wb-spin_jlw8j_1 var(--wb-dur-1-5) linear infinite;\n}\n\n._loadingTrack_jlw8j_337,\n._loadingArc_jlw8j_338 {\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n}\n\n._loadingTrack_jlw8j_337 {\n opacity: 0.25;\n}\n\n._loadingArc_jlw8j_338 {\n stroke-dasharray: 12 150;\n animation: _wb-dash_jlw8j_1 var(--wb-dur-1-5) ease-in-out infinite;\n}\n\n@keyframes _wb-spin_jlw8j_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes _wb-dash_jlw8j_1 {\n 0% {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n 50% {\n stroke-dasharray: 24 150;\n stroke-dashoffset: -6;\n }\n to {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._loadingMotion_jlw8j_332,\n ._loadingArc_jlw8j_338 {\n animation: none;\n }\n}\n._group_1hxis_1 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n}\n\n._button_1hxis_7 {\n flex: none;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n}\n\n._button_1hxis_7:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._active_1hxis_19 {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._icon_1hxis_23 {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n._icon_1hxis_23 svg {\n display: block;\n width: var(--wb-len-15);\n height: var(--wb-len-15);\n}\n\n._mirror_1hxis_35 {\n transform: scaleX(-1);\n}\n._stripTabs_1dqp4_1 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n min-width: 0;\n overflow: hidden;\n}\n\n._tab_1dqp4_9 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: none;\n font: inherit;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-16);\n max-width: 100%;\n}\n\n._tabActive_1dqp4_25 {\n color: var(--dsw-alias-label-primary);\n}\n\n._tabQuiet_1dqp4_29 {\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._tabQuiet_1dqp4_29:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._tabTitle_1dqp4_39 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._sep_1dqp4_49 {\n flex: none;\n color: var(--dsw-alias-label-dimmed);\n}\n._trigger_15ptp_1 {\n display: flex;\n align-items: center;\n}\n\n._pop_15ptp_6 {\n position: absolute;\n top: calc(var(--wb-len-38) + var(--wb-len-8));\n right: var(--wb-len-6);\n z-index: var(--wb-z-30);\n width: min(var(--wb-len-360), calc(100% - var(--wb-len-12)));\n max-width: calc(100vw - var(--wb-len-48));\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-2);\n box-shadow: var(--dsw-shadow-lv3);\n overflow: hidden;\n}\n\n._head_15ptp_20 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10) var(--wb-len-12) var(--wb-len-9) var(--wb-len-14);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._title_15ptp_28 {\n flex: 1;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._rowControls_15ptp_36 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._reset_15ptp_43 {\n flex: none;\n padding: var(--wb-len-3) var(--wb-len-8);\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._reset_15ptp_43:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_15ptp_43:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_15ptp_65 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._row_15ptp_36 {\n position: relative;\n display: grid;\n grid-template-columns: 12px minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-sm);\n cursor: default;\n}\n\n._rowDragging_15ptp_85 {\n cursor: grabbing;\n}\n\n._rowBlocked_15ptp_89 {\n cursor: not-allowed;\n}\n\n._listDragging_15ptp_93 ._rowControls_15ptp_36 {\n pointer-events: none;\n}\n\n._row_15ptp_36:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOff_15ptp_101 {\n opacity: 0.55;\n}\n\n._rowOff_15ptp_101:hover {\n opacity: 1;\n}\n\n._rowOver_15ptp_109::before {\n content: '';\n position: absolute;\n top: var(--wb-len-neg-3);\n left: var(--wb-len-8);\n right: var(--wb-len-8);\n height: var(--wb-len-2);\n background: var(--dsw-alias-brand-primary);\n}\n\n._ghost_15ptp_119 {\n position: fixed;\n z-index: var(--wb-z-40);\n pointer-events: none;\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--wb-static-shadow-ghost);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n}\n\n._grip_15ptp_134 {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n text-align: center;\n color: var(--dsw-alias-label-tertiary);\n user-select: none;\n cursor: grab;\n touch-action: none;\n}\n\n._gripDragging_15ptp_144 {\n cursor: grabbing;\n}\n\n._gripBlocked_15ptp_148 {\n cursor: not-allowed;\n}\n\n._label_15ptp_152 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_15ptp_159 {\n min-width: 0;\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n\n._error_15ptp_170 {\n margin: 0;\n padding: 0 var(--wb-len-14) var(--wb-len-10);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._dep_15ptp_178 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n\n._group_15ptp_186 {\n padding-top: var(--wb-len-6);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._groupTitle_15ptp_191 {\n margin: 0;\n padding: var(--wb-len-2) var(--wb-len-8) 0 var(--wb-len-14);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n font-weight: 400;\n color: var(--dsw-alias-label-tertiary);\n}\n._panel_1whum_1 {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: var(--wb-z-10);\n visibility: hidden;\n}\n\n._panel_1whum_1[data-fullscreen] {\n z-index: var(--wb-z-40);\n}\n\n._panel_1whum_1[data-open] {\n visibility: visible;\n}\n\n._columns_1whum_18 {\n display: block;\n column-gap: var(--wb-len-12);\n}\n\n._cell_1whum_23 {\n display: flow-root;\n min-width: 0;\n break-inside: avoid;\n margin-bottom: var(--wb-len-12);\n}\n._root_1cmz0_1 {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}\n\n._rail_1cmz0_7 {\n margin: 0 0 var(--wb-len-4);\n}\n\n._glyphBox_1cmz0_11 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n}\n\n._glyph_1cmz0_11 {\n position: relative;\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._glyphActive_1cmz0_30 {\n color: var(--dsw-alias-state-business-primary);\n}\n\n._triggerName_1cmz0_34 {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n._dir_1cmz0_45 {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._name_1cmz0_53 {\n flex: 0 1 auto;\n max-width: 50%;\n font-size: var(--dsw-font-xxs-12-font-size);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._triggerName_1cmz0_34 ._name_1cmz0_53 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._row_1cmz0_66 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n width: 100%;\n min-width: 0;\n}\n\n._trailing_1cmz0_74 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n margin-inline-start: auto;\n}\n\n._trailing_1cmz0_74 ._rowAction_1cmz0_84 {\n width: var(--wb-len-20);\n min-width: var(--wb-len-20);\n height: var(--wb-len-20);\n min-height: var(--wb-len-20);\n padding: 0;\n border-radius: var(--dsw-radius-sm);\n}\n\n._row_1cmz0_66 ._name_1cmz0_53 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._current_1cmz0_97 {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-primary);\n}\n._dot_sosf1_1 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n._overlay_sosf1_8 {\n position: absolute;\n inset-block-start: var(--wb-len-neg-3);\n inset-inline-end: var(--wb-len-neg-3);\n}\n._tag_g9dg8_1 {\n flex: none;\n margin-inline-start: auto;\n}\n._dialog_1vye5_1 {\n width: min(var(--wb-len-420), 100%);\n}\n\n._stack_1vye5_5 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._input_1vye5_12 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-12);\n}\n\n._meta_1vye5_18 {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._dot_14w1n_1 {\n display: inline-flex;\n align-items: center;\n}\n\n._hover_14w1n_6 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n._blocker_1oaj0_1 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-20) var(--wb-len-16);\n text-align: center;\n}\n\n._icon_1oaj0_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_1oaj0_15 {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_1oaj0_23 {\n margin: 0;\n max-width: var(--wb-len-42em);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n text-wrap: pretty;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 {\n align-items: flex-start;\n gap: var(--wb-len-6);\n padding: var(--wb-len-4) 0 var(--wb-len-2);\n text-align: left;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._title_1oaj0_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._hint_1oaj0_23 {\n max-width: 100%;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._actions_1oaj0_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._raw_1oaj0_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_1oaj0_48 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-6);\n}\n\n._raw_1oaj0_52 {\n margin-top: var(--wb-len-10);\n width: 100%;\n max-width: var(--wb-len-360);\n text-align: left;\n}\n\n._notice_1oaj0_71 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n column-gap: var(--wb-len-10);\n margin: 0 0 var(--wb-len-10);\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-left: 2px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._notice_1oaj0_71._noticeFlat_1oaj0_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_1oaj0_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_1oaj0_98 {\n font-size: var(--wb-font-12-5);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._noticeHint_1oaj0_105 {\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._noticeActions_1oaj0_112 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin-top: var(--wb-len-neg-2);\n}\n\n._failure_1oaj0_119 {\n margin: var(--wb-len-8) 0 0;\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._failureDetail_1oaj0_127 {\n display: block;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-label-tertiary);\n white-space: pre-wrap;\n}\n\n._inlineAction_1oaj0_134 {\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n}\n\n._inlineAction_1oaj0_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n._rawText_1oaj0_146 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
11215
11850
  function workbenchCss() {
11216
11851
  return `${tokens_default}\n${palette_default}\n${scale_default}\n${sidebar_default}\n${sidebar_app_default}\n${rightbar_default}\n${chrome_default}\n${board_default}\n${motion_default}\n${COMPONENT_CSS_MARKER}`;
11217
11852
  }
@@ -11373,37 +12008,77 @@ function mount(ctx) {
11373
12008
  ctx.effect(() => () => borrow.dispose(), "dsh-workbench: 官方椅面订阅与借道");
11374
12009
  borrow.start();
11375
12010
  if (store.getSnapshot().column === "workbench") armWorkbenchColumn();
11376
- ctx.slots.inject("sidebar", () => ctx.slots.register({
11377
- name: "sidebar",
11378
- priority: -1,
12011
+ let ownSidebarRegistered = false;
12012
+ const registerOwnSidebar = () => {
12013
+ if (ownSidebarRegistered) return;
12014
+ ownSidebarRegistered = true;
12015
+ ctx.slots.inject("sidebar", () => ctx.slots.register({
12016
+ name: "sidebar",
12017
+ priority: -1,
12018
+ locale: LOCALE_NS,
12019
+ children: sidebarChildren(ctx),
12020
+ inject: () => ({
12021
+ listPanels: () => readPanels(ctx),
12022
+ subscribePanels: (callback) => ctx.slots.subscribe("sidebar.panellist", callback),
12023
+ renameWorkspace: async (workspaceId, title) => {
12024
+ try {
12025
+ await ctx.workspaces.rename(workspaceId, title);
12026
+ return true;
12027
+ } catch {
12028
+ return false;
12029
+ }
12030
+ },
12031
+ openWorkspace: (workspaceId) => {
12032
+ ctx.uiWorkspace.openWorkspace(workspaceId);
12033
+ },
12034
+ createWorkspace: (path) => ctx.workspaces.create({ path }),
12035
+ pickDirectory: () => ctx.uiWorkspace.pickDirectory(),
12036
+ openSession: (sessionId) => ctx.uiWorkspace.openSession(sessionId),
12037
+ startSession: startSessionIn,
12038
+ toggleSidebar: () => ctx.layout.toggleSidebar(),
12039
+ selectPanel: (panelId) => ctx.layout.selectPanel(panelId)
12040
+ })
12041
+ }, Sidebar));
12042
+ };
12043
+ bootSidebarEdition(ctx, registerOwnSidebar);
12044
+ ctx.slots.inject("sidebar.session.row.leading", () => ctx.slots.register({
12045
+ name: "sidebar.session.row.leading",
12046
+ id: "long-task",
12047
+ order: 50,
11379
12048
  locale: LOCALE_NS,
11380
- children: sidebarChildren(ctx),
11381
- inject: () => ({
11382
- listPanels: () => readPanels(ctx),
11383
- subscribePanels: (callback) => ctx.slots.subscribe("sidebar.panellist", callback),
11384
- renameWorkspace: async (workspaceId, title) => {
11385
- try {
11386
- await ctx.workspaces.rename(workspaceId, title);
11387
- return true;
11388
- } catch {
11389
- return false;
11390
- }
11391
- },
11392
- openWorkspace: (workspaceId) => {
11393
- ctx.uiWorkspace.openWorkspace(workspaceId);
11394
- },
11395
- createWorkspace: (path) => ctx.workspaces.create({ path }),
11396
- pickDirectory: () => ctx.uiWorkspace.pickDirectory(),
11397
- openSession: (sessionId) => ctx.uiWorkspace.openSession(sessionId),
11398
- startSession: startSessionIn,
11399
- toggleSidebar: () => ctx.layout.toggleSidebar(),
11400
- selectPanel: (panelId) => ctx.layout.selectPanel(panelId)
11401
- })
11402
- }, Sidebar));
12049
+ inject: () => ({ t: ctx.locale.bind(LOCALE_NS) })
12050
+ }, LongTaskDot));
12051
+ ctx.slots.inject("sidebar.session.row.hover", () => ctx.slots.register({
12052
+ name: "sidebar.session.row.hover",
12053
+ id: "long-task",
12054
+ order: 50,
12055
+ locale: LOCALE_NS,
12056
+ inject: () => ({ t: ctx.locale.bind(LOCALE_NS) })
12057
+ }, LongTaskHover));
12058
+ ctx.effect(() => {
12059
+ const mirror = () => {
12060
+ if (runtimeSidebarEdition() !== "official") return;
12061
+ const sessions = ctx.get("sessions");
12062
+ if (sessions === void 0) return;
12063
+ const current = currentSessionId(sessions.list.getSnapshot(), false);
12064
+ const workspace = workspaceOfSession(ctx.workspaces.list.getSnapshot().items, current);
12065
+ if (workspace === null) return;
12066
+ if (selectedProjectId() !== workspace.workspaceId) selectProject(workspace.workspaceId);
12067
+ };
12068
+ const sessions = ctx.get("sessions");
12069
+ const offWorkspaces = ctx.workspaces.list.subscribe(mirror);
12070
+ const offSessions = sessions?.list.subscribe?.(mirror) ?? (() => {});
12071
+ const offEdition = subscribeSidebarEdition(mirror);
12072
+ return () => {
12073
+ offWorkspaces();
12074
+ offSessions();
12075
+ offEdition();
12076
+ };
12077
+ }, "dsh-workbench: 官方左栏选中的项目就是右栏的项目");
11403
12078
  registerMarketPanel(ctx, units);
11404
12079
  registerDebugFooter(ctx);
11405
12080
  registerRecordFooter(ctx);
11406
- registerConfigSyncSection(ctx);
12081
+ registerWorkbenchSettingsSection(ctx);
11407
12082
  ctx.effect(() => {
11408
12083
  const workshop = workshopWorkspace();
11409
12084
  if (workshop === void 0) return;
@@ -11433,16 +12108,16 @@ function mount(ctx) {
11433
12108
  })
11434
12109
  }, ColumnSwitch));
11435
12110
  }
11436
- var CONFIG_SYNC_SECTION_ID = "workbench-config-sync";
11437
- function registerConfigSyncSection(ctx) {
12111
+ var WORKBENCH_SETTINGS_SECTION_ID = "workbench-settings";
12112
+ function registerWorkbenchSettingsSection(ctx) {
11438
12113
  ctx.slots.inject("settings.section", () => ctx.slots.register({
11439
12114
  name: "settings.section",
11440
- id: CONFIG_SYNC_SECTION_ID,
12115
+ id: WORKBENCH_SETTINGS_SECTION_ID,
11441
12116
  order: 40,
11442
12117
  locale: LOCALE_NS,
11443
- label: () => ctx.locale.bind(LOCALE_NS)("configSync.nav"),
12118
+ label: () => ctx.locale.bind(LOCALE_NS)("workbenchSettings.nav"),
11444
12119
  inject: () => ({ t: ctx.locale.bind(LOCALE_NS) })
11445
- }, ConfigSyncSection));
12120
+ }, WorkbenchSettingsSection));
11446
12121
  }
11447
12122
  function sidebarChildren(ctx) {
11448
12123
  return {