@dsh-workbench/core 0.3.9 → 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 (84) hide show
  1. package/README.md +19 -7
  2. package/bin/dsh-workbench +2 -2
  3. package/client.js +1687 -1022
  4. package/cordis.patch.yml +60 -35
  5. package/dist/client/client.body.js +1687 -1022
  6. package/dist/client/index.js +1372 -707
  7. package/dist/host/index.js +2897 -2335
  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-rows.d.ts +1 -1
  14. package/dist/types/app/layouts/rightbar/market-settle-hold.d.ts +2 -0
  15. package/dist/types/app/layouts/rightbar/market-settle.d.ts +20 -0
  16. package/dist/types/app/layouts/rightbar/market-shared-rows.d.ts +0 -1
  17. package/dist/types/app/layouts/rightbar/market-update-verdict.d.ts +41 -0
  18. package/dist/types/app/layouts/rightbar/market-view-text.d.ts +4 -1
  19. package/dist/types/app/layouts/rightbar/store.d.ts +14 -0
  20. package/dist/types/app/layouts/sidebar/LongTaskDot.d.ts +12 -0
  21. package/dist/types/app/layouts/sidebar/LongTaskHover.d.ts +12 -0
  22. package/dist/types/app/layouts/sidebar/edition-boot.d.ts +24 -0
  23. package/dist/types/app/layouts/sidebar/edition.d.ts +22 -0
  24. package/dist/types/app/layouts/workbench-settings/ConfigSyncItem.d.ts +5 -0
  25. package/dist/types/app/layouts/workbench-settings/SettingsItem.d.ts +17 -0
  26. package/dist/types/app/layouts/workbench-settings/SidebarEditionItem.d.ts +11 -0
  27. package/dist/types/app/layouts/workbench-settings/WorkbenchSettingsSection.d.ts +11 -0
  28. package/dist/types/modules/panels/model/approval.d.ts +12 -4
  29. package/dist/types/modules/panels/model/diy-browser-tools.d.ts +1 -1
  30. package/dist/types/modules/panels/model/diy-context.d.ts +31 -14
  31. package/dist/types/modules/panels/model/diy-page.d.ts +3 -2
  32. package/dist/types/modules/panels/model/diy-record.d.ts +3 -3
  33. package/dist/types/modules/panels/model/diy-report.d.ts +6 -7
  34. package/dist/types/modules/panels/model/market-dependency-update.d.ts +21 -0
  35. package/dist/types/modules/panels/model/market-dispatch.d.ts +1 -0
  36. package/dist/types/modules/panels/model/market-types.d.ts +1 -0
  37. package/dist/types/modules/panels/model/market-update-bundle.d.ts +25 -0
  38. package/dist/types/modules/panels/model/market-verify.d.ts +31 -0
  39. package/dist/types/modules/panels/unit.d.ts +3 -4
  40. package/dist/types/shared/api/bundle-install.d.ts +13 -0
  41. package/dist/types/shared/api/host/approval-gate.d.ts +39 -0
  42. package/dist/types/shared/api/host/bundle-routes.d.ts +2 -1
  43. package/dist/types/shared/api/host/diy-artifacts.d.ts +14 -0
  44. package/dist/types/shared/api/host/diy-modules.d.ts +41 -0
  45. package/dist/types/shared/api/host/host-routes.d.ts +13 -0
  46. package/dist/types/shared/api/host/permission-mode.d.ts +9 -0
  47. package/dist/types/shared/api/host/runtime-seed.d.ts +2 -0
  48. package/dist/types/shared/api/host/self-update.d.ts +9 -2
  49. package/dist/types/shared/api/host/sidebar-edition.d.ts +46 -0
  50. package/dist/types/shared/api/host/workspace-root.d.ts +13 -0
  51. package/dist/types/shared/api/sidebar-edition.d.ts +14 -0
  52. package/dist/types/shared/api/unit-board.d.ts +20 -0
  53. package/dist/types/shared/api/write-outcome.d.ts +15 -0
  54. package/dist/types/shared/components/IconModules.d.ts +8 -0
  55. package/dist/types/shared/components/blocker-action.d.ts +16 -0
  56. package/dist/types/shared/hooks/sidebar-edition.d.ts +7 -0
  57. package/dist/types/shared/hooks/use-capabilities.d.ts +5 -0
  58. package/dist/types/shared/hooks/use-capability-gate.d.ts +1 -2
  59. package/dist/types/shared/hooks/use-host-write.d.ts +1 -1
  60. package/dist/types/shared/hooks/use-unit-board.d.ts +1 -1
  61. package/docs/HANDOFF.md +3 -3
  62. package/docs/OPERATIONS.md +16 -5
  63. package/package.json +3 -3
  64. package/preset/diy.patch.yml +2 -2
  65. package/profile/isolation.patch.yml +11 -0
  66. package/skills/workbench-module-diy/BUILD.md +62 -131
  67. package/skills/workbench-module-diy/COPY.md +89 -0
  68. package/skills/workbench-module-diy/DATASOURCE.md +84 -112
  69. package/skills/workbench-module-diy/DESIGN.md +75 -109
  70. package/skills/workbench-module-diy/FAMILY.md +70 -54
  71. package/skills/workbench-module-diy/KIT.md +77 -133
  72. package/skills/workbench-module-diy/LINKAGE.md +66 -105
  73. package/skills/workbench-module-diy/PANEL.md +79 -171
  74. package/skills/workbench-module-diy/REVIEW.md +67 -81
  75. package/skills/workbench-module-diy/SKILL.md +57 -96
  76. package/skills/workbench-module-diy/STEPS.md +66 -69
  77. package/skills/workbench-module-diy/TOOLING.md +34 -51
  78. package/skills/workbench-module-diy/TOOLS.md +110 -103
  79. package/skills/workbench-module-diy/WIRING.md +51 -83
  80. package/skills/workbench-module-diy/WRITES.md +89 -142
  81. package/dist/types/app/layouts/config-sync/ConfigSyncSection.d.ts +0 -5
  82. package/dist/types/shared/api/host/diy-workshop.d.ts +0 -23
  83. package/dist/types/shared/api/host/workshop-root.d.ts +0 -16
  84. /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。
741
- */
742
- var useState = react.useState;
743
- /**
744
- * React 的 `useEffect` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
745
- */
746
- var useEffect = react.useEffect;
747
- /**
748
- * React 的 `useLayoutEffect` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
657
+ * React 的 `useState` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
749
658
  */
750
- var useLayoutEffect = react.useLayoutEffect;
659
+ var useState$1 = react.useState;
751
660
  /**
752
- * React 的 `useMemo` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
661
+ * React 的 `useEffect` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
753
662
  */
754
- var useMemo = react.useMemo;
663
+ var useEffect$1 = react.useEffect;
664
+ react.useLayoutEffect;
755
665
  /**
756
- * React 的 `useCallback` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
666
+ * React 的 `useMemo` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
757
667
  */
758
- var useCallback = react.useCallback;
668
+ var useMemo$1 = react.useMemo;
669
+ react.useCallback;
759
670
  /**
760
- * React 的 `useRef` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
671
+ * React 的 `useRef` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
761
672
  */
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": "⚠ 起不来",
@@ -2564,12 +2416,20 @@ var dictionaries = {
2564
2416
  "panels.market.sharedMissing": "未装",
2565
2417
  "panels.market.sharedOutdated": "有新版",
2566
2418
  "panels.market.sharedUnsatisfied": "版本不对",
2567
- "panels.market.sharedOk": "已装",
2419
+ "panels.market.sharedOk": "已就绪",
2568
2420
  "panels.market.versionArrow": "{from} → {to}",
2569
2421
  "panels.market.lead": "装在这台机器上,所有项目共用。",
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",
@@ -3019,12 +2891,20 @@ var dictionaries = {
3019
2891
  "panels.market.sharedMissing": "not installed",
3020
2892
  "panels.market.sharedOutdated": "update available",
3021
2893
  "panels.market.sharedUnsatisfied": "wrong version",
3022
- "panels.market.sharedOk": "installed",
2894
+ "panels.market.sharedOk": "ready",
3023
2895
  "panels.market.versionArrow": "{from} → {to}",
3024
2896
  "panels.market.lead": "Installed on this machine, shared by every project.",
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
  }
@@ -4009,14 +4020,6 @@ var SHARED_STATE_KEY = {
4009
4020
  missing: "panels.market.sharedMissing",
4010
4021
  unchecked: "panels.market.unchecked"
4011
4022
  };
4012
- var SHARED_DOT = {
4013
- checking: "ongoing",
4014
- installed: "done",
4015
- outdated: "warning",
4016
- unsatisfied: "warning",
4017
- missing: "idle",
4018
- unchecked: "idle"
4019
- };
4020
4023
  function sharedActions(row) {
4021
4024
  return [...row.canUpdate ? ["update-dependency"] : []];
4022
4025
  }
@@ -4488,7 +4491,7 @@ function marketHintOf(input) {
4488
4491
  }
4489
4492
  //#endregion
4490
4493
  //#region src/app/layouts/rightbar/market-busy.ts
4491
- var listeners$3 = /* @__PURE__ */ new Set();
4494
+ var listeners$4 = /* @__PURE__ */ new Set();
4492
4495
  var published = /* @__PURE__ */ new Map();
4493
4496
  var live$2 = /* @__PURE__ */ new Set();
4494
4497
  var timer$1;
@@ -4519,9 +4522,9 @@ function publishMarketBusy(ids) {
4519
4522
  * 订阅这份事实的变化(发布内容真变了、或有条目到期才通知)。返回退订函数。
4520
4523
  */
4521
4524
  function subscribeMarketBusy(listener) {
4522
- listeners$3.add(listener);
4525
+ listeners$4.add(listener);
4523
4526
  return () => {
4524
- listeners$3.delete(listener);
4527
+ listeners$4.delete(listener);
4525
4528
  };
4526
4529
  }
4527
4530
  /**
@@ -4557,11 +4560,52 @@ function refresh(now) {
4557
4560
  const next = new Set(published.keys());
4558
4561
  if (!sameSet(live$2, next)) {
4559
4562
  live$2 = next;
4560
- for (const listener of [...listeners$3]) listener();
4563
+ for (const listener of [...listeners$4]) listener();
4561
4564
  }
4562
4565
  schedule(now);
4563
4566
  }
4564
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
4565
4609
  //#region src/shared/hooks/use-host-write.ts
4566
4610
  var use_host_write_exports = /* @__PURE__ */ __exportAll({ useHostWrite: () => useHostWrite });
4567
4611
  /**
@@ -4668,11 +4712,19 @@ function useVisibleBusy(active, floorMs) {
4668
4712
  //#endregion
4669
4713
  //#region src/app/layouts/rightbar/market-settle-hold.ts
4670
4714
  function useSettleHold(input) {
4671
- const { pending, landed, t, onChanged, setPending, setFailed } = input;
4715
+ const { pending, landed, t, onChanged, selfUpdate, setPending, setFailed } = input;
4672
4716
  const until = pending?.until;
4673
4717
  const id = pending?.id ?? "";
4674
4718
  const watching = pending !== null && (pending.until !== void 0 || pending.readBack === true);
4675
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;
4676
4728
  useEffect(() => {
4677
4729
  if (!watching || !landed) return;
4678
4730
  setPending(null);
@@ -4681,6 +4733,22 @@ function useSettleHold(input) {
4681
4733
  landed,
4682
4734
  setPending
4683
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
+ ]);
4684
4752
  useEffect(() => {
4685
4753
  if (!watching) {
4686
4754
  sinceRef.current = 0;
@@ -4734,60 +4802,61 @@ function useMarketTransient(input) {
4734
4802
  };
4735
4803
  }
4736
4804
  var MarketPage_module_default = {
4737
- marketList: "_marketList_csyus_1",
4738
- marketRow: "_marketRow_csyus_10",
4739
- marketIcon: "_marketIcon_csyus_20",
4740
- marketMain: "_marketMain_csyus_32",
4741
- marketName: "_marketName_csyus_39",
4742
- marketDesc: "_marketDesc_csyus_48",
4743
- marketUsedBy: "_marketUsedBy_csyus_59",
4744
- marketVersion: "_marketVersion_csyus_73",
4745
- marketLocalTag: "_marketLocalTag_csyus_95",
4746
- marketEnd: "_marketEnd_csyus_106",
4747
- marketSwitchSeat: "_marketSwitchSeat_csyus_113",
4748
- marketActions: "_marketActions_csyus_126",
4749
- marketUpdateAction: "_marketUpdateAction_csyus_132",
4750
- marketSelfDivider: "_marketSelfDivider_csyus_138",
4751
- marketSection: "_marketSection_csyus_143",
4752
- marketSectionHead: "_marketSectionHead_csyus_150",
4753
- marketSectionIcon: "_marketSectionIcon_csyus_156",
4754
- marketSectionTitle: "_marketSectionTitle_csyus_163",
4755
- marketSectionCount: "_marketSectionCount_csyus_169",
4756
- marketProgress: "_marketProgress_csyus_176",
4757
- marketNote: "_marketNote_csyus_186",
4758
- marketNotePlain: "_marketNotePlain_csyus_193",
4759
- marketFailure: "_marketFailure_csyus_201",
4760
- marketEmpty: "_marketEmpty_csyus_208",
4761
- marketPage: "_marketPage_csyus_213",
4762
- marketPageHead: "_marketPageHead_csyus_231",
4763
- marketPageTitle: "_marketPageTitle_csyus_239",
4764
- marketPageIntro: "_marketPageIntro_csyus_244",
4765
- marketPageTools: "_marketPageTools_csyus_250",
4766
- marketIconButton: "_marketIconButton_csyus_259",
4767
- marketIconWrap: "_marketIconWrap_csyus_284",
4768
- marketIconButtonSpinning: "_marketIconButtonSpinning_csyus_288",
4769
- "wb-spin": "_wb-spin_csyus_1",
4770
- marketAddButton: "_marketAddButton_csyus_292",
4771
- marketChecking: "_marketChecking_csyus_309",
4772
- marketEmptyTitle: "_marketEmptyTitle_csyus_317"
4805
+ marketList: "_marketList_1rftb_1",
4806
+ marketRow: "_marketRow_1rftb_10",
4807
+ marketIcon: "_marketIcon_1rftb_20",
4808
+ marketMain: "_marketMain_1rftb_32",
4809
+ marketName: "_marketName_1rftb_39",
4810
+ marketDesc: "_marketDesc_1rftb_48",
4811
+ marketUsedBy: "_marketUsedBy_1rftb_59",
4812
+ marketVersion: "_marketVersion_1rftb_73",
4813
+ marketLocalTag: "_marketLocalTag_1rftb_95",
4814
+ marketEnd: "_marketEnd_1rftb_106",
4815
+ marketSwitchSeat: "_marketSwitchSeat_1rftb_113",
4816
+ marketActions: "_marketActions_1rftb_126",
4817
+ marketUpdateAction: "_marketUpdateAction_1rftb_132",
4818
+ marketSelfDivider: "_marketSelfDivider_1rftb_138",
4819
+ marketSection: "_marketSection_1rftb_143",
4820
+ marketSectionHead: "_marketSectionHead_1rftb_150",
4821
+ marketSectionIcon: "_marketSectionIcon_1rftb_156",
4822
+ marketSectionTitle: "_marketSectionTitle_1rftb_163",
4823
+ marketSectionCount: "_marketSectionCount_1rftb_169",
4824
+ marketSectionQuiet: "_marketSectionQuiet_1rftb_175",
4825
+ marketProgress: "_marketProgress_1rftb_192",
4826
+ marketNote: "_marketNote_1rftb_202",
4827
+ marketNotePlain: "_marketNotePlain_1rftb_209",
4828
+ marketFailure: "_marketFailure_1rftb_217",
4829
+ marketEmpty: "_marketEmpty_1rftb_224",
4830
+ marketPage: "_marketPage_1rftb_229",
4831
+ marketPageHead: "_marketPageHead_1rftb_247",
4832
+ marketPageTitle: "_marketPageTitle_1rftb_255",
4833
+ marketPageIntro: "_marketPageIntro_1rftb_260",
4834
+ marketPageTools: "_marketPageTools_1rftb_266",
4835
+ marketIconButton: "_marketIconButton_1rftb_275",
4836
+ marketIconWrap: "_marketIconWrap_1rftb_300",
4837
+ marketIconButtonSpinning: "_marketIconButtonSpinning_1rftb_304",
4838
+ "wb-spin": "_wb-spin_1rftb_1",
4839
+ marketAddButton: "_marketAddButton_1rftb_308",
4840
+ marketChecking: "_marketChecking_1rftb_325",
4841
+ marketEmptyTitle: "_marketEmptyTitle_1rftb_333"
4773
4842
  };
4774
4843
  //#endregion
4775
4844
  //#region src/app/layouts/rightbar/MarketStates.tsx
4776
4845
  function MarketChecking({ t }) {
4777
- 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")));
4778
4847
  }
4779
4848
  function MarketEmpty({ t }) {
4780
- 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")));
4781
4850
  }
4782
4851
  //#endregion
4783
4852
  //#region src/app/layouts/rightbar/market-section-icon.ts
4784
4853
  var SIZE$1 = 14;
4785
4854
  function marketSectionIcon(kind) {
4786
4855
  switch (kind) {
4787
- case "installed": return h(IconModules, { size: SIZE$1 });
4788
- case "pending": return h(IconDownloadOutlineRegular, { size: SIZE$1 });
4789
- case "plugins": return h(IconCordisPluginOutlineRegular, { size: SIZE$1 });
4790
- 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 });
4791
4860
  }
4792
4861
  }
4793
4862
  //#endregion
@@ -4795,10 +4864,10 @@ function marketSectionIcon(kind) {
4795
4864
  var SIZE = 18;
4796
4865
  function packageIcon(kind) {
4797
4866
  switch (kind) {
4798
- case "module": return h(IconModuleMark, { size: SIZE });
4799
- case "plugin": return h(IconOpencli, { size: SIZE });
4800
- case "lib": return h(IconNpm, { size: SIZE });
4801
- 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 });
4802
4871
  }
4803
4872
  }
4804
4873
  function marketRowKind(row) {
@@ -4841,8 +4910,9 @@ function holdOf(pending, application) {
4841
4910
  row: pending.row
4842
4911
  };
4843
4912
  }
4844
- function pendingLanded(pending, updates, capabilities, installed) {
4913
+ function pendingLanded(pending, updates, capabilities, installed, shared = [], plugins = null) {
4845
4914
  if (pending === null) return true;
4915
+ if (pending.action === "update" && capabilities === null) return false;
4846
4916
  return settleLanded({
4847
4917
  action: pending.action,
4848
4918
  until: pending.until,
@@ -4850,7 +4920,9 @@ function pendingLanded(pending, updates, capabilities, installed) {
4850
4920
  installed,
4851
4921
  entry: updates[pending.id],
4852
4922
  clicked: pending.version,
4853
- 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 } : {}
4854
4926
  });
4855
4927
  }
4856
4928
  function holdExpired(held, backInRoster, elapsedMs) {
@@ -4931,35 +5003,32 @@ function SharedLine({ t, row, pending, failure, onAct }) {
4931
5003
  const actions = sharedActions(row);
4932
5004
  const stateText = t(SHARED_STATE_KEY[row.state]);
4933
5005
  const version = row.version;
4934
- 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", {
4935
5007
  from: version.installed,
4936
5008
  to: version.latest
4937
5009
  }) : version.installed ?? version.latest ?? ""));
4938
- 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", {
4939
5011
  className: MarketPage_module_default.marketIcon,
4940
5012
  "aria-hidden": "true"
4941
- }, 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", {
4942
5014
  className: MarketPage_module_default.marketDesc,
4943
5015
  role: "img",
4944
5016
  "aria-label": stateText
4945
- }, row.state === "checking" ? /* @__PURE__ */ h(Spinner, { size: 14 }) : /* @__PURE__ */ h(StateDot, {
4946
- state: SHARED_DOT[row.state],
4947
- size: 9
4948
- }), 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, {
4949
5018
  key: action,
4950
5019
  type: "button",
4951
5020
  size: "sm",
4952
5021
  variant: "outline",
4953
5022
  disabled: locked,
4954
5023
  onClick: () => onAct(action)
4955
- }, 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));
4956
5025
  }
4957
5026
  function SharedSection({ t, rows, pending, failureOf, act }) {
4958
5027
  if (rows.length === 0) return null;
4959
- return /* @__PURE__ */ h("section", { className: MarketPage_module_default.marketSection }, /* @__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", {
4960
5029
  className: MarketPage_module_default.marketSectionIcon,
4961
5030
  "aria-hidden": "true"
4962
- }, 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, {
4963
5032
  key: row.id,
4964
5033
  t,
4965
5034
  row,
@@ -5023,49 +5092,49 @@ function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy }) {
5023
5092
  const actions = marketActions$1(row);
5024
5093
  const switchLocked = marketSwitchLocked(row);
5025
5094
  const stateText = t(MARKET_STATE_KEY[row.state]);
5026
- 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", {
5027
5096
  className: MarketPage_module_default.marketIcon,
5028
5097
  "aria-hidden": "true"
5029
- }, 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", {
5030
5099
  from: row.version.installed,
5031
5100
  to: row.version.latest
5032
- }) : 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", {
5033
5102
  className: MarketPage_module_default.marketDesc,
5034
5103
  role: "img",
5035
5104
  "aria-label": stateText
5036
- }, row.state === "checking" ? /* @__PURE__ */ h(Spinner, { size: 14 }) : /* @__PURE__ */ h(StateDot, {
5105
+ }, row.state === "checking" ? /* @__PURE__ */ createElement(Spinner, { size: 14 }) : /* @__PURE__ */ createElement(StateDot, {
5037
5106
  state: MARKET_DOT[row.state],
5038
5107
  size: 9
5039
- }), 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) => {
5040
5109
  const danger = dangerActions.includes(action);
5041
5110
  const update = updateActions.includes(action);
5042
- return /* @__PURE__ */ h(Button, {
5111
+ return /* @__PURE__ */ createElement(Button, {
5043
5112
  key: action,
5044
5113
  type: "button",
5045
5114
  size: "sm",
5046
5115
  variant: action === "install" ? "primary" : "outline",
5047
5116
  className: danger ? "wb-dangerAction" : update ? MarketPage_module_default.marketUpdateAction : void 0,
5048
- icon: danger ? /* @__PURE__ */ h(IconTrashOutlineRegular, { size: 13 }) : void 0,
5117
+ icon: danger ? /* @__PURE__ */ createElement(IconTrashOutlineRegular, { size: 13 }) : void 0,
5049
5118
  "aria-label": danger ? t("panels.market.uninstallLabel", { name: marketRowTitle(row, t) }) : void 0,
5050
5119
  disabled: locked,
5051
5120
  onClick: () => onAct(action)
5052
5121
  }, t(ACTION_LABEL_KEY[action]));
5053
- })), 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, {
5054
5123
  checked: row.defaultShown,
5055
5124
  disabled: boardBusy === true || locked || switchLocked,
5056
5125
  label: `${marketRowTitle(row, t)} · ${t("panels.market.defaultLabel")}`,
5057
5126
  onChange: (next) => onDefault?.(next)
5058
- })))), row.note === void 0 ? null : /* @__PURE__ */ h("div", {
5127
+ })))), row.note === void 0 ? null : /* @__PURE__ */ createElement("div", {
5059
5128
  className: row.note.tone === "plain" ? MarketPage_module_default.marketNotePlain : MarketPage_module_default.marketNote,
5060
5129
  title: row.note.params.reason === void 0 ? void 0 : t("panels.market.moduleRefusedDetail", row.note.params)
5061
- }, 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));
5062
5131
  }
5063
5132
  function MarketSection({ t, titleKey, icon, rows, pending, failureOf, act, confirmActions, onConfirming, onDefault, boardBusy }) {
5064
5133
  if (rows.length === 0) return null;
5065
- 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", {
5066
5135
  className: MarketPage_module_default.marketSectionIcon,
5067
5136
  "aria-hidden": "true"
5068
- }, 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, {
5069
5138
  key: row.id,
5070
5139
  t,
5071
5140
  row,
@@ -5299,8 +5368,63 @@ function changeFailure(change, t) {
5299
5368
  return failureReason(failureCode(change), change.application, t);
5300
5369
  }
5301
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
5302
5410
  //#region src/app/layouts/rightbar/market-act.ts
5303
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
+ }
5304
5428
  function marketActOf(options) {
5305
5429
  const { t, mocked, rowOf, seats, send, onChanged } = options;
5306
5430
  return async (id, action) => {
@@ -5310,10 +5434,12 @@ function marketActOf(options) {
5310
5434
  const next = {
5311
5435
  id,
5312
5436
  action,
5437
+ since: Date.now(),
5313
5438
  ...row?.titleKey === void 0 ? {} : { titleKey: row.titleKey },
5314
5439
  ...label === void 0 ? {} : { label },
5315
5440
  ...row?.pkg === void 0 ? {} : { pkg: row.pkg },
5316
5441
  ...row?.version?.installed === void 0 ? {} : { version: row.version.installed },
5442
+ ...row?.version?.latest === void 0 ? {} : { latest: row.version.latest },
5317
5443
  ...row === void 0 || !STEADY_ACTIONS.has(action) ? {} : { row: label === void 0 ? row : {
5318
5444
  ...row,
5319
5445
  label
@@ -5334,27 +5460,48 @@ function marketActOf(options) {
5334
5460
  unit: id
5335
5461
  });
5336
5462
  if (!outcome.ok) {
5463
+ onChanged({ force: true });
5337
5464
  seats.setPending(null);
5338
5465
  seats.setHeld(void 0);
5339
- onChanged();
5340
5466
  seats.setFailed({
5341
5467
  id,
5342
5468
  message: t("panels.market.failed", { reason: outcome.message })
5343
5469
  });
5344
5470
  return;
5345
5471
  }
5346
- const change = changeOf(outcome.value);
5347
- const until = swapUntil(action, change?.application, row?.version?.latest);
5348
- 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);
5349
5497
  seats.setPending(until === void 0 && !readBack ? null : {
5350
5498
  ...next,
5351
5499
  ...until === void 0 ? {} : { until },
5352
5500
  ...readBack ? { readBack: true } : {}
5353
5501
  });
5354
5502
  seats.setHeld(readBack ? void 0 : holdOf(next, change?.application));
5355
- if (action === "uninstall-plugin") seats.setNotice(installedPluginNotice(outcome.value, t));
5503
+ if (action === "uninstall-plugin") seats.setNotice(installedPluginNotice(value, t));
5356
5504
  const reason = changeFailure(change, t);
5357
- onChanged();
5358
5505
  if (reason !== void 0) seats.setFailed({
5359
5506
  id,
5360
5507
  message: t("panels.market.failed", { reason })
@@ -5375,7 +5522,7 @@ var PanelFoot_module_default = {
5375
5522
  * @param props.children - 右侧那一格内容(一般是按钮或状态),可省略。
5376
5523
  */
5377
5524
  function PanelFoot({ text, size = "sm", children }) {
5378
- 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);
5379
5526
  }
5380
5527
  //#endregion
5381
5528
  //#region src/app/layouts/rightbar/MarketView.tsx
@@ -5386,7 +5533,7 @@ var CONFIRM_UNINSTALL = [
5386
5533
  ];
5387
5534
  function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
5388
5535
  const [acknowledged, setAcknowledged] = useState(false);
5389
- return /* @__PURE__ */ h(RiskConfirmation, {
5536
+ return /* @__PURE__ */ createElement(RiskConfirmation, {
5390
5537
  open: name !== null,
5391
5538
  title: t("panels.market.confirmUninstallTitle", { name: name ?? "" }),
5392
5539
  description: t("panels.market.confirmUninstallDetail"),
@@ -5403,7 +5550,7 @@ function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
5403
5550
  function MarketBody({ t, self, shown, pluginList, installedList, shared, pending, failed, notice, act, onConfirming, setDefault, boardBusy }) {
5404
5551
  const failureOf = (id) => failed?.id === id ? failed.message : null;
5405
5552
  const foot = marketFootVisible(shown, installedList);
5406
- 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, {
5407
5554
  t,
5408
5555
  rows: self === void 0 ? [] : [self],
5409
5556
  onDefault: setDefault,
@@ -5413,10 +5560,10 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
5413
5560
  act,
5414
5561
  confirmActions: CONFIRM_UNINSTALL,
5415
5562
  onConfirming
5416
- }), self === void 0 ? null : /* @__PURE__ */ h("div", {
5563
+ }), self === void 0 ? null : /* @__PURE__ */ createElement("div", {
5417
5564
  className: MarketPage_module_default.marketSelfDivider,
5418
5565
  "aria-hidden": "true"
5419
- }), 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, {
5420
5567
  key: section.id,
5421
5568
  t,
5422
5569
  titleKey: section.titleKey,
@@ -5429,7 +5576,7 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
5429
5576
  act,
5430
5577
  confirmActions: CONFIRM_UNINSTALL,
5431
5578
  onConfirming
5432
- })), /* @__PURE__ */ h(MarketSection, {
5579
+ })), /* @__PURE__ */ createElement(MarketSection, {
5433
5580
  t,
5434
5581
  titleKey: "panels.market.sectionPlugins",
5435
5582
  icon: marketSectionIcon("plugins"),
@@ -5441,10 +5588,10 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
5441
5588
  act,
5442
5589
  confirmActions: CONFIRM_UNINSTALL,
5443
5590
  onConfirming
5444
- }), foot ? /* @__PURE__ */ h(PanelFoot, {
5591
+ }), foot ? /* @__PURE__ */ createElement(PanelFoot, {
5445
5592
  size: "md",
5446
5593
  text: t("panels.market.foot")
5447
- }) : null, /* @__PURE__ */ h(SharedSection, {
5594
+ }) : null, /* @__PURE__ */ createElement(SharedSection, {
5448
5595
  t,
5449
5596
  rows: shared,
5450
5597
  pending,
@@ -5452,7 +5599,8 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
5452
5599
  act
5453
5600
  }));
5454
5601
  }
5455
- 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;
5456
5604
  const titles = useMarketTitles(manifests, mock !== void 0);
5457
5605
  const catalog = mock?.manifests ?? manifests;
5458
5606
  const marketable = mock === void 0 ? marketCatalog(manifests, installable) : catalog;
@@ -5462,10 +5610,44 @@ function MarketView({ t, manifests, installable, capabilities, freshness, onChan
5462
5610
  const updateMap = mock?.updates ?? updates ?? {};
5463
5611
  const rows = marketRows(source, effective, updateMap, byDefault, changed);
5464
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 = {} }) {
5465
5633
  const { pending, setPending, confirming, setConfirming, failed, setFailed, notice, setNotice } = useMarketTransient({
5466
5634
  mock,
5467
5635
  onPending
5468
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);
5469
5651
  const provision = useHostWrite({
5470
5652
  channel: "provision",
5471
5653
  networkText: t("panels.failed")
@@ -5493,21 +5675,16 @@ function MarketView({ t, manifests, installable, capabilities, freshness, onChan
5493
5675
  setNotice(t("panels.failed"));
5494
5676
  }
5495
5677
  };
5496
- const removing = removingIdOf(pending, failed);
5497
- const steady = useHeldRow(pending, (id) => catalog.some((manifest) => manifest.id === id));
5498
- const pinned = pinnedRowOf(pending, steady.held);
5499
- usePublishMarketBusy(heldIdOf(pending, steady.held));
5500
- 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);
5501
5678
  const pendingRow = pendingRowOf({
5502
5679
  pending,
5503
5680
  removing,
5504
5681
  rows,
5505
5682
  titles
5506
5683
  });
5507
- const selfRow = workbenchRow(mock === void 0 ? workbench : mock.workbench);
5684
+ const self = workbenchRow(mock === void 0 ? workbench : mock.workbench);
5508
5685
  const shown = withPinnedRow(pendingRow === void 0 ? rows : [...rows, pendingRow], pinned);
5509
- const self = selfRow;
5510
- const pluginList = installedPluginRows(mock?.plugins ?? plugins ?? [], byDefault, changed);
5686
+ const pluginSource = mock?.plugins ?? plugins ?? null;
5687
+ const pluginList = installedPluginRows(pluginSource ?? [], byDefault, changed);
5511
5688
  const rowById = new Map([
5512
5689
  ...shown,
5513
5690
  ...self === void 0 ? [] : [self],
@@ -5532,17 +5709,18 @@ function MarketView({ t, manifests, installable, capabilities, freshness, onChan
5532
5709
  });
5533
5710
  useSettleHold({
5534
5711
  pending,
5535
- landed: pendingLanded(pending, updateMap, effective, workbench?.installed),
5712
+ landed: pendingLanded(pending, updateMap, effective, workbench?.installed, shared, pluginSource === null ? null : pluginList),
5536
5713
  t,
5537
5714
  onChanged,
5715
+ selfUpdate: mock?.selfUpdate ?? selfUpdate,
5538
5716
  setPending,
5539
5717
  setFailed
5540
5718
  });
5541
5719
  const settled = marketSettled(freshness, installedRead);
5542
5720
  const nothing = shown.length === 0 && self === void 0 && installedList.length === 0 && pluginList.length === 0;
5543
- if (!settled || (settling?.size ?? 0) > 0 && shown.length === 0 && installedList.length === 0) return /* @__PURE__ */ h(MarketChecking, { t });
5544
- if (nothing) return /* @__PURE__ */ h(MarketEmpty, { t });
5545
- 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, {
5546
5724
  t,
5547
5725
  self,
5548
5726
  shown,
@@ -5556,7 +5734,7 @@ function MarketView({ t, manifests, installable, capabilities, freshness, onChan
5556
5734
  onConfirming: setConfirming,
5557
5735
  setDefault,
5558
5736
  boardBusy
5559
- }), /* @__PURE__ */ h(ConfirmUninstall, {
5737
+ }), /* @__PURE__ */ createElement(ConfirmUninstall, {
5560
5738
  key: confirming ?? "",
5561
5739
  t,
5562
5740
  name: confirmingRow === void 0 ? null : marketRowTitle(confirmingRow, t),
@@ -5860,23 +6038,61 @@ function attentionWordLabel(attention, t) {
5860
6038
  }
5861
6039
  //#endregion
5862
6040
  //#region src/app/layouts/project-selection.ts
5863
- var listeners$2 = /* @__PURE__ */ new Set();
6041
+ var listeners$3 = /* @__PURE__ */ new Set();
5864
6042
  function selectedProjectId() {
5865
6043
  const stored = readText(STORAGE_KEY_PROJECT);
5866
6044
  return stored === "" ? null : stored;
5867
6045
  }
5868
6046
  function selectProject(workspaceId) {
5869
6047
  writeText(STORAGE_KEY_PROJECT, workspaceId);
5870
- for (const listener of [...listeners$2]) try {
6048
+ for (const listener of [...listeners$3]) try {
5871
6049
  listener();
5872
6050
  } catch {}
5873
6051
  }
5874
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) {
5875
6084
  listeners$2.add(listener);
5876
6085
  return () => {
5877
6086
  listeners$2.delete(listener);
5878
6087
  };
5879
6088
  }
6089
+ /**
6090
+ * 组件里读运行态档位(启动后解析出来才变一次,变了会重渲染)。
6091
+ * @returns 运行态档位。
6092
+ */
6093
+ function useRuntimeSidebarEdition() {
6094
+ return useSyncExternalStore(subscribeSidebarEdition, runtimeSidebarEdition, runtimeSidebarEdition);
6095
+ }
5880
6096
  //#endregion
5881
6097
  //#region src/app/layouts/rightbar/use-panels.ts
5882
6098
  function shouldDropPanels(workspace, previous) {
@@ -5885,6 +6101,7 @@ function shouldDropPanels(workspace, previous) {
5885
6101
  function useEnabledUnits(refreshToken, workspace) {
5886
6102
  const [enabled, setEnabled] = useState(null);
5887
6103
  const lastWorkspace = useRef(workspace);
6104
+ const factRev = useFactRevision("panels");
5888
6105
  useEffect(() => {
5889
6106
  let cancelled = false;
5890
6107
  if (shouldDropPanels(workspace, lastWorkspace.current)) {
@@ -5908,7 +6125,7 @@ function useEnabledUnits(refreshToken, workspace) {
5908
6125
  };
5909
6126
  }, [
5910
6127
  refreshToken,
5911
- useFactRevision("panels"),
6128
+ factRev,
5912
6129
  workspace
5913
6130
  ]);
5914
6131
  return enabled;
@@ -5920,7 +6137,10 @@ function useSelectedProjectId() {
5920
6137
  }
5921
6138
  function useBoardWorkspace(workspaces, sessions) {
5922
6139
  const projectId = useSelectedProjectId();
5923
- 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;
5924
6144
  return {
5925
6145
  workspace,
5926
6146
  path: workspace?.path ?? null
@@ -5963,12 +6183,11 @@ function readModuleVersions(force = false) {
5963
6183
  function readInstalledPlugins(force = false) {
5964
6184
  return apiGet(INSTALLED_PLUGINS_ROUTE, force ? { force: "1" } : void 0);
5965
6185
  }
5966
- //#endregion
5967
- //#region src/app/layouts/market/use-module-versions.ts
5968
6186
  var state = {
5969
6187
  modules: null,
5970
6188
  plugins: null,
5971
6189
  workbench: null,
6190
+ selfUpdate: null,
5972
6191
  read: false,
5973
6192
  checkedAt: null
5974
6193
  };
@@ -5976,6 +6195,14 @@ var listeners$1 = /* @__PURE__ */ new Set();
5976
6195
  var inFlight = null;
5977
6196
  var readSeq = 0;
5978
6197
  var newestForceSeq = -1;
6198
+ var epoch = 0;
6199
+ /**
6200
+ * 写完之后把读数作废:这之前发出去的在飞读取即使回来也不许再发布(它读的是改之前的盘)。
6201
+ * 每次写成功都调用一次,再配一次 `force + fresh` 的读。
6202
+ */
6203
+ function bumpModuleVersionsEpoch() {
6204
+ epoch += 1;
6205
+ }
5979
6206
  function moduleVersionsValue() {
5980
6207
  return state;
5981
6208
  }
@@ -5989,11 +6216,13 @@ function publish(next) {
5989
6216
  state = next;
5990
6217
  for (const listener of [...listeners$1]) listener();
5991
6218
  }
5992
- function runModuleVersionsRead(force = false) {
5993
- 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;
5994
6222
  const seq = readSeq += 1;
5995
6223
  if (force) newestForceSeq = seq;
5996
6224
  const promise = Promise.all([readModuleVersions(force), readInstalledPlugins(force)]).catch(() => null).then((responses) => {
6225
+ if (at !== epoch) return;
5997
6226
  if (!force && seq < newestForceSeq) return;
5998
6227
  const versions = responses?.[0];
5999
6228
  const plugins = responses?.[1];
@@ -6001,6 +6230,7 @@ function runModuleVersionsRead(force = false) {
6001
6230
  modules: versions?.ok === true ? versions.modules : state.modules,
6002
6231
  plugins: plugins?.ok === true ? plugins.plugins : state.plugins,
6003
6232
  workbench: versions?.ok === true ? versions.workbench ?? null : state.workbench,
6233
+ selfUpdate: versions?.ok === true ? versions.selfUpdate ?? null : state.selfUpdate,
6004
6234
  read: true,
6005
6235
  checkedAt: Date.now()
6006
6236
  });
@@ -6009,6 +6239,7 @@ function runModuleVersionsRead(force = false) {
6009
6239
  });
6010
6240
  inFlight = {
6011
6241
  force,
6242
+ epoch: at,
6012
6243
  promise
6013
6244
  };
6014
6245
  return promise;
@@ -6028,12 +6259,13 @@ function useModuleVersions() {
6028
6259
  runModuleVersionsRead(false);
6029
6260
  }, [factRev]);
6030
6261
  const reload = useCallback((options) => {
6031
- runModuleVersionsRead(options?.force === true);
6262
+ runModuleVersionsRead(options?.force === true, options?.fresh === true);
6032
6263
  }, []);
6033
6264
  return {
6034
6265
  modules: value.modules,
6035
6266
  plugins: value.plugins,
6036
6267
  workbench: value.workbench,
6268
+ selfUpdate: value.selfUpdate,
6037
6269
  read: value.read,
6038
6270
  checkedAt: value.checkedAt,
6039
6271
  reload
@@ -6111,7 +6343,7 @@ function AddModuleRegistry({ t, state }) {
6111
6343
  useDismissOnOutsidePointer(registryRoot, state.registryOpen, (next) => {
6112
6344
  if (!next) state.closeRegistry();
6113
6345
  });
6114
- return /* @__PURE__ */ h("div", {
6346
+ return /* @__PURE__ */ createElement("div", {
6115
6347
  className: AddModule_module_default.registryWrap,
6116
6348
  ref: registryRoot,
6117
6349
  onKeyDown: (event) => {
@@ -6119,7 +6351,7 @@ function AddModuleRegistry({ t, state }) {
6119
6351
  event.stopPropagation();
6120
6352
  state.closeRegistry();
6121
6353
  }
6122
- }, /* @__PURE__ */ h("button", {
6354
+ }, /* @__PURE__ */ createElement("button", {
6123
6355
  type: "button",
6124
6356
  ref: registryAnchor,
6125
6357
  className: AddModule_module_default.registryToggle,
@@ -6128,7 +6360,7 @@ function AddModuleRegistry({ t, state }) {
6128
6360
  "aria-controls": REGISTRY_ID,
6129
6361
  disabled: state.phase === "inspecting",
6130
6362
  onClick: state.toggleRegistry
6131
- }, /* @__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", {
6132
6364
  id: REGISTRY_ID,
6133
6365
  className: AddModule_module_default.registry,
6134
6366
  ref: registryPanel,
@@ -6137,17 +6369,17 @@ function AddModuleRegistry({ t, state }) {
6137
6369
  style: registryPosition ?? void 0
6138
6370
  }, state.choices.map((option) => {
6139
6371
  const active = option.choice.kind === state.choice.kind && option.choice.value === state.choice.value;
6140
- if (!(option.choice.kind === "custom")) return /* @__PURE__ */ h("label", {
6372
+ if (!(option.choice.kind === "custom")) return /* @__PURE__ */ createElement("label", {
6141
6373
  key: `${option.choice.kind}|${option.choice.value}`,
6142
6374
  className: AddModule_module_default.registryOption,
6143
6375
  "data-checked": active
6144
- }, /* @__PURE__ */ h("input", {
6376
+ }, /* @__PURE__ */ createElement("input", {
6145
6377
  type: "radio",
6146
6378
  name: REGISTRY_ID,
6147
6379
  checked: active,
6148
6380
  onChange: () => state.setChoice(option.choice)
6149
- }), /* @__PURE__ */ h("span", { className: AddModule_module_default.registryTitle }, /* @__PURE__ */ h("span", null, optionLabel(option, t))));
6150
- 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", {
6151
6383
  key: `${option.choice.kind}|${option.choice.value}`,
6152
6384
  className: AddModule_module_default.registryOption,
6153
6385
  "data-checked": active,
@@ -6157,12 +6389,12 @@ function AddModuleRegistry({ t, state }) {
6157
6389
  onFocusCapture: () => {
6158
6390
  if (!active) state.setChoice(option.choice);
6159
6391
  }
6160
- }, /* @__PURE__ */ h("label", { className: AddModule_module_default.registryPick }, /* @__PURE__ */ h("input", {
6392
+ }, /* @__PURE__ */ createElement("label", { className: AddModule_module_default.registryPick }, /* @__PURE__ */ createElement("input", {
6161
6393
  type: "radio",
6162
6394
  name: REGISTRY_ID,
6163
6395
  checked: active,
6164
6396
  onChange: () => state.setChoice(option.choice)
6165
- }), /* @__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, {
6166
6398
  type: "text",
6167
6399
  className: AddModule_module_default.registryField,
6168
6400
  "aria-label": t("panels.market.add.registryCustom"),
@@ -6170,16 +6402,16 @@ function AddModuleRegistry({ t, state }) {
6170
6402
  value: state.custom,
6171
6403
  invalid: customBad,
6172
6404
  onChange: (event) => state.setCustom(event.target.value)
6173
- }), customBad ? /* @__PURE__ */ h("span", {
6405
+ }), customBad ? /* @__PURE__ */ createElement("span", {
6174
6406
  className: AddModule_module_default.inputError,
6175
6407
  role: "alert"
6176
- }, 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")));
6177
6409
  })) : null);
6178
6410
  }
6179
6411
  //#endregion
6180
6412
  //#region src/app/layouts/market/AddModuleForm.tsx
6181
6413
  function AddModuleForm({ t, state }) {
6182
- 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, {
6183
6415
  type: "text",
6184
6416
  className: AddModule_module_default.input,
6185
6417
  value: state.spec,
@@ -6192,27 +6424,27 @@ function AddModuleForm({ t, state }) {
6192
6424
  onKeyDown: (event) => {
6193
6425
  if (event.key === "Enter" && state.spec.trim() !== "") state.check();
6194
6426
  }
6195
- })), state.problem === null ? null : /* @__PURE__ */ h("p", {
6427
+ })), state.problem === null ? null : /* @__PURE__ */ createElement("p", {
6196
6428
  className: AddModule_module_default.problem,
6197
6429
  role: "alert"
6198
- }, 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", {
6199
6431
  className: AddModule_module_default.problem,
6200
6432
  role: "alert"
6201
- }, 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", {
6202
6434
  type: "button",
6203
6435
  className: AddModule_module_default.guideToggle,
6204
6436
  "aria-expanded": state.guideOpen,
6205
6437
  onClick: state.toggleGuide
6206
- }, /* @__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, {
6207
6439
  t,
6208
6440
  state
6209
- })), 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", {
6210
6442
  className: AddModule_module_default.guideItem,
6211
6443
  key: item.exampleKey
6212
- }, /* @__PURE__ */ h("span", {
6444
+ }, /* @__PURE__ */ createElement("span", {
6213
6445
  className: AddModule_module_default.guideIndex,
6214
6446
  "aria-hidden": "true"
6215
- }, 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, {
6216
6448
  type: "button",
6217
6449
  size: "sm",
6218
6450
  variant: "outline",
@@ -6224,13 +6456,13 @@ var SafetyNote_module_default = { note: "_note_1enlz_1" };
6224
6456
  //#endregion
6225
6457
  //#region src/app/layouts/market/SafetyNote.tsx
6226
6458
  function SafetyNote({ t }) {
6227
- return /* @__PURE__ */ h("p", {
6459
+ return /* @__PURE__ */ createElement("p", {
6228
6460
  className: SafetyNote_module_default.note,
6229
6461
  role: "note"
6230
- }, /* @__PURE__ */ h(IconWarningOutlineRegular, {
6462
+ }, /* @__PURE__ */ createElement(IconWarningOutlineRegular, {
6231
6463
  size: 14,
6232
6464
  "aria-hidden": "true"
6233
- }), /* @__PURE__ */ h("span", null, t("panels.market.add.guideSafety")));
6465
+ }), /* @__PURE__ */ createElement("span", null, t("panels.market.add.guideSafety")));
6234
6466
  }
6235
6467
  //#endregion
6236
6468
  //#region src/app/layouts/market/AddModuleStages.tsx
@@ -6243,11 +6475,11 @@ function supplyTone(state) {
6243
6475
  return SUPPLY_TONES[state] ?? AddModule_module_default.note;
6244
6476
  }
6245
6477
  function AddModulePending({ t, kind }) {
6246
- 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", {
6247
6479
  className: AddModule_module_default.heroIcon,
6248
6480
  "data-state": "ongoing",
6249
6481
  "aria-hidden": "true"
6250
- }, /* @__PURE__ */ h(Spinner, { size: 28 })), /* @__PURE__ */ h("h2", {
6482
+ }, /* @__PURE__ */ createElement(Spinner, { size: 28 })), /* @__PURE__ */ createElement("h2", {
6251
6483
  className: AddModule_module_default.pendingTitle,
6252
6484
  role: "status"
6253
6485
  }, kind === "inspecting" ? t("panels.market.add.classifying") : t("panels.market.add.installingTitle"))));
@@ -6258,7 +6490,7 @@ function AddModulePreview({ t, state }) {
6258
6490
  const source = preview.registry === "" ? t("panels.market.add.registryDefault") : preview.registry;
6259
6491
  const plugin = preview.kind === "plugin";
6260
6492
  const pluginName = plugin ? preview.pluginName : void 0;
6261
- 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);
6262
6494
  }
6263
6495
  function AddModuleResult({ t, state }) {
6264
6496
  const outcome = state.outcome;
@@ -6274,20 +6506,20 @@ function AddModuleResult({ t, state }) {
6274
6506
  });
6275
6507
  const name = outcome.module.kind === "module" ? outcome.module.unit : outcome.module.pkg;
6276
6508
  const why = restartWhy(outcome.change, t);
6277
- 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", {
6278
6510
  className: AddModule_module_default.heroIcon,
6279
6511
  "data-state": kind === "failed" ? "error" : kind === "cancelled" ? "idle" : "done",
6280
6512
  "aria-hidden": "true"
6281
- }, 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, {
6282
6514
  state: "idle",
6283
6515
  size: 28
6284
- }) : /* @__PURE__ */ h(IconCheckCircleFillRegular, { size: 28 })), /* @__PURE__ */ h("h2", {
6516
+ }) : /* @__PURE__ */ createElement(IconCheckCircleFillRegular, { size: 28 })), /* @__PURE__ */ createElement("h2", {
6285
6517
  className: AddModule_module_default.wizardTitle,
6286
6518
  role: kind === "failed" ? "alert" : "status"
6287
- }, 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", {
6288
6520
  className: AddModule_module_default.resultWarn,
6289
6521
  role: "alert"
6290
- }, 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)));
6291
6523
  }
6292
6524
  //#endregion
6293
6525
  //#region src/app/layouts/market/use-add-module.ts
@@ -6499,7 +6731,7 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
6499
6731
  const failed = state.outcome?.change.application === "failed";
6500
6732
  const builds = state.builds;
6501
6733
  const notModule = state.outcome?.supply.state === "not-a-module";
6502
- 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, {
6503
6735
  type: "button",
6504
6736
  variant: "primary",
6505
6737
  size: "md",
@@ -6507,27 +6739,27 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
6507
6739
  disabled: empty || checking,
6508
6740
  "aria-busy": checking,
6509
6741
  onClick: state.check
6510
- }, 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, {
6511
6743
  type: "button",
6512
6744
  variant: "outline",
6513
6745
  size: "md",
6514
6746
  onClick: state.edit
6515
- }, t("panels.market.add.edit")), /* @__PURE__ */ h(Button, {
6747
+ }, t("panels.market.add.edit")), /* @__PURE__ */ createElement(Button, {
6516
6748
  type: "button",
6517
6749
  variant: "primary",
6518
6750
  size: "md",
6519
6751
  onClick: () => state.install()
6520
- }, t("panels.market.add.run"))) : null, installing ? /* @__PURE__ */ h(Button, {
6752
+ }, t("panels.market.add.run"))) : null, installing ? /* @__PURE__ */ createElement(Button, {
6521
6753
  type: "button",
6522
6754
  variant: "outline",
6523
6755
  size: "md",
6524
6756
  onClick: state.cancelInstall
6525
- }, 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, {
6526
6758
  type: "button",
6527
6759
  variant: "outline",
6528
6760
  size: "md",
6529
6761
  onClick: state.edit
6530
- }, t("panels.market.add.changeRegistry")) : null, notModule ? /* @__PURE__ */ h(Button, {
6762
+ }, t("panels.market.add.changeRegistry")) : null, notModule ? /* @__PURE__ */ createElement(Button, {
6531
6763
  type: "button",
6532
6764
  variant: "outline",
6533
6765
  size: "md",
@@ -6535,23 +6767,23 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
6535
6767
  disabled: state.removing,
6536
6768
  "aria-busy": state.removing,
6537
6769
  onClick: state.removeIt
6538
- }, 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, {
6539
6771
  type: "button",
6540
6772
  variant: "outline",
6541
6773
  size: "md",
6542
6774
  onClick: onClose
6543
- }, 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, {
6544
6776
  type: "button",
6545
6777
  variant: "primary",
6546
6778
  size: "md",
6547
6779
  onClick: () => state.install(builds)
6548
- }, 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, {
6549
6781
  type: "button",
6550
6782
  variant: "primary",
6551
6783
  size: "md",
6552
6784
  onClick: () => state.install()
6553
6785
  }, t("panels.market.add.retry")) : null) : null);
6554
- return /* @__PURE__ */ h(Modal, {
6786
+ return /* @__PURE__ */ createElement(Modal, {
6555
6787
  open,
6556
6788
  onClose: () => {
6557
6789
  if (!installing) onClose();
@@ -6562,19 +6794,19 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
6562
6794
  className: AddModule_module_default.dialog,
6563
6795
  contentClassName: AddModule_module_default.content,
6564
6796
  footer
6565
- }, /* @__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, {
6566
6798
  t,
6567
6799
  state
6568
- }) : null, state.phase === "inspecting" ? /* @__PURE__ */ h(AddModulePending, {
6800
+ }) : null, state.phase === "inspecting" ? /* @__PURE__ */ createElement(AddModulePending, {
6569
6801
  t,
6570
6802
  kind: "inspecting"
6571
- }) : null, state.phase === "preview" ? /* @__PURE__ */ h(AddModulePreview, {
6803
+ }) : null, state.phase === "preview" ? /* @__PURE__ */ createElement(AddModulePreview, {
6572
6804
  t,
6573
6805
  state
6574
- }) : null, state.phase === "installing" ? /* @__PURE__ */ h(AddModulePending, {
6806
+ }) : null, state.phase === "installing" ? /* @__PURE__ */ createElement(AddModulePending, {
6575
6807
  t,
6576
6808
  kind: "installing"
6577
- }) : null, state.phase === "result" ? /* @__PURE__ */ h(AddModuleResult, {
6809
+ }) : null, state.phase === "result" ? /* @__PURE__ */ createElement(AddModuleResult, {
6578
6810
  t,
6579
6811
  state
6580
6812
  }) : null));
@@ -6589,11 +6821,15 @@ var MOCK_FRESHNESS = {
6589
6821
  };
6590
6822
  var NO_UNITS = /* @__PURE__ */ new Set();
6591
6823
  function useLiveManifests(units) {
6592
- 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);
6593
6827
  return units.manifests();
6594
6828
  }
6595
6829
  function useInstallableUnits(units) {
6596
- 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);
6597
6833
  return units.installable();
6598
6834
  }
6599
6835
  function makeMarketEntryIcon(units) {
@@ -6618,24 +6854,38 @@ function makeMarketEntryIcon(units) {
6618
6854
  useEffect(() => () => {
6619
6855
  publishPanelHint(MARKET_PANEL_ID, null);
6620
6856
  }, []);
6621
- return /* @__PURE__ */ h(IconModules, { size });
6857
+ return /* @__PURE__ */ createElement(IconModules, { size });
6622
6858
  };
6623
6859
  }
6624
6860
  function MarketPanel({ t, units }) {
6625
6861
  const manifests = useLiveManifests(units);
6626
6862
  const installable = useInstallableUnits(units);
6627
6863
  const { capabilities, checkedAt, checking, forceProbe, reload: reloadCapability } = useCapabilityMap(0);
6628
- const { modules, plugins, workbench, read: installedRead, reload: reloadVersions } = useModuleVersions();
6864
+ const { modules, plugins, workbench, selfUpdate, read: installedRead, reload: reloadVersions } = useModuleVersions();
6629
6865
  const machineBoard = useEnabledUnits(0, null);
6630
6866
  const [adding, setAdding] = useState(false);
6631
6867
  const [acting, setActing] = useState(false);
6632
6868
  const openAddModule = useCallback(() => setAdding(true), []);
6633
6869
  const updates = useMemo(() => marketUpdatesOf(modules), [modules]);
6634
6870
  const installed = modules === null ? void 0 : withClientRefusals(modules, units.refusals());
6635
- 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
+ }
6636
6882
  reloadCapability();
6637
6883
  reloadVersions();
6638
- }, [reloadCapability, reloadVersions]);
6884
+ }, [
6885
+ reloadCapability,
6886
+ reloadVersions,
6887
+ forceProbe
6888
+ ]);
6639
6889
  const enteredRef = useRef(false);
6640
6890
  useEffect(() => {
6641
6891
  if (enteredRef.current) return;
@@ -6687,26 +6937,23 @@ function MarketPanel({ t, units }) {
6687
6937
  const shownFreshness = mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS;
6688
6938
  const shownRead = mock === void 0 ? installedRead : mock.installedRead ?? true;
6689
6939
  const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking || acting;
6690
- 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", {
6691
6941
  type: "button",
6692
6942
  className: `${MarketPage_module_default.marketIconButton}${shownFreshness.checking ? ` ${MarketPage_module_default.marketIconButtonSpinning}` : ""}`,
6693
6943
  "aria-label": t("panels.market.checkUpdates"),
6694
6944
  disabled: busy,
6695
- onClick: () => {
6696
- forceProbe();
6697
- reloadVersions({ force: true });
6698
- }
6699
- }, /* @__PURE__ */ h("span", {
6945
+ onClick: () => reload({ force: true })
6946
+ }, /* @__PURE__ */ createElement("span", {
6700
6947
  className: MarketPage_module_default.marketIconWrap,
6701
6948
  "aria-hidden": "true"
6702
- }, /* @__PURE__ */ h(IconRefreshOutlineRegular, null)))), /* @__PURE__ */ h(Button, {
6949
+ }, /* @__PURE__ */ createElement(IconRefreshOutlineRegular, null)))), /* @__PURE__ */ createElement(Button, {
6703
6950
  variant: "primary",
6704
6951
  size: "sm",
6705
6952
  className: MarketPage_module_default.marketAddButton,
6706
- icon: /* @__PURE__ */ h(IconPlusOutlineRegular, { size: 13 }),
6953
+ icon: /* @__PURE__ */ createElement(IconPlusOutlineRegular, { size: 13 }),
6707
6954
  disabled: busy,
6708
6955
  onClick: openAddModule
6709
- }, t("panels.market.add.open")))), devMarket.strip, /* @__PURE__ */ h(MarketView, {
6956
+ }, t("panels.market.add.open")))), devMarket.strip, /* @__PURE__ */ createElement(MarketView, {
6710
6957
  key: `${mock?.id ?? "real-market"}-${mockNonce}`,
6711
6958
  t,
6712
6959
  manifests,
@@ -6719,16 +6966,17 @@ function MarketPanel({ t, units }) {
6719
6966
  installed,
6720
6967
  installedRead: shownRead,
6721
6968
  workbench,
6969
+ selfUpdate,
6722
6970
  plugins,
6723
6971
  settling: mock === void 0 ? settling : void 0,
6724
6972
  mock,
6725
6973
  defaults: machineBoard?.defaults ?? [],
6726
6974
  changed: machineBoard?.changed ?? {}
6727
- }), /* @__PURE__ */ h(AddModuleDialog, {
6975
+ }), /* @__PURE__ */ createElement(AddModuleDialog, {
6728
6976
  t,
6729
6977
  open: adding,
6730
6978
  onClose: () => setAdding(false),
6731
- onInstalled: reload
6979
+ onInstalled: () => reload({ force: true })
6732
6980
  }));
6733
6981
  }
6734
6982
  function registerMarketPanel(ctx, units) {
@@ -7103,7 +7351,7 @@ function DebugFooterAction({ wide, t, useWorkspaces, useSessions }) {
7103
7351
  where: here.path ?? ""
7104
7352
  }, workspacePath);
7105
7353
  const view = debugFooterView(state, t, situation === "off-workspace" || situation === "other-board" ? "workspace" : situation === "panel-closed" ? "panel" : "none");
7106
- const dot = /* @__PURE__ */ h(StateDot, {
7354
+ const dot = /* @__PURE__ */ createElement(StateDot, {
7107
7355
  state: view.trouble !== "none" ? "error" : view.stalled ? "warning" : "done",
7108
7356
  className: view.trouble === "none" && !view.stalled ? DebugFooterAction_module_default.pulse : void 0
7109
7357
  });
@@ -7121,37 +7369,37 @@ function DebugFooterAction({ wide, t, useWorkspaces, useSessions }) {
7121
7369
  setArmed(false);
7122
7370
  act.send({ intent: "stop" });
7123
7371
  };
7124
- 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", {
7125
7373
  type: "button",
7126
7374
  className: DebugFooterAction_module_default.act,
7127
7375
  "aria-label": t("debug.act.resume"),
7128
7376
  onClick: press("resume")
7129
- }, /* @__PURE__ */ h(IconPlayOutlineRegular, { size: 12 })) : /* @__PURE__ */ h("button", {
7377
+ }, /* @__PURE__ */ createElement(IconPlayOutlineRegular, { size: 12 })) : /* @__PURE__ */ createElement("button", {
7130
7378
  type: "button",
7131
7379
  className: DebugFooterAction_module_default.act,
7132
7380
  "aria-label": t("debug.act.pause"),
7133
7381
  onClick: press("pause")
7134
- }, /* @__PURE__ */ h(IconPauseOutlineRegular, { size: 12 })), /* @__PURE__ */ h("button", {
7382
+ }, /* @__PURE__ */ createElement(IconPauseOutlineRegular, { size: 12 })), /* @__PURE__ */ createElement("button", {
7135
7383
  type: "button",
7136
7384
  className: cx(DebugFooterAction_module_default.act, DebugFooterAction_module_default.actStop, armed ? DebugFooterAction_module_default.actArmed : void 0),
7137
7385
  "data-act-state": armed ? "armed" : "idle",
7138
7386
  "aria-label": armed ? t("debug.act.stop.ask") : t("debug.act.stop"),
7139
7387
  onClick: onStop,
7140
7388
  onBlur: () => setArmed(false)
7141
- }, /* @__PURE__ */ h(IconStopFillRegular, { size: 12 }), armed ? /* @__PURE__ */ h("span", { className: DebugFooterAction_module_default.actLabel }, t("debug.act.stop.ask")) : null));
7142
- const status = /* @__PURE__ */ h("span", { className: DebugFooterAction_module_default.entryInner }, dot, wide === true ? /* @__PURE__ */ h("span", { className: DebugFooterAction_module_default.entryLine }, view.label) : null);
7143
- 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", {
7144
7392
  className: DebugFooterAction_module_default.entry,
7145
7393
  role: "status",
7146
7394
  "aria-label": `${view.label},${view.note}`
7147
- }, wide === true ? /* @__PURE__ */ h(Tip, {
7395
+ }, wide === true ? /* @__PURE__ */ createElement(Tip, {
7148
7396
  label: view.note,
7149
7397
  side: "top"
7150
7398
  }, status) : status), wide === true ? acts : null);
7151
- if (wide === true) return /* @__PURE__ */ h("span", { className: DebugFooterAction_module_default.slot }, row);
7152
- 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, {
7153
7401
  anchor: row,
7154
- 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),
7155
7403
  openDelayMs: 200
7156
7404
  }));
7157
7405
  }
@@ -7248,12 +7496,12 @@ function RecordFooterAction({ wide, t }) {
7248
7496
  const act = useDiyRecordAct();
7249
7497
  if (state === null) return null;
7250
7498
  const view = recordFooterView(state, t);
7251
- const dot = /* @__PURE__ */ h(StateDot, {
7499
+ const dot = /* @__PURE__ */ createElement(StateDot, {
7252
7500
  state: state.phase === "finished" ? "done" : "warning",
7253
7501
  className: state.phase === "armed" ? RecordFooterAction_module_default.pulse : void 0
7254
7502
  });
7255
7503
  const tone = state.phase === "finished" ? RecordFooterAction_module_default.done : RecordFooterAction_module_default.live;
7256
- 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", {
7257
7505
  key: one.intent,
7258
7506
  type: "button",
7259
7507
  className: RecordFooterAction_module_default.act,
@@ -7263,19 +7511,19 @@ function RecordFooterAction({ wide, t }) {
7263
7511
  act.send({ intent: one.intent });
7264
7512
  }
7265
7513
  }, one.label)));
7266
- const status = /* @__PURE__ */ h("span", { className: RecordFooterAction_module_default.entryInner }, dot, wide === true ? /* @__PURE__ */ h("span", { className: RecordFooterAction_module_default.entryLine }, view.label) : null);
7267
- 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", {
7268
7516
  className: RecordFooterAction_module_default.entry,
7269
7517
  role: "status",
7270
7518
  "aria-label": `${view.label},${view.note}`
7271
- }, wide === true ? /* @__PURE__ */ h(Tip, {
7519
+ }, wide === true ? /* @__PURE__ */ createElement(Tip, {
7272
7520
  label: view.note,
7273
7521
  side: "top"
7274
7522
  }, status) : status), wide === true ? acts : null);
7275
- if (wide === true) return /* @__PURE__ */ h("span", { className: RecordFooterAction_module_default.slot }, row);
7276
- 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, {
7277
7525
  anchor: row,
7278
- 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),
7279
7527
  openDelayMs: 200
7280
7528
  }));
7281
7529
  }
@@ -7294,30 +7542,52 @@ function registerRecordFooter(ctx) {
7294
7542
  //#region src/shared/api/config-sync.ts
7295
7543
  var CONFIG_SYNC_ROUTE = "config-sync";
7296
7544
  var CONFIG_SYNC_RESOURCE = "configSync";
7297
- var ConfigSyncSection_module_default = {
7298
- body: "_body_lw2ph_1",
7299
- lead: "_lead_lw2ph_7",
7300
- sources: "_sources_lw2ph_14",
7301
- sourcesLabel: "_sourcesLabel_lw2ph_21",
7302
- sourceOn: "_sourceOn_lw2ph_26",
7303
- sourceCount: "_sourceCount_lw2ph_29",
7304
- reading: "_reading_lw2ph_36",
7305
- status: "_status_lw2ph_42",
7306
- failure: "_failure_lw2ph_52",
7307
- failureTitle: "_failureTitle_lw2ph_62",
7308
- failureHint: "_failureHint_lw2ph_69",
7309
- failureAction: "_failureAction_lw2ph_74",
7310
- rows: "_rows_lw2ph_80",
7311
- row: "_row_lw2ph_80",
7312
- head: "_head_lw2ph_99",
7313
- pick: "_pick_lw2ph_106",
7314
- code: "_code_lw2ph_118",
7315
- missing: "_missing_lw2ph_123",
7316
- conflict: "_conflict_lw2ph_124",
7317
- 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"
7318
7588
  };
7319
7589
  //#endregion
7320
- //#region src/app/layouts/config-sync/ConfigSyncSection.tsx
7590
+ //#region src/app/layouts/workbench-settings/ConfigSyncItem.tsx
7321
7591
  var AUTO_RETRY_MS = 1200;
7322
7592
  var DIFF_MAX_LINES = 9;
7323
7593
  var TAG_KEYS = {
@@ -7344,41 +7614,41 @@ function diffLabels(t) {
7344
7614
  }
7345
7615
  function SourcePicker({ t, profiles, source, onPick }) {
7346
7616
  if (profiles.length === 0) return null;
7347
- return /* @__PURE__ */ h("div", {
7348
- className: ConfigSyncSection_module_default.sources,
7617
+ return /* @__PURE__ */ createElement("div", {
7618
+ className: ConfigSyncItem_module_default.sources,
7349
7619
  role: "group",
7350
7620
  "aria-label": t("configSync.source")
7351
- }, /* @__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, {
7352
7622
  key: profile.name,
7353
7623
  variant: profile.name === source ? "outline" : "ghost",
7354
7624
  size: "sm",
7355
- className: profile.name === source ? ConfigSyncSection_module_default.sourceOn : void 0,
7625
+ className: profile.name === source ? ConfigSyncItem_module_default.sourceOn : void 0,
7356
7626
  "aria-pressed": profile.name === source,
7357
7627
  title: profile.readable ? t("configSync.sourceRows", {
7358
7628
  name: profile.name,
7359
7629
  count: profile.candidates
7360
7630
  }) : t("configSync.sourceBroken"),
7361
7631
  onClick: () => onPick(profile.name)
7362
- }, 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")))));
7363
7633
  }
7364
7634
  function SourceRows({ t, rows, picked, profile, onToggle }) {
7365
- 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", {
7366
7636
  key: row.key,
7367
- className: ConfigSyncSection_module_default.row
7368
- }, /* @__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, {
7369
7639
  checked: picked.includes(row.key),
7370
7640
  label: row.id,
7371
7641
  title: row.state === "differs" ? t("configSync.conflictNote") : void 0,
7372
- className: ConfigSyncSection_module_default.pick,
7642
+ className: ConfigSyncItem_module_default.pick,
7373
7643
  onChange: (next) => onToggle(row.key, next)
7374
- }), /* @__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, {
7375
7645
  code: row.body,
7376
7646
  lang: "yaml",
7377
- className: ConfigSyncSection_module_default.code,
7647
+ className: ConfigSyncItem_module_default.code,
7378
7648
  copyLabel: t("configSync.code.copy"),
7379
7649
  copiedLabel: t("configSync.code.copied"),
7380
7650
  toolbarLabels: codeToolbarLabels(t)
7381
- }) : /* @__PURE__ */ h(DiffBlock, {
7651
+ }) : /* @__PURE__ */ createElement(DiffBlock, {
7382
7652
  diffs: [{
7383
7653
  path: row.id,
7384
7654
  oldText: row.ownBody,
@@ -7386,37 +7656,37 @@ function SourceRows({ t, rows, picked, profile, onToggle }) {
7386
7656
  }],
7387
7657
  labels: diffLabels(t),
7388
7658
  maxLines: DIFF_MAX_LINES,
7389
- className: ConfigSyncSection_module_default.code
7390
- }), row.missing.map((pkg) => /* @__PURE__ */ h("span", {
7659
+ className: ConfigSyncItem_module_default.code
7660
+ }), row.missing.map((pkg) => /* @__PURE__ */ createElement("span", {
7391
7661
  key: pkg,
7392
- className: ConfigSyncSection_module_default.missing
7662
+ className: ConfigSyncItem_module_default.missing
7393
7663
  }, t("configSync.missing", {
7394
7664
  pkg,
7395
7665
  profile
7396
- }))), 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)));
7397
7667
  }
7398
7668
  function AppliedRows({ t, applied }) {
7399
- 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("、") })}`);
7400
7670
  }
7401
7671
  function ReadingRow({ t }) {
7402
- return /* @__PURE__ */ h("div", { className: ConfigSyncSection_module_default.reading }, /* @__PURE__ */ h("p", {
7403
- className: ConfigSyncSection_module_default.status,
7672
+ return /* @__PURE__ */ createElement("div", { className: ConfigSyncItem_module_default.reading }, /* @__PURE__ */ createElement("p", {
7673
+ className: ConfigSyncItem_module_default.status,
7404
7674
  role: "status"
7405
- }, /* @__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 }));
7406
7676
  }
7407
7677
  function FailureRow({ t, blocker, onRetry }) {
7408
- return /* @__PURE__ */ h("div", {
7409
- className: ConfigSyncSection_module_default.failure,
7678
+ return /* @__PURE__ */ createElement("div", {
7679
+ className: ConfigSyncItem_module_default.failure,
7410
7680
  role: "alert",
7411
7681
  "data-config-sync-failure": ""
7412
- }, /* @__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, {
7413
7683
  size: "sm",
7414
7684
  variant: "ghost",
7415
- className: ConfigSyncSection_module_default.failureAction,
7685
+ className: ConfigSyncItem_module_default.failureAction,
7416
7686
  onClick: onRetry
7417
7687
  }, t("blocker.retry")));
7418
7688
  }
7419
- function ConfigSyncSection({ t }) {
7689
+ function ConfigSyncItem({ t }) {
7420
7690
  const [source, setSource] = useState("");
7421
7691
  const [revision, setRevision] = useState(0);
7422
7692
  const [guard, setGuard] = useState(0);
@@ -7492,13 +7762,13 @@ function ConfigSyncSection({ t }) {
7492
7762
  setRevision((current) => current + 1);
7493
7763
  });
7494
7764
  };
7495
- return /* @__PURE__ */ h(SettingsSection, {
7496
- label: t("configSync.nav"),
7765
+ return /* @__PURE__ */ createElement(SettingsItem, {
7497
7766
  title: t("configSync.nav"),
7498
- action: failure === null ? /* @__PURE__ */ h(Button, {
7767
+ description: t("configSync.lead"),
7768
+ action: failure === null ? /* @__PURE__ */ createElement(Button, {
7499
7769
  variant: "ghost",
7500
7770
  size: "sm",
7501
- icon: /* @__PURE__ */ h(IconRefreshOutlineRegular, {
7771
+ icon: /* @__PURE__ */ createElement(IconRefreshOutlineRegular, {
7502
7772
  size: 16,
7503
7773
  "aria-hidden": "true"
7504
7774
  }),
@@ -7506,42 +7776,319 @@ function ConfigSyncSection({ t }) {
7506
7776
  disabled: reading.busy,
7507
7777
  title: t("configSync.refresh")
7508
7778
  }, t("configSync.refresh")) : void 0
7509
- }, /* @__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, {
7510
7780
  t,
7511
7781
  profiles: value.profiles,
7512
7782
  source: value.source,
7513
7783
  onPick: pickSource
7514
- }), 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, {
7515
7785
  t,
7516
7786
  blocker: failure,
7517
7787
  onRetry: reread
7518
- }) : null, write.failed !== null ? /* @__PURE__ */ h(Note, {
7788
+ }) : null, write.failed !== null ? /* @__PURE__ */ createElement(Note, {
7519
7789
  tone: "problem",
7520
7790
  role: "alert"
7521
- }, write.failed) : null, applied !== null ? /* @__PURE__ */ h(AppliedRows, {
7791
+ }, write.failed) : null, applied !== null ? /* @__PURE__ */ createElement(AppliedRows, {
7522
7792
  t,
7523
7793
  applied
7524
- }) : 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", {
7525
7795
  path: broken.path,
7526
7796
  reason: broken.reason
7527
- })) : 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, {
7528
7798
  t,
7529
7799
  rows,
7530
7800
  picked,
7531
7801
  profile: value.self,
7532
7802
  onToggle: toggle
7533
- }) : 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, {
7534
7804
  variant: "primary",
7535
7805
  size: "md",
7536
- icon: /* @__PURE__ */ h(IconRefreshOutlineRegular, {
7537
- size: 16,
7538
- "aria-hidden": "true"
7539
- }),
7540
7806
  disabled: chosen.length === 0 || busy.busy,
7541
7807
  onClick: apply
7542
7808
  }, chosen.length === 0 ? t("configSync.applyNone") : busy.busy ? t("configSync.applying") : t("configSync.apply", { count: chosen.length }))) : null) : null));
7543
7809
  }
7544
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
7545
8092
  //#region src/shared/api/diy.ts
7546
8093
  var DIY_PRESET_ID = "workbench-diy";
7547
8094
  var WORKSHOP_RELATIVE = "workbench/diy";
@@ -7948,7 +8495,7 @@ function createForcePlan() {
7948
8495
  * 拿到这一拍之后门该怎么办:`close` 撤掉放行、`hold` 停在原地等用户动手、`wait` 接着轮询。
7949
8496
  * 桥接坏了(`bridgeIssues` 非空)与 DIY 模式挂不起来(`diyGap` 非空)都是**不拦路**的,
7950
8497
  * 但那块「怎么解决」得先真的画出来 —— 停在原地 + 一颗「先进入工作台」才叫不拦路,
7951
- * 就绪即撤等于把那块提示连同修法一起丢掉,用户进去只会发现「工作台 DIY」整个不在。
8498
+ * 就绪即撤等于把那块提示连同修法一起丢掉,用户进去只会发现「工作台 DIY 模式」整个不在。
7952
8499
  */
7953
8500
  function gateActionOf(snapshot) {
7954
8501
  if (snapshot.phase === "failed") return "hold";
@@ -8249,7 +8796,6 @@ var MODULES_UPDATE_DEPENDENCY_TOOL = "workbench_modules_update_dependency";
8249
8796
  var MODULES_UPDATE_PLUGIN_TOOL = "workbench_modules_update_plugin";
8250
8797
  var MODULES_UNINSTALL_PLUGIN_TOOL = "workbench_modules_uninstall_plugin";
8251
8798
  var MODULES_UPDATE_WORKBENCH_TOOL = "workbench_modules_update_workbench";
8252
- var DIY_LIST_TOOL = "workbench_diy_list";
8253
8799
  var DIY_STATUS_TOOL = "workbench_diy_status";
8254
8800
  var DIY_PANEL_TOOL = "workbench_diy_panel";
8255
8801
  var DIY_COMPONENTS_TOOL = "workbench_diy_components";
@@ -8300,7 +8846,6 @@ var ALL_TOOLS = [
8300
8846
  MODULES_UPDATE_PLUGIN_TOOL,
8301
8847
  MODULES_UNINSTALL_PLUGIN_TOOL,
8302
8848
  MODULES_UPDATE_WORKBENCH_TOOL,
8303
- DIY_LIST_TOOL,
8304
8849
  DIY_STATUS_TOOL,
8305
8850
  DIY_PANEL_TOOL,
8306
8851
  DIY_COMPONENTS_TOOL,
@@ -8339,7 +8884,6 @@ var ALL_TOOLS = [
8339
8884
  var READ_TOOLS = [
8340
8885
  PANELS_LIST_TOOL,
8341
8886
  MODULES_LIST_TOOL,
8342
- DIY_LIST_TOOL,
8343
8887
  DIY_STATUS_TOOL,
8344
8888
  DIY_PANEL_TOOL,
8345
8889
  DIY_COMPONENTS_TOOL,
@@ -8447,14 +8991,34 @@ function shellApprovalPlan(input, t) {
8447
8991
  function shellApprovalDetail(input, t) {
8448
8992
  const plan = shellApprovalPlan(input, t);
8449
8993
  if (plan === void 0) return void 0;
8450
- if (plan.rows.length === 0) return h(Fragment, null);
8451
- return /* @__PURE__ */ h(ApprovalPlan, {
8994
+ if (plan.rows.length === 0) return createElement(Fragment, null);
8995
+ return /* @__PURE__ */ createElement(ApprovalPlan, {
8452
8996
  rows: plan.rows,
8453
8997
  warn: plan.warn
8454
8998
  });
8455
8999
  }
8456
9000
  //#endregion
8457
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
+ }
8458
9022
  var browserPersistence = {
8459
9023
  readFlag,
8460
9024
  writeFlag,
@@ -8548,27 +9112,27 @@ var ColumnSwitch_module_default = {
8548
9112
  function ColumnSwitch({ useRightbar, selectColumn, dshColumn, t }) {
8549
9113
  const pressed = pressedColumns(useRightbar((snapshot) => snapshot), useSyncExternalStore(dshColumn.subscribe, dshColumn.getSnapshot));
8550
9114
  const workbenchLabel = pressed.workbench ? t("rightbar.collapse") : t("rightbar.column.workbench");
8551
- return /* @__PURE__ */ h("span", {
9115
+ return /* @__PURE__ */ createElement("span", {
8552
9116
  className: ColumnSwitch_module_default.group,
8553
9117
  role: "group",
8554
9118
  "aria-label": t("rightbar.column.label")
8555
- }, /* @__PURE__ */ h(Tip, { label: workbenchLabel }, /* @__PURE__ */ h(Button, {
9119
+ }, /* @__PURE__ */ createElement(Tip, { label: workbenchLabel }, /* @__PURE__ */ createElement(Button, {
8556
9120
  type: "button",
8557
9121
  size: "sm",
8558
9122
  variant: "ghost",
8559
9123
  className: pressed.workbench ? `${ColumnSwitch_module_default.button} ${ColumnSwitch_module_default.active}` : ColumnSwitch_module_default.button,
8560
9124
  "aria-pressed": pressed.workbench,
8561
9125
  "aria-label": workbenchLabel,
8562
- 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 })),
8563
9127
  onClick: () => selectColumn("workbench")
8564
- })), /* @__PURE__ */ h(Tip, { label: t("rightbar.column.dsh") }, /* @__PURE__ */ h(Button, {
9128
+ })), /* @__PURE__ */ createElement(Tip, { label: t("rightbar.column.dsh") }, /* @__PURE__ */ createElement(Button, {
8565
9129
  type: "button",
8566
9130
  size: "sm",
8567
9131
  variant: "ghost",
8568
9132
  className: pressed.dsh ? `${ColumnSwitch_module_default.button} ${ColumnSwitch_module_default.active}` : ColumnSwitch_module_default.button,
8569
9133
  "aria-pressed": pressed.dsh,
8570
9134
  "aria-label": t("rightbar.column.dsh"),
8571
- 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 })),
8572
9136
  onClick: () => selectColumn("dsh")
8573
9137
  })));
8574
9138
  }
@@ -8740,42 +9304,42 @@ function stepLabel(step, titleKeyOf, t) {
8740
9304
  return titleKey === void 0 ? t("panels.unknownStep") : t(titleKey);
8741
9305
  }
8742
9306
  function Breadcrumbs({ trail, onGoTo, titleKeyOf, t }) {
8743
- return /* @__PURE__ */ h("div", {
9307
+ return /* @__PURE__ */ createElement("div", {
8744
9308
  className: Breadcrumbs_module_default.stripTabs,
8745
9309
  role: "presentation"
8746
9310
  }, trail.map((step, index) => {
8747
9311
  const current = index === trail.length - 1;
8748
- 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", {
8749
9313
  className: Breadcrumbs_module_default.sep,
8750
9314
  "aria-hidden": "true"
8751
- }, "›") : null, current ? /* @__PURE__ */ h("div", {
9315
+ }, "›") : null, current ? /* @__PURE__ */ createElement("div", {
8752
9316
  className: `${Breadcrumbs_module_default.tab} ${Breadcrumbs_module_default.tabActive}`,
8753
9317
  "aria-current": "page"
8754
- }, /* @__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", {
8755
9319
  type: "button",
8756
9320
  className: `${Breadcrumbs_module_default.tab} ${Breadcrumbs_module_default.tabQuiet}`,
8757
9321
  onClick: () => onGoTo(index)
8758
- }, /* @__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))));
8759
9323
  }));
8760
9324
  }
8761
9325
  //#endregion
8762
9326
  //#region src/app/layouts/rightbar/BoardEmpty.tsx
8763
9327
  function BoardEmpty({ t, onBuildModule, onOpenModules, onOpenMarket }) {
8764
- return /* @__PURE__ */ h(CenteredState, {
8765
- icon: /* @__PURE__ */ h(IconBrandMark, { size: 32 }),
9328
+ return /* @__PURE__ */ createElement(CenteredState, {
9329
+ icon: /* @__PURE__ */ createElement(IconBrandMark, { size: 32 }),
8766
9330
  title: t("panels.empty"),
8767
9331
  hint: t("panels.emptyHint"),
8768
- action: /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(Button, {
9332
+ action: /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement(Button, {
8769
9333
  type: "button",
8770
9334
  size: "sm",
8771
9335
  variant: "primary",
8772
9336
  onClick: onBuildModule
8773
- }, t("panels.buildModule")), /* @__PURE__ */ h(Button, {
9337
+ }, t("panels.buildModule")), /* @__PURE__ */ createElement(Button, {
8774
9338
  type: "button",
8775
9339
  size: "sm",
8776
9340
  variant: "toolbar",
8777
9341
  onClick: onOpenModules
8778
- }, t("panels.choose")), /* @__PURE__ */ h(Button, {
9342
+ }, t("panels.choose")), /* @__PURE__ */ createElement(Button, {
8779
9343
  type: "button",
8780
9344
  size: "sm",
8781
9345
  variant: "toolbar",
@@ -8881,7 +9445,7 @@ function aggregateSummaries(summaries) {
8881
9445
  //#endregion
8882
9446
  //#region src/app/layouts/rightbar/PanelRowControls.tsx
8883
9447
  function PanelRowControls({ t, unit, label, busy, onWrite }) {
8884
- 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, {
8885
9449
  checked: unit.shown,
8886
9450
  label: `${label} · ${unit.shown ? t("panels.enabled") : t("panels.disabled")}`,
8887
9451
  disabled: busy,
@@ -8895,12 +9459,12 @@ function PanelRowControls({ t, unit, label, busy, onWrite }) {
8895
9459
  //#region src/app/layouts/rightbar/PanelGroupRows.tsx
8896
9460
  function PanelGroupRows({ t, rows, titleKey, busy, onWrite }) {
8897
9461
  if (rows.length === 0) return null;
8898
- 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) => {
8899
9463
  const title = row.title ?? t(row.titleKey ?? row.id);
8900
- return /* @__PURE__ */ h("li", {
9464
+ return /* @__PURE__ */ createElement("li", {
8901
9465
  key: row.id,
8902
9466
  className: `${ModulesPage_module_default.row} ${row.shown ? "" : ModulesPage_module_default.rowOff}`
8903
- }, /* @__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, {
8904
9468
  t,
8905
9469
  unit: row,
8906
9470
  label: title,
@@ -8950,14 +9514,14 @@ function gripClass(drag) {
8950
9514
  return `${ModulesPage_module_default.grip} ${drag.over === null ? ModulesPage_module_default.gripBlocked : ModulesPage_module_default.gripDragging}`;
8951
9515
  }
8952
9516
  function RowLabel({ t, row }) {
8953
- 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)));
8954
9518
  }
8955
9519
  function PanelRowItem({ t, row, index, drag, handlers, tipEpoch, busy, onWrite }) {
8956
- 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, {
8957
9521
  key: tipEpoch,
8958
9522
  label: t("panels.dragHint"),
8959
9523
  disabled: drag !== null
8960
- }, /* @__PURE__ */ h("span", {
9524
+ }, /* @__PURE__ */ createElement("span", {
8961
9525
  className: gripClass(drag),
8962
9526
  "aria-hidden": "true",
8963
9527
  onPointerDown: (event) => {
@@ -8966,10 +9530,10 @@ function PanelRowItem({ t, row, index, drag, handlers, tipEpoch, busy, onWrite }
8966
9530
  event.currentTarget.setPointerCapture(event.pointerId);
8967
9531
  handlers.begin(index, event.clientX, event.clientY);
8968
9532
  }
8969
- }, "⠿")) : /* @__PURE__ */ h("span", { "aria-hidden": "true" }), /* @__PURE__ */ h(RowLabel, {
9533
+ }, "⠿")) : /* @__PURE__ */ createElement("span", { "aria-hidden": "true" }), /* @__PURE__ */ createElement(RowLabel, {
8970
9534
  t,
8971
9535
  row
8972
- }), /* @__PURE__ */ h(PanelRowControls, {
9536
+ }), /* @__PURE__ */ createElement(PanelRowControls, {
8973
9537
  t,
8974
9538
  unit: row,
8975
9539
  label: t(row.titleKey ?? row.id),
@@ -8978,12 +9542,12 @@ function PanelRowItem({ t, row, index, drag, handlers, tipEpoch, busy, onWrite }
8978
9542
  }));
8979
9543
  }
8980
9544
  function PanelEmpty({ t, onOpenMarket }) {
8981
- return /* @__PURE__ */ h(CenteredState, {
9545
+ return /* @__PURE__ */ createElement(CenteredState, {
8982
9546
  compact: true,
8983
9547
  icon: null,
8984
9548
  title: t("panels.noneInstalled"),
8985
9549
  hint: t("panels.noneInstalledHint"),
8986
- action: /* @__PURE__ */ h(Button, {
9550
+ action: /* @__PURE__ */ createElement(Button, {
8987
9551
  type: "button",
8988
9552
  size: "sm",
8989
9553
  variant: "outline",
@@ -8992,7 +9556,7 @@ function PanelEmpty({ t, onOpenMarket }) {
8992
9556
  });
8993
9557
  }
8994
9558
  function DragGhost({ label, at }) {
8995
- return /* @__PURE__ */ h("div", {
9559
+ return /* @__PURE__ */ createElement("div", {
8996
9560
  className: ModulesPage_module_default.ghost,
8997
9561
  style: {
8998
9562
  left: `${at.x + 12}px`,
@@ -9006,7 +9570,7 @@ function ResetConfirmation({ t, open, busy, onCancel, onConfirm }) {
9006
9570
  setAcknowledged(false);
9007
9571
  next();
9008
9572
  };
9009
- return /* @__PURE__ */ h(RiskConfirmation, {
9573
+ return /* @__PURE__ */ createElement(RiskConfirmation, {
9010
9574
  open,
9011
9575
  title: t("panels.followAllConfirmTitle"),
9012
9576
  description: t("panels.followAllConfirmDetail"),
@@ -9106,16 +9670,17 @@ function ModulesPage({ t, units, plugins = [], workspace, capabilities, loading
9106
9670
  };
9107
9671
  useDragListeners(drag !== null, handlers);
9108
9672
  const dragged = drag === null ? void 0 : carded[drag.from];
9109
- 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, {
9110
9674
  label: t(dragged.titleKey ?? dragged.id),
9111
9675
  at: drag.at
9112
- }), empty ? /* @__PURE__ */ h(PanelEmpty, {
9676
+ });
9677
+ return /* @__PURE__ */ createElement(Fragment, null, ghost, empty ? /* @__PURE__ */ createElement(PanelEmpty, {
9113
9678
  t,
9114
9679
  onOpenMarket
9115
- }) : null, carded.length === 0 ? null : /* @__PURE__ */ h("ul", {
9680
+ }) : null, carded.length === 0 ? null : /* @__PURE__ */ createElement("ul", {
9116
9681
  ref: listRef,
9117
9682
  className: `${ModulesPage_module_default.list}${drag === null ? "" : ` ${ModulesPage_module_default.listDragging}`}`
9118
- }, carded.map((row, index) => /* @__PURE__ */ h(PanelRowItem, {
9683
+ }, carded.map((row, index) => /* @__PURE__ */ createElement(PanelRowItem, {
9119
9684
  key: row.id,
9120
9685
  t,
9121
9686
  row,
@@ -9125,24 +9690,24 @@ function ModulesPage({ t, units, plugins = [], workspace, capabilities, loading
9125
9690
  tipEpoch,
9126
9691
  busy,
9127
9692
  onWrite: writeRow
9128
- }))), /* @__PURE__ */ h(PanelGroupRows, {
9693
+ }))), /* @__PURE__ */ createElement(PanelGroupRows, {
9129
9694
  t,
9130
9695
  rows: boardless,
9131
9696
  titleKey: "panels.groupBoardless",
9132
9697
  busy,
9133
9698
  onWrite: writeRow
9134
- }), /* @__PURE__ */ h(PanelGroupRows, {
9699
+ }), /* @__PURE__ */ createElement(PanelGroupRows, {
9135
9700
  t,
9136
9701
  rows: pluginRows,
9137
9702
  titleKey: "panels.groupPlugins",
9138
9703
  busy,
9139
9704
  onWrite: writeRow
9140
- }), own ? /* @__PURE__ */ h(PanelFoot, null, /* @__PURE__ */ h("button", {
9705
+ }), own ? /* @__PURE__ */ createElement(PanelFoot, null, /* @__PURE__ */ createElement("button", {
9141
9706
  type: "button",
9142
9707
  className: ModulesPage_module_default.reset,
9143
9708
  disabled: busy,
9144
9709
  onClick: () => setConfirmingReset(true)
9145
- }, t("panels.followAll"))) : null, /* @__PURE__ */ h(ResetConfirmation, {
9710
+ }, t("panels.followAll"))) : null, /* @__PURE__ */ createElement(ResetConfirmation, {
9146
9711
  t,
9147
9712
  open: confirmingReset,
9148
9713
  busy,
@@ -9151,7 +9716,7 @@ function ModulesPage({ t, units, plugins = [], workspace, capabilities, loading
9151
9716
  setConfirmingReset(false);
9152
9717
  write({ action: "reset" });
9153
9718
  }
9154
- }), 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);
9155
9720
  }
9156
9721
  //#endregion
9157
9722
  //#region src/app/layouts/rightbar/panel-dismiss.ts
@@ -9189,23 +9754,23 @@ function PanelModules({ t, open, onOpenChange, enabledUnits, workspace, refreshT
9189
9754
  const mockNonce = devPanel.pick.nonce;
9190
9755
  useDismissOnOutsidePointer(root, open, (next) => dismissPanelByPointer(next, document, onOpenChange));
9191
9756
  const units = enabledUnits?.units ?? [];
9192
- return /* @__PURE__ */ h("div", {
9757
+ return /* @__PURE__ */ createElement("div", {
9193
9758
  className: ModulesPage_module_default.trigger,
9194
9759
  ref: root
9195
- }, /* @__PURE__ */ h(Tip, { label: t("panels.title") }, /* @__PURE__ */ h(Button, {
9760
+ }, /* @__PURE__ */ createElement(Tip, { label: t("panels.title") }, /* @__PURE__ */ createElement(Button, {
9196
9761
  type: "button",
9197
9762
  size: "sm",
9198
9763
  variant: "ghost",
9199
9764
  className: `wb-stripButton${open ? " wb-stripButtonActive" : ""}`,
9200
9765
  "aria-label": t("panels.title"),
9201
9766
  "aria-expanded": open,
9202
- icon: /* @__PURE__ */ h(IconModules, { size: 16 }),
9767
+ icon: /* @__PURE__ */ createElement(IconModules, { size: 16 }),
9203
9768
  onClick: () => onOpenChange(!open)
9204
- })), open ? /* @__PURE__ */ h("div", {
9769
+ })), open ? /* @__PURE__ */ createElement("div", {
9205
9770
  className: ModulesPage_module_default.pop,
9206
9771
  role: "dialog",
9207
9772
  "aria-label": t("panels.title")
9208
- }, /* @__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, {
9209
9774
  key: `${panelMock?.id ?? "real-modules"}-${mockNonce}`,
9210
9775
  t,
9211
9776
  units: panelMock?.units ?? units,
@@ -9501,7 +10066,8 @@ function workspacePathOf(world) {
9501
10066
  }
9502
10067
  function ModuleHost({ module, step, panelToken, onPanelRefresh, onSummary, ...rest }) {
9503
10068
  const [ownToken, setOwnToken] = useState(0);
9504
- 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, {
9505
10071
  ...rest,
9506
10072
  refreshToken: panelToken + ownToken,
9507
10073
  onRefresh: () => setOwnToken((value) => value + 1),
@@ -9518,13 +10084,13 @@ function BoardGrid({ entries, panelWidth, world, panelToken, onPanelRefresh, onN
9518
10084
  trailing: false
9519
10085
  }));
9520
10086
  const order = slots !== null && slots.length === entries.length ? slots : plain;
9521
- return /* @__PURE__ */ h("div", {
10087
+ return /* @__PURE__ */ createElement("div", {
9522
10088
  className: Rightbar_module_default.columns,
9523
10089
  ref: root,
9524
10090
  style: { columnCount }
9525
10091
  }, order.map((slot) => {
9526
10092
  const entry = entries[slot.index];
9527
- return /* @__PURE__ */ h("div", {
10093
+ return /* @__PURE__ */ createElement("div", {
9528
10094
  className: Rightbar_module_default.cell,
9529
10095
  key: entry.key,
9530
10096
  "data-wb-cell": entry.key,
@@ -9532,12 +10098,12 @@ function BoardGrid({ entries, panelWidth, world, panelToken, onPanelRefresh, onN
9532
10098
  breakBefore: slot.breakBefore ? "column" : void 0,
9533
10099
  marginBottom: slot.trailing ? 0 : void 0
9534
10100
  }
9535
- }, /* @__PURE__ */ h(CardAnchor, { unit: entry.module.id }, /* @__PURE__ */ h(CardBoundary, {
10101
+ }, /* @__PURE__ */ createElement(CardAnchor, { unit: entry.module.id }, /* @__PURE__ */ createElement(CardBoundary, {
9536
10102
  unit: entry.module.id,
9537
10103
  resetKey: `${entry.key}:${panelToken}:${workspacePathOf(world)}`,
9538
10104
  t,
9539
10105
  onFailure: (reason) => onCardFailure(entry.module.id, reason)
9540
- }, /* @__PURE__ */ h(ModuleHost, {
10106
+ }, /* @__PURE__ */ createElement(ModuleHost, {
9541
10107
  module: entry.module,
9542
10108
  world,
9543
10109
  panelToken,
@@ -9577,21 +10143,21 @@ function createSuiteWorld(input) {
9577
10143
  //#endregion
9578
10144
  //#region src/app/layouts/rightbar/Rightbar.tsx
9579
10145
  function PanelHeader({ t, trail, onGoTo, titleKeyOf, refreshing, at, refreshEnabled, onRefresh, modulesOpen, onModulesOpenChange, enabledUnits, manifests, workspace, refreshToken, onOpenMarket, onCollapse }) {
9580
- 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, {
9581
10147
  trail,
9582
10148
  onGoTo,
9583
10149
  titleKeyOf,
9584
10150
  t
9585
- }), /* @__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, {
9586
10152
  type: "button",
9587
10153
  size: "sm",
9588
10154
  variant: "ghost",
9589
10155
  className: `wb-stripButton${refreshing ? " wb-spinning" : ""}`,
9590
10156
  "aria-label": refreshing ? t("rightbar.refreshing") : t("rightbar.refresh"),
9591
10157
  disabled: refreshing || !refreshEnabled,
9592
- icon: /* @__PURE__ */ h(IconRefreshOutlineRegular, { size: 16 }),
10158
+ icon: /* @__PURE__ */ createElement(IconRefreshOutlineRegular, { size: 16 }),
9593
10159
  onClick: onRefresh
9594
- })), /* @__PURE__ */ h(PanelModules, {
10160
+ })), /* @__PURE__ */ createElement(PanelModules, {
9595
10161
  t,
9596
10162
  open: modulesOpen,
9597
10163
  onOpenChange: onModulesOpenChange,
@@ -9600,33 +10166,33 @@ function PanelHeader({ t, trail, onGoTo, titleKeyOf, refreshing, at, refreshEnab
9600
10166
  refreshToken,
9601
10167
  manifests,
9602
10168
  onOpenMarket
9603
- }), /* @__PURE__ */ h(Tip, { label: t("rightbar.collapse") }, /* @__PURE__ */ h(Button, {
10169
+ }), /* @__PURE__ */ createElement(Tip, { label: t("rightbar.collapse") }, /* @__PURE__ */ createElement(Button, {
9604
10170
  type: "button",
9605
10171
  size: "sm",
9606
10172
  variant: "ghost",
9607
10173
  className: "wb-stripButton",
9608
10174
  "aria-label": t("rightbar.collapse"),
9609
- 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 })),
9610
10176
  onClick: onCollapse
9611
10177
  })))));
9612
10178
  }
9613
10179
  function BoardContent({ top, plan, world, board, panelWidth, panelToken, onPanelRefresh, onNavigate, onOpenMarket, onSummary, onOpenModules, onCardFailure, buildModule, t }) {
9614
10180
  if (top.kind !== "board") {
9615
10181
  const owner = board.stepOwner(top.kind);
9616
- if (owner === void 0) return /* @__PURE__ */ h(CenteredState, {
9617
- icon: /* @__PURE__ */ h(IconBrandMark, { size: 32 }),
10182
+ if (owner === void 0) return /* @__PURE__ */ createElement(CenteredState, {
10183
+ icon: /* @__PURE__ */ createElement(IconBrandMark, { size: 32 }),
9618
10184
  title: t("panels.unknownStep")
9619
10185
  });
9620
10186
  const key = `${owner.id}:${top.kind}`;
9621
- return /* @__PURE__ */ h(CardAnchor, {
10187
+ return /* @__PURE__ */ createElement(CardAnchor, {
9622
10188
  key,
9623
10189
  unit: owner.id
9624
- }, /* @__PURE__ */ h(CardBoundary, {
10190
+ }, /* @__PURE__ */ createElement(CardBoundary, {
9625
10191
  unit: owner.id,
9626
10192
  resetKey: `${key}:${panelToken}:${workspacePathOf(world)}`,
9627
10193
  t,
9628
10194
  onFailure: (reason) => onCardFailure(owner.id, reason)
9629
- }, /* @__PURE__ */ h(ModuleHost, {
10195
+ }, /* @__PURE__ */ createElement(ModuleHost, {
9630
10196
  module: owner,
9631
10197
  step: top.kind,
9632
10198
  world,
@@ -9638,15 +10204,15 @@ function BoardContent({ top, plan, world, board, panelWidth, panelToken, onPanel
9638
10204
  t
9639
10205
  })));
9640
10206
  }
9641
- return /* @__PURE__ */ h(Fragment, null, plan.reading ? /* @__PURE__ */ h(CenteredState, {
10207
+ return /* @__PURE__ */ createElement(Fragment, null, plan.reading ? /* @__PURE__ */ createElement(CenteredState, {
9642
10208
  icon: null,
9643
- title: /* @__PURE__ */ h(TextShimmer, { active: true }, t("panels.reading"))
9644
- }) : null, plan.empty ? /* @__PURE__ */ h(BoardEmpty, {
10209
+ title: /* @__PURE__ */ createElement(TextShimmer, { active: true }, t("panels.reading"))
10210
+ }) : null, plan.empty ? /* @__PURE__ */ createElement(BoardEmpty, {
9645
10211
  t,
9646
10212
  onBuildModule: buildModule,
9647
10213
  onOpenModules,
9648
10214
  onOpenMarket
9649
- }) : null, /* @__PURE__ */ h(BoardGrid, {
10215
+ }) : null, /* @__PURE__ */ createElement(BoardGrid, {
9650
10216
  entries: plan.modules,
9651
10217
  panelWidth,
9652
10218
  world,
@@ -9758,7 +10324,7 @@ function Rightbar(props) {
9758
10324
  const top = state.trail[state.trail.length - 1] ?? { kind: "board" };
9759
10325
  const navigate = (step) => props.openPanel(step);
9760
10326
  const openMarket = () => props.openMarket();
9761
- return /* @__PURE__ */ h("aside", {
10327
+ return /* @__PURE__ */ createElement("aside", {
9762
10328
  ref: asideRef,
9763
10329
  className: `wb-rightbar ${Rightbar_module_default.panel}`,
9764
10330
  style: { width: panelWidth },
@@ -9767,7 +10333,7 @@ function Rightbar(props) {
9767
10333
  "data-wb-board": fixtureMode ? void 0 : boardWorkspace ?? void 0,
9768
10334
  "data-wb-open": fixtureMode || !shown ? void 0 : "",
9769
10335
  "aria-label": props.t("rightbar.label")
9770
- }, /* @__PURE__ */ h(PanelHeader, {
10336
+ }, /* @__PURE__ */ createElement(PanelHeader, {
9771
10337
  t: props.t,
9772
10338
  trail: state.trail,
9773
10339
  onGoTo: props.goToPanel,
@@ -9784,7 +10350,7 @@ function Rightbar(props) {
9784
10350
  refreshToken: panelToken,
9785
10351
  onOpenMarket: openMarket,
9786
10352
  onCollapse: props.toggleRightbar
9787
- }), 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, {
9788
10354
  top,
9789
10355
  plan,
9790
10356
  world,
@@ -10059,29 +10625,29 @@ function openNewSession(input) {
10059
10625
  //#region src/app/layouts/sidebar/SidebarHeader.tsx
10060
10626
  function SidebarHeader(props) {
10061
10627
  const { collapsed, wide, attention, t, renderSlot } = props;
10062
- 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", {
10063
10629
  type: "button",
10064
10630
  className: "wb-brand",
10065
10631
  onClick: () => props.onSelectPanel(null)
10066
- }, /* @__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", {
10067
10633
  type: "button",
10068
10634
  className: "wb-iconButton wb-toggle",
10069
10635
  "aria-label": t(collapsed ? "toggle.open" : "toggle.collapse"),
10070
10636
  onClick: props.onToggle
10071
- }, !wide ? /* @__PURE__ */ h("span", {
10637
+ }, !wide ? /* @__PURE__ */ createElement("span", {
10072
10638
  className: "wb-railMark",
10073
10639
  "aria-hidden": "true"
10074
- }, 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));
10075
10641
  }
10076
10642
  //#endregion
10077
10643
  //#region src/app/layouts/sidebar/WorkspaceSection.tsx
10078
10644
  function WorkspaceSection({ t, wide, onNewSession }) {
10079
- 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", {
10080
10646
  type: "button",
10081
10647
  className: "wb-iconButton wb-wsNew",
10082
10648
  "aria-label": t("session.new"),
10083
10649
  onClick: onNewSession
10084
- }, /* @__PURE__ */ h(IconNewChatOutlineRegular, { size: 16 })))));
10650
+ }, /* @__PURE__ */ createElement(IconNewChatOutlineRegular, { size: 16 })))));
10085
10651
  }
10086
10652
  //#endregion
10087
10653
  //#region src/shared/hooks/use-shell-long-tasks.ts
@@ -10153,22 +10719,22 @@ function PanelRow({ id, label, active, wide, onSelect, fallbackGlyph, renderEntr
10153
10719
  const glyph = fallbackGlyph ?? (id !== null && renderEntry !== void 0 ? renderEntry(id, active, wide) : null);
10154
10720
  const hint = usePanelHint(id);
10155
10721
  const name = panelRowName(label, hint, t);
10156
- return /* @__PURE__ */ h(Tip, {
10722
+ return /* @__PURE__ */ createElement(Tip, {
10157
10723
  label: name,
10158
10724
  disabled: !(hint !== null || !wide)
10159
- }, /* @__PURE__ */ h("button", {
10725
+ }, /* @__PURE__ */ createElement("button", {
10160
10726
  type: "button",
10161
10727
  className: cx("wb-panelRow", active && "wb-panelActive"),
10162
10728
  "aria-current": active ? "page" : void 0,
10163
10729
  "aria-label": name,
10164
10730
  onClick: () => onSelect(id)
10165
- }, /* @__PURE__ */ h("span", {
10731
+ }, /* @__PURE__ */ createElement("span", {
10166
10732
  className: "wb-panelGlyph",
10167
10733
  "aria-hidden": "true"
10168
- }, 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, {
10169
10735
  state: hint.tone === "danger" ? "error" : "warning",
10170
10736
  size: 9
10171
- })) : 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, {
10172
10738
  tone: hint.tone,
10173
10739
  className: "wb-panelTag"
10174
10740
  }, t(hint.labelKey))));
@@ -10196,22 +10762,22 @@ var WorkspaceAttentionDot_module_default = {
10196
10762
  function WorkspaceAttentionDot({ attention, t, variant = "inline", tip = false }) {
10197
10763
  if (attention === null) return null;
10198
10764
  const label = attentionLabel(attention, t);
10199
- const dot = /* @__PURE__ */ h("span", {
10765
+ const dot = /* @__PURE__ */ createElement("span", {
10200
10766
  className: variant === "overlay" ? cx(WorkspaceAttentionDot_module_default.dot, WorkspaceAttentionDot_module_default.overlay) : WorkspaceAttentionDot_module_default.dot,
10201
10767
  role: "img",
10202
10768
  "aria-label": label
10203
- }, /* @__PURE__ */ h(StateDot, {
10769
+ }, /* @__PURE__ */ createElement(StateDot, {
10204
10770
  state: attention.severity,
10205
10771
  size: variant === "overlay" ? 9 : void 0
10206
10772
  }));
10207
- return tip ? /* @__PURE__ */ h(Tip, { label }, dot) : dot;
10773
+ return tip ? /* @__PURE__ */ createElement(Tip, { label }, dot) : dot;
10208
10774
  }
10209
10775
  var WorkspaceAttentionTag_module_default = { tag: "_tag_g9dg8_1" };
10210
10776
  //#endregion
10211
10777
  //#region src/app/layouts/sidebar/WorkspaceAttentionTag.tsx
10212
10778
  function WorkspaceAttentionTag({ attention, t }) {
10213
10779
  if (attention === null) return null;
10214
- return /* @__PURE__ */ h(Tip, { label: attentionLabel(attention, t) }, /* @__PURE__ */ h(Tag, {
10780
+ return /* @__PURE__ */ createElement(Tip, { label: attentionLabel(attention, t) }, /* @__PURE__ */ createElement(Tag, {
10215
10781
  tone: attention.severity === "warning" ? "warning" : "success",
10216
10782
  className: WorkspaceAttentionTag_module_default.tag
10217
10783
  }, attentionWordLabel(attention, t)));
@@ -10269,7 +10835,7 @@ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
10269
10835
  else setFailed(true);
10270
10836
  });
10271
10837
  };
10272
- return /* @__PURE__ */ h(Modal, {
10838
+ return /* @__PURE__ */ createElement(Modal, {
10273
10839
  open: true,
10274
10840
  onClose: () => {
10275
10841
  if (!busy) onClose();
@@ -10278,13 +10844,13 @@ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
10278
10844
  description: t("project.rename.description"),
10279
10845
  closeLabel: t("project.rename.cancel"),
10280
10846
  className: WorkspaceRenameDialog_module_default.dialog,
10281
- footer: /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(Button, {
10847
+ footer: /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement(Button, {
10282
10848
  type: "button",
10283
10849
  variant: "outline",
10284
10850
  size: "md",
10285
10851
  disabled: busy,
10286
10852
  onClick: onClose
10287
- }, t("project.rename.cancel")), /* @__PURE__ */ h(Button, {
10853
+ }, t("project.rename.cancel")), /* @__PURE__ */ createElement(Button, {
10288
10854
  type: "button",
10289
10855
  variant: "primary",
10290
10856
  size: "md",
@@ -10292,7 +10858,7 @@ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
10292
10858
  "aria-busy": busy,
10293
10859
  onClick: save
10294
10860
  }, t(busy ? "project.rename.saving" : "project.rename.save")))
10295
- }, /* @__PURE__ */ h("div", { className: WorkspaceRenameDialog_module_default.stack }, /* @__PURE__ */ h(TextField, {
10861
+ }, /* @__PURE__ */ createElement("div", { className: WorkspaceRenameDialog_module_default.stack }, /* @__PURE__ */ createElement(TextField, {
10296
10862
  className: WorkspaceRenameDialog_module_default.input,
10297
10863
  "data-modal-autofocus": "",
10298
10864
  id: "wb-workspace-name",
@@ -10308,10 +10874,10 @@ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
10308
10874
  event.preventDefault();
10309
10875
  save();
10310
10876
  }
10311
- }), /* @__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, {
10312
10878
  as: "span",
10313
10879
  tone: tooLong ? "problem" : "muted"
10314
- }, `${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));
10315
10881
  }
10316
10882
  //#endregion
10317
10883
  //#region src/app/layouts/sidebar/workspace-groups.ts
@@ -10344,12 +10910,12 @@ function workspaceSections(items, headings) {
10344
10910
  //#endregion
10345
10911
  //#region src/app/layouts/sidebar/WorkspaceRowAction.tsx
10346
10912
  function WorkspaceRowAction({ workspace, t, onEdit }) {
10347
- return /* @__PURE__ */ h(Button, {
10913
+ return /* @__PURE__ */ createElement(Button, {
10348
10914
  type: "button",
10349
10915
  variant: "ghost",
10350
10916
  size: "sm",
10351
10917
  className: ProjectSwitcher_module_default.rowAction,
10352
- icon: /* @__PURE__ */ h(IconEditOutlineRegular, { size: 14 }),
10918
+ icon: /* @__PURE__ */ createElement(IconEditOutlineRegular, { size: 14 }),
10353
10919
  "aria-label": t("project.rename.row", { name: displayNameOf(workspace).dir }),
10354
10920
  onClick: (event) => {
10355
10921
  event.stopPropagation();
@@ -10378,13 +10944,13 @@ function WorkspaceRowLabel({ workspace, current, action, onHover }) {
10378
10944
  row.removeEventListener("mouseleave", leave);
10379
10945
  };
10380
10946
  }, []);
10381
- return /* @__PURE__ */ h("span", {
10947
+ return /* @__PURE__ */ createElement("span", {
10382
10948
  ref: hostRef,
10383
10949
  className: ProjectSwitcher_module_default.row
10384
- }, /* @__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", {
10385
10951
  className: ProjectSwitcher_module_default.name,
10386
10952
  title: name
10387
- }, 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)));
10388
10954
  }
10389
10955
  //#endregion
10390
10956
  //#region src/app/layouts/sidebar/workspace-items.tsx
@@ -10395,15 +10961,15 @@ function workspaceOptions(options) {
10395
10961
  return {
10396
10962
  value: workspace.workspaceId,
10397
10963
  group,
10398
- icon: own === null ? /* @__PURE__ */ h(IconFolderOpenRegular, { size: 16 }) : /* @__PURE__ */ h(WorkspaceAttentionDot, {
10964
+ icon: own === null ? /* @__PURE__ */ createElement(IconFolderOpenRegular, { size: 16 }) : /* @__PURE__ */ createElement(WorkspaceAttentionDot, {
10399
10965
  attention: own,
10400
10966
  t
10401
10967
  }),
10402
- label: /* @__PURE__ */ h(WorkspaceRowLabel, {
10968
+ label: /* @__PURE__ */ createElement(WorkspaceRowLabel, {
10403
10969
  workspace,
10404
10970
  current: workspace.workspaceId === currentId,
10405
10971
  onHover: (hovering) => onHover(hovering ? workspace.workspaceId : null),
10406
- action: hoverId === workspace.workspaceId ? /* @__PURE__ */ h(WorkspaceRowAction, {
10972
+ action: hoverId === workspace.workspaceId ? /* @__PURE__ */ createElement(WorkspaceRowAction, {
10407
10973
  workspace,
10408
10974
  t,
10409
10975
  onEdit: () => onEdit(workspace)
@@ -10449,26 +11015,26 @@ function ProjectSwitcher({ items, current, attention, compact = false, onPick, o
10449
11015
  const out = /* @__PURE__ */ new Map();
10450
11016
  for (const workspace of items) {
10451
11017
  const { dir, name } = displayNameOf(workspace);
10452
- 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)));
10453
11019
  }
10454
11020
  return out;
10455
11021
  }, [items]);
10456
- 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, {
10457
11023
  value: currentId,
10458
11024
  options,
10459
11025
  onChange: onPick,
10460
11026
  open,
10461
11027
  onOpenChange: setOpen,
10462
- icon: /* @__PURE__ */ h(Tip, {
11028
+ icon: /* @__PURE__ */ createElement(Tip, {
10463
11029
  label: current?.path ?? "",
10464
11030
  disabled: current === null
10465
- }, /* @__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, {
10466
11032
  attention: attention.overall,
10467
11033
  t,
10468
11034
  variant: "overlay",
10469
11035
  tip: true
10470
11036
  }) : null))),
10471
- 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, {
10472
11038
  attention: attention.elsewhere,
10473
11039
  t
10474
11040
  })),
@@ -10487,10 +11053,10 @@ function ProjectSwitcher({ items, current, attention, compact = false, onPick, o
10487
11053
  },
10488
11054
  footer: {
10489
11055
  label: t("project.add"),
10490
- icon: /* @__PURE__ */ h(IconPlusOutlineRegular, { size: 14 })
11056
+ icon: /* @__PURE__ */ createElement(IconPlusOutlineRegular, { size: 14 })
10491
11057
  },
10492
11058
  onFooter: onAdd
10493
- }), naming === null ? null : /* @__PURE__ */ h(WorkspaceRenameDialog, {
11059
+ }), naming === null ? null : /* @__PURE__ */ createElement(WorkspaceRenameDialog, {
10494
11060
  key: naming.workspaceId,
10495
11061
  workspace: naming,
10496
11062
  t,
@@ -10561,17 +11127,17 @@ function useTitleMarquee(title) {
10561
11127
  function SessionLeading({ node, statuses, renderSlot }) {
10562
11128
  if (node.blank) return null;
10563
11129
  const primary = statuses[0];
10564
- if (primary === void 0 || primary.state === "idle") return /* @__PURE__ */ h(Fragment, null, renderSlot("sidebar.session.row.leading", { sessionId: node.id }));
10565
- 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", {
10566
11132
  className: "wb-visuallyHidden",
10567
11133
  key: status.label
10568
11134
  }, status.label)));
10569
11135
  }
10570
11136
  function SessionHoverContent({ node, statuses, renderSlot, t }) {
10571
- 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", {
10572
11138
  className: "wb-sessionHoverStatus",
10573
11139
  key: status.label
10574
- }, /* @__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))));
10575
11141
  }
10576
11142
  function SessionRow({ node, active, onOpen, renderSlot, t }) {
10577
11143
  const [menuOpen, setMenuOpen] = useState(false);
@@ -10585,36 +11151,36 @@ function SessionRow({ node, active, onOpen, renderSlot, t }) {
10585
11151
  sessionId: node.id,
10586
11152
  displayTitle: node.title
10587
11153
  };
10588
- return /* @__PURE__ */ h(HoverCard, {
10589
- anchor: /* @__PURE__ */ h("div", {
11154
+ return /* @__PURE__ */ createElement(HoverCard, {
11155
+ anchor: /* @__PURE__ */ createElement("div", {
10590
11156
  className: cx("wb-sessionRow", active && "wb-selected", menuOpen && "wb-menuOpen"),
10591
11157
  role: "treeitem",
10592
11158
  "aria-selected": active,
10593
11159
  onClick: () => onOpen(node.id),
10594
11160
  onPointerEnter: marquee.enter,
10595
11161
  onPointerLeave: marquee.leave
10596
- }, /* @__PURE__ */ h("span", { className: "wb-sessionLeading" }, /* @__PURE__ */ h(SessionLeading, {
11162
+ }, /* @__PURE__ */ createElement("span", { className: "wb-sessionLeading" }, /* @__PURE__ */ createElement(SessionLeading, {
10597
11163
  node,
10598
11164
  statuses,
10599
11165
  renderSlot
10600
- })), /* @__PURE__ */ h("span", {
11166
+ })), /* @__PURE__ */ createElement("span", {
10601
11167
  className: "wb-sessionTitle",
10602
11168
  ref: titleRef
10603
- }, label), node.blank ? null : /* @__PURE__ */ h("span", {
11169
+ }, label), node.blank ? null : /* @__PURE__ */ createElement("span", {
10604
11170
  className: "wb-sessionTime",
10605
11171
  "aria-hidden": trailing === void 0 ? void 0 : true
10606
- }, 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", {
10607
11173
  className: "wb-sessionPin",
10608
11174
  role: "img",
10609
11175
  "aria-label": t("session.pinned")
10610
- }, /* @__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", {
10611
11177
  className: "wb-rowActions",
10612
11178
  onClick: (event) => event.stopPropagation()
10613
- }, /* @__PURE__ */ h(Menu, {
11179
+ }, /* @__PURE__ */ createElement(Menu, {
10614
11180
  open: menuOpen,
10615
11181
  portal: true,
10616
11182
  closeOnPointerLeave: true,
10617
- anchor: /* @__PURE__ */ h("button", {
11183
+ anchor: /* @__PURE__ */ createElement("button", {
10618
11184
  type: "button",
10619
11185
  className: "wb-iconButton",
10620
11186
  "aria-haspopup": "menu",
@@ -10624,10 +11190,10 @@ function SessionRow({ node, active, onOpen, renderSlot, t }) {
10624
11190
  event.stopPropagation();
10625
11191
  setMenuOpen((value) => !value);
10626
11192
  }
10627
- }, /* @__PURE__ */ h(IconEllipsisOutlineRegular, { size: 16 })),
11193
+ }, /* @__PURE__ */ createElement(IconEllipsisOutlineRegular, { size: 16 })),
10628
11194
  onClose: () => setMenuOpen(false)
10629
11195
  }, renderSlot("sidebar.workspaces.session.menu.item", owner, { hookContext: menuState })), renderSlot("sidebar.workspaces.session.row.action", owner))),
10630
- content: /* @__PURE__ */ h(SessionHoverContent, {
11196
+ content: /* @__PURE__ */ createElement(SessionHoverContent, {
10631
11197
  node,
10632
11198
  statuses,
10633
11199
  renderSlot,
@@ -10678,14 +11244,14 @@ function SessionList({ workspace, pinnedIds, archived, panelActive, longTasks, u
10678
11244
  ]);
10679
11245
  const listRef = useRef(null);
10680
11246
  const edges = useScrollEdges(listRef, rows);
10681
- if (workspace === null) return /* @__PURE__ */ h("div", { className: "wb-empty" }, t("session.noProject"));
10682
- if (rows.length === 0) return /* @__PURE__ */ h("div", { className: "wb-empty" }, t("session.empty"));
10683
- 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", {
10684
11250
  ref: listRef,
10685
11251
  className: cx("wb-sessions", edges.canScrollUp && "wb-fadeTop", edges.canScrollDown && "wb-fadeBottom"),
10686
11252
  role: "tree",
10687
11253
  "aria-label": t("session.list.label")
10688
- }, rows.map((row) => /* @__PURE__ */ h(SessionRow, {
11254
+ }, rows.map((row) => /* @__PURE__ */ createElement(SessionRow, {
10689
11255
  key: row.id,
10690
11256
  node: sessionNode(row, statusById, list, pinned, archivedSet, longTasks.bySession),
10691
11257
  active: row.id === currentId,
@@ -10768,10 +11334,10 @@ function Sidebar(props) {
10768
11334
  });
10769
11335
  };
10770
11336
  const wide = !collapsed;
10771
- return /* @__PURE__ */ h("div", {
11337
+ return /* @__PURE__ */ createElement("div", {
10772
11338
  className: cx("wb-root", collapsed && "wb-collapsed"),
10773
11339
  "data-wb-where": board.path ?? void 0
10774
- }, /* @__PURE__ */ h(SidebarHeader, {
11340
+ }, /* @__PURE__ */ createElement(SidebarHeader, {
10775
11341
  collapsed,
10776
11342
  wide,
10777
11343
  attention: attention.overall,
@@ -10779,10 +11345,10 @@ function Sidebar(props) {
10779
11345
  renderSlot,
10780
11346
  onToggle: props.toggleSidebar,
10781
11347
  onSelectPanel: props.selectPanel
10782
- }), /* @__PURE__ */ h("nav", {
11348
+ }), /* @__PURE__ */ createElement("nav", {
10783
11349
  className: "wb-panelList",
10784
11350
  "aria-label": t("panels.label")
10785
- }, panelEntries.map((entry) => /* @__PURE__ */ h(PanelRow, {
11351
+ }, panelEntries.map((entry) => /* @__PURE__ */ createElement(PanelRow, {
10786
11352
  key: entry.id,
10787
11353
  id: entry.id,
10788
11354
  label: panelLabel(entry),
@@ -10794,7 +11360,7 @@ function Sidebar(props) {
10794
11360
  size: isWide ? 16 : 18,
10795
11361
  active
10796
11362
  }, { only: id })
10797
- }))), wide ? /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(ProjectSwitcher, {
11363
+ }))), wide ? /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement(ProjectSwitcher, {
10798
11364
  items,
10799
11365
  current,
10800
11366
  attention,
@@ -10802,10 +11368,10 @@ function Sidebar(props) {
10802
11368
  onAdd: addProject,
10803
11369
  onRename: props.renameWorkspace,
10804
11370
  t
10805
- }), creating ? /* @__PURE__ */ h("p", {
11371
+ }), creating ? /* @__PURE__ */ createElement("p", {
10806
11372
  className: "wb-workspaceBusy",
10807
11373
  role: "status"
10808
- }, /* @__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, {
10809
11375
  items,
10810
11376
  current,
10811
11377
  attention,
@@ -10814,7 +11380,7 @@ function Sidebar(props) {
10814
11380
  onAdd: addProject,
10815
11381
  onRename: props.renameWorkspace,
10816
11382
  t
10817
- }), /* @__PURE__ */ h(WorkspaceSection, {
11383
+ }), /* @__PURE__ */ createElement(WorkspaceSection, {
10818
11384
  t,
10819
11385
  wide,
10820
11386
  onNewSession: () => {
@@ -10827,7 +11393,7 @@ function Sidebar(props) {
10827
11393
  startSession
10828
11394
  });
10829
11395
  }
10830
- }), /* @__PURE__ */ h("div", { className: "wb-regionArea" }, wide ? /* @__PURE__ */ h(SessionList, {
11396
+ }), /* @__PURE__ */ createElement("div", { className: "wb-regionArea" }, wide ? /* @__PURE__ */ createElement(SessionList, {
10831
11397
  workspace: current,
10832
11398
  pinnedIds,
10833
11399
  archived,
@@ -10838,7 +11404,41 @@ function Sidebar(props) {
10838
11404
  onOpen: props.openSession,
10839
11405
  renderSlot,
10840
11406
  t
10841
- }) : 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")));
10842
11442
  }
10843
11443
  //#endregion
10844
11444
  //#region src/shared/styles/rightbar.css?raw
@@ -11040,6 +11640,30 @@ function useBlockerActions(onRetry, onOpenMarket) {
11040
11640
  failure
11041
11641
  };
11042
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
+ }
11043
11667
  var BlockerState_module_default = {
11044
11668
  blocker: "_blocker_1oaj0_1",
11045
11669
  icon: "_icon_1oaj0_10",
@@ -11077,7 +11701,7 @@ function BlockerState({ blocker, t, onRetry, busy = false, flush = false, onOpen
11077
11701
  const pending = blockerPending(busy, running);
11078
11702
  const inlineActions = blocker.actions.filter((action) => action.kind === "open-url" && action.inline === true);
11079
11703
  const buttonActions = blocker.actions.filter((action) => !(action.kind === "open-url" && action.inline === true) || blocker.hint === void 0);
11080
- const buttons = buttonActions.map((action, index) => /* @__PURE__ */ h(Button, {
11704
+ const buttons = buttonActions.map((action, index) => /* @__PURE__ */ createElement(Button, {
11081
11705
  key: `${action.kind}:${action.label}`,
11082
11706
  type: "button",
11083
11707
  size: "sm",
@@ -11089,35 +11713,35 @@ function BlockerState({ blocker, t, onRetry, busy = false, flush = false, onOpen
11089
11713
  running,
11090
11714
  copied
11091
11715
  }, t)));
11092
- 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));
11093
- 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", {
11094
11718
  className: `${BlockerState_module_default.notice}${flush ? ` ${BlockerState_module_default.noticeFlat}` : ""}`,
11095
11719
  role: "status",
11096
11720
  "aria-busy": pending
11097
- }, /* @__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);
11098
- 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", {
11099
11723
  className: `${BlockerState_module_default.blocker}${flush ? ` ${BlockerState_module_default.blockerInline}` : ""}`,
11100
11724
  role: "status",
11101
11725
  "aria-busy": pending
11102
- }, flush ? null : /* @__PURE__ */ h("span", {
11726
+ }, flush ? null : /* @__PURE__ */ createElement("span", {
11103
11727
  className: BlockerState_module_default.icon,
11104
11728
  "aria-hidden": "true"
11105
- }, /* @__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", {
11106
11730
  key: `inline:${action.kind}:${action.label}`,
11107
11731
  type: "button",
11108
11732
  className: `wb-link ${BlockerState_module_default.inlineAction}`,
11109
11733
  disabled: pending,
11110
11734
  onClick: () => run(action)
11111
- }, 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, {
11112
11736
  className: BlockerState_module_default.raw,
11113
- icon: /* @__PURE__ */ h(IconInfoOutlineRegular, { size: 14 }),
11737
+ icon: /* @__PURE__ */ createElement(IconInfoOutlineRegular, { size: 14 }),
11114
11738
  title: t("env.fix.details"),
11115
11739
  open: rawOpen,
11116
11740
  expandable: true,
11117
11741
  expandOnRowClick: true,
11118
11742
  previewChevron: true,
11119
11743
  onToggle: () => setRawOpen(!rawOpen)
11120
- }, /* @__PURE__ */ h(CodeBlock, {
11744
+ }, /* @__PURE__ */ createElement(CodeBlock, {
11121
11745
  code: blocker.detail,
11122
11746
  className: BlockerState_module_default.rawText,
11123
11747
  copyLabel: t("blocker.copy"),
@@ -11181,6 +11805,7 @@ var kit = {
11181
11805
  api: {
11182
11806
  apiGet,
11183
11807
  apiPost,
11808
+ factOfRoute,
11184
11809
  ...context_chips_exports
11185
11810
  },
11186
11811
  lib: {
@@ -11221,7 +11846,7 @@ function messagesOf(units) {
11221
11846
  ...face.messages === void 0 ? {} : { messages: face.messages }
11222
11847
  }));
11223
11848
  }
11224
- 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_csyus_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_csyus_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_csyus_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_csyus_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_csyus_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_csyus_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_csyus_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_csyus_59::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_csyus_39 ._marketVersion_csyus_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_csyus_73 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_csyus_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_csyus_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_csyus_106 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_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_csyus_126 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_csyus_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_csyus_138 {\n height: 0;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_csyus_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_csyus_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_csyus_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_csyus_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_csyus_169 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n\n._marketProgress_csyus_176 {\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_csyus_186 {\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_csyus_193 {\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_csyus_201 {\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_csyus_208 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_csyus_213 {\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_csyus_213 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_csyus_231 {\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_csyus_239 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_csyus_244 {\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_csyus_250 {\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_csyus_259 {\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_csyus_259:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_csyus_259:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_csyus_284 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_csyus_288 svg {\n animation: _wb-spin_csyus_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_csyus_292 {\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_csyus_208 {\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_csyus_309 {\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_csyus_317 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_csyus_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*/";
11225
11850
  function workbenchCss() {
11226
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}`;
11227
11852
  }
@@ -11383,37 +12008,77 @@ function mount(ctx) {
11383
12008
  ctx.effect(() => () => borrow.dispose(), "dsh-workbench: 官方椅面订阅与借道");
11384
12009
  borrow.start();
11385
12010
  if (store.getSnapshot().column === "workbench") armWorkbenchColumn();
11386
- ctx.slots.inject("sidebar", () => ctx.slots.register({
11387
- name: "sidebar",
11388
- 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,
11389
12048
  locale: LOCALE_NS,
11390
- children: sidebarChildren(ctx),
11391
- inject: () => ({
11392
- listPanels: () => readPanels(ctx),
11393
- subscribePanels: (callback) => ctx.slots.subscribe("sidebar.panellist", callback),
11394
- renameWorkspace: async (workspaceId, title) => {
11395
- try {
11396
- await ctx.workspaces.rename(workspaceId, title);
11397
- return true;
11398
- } catch {
11399
- return false;
11400
- }
11401
- },
11402
- openWorkspace: (workspaceId) => {
11403
- ctx.uiWorkspace.openWorkspace(workspaceId);
11404
- },
11405
- createWorkspace: (path) => ctx.workspaces.create({ path }),
11406
- pickDirectory: () => ctx.uiWorkspace.pickDirectory(),
11407
- openSession: (sessionId) => ctx.uiWorkspace.openSession(sessionId),
11408
- startSession: startSessionIn,
11409
- toggleSidebar: () => ctx.layout.toggleSidebar(),
11410
- selectPanel: (panelId) => ctx.layout.selectPanel(panelId)
11411
- })
11412
- }, 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: 官方左栏选中的项目就是右栏的项目");
11413
12078
  registerMarketPanel(ctx, units);
11414
12079
  registerDebugFooter(ctx);
11415
12080
  registerRecordFooter(ctx);
11416
- registerConfigSyncSection(ctx);
12081
+ registerWorkbenchSettingsSection(ctx);
11417
12082
  ctx.effect(() => {
11418
12083
  const workshop = workshopWorkspace();
11419
12084
  if (workshop === void 0) return;
@@ -11443,16 +12108,16 @@ function mount(ctx) {
11443
12108
  })
11444
12109
  }, ColumnSwitch));
11445
12110
  }
11446
- var CONFIG_SYNC_SECTION_ID = "workbench-config-sync";
11447
- function registerConfigSyncSection(ctx) {
12111
+ var WORKBENCH_SETTINGS_SECTION_ID = "workbench-settings";
12112
+ function registerWorkbenchSettingsSection(ctx) {
11448
12113
  ctx.slots.inject("settings.section", () => ctx.slots.register({
11449
12114
  name: "settings.section",
11450
- id: CONFIG_SYNC_SECTION_ID,
12115
+ id: WORKBENCH_SETTINGS_SECTION_ID,
11451
12116
  order: 40,
11452
12117
  locale: LOCALE_NS,
11453
- label: () => ctx.locale.bind(LOCALE_NS)("configSync.nav"),
12118
+ label: () => ctx.locale.bind(LOCALE_NS)("workbenchSettings.nav"),
11454
12119
  inject: () => ({ t: ctx.locale.bind(LOCALE_NS) })
11455
- }, ConfigSyncSection));
12120
+ }, WorkbenchSettingsSection));
11456
12121
  }
11457
12122
  function sidebarChildren(ctx) {
11458
12123
  return {