@dsh-workbench/core 1.1.4 → 1.1.6

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 (48) hide show
  1. package/client.js +1298 -510
  2. package/dist/client/client.body.js +1298 -510
  3. package/dist/client/index.js +1160 -372
  4. package/dist/host/index.js +1151 -255
  5. package/dist/types/app/layouts/approval-detail.d.ts +6 -3
  6. package/dist/types/app/layouts/market/add-module-registry-prefs.d.ts +11 -0
  7. package/dist/types/app/layouts/market/market-check.d.ts +10 -1
  8. package/dist/types/app/layouts/market/market-header.d.ts +3 -1
  9. package/dist/types/app/layouts/market/section-check.d.ts +12 -0
  10. package/dist/types/app/layouts/market/use-market-reload.d.ts +14 -0
  11. package/dist/types/app/layouts/market/use-module-versions.d.ts +20 -4
  12. package/dist/types/app/layouts/rightbar/AskAgentButton.d.ts +6 -0
  13. package/dist/types/app/layouts/rightbar/FailureCard.d.ts +8 -0
  14. package/dist/types/app/layouts/rightbar/MarketView.d.ts +6 -3
  15. package/dist/types/app/layouts/rightbar/SharedSection.d.ts +5 -2
  16. package/dist/types/app/layouts/rightbar/failure-card-text.d.ts +20 -0
  17. package/dist/types/app/layouts/rightbar/market-act.d.ts +2 -5
  18. package/dist/types/app/layouts/rightbar/market-change.d.ts +1 -0
  19. package/dist/types/app/layouts/rightbar/market-hint.d.ts +2 -0
  20. package/dist/types/app/layouts/rightbar/market-install.d.ts +11 -0
  21. package/dist/types/app/layouts/rightbar/market-row-types.d.ts +9 -1
  22. package/dist/types/app/layouts/rightbar/market-rows.d.ts +14 -1
  23. package/dist/types/app/layouts/rightbar/market-section.d.ts +5 -3
  24. package/dist/types/app/layouts/rightbar/market-transient-state.d.ts +3 -8
  25. package/dist/types/app/layouts/rightbar/market-uninstall.d.ts +10 -0
  26. package/dist/types/app/layouts/rightbar/market-update-verdict.d.ts +2 -0
  27. package/dist/types/app/layouts/rightbar/market-view-text.d.ts +2 -0
  28. package/dist/types/kernel/client/registry.d.ts +1 -0
  29. package/dist/types/kernel/contract/bundle-install.d.ts +1 -1
  30. package/dist/types/kernel/contract/market-index.d.ts +1 -1
  31. package/dist/types/modules/panels/model/market-env.d.ts +2 -2
  32. package/dist/types/modules/panels/model/market-install-error.d.ts +3 -0
  33. package/dist/types/modules/panels/model/market-install-error.test.d.ts +1 -0
  34. package/dist/types/modules/panels/model/market-registry.d.ts +2 -1
  35. package/dist/types/modules/panels/model/market-remove.d.ts +13 -0
  36. package/dist/types/modules/panels/model/market-remove.test.d.ts +1 -0
  37. package/dist/types/modules/panels/model/market-route.d.ts +1 -1
  38. package/dist/types/modules/panels/model/market-swap-stuck.d.ts +20 -0
  39. package/dist/types/modules/panels/model/market-swap-stuck.test.d.ts +1 -0
  40. package/dist/types/modules/panels/model/market-types.d.ts +3 -0
  41. package/dist/types/modules/panels/model/market-update-bundle.d.ts +5 -0
  42. package/dist/types/modules/panels/model/market.d.ts +1 -0
  43. package/dist/types/modules/panels/model/plugin-actions.d.ts +1 -1
  44. package/dist/types/shared/api/host/self-update-marker.d.ts +5 -0
  45. package/dist/types/shared/api/host/self-update-marker.test.d.ts +1 -0
  46. package/package.json +3 -3
  47. package/skills/workbench-module-diy/TOOLS.md +11 -2
  48. package/skills/workbench-module-diy/WIRING.md +2 -1
@@ -723,6 +723,10 @@ var STORAGE_KEY_RIGHTBAR = "dsh-workbench.rightbar.expanded";
723
723
  var STORAGE_KEY_RIGHTBAR_COLUMN = "dsh-workbench.rightbar.column";
724
724
  /** 记住右栏宽度(像素数字的字符串)的 localStorage 键。 */
725
725
  var STORAGE_KEY_RIGHTBAR_WIDTH = "dsh-workbench.rightbar.width";
726
+ /** 记住「添加模块」浮层选过的安装源的 localStorage 键。 */
727
+ var STORAGE_KEY_MARKET_REGISTRY = "dsh-workbench.market.registry";
728
+ /** 记住「添加模块」浮层上次填过的自定义源地址的 localStorage 键。 */
729
+ var STORAGE_KEY_MARKET_REGISTRY_CUSTOM = "dsh-workbench.market.registry.custom";
726
730
  /** dsh i18n 的命名空间:词表都注册在它下面,`ctx.locale.register` / `bind` 按它取。 */
727
731
  var LOCALE_NS = "workbench";
728
732
  //#endregion
@@ -781,13 +785,13 @@ async function apiPost(route, body) {
781
785
  //#endregion
782
786
  //#region ../shared/dist/lib/react.js
783
787
  var react$1 = require("react");
784
- var h$67 = react$1.createElement;
785
- var Fragment$23 = react$1.Fragment;
788
+ var h$71 = react$1.createElement;
789
+ var Fragment$22 = react$1.Fragment;
786
790
  var Component = react$1.Component;
787
791
  react$1.createContext;
788
792
  react$1.useContext;
789
- var useState$40 = react$1.useState;
790
- var useEffect$30 = react$1.useEffect;
793
+ var useState$42 = react$1.useState;
794
+ var useEffect$32 = react$1.useEffect;
791
795
  react$1.useLayoutEffect;
792
796
  var useMemo$10 = react$1.useMemo;
793
797
  react$1.useCallback;
@@ -802,7 +806,7 @@ react$1.useSyncExternalStore;
802
806
  * @returns 一个 div。
803
807
  */
804
808
  function ActivityBlock({ head, children }) {
805
- return h$67("div", { className: "wb-activityBlock" }, head === void 0 ? null : h$67("div", { className: "wb-activityBlockHead" }, head), children);
809
+ return h$71("div", { className: "wb-activityBlock" }, head === void 0 ? null : h$71("div", { className: "wb-activityBlockHead" }, head), children);
806
810
  }
807
811
  /**
808
812
  * 一条活动:状态点 + 正文 + 时间,行尾可挂动作;时间一律用它,别自己拼。
@@ -813,7 +817,7 @@ function ActivityBlock({ head, children }) {
813
817
  * @returns 一行。
814
818
  */
815
819
  function ActivityLine({ dot, text, at, actions }) {
816
- return h$67("div", { className: "wb-activityLine" }, dot, h$67("span", { className: "wb-activityLineText" }, text), at === void 0 ? null : h$67("span", { className: "wb-activityLineAt" }, at), actions === void 0 ? null : h$67("span", { className: "wb-activityLineActions" }, actions));
820
+ return h$71("div", { className: "wb-activityLine" }, dot, h$71("span", { className: "wb-activityLineText" }, text), at === void 0 ? null : h$71("span", { className: "wb-activityLineAt" }, at), actions === void 0 ? null : h$71("span", { className: "wb-activityLineActions" }, actions));
817
821
  }
818
822
  /**
819
823
  * 活动行尾那颗动作:给 `href` 就是外链,否则是图标钮并带上 tooltip。
@@ -827,7 +831,7 @@ function ActivityLine({ dot, text, at, actions }) {
827
831
  */
828
832
  function ActivityAction({ label, hint, icon, href, onClick, failed }) {
829
833
  const tip = hint ?? label;
830
- if (href !== void 0) return h$67("a", {
834
+ if (href !== void 0) return h$71("a", {
831
835
  className: "wb-iconButton",
832
836
  href,
833
837
  target: "_blank",
@@ -835,13 +839,13 @@ function ActivityAction({ label, hint, icon, href, onClick, failed }) {
835
839
  title: tip,
836
840
  "aria-label": label
837
841
  }, icon);
838
- return h$67(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
842
+ return h$71(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
839
843
  side: "bottom",
840
844
  align: "end",
841
845
  gap: 6,
842
846
  portal: true,
843
847
  label: tip
844
- }, h$67(_deepseek_ai_dsh_client_ui_primitives.Button, {
848
+ }, h$71(_deepseek_ai_dsh_client_ui_primitives.Button, {
845
849
  type: "button",
846
850
  variant: "ghost",
847
851
  size: "sm",
@@ -863,10 +867,10 @@ function ActivityAction({ label, hint, icon, href, onClick, failed }) {
863
867
  */
864
868
  function Note({ tone = "muted", as, role, children }) {
865
869
  const className = tone === "problem" ? "wb-problem" : "wb-note";
866
- return as === "span" ? h$67("span", {
870
+ return as === "span" ? h$71("span", {
867
871
  className,
868
872
  role
869
- }, children) : h$67("p", {
873
+ }, children) : h$71("p", {
870
874
  className,
871
875
  role
872
876
  }, children);
@@ -910,10 +914,10 @@ var CardBoundary = class extends Component {
910
914
  render() {
911
915
  const { reason } = this.state;
912
916
  if (reason === null) return this.props.children;
913
- return h$67(Note, { tone: "problem" }, h$67("span", null, this.props.t("panels.cardBroken", {
917
+ return h$71(Note, { tone: "problem" }, h$71("span", null, this.props.t("panels.cardBroken", {
914
918
  unit: this.props.unit,
915
919
  reason
916
- })), " ", h$67(_deepseek_ai_dsh_client_ui_primitives.Button, {
920
+ })), " ", h$71(_deepseek_ai_dsh_client_ui_primitives.Button, {
917
921
  type: "button",
918
922
  variant: "outline",
919
923
  size: "sm",
@@ -963,19 +967,19 @@ function ApprovalDetail(props) {
963
967
  const owner = (props.units ?? []).find((face) => face.approval?.tools.includes(input.tool) === true);
964
968
  if (owner?.approval !== void 0) {
965
969
  const Render = owner.approval.render;
966
- return h$67(CardBoundary, {
970
+ return h$71(CardBoundary, {
967
971
  unit: owner.unit,
968
972
  resetKey: props.callId ?? "",
969
973
  t
970
- }, h$67(Render, {
974
+ }, h$71(Render, {
971
975
  input,
972
976
  t
973
977
  }));
974
978
  }
975
979
  const shell = props.renderShell?.(input, t);
976
- if (shell !== void 0 && shell !== null) return h$67(Fragment$23, null, shell);
980
+ if (shell !== void 0 && shell !== null) return h$71(Fragment$22, null, shell);
977
981
  if (command === "") return null;
978
- return h$67(_deepseek_ai_dsh_client_ui_primitives.CodeBlock, {
982
+ return h$71(_deepseek_ai_dsh_client_ui_primitives.CodeBlock, {
979
983
  code: command,
980
984
  className: "wb-approvalCommand",
981
985
  copyLabel: t("blocker.copy"),
@@ -993,10 +997,10 @@ function ApprovalDetail(props) {
993
997
  * @returns 一个 div。
994
998
  */
995
999
  function ApprovalPlan({ rows, hint, warn, children }) {
996
- return h$67("div", { className: "wb-approvalPlan" }, hint === void 0 ? null : h$67("p", { className: "wb-approvalHint" }, hint), h$67("dl", { className: "wb-approvalRows" }, rows.map((row, index) => h$67("div", {
1000
+ return h$71("div", { className: "wb-approvalPlan" }, hint === void 0 ? null : h$71("p", { className: "wb-approvalHint" }, hint), h$71("dl", { className: "wb-approvalRows" }, rows.map((row, index) => h$71("div", {
997
1001
  className: "wb-approvalRow",
998
1002
  key: String(index)
999
- }, h$67("dt", { className: "wb-approvalLabel" }, row.label), h$67("dd", { className: "wb-approvalValue" }, row.value)))), children, warn === void 0 ? null : h$67("p", { className: "wb-approvalWarn" }, warn));
1003
+ }, h$71("dt", { className: "wb-approvalLabel" }, row.label), h$71("dd", { className: "wb-approvalValue" }, row.value)))), children, warn === void 0 ? null : h$71("p", { className: "wb-approvalWarn" }, warn));
1000
1004
  }
1001
1005
  //#endregion
1002
1006
  //#region ../shared/dist/components/CardHead.js
@@ -1013,47 +1017,47 @@ function ApprovalPlan({ rows, hint, warn, children }) {
1013
1017
  function CardHead({ t, title, meta, refreshing, onRefresh, gear, gearOpen, onToggleGear, platformHref, platform, platformTitle }) {
1014
1018
  const refreshLabel = refreshing ? t("rightbar.refreshing") : t("rightbar.refresh");
1015
1019
  const platformLabel = platformTitle ?? platform ?? t("rightbar.openPlatform");
1016
- return h$67("header", { className: "wb-cardHead" }, h$67("h2", { className: "wb-cardTitle" }, title), meta === void 0 ? null : h$67("span", { className: "wb-cardMeta" }, meta), platformHref === void 0 ? null : h$67(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
1020
+ return h$71("header", { className: "wb-cardHead" }, h$71("h2", { className: "wb-cardTitle" }, title), meta === void 0 ? null : h$71("span", { className: "wb-cardMeta" }, meta), platformHref === void 0 ? null : h$71(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
1017
1021
  side: "bottom",
1018
1022
  align: "end",
1019
1023
  gap: 6,
1020
1024
  portal: true,
1021
1025
  label: platformLabel
1022
- }, h$67("a", {
1026
+ }, h$71("a", {
1023
1027
  className: "wb-iconButton wb-cardOpen",
1024
1028
  href: platformHref,
1025
1029
  target: "_blank",
1026
1030
  rel: "noreferrer noopener",
1027
1031
  "aria-label": platform ?? platformLabel
1028
- }, h$67(_deepseek_ai_dsh_client_ui_primitives.IconRightUpOutlineRegular, { size: 14 }))), h$67(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
1032
+ }, h$71(_deepseek_ai_dsh_client_ui_primitives.IconRightUpOutlineRegular, { size: 14 }))), h$71(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
1029
1033
  side: "bottom",
1030
1034
  align: "end",
1031
1035
  gap: 6,
1032
1036
  portal: true,
1033
1037
  label: refreshLabel
1034
- }, h$67(_deepseek_ai_dsh_client_ui_primitives.Button, {
1038
+ }, h$71(_deepseek_ai_dsh_client_ui_primitives.Button, {
1035
1039
  type: "button",
1036
1040
  size: "sm",
1037
1041
  variant: "ghost",
1038
1042
  className: `wb-cardRefresh${refreshing ? " wb-spinning" : ""}`,
1039
1043
  "aria-label": refreshLabel,
1040
1044
  disabled: refreshing,
1041
- icon: h$67(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutlineRegular, { size: 14 }),
1045
+ icon: h$71(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutlineRegular, { size: 14 }),
1042
1046
  onClick: onRefresh
1043
- })), gear === void 0 || onToggleGear === void 0 ? null : h$67(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
1047
+ })), gear === void 0 || onToggleGear === void 0 ? null : h$71(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
1044
1048
  side: "bottom",
1045
1049
  align: "end",
1046
1050
  gap: 6,
1047
1051
  portal: true,
1048
1052
  label: gear
1049
- }, h$67(_deepseek_ai_dsh_client_ui_primitives.Button, {
1053
+ }, h$71(_deepseek_ai_dsh_client_ui_primitives.Button, {
1050
1054
  type: "button",
1051
1055
  size: "sm",
1052
1056
  variant: "ghost",
1053
1057
  className: `wb-cardGear${gearOpen === true ? " wb-iconButtonActive" : ""}`,
1054
1058
  "aria-label": gear,
1055
1059
  "aria-expanded": gearOpen === true,
1056
- icon: h$67(_deepseek_ai_dsh_client_ui_primitives.IconSettingsOutlineRegular, { size: 15 }),
1060
+ icon: h$71(_deepseek_ai_dsh_client_ui_primitives.IconSettingsOutlineRegular, { size: 15 }),
1057
1061
  onClick: onToggleGear
1058
1062
  })));
1059
1063
  }
@@ -1070,13 +1074,13 @@ function CardHead({ t, title, meta, refreshing, onRefresh, gear, gearOpen, onTog
1070
1074
  * @returns 一个 `<section>`。
1071
1075
  */
1072
1076
  function Card({ t, title, refreshing, onRefresh, meta, head, children }) {
1073
- return h$67("section", { className: "wb-card" }, head === void 0 ? h$67(CardHead, {
1077
+ return h$71("section", { className: "wb-card" }, head === void 0 ? h$71(CardHead, {
1074
1078
  t,
1075
1079
  title,
1076
1080
  refreshing,
1077
1081
  onRefresh,
1078
1082
  meta
1079
- }) : head, h$67("div", { className: "wb-cardBody" }, children));
1083
+ }) : head, h$71("div", { className: "wb-cardBody" }, children));
1080
1084
  }
1081
1085
  var CardAnchor_module_default = { anchor: "_anchor_yq4s2_1" };
1082
1086
  //#endregion
@@ -1096,7 +1100,7 @@ function cardIdOf(unit) {
1096
1100
  * @returns 带 id 的占位 div。
1097
1101
  */
1098
1102
  function CardAnchor({ unit, children }) {
1099
- return h$67("div", {
1103
+ return h$71("div", {
1100
1104
  id: cardIdOf(unit),
1101
1105
  className: CardAnchor_module_default.anchor
1102
1106
  }, children);
@@ -1110,13 +1114,13 @@ function CardAnchor({ unit, children }) {
1110
1114
  * @returns 一枚 `StateDot state="ongoing"`,自身不带文字。
1111
1115
  */
1112
1116
  function Spinner({ size = 14, label }) {
1113
- return h$67("span", {
1117
+ return h$71("span", {
1114
1118
  className: "wb-spinner",
1115
1119
  ...label === void 0 ? { "aria-hidden": true } : {
1116
1120
  role: "status",
1117
1121
  "aria-label": label
1118
1122
  }
1119
- }, h$67(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
1123
+ }, h$71(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
1120
1124
  state: "ongoing",
1121
1125
  size
1122
1126
  }));
@@ -1124,24 +1128,24 @@ function Spinner({ size = 14, label }) {
1124
1128
  //#endregion
1125
1129
  //#region ../shared/dist/components/ChoiceGroup.js
1126
1130
  function ChoiceMenu(input) {
1127
- const body = input.loading ? h$67("span", {
1131
+ const body = input.loading ? h$71("span", {
1128
1132
  className: "wb-choiceLoading",
1129
1133
  role: "status"
1130
- }, h$67(Spinner, { size: 14 }), h$67("span", { className: "wb-choiceLoadingText" }, input.loadingText ?? "…")) : input.options.length === 0 ? input.emptyText === void 0 ? null : h$67("span", { className: "wb-choiceEmpty" }, input.emptyText) : input.options.map((option) => {
1134
+ }, h$71(Spinner, { size: 14 }), h$71("span", { className: "wb-choiceLoadingText" }, input.loadingText ?? "…")) : input.options.length === 0 ? input.emptyText === void 0 ? null : h$71("span", { className: "wb-choiceEmpty" }, input.emptyText) : input.options.map((option) => {
1131
1135
  const row = input.rowOf(option.value);
1132
- return h$67(Fragment$23, { key: option.value }, h$67("label", { className: `wb-choiceOption${row.checked ? " wb-choiceOptionOn" : ""}` }, h$67("input", {
1136
+ return h$71(Fragment$22, { key: option.value }, h$71("label", { className: `wb-choiceOption${row.checked ? " wb-choiceOptionOn" : ""}` }, h$71("input", {
1133
1137
  className: input.multi ? "wb-checkbox" : "wb-radio",
1134
1138
  type: input.multi ? "checkbox" : "radio",
1135
1139
  name: input.name,
1136
1140
  checked: row.checked,
1137
1141
  disabled: input.disabled,
1138
1142
  onChange: row.onSelect
1139
- }), input.multi ? h$67("span", {
1143
+ }), input.multi ? h$71("span", {
1140
1144
  className: "wb-checkboxBox",
1141
1145
  "aria-hidden": "true"
1142
- }, row.checked ? h$67(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutlineRegular, { size: 12 }) : null) : null, h$67("span", { className: "wb-choiceLabel" }, h$67("span", { className: "wb-choiceLabelText" }, option.label), option.description === void 0 ? null : h$67("span", { className: "wb-choiceDescription" }, option.description))));
1146
+ }, row.checked ? h$71(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutlineRegular, { size: 12 }) : null) : null, h$71("span", { className: "wb-choiceLabel" }, h$71("span", { className: "wb-choiceLabelText" }, option.label), option.description === void 0 ? null : h$71("span", { className: "wb-choiceDescription" }, option.description))));
1143
1147
  });
1144
- return h$67("div", {
1148
+ return h$71("div", {
1145
1149
  className: "wb-choiceMenu",
1146
1150
  "data-variant": input.variant,
1147
1151
  role: input.multi ? "group" : "radiogroup",
@@ -1175,7 +1179,7 @@ function ChoiceGroup(props) {
1175
1179
  if (props.multi === true) {
1176
1180
  const values = props.values;
1177
1181
  const onChange = props.onChange;
1178
- return h$67(ChoiceMenu, {
1182
+ return h$71(ChoiceMenu, {
1179
1183
  label: common.label,
1180
1184
  name: common.name,
1181
1185
  options: common.options,
@@ -1195,7 +1199,7 @@ function ChoiceGroup(props) {
1195
1199
  }
1196
1200
  const value = props.value;
1197
1201
  const onChange = props.onChange;
1198
- return h$67(ChoiceMenu, {
1202
+ return h$71(ChoiceMenu, {
1199
1203
  label: common.label,
1200
1204
  name: common.name,
1201
1205
  options: common.options,
@@ -1248,17 +1252,17 @@ function variantOf(kind) {
1248
1252
  function FormActions({ actions }) {
1249
1253
  if (actions.length === 0) return null;
1250
1254
  reportExtraPrimaries(actions);
1251
- return h$67("div", { className: "wb-formActions" }, ordered(actions).map((action) => {
1255
+ return h$71("div", { className: "wb-formActions" }, ordered(actions).map((action) => {
1252
1256
  const kind = kindOf(action);
1253
1257
  const busy = action.busy === true;
1254
- return h$67(_deepseek_ai_dsh_client_ui_primitives.Button, {
1258
+ return h$71(_deepseek_ai_dsh_client_ui_primitives.Button, {
1255
1259
  key: action.key,
1256
1260
  type: "button",
1257
1261
  size: "sm",
1258
1262
  variant: variantOf(kind),
1259
1263
  className: kind === "danger" ? "wb-formActionDanger" : void 0,
1260
1264
  disabled: busy || action.disabled === true,
1261
- icon: busy ? h$67(Spinner, { size: 12 }) : void 0,
1265
+ icon: busy ? h$71(Spinner, { size: 12 }) : void 0,
1262
1266
  onClick: action.onClick
1263
1267
  }, action.label);
1264
1268
  }));
@@ -1271,7 +1275,7 @@ function FormActions({ actions }) {
1271
1275
  * @returns 竖排的 div。
1272
1276
  */
1273
1277
  function Rows({ children }) {
1274
- return h$67("div", { className: "wb-rows" }, children);
1278
+ return h$71("div", { className: "wb-rows" }, children);
1275
1279
  }
1276
1280
  /**
1277
1281
  * 一行键值:左边名字、右边值;要成对说明一项数据就用它,别自己写两栏。
@@ -1280,7 +1284,7 @@ function Rows({ children }) {
1280
1284
  * @returns 一行两格。
1281
1285
  */
1282
1286
  function Row({ label, value }) {
1283
- return h$67("div", { className: "wb-row" }, h$67("span", { className: "wb-rowKey" }, label), h$67("span", { className: "wb-rowValue" }, value));
1287
+ return h$71("div", { className: "wb-row" }, h$71("span", { className: "wb-rowKey" }, label), h$71("span", { className: "wb-rowValue" }, value));
1284
1288
  }
1285
1289
  //#endregion
1286
1290
  //#region ../shared/dist/components/ConfirmBar.js
@@ -1297,19 +1301,19 @@ function Row({ label, value }) {
1297
1301
  * @returns 一个 `role="group"` 的条;`actions` 空数组时最后那一块不渲染。
1298
1302
  */
1299
1303
  function ConfirmBar({ title, hint, rows, actions, problem, busy, label }) {
1300
- return h$67("div", {
1304
+ return h$71("div", {
1301
1305
  className: "wb-confirmBar",
1302
1306
  role: "group",
1303
1307
  "aria-label": label ?? (typeof title === "string" ? title : void 0),
1304
1308
  "aria-busy": busy
1305
- }, h$67("p", { className: "wb-confirmBarTitle" }, title), hint === void 0 ? null : h$67("p", { className: "wb-confirmBarHint" }, hint), rows === void 0 || rows.length === 0 ? null : h$67(Rows, null, rows.map((row) => h$67(Row, {
1309
+ }, h$71("p", { className: "wb-confirmBarTitle" }, title), hint === void 0 ? null : h$71("p", { className: "wb-confirmBarHint" }, hint), rows === void 0 || rows.length === 0 ? null : h$71(Rows, null, rows.map((row) => h$71(Row, {
1306
1310
  key: row.key,
1307
1311
  label: row.label,
1308
1312
  value: row.value
1309
- }))), problem === void 0 ? null : h$67(Note, {
1313
+ }))), problem === void 0 ? null : h$71(Note, {
1310
1314
  tone: "problem",
1311
1315
  role: "alert"
1312
- }, problem), h$67(FormActions, { actions }));
1316
+ }, problem), h$71(FormActions, { actions }));
1313
1317
  }
1314
1318
  //#endregion
1315
1319
  //#region ../shared/dist/components/Field.js
@@ -1321,7 +1325,7 @@ function ConfirmBar({ title, hint, rows, actions, problem, busy, label }) {
1321
1325
  * @returns 一个 `<label>`,点标签会聚焦里面的控件。
1322
1326
  */
1323
1327
  function Field({ label, hint, children }) {
1324
- return h$67("label", { className: "wb-field" }, h$67("span", { className: "wb-fieldLabel" }, label), children, hint === void 0 ? null : h$67("span", { className: "wb-fieldHint" }, hint));
1328
+ return h$71("label", { className: "wb-field" }, h$71("span", { className: "wb-fieldLabel" }, label), children, hint === void 0 ? null : h$71("span", { className: "wb-fieldHint" }, hint));
1325
1329
  }
1326
1330
  //#endregion
1327
1331
  //#region ../shared/dist/components/FormRows.js
@@ -1331,7 +1335,7 @@ function Field({ label, hint, children }) {
1331
1335
  * @returns 竖排的 div。
1332
1336
  */
1333
1337
  function FormRows({ children }) {
1334
- return h$67("div", { className: "wb-formRows" }, children);
1338
+ return h$71("div", { className: "wb-formRows" }, children);
1335
1339
  }
1336
1340
  /**
1337
1341
  * 表单一行:左边标签、右边控件,提示与错误占控件下面那一格。
@@ -1344,14 +1348,14 @@ function FormRows({ children }) {
1344
1348
  * @returns 一个 `<div>`:里面的 `<label>` 只包标签文字,不包控件、提示与整行的空白。
1345
1349
  */
1346
1350
  function FormRow({ label, htmlFor, hint, problem, layout = "inline", children }) {
1347
- return h$67("div", {
1351
+ return h$71("div", {
1348
1352
  className: "wb-formRow",
1349
1353
  "data-layout": layout,
1350
1354
  "data-wb-problem": problem === void 0 ? void 0 : ""
1351
- }, h$67("label", {
1355
+ }, h$71("label", {
1352
1356
  className: "wb-formLabel",
1353
1357
  htmlFor
1354
- }, label), h$67("span", { className: "wb-formControl" }, children), problem === void 0 ? hint === void 0 ? null : h$67("span", { className: "wb-formHint" }, hint) : h$67("span", { className: "wb-formProblem" }, problem));
1358
+ }, label), h$71("span", { className: "wb-formControl" }, children), problem === void 0 ? hint === void 0 ? null : h$71("span", { className: "wb-formHint" }, hint) : h$71("span", { className: "wb-formProblem" }, problem));
1355
1359
  }
1356
1360
  //#endregion
1357
1361
  //#region ../shared/dist/components/FormNodes.js
@@ -1498,7 +1502,7 @@ function formActionsOf(args) {
1498
1502
  * @returns `FormRow` 组成的数组;没有可画的格子时给空数组。
1499
1503
  */
1500
1504
  function formRowsOf(args) {
1501
- return args.fields.map((field) => h$67(FormRow, {
1505
+ return args.fields.map((field) => h$71(FormRow, {
1502
1506
  key: field.key,
1503
1507
  label: field.label,
1504
1508
  htmlFor: controlIdOf(field.key),
@@ -1574,13 +1578,13 @@ function revealFirstProblem(root) {
1574
1578
  */
1575
1579
  function Form(props) {
1576
1580
  const { fields, onSubmit, submit, cancel, extra, busy = false, disabled = false, problem } = props;
1577
- const [done, setDone] = useState$40(false);
1578
- const [reveal, setReveal] = useState$40(0);
1581
+ const [done, setDone] = useState$42(false);
1582
+ const [reveal, setReveal] = useState$42(0);
1579
1583
  const rootRef = useRef$24(null);
1580
1584
  const shown = visibleFieldsOf(fields);
1581
1585
  const problems = formProblemsOf(shown, done);
1582
1586
  reportDuplicateKeys(shown);
1583
- useEffect$30(() => {
1587
+ useEffect$32(() => {
1584
1588
  if (reveal === 0) return;
1585
1589
  const root = rootRef.current;
1586
1590
  if (root !== null) revealFirstProblem(root);
@@ -1595,7 +1599,7 @@ function Form(props) {
1595
1599
  }
1596
1600
  onSubmit(outcome.values);
1597
1601
  };
1598
- return h$67("form", {
1602
+ return h$71("form", {
1599
1603
  className: "wb-form",
1600
1604
  ref: rootRef,
1601
1605
  noValidate: true,
@@ -1603,15 +1607,15 @@ function Form(props) {
1603
1607
  event.preventDefault();
1604
1608
  submitForm();
1605
1609
  }
1606
- }, h$67(FormRows, null, formRowsOf({
1610
+ }, h$71(FormRows, null, formRowsOf({
1607
1611
  fields: shown,
1608
1612
  problems,
1609
1613
  showProblem: done,
1610
1614
  busy
1611
- })), problem === void 0 ? null : h$67(Note, {
1615
+ })), problem === void 0 ? null : h$71(Note, {
1612
1616
  tone: "problem",
1613
1617
  role: "alert"
1614
- }, problem), h$67(FormActions, { actions: formActionsOf({
1618
+ }, problem), h$71(FormActions, { actions: formActionsOf({
1615
1619
  extra,
1616
1620
  cancel,
1617
1621
  submit,
@@ -1632,7 +1636,7 @@ function Form(props) {
1632
1636
  * @returns 一个 `<a>`。
1633
1637
  */
1634
1638
  function Link({ href, children, title, external = true, className }) {
1635
- return h$67("a", {
1639
+ return h$71("a", {
1636
1640
  className: className === void 0 ? "wb-link" : `wb-link ${className}`,
1637
1641
  href,
1638
1642
  ...title === void 0 ? {} : { title },
@@ -1640,7 +1644,7 @@ function Link({ href, children, title, external = true, className }) {
1640
1644
  target: "_blank",
1641
1645
  rel: "noopener noreferrer"
1642
1646
  } : {}
1643
- }, children, external ? h$67(_deepseek_ai_dsh_client_ui_primitives.IconRightUpOutlineRegular, { size: 12 }) : null);
1647
+ }, children, external ? h$71(_deepseek_ai_dsh_client_ui_primitives.IconRightUpOutlineRegular, { size: 12 }) : null);
1644
1648
  }
1645
1649
  //#endregion
1646
1650
  //#region ../shared/dist/contract/long-task.js
@@ -1732,7 +1736,7 @@ var LONG_TASK_STOP_ARM_MS = 3e3;
1732
1736
  //#endregion
1733
1737
  //#region ../shared/dist/components/LongTaskRow.js
1734
1738
  function RowLink({ href, text }) {
1735
- return h$67(Link, {
1739
+ return h$71(Link, {
1736
1740
  href,
1737
1741
  className: "wb-longTaskLink"
1738
1742
  }, text);
@@ -1752,9 +1756,9 @@ function RowLink({ href, text }) {
1752
1756
  * @returns 一行长任务。
1753
1757
  */
1754
1758
  function LongTaskRow(props) {
1755
- const [stepsOpen, setStepsOpen] = useState$40(false);
1756
- const [rawOpen, setRawOpen] = useState$40(false);
1757
- const [armed, setArmed] = useState$40(false);
1759
+ const [stepsOpen, setStepsOpen] = useState$42(false);
1760
+ const [rawOpen, setRawOpen] = useState$42(false);
1761
+ const [armed, setArmed] = useState$42(false);
1758
1762
  const failed = props.status === "failed";
1759
1763
  const problem = props.problem ?? "";
1760
1764
  const raw = (props.raw ?? "").trim();
@@ -1762,7 +1766,7 @@ function LongTaskRow(props) {
1762
1766
  const stop = props.stop;
1763
1767
  const busy = stop?.busy === true;
1764
1768
  const stopWhy = stop?.failed ?? "";
1765
- useEffect$30(() => {
1769
+ useEffect$32(() => {
1766
1770
  if (!armed) return void 0;
1767
1771
  const timer = setTimeout(() => setArmed(false), LONG_TASK_STOP_ARM_MS);
1768
1772
  return () => clearTimeout(timer);
@@ -1781,14 +1785,14 @@ function LongTaskRow(props) {
1781
1785
  setArmed(false);
1782
1786
  stop.onStop();
1783
1787
  };
1784
- return h$67("div", { className: "wb-longTask" }, h$67("p", { className: "wb-longTaskHead" }, h$67(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
1788
+ return h$71("div", { className: "wb-longTask" }, h$71("p", { className: "wb-longTaskHead" }, h$71(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
1785
1789
  state: longTaskDot(props.status),
1786
1790
  size: 10
1787
- }), h$67("span", { className: "wb-longTaskHeadline" }, props.headline), (props.links ?? []).map((link) => h$67(RowLink, {
1791
+ }), h$71("span", { className: "wb-longTaskHeadline" }, props.headline), (props.links ?? []).map((link) => h$71(RowLink, {
1788
1792
  href: link.href,
1789
1793
  key: `${link.text}@${link.href}`,
1790
1794
  text: link.text
1791
- })), stop === void 0 ? null : h$67("button", {
1795
+ })), stop === void 0 ? null : h$71("button", {
1792
1796
  type: "button",
1793
1797
  className: `wb-longTaskStop${armed ? " wb-longTaskStopArmed" : ""}`,
1794
1798
  "data-stop-state": longTaskStopStage({
@@ -1799,31 +1803,31 @@ function LongTaskRow(props) {
1799
1803
  disabled: busy,
1800
1804
  onClick: onStopPress,
1801
1805
  onBlur: () => setArmed(false)
1802
- }, h$67(_deepseek_ai_dsh_client_ui_primitives.IconStopFillRegular, { size: 12 }), armed ? h$67("span", { className: "wb-longTaskStopLabel" }, stop.askLabel) : null)), problem === "" ? null : h$67("p", { className: "wb-longTaskProblem" }, problem), stopWhy === "" ? null : h$67("p", { className: "wb-longTaskStopWhy" }, stopWhy), !failed ? null : h$67(Fragment$23, null, steps.length === 0 || props.stepsTitle === void 0 ? null : h$67(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
1806
+ }, h$71(_deepseek_ai_dsh_client_ui_primitives.IconStopFillRegular, { size: 12 }), armed ? h$71("span", { className: "wb-longTaskStopLabel" }, stop.askLabel) : null)), problem === "" ? null : h$71("p", { className: "wb-longTaskProblem" }, problem), stopWhy === "" ? null : h$71("p", { className: "wb-longTaskStopWhy" }, stopWhy), !failed ? null : h$71(Fragment$22, null, steps.length === 0 || props.stepsTitle === void 0 ? null : h$71(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
1803
1807
  className: "wb-longTaskDump",
1804
- icon: h$67(_deepseek_ai_dsh_client_ui_primitives.IconFlatListOutlineRegular, { size: 14 }),
1808
+ icon: h$71(_deepseek_ai_dsh_client_ui_primitives.IconFlatListOutlineRegular, { size: 14 }),
1805
1809
  title: props.stepsTitle,
1806
1810
  open: stepsOpen,
1807
1811
  expandable: true,
1808
1812
  expandOnRowClick: true,
1809
1813
  previewChevron: true,
1810
1814
  onToggle: () => setStepsOpen(!stepsOpen)
1811
- }, h$67(_deepseek_ai_dsh_client_ui_primitives.CodeBlock, {
1815
+ }, h$71(_deepseek_ai_dsh_client_ui_primitives.CodeBlock, {
1812
1816
  code: steps.join("\n"),
1813
1817
  className: "wb-longTaskDump",
1814
1818
  showHeader: props.copyLabel !== void 0,
1815
1819
  copyLabel: props.copyLabel ?? "",
1816
1820
  copiedLabel: props.copiedLabel ?? ""
1817
- })), raw === "" || props.rawTitle === void 0 ? null : h$67(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
1821
+ })), raw === "" || props.rawTitle === void 0 ? null : h$71(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
1818
1822
  className: "wb-longTaskDump",
1819
- icon: h$67(_deepseek_ai_dsh_client_ui_primitives.IconCodeOutlineRegular, { size: 14 }),
1823
+ icon: h$71(_deepseek_ai_dsh_client_ui_primitives.IconCodeOutlineRegular, { size: 14 }),
1820
1824
  title: props.rawTitle,
1821
1825
  open: rawOpen,
1822
1826
  expandable: true,
1823
1827
  expandOnRowClick: true,
1824
1828
  previewChevron: true,
1825
1829
  onToggle: () => setRawOpen(!rawOpen)
1826
- }, h$67(_deepseek_ai_dsh_client_ui_primitives.CodeBlock, {
1830
+ }, h$71(_deepseek_ai_dsh_client_ui_primitives.CodeBlock, {
1827
1831
  code: raw,
1828
1832
  className: "wb-longTaskDump",
1829
1833
  showHeader: props.copyLabel !== void 0,
@@ -1839,13 +1843,13 @@ function LongTaskRow(props) {
1839
1843
  * @returns 一叠占位条。
1840
1844
  */
1841
1845
  function SkeletonRows({ rows = 4 }) {
1842
- return h$67("div", {
1846
+ return h$71("div", {
1843
1847
  className: "wb-skeleton",
1844
1848
  "aria-hidden": "true"
1845
- }, Array.from({ length: rows }, (_, index) => h$67("span", {
1849
+ }, Array.from({ length: rows }, (_, index) => h$71("span", {
1846
1850
  key: index,
1847
1851
  className: "wb-skeletonRow"
1848
- }, h$67("span", { className: "wb-skeletonBar wb-skeletonBarTitle" }), h$67("span", { className: "wb-skeletonBar wb-skeletonBarMeta" }))));
1852
+ }, h$71("span", { className: "wb-skeletonBar wb-skeletonBarTitle" }), h$71("span", { className: "wb-skeletonBar wb-skeletonBarMeta" }))));
1849
1853
  }
1850
1854
  /**
1851
1855
  * 居中一屏:要他先选一个 / 正在读 / 读不到时用它占住卡片版面。
@@ -1858,13 +1862,13 @@ function SkeletonRows({ rows = 4 }) {
1858
1862
  * @returns 一个 `role="status"` 的居中块。
1859
1863
  */
1860
1864
  function CenteredState({ icon, title, hint, detail, action, compact = false }) {
1861
- return h$67("div", {
1865
+ return h$71("div", {
1862
1866
  className: compact ? "wb-centered wb-centeredCompact" : "wb-centered",
1863
1867
  role: "status"
1864
- }, icon === null ? null : h$67("span", {
1868
+ }, icon === null ? null : h$71("span", {
1865
1869
  className: "wb-centeredHero",
1866
1870
  "aria-hidden": "true"
1867
- }, icon), h$67("div", { className: "wb-centeredTitle" }, title), hint === void 0 ? null : h$67("div", { className: "wb-centeredHint" }, hint), detail === void 0 ? null : h$67("div", { className: "wb-centeredDetail" }, detail), action === void 0 ? null : h$67("div", { className: "wb-centeredAction" }, action));
1871
+ }, icon), h$71("div", { className: "wb-centeredTitle" }, title), hint === void 0 ? null : h$71("div", { className: "wb-centeredHint" }, hint), detail === void 0 ? null : h$71("div", { className: "wb-centeredDetail" }, detail), action === void 0 ? null : h$71("div", { className: "wb-centeredAction" }, action));
1868
1872
  }
1869
1873
  /**
1870
1874
  * 就绪但空:它只是 `CenteredState` 的简写,标题就是那句空态文案。
@@ -1874,7 +1878,7 @@ function CenteredState({ icon, title, hint, detail, action, compact = false }) {
1874
1878
  * @returns 一个居中块。
1875
1879
  */
1876
1880
  function EmptyState({ text, icon = null, compact = false }) {
1877
- return h$67(CenteredState, {
1881
+ return h$71(CenteredState, {
1878
1882
  icon,
1879
1883
  title: text,
1880
1884
  compact
@@ -1892,7 +1896,7 @@ function EmptyState({ text, icon = null, compact = false }) {
1892
1896
  * @returns 一组按钮。
1893
1897
  */
1894
1898
  function SaveBar({ busy, disabled, labels, onCancel, onSave }) {
1895
- return h$67(FormActions, { actions: [{
1899
+ return h$71(FormActions, { actions: [{
1896
1900
  key: "cancel",
1897
1901
  label: labels.cancel,
1898
1902
  kind: "default",
@@ -1925,7 +1929,7 @@ function SaveBar({ busy, disabled, labels, onCancel, onSave }) {
1925
1929
  * @returns 一颗 `<button>`。
1926
1930
  */
1927
1931
  function selectTriggerNode(args) {
1928
- return h$67("button", {
1932
+ return h$71("button", {
1929
1933
  type: "button",
1930
1934
  id: args.id,
1931
1935
  className: args.className,
@@ -1936,7 +1940,7 @@ function selectTriggerNode(args) {
1936
1940
  "aria-label": args.ariaLabel,
1937
1941
  title: args.title,
1938
1942
  onClick: args.onOpen
1939
- }, args.iconOnly ? h$67("span", { className: "wb-selectIcon" }, args.icon) : h$67(Fragment$23, null, args.icon === void 0 ? null : h$67("span", { className: "wb-selectIcon" }, args.icon), h$67("span", { className: "wb-selectValue" }, args.value), h$67("span", { className: "wb-selectChevron" }, h$67(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, { size: 14 }))));
1943
+ }, args.iconOnly ? h$71("span", { className: "wb-selectIcon" }, args.icon) : h$71(Fragment$22, null, args.icon === void 0 ? null : h$71("span", { className: "wb-selectIcon" }, args.icon), h$71("span", { className: "wb-selectValue" }, args.value), h$71("span", { className: "wb-selectChevron" }, h$71(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, { size: 14 }))));
1940
1944
  }
1941
1945
  /**
1942
1946
  * 名单还没读到时的触发器:禁用 + `aria-busy` 的按钮,`SelectField` 在 `loading` 那档画它。
@@ -1948,7 +1952,7 @@ function selectTriggerNode(args) {
1948
1952
  * @returns 一颗禁用且 `aria-busy` 的按钮。
1949
1953
  */
1950
1954
  function selectLoadingNode(args) {
1951
- return h$67("button", {
1955
+ return h$71("button", {
1952
1956
  type: "button",
1953
1957
  id: args.id,
1954
1958
  className: `${args.className} wb-selectLoading`,
@@ -1957,7 +1961,7 @@ function selectLoadingNode(args) {
1957
1961
  "aria-invalid": args.invalid || void 0,
1958
1962
  "aria-label": args.ariaLabel,
1959
1963
  title: args.loadingText
1960
- }, h$67("span", { className: "wb-selectValue" }, h$67(_deepseek_ai_dsh_client_ui_primitives.TextShimmer, { active: true }, args.loadingText ?? "…")), h$67("span", { className: "wb-selectChevron" }, h$67(Spinner, { size: 14 })));
1964
+ }, h$71("span", { className: "wb-selectValue" }, h$71(_deepseek_ai_dsh_client_ui_primitives.TextShimmer, { active: true }, args.loadingText ?? "…")), h$71("span", { className: "wb-selectChevron" }, h$71(Spinner, { size: 14 })));
1961
1965
  }
1962
1966
  //#endregion
1963
1967
  //#region ../shared/dist/components/TextField.js
@@ -1967,7 +1971,7 @@ function selectLoadingNode(args) {
1967
1971
  * @returns 输入框元素;`className` 是追加在基础类名之后,而不是替换它。
1968
1972
  */
1969
1973
  function TextField({ invalid = false, className, ...rest }) {
1970
- return h$67("input", {
1974
+ return h$71("input", {
1971
1975
  ...rest,
1972
1976
  className: className === void 0 ? "wb-textField" : `wb-textField ${className}`,
1973
1977
  "aria-invalid": invalid || void 0
@@ -1990,7 +1994,7 @@ function itemOf(option, revealId) {
1990
1994
  ...option.icon === void 0 ? {} : { icon: option.icon },
1991
1995
  ...option.disabled === true ? { disabled: true } : {}
1992
1996
  };
1993
- const revealed = (node) => h$67("span", {
1997
+ const revealed = (node) => h$71("span", {
1994
1998
  className: "wb-selectReveal",
1995
1999
  "data-wb-select-reveal": ""
1996
2000
  }, node);
@@ -2006,20 +2010,20 @@ function revealNode() {
2006
2010
  return found instanceof HTMLElement ? found : null;
2007
2011
  }
2008
2012
  function useRevealOnOpen(open, revealId) {
2009
- useEffect$30(() => {
2013
+ useEffect$32(() => {
2010
2014
  if (!open || revealId === void 0) return;
2011
2015
  revealNode()?.scrollIntoView({ block: "nearest" });
2012
2016
  }, [open, revealId]);
2013
2017
  }
2014
2018
  function selectValueNode(current, renderValue, placeholder) {
2015
- if (current === void 0) return h$67("span", { className: "wb-selectPlaceholder" }, placeholder ?? "—");
2019
+ if (current === void 0) return h$71("span", { className: "wb-selectPlaceholder" }, placeholder ?? "—");
2016
2020
  return renderValue === void 0 ? current.label : renderValue(current);
2017
2021
  }
2018
2022
  function searchNode(args) {
2019
- return h$67("span", {
2023
+ return h$71("span", {
2020
2024
  ref: args.boxRef,
2021
2025
  className: args.className
2022
- }, h$67("span", { className: "wb-selectSearchIcon" }, h$67(_deepseek_ai_dsh_client_ui_primitives.IconSearchOutlineRegular, { size: 14 })), h$67(TextField, {
2026
+ }, h$71("span", { className: "wb-selectSearchIcon" }, h$71(_deepseek_ai_dsh_client_ui_primitives.IconSearchOutlineRegular, { size: 14 })), h$71(TextField, {
2023
2027
  id: args.id,
2024
2028
  name: args.name,
2025
2029
  className: "wb-selectSearchInput",
@@ -2034,7 +2038,7 @@ function searchNode(args) {
2034
2038
  }));
2035
2039
  }
2036
2040
  function menuNode(args) {
2037
- return h$67(_deepseek_ai_dsh_client_ui_primitives.Menu, {
2041
+ return h$71(_deepseek_ai_dsh_client_ui_primitives.Menu, {
2038
2042
  open: args.open,
2039
2043
  portal: true,
2040
2044
  className: "wb-selectAnchor",
@@ -2051,11 +2055,11 @@ function menuNode(args) {
2051
2055
  });
2052
2056
  }
2053
2057
  function framed(label, hint, className, control) {
2054
- const inner = label === void 0 ? hint === void 0 ? control : h$67("span", { className: "wb-select" }, control, h$67("span", { className: "wb-selectHint" }, hint)) : h$67(Field, {
2058
+ const inner = label === void 0 ? hint === void 0 ? control : h$71("span", { className: "wb-select" }, control, h$71("span", { className: "wb-selectHint" }, hint)) : h$71(Field, {
2055
2059
  label,
2056
2060
  hint
2057
2061
  }, control);
2058
- return className === void 0 ? inner : h$67("div", { className }, inner);
2062
+ return className === void 0 ? inner : h$71("div", { className }, inner);
2059
2063
  }
2060
2064
  /** 算候选项用来匹配搜索的文本:有 `searchText` 就用它,否则取字符串标签;标签不是字符串又没给它是空串(这项搜不到)。 */
2061
2065
  function searchTextOf(option) {
@@ -2107,9 +2111,9 @@ function selectEntries(shown, emptyText, revealId) {
2107
2111
  }
2108
2112
  function useSelectState(props) {
2109
2113
  const { options, filter = defaultSelectFilter, emptyText, open: openProp, onOpenChange } = props;
2110
- const [openState, setOpenState] = useState$40(false);
2111
- const [query, setQuery] = useState$40("");
2112
- const [cursor, setCursor] = useState$40(null);
2114
+ const [openState, setOpenState] = useState$42(false);
2115
+ const [query, setQuery] = useState$42("");
2116
+ const [cursor, setCursor] = useState$42(null);
2113
2117
  const boxRef = useRef$24(null);
2114
2118
  const triggerRef = useRef$24(null);
2115
2119
  const wasOpenRef = useRef$24(false);
@@ -2120,11 +2124,11 @@ function useSelectState(props) {
2120
2124
  if (openProp === void 0) setOpenState(next);
2121
2125
  onOpenChange?.(next);
2122
2126
  };
2123
- useEffect$30(() => {
2127
+ useEffect$32(() => {
2124
2128
  if (!open || props.search === false) return;
2125
2129
  boxRef.current?.querySelector("input")?.focus();
2126
2130
  }, [open, props.search]);
2127
- useEffect$30(() => {
2131
+ useEffect$32(() => {
2128
2132
  if (open) {
2129
2133
  wasOpenRef.current = true;
2130
2134
  return;
@@ -2194,7 +2198,7 @@ function SelectField(props) {
2194
2198
  ariaLabel,
2195
2199
  loadingText
2196
2200
  }));
2197
- if (fallback !== void 0 && options.length === 0) return framed(label, hint, className, h$67(TextField, {
2201
+ if (fallback !== void 0 && options.length === 0) return framed(label, hint, className, h$71(TextField, {
2198
2202
  id,
2199
2203
  name,
2200
2204
  className: "wb-selectFallback",
@@ -2277,11 +2281,11 @@ function SelectField(props) {
2277
2281
  * @returns 一个 `role="group"` 的 section。
2278
2282
  */
2279
2283
  function SettingsSection({ label, title, action, children }) {
2280
- return h$67("section", {
2284
+ return h$71("section", {
2281
2285
  className: "wb-settings",
2282
2286
  role: "group",
2283
2287
  "aria-label": label
2284
- }, h$67("header", { className: "wb-settingsHead" }, h$67("span", { className: "wb-settingsTitle" }, title), action), children);
2288
+ }, h$71("header", { className: "wb-settingsHead" }, h$71("span", { className: "wb-settingsTitle" }, title), action), children);
2285
2289
  }
2286
2290
  //#endregion
2287
2291
  //#region ../shared/dist/components/Stack.js
@@ -2291,7 +2295,7 @@ function SettingsSection({ label, title, action, children }) {
2291
2295
  * @returns 竖排的 div。
2292
2296
  */
2293
2297
  function Stack({ children }) {
2294
- return h$67("div", { className: "wb-stack" }, children);
2298
+ return h$71("div", { className: "wb-stack" }, children);
2295
2299
  }
2296
2300
  //#endregion
2297
2301
  //#region ../shared/dist/components/StateBlock.js
@@ -2306,12 +2310,12 @@ function Stack({ children }) {
2306
2310
  * @returns 一个 div。
2307
2311
  */
2308
2312
  function StateBlock({ title, dot, hint, actions, resolving, children }) {
2309
- return h$67("div", { className: "wb-stateBlock" }, title === void 0 && dot === void 0 ? null : h$67("p", { className: "wb-stateBlockTitle" }, dot, title), resolving === void 0 ? null : h$67("p", { className: "wb-stateBlockResolving" }, resolving), hint === void 0 ? null : h$67("p", { className: "wb-stateBlockHint" }, hint), children, actions === void 0 ? null : h$67("div", { className: "wb-stateBlockActions" }, actions));
2313
+ return h$71("div", { className: "wb-stateBlock" }, title === void 0 && dot === void 0 ? null : h$71("p", { className: "wb-stateBlockTitle" }, dot, title), resolving === void 0 ? null : h$71("p", { className: "wb-stateBlockResolving" }, resolving), hint === void 0 ? null : h$71("p", { className: "wb-stateBlockHint" }, hint), children, actions === void 0 ? null : h$71("div", { className: "wb-stateBlockActions" }, actions));
2310
2314
  }
2311
2315
  //#endregion
2312
2316
  //#region ../shared/dist/components/icons.js
2313
2317
  function Shell({ size, strokeWidth = 1, viewBox = "0 0 16 16", children }) {
2314
- return h$67("svg", {
2318
+ return h$71("svg", {
2315
2319
  width: size,
2316
2320
  height: size,
2317
2321
  viewBox,
@@ -2328,10 +2332,10 @@ function Shell({ size, strokeWidth = 1, viewBox = "0 0 16 16", children }) {
2328
2332
  * @returns 一枚 `aria-hidden` 的 svg。
2329
2333
  */
2330
2334
  function IconConversation({ size = 16 }) {
2331
- return h$67(Shell, {
2335
+ return h$71(Shell, {
2332
2336
  size,
2333
2337
  strokeWidth: 1.3
2334
- }, h$67("path", {
2338
+ }, h$71("path", {
2335
2339
  d: "M2.5 7.2c0-2.3 2.1-4.2 4.8-4.2h1.4c2.7 0 4.8 1.9 4.8 4.2s-2.1 4.2-4.8 4.2H7.5l-3.2 2v-2.3c-1.1-.8-1.8-2-1.8-3.9Z",
2336
2340
  stroke: "currentColor",
2337
2341
  strokeLinejoin: "round"
@@ -2346,30 +2350,30 @@ var BRAND_TAIL_TRANSFORM = "translate(14.6263 10.5853) scale(1.95)";
2346
2350
  * @returns 一枚 `aria-hidden` 的 svg。
2347
2351
  */
2348
2352
  function IconBrandMark({ size = 24 }) {
2349
- return h$67(Shell, {
2353
+ return h$71(Shell, {
2350
2354
  size,
2351
2355
  viewBox: "0 0 64 64"
2352
- }, h$67("path", {
2356
+ }, h$71("path", {
2353
2357
  d: BRAND_FRAME,
2354
2358
  fill: "currentColor",
2355
2359
  fillRule: "evenodd"
2356
- }), h$67("rect", {
2360
+ }), h$71("rect", {
2357
2361
  x: 27.5,
2358
2362
  y: 48,
2359
2363
  width: 9,
2360
2364
  height: 4.75,
2361
2365
  fill: "currentColor"
2362
- }), h$67("rect", {
2366
+ }), h$71("rect", {
2363
2367
  x: 19,
2364
2368
  y: 52.75,
2365
2369
  width: 26,
2366
2370
  height: 4.75,
2367
2371
  rx: 2.375,
2368
2372
  fill: "currentColor"
2369
- }), h$67("g", { transform: BRAND_TAIL_TRANSFORM }, h$67("path", {
2373
+ }), h$71("g", { transform: BRAND_TAIL_TRANSFORM }, h$71("path", {
2370
2374
  d: BRAND_TAIL,
2371
2375
  fill: "currentColor"
2372
- }), h$67("circle", {
2376
+ }), h$71("circle", {
2373
2377
  cx: 6.885,
2374
2378
  cy: 13.742,
2375
2379
  r: 1.95,
@@ -2382,30 +2386,30 @@ function IconBrandMark({ size = 24 }) {
2382
2386
  * @returns 一枚 `aria-hidden` 的 svg。
2383
2387
  */
2384
2388
  function IconOpencli({ size = 16 }) {
2385
- return h$67(Shell, {
2389
+ return h$71(Shell, {
2386
2390
  size,
2387
2391
  viewBox: "0 0 64 64"
2388
- }, h$67("defs", null, h$67("linearGradient", {
2392
+ }, h$71("defs", null, h$71("linearGradient", {
2389
2393
  id: "opencli-mark",
2390
2394
  x1: "0%",
2391
2395
  y1: "0%",
2392
2396
  x2: "100%",
2393
2397
  y2: "100%"
2394
- }, h$67("stop", {
2398
+ }, h$71("stop", {
2395
2399
  offset: "0%",
2396
2400
  stopColor: "#00e5a0"
2397
- }), h$67("stop", {
2401
+ }), h$71("stop", {
2398
2402
  offset: "50%",
2399
2403
  stopColor: "#00b4d8"
2400
- }), h$67("stop", {
2404
+ }), h$71("stop", {
2401
2405
  offset: "100%",
2402
2406
  stopColor: "#7b61ff"
2403
- }))), h$67("rect", {
2407
+ }))), h$71("rect", {
2404
2408
  width: 64,
2405
2409
  height: 64,
2406
2410
  rx: 14,
2407
2411
  fill: "#0a0a0f"
2408
- }), h$67("text", {
2412
+ }), h$71("text", {
2409
2413
  x: "50%",
2410
2414
  y: "54%",
2411
2415
  dominantBaseline: "middle",
@@ -2422,10 +2426,10 @@ function IconOpencli({ size = 16 }) {
2422
2426
  * @returns 一枚 `aria-hidden` 的 svg。
2423
2427
  */
2424
2428
  function IconNpm({ size = 16 }) {
2425
- return h$67(Shell, {
2429
+ return h$71(Shell, {
2426
2430
  size,
2427
2431
  viewBox: "0 0 1024 1024"
2428
- }, h$67("path", {
2432
+ }, h$71("path", {
2429
2433
  d: "M64 337.76h896v298.72H512v49.792H312.896v-49.824H64z m49.792 248.928h99.552v-149.376h49.76v149.344h49.792v-199.104H113.792z m248.896-199.136v248.928h99.552v-49.792h99.552v-199.136z m99.552 49.792H512v99.584h-49.792z m149.344-49.792v199.136h99.552v-149.376h49.792v149.344h49.792v-149.344h49.792v149.344h49.792v-199.104z",
2430
2434
  fill: "#CB3837"
2431
2435
  }));
@@ -2436,37 +2440,37 @@ function IconNpm({ size = 16 }) {
2436
2440
  * @returns 一枚 `aria-hidden` 的 svg。
2437
2441
  */
2438
2442
  function IconModuleMark({ size = 16 }) {
2439
- return h$67(Shell, {
2443
+ return h$71(Shell, {
2440
2444
  size,
2441
2445
  viewBox: "0 0 24 24"
2442
- }, h$67("defs", null, h$67("linearGradient", {
2446
+ }, h$71("defs", null, h$71("linearGradient", {
2443
2447
  id: "workbench-module-mark",
2444
2448
  x1: "0%",
2445
2449
  y1: "0%",
2446
2450
  x2: "100%",
2447
2451
  y2: "100%"
2448
- }, h$67("stop", {
2452
+ }, h$71("stop", {
2449
2453
  offset: "0%",
2450
2454
  stopColor: "#3b82f6"
2451
- }), h$67("stop", {
2455
+ }), h$71("stop", {
2452
2456
  offset: "55%",
2453
2457
  stopColor: "#8b5cf6"
2454
- }), h$67("stop", {
2458
+ }), h$71("stop", {
2455
2459
  offset: "100%",
2456
2460
  stopColor: "#14b8a6"
2457
- }))), h$67("rect", {
2461
+ }))), h$71("rect", {
2458
2462
  width: 24,
2459
2463
  height: 24,
2460
2464
  rx: 7,
2461
2465
  fill: "url(#workbench-module-mark)"
2462
- }), h$67("rect", {
2466
+ }), h$71("rect", {
2463
2467
  x: "4.6",
2464
2468
  y: "4.6",
2465
2469
  width: "6.2",
2466
2470
  height: "6.2",
2467
2471
  rx: "1.9",
2468
2472
  fill: "#ffffff"
2469
- }), h$67("rect", {
2473
+ }), h$71("rect", {
2470
2474
  x: "13.2",
2471
2475
  y: "4.6",
2472
2476
  width: "6.2",
@@ -2474,7 +2478,7 @@ function IconModuleMark({ size = 16 }) {
2474
2478
  rx: "1.9",
2475
2479
  fill: "#ffffff",
2476
2480
  fillOpacity: .78
2477
- }), h$67("rect", {
2481
+ }), h$71("rect", {
2478
2482
  x: "4.6",
2479
2483
  y: "13.2",
2480
2484
  width: "6.2",
@@ -2482,7 +2486,7 @@ function IconModuleMark({ size = 16 }) {
2482
2486
  rx: "1.9",
2483
2487
  fill: "#ffffff",
2484
2488
  fillOpacity: .78
2485
- }), h$67("rect", {
2489
+ }), h$71("rect", {
2486
2490
  x: "13.2",
2487
2491
  y: "13.2",
2488
2492
  width: "6.2",
@@ -2497,7 +2501,7 @@ function IconModuleMark({ size = 16 }) {
2497
2501
  * @returns 一枚 `aria-hidden` 的 svg。
2498
2502
  */
2499
2503
  function IconPanelScreen({ size = 16 }) {
2500
- return h$67("svg", {
2504
+ return h$71("svg", {
2501
2505
  width: size,
2502
2506
  height: size,
2503
2507
  viewBox: "0 0 1024 1024",
@@ -2508,7 +2512,7 @@ function IconPanelScreen({ size = 16 }) {
2508
2512
  display: "block",
2509
2513
  overflow: "hidden"
2510
2514
  }
2511
- }, h$67("path", { d: "M939 112c17.673 0 32 14.327 32 32v554.667c0 17.673-14.327 32-32 32l-394.5-0.001v96c0 3.74-0.642 7.331-1.82 10.668H768.4c17.673 0 32 14.326 32 32 0 17.496-14.042 31.712-31.47 31.995l-0.53 0.004H256.6c-17.673 0-32-14.327-32-32 0-17.496 14.042-31.713 31.47-31.995l0.53-0.005h225.721a31.923 31.923 0 0 1-1.817-10.137l-0.004-0.53v-96H86c-17.496 0-31.713-14.041-31.996-31.47l-0.004-0.53V144c0-17.673 14.327-32 32-32z m-32 64H118v490.666h789V176zM341.9 432c17.496 0 31.713 14.042 31.996 31.47l0.004 0.53v85.333c0 17.673-14.327 32-32 32-17.496 0-31.713-14.041-31.996-31.47l-0.004-0.53V464c0-17.673 14.327-32 32-32z m170.6-85.333c17.496 0 31.713 14.041 31.996 31.47l0.004 0.53v170.666c0 17.673-14.327 32-32 32-17.496 0-31.713-14.041-31.996-31.47l-0.004-0.53V378.667c0-17.673 14.327-32 32-32z m170.6-85.334c17.496 0 31.713 14.042 31.996 31.471l0.004 0.53v256c0 17.672-14.327 32-32 32-17.496 0-31.713-14.042-31.996-31.471l-0.004-0.53v-256c0-17.673 14.327-32 32-32z" }));
2515
+ }, h$71("path", { d: "M939 112c17.673 0 32 14.327 32 32v554.667c0 17.673-14.327 32-32 32l-394.5-0.001v96c0 3.74-0.642 7.331-1.82 10.668H768.4c17.673 0 32 14.326 32 32 0 17.496-14.042 31.712-31.47 31.995l-0.53 0.004H256.6c-17.673 0-32-14.327-32-32 0-17.496 14.042-31.713 31.47-31.995l0.53-0.005h225.721a31.923 31.923 0 0 1-1.817-10.137l-0.004-0.53v-96H86c-17.496 0-31.713-14.041-31.996-31.47l-0.004-0.53V144c0-17.673 14.327-32 32-32z m-32 64H118v490.666h789V176zM341.9 432c17.496 0 31.713 14.042 31.996 31.47l0.004 0.53v85.333c0 17.673-14.327 32-32 32-17.496 0-31.713-14.041-31.996-31.47l-0.004-0.53V464c0-17.673 14.327-32 32-32z m170.6-85.333c17.496 0 31.713 14.041 31.996 31.47l0.004 0.53v170.666c0 17.673-14.327 32-32 32-17.496 0-31.713-14.041-31.996-31.47l-0.004-0.53V378.667c0-17.673 14.327-32 32-32z m170.6-85.334c17.496 0 31.713 14.042 31.996 31.471l0.004 0.53v256c0 17.672-14.327 32-32 32-17.496 0-31.713-14.042-31.996-31.471l-0.004-0.53v-256c0-17.673 14.327-32 32-32z" }));
2512
2516
  }
2513
2517
  //#endregion
2514
2518
  //#region ../shared/dist/config/storage.js
@@ -2527,6 +2531,12 @@ function writeText(key, value) {
2527
2531
  else window.localStorage.setItem(key, value);
2528
2532
  } catch {}
2529
2533
  }
2534
+ //#endregion
2535
+ //#region ../shared/dist/contract/approval.js
2536
+ /**
2537
+ * agent 自己那句"这次想干什么"的参数名:插件命令族必填,审批屏把它画在详情座里,不进标题。
2538
+ */
2539
+ var APPROVAL_NOTE_ARG = "approval_note";
2530
2540
  /**
2531
2541
  * 判一个名字是不是范围查法,不是问这条事实存不存在。
2532
2542
  * @param name 事实名或范围名。
@@ -2750,9 +2760,13 @@ function supplyNeedsOf(manifest) {
2750
2760
  }
2751
2761
  //#endregion
2752
2762
  //#region ../shared/dist/contract/needs.js
2763
+ var REGISTRY_PATTERN = /^(?:https?|file):\/\//;
2753
2764
  function text(value) {
2754
2765
  return typeof value === "string" ? value.trim() : "";
2755
2766
  }
2767
+ function isRecord(value) {
2768
+ return typeof value === "object" && value !== null && !Array.isArray(value);
2769
+ }
2756
2770
  /**
2757
2771
  * 一条 need 的稳定标识:作者写 `id` 就用它,否则 `kind:name`。
2758
2772
  * @param need 一条 need。
@@ -2761,11 +2775,40 @@ function text(value) {
2761
2775
  function needIdOf(need) {
2762
2776
  return need.id === void 0 || need.id.trim() === "" ? `${need.kind}:${need.name}` : need.id;
2763
2777
  }
2778
+ function binInstallProblemsOf(raw, at) {
2779
+ if (raw === void 0) return [];
2780
+ if (!isRecord(raw)) return [`${at}.install 要是对象`];
2781
+ const errors = [];
2782
+ for (const key of Object.keys(raw)) if (![
2783
+ "kind",
2784
+ "line",
2785
+ "platforms",
2786
+ "package",
2787
+ "registryEnv",
2788
+ "registryDefault"
2789
+ ].includes(key)) errors.push(`${at}.install 有不认识的字段 ${key}`);
2790
+ const kind = text(raw["kind"]);
2791
+ if (kind !== "command" && kind !== "npm") errors.push(`${at}.install.kind 只认 command(一条命令)或 npm(一个包,装进隔离运行时)`);
2792
+ if (kind === "command" && text(raw["line"]) === "") errors.push(`${at}.install.line 没写 —— 要一条能直接粘进终端的命令`);
2793
+ if (kind === "npm" && text(raw["package"]) === "") errors.push(`${at}.install.package 没写 —— 这个命令由哪个 npm 包提供`);
2794
+ if (raw["registryDefault"] !== void 0 && !REGISTRY_PATTERN.test(text(raw["registryDefault"]))) errors.push(`${at}.install.registryDefault 要是 http(s):// 或 file:// 的源地址`);
2795
+ if (raw["platforms"] !== void 0) {
2796
+ if (!Array.isArray(raw["platforms"]) || raw["platforms"].length === 0) errors.push(`${at}.install.platforms 要是非空数组`);
2797
+ else if (raw["platforms"].some((one) => ![
2798
+ "darwin",
2799
+ "linux",
2800
+ "win32"
2801
+ ].includes(text(one)))) errors.push(`${at}.install.platforms 只认 darwin / linux / win32`);
2802
+ }
2803
+ return errors;
2804
+ }
2764
2805
  function perKindProblemsOf(kind, raw, at) {
2765
2806
  const errors = [];
2766
2807
  if (kind === "bin" || kind === "lib" || kind === "env") {
2767
2808
  if (text(raw["name"]) === "") errors.push(`${at}.name 没写`);
2768
2809
  }
2810
+ if (kind === "bin") errors.push(...binInstallProblemsOf(raw["install"], at));
2811
+ if (raw["docs"] !== void 0 && text(raw["docs"]) === "") errors.push(`${at}.docs 是空串`);
2769
2812
  if (kind === "extension") {
2770
2813
  if (text(raw["runtime"]) === "") errors.push(`${at}.runtime 没写 —— 扩展属于哪个运行时(如 opencli)`);
2771
2814
  if (text(raw["name"]) === "") errors.push(`${at}.name 没写`);
@@ -3079,11 +3122,14 @@ var en = {
3079
3122
  "panels.market.update": "Update",
3080
3123
  "panels.market.swapSlow": "Not swapped yet — maybe a slow or failed download. Press Update again; if it stays like this, restart dsh.",
3081
3124
  "panels.market.removeSlow": "Not removed yet — maybe a slow network or an uninstall that did not finish. Check again in a moment; if it stays like this, restart dsh.",
3082
- "panels.market.updateNoChange": "Update failed: still {from}. The newest on the registry is {latest} — press Update again.",
3125
+ "panels.market.updateNoChange": "Update did not swap in: still {from}; the registry has {latest}.",
3083
3126
  "panels.market.updateUnknownVersion": "(unknown)",
3084
3127
  "panels.market.updateGone": "Update failed: the module is gone after the update.",
3085
3128
  "panels.market.updateRestored": "Update failed: the new version could not be found after the update, so {version} was put back.",
3086
- "panels.market.updateBehind": "Installed {installed}, but the newest on the registry is {latest} — not the latest; you can update once more.",
3129
+ "panels.market.updateBehind": "Installed {installed}, but the registry has {latest}.",
3130
+ "panels.market.updateStuck.title": "Update did not swap in",
3131
+ "panels.market.updateStuck.factNoChange": "Still {from} on disk; the registry has {latest}.",
3132
+ "panels.market.updateStuck.copiedHint": "Paste it into a terminal, then restart the workbench once.",
3087
3133
  "panels.market.selfUpdateFailed": "Workbench update failed: {reason}",
3088
3134
  "panels.market.selfUpdateUnknown": "the outside process left no reason (see ~/.dsh/workbench/self-update.log)",
3089
3135
  "panels.market.selfUpdateRolledBack": "Workbench update failed; rolled back to {version}.",
@@ -3099,6 +3145,40 @@ var en = {
3099
3145
  "panels.market.confirmNo": "Cancel",
3100
3146
  "panels.market.noMarketSource": "The index has no newer version of this module (refresh the index and retry)",
3101
3147
  "panels.market.failed": "Failed: {reason}",
3148
+ "panels.market.askAgent": "Ask the agent",
3149
+ "panels.market.askAgentCopied": "Copied",
3150
+ "panels.market.askAgentText": "This workbench module cannot be used: \"{name}\" (unit {unit}) — {reason}. Work out what is missing and how to add it, then confirm it works.",
3151
+ "panels.market.failure.permission": "Didn't install: no write access",
3152
+ "panels.market.failure.diskFull": "Didn't install: the disk is full",
3153
+ "panels.market.failure.sandbox": "Didn't install: the system blocked it",
3154
+ "panels.market.failure.unknown": "Didn't install: cause not recognised",
3155
+ "panels.market.failure.factOwner": "{path} belongs to {owner}, and this account ({me}) cannot write to it. Hand it back to yourself (asks for your login password).",
3156
+ "panels.market.failure.factMode": "{path} is mode {mode}, so this account cannot write to it.",
3157
+ "panels.market.failure.factSpace": "The disk holding {path} is full.",
3158
+ "panels.market.failure.factStuck": "This command ran in a restricted environment and cannot write to {path}.",
3159
+ "panels.market.failure.nowhere": "(the directory was not identified)",
3160
+ "panels.market.failure.copyFix": "Copy the fix command",
3161
+ "panels.market.failure.copied": "Copied",
3162
+ "panels.market.failure.copiedHint": "Paste it in a terminal, run it, then click Check again.",
3163
+ "panels.market.failure.askAgent": "Copy for the agent",
3164
+ "panels.market.failure.askAgentText": "Installing this module could not write: `{command}` exited {code} at {path}. Work out whether the sandbox or file permissions blocked it, then install again somewhere writable.",
3165
+ "panels.market.failure.askAgentHint": "Paste it into the chat and let the agent carry on.",
3166
+ "panels.market.failure.recheck": "Check again",
3167
+ "panels.market.failure.showOutput": "Show install output",
3168
+ "panels.market.failure.hideOutput": "Hide install output",
3169
+ "panels.market.failure.term.commandLine": "command on line {line}",
3170
+ "panels.market.failure.term.signal": "killed by {signal}",
3171
+ "panels.market.failure.term.exitCode": "exit code {exitCode}",
3172
+ "panels.market.failure.term.noExitCode": "no exit code",
3173
+ "panels.market.failure.term.running": "running",
3174
+ "panels.market.failure.term.failed": "failed",
3175
+ "panels.market.failure.term.done": "done",
3176
+ "panels.market.failure.term.copy": "Copy",
3177
+ "panels.market.failure.term.copied": "Copied",
3178
+ "panels.market.failure.term.noOutput": "No output",
3179
+ "panels.market.failure.term.collapse": "Collapse",
3180
+ "panels.market.failure.term.expandAria": "Show the remaining {hidden} lines",
3181
+ "panels.market.failure.term.expand": "Show {hidden} lines",
3102
3182
  "panels.market.needEnv": "Set {env} in the terminal that started the workbench first",
3103
3183
  "panels.market.needCommands": "Missing commands: {commands}",
3104
3184
  "panels.market.needBinary": "Install the {command} command first",
@@ -3135,9 +3215,13 @@ var en = {
3135
3215
  "panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
3136
3216
  "panels.market.foot": "After installing, enable it in the panel page of that project.",
3137
3217
  "panels.market.checkUpdates": "Check for updates",
3218
+ "panels.market.checkAll": "Check all updates",
3138
3219
  "panels.market.checkingNow": "Checking…",
3139
3220
  "panels.market.checkFailed": "The last check failed. Check your connection and retry.",
3140
3221
  "panels.market.checkedAt": "Last checked: {time}",
3222
+ "panels.market.latestPartial": "Could not check {n} modules",
3223
+ "panels.market.latestNoRegistry": "No source configured — the latest version was not checked",
3224
+ "panels.market.latestProbeFailed": "Could not reach the source — try again later",
3141
3225
  "panels.market.justNow": "just now",
3142
3226
  "panels.market.minutesAgo": "{n} min ago",
3143
3227
  "panels.market.hoursAgo": "{n} h ago",
@@ -3196,6 +3280,8 @@ var en = {
3196
3280
  "panels.market.add.failurePermission": "No write permission, cannot install",
3197
3281
  "panels.market.add.failureBuildBlocked": "A dependency wants to run install scripts; you have to allow it first",
3198
3282
  "panels.market.add.failureIntegrity": "The downloaded package failed its integrity check",
3283
+ "panels.market.add.failureStopProfile": "The old copy is still in use (the workbench has this module loaded), so this dsh version will not overwrite it in place.",
3284
+ "panels.market.add.failureCancelled": "This run was cancelled and nothing changed.",
3199
3285
  "panels.market.add.failureTimeout": "The install timed out",
3200
3286
  "panels.market.add.failurePnpmMissing": "pnpm was not found, cannot install",
3201
3287
  "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.",
@@ -3279,7 +3365,7 @@ var en = {
3279
3365
  "panels.discover.missingIndex": "This repository has no {path} yet.",
3280
3366
  "panels.discover.initTitle": "Initialize this repository as a module market index?",
3281
3367
  "panels.discover.initCta": "Initialize market index",
3282
- "panels.discover.initWhat": "It will write market.json and README.md on {branch}, commit once, and push. Modules you publish from this workbench will commit their build files under packages/<package-name>/. The repository stays owned by its owner.",
3368
+ "panels.discover.initWhat": "It will write the index directory market/ and README.md on {branch}, commit once, and push. Modules you publish from this workbench will commit their build files under artifacts/<package-name>/<version>/ and their entry under market/<package-name>/<version>.json. The repository stays owned by its owner.",
3283
3369
  "panels.discover.initBranch": "Branch",
3284
3370
  "panels.discover.initBranchHint": "The index and build files go to this branch; an empty repository gets it created.",
3285
3371
  "panels.discover.initBranchBad": "Use only letters, digits, dots, underscores, slashes, or dashes in a branch name.",
@@ -3602,6 +3688,9 @@ var en = {
3602
3688
  "approval.record.noSwitch": "it will not switch you back (the leftbar footer shows the state)",
3603
3689
  "approval.longTask.what": "Task to stop",
3604
3690
  "approval.longTask.signal": "stopping only sends an interrupt signal — wrapping up the run is up to the module",
3691
+ "approval.plugin.name": "Plugin",
3692
+ "approval.plugin.command": "Command",
3693
+ "approval.plugin.note": "Agent says",
3605
3694
  "approval.publish.module": "Module",
3606
3695
  "approval.publish.target": "Target",
3607
3696
  "approval.publish.version": "Version",
@@ -3621,7 +3710,7 @@ var en = {
3621
3710
  "approval.publish.artifacts": "Build files",
3622
3711
  "approval.publish.index": "Index",
3623
3712
  "approval.publish.commits": "Commits",
3624
- "approval.publish.twoCommits": "build files + market.json in 2 commits, one push",
3713
+ "approval.publish.twoCommits": "build files + entry file in 2 commits, one push",
3625
3714
  "approval.publish.reading": "Reading…",
3626
3715
  "approval.publish.changelog": "Changelog for {version}",
3627
3716
  "approval.publish.changelogPending": "This release writes the {version} changelog entry",
@@ -3779,11 +3868,14 @@ var dictionaries = {
3779
3868
  "panels.market.update": "更新",
3780
3869
  "panels.market.swapSlow": "还没换上:可能网慢或没装上。再点一次「更新」;一直这样就把 dsh 重启一遍。",
3781
3870
  "panels.market.removeSlow": "还没卸掉:可能网慢或卸载没走完。等一下再看;一直这样就把 dsh 重启一遍。",
3782
- "panels.market.updateNoChange": "更新失败:还是 {from};源上最新是 {latest},可以再点一次「更新」。",
3871
+ "panels.market.updateNoChange": "更新没换上:还是 {from};源上最新是 {latest}。",
3783
3872
  "panels.market.updateUnknownVersion": "(问不到)",
3784
3873
  "panels.market.updateGone": "更新失败:更新后找不到这个模块。",
3785
3874
  "panels.market.updateRestored": "更新失败:更新后找不到新版本,已把 {version} 装回去。",
3786
- "panels.market.updateBehind": "装上了 {installed},但源上最新是 {latest} —— 没更到最新,可以再点一次。",
3875
+ "panels.market.updateBehind": "装上了 {installed},但源上最新是 {latest}。",
3876
+ "panels.market.updateStuck.title": "更新没换上",
3877
+ "panels.market.updateStuck.factNoChange": "盘上还是 {from};源上最新是 {latest}。",
3878
+ "panels.market.updateStuck.copiedHint": "粘到终端跑一次,跑完重启一次工作台。",
3787
3879
  "panels.market.selfUpdateFailed": "工作台更新失败:{reason}",
3788
3880
  "panels.market.selfUpdateUnknown": "外部进程没留下原因(看 ~/.dsh/workbench/self-update.log)",
3789
3881
  "panels.market.selfUpdateRolledBack": "工作台更新失败,已回滚到 {version}。",
@@ -3799,6 +3891,40 @@ var dictionaries = {
3799
3891
  "panels.market.confirmNo": "取消",
3800
3892
  "panels.market.noMarketSource": "索引里没有这个模块的新版本(刷新一次索引再试)",
3801
3893
  "panels.market.failed": "没成功:{reason}",
3894
+ "panels.market.askAgent": "问 agent",
3895
+ "panels.market.askAgentCopied": "已复制",
3896
+ "panels.market.askAgentText": "工作台里「{name}」(单元 {unit})用不了:{reason}。帮我查清缺什么、怎么补,补完确认真能用。",
3897
+ "panels.market.failure.permission": "没装上:没有写入权限",
3898
+ "panels.market.failure.diskFull": "没装上:磁盘满了",
3899
+ "panels.market.failure.sandbox": "没装上:被系统拦住了",
3900
+ "panels.market.failure.unknown": "没装上:原因没认出来",
3901
+ "panels.market.failure.factOwner": "{path} 属于 {owner},当前账号({me})写不进去。把它还给自己就行(会要开机密码)。",
3902
+ "panels.market.failure.factMode": "{path} 的权限是 {mode},当前账号没有写权限。",
3903
+ "panels.market.failure.factSpace": "{path} 所在的磁盘满了。",
3904
+ "panels.market.failure.factStuck": "这条命令跑在受限环境里,写不进 {path}。",
3905
+ "panels.market.failure.nowhere": "(没认出是哪个目录)",
3906
+ "panels.market.failure.copyFix": "复制修复命令",
3907
+ "panels.market.failure.copied": "已复制",
3908
+ "panels.market.failure.copiedHint": "粘到终端跑一次,回来点「再检测」。",
3909
+ "panels.market.failure.askAgent": "复制给 agent",
3910
+ "panels.market.failure.askAgentText": "装这个模块时写不进去:`{command}` 退出码 {code},卡在 {path}。帮我看看是被沙箱拦的还是权限问题,换一条能写进去的路再装。",
3911
+ "panels.market.failure.askAgentHint": "粘到对话里,让 agent 接着弄。",
3912
+ "panels.market.failure.recheck": "再检测",
3913
+ "panels.market.failure.showOutput": "查看安装输出",
3914
+ "panels.market.failure.hideOutput": "收起安装输出",
3915
+ "panels.market.failure.term.commandLine": "第 {line} 行的命令",
3916
+ "panels.market.failure.term.signal": "被 {signal} 终止",
3917
+ "panels.market.failure.term.exitCode": "退出码 {exitCode}",
3918
+ "panels.market.failure.term.noExitCode": "没有退出码",
3919
+ "panels.market.failure.term.running": "在跑",
3920
+ "panels.market.failure.term.failed": "没跑通",
3921
+ "panels.market.failure.term.done": "跑完了",
3922
+ "panels.market.failure.term.copy": "复制",
3923
+ "panels.market.failure.term.copied": "已复制",
3924
+ "panels.market.failure.term.noOutput": "没有输出",
3925
+ "panels.market.failure.term.collapse": "收起",
3926
+ "panels.market.failure.term.expandAria": "展开剩下的 {hidden} 行",
3927
+ "panels.market.failure.term.expand": "展开 {hidden} 行",
3802
3928
  "panels.market.needEnv": "先在启动工作台的终端里设 {env}",
3803
3929
  "panels.market.needCommands": "缺这几条命令:{commands}",
3804
3930
  "panels.market.needBinary": "先装 {command} 命令",
@@ -3835,9 +3961,13 @@ var dictionaries = {
3835
3961
  "panels.market.restartNeeded": "新版装好了,重启一次才生效。",
3836
3962
  "panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
3837
3963
  "panels.market.checkUpdates": "检查更新",
3964
+ "panels.market.checkAll": "检查全部更新",
3838
3965
  "panels.market.checkingNow": "正在检查…",
3839
3966
  "panels.market.checkFailed": "最近一次没查到,检查网络后重试",
3840
3967
  "panels.market.checkedAt": "最近检查:{time}",
3968
+ "panels.market.latestPartial": "{n} 个模块没查成",
3969
+ "panels.market.latestNoRegistry": "没配来源,未检查新版",
3970
+ "panels.market.latestProbeFailed": "问不到源,稍后重试",
3841
3971
  "panels.market.justNow": "刚刚",
3842
3972
  "panels.market.minutesAgo": "{n} 分钟前",
3843
3973
  "panels.market.hoursAgo": "{n} 小时前",
@@ -3896,6 +4026,8 @@ var dictionaries = {
3896
4026
  "panels.market.add.failurePermission": "没有写入权限,无法安装",
3897
4027
  "panels.market.add.failureBuildBlocked": "有依赖的安装脚本需要你允许后才能继续",
3898
4028
  "panels.market.add.failureIntegrity": "下载的安装包校验失败",
4029
+ "panels.market.add.failureStopProfile": "旧版还在用着(工作台正加载这个模块),这一版 dsh 不肯就地覆盖。",
4030
+ "panels.market.add.failureCancelled": "这次操作被取消了,什么都没动。",
3899
4031
  "panels.market.add.failureTimeout": "安装超时",
3900
4032
  "panels.market.add.failurePnpmMissing": "没有找到 pnpm,无法安装",
3901
4033
  "panels.market.add.failureInstalled": "它已经装在这份工作台里了。同一个包不能就地覆盖,得先卸载再装;这次卸载也没成功。",
@@ -3979,7 +4111,7 @@ var dictionaries = {
3979
4111
  "panels.discover.missingIndex": "仓库里还没有索引文件 {path}",
3980
4112
  "panels.discover.initTitle": "把这个仓库初始化成模块市场索引?",
3981
4113
  "panels.discover.initCta": "初始化成市场索引",
3982
- "panels.discover.initWhat": "会在 {branch} 分支写 market.json 与 README.md,提交一次并推上去;之后从这个工作台发布的模块会把打包好的文件提交到按包名分的 packages/<包名>/。仓库的写权限归它的所有者。",
4114
+ "panels.discover.initWhat": "会在 {branch} 分支写索引目录 market/ 与 README.md,提交一次并推上去;之后从这个工作台发布的模块会把打包好的文件提交到 artifacts/<包名>/<版本>/,条目写到 market/<包名>/<版本>.json。仓库的写权限归它的所有者。",
3983
4115
  "panels.discover.initBranch": "分支",
3984
4116
  "panels.discover.initBranchHint": "索引和打包文件都发到这个分支;空仓库会新建它。",
3985
4117
  "panels.discover.initBranchBad": "分支名只能用字母、数字、点、下划线、斜杠或短横线",
@@ -4302,6 +4434,9 @@ var dictionaries = {
4302
4434
  "approval.record.noSwitch": "录完不会替你切回来(左栏底部会亮一条状态)",
4303
4435
  "approval.longTask.what": "要停的那次任务",
4304
4436
  "approval.longTask.signal": "停了只是让工作台发出中断信号 —— 这次任务怎么收尾由模块自己负责",
4437
+ "approval.plugin.name": "插件",
4438
+ "approval.plugin.command": "命令",
4439
+ "approval.plugin.note": "agent 说",
4305
4440
  "approval.publish.module": "模块",
4306
4441
  "approval.publish.target": "目标",
4307
4442
  "approval.publish.version": "版本",
@@ -4321,7 +4456,7 @@ var dictionaries = {
4321
4456
  "approval.publish.artifacts": "打包文件",
4322
4457
  "approval.publish.index": "索引",
4323
4458
  "approval.publish.commits": "提交",
4324
- "approval.publish.twoCommits": "打包文件 + market.json 两次提交,一次推送",
4459
+ "approval.publish.twoCommits": "打包文件 + 条目文件两次提交,一次推送",
4325
4460
  "approval.publish.reading": "读取中…",
4326
4461
  "approval.publish.changelog": "{version} 的更新日志",
4327
4462
  "approval.publish.changelogPending": "{version} 这一版会写进更新日志,随包发布",
@@ -4673,6 +4808,33 @@ function IconModules({ size = 16 }) {
4673
4808
  }));
4674
4809
  }
4675
4810
  //#endregion
4811
+ //#region src/shared/api/unit-board.ts
4812
+ function gateOf(capability, mode) {
4813
+ if (mode === "none") return { gated: true };
4814
+ if (capability === null) return { gated: true };
4815
+ return { gated: capability.status === "ok" || capability.status === "unchecked" };
4816
+ }
4817
+ function splitBlocker(candidates) {
4818
+ let blocker;
4819
+ let notice;
4820
+ for (const candidate of candidates) {
4821
+ if (candidate === void 0) continue;
4822
+ if (candidate.severity === "block") {
4823
+ blocker ??= candidate;
4824
+ continue;
4825
+ }
4826
+ notice ??= candidate;
4827
+ }
4828
+ return {
4829
+ ...blocker === void 0 ? {} : { blocker },
4830
+ ...blocker !== void 0 || notice === void 0 ? {} : { notice }
4831
+ };
4832
+ }
4833
+ function probeKeyOf(error) {
4834
+ if (error === void 0) return null;
4835
+ return error.code === "" ? "unknown" : error.code;
4836
+ }
4837
+ //#endregion
4676
4838
  //#region src/shared/hooks/fact-transports.ts
4677
4839
  function sseTransport(options) {
4678
4840
  return { start({ onFrame, cursor, onMode }) {
@@ -4825,14 +4987,14 @@ function bumpCapabilityEpoch() {
4825
4987
  epoch$1 += 1;
4826
4988
  }
4827
4989
  var current$1 = null;
4828
- var listeners$7 = /* @__PURE__ */ new Set();
4990
+ var listeners$8 = /* @__PURE__ */ new Set();
4829
4991
  function capabilityValue() {
4830
4992
  return current$1;
4831
4993
  }
4832
4994
  function subscribeCapabilities(listener) {
4833
- listeners$7.add(listener);
4995
+ listeners$8.add(listener);
4834
4996
  return () => {
4835
- listeners$7.delete(listener);
4997
+ listeners$8.delete(listener);
4836
4998
  };
4837
4999
  }
4838
5000
  function setCapabilities(next, rechecked = false) {
@@ -4845,7 +5007,7 @@ function setCapabilities(next, rechecked = false) {
4845
5007
  });
4846
5008
  if (next === current$1) return;
4847
5009
  current$1 = next;
4848
- for (const listener of [...listeners$7]) listener();
5010
+ for (const listener of [...listeners$8]) listener();
4849
5011
  }
4850
5012
  function beginProbe() {
4851
5013
  probing += 1;
@@ -4891,12 +5053,12 @@ function shareCapabilityFetch(force, load) {
4891
5053
  };
4892
5054
  return promise;
4893
5055
  }
4894
- var readSeq$1 = 0;
5056
+ var readSeq = 0;
4895
5057
  var newestForceSeq$1 = -1;
4896
5058
  function runCapabilityRead(options) {
4897
5059
  const { force, silent = false, load = fetchAll } = options;
4898
5060
  const at = epoch$1;
4899
- const seq = readSeq$1 += 1;
5061
+ const seq = readSeq += 1;
4900
5062
  if (force) newestForceSeq$1 = seq;
4901
5063
  const shown = force && !silent;
4902
5064
  if (shown) beginProbe();
@@ -4932,33 +5094,6 @@ function useCapabilityProbe() {
4932
5094
  return (0, react.useSyncExternalStore)(subscribeProbe, probeValue);
4933
5095
  }
4934
5096
  //#endregion
4935
- //#region src/shared/api/unit-board.ts
4936
- function gateOf(capability, mode) {
4937
- if (mode === "none") return { gated: true };
4938
- if (capability === null) return { gated: true };
4939
- return { gated: capability.status === "ok" || capability.status === "unchecked" };
4940
- }
4941
- function splitBlocker(candidates) {
4942
- let blocker;
4943
- let notice;
4944
- for (const candidate of candidates) {
4945
- if (candidate === void 0) continue;
4946
- if (candidate.severity === "block") {
4947
- blocker ??= candidate;
4948
- continue;
4949
- }
4950
- notice ??= candidate;
4951
- }
4952
- return {
4953
- ...blocker === void 0 ? {} : { blocker },
4954
- ...blocker !== void 0 || notice === void 0 ? {} : { notice }
4955
- };
4956
- }
4957
- function probeKeyOf(error) {
4958
- if (error === void 0) return null;
4959
- return error.code === "" ? "unknown" : error.code;
4960
- }
4961
- //#endregion
4962
5097
  //#region src/shared/hooks/use-capability-gate.ts
4963
5098
  var use_capability_gate_exports = /* @__PURE__ */ __exportAll({
4964
5099
  useCapabilityGate: () => useCapabilityGate,
@@ -5000,7 +5135,7 @@ function useCapabilityMap(refreshToken) {
5000
5135
  //#endregion
5001
5136
  //#region src/app/layouts/panel-hint.ts
5002
5137
  var hints = /* @__PURE__ */ new Map();
5003
- var listeners$6 = /* @__PURE__ */ new Set();
5138
+ var listeners$7 = /* @__PURE__ */ new Set();
5004
5139
  function sameHint(left, right) {
5005
5140
  if (left === null || right === null) return left === right;
5006
5141
  if (left.labelKey !== right.labelKey || left.tone !== right.tone) return false;
@@ -5012,15 +5147,15 @@ function publishPanelHint(id, hint) {
5012
5147
  if (sameHint(hints.get(id) ?? null, hint)) return;
5013
5148
  if (hint === null) hints.delete(id);
5014
5149
  else hints.set(id, hint);
5015
- for (const listener of [...listeners$6]) listener();
5150
+ for (const listener of [...listeners$7]) listener();
5016
5151
  }
5017
5152
  function panelHintOf(id) {
5018
5153
  return id === null ? null : hints.get(id) ?? null;
5019
5154
  }
5020
5155
  function subscribePanelHints(listener) {
5021
- listeners$6.add(listener);
5156
+ listeners$7.add(listener);
5022
5157
  return () => {
5023
- listeners$6.delete(listener);
5158
+ listeners$7.delete(listener);
5024
5159
  };
5025
5160
  }
5026
5161
  function usePanelHint(id) {
@@ -5188,6 +5323,29 @@ function installedIdSet(installed) {
5188
5323
  if (installed === void 0) return null;
5189
5324
  return new Set(installed.map((item) => item.unit));
5190
5325
  }
5326
+ function latestUnavailableNote(unavailable) {
5327
+ if (unavailable === "no-registry") return {
5328
+ key: "panels.market.latestNoRegistry",
5329
+ params: {}
5330
+ };
5331
+ if (unavailable === "probe-failed") return {
5332
+ key: "panels.market.latestProbeFailed",
5333
+ params: {}
5334
+ };
5335
+ }
5336
+ function latestCheckSummary(modules) {
5337
+ let checked = 0;
5338
+ let unknown = 0;
5339
+ for (const module of modules ?? []) if (module.latest !== void 0) checked += 1;
5340
+ else if (module.latestUnavailable === "no-registry" || module.latestUnavailable === "probe-failed") unknown += 1;
5341
+ return {
5342
+ checked,
5343
+ unknown
5344
+ };
5345
+ }
5346
+ function checkedPluginCount(plugins) {
5347
+ return (plugins ?? []).filter((plugin) => plugin.latest !== void 0).length;
5348
+ }
5191
5349
  function installedRows(modules, manifests, listed, names, defaults = /* @__PURE__ */ new Set(), changed = {}) {
5192
5350
  const titles = new Map(manifests.map((manifest) => [manifest.id, manifest.titleKey]));
5193
5351
  const rows = [];
@@ -5201,16 +5359,17 @@ function installedRows(modules, manifests, listed, names, defaults = /* @__PURE_
5201
5359
  const pending = !loaded && refused.length === 0;
5202
5360
  const titleKey = titles.get(module.unit);
5203
5361
  const remembered = titleKey === void 0 ? names?.get(module.unit) : void 0;
5362
+ const note = refused.length > 0 ? {
5363
+ key: "panels.market.moduleRefused",
5364
+ params: {}
5365
+ } : latestUnavailableNote(module.latestUnavailable);
5204
5366
  rows.push({
5205
5367
  id: module.unit,
5206
5368
  titleKey: titleKey ?? module.unit,
5207
5369
  ...remembered === void 0 ? {} : { label: remembered },
5208
5370
  state: outdated ? "outdated" : refused.length > 0 ? "unusable" : pending ? "inactive" : "installed",
5209
5371
  ...pending ? { hint: "panels.market.moduleRestartHint" } : blocked === void 0 ? {} : { hint: updateBlockHintOf(blocked) },
5210
- ...refused.length === 0 ? {} : { note: {
5211
- key: "panels.market.moduleRefused",
5212
- params: {}
5213
- } },
5372
+ ...note === void 0 ? {} : { note },
5214
5373
  ...module.local === true ? { local: true } : {},
5215
5374
  pkg: module.pkg,
5216
5375
  canInstall: false,
@@ -5237,6 +5396,13 @@ var SWITCH_LOCKED = /* @__PURE__ */ new Set(["unusable", "broken"]);
5237
5396
  function marketSwitchLocked(row) {
5238
5397
  return SWITCH_LOCKED.has(row.state);
5239
5398
  }
5399
+ function marketAsksAgent(row) {
5400
+ if (row.workbench === true || row.plugin === true) return false;
5401
+ if (row.state === "installed" || row.state === "inactive" || row.state === "outdated") return false;
5402
+ if (row.state === "checking" || row.state === "pending-restart") return false;
5403
+ if (row.state === "pending-followup") return false;
5404
+ return !marketActions$1(row).includes("install");
5405
+ }
5240
5406
  function marketActions$1(row) {
5241
5407
  if (row.workbench === true) {
5242
5408
  if (row.followUp !== void 0 && row.state === "pending-followup") return row.followUp.hard ? ["migrate-workbench"] : ["migrate-workbench", "dismiss-followup"];
@@ -5359,6 +5525,18 @@ function marketSections(rows) {
5359
5525
  rows: rest
5360
5526
  }]];
5361
5527
  }
5528
+ function checkingRows(rows, scope) {
5529
+ return rows.map((row) => {
5530
+ if (row.state !== "unknown" && row.state !== "unchecked") return row;
5531
+ if (!scope.all && !scope.units.has(row.id)) return row;
5532
+ return {
5533
+ ...row,
5534
+ state: "checking",
5535
+ hint: void 0,
5536
+ note: void 0
5537
+ };
5538
+ });
5539
+ }
5362
5540
  function marketRows(manifests, capabilities, updates = {}, defaults = /* @__PURE__ */ new Set(), changed = {}) {
5363
5541
  const rows = [];
5364
5542
  for (const manifest of manifests) {
@@ -5487,8 +5665,9 @@ var UPDATES_KEY = "panels.market.hasNew";
5487
5665
  function isProblem(row) {
5488
5666
  return row.broken === true || row.state === "broken" || row.state === "unusable" || row.note?.key === "panels.market.moduleRefused";
5489
5667
  }
5490
- function isRestart(row) {
5491
- return row.state === "inactive" || row.state === "pending-restart";
5668
+ function isRestart(row, installing) {
5669
+ if (row.state === "pending-restart") return true;
5670
+ return !installing && row.state === "inactive";
5492
5671
  }
5493
5672
  function isUnknown(row, rosterRead) {
5494
5673
  return row.state === "unchecked" || rosterRead && row.state === "unknown";
@@ -5498,9 +5677,10 @@ function awaitsRestart(manifests, installed) {
5498
5677
  return installed.some((module) => !loaded.has(module.unit) && refusalReasons(module.refused, module.clientRefused).length === 0);
5499
5678
  }
5500
5679
  function marketHintOf(input) {
5501
- const busy = input.busy ?? /* @__PURE__ */ new Set();
5502
- const marketable = marketCatalog(input.manifests, input.installable).filter((manifest) => !busy.has(manifest.id));
5503
- const installed = (input.installed ?? []).filter((module) => !busy.has(module.unit));
5680
+ const installing = input.installing === true;
5681
+ const held = /* @__PURE__ */ new Set([...input.busy ?? [], ...input.applied ?? []]);
5682
+ const marketable = marketCatalog(input.manifests, input.installable).filter((manifest) => !held.has(manifest.id));
5683
+ const installed = (input.installed ?? []).filter((module) => !held.has(module.unit));
5504
5684
  const catalog = marketRows(marketable, input.capabilities, marketUpdatesOf(input.modules));
5505
5685
  const listed = new Set(catalog.map((row) => row.id));
5506
5686
  const self = workbenchRow(input.workbench);
@@ -5511,10 +5691,10 @@ function marketHintOf(input) {
5511
5691
  ...self === void 0 ? [] : [self]
5512
5692
  ];
5513
5693
  const problem = rows.some(isProblem);
5514
- const restart = rows.some(isRestart) || awaitsRestart(input.manifests, installed);
5694
+ const restart = rows.some((row) => isRestart(row, installing)) || !installing && awaitsRestart(input.manifests, installed);
5515
5695
  const followUp = rows.some((row) => row.state === "pending-followup");
5516
5696
  const rosterRead = input.modules !== null;
5517
- const unknown = rows.some((row) => isUnknown(row, rosterRead));
5697
+ const unknown = !installing && rows.some((row) => isUnknown(row, rosterRead));
5518
5698
  const updates = marketHasUpdates(rows, sharedRows(marketable, input.capabilities));
5519
5699
  const more = [];
5520
5700
  if (problem) {
@@ -5643,10 +5823,10 @@ function holdWindowMs(until) {
5643
5823
  }
5644
5824
  //#endregion
5645
5825
  //#region src/app/layouts/rightbar/market-busy.ts
5646
- var listeners$5 = /* @__PURE__ */ new Set();
5826
+ var listeners$6 = /* @__PURE__ */ new Set();
5647
5827
  var published = /* @__PURE__ */ new Map();
5648
5828
  var live$2 = /* @__PURE__ */ new Set();
5649
- var timer$2;
5829
+ var timer$3;
5650
5830
  var MARKET_BUSY_MS = WORKBENCH_SWAP_MS;
5651
5831
  function marketBusyIds() {
5652
5832
  return live$2;
@@ -5656,12 +5836,12 @@ function publishMarketBusy(ids) {
5656
5836
  const next = /* @__PURE__ */ new Map();
5657
5837
  for (const id of new Set(ids)) next.set(id, published.get(id) ?? now);
5658
5838
  published = next;
5659
- refresh(now);
5839
+ refresh$1(now);
5660
5840
  }
5661
5841
  function subscribeMarketBusy(listener) {
5662
- listeners$5.add(listener);
5842
+ listeners$6.add(listener);
5663
5843
  return () => {
5664
- listeners$5.delete(listener);
5844
+ listeners$6.delete(listener);
5665
5845
  };
5666
5846
  }
5667
5847
  function useMarketBusy() {
@@ -5677,29 +5857,100 @@ function sameSet(left, right) {
5677
5857
  for (const id of left) if (!right.has(id)) return false;
5678
5858
  return true;
5679
5859
  }
5680
- function schedule$1(now) {
5681
- if (timer$2 !== void 0) clearTimeout(timer$2);
5682
- timer$2 = void 0;
5860
+ function schedule$2(now) {
5861
+ if (timer$3 !== void 0) clearTimeout(timer$3);
5862
+ timer$3 = void 0;
5683
5863
  let soonest = Number.POSITIVE_INFINITY;
5684
5864
  for (const at of published.values()) soonest = Math.min(soonest, at);
5685
5865
  if (soonest === Number.POSITIVE_INFINITY) return;
5686
- timer$2 = setTimeout(() => refresh(Date.now()), Math.max(0, soonest + MARKET_BUSY_MS - now) + 1);
5866
+ timer$3 = setTimeout(() => refresh$1(Date.now()), Math.max(0, soonest + MARKET_BUSY_MS - now) + 1);
5687
5867
  }
5688
- function refresh(now) {
5868
+ function refresh$1(now) {
5689
5869
  for (const [id, at] of published) if (now - at >= MARKET_BUSY_MS) published.delete(id);
5690
5870
  const next = new Set(published.keys());
5691
5871
  if (!sameSet(live$2, next)) {
5692
5872
  live$2 = next;
5873
+ for (const listener of [...listeners$6]) listener();
5874
+ }
5875
+ schedule$2(now);
5876
+ }
5877
+ //#endregion
5878
+ //#region src/app/layouts/rightbar/market-install.ts
5879
+ var NO_UNITS$2 = /* @__PURE__ */ new Set();
5880
+ var IDLE$2 = {
5881
+ installing: false,
5882
+ applied: NO_UNITS$2
5883
+ };
5884
+ var tokens = /* @__PURE__ */ new Set();
5885
+ var applied = /* @__PURE__ */ new Map();
5886
+ var listeners$5 = /* @__PURE__ */ new Set();
5887
+ var snapshot$1 = IDLE$2;
5888
+ var timer$2;
5889
+ function sameUnits(left, right) {
5890
+ if (left.size !== right.size) return false;
5891
+ for (const unit of left) if (!right.has(unit)) return false;
5892
+ return true;
5893
+ }
5894
+ function schedule$1(now) {
5895
+ if (timer$2 !== void 0) clearTimeout(timer$2);
5896
+ timer$2 = void 0;
5897
+ if (applied.size === 0) return;
5898
+ let soonest = Number.POSITIVE_INFINITY;
5899
+ for (const at of applied.values()) soonest = Math.min(soonest, at);
5900
+ timer$2 = setTimeout(() => refresh(Date.now()), Math.max(0, soonest + MODULE_SETTLE_MS - now) + 1);
5901
+ }
5902
+ function refresh(now) {
5903
+ for (const [unit, at] of applied) if (now - at >= 15e3) applied.delete(unit);
5904
+ const next = tokens.size === 0 && applied.size === 0 ? IDLE$2 : {
5905
+ installing: tokens.size > 0,
5906
+ applied: applied.size === 0 ? NO_UNITS$2 : new Set(applied.keys())
5907
+ };
5908
+ if (next.installing !== snapshot$1.installing || !sameUnits(next.applied, snapshot$1.applied)) {
5909
+ snapshot$1 = next;
5693
5910
  for (const listener of [...listeners$5]) listener();
5694
5911
  }
5695
5912
  schedule$1(now);
5696
5913
  }
5914
+ function marketInstallState() {
5915
+ return snapshot$1;
5916
+ }
5917
+ function subscribeMarketInstall(listener) {
5918
+ listeners$5.add(listener);
5919
+ return () => {
5920
+ listeners$5.delete(listener);
5921
+ };
5922
+ }
5923
+ function publishMarketInstalling(token, active) {
5924
+ if (active) tokens.add(token);
5925
+ else tokens.delete(token);
5926
+ refresh(Date.now());
5927
+ }
5928
+ function publishMarketApplied(units) {
5929
+ const now = Date.now();
5930
+ for (const unit of new Set(units)) if (unit !== "" && !applied.has(unit)) applied.set(unit, now);
5931
+ refresh(now);
5932
+ }
5933
+ function useMarketInstallState() {
5934
+ return (0, react.useSyncExternalStore)(subscribeMarketInstall, marketInstallState);
5935
+ }
5936
+ function usePublishMarketInstalling(token, active) {
5937
+ (0, react.useEffect)(() => {
5938
+ publishMarketInstalling(token, active);
5939
+ return () => publishMarketInstalling(token, false);
5940
+ }, [token, active]);
5941
+ }
5697
5942
  //#endregion
5698
5943
  //#region src/shared/api/write-outcome.ts
5699
5944
  function writeRoute(channel, resource) {
5700
5945
  if (channel === "provision") return "provision";
5701
5946
  return `${channel}/${resource}`;
5702
5947
  }
5948
+ function installFailureOf(value) {
5949
+ if (typeof value !== "object" || value === null) return void 0;
5950
+ const record = value;
5951
+ if (typeof record.kind !== "string" || typeof record.command !== "string") return void 0;
5952
+ return value;
5953
+ }
5703
5954
  function writeOutcomeOf(response, networkText) {
5704
5955
  if (response === null) return {
5705
5956
  ok: false,
@@ -5711,11 +5962,13 @@ function writeOutcomeOf(response, networkText) {
5711
5962
  const fallback = typeof box.text === "string" && box.text !== "" ? box.text : networkText;
5712
5963
  const detail = typeof box.error?.detail === "string" ? box.error.detail : void 0;
5713
5964
  const helpUrl = typeof box.error?.helpUrl === "string" && box.error.helpUrl !== "" ? box.error.helpUrl : void 0;
5965
+ const failure = installFailureOf(box.error?.failure);
5714
5966
  return {
5715
5967
  ok: false,
5716
5968
  message: own ?? fallback,
5717
5969
  ...detail === void 0 ? {} : { detail },
5718
- ...helpUrl === void 0 ? {} : { helpUrl }
5970
+ ...helpUrl === void 0 ? {} : { helpUrl },
5971
+ ...failure === void 0 ? {} : { failure }
5719
5972
  };
5720
5973
  }
5721
5974
  return {
@@ -5922,137 +6175,138 @@ function useMarketTransient(input) {
5922
6175
  };
5923
6176
  }
5924
6177
  var MarketPage_module_default = {
5925
- marketList: "_marketList_yups9_1",
5926
- marketRow: "_marketRow_yups9_10",
5927
- marketIcon: "_marketIcon_yups9_20",
5928
- marketMain: "_marketMain_yups9_32",
5929
- marketName: "_marketName_yups9_39",
5930
- marketStatus: "_marketStatus_yups9_48",
5931
- marketStateText: "_marketStateText_yups9_58",
5932
- marketSep: "_marketSep_yups9_62",
5933
- marketReason: "_marketReason_yups9_66",
5934
- marketVersion: "_marketVersion_yups9_72",
5935
- marketLocalTag: "_marketLocalTag_yups9_94",
5936
- marketEnd: "_marketEnd_yups9_105",
5937
- marketSwitchSeat: "_marketSwitchSeat_yups9_112",
5938
- marketActions: "_marketActions_yups9_125",
5939
- marketUpdateAction: "_marketUpdateAction_yups9_131",
5940
- marketSelfDivider: "_marketSelfDivider_yups9_137",
5941
- marketSection: "_marketSection_yups9_143",
5942
- marketSectionHead: "_marketSectionHead_yups9_150",
5943
- marketSectionIcon: "_marketSectionIcon_yups9_156",
5944
- marketSectionTitle: "_marketSectionTitle_yups9_163",
5945
- marketSectionCount: "_marketSectionCount_yups9_169",
5946
- marketSectionAction: "_marketSectionAction_yups9_175",
5947
- marketSectionQuiet: "_marketSectionQuiet_yups9_183",
5948
- marketProgress: "_marketProgress_yups9_196",
5949
- marketNote: "_marketNote_yups9_206",
5950
- marketFailure: "_marketFailure_yups9_213",
5951
- marketEmpty: "_marketEmpty_yups9_220",
5952
- marketPage: "_marketPage_yups9_225",
5953
- marketPageHead: "_marketPageHead_yups9_243",
5954
- marketPageTitle: "_marketPageTitle_yups9_251",
5955
- marketPageIntro: "_marketPageIntro_yups9_256",
5956
- marketPageTools: "_marketPageTools_yups9_262",
5957
- marketPanel: "_marketPanel_yups9_271",
5958
- marketTabs: "_marketTabs_yups9_281",
5959
- marketTabList: "_marketTabList_yups9_286",
5960
- marketAddButton: "_marketAddButton_yups9_291",
5961
- marketEmptyTitle: "_marketEmptyTitle_yups9_308",
5962
- discoverPage: "_discoverPage_yups9_313",
5963
- discoverBar: "_discoverBar_yups9_320",
5964
- discoverTools: "_discoverTools_yups9_327",
5965
- discoverMarket: "_discoverMarket_yups9_333",
5966
- discoverMarketButton: "_discoverMarketButton_yups9_338",
5967
- discoverMarketName: "_discoverMarketName_yups9_345",
5968
- discoverLabels: "_discoverLabels_yups9_351",
5969
- discoverSort: "_discoverSort_yups9_356",
5970
- discoverRefresh: "_discoverRefresh_yups9_361",
5971
- discoverSearch: "_discoverSearch_yups9_365",
5972
- discoverSearchField: "_discoverSearchField_yups9_373",
5973
- discoverSearchFieldFilled: "_discoverSearchFieldFilled_yups9_378",
5974
- discoverSearchClear: "_discoverSearchClear_yups9_387",
5975
- discoverChips: "_discoverChips_yups9_438",
5976
- discoverList: "_discoverList_yups9_445",
5977
- discoverCard: "_discoverCard_yups9_454",
5978
- discoverArtwork: "_discoverArtwork_yups9_468",
5979
- discoverArtworkImage: "_discoverArtworkImage_yups9_480",
5980
- discoverMain: "_discoverMain_yups9_484",
5981
- discoverTitleRow: "_discoverTitleRow_yups9_492",
5982
- discoverCardOpen: "_discoverCardOpen_yups9_500",
5983
- discoverStrong: "_discoverStrong_yups9_531",
5984
- discoverDesc: "_discoverDesc_yups9_537",
5985
- discoverMeta: "_discoverMeta_yups9_546",
5986
- discoverMuted: "_discoverMuted_yups9_553",
5987
- discoverEnd: "_discoverEnd_yups9_559",
5988
- discoverUpdateAction: "_discoverUpdateAction_yups9_568",
5989
- discoverBlocked: "_discoverBlocked_yups9_573",
5990
- discoverEmpty: "_discoverEmpty_yups9_578",
5991
- discoverEmptyTitle: "_discoverEmptyTitle_yups9_587",
5992
- discoverDetail: "_discoverDetail_yups9_597",
5993
- discoverCrumb: "_discoverCrumb_yups9_603",
5994
- discoverCrumbIcon: "_discoverCrumbIcon_yups9_626",
5995
- discoverDetailHead: "_discoverDetailHead_yups9_630",
5996
- discoverDetailTitle: "_discoverDetailTitle_yups9_636",
5997
- discoverDetailText: "_discoverDetailText_yups9_642",
5998
- discoverDetailPanel: "_discoverDetailPanel_yups9_649",
5999
- discoverDetailTabs: "_discoverDetailTabs_yups9_656",
6000
- discoverDetailTabList: "_discoverDetailTabList_yups9_661",
6001
- discoverDocBody: "_discoverDocBody_yups9_666",
6002
- discoverDocNotice: "_discoverDocNotice_yups9_671",
6003
- discoverSection: "_discoverSection_yups9_677",
6004
- discoverSectionTitle: "_discoverSectionTitle_yups9_684",
6005
- discoverFacts: "_discoverFacts_yups9_690",
6006
- discoverFactRow: "_discoverFactRow_yups9_695",
6007
- discoverFactKind: "_discoverFactKind_yups9_705",
6008
- discoverFactValue: "_discoverFactValue_yups9_711",
6009
- discoverCode: "_discoverCode_yups9_719",
6010
- discoverTags: "_discoverTags_yups9_728",
6011
- discoverLink: "_discoverLink_yups9_735",
6012
- discoverVersions: "_discoverVersions_yups9_745",
6013
- discoverVersionRow: "_discoverVersionRow_yups9_753",
6014
- discoverVersionName: "_discoverVersionName_yups9_761",
6015
- discoverError: "_discoverError_yups9_766",
6016
- discoverFailure: "_discoverFailure_yups9_775",
6017
- discoverLoading: "_discoverLoading_yups9_781",
6018
- discoverNotice: "_discoverNotice_yups9_790",
6019
- discoverMore: "_discoverMore_yups9_808",
6020
- discoverTransport: "_discoverTransport_yups9_812",
6021
- discoverTransportHead: "_discoverTransportHead_yups9_818",
6022
- discoverTransportTitle: "_discoverTransportTitle_yups9_825",
6023
- discoverTransportKind: "_discoverTransportKind_yups9_830",
6024
- discoverTransportState: "_discoverTransportState_yups9_835",
6025
- discoverTransportRows: "_discoverTransportRows_yups9_843",
6026
- discoverTransportRow: "_discoverTransportRow_yups9_843",
6027
- discoverTransportRadio: "_discoverTransportRadio_yups9_864",
6028
- discoverTransportCustom: "_discoverTransportCustom_yups9_904",
6029
- discoverTransportInput: "_discoverTransportInput_yups9_910",
6030
- discoverInstallBar: "_discoverInstallBar_yups9_915",
6031
- discoverInstallText: "_discoverInstallText_yups9_926",
6032
- discoverDialog: "_discoverDialog_yups9_932",
6033
- discoverDialogBody: "_discoverDialogBody_yups9_936",
6034
- discoverSourceList: "_discoverSourceList_yups9_942",
6035
- discoverSourceRow: "_discoverSourceRow_yups9_950",
6036
- discoverSourceConfirm: "_discoverSourceConfirm_yups9_959",
6037
- discoverSourcePick: "_discoverSourcePick_yups9_965",
6038
- discoverSourceRadio: "_discoverSourceRadio_yups9_974",
6039
- discoverSourceMain: "_discoverSourceMain_yups9_982",
6040
- discoverSourceHead: "_discoverSourceHead_yups9_990",
6041
- discoverSourceUrl: "_discoverSourceUrl_yups9_998",
6042
- discoverSourceMore: "_discoverSourceMore_yups9_1008",
6043
- discoverSourceLoading: "_discoverSourceLoading_yups9_1012",
6044
- discoverSourceHint: "_discoverSourceHint_yups9_1022",
6045
- discoverSourceError: "_discoverSourceError_yups9_1036",
6046
- discoverSourceForm: "_discoverSourceForm_yups9_1042",
6047
- discoverGrow: "_discoverGrow_yups9_1048",
6048
- discoverField: "_discoverField_yups9_1053",
6049
- discoverFieldLabel: "_discoverFieldLabel_yups9_1059",
6050
- discoverConfirmHead: "_discoverConfirmHead_yups9_1064",
6051
- discoverSkeletonFill: "_discoverSkeletonFill_yups9_1070",
6052
- "wb-skeleton": "_wb-skeleton_yups9_1",
6053
- discoverSkeletonBar: "_discoverSkeletonBar_yups9_1079",
6054
- discoverSkeletonTitle: "_discoverSkeletonTitle_yups9_1086",
6055
- discoverSkeletonDesc: "_discoverSkeletonDesc_yups9_1090"
6178
+ marketList: "_marketList_1vpw3_1",
6179
+ marketRow: "_marketRow_1vpw3_10",
6180
+ marketIcon: "_marketIcon_1vpw3_20",
6181
+ marketMain: "_marketMain_1vpw3_32",
6182
+ marketName: "_marketName_1vpw3_39",
6183
+ marketStatus: "_marketStatus_1vpw3_48",
6184
+ marketStateText: "_marketStateText_1vpw3_58",
6185
+ marketSep: "_marketSep_1vpw3_62",
6186
+ marketReason: "_marketReason_1vpw3_66",
6187
+ marketVersion: "_marketVersion_1vpw3_72",
6188
+ marketLocalTag: "_marketLocalTag_1vpw3_94",
6189
+ marketEnd: "_marketEnd_1vpw3_105",
6190
+ marketSwitchSeat: "_marketSwitchSeat_1vpw3_112",
6191
+ marketActions: "_marketActions_1vpw3_125",
6192
+ marketUpdateAction: "_marketUpdateAction_1vpw3_131",
6193
+ marketSelfDivider: "_marketSelfDivider_1vpw3_137",
6194
+ marketSection: "_marketSection_1vpw3_143",
6195
+ marketSectionHead: "_marketSectionHead_1vpw3_150",
6196
+ marketSectionIcon: "_marketSectionIcon_1vpw3_156",
6197
+ marketSectionTitle: "_marketSectionTitle_1vpw3_163",
6198
+ marketSectionCount: "_marketSectionCount_1vpw3_169",
6199
+ marketSectionAction: "_marketSectionAction_1vpw3_175",
6200
+ marketSectionQuiet: "_marketSectionQuiet_1vpw3_183",
6201
+ marketProgress: "_marketProgress_1vpw3_195",
6202
+ marketNote: "_marketNote_1vpw3_205",
6203
+ marketFailure: "_marketFailure_1vpw3_212",
6204
+ marketFailureSeat: "_marketFailureSeat_1vpw3_219",
6205
+ marketEmpty: "_marketEmpty_1vpw3_224",
6206
+ marketPage: "_marketPage_1vpw3_229",
6207
+ marketPageHead: "_marketPageHead_1vpw3_247",
6208
+ marketPageTitle: "_marketPageTitle_1vpw3_255",
6209
+ marketPageIntro: "_marketPageIntro_1vpw3_260",
6210
+ marketPageTools: "_marketPageTools_1vpw3_266",
6211
+ marketPanel: "_marketPanel_1vpw3_275",
6212
+ marketTabs: "_marketTabs_1vpw3_285",
6213
+ marketTabList: "_marketTabList_1vpw3_290",
6214
+ marketAddButton: "_marketAddButton_1vpw3_295",
6215
+ marketEmptyTitle: "_marketEmptyTitle_1vpw3_312",
6216
+ discoverPage: "_discoverPage_1vpw3_317",
6217
+ discoverBar: "_discoverBar_1vpw3_324",
6218
+ discoverTools: "_discoverTools_1vpw3_331",
6219
+ discoverMarket: "_discoverMarket_1vpw3_337",
6220
+ discoverMarketButton: "_discoverMarketButton_1vpw3_342",
6221
+ discoverMarketName: "_discoverMarketName_1vpw3_349",
6222
+ discoverLabels: "_discoverLabels_1vpw3_355",
6223
+ discoverSort: "_discoverSort_1vpw3_360",
6224
+ discoverRefresh: "_discoverRefresh_1vpw3_365",
6225
+ discoverSearch: "_discoverSearch_1vpw3_369",
6226
+ discoverSearchField: "_discoverSearchField_1vpw3_377",
6227
+ discoverSearchFieldFilled: "_discoverSearchFieldFilled_1vpw3_382",
6228
+ discoverSearchClear: "_discoverSearchClear_1vpw3_391",
6229
+ discoverChips: "_discoverChips_1vpw3_442",
6230
+ discoverList: "_discoverList_1vpw3_449",
6231
+ discoverCard: "_discoverCard_1vpw3_458",
6232
+ discoverArtwork: "_discoverArtwork_1vpw3_472",
6233
+ discoverArtworkImage: "_discoverArtworkImage_1vpw3_484",
6234
+ discoverMain: "_discoverMain_1vpw3_488",
6235
+ discoverTitleRow: "_discoverTitleRow_1vpw3_496",
6236
+ discoverCardOpen: "_discoverCardOpen_1vpw3_504",
6237
+ discoverStrong: "_discoverStrong_1vpw3_535",
6238
+ discoverDesc: "_discoverDesc_1vpw3_541",
6239
+ discoverMeta: "_discoverMeta_1vpw3_550",
6240
+ discoverMuted: "_discoverMuted_1vpw3_557",
6241
+ discoverEnd: "_discoverEnd_1vpw3_563",
6242
+ discoverUpdateAction: "_discoverUpdateAction_1vpw3_572",
6243
+ discoverBlocked: "_discoverBlocked_1vpw3_577",
6244
+ discoverEmpty: "_discoverEmpty_1vpw3_582",
6245
+ discoverEmptyTitle: "_discoverEmptyTitle_1vpw3_591",
6246
+ discoverDetail: "_discoverDetail_1vpw3_601",
6247
+ discoverCrumb: "_discoverCrumb_1vpw3_607",
6248
+ discoverCrumbIcon: "_discoverCrumbIcon_1vpw3_630",
6249
+ discoverDetailHead: "_discoverDetailHead_1vpw3_634",
6250
+ discoverDetailTitle: "_discoverDetailTitle_1vpw3_640",
6251
+ discoverDetailText: "_discoverDetailText_1vpw3_646",
6252
+ discoverDetailPanel: "_discoverDetailPanel_1vpw3_653",
6253
+ discoverDetailTabs: "_discoverDetailTabs_1vpw3_660",
6254
+ discoverDetailTabList: "_discoverDetailTabList_1vpw3_665",
6255
+ discoverDocBody: "_discoverDocBody_1vpw3_670",
6256
+ discoverDocNotice: "_discoverDocNotice_1vpw3_675",
6257
+ discoverSection: "_discoverSection_1vpw3_681",
6258
+ discoverSectionTitle: "_discoverSectionTitle_1vpw3_688",
6259
+ discoverFacts: "_discoverFacts_1vpw3_694",
6260
+ discoverFactRow: "_discoverFactRow_1vpw3_699",
6261
+ discoverFactKind: "_discoverFactKind_1vpw3_709",
6262
+ discoverFactValue: "_discoverFactValue_1vpw3_715",
6263
+ discoverCode: "_discoverCode_1vpw3_723",
6264
+ discoverTags: "_discoverTags_1vpw3_732",
6265
+ discoverLink: "_discoverLink_1vpw3_739",
6266
+ discoverVersions: "_discoverVersions_1vpw3_749",
6267
+ discoverVersionRow: "_discoverVersionRow_1vpw3_757",
6268
+ discoverVersionName: "_discoverVersionName_1vpw3_765",
6269
+ discoverError: "_discoverError_1vpw3_770",
6270
+ discoverFailure: "_discoverFailure_1vpw3_779",
6271
+ discoverLoading: "_discoverLoading_1vpw3_785",
6272
+ discoverNotice: "_discoverNotice_1vpw3_794",
6273
+ discoverMore: "_discoverMore_1vpw3_812",
6274
+ discoverTransport: "_discoverTransport_1vpw3_816",
6275
+ discoverTransportHead: "_discoverTransportHead_1vpw3_822",
6276
+ discoverTransportTitle: "_discoverTransportTitle_1vpw3_829",
6277
+ discoverTransportKind: "_discoverTransportKind_1vpw3_834",
6278
+ discoverTransportState: "_discoverTransportState_1vpw3_839",
6279
+ discoverTransportRows: "_discoverTransportRows_1vpw3_847",
6280
+ discoverTransportRow: "_discoverTransportRow_1vpw3_847",
6281
+ discoverTransportRadio: "_discoverTransportRadio_1vpw3_868",
6282
+ discoverTransportCustom: "_discoverTransportCustom_1vpw3_908",
6283
+ discoverTransportInput: "_discoverTransportInput_1vpw3_914",
6284
+ discoverInstallBar: "_discoverInstallBar_1vpw3_919",
6285
+ discoverInstallText: "_discoverInstallText_1vpw3_930",
6286
+ discoverDialog: "_discoverDialog_1vpw3_936",
6287
+ discoverDialogBody: "_discoverDialogBody_1vpw3_940",
6288
+ discoverSourceList: "_discoverSourceList_1vpw3_946",
6289
+ discoverSourceRow: "_discoverSourceRow_1vpw3_954",
6290
+ discoverSourceConfirm: "_discoverSourceConfirm_1vpw3_963",
6291
+ discoverSourcePick: "_discoverSourcePick_1vpw3_969",
6292
+ discoverSourceRadio: "_discoverSourceRadio_1vpw3_978",
6293
+ discoverSourceMain: "_discoverSourceMain_1vpw3_986",
6294
+ discoverSourceHead: "_discoverSourceHead_1vpw3_994",
6295
+ discoverSourceUrl: "_discoverSourceUrl_1vpw3_1002",
6296
+ discoverSourceMore: "_discoverSourceMore_1vpw3_1012",
6297
+ discoverSourceLoading: "_discoverSourceLoading_1vpw3_1016",
6298
+ discoverSourceHint: "_discoverSourceHint_1vpw3_1026",
6299
+ discoverSourceError: "_discoverSourceError_1vpw3_1040",
6300
+ discoverSourceForm: "_discoverSourceForm_1vpw3_1046",
6301
+ discoverGrow: "_discoverGrow_1vpw3_1052",
6302
+ discoverField: "_discoverField_1vpw3_1057",
6303
+ discoverFieldLabel: "_discoverFieldLabel_1vpw3_1063",
6304
+ discoverConfirmHead: "_discoverConfirmHead_1vpw3_1068",
6305
+ discoverSkeletonFill: "_discoverSkeletonFill_1vpw3_1074",
6306
+ "wb-skeleton": "_wb-skeleton_1vpw3_1",
6307
+ discoverSkeletonBar: "_discoverSkeletonBar_1vpw3_1083",
6308
+ discoverSkeletonTitle: "_discoverSkeletonTitle_1vpw3_1090",
6309
+ discoverSkeletonDesc: "_discoverSkeletonDesc_1vpw3_1094"
6056
6310
  };
6057
6311
  //#endregion
6058
6312
  //#region src/app/layouts/market/discover-states.tsx
@@ -6132,6 +6386,167 @@ function MarketChecking({ t }) {
6132
6386
  function MarketEmpty({ t }) {
6133
6387
  return /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketEmptyTitle }, t("panels.market.empty")));
6134
6388
  }
6389
+ var FailureCard_module_default = {
6390
+ block: "_block_mxnbc_1",
6391
+ head: "_head_mxnbc_9",
6392
+ title: "_title_mxnbc_16",
6393
+ fact: "_fact_mxnbc_22",
6394
+ actions: "_actions_mxnbc_30",
6395
+ hint: "_hint_mxnbc_38",
6396
+ output: "_output_mxnbc_44"
6397
+ };
6398
+ //#endregion
6399
+ //#region src/app/layouts/rightbar/FailureCard.tsx
6400
+ var COPIED_MS$1 = 1200;
6401
+ function terminalLabels(t) {
6402
+ return {
6403
+ commandLine: (line) => t("panels.market.failure.term.commandLine", { line }),
6404
+ signal: (signal) => t("panels.market.failure.term.signal", { signal }),
6405
+ exitCode: (exitCode) => t("panels.market.failure.term.exitCode", { exitCode }),
6406
+ noExitCode: t("panels.market.failure.term.noExitCode"),
6407
+ running: t("panels.market.failure.term.running"),
6408
+ failed: t("panels.market.failure.term.failed"),
6409
+ done: t("panels.market.failure.term.done"),
6410
+ copy: t("panels.market.failure.term.copy"),
6411
+ copied: t("panels.market.failure.term.copied"),
6412
+ noOutput: t("panels.market.failure.term.noOutput"),
6413
+ collapseAria: t("panels.market.failure.term.collapse"),
6414
+ collapse: t("panels.market.failure.term.collapse"),
6415
+ expandAria: (hidden) => t("panels.market.failure.term.expandAria", { hidden }),
6416
+ expand: (hidden) => t("panels.market.failure.term.expand", { hidden })
6417
+ };
6418
+ }
6419
+ function FailureCard({ t, model, onRecheck, rechecking }) {
6420
+ const hasOutput = model.command !== "" || model.output !== "";
6421
+ const [copied, setCopied] = (0, react.useState)(false);
6422
+ const [open, setOpen] = (0, react.useState)(false);
6423
+ const onCopy = (0, react.useCallback)(() => {
6424
+ (0, _deepseek_ai_dsh_client_ui_primitives.writeClipboard)(model.fix).then((ok) => {
6425
+ if (!ok) return;
6426
+ setCopied(true);
6427
+ setTimeout(() => setCopied(false), COPIED_MS$1);
6428
+ });
6429
+ }, [model.fix]);
6430
+ return /* @__PURE__ */ (0, react.createElement)("div", { className: FailureCard_module_default.block }, /* @__PURE__ */ (0, react.createElement)("div", { className: FailureCard_module_default.head }, /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
6431
+ state: "error",
6432
+ size: 8
6433
+ }), /* @__PURE__ */ (0, react.createElement)("span", { className: FailureCard_module_default.title }, model.title)), /* @__PURE__ */ (0, react.createElement)("p", { className: FailureCard_module_default.fact }, model.fact), /* @__PURE__ */ (0, react.createElement)("div", { className: FailureCard_module_default.actions }, /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
6434
+ type: "button",
6435
+ size: "sm",
6436
+ variant: "ghost",
6437
+ onClick: onCopy
6438
+ }, copied ? t("panels.market.failure.copied") : model.fixLabel), /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
6439
+ type: "button",
6440
+ size: "sm",
6441
+ variant: "ghost",
6442
+ disabled: rechecking,
6443
+ onClick: onRecheck
6444
+ }, t("panels.market.failure.recheck")), hasOutput ? /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
6445
+ type: "button",
6446
+ size: "sm",
6447
+ variant: "ghost",
6448
+ onClick: () => setOpen(!open)
6449
+ }, open ? t("panels.market.failure.hideOutput") : t("panels.market.failure.showOutput")) : null), copied ? /* @__PURE__ */ (0, react.createElement)("p", { className: FailureCard_module_default.hint }, model.copiedHint) : null, open && hasOutput ? /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.TerminalBlock, {
6450
+ command: model.command,
6451
+ output: model.output,
6452
+ exitCode: model.exitCode,
6453
+ maxLines: 8,
6454
+ labels: terminalLabels(t),
6455
+ className: FailureCard_module_default.output
6456
+ }) : null);
6457
+ }
6458
+ //#endregion
6459
+ //#region src/app/layouts/rightbar/failure-card-text.ts
6460
+ var TITLE_KEY = {
6461
+ permission: "panels.market.failure.permission",
6462
+ "disk-full": "panels.market.failure.diskFull",
6463
+ sandbox: "panels.market.failure.sandbox",
6464
+ unknown: "panels.market.failure.unknown"
6465
+ };
6466
+ var ASK_AGENT_KEY = "panels.market.failure.askAgent";
6467
+ function updateStuckCardOf(t, input) {
6468
+ const unknown = t("panels.market.updateUnknownVersion");
6469
+ return {
6470
+ title: t("panels.market.updateStuck.title"),
6471
+ fact: input.fact ?? t("panels.market.updateStuck.factNoChange", {
6472
+ from: input.from ?? unknown,
6473
+ latest: input.latest ?? unknown
6474
+ }),
6475
+ fixLabel: t("panels.market.failure.copyFix"),
6476
+ fix: input.command,
6477
+ copiedHint: t("panels.market.updateStuck.copiedHint"),
6478
+ command: "",
6479
+ output: "",
6480
+ exitCode: null
6481
+ };
6482
+ }
6483
+ function shellPath(path) {
6484
+ return /^[\w./@%+-]+$/.test(path) ? path : `'${path.replaceAll("'", "'\\''")}'`;
6485
+ }
6486
+ function ownerLabel(uid) {
6487
+ return uid === 0 ? "root" : `uid ${uid}`;
6488
+ }
6489
+ function failureCardOf(failure, t) {
6490
+ const path = failure.path ?? "";
6491
+ const fix = failure.fix;
6492
+ if (fix.kind === "chown") {
6493
+ const ownerUid = failure.owner?.uid;
6494
+ return {
6495
+ title: t(TITLE_KEY[failure.kind]),
6496
+ fact: ownerUid === void 0 ? t("panels.market.failure.factMode", {
6497
+ path,
6498
+ mode: failure.mode ?? "?"
6499
+ }) : t("panels.market.failure.factOwner", {
6500
+ path,
6501
+ owner: ownerLabel(ownerUid),
6502
+ me: ownerLabel(failure.current.uid)
6503
+ }),
6504
+ fixLabel: t("panels.market.failure.copyFix"),
6505
+ fix: `sudo chown -R ${fix.uid}:${fix.gid} ${shellPath(fix.path)}`,
6506
+ copiedHint: t("panels.market.failure.copiedHint"),
6507
+ command: failure.command,
6508
+ output: failure.output,
6509
+ exitCode: failure.exitCode
6510
+ };
6511
+ }
6512
+ if (fix.kind === "chmod") return {
6513
+ title: t(TITLE_KEY[failure.kind]),
6514
+ fact: t("panels.market.failure.factMode", {
6515
+ path,
6516
+ mode: failure.mode ?? "?"
6517
+ }),
6518
+ fixLabel: t("panels.market.failure.copyFix"),
6519
+ fix: `chmod -R u+w ${shellPath(fix.path)}`,
6520
+ copiedHint: t("panels.market.failure.copiedHint"),
6521
+ command: failure.command,
6522
+ output: failure.output,
6523
+ exitCode: failure.exitCode
6524
+ };
6525
+ if (fix.kind === "space") return {
6526
+ title: t(TITLE_KEY[failure.kind]),
6527
+ fact: t("panels.market.failure.factSpace", { path }),
6528
+ fixLabel: t("panels.market.failure.copyFix"),
6529
+ fix: `du -sh ${shellPath(fix.path)}`,
6530
+ copiedHint: t("panels.market.failure.copiedHint"),
6531
+ command: failure.command,
6532
+ output: failure.output,
6533
+ exitCode: failure.exitCode
6534
+ };
6535
+ return {
6536
+ title: t(TITLE_KEY[failure.kind]),
6537
+ fact: t("panels.market.failure.factStuck", { path: path === "" ? t("panels.market.failure.nowhere") : path }),
6538
+ fixLabel: t(ASK_AGENT_KEY),
6539
+ fix: t("panels.market.failure.askAgentText", {
6540
+ command: failure.command,
6541
+ path: path === "" ? t("panels.market.failure.nowhere") : path,
6542
+ code: failure.exitCode === null ? "?" : String(failure.exitCode)
6543
+ }),
6544
+ copiedHint: t("panels.market.failure.askAgentHint"),
6545
+ command: failure.command,
6546
+ output: failure.output,
6547
+ exitCode: failure.exitCode
6548
+ };
6549
+ }
6135
6550
  //#endregion
6136
6551
  //#region src/app/layouts/rightbar/market-section-icon.ts
6137
6552
  var SIZE$1 = 14;
@@ -6302,9 +6717,21 @@ function pendingRowOf(input) {
6302
6717
  ...pending.version === void 0 ? {} : { version: { installed: pending.version } }
6303
6718
  };
6304
6719
  }
6720
+ function askAgentReason(row, t) {
6721
+ if (row.hint !== void 0) return t(row.hint);
6722
+ if (row.note !== void 0) return t(row.note.key, row.note.params);
6723
+ return t(MARKET_STATE_KEY[row.state]);
6724
+ }
6725
+ function askAgentText(row, t) {
6726
+ return t("panels.market.askAgentText", {
6727
+ name: marketRowTitle(row, t),
6728
+ unit: row.id,
6729
+ reason: askAgentReason(row, t)
6730
+ });
6731
+ }
6305
6732
  //#endregion
6306
6733
  //#region src/app/layouts/rightbar/SharedSection.tsx
6307
- function SharedLine({ t, row, pending, failure, onAct }) {
6734
+ function SharedLine({ t, row, pending, failure, onAct, onRecheck, rechecking }) {
6308
6735
  const running = pending !== null && pending.id === row.id ? pending : null;
6309
6736
  const locked = pending !== null;
6310
6737
  const actions = sharedActions(row);
@@ -6327,9 +6754,14 @@ function SharedLine({ t, row, pending, failure, onAct }) {
6327
6754
  variant: "outline",
6328
6755
  disabled: locked,
6329
6756
  onClick: () => onAct(action)
6330
- }, t(ACTION_LABEL_KEY[action]))))), failure === null ? null : /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketFailure }, failure));
6757
+ }, t(ACTION_LABEL_KEY[action]))))), failure === null ? null : failure.failure === void 0 ? /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketFailure }, failure.message) : /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketFailureSeat }, /* @__PURE__ */ (0, react.createElement)(FailureCard, {
6758
+ t,
6759
+ model: failureCardOf(failure.failure, t),
6760
+ onRecheck,
6761
+ rechecking
6762
+ })));
6331
6763
  }
6332
- function SharedSection({ t, rows, pending, failureOf, act }) {
6764
+ function SharedSection({ t, rows, pending, failureOf, act, onRecheck, rechecking }) {
6333
6765
  if (rows.length === 0) return null;
6334
6766
  return /* @__PURE__ */ (0, react.createElement)("section", { className: `${MarketPage_module_default.marketSection} ${MarketPage_module_default.marketSectionQuiet}` }, /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ (0, react.createElement)("span", {
6335
6767
  className: MarketPage_module_default.marketSectionIcon,
@@ -6340,7 +6772,9 @@ function SharedSection({ t, rows, pending, failureOf, act }) {
6340
6772
  row,
6341
6773
  pending,
6342
6774
  failure: failureOf(row.id),
6343
- onAct: (action) => void act(row.id, action)
6775
+ onAct: (action) => void act(row.id, action),
6776
+ onRecheck,
6777
+ rechecking
6344
6778
  }))));
6345
6779
  }
6346
6780
  //#endregion
@@ -6363,6 +6797,25 @@ function Tip({ side = "bottom", align = "end", gap = 6, portal = true, ...rest }
6363
6797
  });
6364
6798
  }
6365
6799
  //#endregion
6800
+ //#region src/app/layouts/rightbar/AskAgentButton.tsx
6801
+ var COPIED_MS = 1200;
6802
+ function AskAgentButton({ t, text, label }) {
6803
+ const [copied, setCopied] = (0, react.useState)(false);
6804
+ const onCopy = (0, react.useCallback)(() => {
6805
+ (0, _deepseek_ai_dsh_client_ui_primitives.writeClipboard)(text).then((ok) => {
6806
+ if (!ok) return;
6807
+ setCopied(true);
6808
+ setTimeout(() => setCopied(false), COPIED_MS);
6809
+ });
6810
+ }, [text]);
6811
+ return /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
6812
+ type: "button",
6813
+ size: "sm",
6814
+ variant: "ghost",
6815
+ onClick: onCopy
6816
+ }, copied ? t("panels.market.askAgentCopied") : label);
6817
+ }
6818
+ //#endregion
6366
6819
  //#region src/app/layouts/rightbar/market-section.tsx
6367
6820
  var dangerActions = [
6368
6821
  "uninstall",
@@ -6433,13 +6886,25 @@ function MarketLineStatus({ t, row, quiet }) {
6433
6886
  "aria-hidden": "true"
6434
6887
  }, "·"), /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.marketReason }, noteText)));
6435
6888
  }
6436
- function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy }) {
6889
+ function MarketFailureBlock({ t, failure, onRecheck, rechecking }) {
6890
+ if (failure === null) return null;
6891
+ const model = failure.card ?? (failure.failure === void 0 ? void 0 : failureCardOf(failure.failure, t));
6892
+ if (model !== void 0) return /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketFailureSeat }, /* @__PURE__ */ (0, react.createElement)(FailureCard, {
6893
+ t,
6894
+ model,
6895
+ onRecheck,
6896
+ rechecking
6897
+ }));
6898
+ return /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketFailure }, failure.message);
6899
+ }
6900
+ function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy, onRecheck, rechecking }) {
6437
6901
  const running = pending !== null && pending.id === row.id ? pending : null;
6438
6902
  const locked = pending !== null;
6439
6903
  const [migrationOpen, setMigrationOpen] = (0, react.useState)(false);
6440
6904
  const [dismissOpen, setDismissOpen] = (0, react.useState)(false);
6441
6905
  const quiet = row.workbench === true && row.state === "installed" && row.hint === void 0;
6442
6906
  const actions = marketActions$1(row);
6907
+ const asksAgent = marketAsksAgent(row);
6443
6908
  const switchLocked = marketSwitchLocked(row);
6444
6909
  return /* @__PURE__ */ (0, react.createElement)("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ (0, react.createElement)("span", {
6445
6910
  className: MarketPage_module_default.marketIcon,
@@ -6451,7 +6916,11 @@ function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy }) {
6451
6916
  t,
6452
6917
  row,
6453
6918
  quiet
6454
- })), /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ (0, react.createElement)(Spinner, { size: 14 }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => {
6919
+ })), /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ (0, react.createElement)(Spinner, { size: 14 }), t(PROGRESS_KEY[running.action])) : actions.length === 0 && !asksAgent ? null : /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.marketActions }, asksAgent ? /* @__PURE__ */ (0, react.createElement)(AskAgentButton, {
6920
+ t,
6921
+ text: askAgentText(row, t),
6922
+ label: t("panels.market.askAgent")
6923
+ }) : null, actions.map((action) => {
6455
6924
  const danger = dangerActions.includes(action);
6456
6925
  const update = updateActions.includes(action);
6457
6926
  return /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
@@ -6474,7 +6943,12 @@ function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy }) {
6474
6943
  disabled: boardBusy === true || locked || switchLocked,
6475
6944
  label: `${marketRowTitle(row, t)} · ${t("panels.market.defaultLabel")}`,
6476
6945
  onChange: (next) => onDefault?.(next)
6477
- })))), failure === null ? null : /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketFailure }, failure), /* @__PURE__ */ (0, react.createElement)(MarketLineDialogs, {
6946
+ })))), /* @__PURE__ */ (0, react.createElement)(MarketFailureBlock, {
6947
+ t,
6948
+ failure,
6949
+ onRecheck,
6950
+ rechecking
6951
+ }), /* @__PURE__ */ (0, react.createElement)(MarketLineDialogs, {
6478
6952
  t,
6479
6953
  migrationOpen,
6480
6954
  dismissOpen,
@@ -6490,7 +6964,7 @@ function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy }) {
6490
6964
  }
6491
6965
  }));
6492
6966
  }
6493
- function MarketSection({ t, titleKey, icon, rows, pending, failureOf, act, confirmActions, onConfirming, onDefault, boardBusy, headAction, keepHead }) {
6967
+ function MarketSection({ t, titleKey, icon, rows, pending, failureOf, act, confirmActions, onConfirming, onDefault, boardBusy, headAction, keepHead, onRecheck, rechecking }) {
6494
6968
  if (rows.length === 0 && keepHead !== true) return null;
6495
6969
  return /* @__PURE__ */ (0, react.createElement)("section", { className: MarketPage_module_default.marketSection }, titleKey === void 0 ? null : /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ (0, react.createElement)("span", {
6496
6970
  className: MarketPage_module_default.marketSectionIcon,
@@ -6503,7 +6977,9 @@ function MarketSection({ t, titleKey, icon, rows, pending, failureOf, act, confi
6503
6977
  failure: failureOf(row.id),
6504
6978
  onAct: (action) => confirmActions.includes(action) ? onConfirming(row.id) : void act(row.id, action),
6505
6979
  onDefault: (next) => onDefault?.(row.id, next),
6506
- boardBusy
6980
+ boardBusy,
6981
+ onRecheck,
6982
+ rechecking
6507
6983
  }))));
6508
6984
  }
6509
6985
  //#endregion
@@ -6679,9 +7155,10 @@ var FAILURE_KEYS = {
6679
7155
  "incompatible-version": "panels.market.add.failureGeneric",
6680
7156
  "not-bundle": "panels.market.add.failureGeneric",
6681
7157
  "invalid-spec": "panels.market.add.failureGeneric",
6682
- "bundle-in-use": "panels.market.add.failureGeneric",
7158
+ "bundle-in-use": "panels.market.add.failureStopProfile",
6683
7159
  "not-removable": "panels.market.add.failureGeneric",
6684
- "stop-profile": "panels.market.add.failureGeneric",
7160
+ "stop-profile": "panels.market.add.failureStopProfile",
7161
+ cancelled: "panels.market.add.failureCancelled",
6685
7162
  "stale-approval": "panels.market.add.failureGeneric"
6686
7163
  };
6687
7164
  function needsCredentials(change) {
@@ -6736,6 +7213,14 @@ function changeFailure(change, t) {
6736
7213
  if (change === void 0 || SHIPPED$1.includes(change.application)) return void 0;
6737
7214
  return failureReason(failureCode(change), change.application, t);
6738
7215
  }
7216
+ function appliedUnitsOf(value) {
7217
+ if (changeOf(value)?.application !== "applied") return [];
7218
+ const module = value?.module;
7219
+ if (typeof module !== "object" || module === null) return [];
7220
+ const record = module;
7221
+ if (record.kind !== "module") return [];
7222
+ return typeof record.unit === "string" && record.unit !== "" ? [record.unit] : [];
7223
+ }
6739
7224
  //#endregion
6740
7225
  //#region src/app/layouts/rightbar/market-update-verdict.ts
6741
7226
  function updateVerdictOf(input) {
@@ -6745,6 +7230,7 @@ function updateVerdictOf(input) {
6745
7230
  ...input.restored === void 0 ? {} : { restored: input.restored }
6746
7231
  };
6747
7232
  const installed = input.module?.version;
7233
+ if ((input.change?.application === "failed" || input.change?.application === "cancelled") && input.change?.errorCode !== "no-change") return { kind: "failed" };
6748
7234
  if (input.change?.errorCode === "no-change") return { kind: "no-change" };
6749
7235
  if (installed === void 0) return { kind: "ok" };
6750
7236
  if (input.clicked !== void 0 && installed === input.clicked) return { kind: "no-change" };
@@ -6791,6 +7277,10 @@ function restoredOf(value) {
6791
7277
  const restored = recordOf(value)?.restored;
6792
7278
  return typeof restored === "string" && restored !== "" ? restored : void 0;
6793
7279
  }
7280
+ function remedyOf(value) {
7281
+ const command = recordOf(recordOf(value)?.remedy)?.command;
7282
+ return typeof command === "string" && command !== "" ? { command } : void 0;
7283
+ }
6794
7284
  function marketActOf(options) {
6795
7285
  const { t, mocked, rowOf, seats, send, onChanged } = options;
6796
7286
  return async (id, action) => {
@@ -6850,7 +7340,8 @@ function marketActOf(options) {
6850
7340
  seats.setHeld(void 0);
6851
7341
  seats.setFailed({
6852
7342
  id,
6853
- message: t("panels.market.failed", { reason: outcome.message })
7343
+ message: t("panels.market.failed", { reason: outcome.message }),
7344
+ ...outcome.failure === void 0 ? {} : { failure: outcome.failure }
6854
7345
  });
6855
7346
  return;
6856
7347
  }
@@ -6871,24 +7362,33 @@ function marketActOf(options) {
6871
7362
  return;
6872
7363
  }
6873
7364
  const change = changeOf(value);
6874
- const failure = updateVerdictText(updateVerdictOf({
7365
+ const remedy = remedyOf(value);
7366
+ const verdict = updateVerdictOf({
6875
7367
  action,
6876
7368
  change,
6877
7369
  module: moduleOf(value),
6878
7370
  restored: restoredOf(value),
6879
7371
  clicked: next.version,
6880
7372
  latest: next.latest
6881
- }), t, {
7373
+ });
7374
+ const failure = updateVerdictText(verdict, t, {
6882
7375
  ...next.version === void 0 ? {} : { from: next.version },
6883
7376
  ...next.latest === void 0 ? {} : { latest: next.latest }
6884
7377
  });
7378
+ const cardOf = (fact) => remedy === void 0 || verdict.kind !== "no-change" && verdict.kind !== "failed" ? {} : { card: updateStuckCardOf(t, {
7379
+ command: remedy.command,
7380
+ ...fact === void 0 ? {} : { fact },
7381
+ ...next.version === void 0 ? {} : { from: next.version },
7382
+ ...next.latest === void 0 ? {} : { latest: next.latest }
7383
+ }) };
6885
7384
  onChanged({ force: true });
6886
7385
  if (failure !== void 0) {
6887
7386
  seats.setPending(null);
6888
7387
  seats.setHeld(void 0);
6889
7388
  seats.setFailed({
6890
7389
  id,
6891
- message: failure
7390
+ message: failure,
7391
+ ...cardOf()
6892
7392
  });
6893
7393
  return;
6894
7394
  }
@@ -6903,7 +7403,8 @@ function marketActOf(options) {
6903
7403
  const reason = changeFailure(change, t);
6904
7404
  if (reason !== void 0) seats.setFailed({
6905
7405
  id,
6906
- message: t("panels.market.failed", { reason })
7406
+ message: t("panels.market.failed", { reason }),
7407
+ ...cardOf(reason)
6907
7408
  });
6908
7409
  };
6909
7410
  }
@@ -6981,43 +7482,59 @@ var market_check_module_default = {
6981
7482
  };
6982
7483
  //#endregion
6983
7484
  //#region src/app/layouts/market/market-check.tsx
6984
- function MarketCheck({ t, checkedAt, checking, failed, disabled, onCheck }) {
6985
- const status = checking ? t("panels.market.checkingNow") : failed ? t("panels.market.checkFailed") : checkedAt === null ? null : t("panels.market.checkedAt", { time: checkedAgo(checkedAt, t) });
6986
- return /* @__PURE__ */ (0, react.createElement)("span", { className: market_check_module_default.check }, status === null ? null : /* @__PURE__ */ (0, react.createElement)("span", {
6987
- className: market_check_module_default.status,
6988
- "aria-live": "polite"
6989
- }, status), /* @__PURE__ */ (0, react.createElement)(Tip, { label: t("panels.market.checkUpdates") }, /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7485
+ function MarketRefreshButton({ label, checking, disabled, onCheck }) {
7486
+ return /* @__PURE__ */ (0, react.createElement)(Tip, { label }, /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
6990
7487
  type: "button",
6991
7488
  variant: "ghost",
6992
7489
  size: "sm",
6993
7490
  className: market_check_module_default.button,
6994
- "aria-label": t("panels.market.checkUpdates"),
7491
+ "aria-label": label,
6995
7492
  disabled: disabled || checking,
6996
7493
  icon: /* @__PURE__ */ (0, react.createElement)("span", {
6997
7494
  className: `${market_check_module_default.icon}${checking ? " wb-spinning" : ""}`,
6998
7495
  "aria-hidden": "true"
6999
7496
  }, /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutlineRegular, { size: 14 })),
7000
7497
  onClick: onCheck
7001
- })));
7498
+ }));
7499
+ }
7500
+ function MarketCheck({ t, checkedAt, latestCheck = {
7501
+ checked: 0,
7502
+ unknown: 0
7503
+ }, checking, failed, disabled, onCheck }) {
7504
+ const parts = [];
7505
+ if (checking) parts.push(t("panels.market.checkingNow"));
7506
+ else {
7507
+ if (latestCheck.checked > 0 && checkedAt !== null) parts.push(t("panels.market.checkedAt", { time: checkedAgo(checkedAt, t) }));
7508
+ if (failed) parts.push(t("panels.market.checkFailed"));
7509
+ else if (latestCheck.unknown > 0) parts.push(t("panels.market.latestPartial", { n: String(latestCheck.unknown) }));
7510
+ }
7511
+ const status = parts.length === 0 ? null : parts.join(" · ");
7512
+ return /* @__PURE__ */ (0, react.createElement)("span", { className: market_check_module_default.check }, status === null ? null : /* @__PURE__ */ (0, react.createElement)("span", {
7513
+ className: market_check_module_default.status,
7514
+ "aria-live": "polite"
7515
+ }, status), /* @__PURE__ */ (0, react.createElement)(MarketRefreshButton, {
7516
+ label: t("panels.market.checkUpdates"),
7517
+ checking,
7518
+ disabled,
7519
+ onCheck
7520
+ }));
7002
7521
  }
7003
- var PanelFoot_module_default = {
7004
- foot: "_foot_1ud1j_1",
7005
- footText: "_footText_1ud1j_13",
7006
- footTextMd: "_footTextMd_1ud1j_18"
7007
- };
7008
7522
  //#endregion
7009
- //#region src/shared/components/PanelFoot.tsx
7010
- function PanelFoot({ text, size = "sm", children }) {
7011
- return /* @__PURE__ */ (0, react.createElement)("footer", { className: PanelFoot_module_default.foot }, text === void 0 ? null : /* @__PURE__ */ (0, react.createElement)("span", { className: size === "md" ? PanelFoot_module_default.footTextMd : PanelFoot_module_default.footText }, text), children ?? null);
7523
+ //#region src/app/layouts/market/section-check.tsx
7524
+ function SectionCheck({ t, part, seat, latest, disabled, onCheck }) {
7525
+ const { busy } = useVisibleBusy(seat.checking, 500);
7526
+ return /* @__PURE__ */ (0, react.createElement)(MarketCheck, {
7527
+ t,
7528
+ checkedAt: seat.checkedAt,
7529
+ latestCheck: latest,
7530
+ checking: busy,
7531
+ failed: seat.failed,
7532
+ disabled,
7533
+ onCheck: () => onCheck?.(part)
7534
+ });
7012
7535
  }
7013
7536
  //#endregion
7014
- //#region src/app/layouts/rightbar/MarketView.tsx
7015
- var CONFIRM_UNINSTALL = [
7016
- "uninstall",
7017
- "remove-bundle",
7018
- "uninstall-plugin"
7019
- ];
7020
- var NO_ROWS = [];
7537
+ //#region src/app/layouts/rightbar/market-uninstall.tsx
7021
7538
  function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
7022
7539
  const [acknowledged, setAcknowledged] = (0, react.useState)(false);
7023
7540
  return /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.RiskConfirmation, {
@@ -7034,8 +7551,47 @@ function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
7034
7551
  onConfirm
7035
7552
  });
7036
7553
  }
7037
- function MarketBody({ t, self, shown, pluginList, installedList, shared, pending, failed, notice, act, onConfirming, setDefault, boardBusy, check }) {
7038
- const failureOf = (id) => failed?.id === id ? failed.message : null;
7554
+ function UninstallConfirm({ t, confirming, row, onClose, act, rowById }) {
7555
+ return /* @__PURE__ */ (0, react.createElement)(ConfirmUninstall, {
7556
+ key: confirming ?? "",
7557
+ t,
7558
+ name: row === void 0 ? null : marketRowTitle(row, t),
7559
+ onCancel: onClose,
7560
+ onConfirm: () => {
7561
+ const id = confirming;
7562
+ onClose();
7563
+ if (id === null) return;
7564
+ const target = rowById.get(id);
7565
+ act(id, target?.plugin === true ? "uninstall-plugin" : target?.pkg === void 0 ? "uninstall" : "remove-bundle");
7566
+ }
7567
+ });
7568
+ }
7569
+ var PanelFoot_module_default = {
7570
+ foot: "_foot_1ud1j_1",
7571
+ footText: "_footText_1ud1j_13",
7572
+ footTextMd: "_footTextMd_1ud1j_18"
7573
+ };
7574
+ //#endregion
7575
+ //#region src/shared/components/PanelFoot.tsx
7576
+ function PanelFoot({ text, size = "sm", children }) {
7577
+ return /* @__PURE__ */ (0, react.createElement)("footer", { className: PanelFoot_module_default.foot }, text === void 0 ? null : /* @__PURE__ */ (0, react.createElement)("span", { className: size === "md" ? PanelFoot_module_default.footTextMd : PanelFoot_module_default.footText }, text), children ?? null);
7578
+ }
7579
+ //#endregion
7580
+ //#region src/app/layouts/rightbar/MarketView.tsx
7581
+ var CONFIRM_UNINSTALL = [
7582
+ "uninstall",
7583
+ "remove-bundle",
7584
+ "uninstall-plugin"
7585
+ ];
7586
+ var NO_CHECK = {
7587
+ checking: false,
7588
+ failed: false,
7589
+ checkedAt: null
7590
+ };
7591
+ var NO_ROWS = [];
7592
+ var NO_UNITS$1 = /* @__PURE__ */ new Set();
7593
+ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending, failed, notice, act, onConfirming, setDefault, boardBusy, checks, onRecheck, rechecking }) {
7594
+ const failureOf = (id) => failed?.id === id ? failed : null;
7039
7595
  const foot = marketFootVisible(shown, installedList);
7040
7596
  const sections = marketSections(marketOrder([...shown, ...installedList], (row) => marketRowTitle(row, t)));
7041
7597
  const installed = sections.find((section) => section.id === "installed");
@@ -7049,7 +7605,9 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
7049
7605
  failureOf,
7050
7606
  act,
7051
7607
  confirmActions: CONFIRM_UNINSTALL,
7052
- onConfirming
7608
+ onConfirming,
7609
+ onRecheck,
7610
+ rechecking
7053
7611
  }), self === void 0 ? null : /* @__PURE__ */ (0, react.createElement)("div", {
7054
7612
  className: MarketPage_module_default.marketSelfDivider,
7055
7613
  "aria-hidden": "true"
@@ -7059,14 +7617,16 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
7059
7617
  icon: marketSectionIcon("installed"),
7060
7618
  rows: installed?.rows ?? NO_ROWS,
7061
7619
  keepHead: true,
7062
- headAction: check,
7620
+ headAction: checks.modules,
7063
7621
  onDefault: setDefault,
7064
7622
  boardBusy,
7065
7623
  pending,
7066
7624
  failureOf,
7067
7625
  act,
7068
7626
  confirmActions: CONFIRM_UNINSTALL,
7069
- onConfirming
7627
+ onConfirming,
7628
+ onRecheck,
7629
+ rechecking
7070
7630
  }), pendingSection === void 0 ? null : /* @__PURE__ */ (0, react.createElement)(MarketSection, {
7071
7631
  t,
7072
7632
  titleKey: pendingSection.titleKey,
@@ -7078,20 +7638,24 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
7078
7638
  failureOf,
7079
7639
  act,
7080
7640
  confirmActions: CONFIRM_UNINSTALL,
7081
- onConfirming
7641
+ onConfirming,
7642
+ onRecheck,
7643
+ rechecking
7082
7644
  }), /* @__PURE__ */ (0, react.createElement)(MarketSection, {
7083
7645
  t,
7084
7646
  titleKey: "panels.market.sectionPlugins",
7085
7647
  icon: marketSectionIcon("plugins"),
7086
7648
  rows: pluginList,
7087
- headAction: check,
7649
+ headAction: checks.plugins,
7088
7650
  onDefault: setDefault,
7089
7651
  boardBusy,
7090
7652
  pending,
7091
7653
  failureOf,
7092
7654
  act,
7093
7655
  confirmActions: CONFIRM_UNINSTALL,
7094
- onConfirming
7656
+ onConfirming,
7657
+ onRecheck,
7658
+ rechecking
7095
7659
  }), foot ? /* @__PURE__ */ (0, react.createElement)(PanelFoot, {
7096
7660
  size: "md",
7097
7661
  text: t("panels.market.foot")
@@ -7100,11 +7664,13 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
7100
7664
  rows: shared,
7101
7665
  pending,
7102
7666
  failureOf,
7103
- act
7667
+ act,
7668
+ onRecheck,
7669
+ rechecking
7104
7670
  }));
7105
7671
  }
7106
7672
  function useMarketScene(input) {
7107
- const { t, titleOf, manifests, installable, capabilities, updates, installed, settling, mock, defaults, changed, pending, failed } = input;
7673
+ const { t, titleOf, manifests, installable, capabilities, updates, installed, settling, installing, mock, defaults, changed, pending, failed } = input;
7108
7674
  const names = marketNamesOf(t, installed ?? [], titleOf, mock !== void 0);
7109
7675
  const catalog = mock?.manifests ?? manifests;
7110
7676
  const marketable = mock === void 0 ? marketCatalog(manifests, installable) : catalog;
@@ -7112,7 +7678,10 @@ function useMarketScene(input) {
7112
7678
  const source = liveManifests(marketable, effective, installedIdSet(mock === void 0 ? installed : void 0));
7113
7679
  const byDefault = new Set(defaults);
7114
7680
  const updateMap = mock?.updates ?? updates ?? {};
7115
- const rows = marketRows(source, effective, updateMap, byDefault, changed);
7681
+ const rows = checkingRows(marketRows(source, effective, updateMap, byDefault, changed), {
7682
+ all: installing,
7683
+ units: settling ?? NO_UNITS$1
7684
+ });
7116
7685
  const shared = sharedRows(source, effective);
7117
7686
  const removing = removingIdOf(pending, failed);
7118
7687
  const steady = useHeldRow(pending, (id) => catalog.some((manifest) => manifest.id === id));
@@ -7133,7 +7702,27 @@ function useMarketScene(input) {
7133
7702
  busyId
7134
7703
  };
7135
7704
  }
7136
- function MarketView({ t, titleOf, manifests, installable, capabilities, freshness, onChanged, onPending, updates, updatesCheckedAt = null, updatesFailed = false, installed, installedRead, workbench, selfUpdate, plugins, settling, mock, defaults = [], changed = {} }) {
7705
+ function sectionChecksOf(input) {
7706
+ return {
7707
+ modules: /* @__PURE__ */ (0, react.createElement)(SectionCheck, {
7708
+ t: input.t,
7709
+ part: "modules",
7710
+ seat: input.modules ?? NO_CHECK,
7711
+ latest: input.latestModules,
7712
+ disabled: input.disabled,
7713
+ onCheck: input.onCheck
7714
+ }),
7715
+ plugins: /* @__PURE__ */ (0, react.createElement)(SectionCheck, {
7716
+ t: input.t,
7717
+ part: "plugins",
7718
+ seat: input.plugins ?? NO_CHECK,
7719
+ latest: input.latestPlugins,
7720
+ disabled: input.disabled,
7721
+ onCheck: input.onCheck
7722
+ })
7723
+ };
7724
+ }
7725
+ function MarketView({ t, titleOf, manifests, installable, capabilities, freshness, onChanged, onPending, updates, modulesCheck, pluginsCheck, onCheck, installed, installedRead, workbench, selfUpdate, plugins, settling, installing = false, mock, defaults = [], changed = {} }) {
7137
7726
  const { pending, setPending, confirming, setConfirming, failed, setFailed, notice, setNotice } = useMarketTransient({
7138
7727
  mock,
7139
7728
  onPending
@@ -7147,6 +7736,7 @@ function MarketView({ t, titleOf, manifests, installable, capabilities, freshnes
7147
7736
  updates,
7148
7737
  installed,
7149
7738
  settling,
7739
+ installing,
7150
7740
  mock,
7151
7741
  defaults,
7152
7742
  changed,
@@ -7213,13 +7803,21 @@ function MarketView({ t, titleOf, manifests, installable, capabilities, freshnes
7213
7803
  const settled = marketSettled(freshness, installedRead);
7214
7804
  const nothing = shown.length === 0 && self === void 0 && installedList.length === 0 && pluginList.length === 0;
7215
7805
  const { busy: checkingShown } = useVisibleBusy(freshness.checking, 500);
7216
- const check = /* @__PURE__ */ (0, react.createElement)(MarketCheck, {
7806
+ const recheck = () => {
7807
+ setFailed(null);
7808
+ if (mock === void 0) onChanged({ force: true });
7809
+ };
7810
+ const checks = sectionChecksOf({
7217
7811
  t,
7218
- checkedAt: updatesCheckedAt,
7219
- checking: checkingShown,
7220
- failed: updatesFailed,
7812
+ modules: modulesCheck,
7813
+ plugins: pluginsCheck,
7814
+ latestModules: latestCheckSummary(mock?.installed ?? installed),
7815
+ latestPlugins: {
7816
+ checked: checkedPluginCount(mock?.plugins ?? plugins),
7817
+ unknown: 0
7818
+ },
7221
7819
  disabled: pending !== null,
7222
- onCheck: () => onChanged({ force: true })
7820
+ onCheck: mock === void 0 ? onCheck : void 0
7223
7821
  });
7224
7822
  if (!settled || (settling?.size ?? 0) > 0 && shown.length === 0 && installedList.length === 0) return /* @__PURE__ */ (0, react.createElement)(MarketChecking, { t });
7225
7823
  if (nothing) return /* @__PURE__ */ (0, react.createElement)(MarketEmpty, { t });
@@ -7237,7 +7835,9 @@ function MarketView({ t, titleOf, manifests, installable, capabilities, freshnes
7237
7835
  onConfirming: setConfirming,
7238
7836
  setDefault,
7239
7837
  boardBusy,
7240
- check
7838
+ checks,
7839
+ onRecheck: recheck,
7840
+ rechecking: checkingShown
7241
7841
  }), /* @__PURE__ */ (0, react.createElement)(UninstallConfirm, {
7242
7842
  t,
7243
7843
  confirming,
@@ -7247,21 +7847,6 @@ function MarketView({ t, titleOf, manifests, installable, capabilities, freshnes
7247
7847
  rowById
7248
7848
  }));
7249
7849
  }
7250
- function UninstallConfirm({ t, confirming, row, onClose, act, rowById }) {
7251
- return /* @__PURE__ */ (0, react.createElement)(ConfirmUninstall, {
7252
- key: confirming ?? "",
7253
- t,
7254
- name: row === void 0 ? null : marketRowTitle(row, t),
7255
- onCancel: onClose,
7256
- onConfirm: () => {
7257
- const id = confirming;
7258
- onClose();
7259
- if (id === null) return;
7260
- const target = rowById.get(id);
7261
- act(id, target?.plugin === true ? "uninstall-plugin" : target?.pkg === void 0 ? "uninstall" : "remove-bundle");
7262
- }
7263
- });
7264
- }
7265
7850
  //#endregion
7266
7851
  //#region ../../node_modules/.pnpm/dayjs@1.11.23/node_modules/dayjs/plugin/localizedFormat.js
7267
7852
  var require_localizedFormat = /* @__PURE__ */ __commonJSMin(((exports, module) => {
@@ -8570,6 +9155,8 @@ function useDiscover(t, active, onInstalled) {
8570
9155
  const [addingSource, setAddingSource] = (0, react.useState)(false);
8571
9156
  const [pendingSourceId, setPendingSourceId] = (0, react.useState)(null);
8572
9157
  const [knownSources, setKnownSources] = (0, react.useState)(null);
9158
+ const [installToken] = (0, react.useState)(() => `market-install:${globalThis.crypto.randomUUID()}`);
9159
+ usePublishMarketInstalling(installToken, installing !== null);
8573
9160
  const loaded = (0, react.useRef)(false);
8574
9161
  const loadTicket = (0, react.useRef)(0);
8575
9162
  const sourceTicket = (0, react.useRef)(0);
@@ -8679,7 +9266,7 @@ function useDiscover(t, active, onInstalled) {
8679
9266
  if (selectedSource === void 0 || selectedSource.kind !== "git") return null;
8680
9267
  if (kind !== "git-empty" && kind !== "git-missing-index") return null;
8681
9268
  return {
8682
- path: selectedSource.path ?? "market.json",
9269
+ path: selectedSource.path ?? "market",
8683
9270
  empty: kind === "git-empty"
8684
9271
  };
8685
9272
  }, [payload, selectedSource]);
@@ -8822,6 +9409,7 @@ function useDiscover(t, active, onInstalled) {
8822
9409
  ...target.registry === void 0 ? {} : { registry: target.registry }
8823
9410
  }).then((outcome) => {
8824
9411
  if (!outcome.ok) return;
9412
+ publishMarketApplied(appliedUnitsOf(outcome.value));
8825
9413
  const verdict = installVerdictOf(outcome.value, t);
8826
9414
  if (verdict.kind === "failed") {
8827
9415
  provision.fail(verdict.text);
@@ -9033,7 +9621,7 @@ function DiscoverPanel({ t, active, onInstalled, onShowInstalled }) {
9033
9621
  }
9034
9622
  //#endregion
9035
9623
  //#region src/app/layouts/market/market-header.tsx
9036
- function MarketHeader({ t, idPrefix, tab, busy, onTab, onAdd }) {
9624
+ function MarketHeader({ t, idPrefix, tab, busy, checking, onTab, onReload, onAdd }) {
9037
9625
  const tabItems = (0, react.useMemo)(() => [{
9038
9626
  value: "installed",
9039
9627
  label: t("panels.market.tabInstalled"),
@@ -9045,14 +9633,19 @@ function MarketHeader({ t, idPrefix, tab, busy, onTab, onAdd }) {
9045
9633
  id: `${idPrefix}-tab-discover`,
9046
9634
  panelId: `${idPrefix}-panel-discover`
9047
9635
  }], [idPrefix, t]);
9048
- return /* @__PURE__ */ (0, react.createElement)(react.Fragment, null, /* @__PURE__ */ (0, react.createElement)("header", { className: MarketPage_module_default.marketPageHead }, /* @__PURE__ */ (0, react.createElement)("div", null, /* @__PURE__ */ (0, react.createElement)("h1", { className: MarketPage_module_default.marketPageTitle }, t("panels.tab.market")), /* @__PURE__ */ (0, react.createElement)("p", { className: MarketPage_module_default.marketPageIntro }, t("panels.market.lead"))), /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketPageTools }, tab !== "installed" ? null : /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
9636
+ return /* @__PURE__ */ (0, react.createElement)(react.Fragment, null, /* @__PURE__ */ (0, react.createElement)("header", { className: MarketPage_module_default.marketPageHead }, /* @__PURE__ */ (0, react.createElement)("div", null, /* @__PURE__ */ (0, react.createElement)("h1", { className: MarketPage_module_default.marketPageTitle }, t("panels.tab.market")), /* @__PURE__ */ (0, react.createElement)("p", { className: MarketPage_module_default.marketPageIntro }, t("panels.market.lead"))), /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketPageTools }, tab !== "installed" ? null : /* @__PURE__ */ (0, react.createElement)(react.Fragment, null, /* @__PURE__ */ (0, react.createElement)(MarketRefreshButton, {
9637
+ label: t("panels.market.checkAll"),
9638
+ checking,
9639
+ disabled: busy,
9640
+ onCheck: onReload
9641
+ }), /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
9049
9642
  variant: "primary",
9050
9643
  size: "sm",
9051
9644
  className: MarketPage_module_default.marketAddButton,
9052
9645
  icon: /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutlineRegular, { size: 13 }),
9053
9646
  disabled: busy,
9054
9647
  onClick: onAdd
9055
- }, t("panels.market.add.open")))), /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketTabs }, /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.SegmentedTabs, {
9648
+ }, t("panels.market.add.open"))))), /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketTabs }, /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.SegmentedTabs, {
9056
9649
  className: MarketPage_module_default.marketTabList,
9057
9650
  items: tabItems,
9058
9651
  value: tab,
@@ -9469,21 +10062,35 @@ function readModuleVersions(force = false) {
9469
10062
  function readInstalledPlugins(force = false) {
9470
10063
  return apiGet(INSTALLED_PLUGINS_ROUTE, force ? { force: "1" } : void 0);
9471
10064
  }
10065
+ //#endregion
10066
+ //#region src/app/layouts/market/use-module-versions.ts
10067
+ var IDLE$1 = {
10068
+ checking: false,
10069
+ failed: false,
10070
+ checkedAt: null
10071
+ };
9472
10072
  var state = {
9473
10073
  modules: null,
9474
10074
  plugins: null,
9475
10075
  workbench: null,
9476
10076
  selfUpdate: null,
9477
10077
  read: false,
9478
- checking: false,
9479
- failed: false,
9480
- checkedAt: null
10078
+ allChecking: false,
10079
+ modulesCheck: IDLE$1,
10080
+ pluginsCheck: IDLE$1
9481
10081
  };
9482
10082
  var listeners$2 = /* @__PURE__ */ new Set();
9483
- var inFlight = null;
9484
- var readSeq = 0;
9485
- var newestForceSeq = -1;
10083
+ var inFlight = /* @__PURE__ */ new Map();
10084
+ var seq$1 = {
10085
+ modules: 0,
10086
+ plugins: 0
10087
+ };
10088
+ var newestForceSeq = {
10089
+ modules: -1,
10090
+ plugins: -1
10091
+ };
9486
10092
  var epoch = 0;
10093
+ var allSeq = 0;
9487
10094
  function bumpModuleVersionsEpoch() {
9488
10095
  epoch += 1;
9489
10096
  }
@@ -9508,48 +10115,87 @@ function withMarketUpdates(modules, rows) {
9508
10115
  };
9509
10116
  });
9510
10117
  }
10118
+ function moduleVersionsCheckedAt(now) {
10119
+ const at = [now.modulesCheck.checkedAt, now.pluginsCheck.checkedAt].filter((one) => one !== null);
10120
+ return at.length === 0 ? null : Math.max(...at);
10121
+ }
10122
+ function moduleVersionsChecking(value) {
10123
+ return value.allChecking || value.modulesCheck.checking || value.pluginsCheck.checking;
10124
+ }
9511
10125
  function publish$1(next) {
9512
10126
  state = next;
9513
10127
  for (const listener of [...listeners$2]) listener();
9514
10128
  }
9515
- function runModuleVersionsRead(force = false, fresh = false) {
9516
- const at = epoch;
9517
- if (!fresh && inFlight !== null && inFlight.force === force && inFlight.epoch === at) return inFlight.promise;
9518
- const seq = readSeq += 1;
9519
- if (force) newestForceSeq = seq;
9520
- if (!state.checking) publish$1({
9521
- ...state,
10129
+ function partsOf(scope) {
10130
+ return scope === "all" ? ["modules", "plugins"] : [scope];
10131
+ }
10132
+ function checking(scope) {
10133
+ const mark = (seat) => seat.checking ? seat : {
10134
+ ...seat,
9522
10135
  checking: true
9523
- });
9524
- const promise = Promise.all([
9525
- readModuleVersions(force),
9526
- readInstalledPlugins(force),
9527
- readMarketInstalled()
9528
- ]).catch(() => null).then((responses) => {
10136
+ };
10137
+ return {
10138
+ ...state,
10139
+ allChecking: scope === "all" || state.allChecking,
10140
+ modulesCheck: scope === "plugins" ? state.modulesCheck : mark(state.modulesCheck),
10141
+ pluginsCheck: scope === "modules" ? state.pluginsCheck : mark(state.pluginsCheck)
10142
+ };
10143
+ }
10144
+ function landed(seat, ticket, latest, ok, at) {
10145
+ return {
10146
+ checking: ticket === latest ? false : seat.checking,
10147
+ failed: !ok,
10148
+ checkedAt: ok ? at : seat.checkedAt
10149
+ };
10150
+ }
10151
+ function readModulesOnce(force) {
10152
+ return Promise.all([readModuleVersions(force), readMarketInstalled()]).catch(() => null);
10153
+ }
10154
+ function readPluginsOnce(force) {
10155
+ return readInstalledPlugins(force).catch(() => null);
10156
+ }
10157
+ function runModuleVersionsRead(force = false, fresh = false, scope = "all") {
10158
+ const at = epoch;
10159
+ const running = inFlight.get(scope);
10160
+ if (!fresh && running !== void 0 && running.force === force && running.epoch === at) return running.promise;
10161
+ const allTicket = scope === "all" ? allSeq += 1 : allSeq;
10162
+ const tickets = /* @__PURE__ */ new Map();
10163
+ for (const part of partsOf(scope)) {
10164
+ const ticket = seq$1[part] += 1;
10165
+ tickets.set(part, ticket);
10166
+ if (force) newestForceSeq[part] = ticket;
10167
+ }
10168
+ publish$1(checking(scope));
10169
+ const modulesRead = tickets.has("modules") ? readModulesOnce(force) : null;
10170
+ const pluginsRead = tickets.has("plugins") ? readPluginsOnce(force) : null;
10171
+ const promise = Promise.all([modulesRead, pluginsRead]).then(([modules, plugins]) => {
9529
10172
  if (at !== epoch) return;
9530
- if (!force && seq < newestForceSeq) return;
9531
- const versions = responses?.[0];
9532
- const plugins = responses?.[1];
9533
- const market = responses?.[2];
9534
- const read = versions?.ok === true;
10173
+ const now = Date.now();
10174
+ const modulesTicket = tickets.get("modules");
10175
+ const pluginsTicket = tickets.get("plugins");
10176
+ const modulesLanded = modulesTicket !== void 0 && (force || modulesTicket >= newestForceSeq.modules);
10177
+ const pluginsLanded = pluginsTicket !== void 0 && (force || pluginsTicket >= newestForceSeq.plugins);
10178
+ const modulesOk = modulesLanded && modules !== null && modules[0].ok === true;
10179
+ const pluginsOk = pluginsLanded && plugins !== null && plugins.ok === true;
9535
10180
  publish$1({
9536
- modules: read ? withMarketUpdates(versions.modules, market?.ok === true ? market.modules : []) : state.modules,
9537
- plugins: plugins?.ok === true ? plugins.plugins : state.plugins,
9538
- workbench: read ? versions.workbench ?? null : state.workbench,
9539
- selfUpdate: read ? versions.selfUpdate ?? null : state.selfUpdate,
10181
+ ...state,
10182
+ modules: modulesOk ? withMarketUpdates(modules[0].modules, modules[1].ok === true ? modules[1].modules : []) : state.modules,
10183
+ workbench: modulesOk ? modules[0].workbench ?? null : state.workbench,
10184
+ selfUpdate: modulesOk ? modules[0].selfUpdate ?? null : state.selfUpdate,
10185
+ plugins: pluginsOk ? plugins.plugins : state.plugins,
9540
10186
  read: true,
9541
- checking: false,
9542
- failed: !read,
9543
- checkedAt: read ? Date.now() : state.checkedAt
10187
+ allChecking: scope === "all" && allTicket === allSeq ? false : state.allChecking,
10188
+ modulesCheck: modulesLanded && modulesTicket !== void 0 ? landed(state.modulesCheck, modulesTicket, seq$1.modules, modulesOk, now) : state.modulesCheck,
10189
+ pluginsCheck: pluginsLanded && pluginsTicket !== void 0 ? landed(state.pluginsCheck, pluginsTicket, seq$1.plugins, pluginsOk, now) : state.pluginsCheck
9544
10190
  });
9545
10191
  }).finally(() => {
9546
- if (inFlight?.promise === promise) inFlight = null;
10192
+ if (inFlight.get(scope)?.promise === promise) inFlight.delete(scope);
9547
10193
  });
9548
- inFlight = {
10194
+ inFlight.set(scope, {
9549
10195
  force,
9550
10196
  epoch: at,
9551
10197
  promise
9552
- };
10198
+ });
9553
10199
  return promise;
9554
10200
  }
9555
10201
  function useModuleVersions() {
@@ -9560,27 +10206,70 @@ function useModuleVersions() {
9560
10206
  const first = !mountedRef.current;
9561
10207
  mountedRef.current = true;
9562
10208
  if (first && !shouldProbeOnEnter({
9563
- checkedAt: state.checkedAt,
10209
+ checkedAt: moduleVersionsCheckedAt(state),
9564
10210
  now: Date.now(),
9565
10211
  staleMs: MARKET_STALE_MS
9566
10212
  })) return;
9567
10213
  runModuleVersionsRead(false);
9568
10214
  }, [factRev]);
9569
10215
  const reload = (0, react.useCallback)((options) => {
9570
- runModuleVersionsRead(options?.force === true, options?.fresh === true);
10216
+ runModuleVersionsRead(options?.force === true, options?.fresh === true, options?.scope ?? "all");
9571
10217
  }, []);
9572
10218
  return {
9573
- modules: value.modules,
9574
- plugins: value.plugins,
9575
- workbench: value.workbench,
9576
- selfUpdate: value.selfUpdate,
9577
- read: value.read,
9578
- checking: value.checking,
9579
- failed: value.failed,
9580
- checkedAt: value.checkedAt,
10219
+ ...value,
10220
+ checking: moduleVersionsChecking(value),
9581
10221
  reload
9582
10222
  };
9583
10223
  }
10224
+ //#endregion
10225
+ //#region src/app/layouts/market/use-market-reload.ts
10226
+ function useMarketReload(input) {
10227
+ const { checkedAt, forceProbe, reloadCapability, reloadVersions } = input;
10228
+ const reload = (0, react.useCallback)((options) => {
10229
+ if (options?.force === true) {
10230
+ bumpModuleVersionsEpoch();
10231
+ bumpCapabilityEpoch();
10232
+ forceProbe();
10233
+ reloadVersions({
10234
+ force: true,
10235
+ fresh: true
10236
+ });
10237
+ return;
10238
+ }
10239
+ reloadCapability();
10240
+ reloadVersions();
10241
+ }, [
10242
+ reloadCapability,
10243
+ reloadVersions,
10244
+ forceProbe
10245
+ ]);
10246
+ const checkPart = (0, react.useCallback)((part) => reloadVersions({
10247
+ force: true,
10248
+ fresh: true,
10249
+ scope: part
10250
+ }), [reloadVersions]);
10251
+ const enteredRef = (0, react.useRef)(false);
10252
+ (0, react.useEffect)(() => {
10253
+ if (enteredRef.current) return;
10254
+ enteredRef.current = true;
10255
+ reloadVersions();
10256
+ if (!shouldProbeOnEnter({
10257
+ checkedAt,
10258
+ now: Date.now(),
10259
+ staleMs: MARKET_STALE_MS
10260
+ })) return;
10261
+ markNextProbeSilent();
10262
+ forceProbe();
10263
+ }, [
10264
+ checkedAt,
10265
+ forceProbe,
10266
+ reloadVersions
10267
+ ]);
10268
+ return {
10269
+ reload,
10270
+ checkPart
10271
+ };
10272
+ }
9584
10273
  var AddModule_module_default = {
9585
10274
  wide: "_wide_1lv8f_1",
9586
10275
  dialog: "_dialog_1lv8f_8",
@@ -9832,18 +10521,79 @@ function AddModuleResult({ t, state }) {
9832
10521
  }, t("panels.market.add.failed", { reason })) : kind === "restart" ? /* @__PURE__ */ (0, react.createElement)(react.Fragment, null, /* @__PURE__ */ (0, react.createElement)("p", { className: AddModule_module_default.resultWarn }, t("panels.market.add.doneRestart")), why === void 0 ? null : /* @__PURE__ */ (0, react.createElement)("p", { className: AddModule_module_default.resultMeta }, why)) : kind === "quiet" ? null : /* @__PURE__ */ (0, react.createElement)("p", { className: AddModule_module_default.result }, t("panels.market.add.tookEffect")), builds.length === 0 ? null : /* @__PURE__ */ (0, react.createElement)("div", { className: AddModule_module_default.approval }, /* @__PURE__ */ (0, react.createElement)("p", { className: AddModule_module_default.approvalTitle }, t("panels.market.add.approveTitle")), /* @__PURE__ */ (0, react.createElement)("p", { className: AddModule_module_default.approvalText }, t("panels.market.add.approveHint", { packages: builds.join("、") })), /* @__PURE__ */ (0, react.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__ */ (0, react.createElement)("p", { className: supplyTone(outcome.supply.state) }, t(supply, { reason: outcome.supply.reason ?? "" })), state.failure === null ? null : /* @__PURE__ */ (0, react.createElement)("p", { className: AddModule_module_default.problem }, state.failure), outcome.change.errorDetail === void 0 ? null : /* @__PURE__ */ (0, react.createElement)(react.Fragment, null, /* @__PURE__ */ (0, react.createElement)("p", { className: AddModule_module_default.detailLabel }, t("panels.market.add.details")), /* @__PURE__ */ (0, react.createElement)("p", { className: AddModule_module_default.detail }, outcome.change.errorDetail)));
9833
10522
  }
9834
10523
  //#endregion
10524
+ //#region src/app/layouts/market/add-module-registry-prefs.ts
10525
+ var DEFAULT_REGISTRY_CHOICE = {
10526
+ kind: "default",
10527
+ value: ""
10528
+ };
10529
+ function isRegistryKind(value) {
10530
+ return value === "default" || value === "url" || value === "custom";
10531
+ }
10532
+ function parseRegistryChoice(raw) {
10533
+ if (raw === null) return DEFAULT_REGISTRY_CHOICE;
10534
+ let value;
10535
+ try {
10536
+ value = JSON.parse(raw);
10537
+ } catch {
10538
+ return DEFAULT_REGISTRY_CHOICE;
10539
+ }
10540
+ if (typeof value !== "object" || value === null) return DEFAULT_REGISTRY_CHOICE;
10541
+ const record = value;
10542
+ if (!isRegistryKind(record.kind)) return DEFAULT_REGISTRY_CHOICE;
10543
+ if (record.kind === "default") return DEFAULT_REGISTRY_CHOICE;
10544
+ if (record.kind === "custom") return {
10545
+ kind: "custom",
10546
+ value: ""
10547
+ };
10548
+ if (typeof record.value !== "string" || !customRegistryAllowed(record.value)) return DEFAULT_REGISTRY_CHOICE;
10549
+ return {
10550
+ kind: "url",
10551
+ value: record.value.trim()
10552
+ };
10553
+ }
10554
+ function readRegistryPrefs() {
10555
+ const custom = readText(STORAGE_KEY_MARKET_REGISTRY_CUSTOM);
10556
+ return {
10557
+ choice: parseRegistryChoice(readText(STORAGE_KEY_MARKET_REGISTRY)),
10558
+ custom: custom === null ? "" : custom.trim()
10559
+ };
10560
+ }
10561
+ function writeRegistryChoice(choice) {
10562
+ if (choice.kind === "custom") {
10563
+ writeText(STORAGE_KEY_MARKET_REGISTRY, JSON.stringify({
10564
+ kind: "custom",
10565
+ value: ""
10566
+ }));
10567
+ return;
10568
+ }
10569
+ if (choice.kind === "url" && customRegistryAllowed(choice.value)) {
10570
+ writeText(STORAGE_KEY_MARKET_REGISTRY, JSON.stringify({
10571
+ kind: "url",
10572
+ value: choice.value.trim()
10573
+ }));
10574
+ return;
10575
+ }
10576
+ writeText(STORAGE_KEY_MARKET_REGISTRY, JSON.stringify(DEFAULT_REGISTRY_CHOICE));
10577
+ }
10578
+ function writeRegistryCustom(value) {
10579
+ const text = value.trim();
10580
+ writeText(STORAGE_KEY_MARKET_REGISTRY_CUSTOM, text === "" ? null : text);
10581
+ }
10582
+ function reconcileRegistryChoice(choice, choices) {
10583
+ if (choice.kind !== "url") return choice;
10584
+ return choices.some((option) => option.choice.kind === "url" && option.choice.value === choice.value) ? choice : DEFAULT_REGISTRY_CHOICE;
10585
+ }
10586
+ //#endregion
9835
10587
  //#region src/app/layouts/market/use-add-module.ts
9836
10588
  function newRequestId() {
9837
10589
  return crypto.randomUUID();
9838
10590
  }
9839
10591
  function useAddModule(options) {
9840
10592
  const { onInstalled, failedText } = options;
10593
+ const [prefs] = (0, react.useState)(readRegistryPrefs);
9841
10594
  const [spec, setSpec] = (0, react.useState)("");
9842
- const [choice, setChoice] = (0, react.useState)({
9843
- kind: "default",
9844
- value: ""
9845
- });
9846
- const [custom, setCustom] = (0, react.useState)("");
10595
+ const [choice, setChoice] = (0, react.useState)(prefs.choice);
10596
+ const [custom, setCustom] = (0, react.useState)(prefs.custom);
9847
10597
  const [registryOpen, setRegistryOpen] = (0, react.useState)(false);
9848
10598
  const [guideOpen, setGuideOpen] = (0, react.useState)(false);
9849
10599
  const [phase, setPhase] = (0, react.useState)("idle");
@@ -9855,6 +10605,8 @@ function useAddModule(options) {
9855
10605
  const generationRef = (0, react.useRef)(0);
9856
10606
  const requestIdRef = (0, react.useRef)("");
9857
10607
  const { busy: classifying } = useVisibleBusy(phase === "inspecting", 500);
10608
+ const [installToken] = (0, react.useState)(() => `market-install:${newRequestId()}`);
10609
+ usePublishMarketInstalling(installToken, phase === "installing");
9858
10610
  const write = useHostWrite({
9859
10611
  channel: "provision",
9860
10612
  networkText: failedText
@@ -9871,7 +10623,9 @@ function useAddModule(options) {
9871
10623
  let alive = true;
9872
10624
  readBundleRegistries().then((response) => {
9873
10625
  if (!alive) return;
9874
- setChoices(registryOptions(response.ok ? response.registries : null));
10626
+ const options = registryOptions(response.ok ? response.registries : null);
10627
+ setChoices(options);
10628
+ setChoice((previous) => reconcileRegistryChoice(previous, options));
9875
10629
  });
9876
10630
  return () => {
9877
10631
  alive = false;
@@ -9938,6 +10692,7 @@ function useAddModule(options) {
9938
10692
  supply: value.supply,
9939
10693
  ...value.plugin === void 0 ? {} : { plugin: value.plugin }
9940
10694
  });
10695
+ publishMarketApplied(appliedUnitsOf(value));
9941
10696
  setPhase("result");
9942
10697
  if (value.change.application === "applied" || value.change.application === "restart-required") onInstalled();
9943
10698
  });
@@ -9982,6 +10737,14 @@ function useAddModule(options) {
9982
10737
  setPreview(null);
9983
10738
  setPhase("idle");
9984
10739
  }, []);
10740
+ const choose = (0, react.useCallback)((next) => {
10741
+ setChoice(next);
10742
+ writeRegistryChoice(next);
10743
+ }, []);
10744
+ const chooseCustom = (0, react.useCallback)((value) => {
10745
+ setCustom(value);
10746
+ writeRegistryCustom(value);
10747
+ }, []);
9985
10748
  return {
9986
10749
  spec,
9987
10750
  choice,
@@ -9997,10 +10760,8 @@ function useAddModule(options) {
9997
10760
  removing,
9998
10761
  builds: outcome?.change.pendingBuilds ?? [],
9999
10762
  setSpec,
10000
- setChoice: (0, react.useCallback)((next) => {
10001
- setChoice(next);
10002
- }, []),
10003
- setCustom,
10763
+ setChoice: choose,
10764
+ setCustom: chooseCustom,
10004
10765
  toggleRegistry: (0, react.useCallback)(() => setRegistryOpen((value) => !value), []),
10005
10766
  closeRegistry: (0, react.useCallback)(() => setRegistryOpen(false), []),
10006
10767
  toggleGuide: (0, react.useCallback)(() => setGuideOpen((value) => !value), []),
@@ -10149,7 +10910,8 @@ function makeMarketEntryIcon(units) {
10149
10910
  installed: modules === null ? void 0 : withClientRefusals(modules, units.refusals()),
10150
10911
  plugins,
10151
10912
  workbench,
10152
- busy: useMarketBusy()
10913
+ busy: useMarketBusy(),
10914
+ ...useMarketInstallState()
10153
10915
  });
10154
10916
  (0, react.useEffect)(() => {
10155
10917
  publishPanelHint(MARKET_PANEL_ID, hint);
@@ -10164,50 +10926,23 @@ function MarketPanel({ t, units, titleOf }) {
10164
10926
  const manifests = useLiveManifests(units);
10165
10927
  const installable = useInstallableUnits(units);
10166
10928
  const { capabilities, checkedAt, checking, forceProbe, reload: reloadCapability } = useCapabilityMap(0);
10167
- const { modules, plugins, workbench, selfUpdate, checking: versionsChecking, failed: versionsFailed, checkedAt: versionsCheckedAt, read: installedRead, reload: reloadVersions } = useModuleVersions();
10929
+ const { modules, plugins, workbench, selfUpdate, checking: versionsChecking, allChecking: versionsAllChecking, modulesCheck, pluginsCheck, read: installedRead, reload: reloadVersions } = useModuleVersions();
10168
10930
  const machineBoard = useEnabledUnits(0, null);
10931
+ const install = useMarketInstallState();
10169
10932
  const [adding, setAdding] = (0, react.useState)(false);
10170
10933
  const [acting, setActing] = (0, react.useState)(false);
10171
10934
  const [tab, setTab] = (0, react.useState)("installed");
10172
10935
  const openAddModule = (0, react.useCallback)(() => setAdding(true), []);
10173
10936
  const updates = (0, react.useMemo)(() => marketUpdatesOf(modules), [modules]);
10174
10937
  const installed = modules === null ? void 0 : withClientRefusals(modules, units.refusals());
10175
- const reload = (0, react.useCallback)((options) => {
10176
- if (options?.force === true) {
10177
- bumpModuleVersionsEpoch();
10178
- bumpCapabilityEpoch();
10179
- forceProbe();
10180
- reloadVersions({
10181
- force: true,
10182
- fresh: true
10183
- });
10184
- return;
10185
- }
10186
- reloadCapability();
10187
- reloadVersions();
10188
- }, [
10189
- reloadCapability,
10190
- reloadVersions,
10191
- forceProbe
10192
- ]);
10193
- const enteredRef = (0, react.useRef)(false);
10194
- (0, react.useEffect)(() => {
10195
- if (enteredRef.current) return;
10196
- enteredRef.current = true;
10197
- reloadVersions();
10198
- if (!shouldProbeOnEnter({
10199
- checkedAt,
10200
- now: Date.now(),
10201
- staleMs: MARKET_STALE_MS
10202
- })) return;
10203
- markNextProbeSilent();
10204
- forceProbe();
10205
- }, [
10938
+ const { reload, checkPart } = useMarketReload({
10206
10939
  checkedAt,
10207
10940
  forceProbe,
10941
+ reloadCapability,
10208
10942
  reloadVersions
10209
- ]);
10943
+ });
10210
10944
  const settling = useSettlingModules((installed ?? []).map((module) => module.unit).join("|"), manifests.map((manifest) => manifest.id).join("|"), Object.keys(capabilities ?? {}).join("|"));
10945
+ const held = install.applied.size === 0 ? settling : /* @__PURE__ */ new Set([...settling, ...install.applied]);
10211
10946
  const freshness = {
10212
10947
  loaded: capabilities !== null,
10213
10948
  checking: checking || versionsChecking,
@@ -10229,7 +10964,9 @@ function MarketPanel({ t, units, titleOf }) {
10229
10964
  idPrefix: MARKET_PANEL_ID,
10230
10965
  tab,
10231
10966
  busy,
10967
+ checking: checking || versionsAllChecking,
10232
10968
  onTab: setTab,
10969
+ onReload: () => reload({ force: true }),
10233
10970
  onAdd: openAddModule
10234
10971
  }), devMarket.strip, /* @__PURE__ */ (0, react.createElement)("div", {
10235
10972
  id: `${MARKET_PANEL_ID}-panel-installed`,
@@ -10247,14 +10984,16 @@ function MarketPanel({ t, units, titleOf }) {
10247
10984
  onChanged: reload,
10248
10985
  onPending: setActing,
10249
10986
  updates,
10250
- updatesCheckedAt: versionsCheckedAt,
10251
- updatesFailed: versionsFailed,
10987
+ modulesCheck,
10988
+ pluginsCheck,
10989
+ onCheck: checkPart,
10252
10990
  installed,
10253
10991
  installedRead: shownRead,
10254
10992
  workbench,
10255
10993
  selfUpdate,
10256
10994
  plugins,
10257
- settling: mock === void 0 ? settling : void 0,
10995
+ settling: mock === void 0 ? held : void 0,
10996
+ installing: mock === void 0 ? install.installing : false,
10258
10997
  mock,
10259
10998
  defaults: machineBoard?.defaults ?? [],
10260
10999
  changed: machineBoard?.changed ?? {}
@@ -11741,6 +12480,7 @@ function createClientUnitRegistry(options = {}) {
11741
12480
  return manifestsCache;
11742
12481
  },
11743
12482
  refusals: () => refusals,
12483
+ declared: () => [...known.values()],
11744
12484
  installable: () => installableIds,
11745
12485
  setManifests(manifests, installable) {
11746
12486
  known = new Map(manifests.map((manifest) => [manifest.id, manifest]));
@@ -12685,6 +13425,45 @@ function MarketSourceApprovalSeat({ tool, args, t }) {
12685
13425
  }, []);
12686
13426
  return (0, react.createElement)(ApprovalPlan, { rows: marketSourceRows(tool, args, payload, t) });
12687
13427
  }
13428
+ function pluginToolIndexOf(manifests) {
13429
+ const index = /* @__PURE__ */ new Map();
13430
+ for (const manifest of manifests) for (const tool of manifest.tools) {
13431
+ if (tool.opencli === void 0) continue;
13432
+ index.set(tool.name, tool.opencli);
13433
+ }
13434
+ return index;
13435
+ }
13436
+ function argText(value) {
13437
+ if (typeof value === "string") return value;
13438
+ if (typeof value === "number" || typeof value === "boolean") return String(value);
13439
+ const text = JSON.stringify(value);
13440
+ return text === void 0 ? String(value) : text;
13441
+ }
13442
+ function pluginApprovalRows(origin, args, t) {
13443
+ const rows = [{
13444
+ label: t("approval.plugin.name"),
13445
+ value: origin.plugin
13446
+ }, {
13447
+ label: t("approval.plugin.command"),
13448
+ value: origin.command
13449
+ }];
13450
+ const note = args[APPROVAL_NOTE_ARG];
13451
+ if (typeof note === "string" && note.trim() !== "") rows.push({
13452
+ label: t("approval.plugin.note"),
13453
+ value: note.replace(/\s+/g, " ").trim()
13454
+ });
13455
+ for (const name of origin.args) {
13456
+ if (!(name in args)) continue;
13457
+ rows.push({
13458
+ label: name,
13459
+ value: argText(args[name])
13460
+ });
13461
+ }
13462
+ return rows;
13463
+ }
13464
+ function shellApprovalRenderer(manifests) {
13465
+ return (input, t) => shellApprovalDetail(input, t, pluginToolIndexOf(manifests()));
13466
+ }
12688
13467
  function shellClaimsApprovalDetail(tool) {
12689
13468
  return ALL_TOOLS.includes(tool);
12690
13469
  }
@@ -12696,7 +13475,9 @@ function stopApprovalRows(args, t) {
12696
13475
  value: `${unit === "" ? "<unit>" : unit} · ${id === "" ? "<id>" : id}`
12697
13476
  }];
12698
13477
  }
12699
- function shellApprovalPlan(input, t) {
13478
+ function shellApprovalPlan(input, t, pluginTools) {
13479
+ const origin = pluginTools?.get(input.tool);
13480
+ if (origin !== void 0) return { rows: pluginApprovalRows(origin, input.args, t) };
12700
13481
  if (input.tool === "workbench_diy_record_prepare") return {
12701
13482
  rows: recordApprovalRows(input.args, t),
12702
13483
  warn: t("approval.record.noSwitch")
@@ -12707,7 +13488,7 @@ function shellApprovalPlan(input, t) {
12707
13488
  };
12708
13489
  return shellClaimsApprovalDetail(input.tool) ? { rows: [] } : void 0;
12709
13490
  }
12710
- function shellApprovalDetail(input, t) {
13491
+ function shellApprovalDetail(input, t, pluginTools) {
12711
13492
  if (input.tool === "workbench_diy_publish") return (0, react.createElement)(PublishApprovalSeat, {
12712
13493
  args: input.args,
12713
13494
  t
@@ -12717,7 +13498,7 @@ function shellApprovalDetail(input, t) {
12717
13498
  args: input.args,
12718
13499
  t
12719
13500
  });
12720
- const plan = shellApprovalPlan(input, t);
13501
+ const plan = shellApprovalPlan(input, t, pluginTools);
12721
13502
  if (plan === void 0) return void 0;
12722
13503
  if (plan.rows.length === 0) return (0, react.createElement)(react.Fragment, null);
12723
13504
  return /* @__PURE__ */ (0, react.createElement)(ApprovalPlan, {
@@ -13067,6 +13848,10 @@ function Breadcrumbs({ trail, onGoTo, titleKeyOf, t }) {
13067
13848
  }, /* @__PURE__ */ (0, react.createElement)("span", { className: Breadcrumbs_module_default.tabTitle }, stepLabel(step, titleKeyOf, t))));
13068
13849
  }));
13069
13850
  }
13851
+ var BoardEmpty_module_default = {
13852
+ actions: "_actions_smeq7_1",
13853
+ action: "_action_smeq7_1"
13854
+ };
13070
13855
  //#endregion
13071
13856
  //#region src/app/layouts/rightbar/BoardEmpty.tsx
13072
13857
  function BoardEmpty({ t, onBuildModule, onOpenModules, onOpenMarket }) {
@@ -13074,20 +13859,23 @@ function BoardEmpty({ t, onBuildModule, onOpenModules, onOpenMarket }) {
13074
13859
  icon: /* @__PURE__ */ (0, react.createElement)(IconBrandMark, { size: 32 }),
13075
13860
  title: t("panels.empty"),
13076
13861
  hint: t("panels.emptyHint"),
13077
- action: /* @__PURE__ */ (0, react.createElement)(react.Fragment, null, /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
13862
+ action: /* @__PURE__ */ (0, react.createElement)("div", { className: BoardEmpty_module_default.actions }, /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
13078
13863
  type: "button",
13079
13864
  size: "sm",
13080
13865
  variant: "primary",
13866
+ className: BoardEmpty_module_default.action,
13081
13867
  onClick: onBuildModule
13082
13868
  }, t("panels.buildModule")), /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
13083
13869
  type: "button",
13084
13870
  size: "sm",
13085
13871
  variant: "toolbar",
13872
+ className: BoardEmpty_module_default.action,
13086
13873
  onClick: onOpenModules
13087
13874
  }, t("panels.choose")), /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
13088
13875
  type: "button",
13089
13876
  size: "sm",
13090
13877
  variant: "toolbar",
13878
+ className: BoardEmpty_module_default.action,
13091
13879
  onClick: onOpenMarket
13092
13880
  }, t("panels.browseMarket")))
13093
13881
  });
@@ -15630,7 +16418,7 @@ function messagesOf(units) {
15630
16418
  ...face.messages === void 0 ? {} : { messages: face.messages }
15631
16419
  }));
15632
16420
  }
15633
- var COMPONENT_CSS_MARKER = ".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.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.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.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.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.wb-spinner {\n display: inline-flex;\n align-items: center;\n flex: none;\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}\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 justify-self: start;\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}\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.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}\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.wb-stack {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n min-height: 0;\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_yups9_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_yups9_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_yups9_20 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-48);\n height: var(--wb-len-48);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketMain_yups9_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_yups9_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._marketStatus_yups9_48 {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketStateText_yups9_58 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSep_yups9_62 {\n color: var(--dsw-alias-label-caption);\n}\n\n._marketReason_yups9_66 {\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._marketName_yups9_39 ._marketVersion_yups9_72 {\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_yups9_72 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_yups9_72::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_yups9_94 {\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_yups9_105 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_yups9_112 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_yups9_112::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_yups9_125 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_yups9_131 {\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_yups9_137 {\n height: 0;\n margin-top: calc(0px - var(--wb-len-16));\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_yups9_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_yups9_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_yups9_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_yups9_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_yups9_169 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionAction_yups9_175 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n margin-left: auto;\n min-width: 0;\n}\n\n._marketSectionQuiet_yups9_183 ._marketSectionTitle_yups9_163 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSectionQuiet_yups9_183 ._marketName_yups9_39 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSectionQuiet_yups9_183 ._marketIcon_yups9_20 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n\n._marketProgress_yups9_196 {\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_yups9_206 {\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._marketFailure_yups9_213 {\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_yups9_220 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_yups9_225 {\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_yups9_225 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_yups9_243 {\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_yups9_251 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_yups9_256 {\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_yups9_262 {\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._marketPanel_yups9_271 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-32);\n}\n\n._marketPanel_yups9_271[hidden] {\n display: none;\n}\n\n._marketTabs_yups9_281 {\n display: flex;\n margin: calc(0px - var(--wb-len-16)) 0;\n}\n\n._marketTabList_yups9_286 {\n width: fit-content;\n min-width: var(--wb-len-240);\n}\n\n._marketAddButton_yups9_291 {\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_yups9_220 {\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._marketEmptyTitle_yups9_308 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._discoverPage_yups9_313 {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-16);\n}\n\n._discoverBar_yups9_320 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n container-type: inline-size;\n}\n\n._discoverTools_yups9_327 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._discoverMarket_yups9_333 {\n flex: 0 1 auto;\n min-width: 0;\n}\n\n._discoverMarketButton_yups9_338 {\n min-width: 0;\n max-width: var(--wb-len-240);\n margin-left: calc(0px - var(--wb-len-8));\n font-weight: 500;\n}\n\n._discoverMarketName_yups9_345 {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._discoverLabels_yups9_351 {\n flex: none;\n white-space: nowrap;\n}\n\n._discoverSort_yups9_356 {\n flex: none;\n white-space: nowrap;\n}\n\n._discoverRefresh_yups9_361 {\n flex: none;\n}\n\n._discoverSearch_yups9_365 {\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex: 1 1 var(--wb-len-120);\n min-width: var(--wb-len-120);\n}\n\n._discoverSearchField_yups9_373 {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._discoverSearchFieldFilled_yups9_378 input {\n padding-inline-end: var(--wb-len-20);\n}\n\n._discoverSearchField_yups9_373 input::-webkit-search-cancel-button {\n appearance: none;\n -webkit-appearance: none;\n}\n\n._discoverSearch_yups9_365 ._discoverSearchClear_yups9_387 {\n position: absolute;\n top: 50%;\n inset-inline-end: var(--wb-len-4);\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n padding: 0;\n border-radius: var(--dsw-radius-sm);\n color: var(--dsw-alias-label-tertiary);\n transform: translateY(-50%);\n}\n\n._discoverSearchClear_yups9_387:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n@container (max-width: 560px) {\n ._discoverTools_yups9_327 {\n display: grid;\n grid-template-columns: minmax(0, auto) minmax(var(--wb-len-120), 1fr) auto;\n grid-template-areas:\n 'market search refresh'\n 'labels sort sort';\n }\n\n ._discoverMarket_yups9_333 {\n grid-area: market;\n }\n\n ._discoverMarketButton_yups9_338 {\n margin-left: 0;\n }\n\n ._discoverLabels_yups9_351 {\n grid-area: labels;\n }\n\n ._discoverSearch_yups9_365 {\n grid-area: search;\n }\n\n ._discoverSort_yups9_356 {\n grid-area: sort;\n justify-self: end;\n }\n\n ._discoverRefresh_yups9_361 {\n grid-area: refresh;\n }\n}\n\n._discoverChips_yups9_438 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n._discoverList_yups9_445 {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._discoverCard_yups9_454 {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--wb-len-14);\n margin: 0 calc(0px - var(--wb-len-8));\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-xl);\n}\n\n._discoverCard_yups9_454:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._discoverArtwork_yups9_468 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-48);\n height: var(--wb-len-48);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\n color: var(--dsw-alias-label-secondary);\n}\n\n._discoverArtworkImage_yups9_480 {\n object-fit: contain;\n}\n\n._discoverMain_yups9_484 {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--wb-len-2);\n min-width: 0;\n}\n\n._discoverTitleRow_yups9_492 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._discoverCardOpen_yups9_500 {\n max-width: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n font: var(--dsw-font-s-14);\n font-weight: 500;\n text-align: left;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n cursor: pointer;\n}\n\n._discoverCardOpen_yups9_500::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: var(--dsw-radius-xl);\n}\n\n._discoverCardOpen_yups9_500:focus-visible {\n outline: none;\n}\n\n._discoverCardOpen_yups9_500:focus-visible::after {\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._discoverStrong_yups9_531 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n overflow-wrap: anywhere;\n}\n\n._discoverDesc_yups9_537 {\n display: -webkit-box;\n overflow: hidden;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._discoverMeta_yups9_546 {\n margin: 0;\n font: var(--dsw-font-xxs-12);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._discoverMuted_yups9_553 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._discoverEnd_yups9_559 {\n position: relative;\n z-index: var(--wb-z-10);\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._discoverUpdateAction_yups9_568 {\n color: var(--dsw-alias-state-warn-primary);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._discoverBlocked_yups9_573 {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n._discoverEmpty_yups9_578 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-64) 0;\n text-align: center;\n}\n\n._discoverEmptyTitle_yups9_587 {\n margin: var(--wb-len-8) 0 0;\n font: var(--dsw-font-s-14);\n font-weight: 500;\n}\n\n._discoverEmpty_yups9_578 > button {\n margin-top: var(--wb-len-8);\n}\n\n._discoverDetail_yups9_597 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-16);\n}\n\n._discoverCrumb_yups9_603 {\n align-self: flex-start;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n padding: 0;\n border: 0;\n background: 0 0;\n color: var(--dsw-alias-label-tertiary);\n font: inherit;\n font-size: var(--wb-font-12-5);\n cursor: pointer;\n}\n\n._discoverCrumb_yups9_603:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._discoverCrumb_yups9_603: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._discoverCrumbIcon_yups9_626 {\n transform: rotate(90deg);\n}\n\n._discoverDetailHead_yups9_630 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-14);\n}\n\n._discoverDetailTitle_yups9_636 {\n margin: 0;\n font: var(--dsw-font-l-20);\n font-weight: 500;\n}\n\n._discoverDetailText_yups9_642 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._discoverDetailPanel_yups9_649 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-16);\n min-width: 0;\n}\n\n._discoverDetailTabs_yups9_656 {\n display: flex;\n margin-bottom: calc(0px - var(--wb-len-4));\n}\n\n._discoverDetailTabList_yups9_661 {\n width: fit-content;\n min-width: var(--wb-len-240);\n}\n\n._discoverDocBody_yups9_666 {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n._discoverDocNotice_yups9_671 {\n margin: var(--wb-len-16) 0 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._discoverSection_yups9_677 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n margin-top: var(--wb-len-16);\n}\n\n._discoverSectionTitle_yups9_684 {\n margin: 0;\n font: var(--dsw-font-s-14);\n font-weight: 500;\n}\n\n._discoverFacts_yups9_690 {\n margin: 0;\n padding: 0;\n}\n\n._discoverFactRow_yups9_695 {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: var(--wb-len-16);\n min-height: var(--wb-len-44);\n padding: var(--wb-len-8) var(--wb-len-2);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._discoverFactKind_yups9_705 {\n flex: none;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._discoverFactValue_yups9_711 {\n min-width: 0;\n margin: 0;\n text-align: end;\n overflow-wrap: anywhere;\n font: var(--dsw-font-xs-13);\n}\n\n._discoverCode_yups9_719 {\n padding: var(--wb-len-2) var(--wb-len-6);\n border-radius: var(--wb-radius-6);\n background: var(--dsw-alias-bg-module-platform);\n font-family: var(--ds-font-family-code);\n font-size: var(--dsw-font-xxs-12-font-size);\n box-decoration-break: clone;\n}\n\n._discoverTags_yups9_728 {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--wb-len-6);\n}\n\n._discoverLink_yups9_735 {\n color: var(--dsw-alias-link);\n overflow-wrap: anywhere;\n text-decoration: none;\n}\n\n._discoverLink_yups9_735:hover {\n text-decoration: underline;\n}\n\n._discoverVersions_yups9_745 {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n}\n\n._discoverVersionRow_yups9_753 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8) 0;\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._discoverVersionName_yups9_761 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n}\n\n._discoverError_yups9_766 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._discoverFailure_yups9_775 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._discoverLoading_yups9_781 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin: 0;\n color: var(--dsw-alias-label-secondary);\n font: var(--dsw-font-xs-13);\n}\n\n._discoverNotice_yups9_790 {\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 color: var(--dsw-alias-label-secondary);\n font: var(--dsw-font-xxs-12);\n}\n\n._discoverNotice_yups9_790 svg {\n flex: none;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._discoverMore_yups9_808 {\n align-self: center;\n}\n\n._discoverTransport_yups9_812 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n}\n\n._discoverTransportHead_yups9_818 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._discoverTransportTitle_yups9_825 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._discoverTransportHead_yups9_818 ._discoverTransportKind_yups9_830 {\n font: var(--dsw-font-xs-13);\n font-weight: 500;\n}\n\n._discoverTransportHead_yups9_818 ._discoverTransportState_yups9_835 {\n margin-left: 0;\n}\n\n._discoverTransportHead_yups9_818 > :last-child {\n margin-left: auto;\n}\n\n._discoverTransportRows_yups9_843 {\n display: flex;\n gap: var(--wb-len-8);\n}\n\n._discoverTransportRow_yups9_843 {\n display: flex;\n flex: 1;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-md);\n cursor: pointer;\n}\n\n._discoverTransportRow_yups9_843:hover {\n border-color: var(--dsw-alias-border-l3);\n}\n\n._discoverTransportRow_yups9_843:has(._discoverTransportRadio_yups9_864:checked) {\n border-color: var(--dsw-alias-label-primary);\n}\n\n._discoverTransportRow_yups9_843:has(._discoverTransportRadio_yups9_864:focus-visible) {\n outline: 2px solid var(--dsw-alias-label-primary);\n outline-offset: 1px;\n}\n\n._discoverTransportRadio_yups9_864 {\n flex: none;\n margin: 0;\n}\n\n._discoverTransportKind_yups9_830 {\n flex: none;\n font: var(--dsw-font-xs-13);\n font-weight: 500;\n}\n\n._discoverTransportState_yups9_835 {\n flex: none;\n margin-left: auto;\n font: var(--dsw-font-xxs-12);\n color: var(--dsw-alias-label-secondary);\n}\n\n._discoverTransportRow_yups9_843[data-state='ok'] ._discoverTransportState_yups9_835 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._discoverTransportRow_yups9_843[data-state='auth'] ._discoverTransportState_yups9_835 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._discoverTransportRow_yups9_843[data-state='unreachable'] ._discoverTransportState_yups9_835,\n._discoverTransportRow_yups9_843[data-state='unknown'] ._discoverTransportState_yups9_835 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._discoverTransportCustom_yups9_904 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._discoverTransportInput_yups9_910 {\n flex: 1;\n min-width: 0;\n}\n\n._discoverInstallBar_yups9_915 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-module-platform);\n font: var(--dsw-font-xs-13);\n}\n\n._discoverInstallText_yups9_926 {\n flex: 1;\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n._discoverDialog_yups9_932 {\n width: min(var(--wb-len-560), calc(100vw - var(--wb-len-32)));\n}\n\n._discoverDialogBody_yups9_936 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._discoverSourceList_yups9_942 {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n}\n\n._discoverSourceRow_yups9_950 {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: var(--wb-len-12);\n padding: var(--wb-len-10) 0;\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._discoverSourceConfirm_yups9_959 {\n margin: 0;\n padding: var(--wb-len-2) 0 var(--wb-len-10);\n list-style: none;\n}\n\n._discoverSourcePick_yups9_965 {\n display: flex;\n flex: 1;\n align-items: flex-start;\n gap: var(--wb-len-10);\n min-width: 0;\n cursor: pointer;\n}\n\n._discoverSourceRadio_yups9_974 {\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._discoverSourceMain_yups9_982 {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._discoverSourceHead_yups9_990 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._discoverSourceUrl_yups9_998 {\n display: block;\n margin: 0;\n font: var(--dsw-font-xxs-12);\n color: var(--dsw-alias-label-tertiary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._discoverSourceMore_yups9_1008 {\n flex: none;\n}\n\n._discoverSourceLoading_yups9_1012 {\n display: flex;\n flex: none;\n align-items: center;\n gap: var(--wb-len-6);\n color: var(--dsw-alias-label-secondary);\n font: var(--dsw-font-xxs-12);\n white-space: nowrap;\n}\n\n._discoverSourceHint_yups9_1022 {\n display: flex;\n flex-basis: 100%;\n align-items: center;\n gap: var(--wb-len-6);\n color: var(--dsw-alias-label-secondary);\n font: var(--dsw-font-xxs-12);\n}\n\n._discoverSourceHint_yups9_1022 svg {\n flex: none;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._discoverSourceError_yups9_1036 {\n font: var(--dsw-font-xxs-12);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._discoverSourceForm_yups9_1042 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._discoverGrow_yups9_1048 {\n flex: 1;\n min-width: 0;\n}\n\n._discoverField_yups9_1053 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n\n._discoverFieldLabel_yups9_1059 {\n font: var(--dsw-font-xxs-12);\n color: var(--dsw-alias-label-secondary);\n}\n\n._discoverConfirmHead_yups9_1064 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-14);\n}\n\n._discoverSkeletonFill_yups9_1070 {\n background: var(--dsw-alias-bg-skeleton);\n animation: _wb-skeleton_yups9_1 var(--wb-dur-1-5) cubic-bezier(0.36, 0, 0.64, 1) infinite;\n}\n\n._discoverArtwork_yups9_468._discoverSkeletonFill_yups9_1070 {\n border-color: transparent;\n}\n\n._discoverSkeletonBar_yups9_1079 {\n display: block;\n height: var(--wb-len-12);\n margin: var(--wb-len-4) 0;\n border-radius: var(--dsw-radius-xs);\n}\n\n._discoverSkeletonTitle_yups9_1086 {\n width: min(var(--wb-len-144), 60%);\n}\n\n._discoverSkeletonDesc_yups9_1090 {\n width: min(var(--wb-len-280), 85%);\n}\n\n@keyframes _wb-skeleton_yups9_1 {\n 0% {\n opacity: 1;\n }\n 40% {\n opacity: 0.6;\n }\n 80%,\n to {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._discoverSkeletonFill_yups9_1070 {\n animation: none;\n }\n}\n\n._check_1g6tv_1 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n min-width: 0;\n}\n\n._status_1g6tv_8 {\n font: var(--dsw-font-xxs-12);\n color: var(--dsw-alias-label-caption);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n._button_1g6tv_15 {\n flex: none;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n}\n\n._icon_1g6tv_22 {\n display: inline-flex;\n}\n\n@media (max-width: 720px) {\n ._status_1g6tv_8 {\n display: none;\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._rows_85r3w_1 {\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_85r3w_1 {\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_85r3w_20 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._pick_85r3w_27 {\n flex: 0 1 auto;\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._pick_85r3w_27 > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._code_85r3w_39 {\n --dsl-code-block-background: var(--dsw-alias-bg-layer-1);\n margin: 0;\n}\n\n._missing_85r3w_44,\n._conflict_85r3w_45 {\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._body_11oac_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._sources_11oac_7 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._sourcesLabel_11oac_14 {\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-secondary);\n}\n\nbutton._sourceOn_11oac_19 {\n border-color: var(--dsw-alias-brand-primary);\n}\n._sourceCount_11oac_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_11oac_29 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._status_11oac_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_11oac_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_11oac_55 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._failureHint_11oac_62 {\n grid-column: 1;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failureAction_11oac_67 {\n grid-column: 2;\n grid-row: 1;\n justify-self: end;\n}\n\n._foot_11oac_73 {\n display: flex;\n justify-content: flex-end;\n}\n._body_lox98_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._field_lox98_7 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n\n._input_lox98_13 {\n width: 100%;\n}\n\n._label_lox98_17 {\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-secondary);\n}\n\n._hint_lox98_22 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._copy_lox98_28 {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wb-len-8) var(--wb-len-16);\n margin: 0;\n padding: 0;\n border: 0;\n}\n\n._copy_lox98_28 legend {\n padding: 0;\n margin-bottom: var(--wb-len-6);\n}\n\n._actions_lox98_42 {\n display: flex;\n justify-content: flex-end;\n}\n\n._commandLabel_lox98_47 {\n display: block;\n margin-top: var(--wb-len-4);\n}\n\n._command_lox98_47 {\n display: block;\n margin-top: var(--wb-len-4);\n padding: var(--wb-len-6) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-1);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxs-12-font-size);\n overflow-wrap: anywhere;\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._hint_zyzt3_1[hidden],\n._actions_zyzt3_2[hidden],\n._progress_zyzt3_3[hidden],\n._commandRow_zyzt3_4[hidden],\n._bridge_zyzt3_5[hidden],\n._raw_zyzt3_6[hidden] {\n display: none;\n}\n\n._gate_zyzt3_10 {\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_zyzt3_21 {\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_zyzt3_21:has(._actions_zyzt3_2:not([hidden])),\n._card_zyzt3_21:has(._bridge_zyzt3_5:not([hidden])) {\n max-width: var(--wb-len-520);\n}\n\n._title_zyzt3_36 {\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_zyzt3_1 {\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_zyzt3_51 {\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_zyzt3_51 {\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_zyzt3_51[data-status='running'] {\n color: var(--dsw-alias-label-primary);\n}\n\n._mark_zyzt3_78 {\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_zyzt3_51[data-status='ok'] ._mark_zyzt3_78 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._step_zyzt3_51[data-status='warn'] ._mark_zyzt3_78 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._step_zyzt3_51[data-status='failed'] ._mark_zyzt3_78 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._label_zyzt3_103 {\n flex: none;\n}\n\n._detail_zyzt3_107 {\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_zyzt3_3 {\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_zyzt3_125 {\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_zyzt3_133 {\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_zyzt3_4 {\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_zyzt3_159 {\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_zyzt3_159:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._command_zyzt3_4 {\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_zyzt3_192 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-12);\n}\n\n._mockSlot_zyzt3_199 {\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_zyzt3_192 {\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_zyzt3_192:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._button_zyzt3_192:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n._actions_zyzt3_2,\n._bridge_zyzt3_5 {\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_zyzt3_250 {\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_zyzt3_2 ._hint_zyzt3_1,\n._bridge_zyzt3_5 ._hint_zyzt3_1 {\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_zyzt3_2 ._commandRow_zyzt3_4,\n._bridge_zyzt3_5 ._commandRow_zyzt3_4 {\n margin: 0;\n}\n\n._actions_zyzt3_2 ._buttons_zyzt3_192,\n._bridge_zyzt3_5 ._buttons_zyzt3_192 {\n justify-content: flex-start;\n}\n\n._raw_zyzt3_6 {\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n text-align: left;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._rawSummary_zyzt3_286 {\n cursor: pointer;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._actions_zyzt3_2 ._error_zyzt3_133,\n._bridge_zyzt3_5 ._error_zyzt3_133 {\n margin-top: var(--wb-len-6);\n}\n\n._bridgeLines_zyzt3_296 {\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_zyzt3_296 a {\n display: block;\n margin-top: var(--wb-len-4);\n width: fit-content;\n}\n\n._link_zyzt3_313 {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n\n._link_zyzt3_313::after {\n content: '↗';\n margin-left: var(--wb-len-2);\n}\n\n._link_zyzt3_313:hover {\n text-decoration: underline;\n}\n\n._loading_zyzt3_327 {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._loading_zyzt3_327[hidden] {\n display: none;\n}\n\n._loadingMotion_zyzt3_336 {\n transform-origin: center;\n animation: _wb-spin_zyzt3_1 var(--wb-dur-1-5) linear infinite;\n}\n\n._loadingTrack_zyzt3_341,\n._loadingArc_zyzt3_342 {\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n}\n\n._loadingTrack_zyzt3_341 {\n opacity: 0.25;\n}\n\n._loadingArc_zyzt3_342 {\n stroke-dasharray: 12 150;\n animation: _wb-dash_zyzt3_1 var(--wb-dur-1-5) ease-in-out infinite;\n}\n\n@keyframes _wb-spin_zyzt3_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes _wb-dash_zyzt3_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_zyzt3_336,\n ._loadingArc_zyzt3_342 {\n animation: none;\n }\n}\n._changelog_1q6pj_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n margin-top: var(--wb-len-10);\n min-width: 0;\n}\n\n._changelogTitle_1q6pj_9 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._changelogMissing_1q6pj_15 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-primary);\n}\n\n._changelogBody_1q6pj_21 {\n max-height: var(--wb-len-320);\n overflow: auto;\n padding: var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\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*/";
16421
+ var COMPONENT_CSS_MARKER = ".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.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.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: grid;\n grid-template-columns: minmax(var(--wb-len-56), auto) minmax(0, 1fr);\n column-gap: var(--wb-len-8);\n row-gap: var(--wb-len-2);\n align-items: baseline;\n margin: 0;\n}\n.wb-approvalRow {\n display: contents;\n}\n.wb-approvalLabel {\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.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.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.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.wb-spinner {\n display: inline-flex;\n align-items: center;\n flex: none;\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}\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 justify-self: start;\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}\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.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}\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.wb-stack {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n min-height: 0;\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_1vpw3_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_1vpw3_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_1vpw3_20 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-48);\n height: var(--wb-len-48);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketMain_1vpw3_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_1vpw3_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._marketStatus_1vpw3_48 {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketStateText_1vpw3_58 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSep_1vpw3_62 {\n color: var(--dsw-alias-label-caption);\n}\n\n._marketReason_1vpw3_66 {\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._marketName_1vpw3_39 ._marketVersion_1vpw3_72 {\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_1vpw3_72 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_1vpw3_72::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_1vpw3_94 {\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_1vpw3_105 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_1vpw3_112 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_1vpw3_112::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_1vpw3_125 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_1vpw3_131 {\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_1vpw3_137 {\n height: 0;\n margin-top: calc(0px - var(--wb-len-16));\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_1vpw3_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_1vpw3_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_1vpw3_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_1vpw3_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_1vpw3_169 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionAction_1vpw3_175 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n margin-left: auto;\n min-width: 0;\n}\n\n._marketSectionQuiet_1vpw3_183 ._marketSectionTitle_1vpw3_163 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSectionQuiet_1vpw3_183 ._marketName_1vpw3_39 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSectionQuiet_1vpw3_183 ._marketIcon_1vpw3_20 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._marketProgress_1vpw3_195 {\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_1vpw3_205 {\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._marketFailure_1vpw3_212 {\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._marketFailureSeat_1vpw3_219 {\n grid-column: 2 / -1;\n min-width: 0;\n}\n\n._marketEmpty_1vpw3_224 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_1vpw3_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_1vpw3_229 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_1vpw3_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_1vpw3_255 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_1vpw3_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_1vpw3_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._marketPanel_1vpw3_275 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-32);\n}\n\n._marketPanel_1vpw3_275[hidden] {\n display: none;\n}\n\n._marketTabs_1vpw3_285 {\n display: flex;\n margin: calc(0px - var(--wb-len-16)) 0;\n}\n\n._marketTabList_1vpw3_290 {\n width: fit-content;\n min-width: var(--wb-len-240);\n}\n\n._marketAddButton_1vpw3_295 {\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_1vpw3_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._marketEmptyTitle_1vpw3_312 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._discoverPage_1vpw3_317 {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-16);\n}\n\n._discoverBar_1vpw3_324 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n container-type: inline-size;\n}\n\n._discoverTools_1vpw3_331 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._discoverMarket_1vpw3_337 {\n flex: 0 1 auto;\n min-width: 0;\n}\n\n._discoverMarketButton_1vpw3_342 {\n min-width: 0;\n max-width: var(--wb-len-240);\n margin-left: calc(0px - var(--wb-len-8));\n font-weight: 500;\n}\n\n._discoverMarketName_1vpw3_349 {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._discoverLabels_1vpw3_355 {\n flex: none;\n white-space: nowrap;\n}\n\n._discoverSort_1vpw3_360 {\n flex: none;\n white-space: nowrap;\n}\n\n._discoverRefresh_1vpw3_365 {\n flex: none;\n}\n\n._discoverSearch_1vpw3_369 {\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex: 1 1 var(--wb-len-120);\n min-width: var(--wb-len-120);\n}\n\n._discoverSearchField_1vpw3_377 {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._discoverSearchFieldFilled_1vpw3_382 input {\n padding-inline-end: var(--wb-len-20);\n}\n\n._discoverSearchField_1vpw3_377 input::-webkit-search-cancel-button {\n appearance: none;\n -webkit-appearance: none;\n}\n\n._discoverSearch_1vpw3_369 ._discoverSearchClear_1vpw3_391 {\n position: absolute;\n top: 50%;\n inset-inline-end: var(--wb-len-4);\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n padding: 0;\n border-radius: var(--dsw-radius-sm);\n color: var(--dsw-alias-label-tertiary);\n transform: translateY(-50%);\n}\n\n._discoverSearchClear_1vpw3_391:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n@container (max-width: 560px) {\n ._discoverTools_1vpw3_331 {\n display: grid;\n grid-template-columns: minmax(0, auto) minmax(var(--wb-len-120), 1fr) auto;\n grid-template-areas:\n 'market search refresh'\n 'labels sort sort';\n }\n\n ._discoverMarket_1vpw3_337 {\n grid-area: market;\n }\n\n ._discoverMarketButton_1vpw3_342 {\n margin-left: 0;\n }\n\n ._discoverLabels_1vpw3_355 {\n grid-area: labels;\n }\n\n ._discoverSearch_1vpw3_369 {\n grid-area: search;\n }\n\n ._discoverSort_1vpw3_360 {\n grid-area: sort;\n justify-self: end;\n }\n\n ._discoverRefresh_1vpw3_365 {\n grid-area: refresh;\n }\n}\n\n._discoverChips_1vpw3_442 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n._discoverList_1vpw3_449 {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._discoverCard_1vpw3_458 {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--wb-len-14);\n margin: 0 calc(0px - var(--wb-len-8));\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-xl);\n}\n\n._discoverCard_1vpw3_458:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._discoverArtwork_1vpw3_472 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-48);\n height: var(--wb-len-48);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\n color: var(--dsw-alias-label-secondary);\n}\n\n._discoverArtworkImage_1vpw3_484 {\n object-fit: contain;\n}\n\n._discoverMain_1vpw3_488 {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--wb-len-2);\n min-width: 0;\n}\n\n._discoverTitleRow_1vpw3_496 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._discoverCardOpen_1vpw3_504 {\n max-width: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n font: var(--dsw-font-s-14);\n font-weight: 500;\n text-align: left;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n cursor: pointer;\n}\n\n._discoverCardOpen_1vpw3_504::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: var(--dsw-radius-xl);\n}\n\n._discoverCardOpen_1vpw3_504:focus-visible {\n outline: none;\n}\n\n._discoverCardOpen_1vpw3_504:focus-visible::after {\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._discoverStrong_1vpw3_535 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n overflow-wrap: anywhere;\n}\n\n._discoverDesc_1vpw3_541 {\n display: -webkit-box;\n overflow: hidden;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._discoverMeta_1vpw3_550 {\n margin: 0;\n font: var(--dsw-font-xxs-12);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._discoverMuted_1vpw3_557 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._discoverEnd_1vpw3_563 {\n position: relative;\n z-index: var(--wb-z-10);\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._discoverUpdateAction_1vpw3_572 {\n color: var(--dsw-alias-state-warn-primary);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._discoverBlocked_1vpw3_577 {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n._discoverEmpty_1vpw3_582 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-64) 0;\n text-align: center;\n}\n\n._discoverEmptyTitle_1vpw3_591 {\n margin: var(--wb-len-8) 0 0;\n font: var(--dsw-font-s-14);\n font-weight: 500;\n}\n\n._discoverEmpty_1vpw3_582 > button {\n margin-top: var(--wb-len-8);\n}\n\n._discoverDetail_1vpw3_601 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-16);\n}\n\n._discoverCrumb_1vpw3_607 {\n align-self: flex-start;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n padding: 0;\n border: 0;\n background: 0 0;\n color: var(--dsw-alias-label-tertiary);\n font: inherit;\n font-size: var(--wb-font-12-5);\n cursor: pointer;\n}\n\n._discoverCrumb_1vpw3_607:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._discoverCrumb_1vpw3_607: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._discoverCrumbIcon_1vpw3_630 {\n transform: rotate(90deg);\n}\n\n._discoverDetailHead_1vpw3_634 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-14);\n}\n\n._discoverDetailTitle_1vpw3_640 {\n margin: 0;\n font: var(--dsw-font-l-20);\n font-weight: 500;\n}\n\n._discoverDetailText_1vpw3_646 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._discoverDetailPanel_1vpw3_653 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-16);\n min-width: 0;\n}\n\n._discoverDetailTabs_1vpw3_660 {\n display: flex;\n margin-bottom: calc(0px - var(--wb-len-4));\n}\n\n._discoverDetailTabList_1vpw3_665 {\n width: fit-content;\n min-width: var(--wb-len-240);\n}\n\n._discoverDocBody_1vpw3_670 {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n._discoverDocNotice_1vpw3_675 {\n margin: var(--wb-len-16) 0 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._discoverSection_1vpw3_681 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n margin-top: var(--wb-len-16);\n}\n\n._discoverSectionTitle_1vpw3_688 {\n margin: 0;\n font: var(--dsw-font-s-14);\n font-weight: 500;\n}\n\n._discoverFacts_1vpw3_694 {\n margin: 0;\n padding: 0;\n}\n\n._discoverFactRow_1vpw3_699 {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: var(--wb-len-16);\n min-height: var(--wb-len-44);\n padding: var(--wb-len-8) var(--wb-len-2);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._discoverFactKind_1vpw3_709 {\n flex: none;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._discoverFactValue_1vpw3_715 {\n min-width: 0;\n margin: 0;\n text-align: end;\n overflow-wrap: anywhere;\n font: var(--dsw-font-xs-13);\n}\n\n._discoverCode_1vpw3_723 {\n padding: var(--wb-len-2) var(--wb-len-6);\n border-radius: var(--wb-radius-6);\n background: var(--dsw-alias-bg-module-platform);\n font-family: var(--ds-font-family-code);\n font-size: var(--dsw-font-xxs-12-font-size);\n box-decoration-break: clone;\n}\n\n._discoverTags_1vpw3_732 {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--wb-len-6);\n}\n\n._discoverLink_1vpw3_739 {\n color: var(--dsw-alias-link);\n overflow-wrap: anywhere;\n text-decoration: none;\n}\n\n._discoverLink_1vpw3_739:hover {\n text-decoration: underline;\n}\n\n._discoverVersions_1vpw3_749 {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n}\n\n._discoverVersionRow_1vpw3_757 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8) 0;\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._discoverVersionName_1vpw3_765 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n}\n\n._discoverError_1vpw3_770 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._discoverFailure_1vpw3_779 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._discoverLoading_1vpw3_785 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin: 0;\n color: var(--dsw-alias-label-secondary);\n font: var(--dsw-font-xs-13);\n}\n\n._discoverNotice_1vpw3_794 {\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 color: var(--dsw-alias-label-secondary);\n font: var(--dsw-font-xxs-12);\n}\n\n._discoverNotice_1vpw3_794 svg {\n flex: none;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._discoverMore_1vpw3_812 {\n align-self: center;\n}\n\n._discoverTransport_1vpw3_816 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n}\n\n._discoverTransportHead_1vpw3_822 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._discoverTransportTitle_1vpw3_829 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._discoverTransportHead_1vpw3_822 ._discoverTransportKind_1vpw3_834 {\n font: var(--dsw-font-xs-13);\n font-weight: 500;\n}\n\n._discoverTransportHead_1vpw3_822 ._discoverTransportState_1vpw3_839 {\n margin-left: 0;\n}\n\n._discoverTransportHead_1vpw3_822 > :last-child {\n margin-left: auto;\n}\n\n._discoverTransportRows_1vpw3_847 {\n display: flex;\n gap: var(--wb-len-8);\n}\n\n._discoverTransportRow_1vpw3_847 {\n display: flex;\n flex: 1;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-md);\n cursor: pointer;\n}\n\n._discoverTransportRow_1vpw3_847:hover {\n border-color: var(--dsw-alias-border-l3);\n}\n\n._discoverTransportRow_1vpw3_847:has(._discoverTransportRadio_1vpw3_868:checked) {\n border-color: var(--dsw-alias-label-primary);\n}\n\n._discoverTransportRow_1vpw3_847:has(._discoverTransportRadio_1vpw3_868:focus-visible) {\n outline: 2px solid var(--dsw-alias-label-primary);\n outline-offset: 1px;\n}\n\n._discoverTransportRadio_1vpw3_868 {\n flex: none;\n margin: 0;\n}\n\n._discoverTransportKind_1vpw3_834 {\n flex: none;\n font: var(--dsw-font-xs-13);\n font-weight: 500;\n}\n\n._discoverTransportState_1vpw3_839 {\n flex: none;\n margin-left: auto;\n font: var(--dsw-font-xxs-12);\n color: var(--dsw-alias-label-secondary);\n}\n\n._discoverTransportRow_1vpw3_847[data-state='ok'] ._discoverTransportState_1vpw3_839 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._discoverTransportRow_1vpw3_847[data-state='auth'] ._discoverTransportState_1vpw3_839 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._discoverTransportRow_1vpw3_847[data-state='unreachable'] ._discoverTransportState_1vpw3_839,\n._discoverTransportRow_1vpw3_847[data-state='unknown'] ._discoverTransportState_1vpw3_839 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._discoverTransportCustom_1vpw3_908 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._discoverTransportInput_1vpw3_914 {\n flex: 1;\n min-width: 0;\n}\n\n._discoverInstallBar_1vpw3_919 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-module-platform);\n font: var(--dsw-font-xs-13);\n}\n\n._discoverInstallText_1vpw3_930 {\n flex: 1;\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n._discoverDialog_1vpw3_936 {\n width: min(var(--wb-len-560), calc(100vw - var(--wb-len-32)));\n}\n\n._discoverDialogBody_1vpw3_940 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._discoverSourceList_1vpw3_946 {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n}\n\n._discoverSourceRow_1vpw3_954 {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: var(--wb-len-12);\n padding: var(--wb-len-10) 0;\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._discoverSourceConfirm_1vpw3_963 {\n margin: 0;\n padding: var(--wb-len-2) 0 var(--wb-len-10);\n list-style: none;\n}\n\n._discoverSourcePick_1vpw3_969 {\n display: flex;\n flex: 1;\n align-items: flex-start;\n gap: var(--wb-len-10);\n min-width: 0;\n cursor: pointer;\n}\n\n._discoverSourceRadio_1vpw3_978 {\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._discoverSourceMain_1vpw3_986 {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._discoverSourceHead_1vpw3_994 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._discoverSourceUrl_1vpw3_1002 {\n display: block;\n margin: 0;\n font: var(--dsw-font-xxs-12);\n color: var(--dsw-alias-label-tertiary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._discoverSourceMore_1vpw3_1012 {\n flex: none;\n}\n\n._discoverSourceLoading_1vpw3_1016 {\n display: flex;\n flex: none;\n align-items: center;\n gap: var(--wb-len-6);\n color: var(--dsw-alias-label-secondary);\n font: var(--dsw-font-xxs-12);\n white-space: nowrap;\n}\n\n._discoverSourceHint_1vpw3_1026 {\n display: flex;\n flex-basis: 100%;\n align-items: center;\n gap: var(--wb-len-6);\n color: var(--dsw-alias-label-secondary);\n font: var(--dsw-font-xxs-12);\n}\n\n._discoverSourceHint_1vpw3_1026 svg {\n flex: none;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._discoverSourceError_1vpw3_1040 {\n font: var(--dsw-font-xxs-12);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._discoverSourceForm_1vpw3_1046 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._discoverGrow_1vpw3_1052 {\n flex: 1;\n min-width: 0;\n}\n\n._discoverField_1vpw3_1057 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n\n._discoverFieldLabel_1vpw3_1063 {\n font: var(--dsw-font-xxs-12);\n color: var(--dsw-alias-label-secondary);\n}\n\n._discoverConfirmHead_1vpw3_1068 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-14);\n}\n\n._discoverSkeletonFill_1vpw3_1074 {\n background: var(--dsw-alias-bg-skeleton);\n animation: _wb-skeleton_1vpw3_1 var(--wb-dur-1-5) cubic-bezier(0.36, 0, 0.64, 1) infinite;\n}\n\n._discoverArtwork_1vpw3_472._discoverSkeletonFill_1vpw3_1074 {\n border-color: transparent;\n}\n\n._discoverSkeletonBar_1vpw3_1083 {\n display: block;\n height: var(--wb-len-12);\n margin: var(--wb-len-4) 0;\n border-radius: var(--dsw-radius-xs);\n}\n\n._discoverSkeletonTitle_1vpw3_1090 {\n width: min(var(--wb-len-144), 60%);\n}\n\n._discoverSkeletonDesc_1vpw3_1094 {\n width: min(var(--wb-len-280), 85%);\n}\n\n@keyframes _wb-skeleton_1vpw3_1 {\n 0% {\n opacity: 1;\n }\n 40% {\n opacity: 0.6;\n }\n 80%,\n to {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._discoverSkeletonFill_1vpw3_1074 {\n animation: none;\n }\n}\n\n._block_mxnbc_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n padding: var(--wb-len-2) 0 var(--wb-len-8);\n min-width: 0;\n}\n\n._head_mxnbc_9 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._title_mxnbc_16 {\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._fact_mxnbc_22 {\n margin: 0;\n font: var(--dsw-font-xxs-12);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._actions_mxnbc_30 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-2);\n margin-left: calc(-1 * var(--wb-len-8));\n}\n\n._hint_mxnbc_38 {\n margin: 0;\n font: var(--dsw-font-xxs-12);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._output_mxnbc_44 {\n margin-top: var(--wb-len-2);\n min-width: 0;\n}\n._check_1g6tv_1 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n min-width: 0;\n}\n\n._status_1g6tv_8 {\n font: var(--dsw-font-xxs-12);\n color: var(--dsw-alias-label-caption);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n._button_1g6tv_15 {\n flex: none;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n}\n\n._icon_1g6tv_22 {\n display: inline-flex;\n}\n\n@media (max-width: 720px) {\n ._status_1g6tv_8 {\n display: none;\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._rows_85r3w_1 {\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_85r3w_1 {\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_85r3w_20 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._pick_85r3w_27 {\n flex: 0 1 auto;\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._pick_85r3w_27 > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._code_85r3w_39 {\n --dsl-code-block-background: var(--dsw-alias-bg-layer-1);\n margin: 0;\n}\n\n._missing_85r3w_44,\n._conflict_85r3w_45 {\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._body_11oac_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._sources_11oac_7 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._sourcesLabel_11oac_14 {\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-secondary);\n}\n\nbutton._sourceOn_11oac_19 {\n border-color: var(--dsw-alias-brand-primary);\n}\n._sourceCount_11oac_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_11oac_29 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._status_11oac_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_11oac_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_11oac_55 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._failureHint_11oac_62 {\n grid-column: 1;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failureAction_11oac_67 {\n grid-column: 2;\n grid-row: 1;\n justify-self: end;\n}\n\n._foot_11oac_73 {\n display: flex;\n justify-content: flex-end;\n}\n._body_lox98_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._field_lox98_7 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n\n._input_lox98_13 {\n width: 100%;\n}\n\n._label_lox98_17 {\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-secondary);\n}\n\n._hint_lox98_22 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._copy_lox98_28 {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wb-len-8) var(--wb-len-16);\n margin: 0;\n padding: 0;\n border: 0;\n}\n\n._copy_lox98_28 legend {\n padding: 0;\n margin-bottom: var(--wb-len-6);\n}\n\n._actions_lox98_42 {\n display: flex;\n justify-content: flex-end;\n}\n\n._commandLabel_lox98_47 {\n display: block;\n margin-top: var(--wb-len-4);\n}\n\n._command_lox98_47 {\n display: block;\n margin-top: var(--wb-len-4);\n padding: var(--wb-len-6) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-1);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxs-12-font-size);\n overflow-wrap: anywhere;\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._hint_zyzt3_1[hidden],\n._actions_zyzt3_2[hidden],\n._progress_zyzt3_3[hidden],\n._commandRow_zyzt3_4[hidden],\n._bridge_zyzt3_5[hidden],\n._raw_zyzt3_6[hidden] {\n display: none;\n}\n\n._gate_zyzt3_10 {\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_zyzt3_21 {\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_zyzt3_21:has(._actions_zyzt3_2:not([hidden])),\n._card_zyzt3_21:has(._bridge_zyzt3_5:not([hidden])) {\n max-width: var(--wb-len-520);\n}\n\n._title_zyzt3_36 {\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_zyzt3_1 {\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_zyzt3_51 {\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_zyzt3_51 {\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_zyzt3_51[data-status='running'] {\n color: var(--dsw-alias-label-primary);\n}\n\n._mark_zyzt3_78 {\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_zyzt3_51[data-status='ok'] ._mark_zyzt3_78 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._step_zyzt3_51[data-status='warn'] ._mark_zyzt3_78 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._step_zyzt3_51[data-status='failed'] ._mark_zyzt3_78 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._label_zyzt3_103 {\n flex: none;\n}\n\n._detail_zyzt3_107 {\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_zyzt3_3 {\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_zyzt3_125 {\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_zyzt3_133 {\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_zyzt3_4 {\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_zyzt3_159 {\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_zyzt3_159:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._command_zyzt3_4 {\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_zyzt3_192 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-12);\n}\n\n._mockSlot_zyzt3_199 {\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_zyzt3_192 {\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_zyzt3_192:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._button_zyzt3_192:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n._actions_zyzt3_2,\n._bridge_zyzt3_5 {\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_zyzt3_250 {\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_zyzt3_2 ._hint_zyzt3_1,\n._bridge_zyzt3_5 ._hint_zyzt3_1 {\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_zyzt3_2 ._commandRow_zyzt3_4,\n._bridge_zyzt3_5 ._commandRow_zyzt3_4 {\n margin: 0;\n}\n\n._actions_zyzt3_2 ._buttons_zyzt3_192,\n._bridge_zyzt3_5 ._buttons_zyzt3_192 {\n justify-content: flex-start;\n}\n\n._raw_zyzt3_6 {\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n text-align: left;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._rawSummary_zyzt3_286 {\n cursor: pointer;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._actions_zyzt3_2 ._error_zyzt3_133,\n._bridge_zyzt3_5 ._error_zyzt3_133 {\n margin-top: var(--wb-len-6);\n}\n\n._bridgeLines_zyzt3_296 {\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_zyzt3_296 a {\n display: block;\n margin-top: var(--wb-len-4);\n width: fit-content;\n}\n\n._link_zyzt3_313 {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n\n._link_zyzt3_313::after {\n content: '↗';\n margin-left: var(--wb-len-2);\n}\n\n._link_zyzt3_313:hover {\n text-decoration: underline;\n}\n\n._loading_zyzt3_327 {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._loading_zyzt3_327[hidden] {\n display: none;\n}\n\n._loadingMotion_zyzt3_336 {\n transform-origin: center;\n animation: _wb-spin_zyzt3_1 var(--wb-dur-1-5) linear infinite;\n}\n\n._loadingTrack_zyzt3_341,\n._loadingArc_zyzt3_342 {\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n}\n\n._loadingTrack_zyzt3_341 {\n opacity: 0.25;\n}\n\n._loadingArc_zyzt3_342 {\n stroke-dasharray: 12 150;\n animation: _wb-dash_zyzt3_1 var(--wb-dur-1-5) ease-in-out infinite;\n}\n\n@keyframes _wb-spin_zyzt3_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes _wb-dash_zyzt3_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_zyzt3_336,\n ._loadingArc_zyzt3_342 {\n animation: none;\n }\n}\n._changelog_1q6pj_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n margin-top: var(--wb-len-10);\n min-width: 0;\n}\n\n._changelogTitle_1q6pj_9 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._changelogMissing_1q6pj_15 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-primary);\n}\n\n._changelogBody_1q6pj_21 {\n max-height: var(--wb-len-320);\n overflow: auto;\n padding: var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\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._actions_smeq7_1 {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: var(--wb-len-8);\n max-width: 100%;\n}\n\n._action_smeq7_1 {\n flex: none;\n white-space: nowrap;\n}\n\n@container (max-width: 340px) {\n ._actions_smeq7_1 {\n flex-direction: column;\n width: var(--wb-len-220);\n max-width: 100%;\n }\n\n ._action_smeq7_1 {\n width: 100%;\n }\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*/";
15634
16422
  function workbenchCss() {
15635
16423
  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}`;
15636
16424
  }
@@ -15879,7 +16667,7 @@ function mount(ctx) {
15879
16667
  inject: () => ({
15880
16668
  t: ctx.locale.bind(LOCALE_NS),
15881
16669
  units: units.all(),
15882
- renderShell: shellApprovalDetail
16670
+ renderShell: shellApprovalRenderer(units.declared)
15883
16671
  })
15884
16672
  }, ApprovalDetail));
15885
16673
  ctx.slots.inject("conversation.session.header.corner", () => ctx.slots.register({