@dsh-workbench/core 1.1.3 → 1.1.5

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 (47) hide show
  1. package/client.js +1370 -585
  2. package/dist/client/client.body.js +1370 -585
  3. package/dist/client/index.js +1225 -440
  4. package/dist/host/index.js +784 -114
  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/discover-confirm.d.ts +3 -2
  8. package/dist/types/app/layouts/market/market-check.d.ts +12 -0
  9. package/dist/types/app/layouts/market/market-header.d.ts +1 -3
  10. package/dist/types/app/layouts/market/use-discover.d.ts +2 -1
  11. package/dist/types/app/layouts/market/use-git-transport.d.ts +2 -2
  12. package/dist/types/app/layouts/market/use-module-versions.d.ts +3 -0
  13. package/dist/types/app/layouts/market/use-settling-modules.d.ts +1 -0
  14. package/dist/types/app/layouts/rightbar/AskAgentButton.d.ts +6 -0
  15. package/dist/types/app/layouts/rightbar/FailureCard.d.ts +8 -0
  16. package/dist/types/app/layouts/rightbar/MarketView.d.ts +4 -1
  17. package/dist/types/app/layouts/rightbar/SharedSection.d.ts +5 -2
  18. package/dist/types/app/layouts/rightbar/failure-card-text.d.ts +14 -0
  19. package/dist/types/app/layouts/rightbar/market-act.d.ts +2 -5
  20. package/dist/types/app/layouts/rightbar/market-change.d.ts +1 -0
  21. package/dist/types/app/layouts/rightbar/market-freshness.d.ts +1 -0
  22. package/dist/types/app/layouts/rightbar/market-hint.d.ts +2 -0
  23. package/dist/types/app/layouts/rightbar/market-install.d.ts +11 -0
  24. package/dist/types/app/layouts/rightbar/market-row-types.d.ts +11 -2
  25. package/dist/types/app/layouts/rightbar/market-rows.d.ts +14 -1
  26. package/dist/types/app/layouts/rightbar/market-section.d.ts +8 -4
  27. package/dist/types/app/layouts/rightbar/market-transient-state.d.ts +3 -8
  28. package/dist/types/app/layouts/rightbar/market-view-text.d.ts +2 -0
  29. package/dist/types/app/layouts/rightbar/use-market-default.d.ts +12 -0
  30. package/dist/types/kernel/client/registry.d.ts +1 -0
  31. package/dist/types/kernel/contract/bundle-install.d.ts +1 -1
  32. package/dist/types/kernel/contract/market-index.d.ts +2 -2
  33. package/dist/types/modules/panels/model/market-install-error.d.ts +3 -0
  34. package/dist/types/modules/panels/model/market-install-error.test.d.ts +1 -0
  35. package/dist/types/modules/panels/model/market-installed.d.ts +19 -0
  36. package/dist/types/modules/panels/model/market-installed.test.d.ts +1 -0
  37. package/dist/types/modules/panels/model/market-registry.d.ts +2 -1
  38. package/dist/types/modules/panels/model/market-remove.d.ts +13 -0
  39. package/dist/types/modules/panels/model/market-remove.test.d.ts +1 -0
  40. package/dist/types/modules/panels/model/market-route.d.ts +2 -1
  41. package/dist/types/modules/panels/model/market.d.ts +1 -0
  42. package/dist/types/shared/api/host/git-probe.d.ts +3 -0
  43. package/dist/types/shared/api/host/market-sources-store.d.ts +2 -1
  44. package/dist/types/shared/api/host/profile-dependencies.d.ts +1 -0
  45. package/dist/types/shared/hooks/market-queries.d.ts +2 -1
  46. package/package.json +3 -3
  47. package/skills/workbench-module-diy/TOOLS.md +11 -2
@@ -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,17 +785,17 @@ 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$66 = react$1.createElement;
785
- var Fragment$23 = react$1.Fragment;
788
+ var h$69 = 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$37 = react$1.useState;
790
- var useEffect$29 = react$1.useEffect;
793
+ var useState$42 = react$1.useState;
794
+ var useEffect$31 = react$1.useEffect;
791
795
  react$1.useLayoutEffect;
792
796
  var useMemo$10 = react$1.useMemo;
793
797
  react$1.useCallback;
794
- var useRef$23 = react$1.useRef;
798
+ var useRef$24 = react$1.useRef;
795
799
  react$1.useSyncExternalStore;
796
800
  //#endregion
797
801
  //#region ../shared/dist/components/Activity.js
@@ -802,7 +806,7 @@ react$1.useSyncExternalStore;
802
806
  * @returns 一个 div。
803
807
  */
804
808
  function ActivityBlock({ head, children }) {
805
- return h$66("div", { className: "wb-activityBlock" }, head === void 0 ? null : h$66("div", { className: "wb-activityBlockHead" }, head), children);
809
+ return h$69("div", { className: "wb-activityBlock" }, head === void 0 ? null : h$69("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$66("div", { className: "wb-activityLine" }, dot, h$66("span", { className: "wb-activityLineText" }, text), at === void 0 ? null : h$66("span", { className: "wb-activityLineAt" }, at), actions === void 0 ? null : h$66("span", { className: "wb-activityLineActions" }, actions));
820
+ return h$69("div", { className: "wb-activityLine" }, dot, h$69("span", { className: "wb-activityLineText" }, text), at === void 0 ? null : h$69("span", { className: "wb-activityLineAt" }, at), actions === void 0 ? null : h$69("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$66("a", {
834
+ if (href !== void 0) return h$69("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$66(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
842
+ return h$69(_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$66(_deepseek_ai_dsh_client_ui_primitives.Button, {
848
+ }, h$69(_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$66("span", {
870
+ return as === "span" ? h$69("span", {
867
871
  className,
868
872
  role
869
- }, children) : h$66("p", {
873
+ }, children) : h$69("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$66(Note, { tone: "problem" }, h$66("span", null, this.props.t("panels.cardBroken", {
917
+ return h$69(Note, { tone: "problem" }, h$69("span", null, this.props.t("panels.cardBroken", {
914
918
  unit: this.props.unit,
915
919
  reason
916
- })), " ", h$66(_deepseek_ai_dsh_client_ui_primitives.Button, {
920
+ })), " ", h$69(_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$66(CardBoundary, {
970
+ return h$69(CardBoundary, {
967
971
  unit: owner.unit,
968
972
  resetKey: props.callId ?? "",
969
973
  t
970
- }, h$66(Render, {
974
+ }, h$69(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$66(Fragment$23, null, shell);
980
+ if (shell !== void 0 && shell !== null) return h$69(Fragment$22, null, shell);
977
981
  if (command === "") return null;
978
- return h$66(_deepseek_ai_dsh_client_ui_primitives.CodeBlock, {
982
+ return h$69(_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$66("div", { className: "wb-approvalPlan" }, hint === void 0 ? null : h$66("p", { className: "wb-approvalHint" }, hint), h$66("dl", { className: "wb-approvalRows" }, rows.map((row, index) => h$66("div", {
1000
+ return h$69("div", { className: "wb-approvalPlan" }, hint === void 0 ? null : h$69("p", { className: "wb-approvalHint" }, hint), h$69("dl", { className: "wb-approvalRows" }, rows.map((row, index) => h$69("div", {
997
1001
  className: "wb-approvalRow",
998
1002
  key: String(index)
999
- }, h$66("dt", { className: "wb-approvalLabel" }, row.label), h$66("dd", { className: "wb-approvalValue" }, row.value)))), children, warn === void 0 ? null : h$66("p", { className: "wb-approvalWarn" }, warn));
1003
+ }, h$69("dt", { className: "wb-approvalLabel" }, row.label), h$69("dd", { className: "wb-approvalValue" }, row.value)))), children, warn === void 0 ? null : h$69("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$66("header", { className: "wb-cardHead" }, h$66("h2", { className: "wb-cardTitle" }, title), meta === void 0 ? null : h$66("span", { className: "wb-cardMeta" }, meta), platformHref === void 0 ? null : h$66(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
1020
+ return h$69("header", { className: "wb-cardHead" }, h$69("h2", { className: "wb-cardTitle" }, title), meta === void 0 ? null : h$69("span", { className: "wb-cardMeta" }, meta), platformHref === void 0 ? null : h$69(_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$66("a", {
1026
+ }, h$69("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$66(_deepseek_ai_dsh_client_ui_primitives.IconRightUpOutlineRegular, { size: 14 }))), h$66(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
1032
+ }, h$69(_deepseek_ai_dsh_client_ui_primitives.IconRightUpOutlineRegular, { size: 14 }))), h$69(_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$66(_deepseek_ai_dsh_client_ui_primitives.Button, {
1038
+ }, h$69(_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$66(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutlineRegular, { size: 14 }),
1045
+ icon: h$69(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutlineRegular, { size: 14 }),
1042
1046
  onClick: onRefresh
1043
- })), gear === void 0 || onToggleGear === void 0 ? null : h$66(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
1047
+ })), gear === void 0 || onToggleGear === void 0 ? null : h$69(_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$66(_deepseek_ai_dsh_client_ui_primitives.Button, {
1053
+ }, h$69(_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$66(_deepseek_ai_dsh_client_ui_primitives.IconSettingsOutlineRegular, { size: 15 }),
1060
+ icon: h$69(_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$66("section", { className: "wb-card" }, head === void 0 ? h$66(CardHead, {
1077
+ return h$69("section", { className: "wb-card" }, head === void 0 ? h$69(CardHead, {
1074
1078
  t,
1075
1079
  title,
1076
1080
  refreshing,
1077
1081
  onRefresh,
1078
1082
  meta
1079
- }) : head, h$66("div", { className: "wb-cardBody" }, children));
1083
+ }) : head, h$69("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$66("div", {
1103
+ return h$69("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$66("span", {
1117
+ return h$69("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$66(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
1123
+ }, h$69(_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$66("span", {
1131
+ const body = input.loading ? h$69("span", {
1128
1132
  className: "wb-choiceLoading",
1129
1133
  role: "status"
1130
- }, h$66(Spinner, { size: 14 }), h$66("span", { className: "wb-choiceLoadingText" }, input.loadingText ?? "…")) : input.options.length === 0 ? input.emptyText === void 0 ? null : h$66("span", { className: "wb-choiceEmpty" }, input.emptyText) : input.options.map((option) => {
1134
+ }, h$69(Spinner, { size: 14 }), h$69("span", { className: "wb-choiceLoadingText" }, input.loadingText ?? "…")) : input.options.length === 0 ? input.emptyText === void 0 ? null : h$69("span", { className: "wb-choiceEmpty" }, input.emptyText) : input.options.map((option) => {
1131
1135
  const row = input.rowOf(option.value);
1132
- return h$66(Fragment$23, { key: option.value }, h$66("label", { className: `wb-choiceOption${row.checked ? " wb-choiceOptionOn" : ""}` }, h$66("input", {
1136
+ return h$69(Fragment$22, { key: option.value }, h$69("label", { className: `wb-choiceOption${row.checked ? " wb-choiceOptionOn" : ""}` }, h$69("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$66("span", {
1143
+ }), input.multi ? h$69("span", {
1140
1144
  className: "wb-checkboxBox",
1141
1145
  "aria-hidden": "true"
1142
- }, row.checked ? h$66(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutlineRegular, { size: 12 }) : null) : null, h$66("span", { className: "wb-choiceLabel" }, h$66("span", { className: "wb-choiceLabelText" }, option.label), option.description === void 0 ? null : h$66("span", { className: "wb-choiceDescription" }, option.description))));
1146
+ }, row.checked ? h$69(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutlineRegular, { size: 12 }) : null) : null, h$69("span", { className: "wb-choiceLabel" }, h$69("span", { className: "wb-choiceLabelText" }, option.label), option.description === void 0 ? null : h$69("span", { className: "wb-choiceDescription" }, option.description))));
1143
1147
  });
1144
- return h$66("div", {
1148
+ return h$69("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$66(ChoiceMenu, {
1182
+ return h$69(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$66(ChoiceMenu, {
1202
+ return h$69(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$66("div", { className: "wb-formActions" }, ordered(actions).map((action) => {
1255
+ return h$69("div", { className: "wb-formActions" }, ordered(actions).map((action) => {
1252
1256
  const kind = kindOf(action);
1253
1257
  const busy = action.busy === true;
1254
- return h$66(_deepseek_ai_dsh_client_ui_primitives.Button, {
1258
+ return h$69(_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$66(Spinner, { size: 12 }) : void 0,
1265
+ icon: busy ? h$69(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$66("div", { className: "wb-rows" }, children);
1278
+ return h$69("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$66("div", { className: "wb-row" }, h$66("span", { className: "wb-rowKey" }, label), h$66("span", { className: "wb-rowValue" }, value));
1287
+ return h$69("div", { className: "wb-row" }, h$69("span", { className: "wb-rowKey" }, label), h$69("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$66("div", {
1304
+ return h$69("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$66("p", { className: "wb-confirmBarTitle" }, title), hint === void 0 ? null : h$66("p", { className: "wb-confirmBarHint" }, hint), rows === void 0 || rows.length === 0 ? null : h$66(Rows, null, rows.map((row) => h$66(Row, {
1309
+ }, h$69("p", { className: "wb-confirmBarTitle" }, title), hint === void 0 ? null : h$69("p", { className: "wb-confirmBarHint" }, hint), rows === void 0 || rows.length === 0 ? null : h$69(Rows, null, rows.map((row) => h$69(Row, {
1306
1310
  key: row.key,
1307
1311
  label: row.label,
1308
1312
  value: row.value
1309
- }))), problem === void 0 ? null : h$66(Note, {
1313
+ }))), problem === void 0 ? null : h$69(Note, {
1310
1314
  tone: "problem",
1311
1315
  role: "alert"
1312
- }, problem), h$66(FormActions, { actions }));
1316
+ }, problem), h$69(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$66("label", { className: "wb-field" }, h$66("span", { className: "wb-fieldLabel" }, label), children, hint === void 0 ? null : h$66("span", { className: "wb-fieldHint" }, hint));
1328
+ return h$69("label", { className: "wb-field" }, h$69("span", { className: "wb-fieldLabel" }, label), children, hint === void 0 ? null : h$69("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$66("div", { className: "wb-formRows" }, children);
1338
+ return h$69("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$66("div", {
1351
+ return h$69("div", {
1348
1352
  className: "wb-formRow",
1349
1353
  "data-layout": layout,
1350
1354
  "data-wb-problem": problem === void 0 ? void 0 : ""
1351
- }, h$66("label", {
1355
+ }, h$69("label", {
1352
1356
  className: "wb-formLabel",
1353
1357
  htmlFor
1354
- }, label), h$66("span", { className: "wb-formControl" }, children), problem === void 0 ? hint === void 0 ? null : h$66("span", { className: "wb-formHint" }, hint) : h$66("span", { className: "wb-formProblem" }, problem));
1358
+ }, label), h$69("span", { className: "wb-formControl" }, children), problem === void 0 ? hint === void 0 ? null : h$69("span", { className: "wb-formHint" }, hint) : h$69("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$66(FormRow, {
1505
+ return args.fields.map((field) => h$69(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$37(false);
1578
- const [reveal, setReveal] = useState$37(0);
1579
- const rootRef = useRef$23(null);
1581
+ const [done, setDone] = useState$42(false);
1582
+ const [reveal, setReveal] = useState$42(0);
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$29(() => {
1587
+ useEffect$31(() => {
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$66("form", {
1602
+ return h$69("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$66(FormRows, null, formRowsOf({
1610
+ }, h$69(FormRows, null, formRowsOf({
1607
1611
  fields: shown,
1608
1612
  problems,
1609
1613
  showProblem: done,
1610
1614
  busy
1611
- })), problem === void 0 ? null : h$66(Note, {
1615
+ })), problem === void 0 ? null : h$69(Note, {
1612
1616
  tone: "problem",
1613
1617
  role: "alert"
1614
- }, problem), h$66(FormActions, { actions: formActionsOf({
1618
+ }, problem), h$69(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$66("a", {
1639
+ return h$69("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$66(_deepseek_ai_dsh_client_ui_primitives.IconRightUpOutlineRegular, { size: 12 }) : null);
1647
+ }, children, external ? h$69(_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$66(Link, {
1739
+ return h$69(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$37(false);
1756
- const [rawOpen, setRawOpen] = useState$37(false);
1757
- const [armed, setArmed] = useState$37(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$29(() => {
1769
+ useEffect$31(() => {
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$66("div", { className: "wb-longTask" }, h$66("p", { className: "wb-longTaskHead" }, h$66(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
1788
+ return h$69("div", { className: "wb-longTask" }, h$69("p", { className: "wb-longTaskHead" }, h$69(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
1785
1789
  state: longTaskDot(props.status),
1786
1790
  size: 10
1787
- }), h$66("span", { className: "wb-longTaskHeadline" }, props.headline), (props.links ?? []).map((link) => h$66(RowLink, {
1791
+ }), h$69("span", { className: "wb-longTaskHeadline" }, props.headline), (props.links ?? []).map((link) => h$69(RowLink, {
1788
1792
  href: link.href,
1789
1793
  key: `${link.text}@${link.href}`,
1790
1794
  text: link.text
1791
- })), stop === void 0 ? null : h$66("button", {
1795
+ })), stop === void 0 ? null : h$69("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$66(_deepseek_ai_dsh_client_ui_primitives.IconStopFillRegular, { size: 12 }), armed ? h$66("span", { className: "wb-longTaskStopLabel" }, stop.askLabel) : null)), problem === "" ? null : h$66("p", { className: "wb-longTaskProblem" }, problem), stopWhy === "" ? null : h$66("p", { className: "wb-longTaskStopWhy" }, stopWhy), !failed ? null : h$66(Fragment$23, null, steps.length === 0 || props.stepsTitle === void 0 ? null : h$66(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
1806
+ }, h$69(_deepseek_ai_dsh_client_ui_primitives.IconStopFillRegular, { size: 12 }), armed ? h$69("span", { className: "wb-longTaskStopLabel" }, stop.askLabel) : null)), problem === "" ? null : h$69("p", { className: "wb-longTaskProblem" }, problem), stopWhy === "" ? null : h$69("p", { className: "wb-longTaskStopWhy" }, stopWhy), !failed ? null : h$69(Fragment$22, null, steps.length === 0 || props.stepsTitle === void 0 ? null : h$69(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
1803
1807
  className: "wb-longTaskDump",
1804
- icon: h$66(_deepseek_ai_dsh_client_ui_primitives.IconFlatListOutlineRegular, { size: 14 }),
1808
+ icon: h$69(_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$66(_deepseek_ai_dsh_client_ui_primitives.CodeBlock, {
1815
+ }, h$69(_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$66(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
1821
+ })), raw === "" || props.rawTitle === void 0 ? null : h$69(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
1818
1822
  className: "wb-longTaskDump",
1819
- icon: h$66(_deepseek_ai_dsh_client_ui_primitives.IconCodeOutlineRegular, { size: 14 }),
1823
+ icon: h$69(_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$66(_deepseek_ai_dsh_client_ui_primitives.CodeBlock, {
1830
+ }, h$69(_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$66("div", {
1846
+ return h$69("div", {
1843
1847
  className: "wb-skeleton",
1844
1848
  "aria-hidden": "true"
1845
- }, Array.from({ length: rows }, (_, index) => h$66("span", {
1849
+ }, Array.from({ length: rows }, (_, index) => h$69("span", {
1846
1850
  key: index,
1847
1851
  className: "wb-skeletonRow"
1848
- }, h$66("span", { className: "wb-skeletonBar wb-skeletonBarTitle" }), h$66("span", { className: "wb-skeletonBar wb-skeletonBarMeta" }))));
1852
+ }, h$69("span", { className: "wb-skeletonBar wb-skeletonBarTitle" }), h$69("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$66("div", {
1865
+ return h$69("div", {
1862
1866
  className: compact ? "wb-centered wb-centeredCompact" : "wb-centered",
1863
1867
  role: "status"
1864
- }, icon === null ? null : h$66("span", {
1868
+ }, icon === null ? null : h$69("span", {
1865
1869
  className: "wb-centeredHero",
1866
1870
  "aria-hidden": "true"
1867
- }, icon), h$66("div", { className: "wb-centeredTitle" }, title), hint === void 0 ? null : h$66("div", { className: "wb-centeredHint" }, hint), detail === void 0 ? null : h$66("div", { className: "wb-centeredDetail" }, detail), action === void 0 ? null : h$66("div", { className: "wb-centeredAction" }, action));
1871
+ }, icon), h$69("div", { className: "wb-centeredTitle" }, title), hint === void 0 ? null : h$69("div", { className: "wb-centeredHint" }, hint), detail === void 0 ? null : h$69("div", { className: "wb-centeredDetail" }, detail), action === void 0 ? null : h$69("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$66(CenteredState, {
1881
+ return h$69(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$66(FormActions, { actions: [{
1899
+ return h$69(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$66("button", {
1932
+ return h$69("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$66("span", { className: "wb-selectIcon" }, args.icon) : h$66(Fragment$23, null, args.icon === void 0 ? null : h$66("span", { className: "wb-selectIcon" }, args.icon), h$66("span", { className: "wb-selectValue" }, args.value), h$66("span", { className: "wb-selectChevron" }, h$66(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, { size: 14 }))));
1943
+ }, args.iconOnly ? h$69("span", { className: "wb-selectIcon" }, args.icon) : h$69(Fragment$22, null, args.icon === void 0 ? null : h$69("span", { className: "wb-selectIcon" }, args.icon), h$69("span", { className: "wb-selectValue" }, args.value), h$69("span", { className: "wb-selectChevron" }, h$69(_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$66("button", {
1955
+ return h$69("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$66("span", { className: "wb-selectValue" }, h$66(_deepseek_ai_dsh_client_ui_primitives.TextShimmer, { active: true }, args.loadingText ?? "…")), h$66("span", { className: "wb-selectChevron" }, h$66(Spinner, { size: 14 })));
1964
+ }, h$69("span", { className: "wb-selectValue" }, h$69(_deepseek_ai_dsh_client_ui_primitives.TextShimmer, { active: true }, args.loadingText ?? "…")), h$69("span", { className: "wb-selectChevron" }, h$69(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$66("input", {
1974
+ return h$69("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$66("span", {
1997
+ const revealed = (node) => h$69("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$29(() => {
2013
+ useEffect$31(() => {
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$66("span", { className: "wb-selectPlaceholder" }, placeholder ?? "—");
2019
+ if (current === void 0) return h$69("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$66("span", {
2023
+ return h$69("span", {
2020
2024
  ref: args.boxRef,
2021
2025
  className: args.className
2022
- }, h$66("span", { className: "wb-selectSearchIcon" }, h$66(_deepseek_ai_dsh_client_ui_primitives.IconSearchOutlineRegular, { size: 14 })), h$66(TextField, {
2026
+ }, h$69("span", { className: "wb-selectSearchIcon" }, h$69(_deepseek_ai_dsh_client_ui_primitives.IconSearchOutlineRegular, { size: 14 })), h$69(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$66(_deepseek_ai_dsh_client_ui_primitives.Menu, {
2041
+ return h$69(_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$66("span", { className: "wb-select" }, control, h$66("span", { className: "wb-selectHint" }, hint)) : h$66(Field, {
2058
+ const inner = label === void 0 ? hint === void 0 ? control : h$69("span", { className: "wb-select" }, control, h$69("span", { className: "wb-selectHint" }, hint)) : h$69(Field, {
2055
2059
  label,
2056
2060
  hint
2057
2061
  }, control);
2058
- return className === void 0 ? inner : h$66("div", { className }, inner);
2062
+ return className === void 0 ? inner : h$69("div", { className }, inner);
2059
2063
  }
2060
2064
  /** 算候选项用来匹配搜索的文本:有 `searchText` 就用它,否则取字符串标签;标签不是字符串又没给它是空串(这项搜不到)。 */
2061
2065
  function searchTextOf(option) {
@@ -2107,24 +2111,24 @@ 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$37(false);
2111
- const [query, setQuery] = useState$37("");
2112
- const [cursor, setCursor] = useState$37(null);
2113
- const boxRef = useRef$23(null);
2114
- const triggerRef = useRef$23(null);
2115
- const wasOpenRef = useRef$23(false);
2116
- const pickedRef = useRef$23(false);
2117
- const closedByUsRef = useRef$23(false);
2114
+ const [openState, setOpenState] = useState$42(false);
2115
+ const [query, setQuery] = useState$42("");
2116
+ const [cursor, setCursor] = useState$42(null);
2117
+ const boxRef = useRef$24(null);
2118
+ const triggerRef = useRef$24(null);
2119
+ const wasOpenRef = useRef$24(false);
2120
+ const pickedRef = useRef$24(false);
2121
+ const closedByUsRef = useRef$24(false);
2118
2122
  const open = openProp ?? openState;
2119
2123
  const setOpen = (next) => {
2120
2124
  if (openProp === void 0) setOpenState(next);
2121
2125
  onOpenChange?.(next);
2122
2126
  };
2123
- useEffect$29(() => {
2127
+ useEffect$31(() => {
2124
2128
  if (!open || props.search === false) return;
2125
2129
  boxRef.current?.querySelector("input")?.focus();
2126
2130
  }, [open, props.search]);
2127
- useEffect$29(() => {
2131
+ useEffect$31(() => {
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$66(TextField, {
2201
+ if (fallback !== void 0 && options.length === 0) return framed(label, hint, className, h$69(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$66("section", {
2284
+ return h$69("section", {
2281
2285
  className: "wb-settings",
2282
2286
  role: "group",
2283
2287
  "aria-label": label
2284
- }, h$66("header", { className: "wb-settingsHead" }, h$66("span", { className: "wb-settingsTitle" }, title), action), children);
2288
+ }, h$69("header", { className: "wb-settingsHead" }, h$69("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$66("div", { className: "wb-stack" }, children);
2298
+ return h$69("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$66("div", { className: "wb-stateBlock" }, title === void 0 && dot === void 0 ? null : h$66("p", { className: "wb-stateBlockTitle" }, dot, title), resolving === void 0 ? null : h$66("p", { className: "wb-stateBlockResolving" }, resolving), hint === void 0 ? null : h$66("p", { className: "wb-stateBlockHint" }, hint), children, actions === void 0 ? null : h$66("div", { className: "wb-stateBlockActions" }, actions));
2313
+ return h$69("div", { className: "wb-stateBlock" }, title === void 0 && dot === void 0 ? null : h$69("p", { className: "wb-stateBlockTitle" }, dot, title), resolving === void 0 ? null : h$69("p", { className: "wb-stateBlockResolving" }, resolving), hint === void 0 ? null : h$69("p", { className: "wb-stateBlockHint" }, hint), children, actions === void 0 ? null : h$69("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$66("svg", {
2318
+ return h$69("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$66(Shell, {
2335
+ return h$69(Shell, {
2332
2336
  size,
2333
2337
  strokeWidth: 1.3
2334
- }, h$66("path", {
2338
+ }, h$69("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$66(Shell, {
2353
+ return h$69(Shell, {
2350
2354
  size,
2351
2355
  viewBox: "0 0 64 64"
2352
- }, h$66("path", {
2356
+ }, h$69("path", {
2353
2357
  d: BRAND_FRAME,
2354
2358
  fill: "currentColor",
2355
2359
  fillRule: "evenodd"
2356
- }), h$66("rect", {
2360
+ }), h$69("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$66("rect", {
2366
+ }), h$69("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$66("g", { transform: BRAND_TAIL_TRANSFORM }, h$66("path", {
2373
+ }), h$69("g", { transform: BRAND_TAIL_TRANSFORM }, h$69("path", {
2370
2374
  d: BRAND_TAIL,
2371
2375
  fill: "currentColor"
2372
- }), h$66("circle", {
2376
+ }), h$69("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$66(Shell, {
2389
+ return h$69(Shell, {
2386
2390
  size,
2387
2391
  viewBox: "0 0 64 64"
2388
- }, h$66("defs", null, h$66("linearGradient", {
2392
+ }, h$69("defs", null, h$69("linearGradient", {
2389
2393
  id: "opencli-mark",
2390
2394
  x1: "0%",
2391
2395
  y1: "0%",
2392
2396
  x2: "100%",
2393
2397
  y2: "100%"
2394
- }, h$66("stop", {
2398
+ }, h$69("stop", {
2395
2399
  offset: "0%",
2396
2400
  stopColor: "#00e5a0"
2397
- }), h$66("stop", {
2401
+ }), h$69("stop", {
2398
2402
  offset: "50%",
2399
2403
  stopColor: "#00b4d8"
2400
- }), h$66("stop", {
2404
+ }), h$69("stop", {
2401
2405
  offset: "100%",
2402
2406
  stopColor: "#7b61ff"
2403
- }))), h$66("rect", {
2407
+ }))), h$69("rect", {
2404
2408
  width: 64,
2405
2409
  height: 64,
2406
2410
  rx: 14,
2407
2411
  fill: "#0a0a0f"
2408
- }), h$66("text", {
2412
+ }), h$69("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$66(Shell, {
2429
+ return h$69(Shell, {
2426
2430
  size,
2427
2431
  viewBox: "0 0 1024 1024"
2428
- }, h$66("path", {
2432
+ }, h$69("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$66(Shell, {
2443
+ return h$69(Shell, {
2440
2444
  size,
2441
2445
  viewBox: "0 0 24 24"
2442
- }, h$66("defs", null, h$66("linearGradient", {
2446
+ }, h$69("defs", null, h$69("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$66("stop", {
2452
+ }, h$69("stop", {
2449
2453
  offset: "0%",
2450
2454
  stopColor: "#3b82f6"
2451
- }), h$66("stop", {
2455
+ }), h$69("stop", {
2452
2456
  offset: "55%",
2453
2457
  stopColor: "#8b5cf6"
2454
- }), h$66("stop", {
2458
+ }), h$69("stop", {
2455
2459
  offset: "100%",
2456
2460
  stopColor: "#14b8a6"
2457
- }))), h$66("rect", {
2461
+ }))), h$69("rect", {
2458
2462
  width: 24,
2459
2463
  height: 24,
2460
2464
  rx: 7,
2461
2465
  fill: "url(#workbench-module-mark)"
2462
- }), h$66("rect", {
2466
+ }), h$69("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$66("rect", {
2473
+ }), h$69("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$66("rect", {
2481
+ }), h$69("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$66("rect", {
2489
+ }), h$69("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$66("svg", {
2504
+ return h$69("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$66("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$69("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 没写`);
@@ -3097,7 +3140,42 @@ var en = {
3097
3140
  "panels.market.confirmUninstallAck": "I understand: using it again means reinstalling it.",
3098
3141
  "panels.market.confirmYes": "Uninstall",
3099
3142
  "panels.market.confirmNo": "Cancel",
3143
+ "panels.market.noMarketSource": "The index has no newer version of this module (refresh the index and retry)",
3100
3144
  "panels.market.failed": "Failed: {reason}",
3145
+ "panels.market.askAgent": "Ask the agent",
3146
+ "panels.market.askAgentCopied": "Copied",
3147
+ "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.",
3148
+ "panels.market.failure.permission": "Didn't install: no write access",
3149
+ "panels.market.failure.diskFull": "Didn't install: the disk is full",
3150
+ "panels.market.failure.sandbox": "Didn't install: the system blocked it",
3151
+ "panels.market.failure.unknown": "Didn't install: cause not recognised",
3152
+ "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).",
3153
+ "panels.market.failure.factMode": "{path} is mode {mode}, so this account cannot write to it.",
3154
+ "panels.market.failure.factSpace": "The disk holding {path} is full.",
3155
+ "panels.market.failure.factStuck": "This command ran in a restricted environment and cannot write to {path}.",
3156
+ "panels.market.failure.nowhere": "(the directory was not identified)",
3157
+ "panels.market.failure.copyFix": "Copy the fix command",
3158
+ "panels.market.failure.copied": "Copied",
3159
+ "panels.market.failure.copiedHint": "Paste it in a terminal, run it, then click Check again.",
3160
+ "panels.market.failure.askAgent": "Copy for the agent",
3161
+ "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.",
3162
+ "panels.market.failure.askAgentHint": "Paste it into the chat and let the agent carry on.",
3163
+ "panels.market.failure.recheck": "Check again",
3164
+ "panels.market.failure.showOutput": "Show install output",
3165
+ "panels.market.failure.hideOutput": "Hide install output",
3166
+ "panels.market.failure.term.commandLine": "command on line {line}",
3167
+ "panels.market.failure.term.signal": "killed by {signal}",
3168
+ "panels.market.failure.term.exitCode": "exit code {exitCode}",
3169
+ "panels.market.failure.term.noExitCode": "no exit code",
3170
+ "panels.market.failure.term.running": "running",
3171
+ "panels.market.failure.term.failed": "failed",
3172
+ "panels.market.failure.term.done": "done",
3173
+ "panels.market.failure.term.copy": "Copy",
3174
+ "panels.market.failure.term.copied": "Copied",
3175
+ "panels.market.failure.term.noOutput": "No output",
3176
+ "panels.market.failure.term.collapse": "Collapse",
3177
+ "panels.market.failure.term.expandAria": "Show the remaining {hidden} lines",
3178
+ "panels.market.failure.term.expand": "Show {hidden} lines",
3101
3179
  "panels.market.needEnv": "Set {env} in the terminal that started the workbench first",
3102
3180
  "panels.market.needCommands": "Missing commands: {commands}",
3103
3181
  "panels.market.needBinary": "Install the {command} command first",
@@ -3133,9 +3211,13 @@ var en = {
3133
3211
  "panels.market.pluginBroken": "This plugin install is broken: it cannot be identified. Uninstall it first, then ask the agent to reinstall it by package name.",
3134
3212
  "panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
3135
3213
  "panels.market.foot": "After installing, enable it in the panel page of that project.",
3136
- "panels.market.recheck": "Check for updates",
3137
3214
  "panels.market.checkUpdates": "Check for updates",
3215
+ "panels.market.checkingNow": "Checking…",
3216
+ "panels.market.checkFailed": "The last check failed. Check your connection and retry.",
3138
3217
  "panels.market.checkedAt": "Last checked: {time}",
3218
+ "panels.market.latestPartial": "Could not check {n} modules",
3219
+ "panels.market.latestNoRegistry": "No source configured — the latest version was not checked",
3220
+ "panels.market.latestProbeFailed": "Could not reach the source — try again later",
3139
3221
  "panels.market.justNow": "just now",
3140
3222
  "panels.market.minutesAgo": "{n} min ago",
3141
3223
  "panels.market.hoursAgo": "{n} h ago",
@@ -3312,6 +3394,9 @@ var en = {
3312
3394
  "panels.discover.transportTest": "Test this address",
3313
3395
  "panels.discover.transportPlaceholder": "Or paste another address (mirror, alias)",
3314
3396
  "panels.discover.transportNeedsAuth": "This repository needs credentials: clone it once in a terminal, or set up an SSH key / credential helper, then install again.",
3397
+ "panels.discover.transportChange": "Change address",
3398
+ "panels.discover.transportChangeHide": "Hide",
3399
+ "panels.discover.transportNone": "No readable address",
3315
3400
  "panels.discover.expand": "Show versions",
3316
3401
  "panels.discover.collapse": "Hide versions",
3317
3402
  "panels.discover.versionCount": "{n} versions",
@@ -3597,6 +3682,9 @@ var en = {
3597
3682
  "approval.record.noSwitch": "it will not switch you back (the leftbar footer shows the state)",
3598
3683
  "approval.longTask.what": "Task to stop",
3599
3684
  "approval.longTask.signal": "stopping only sends an interrupt signal — wrapping up the run is up to the module",
3685
+ "approval.plugin.name": "Plugin",
3686
+ "approval.plugin.command": "Command",
3687
+ "approval.plugin.note": "Agent says",
3600
3688
  "approval.publish.module": "Module",
3601
3689
  "approval.publish.target": "Target",
3602
3690
  "approval.publish.version": "Version",
@@ -3792,7 +3880,42 @@ var dictionaries = {
3792
3880
  "panels.market.confirmUninstallAck": "我明白:卸载后想再用,得重新装一遍。",
3793
3881
  "panels.market.confirmYes": "卸载",
3794
3882
  "panels.market.confirmNo": "取消",
3883
+ "panels.market.noMarketSource": "索引里没有这个模块的新版本(刷新一次索引再试)",
3795
3884
  "panels.market.failed": "没成功:{reason}",
3885
+ "panels.market.askAgent": "问 agent",
3886
+ "panels.market.askAgentCopied": "已复制",
3887
+ "panels.market.askAgentText": "工作台里「{name}」(单元 {unit})用不了:{reason}。帮我查清缺什么、怎么补,补完确认真能用。",
3888
+ "panels.market.failure.permission": "没装上:没有写入权限",
3889
+ "panels.market.failure.diskFull": "没装上:磁盘满了",
3890
+ "panels.market.failure.sandbox": "没装上:被系统拦住了",
3891
+ "panels.market.failure.unknown": "没装上:原因没认出来",
3892
+ "panels.market.failure.factOwner": "{path} 属于 {owner},当前账号({me})写不进去。把它还给自己就行(会要开机密码)。",
3893
+ "panels.market.failure.factMode": "{path} 的权限是 {mode},当前账号没有写权限。",
3894
+ "panels.market.failure.factSpace": "{path} 所在的磁盘满了。",
3895
+ "panels.market.failure.factStuck": "这条命令跑在受限环境里,写不进 {path}。",
3896
+ "panels.market.failure.nowhere": "(没认出是哪个目录)",
3897
+ "panels.market.failure.copyFix": "复制修复命令",
3898
+ "panels.market.failure.copied": "已复制",
3899
+ "panels.market.failure.copiedHint": "粘到终端跑一次,回来点「再检测」。",
3900
+ "panels.market.failure.askAgent": "复制给 agent",
3901
+ "panels.market.failure.askAgentText": "装这个模块时写不进去:`{command}` 退出码 {code},卡在 {path}。帮我看看是被沙箱拦的还是权限问题,换一条能写进去的路再装。",
3902
+ "panels.market.failure.askAgentHint": "粘到对话里,让 agent 接着弄。",
3903
+ "panels.market.failure.recheck": "再检测",
3904
+ "panels.market.failure.showOutput": "查看安装输出",
3905
+ "panels.market.failure.hideOutput": "收起安装输出",
3906
+ "panels.market.failure.term.commandLine": "第 {line} 行的命令",
3907
+ "panels.market.failure.term.signal": "被 {signal} 终止",
3908
+ "panels.market.failure.term.exitCode": "退出码 {exitCode}",
3909
+ "panels.market.failure.term.noExitCode": "没有退出码",
3910
+ "panels.market.failure.term.running": "在跑",
3911
+ "panels.market.failure.term.failed": "没跑通",
3912
+ "panels.market.failure.term.done": "跑完了",
3913
+ "panels.market.failure.term.copy": "复制",
3914
+ "panels.market.failure.term.copied": "已复制",
3915
+ "panels.market.failure.term.noOutput": "没有输出",
3916
+ "panels.market.failure.term.collapse": "收起",
3917
+ "panels.market.failure.term.expandAria": "展开剩下的 {hidden} 行",
3918
+ "panels.market.failure.term.expand": "展开 {hidden} 行",
3796
3919
  "panels.market.needEnv": "先在启动工作台的终端里设 {env}",
3797
3920
  "panels.market.needCommands": "缺这几条命令:{commands}",
3798
3921
  "panels.market.needBinary": "先装 {command} 命令",
@@ -3828,9 +3951,13 @@ var dictionaries = {
3828
3951
  "panels.market.pluginBroken": "这份插件装坏了:认不出它是什么。可以先卸载,再让 agent 按包名重装一次。",
3829
3952
  "panels.market.restartNeeded": "新版装好了,重启一次才生效。",
3830
3953
  "panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
3831
- "panels.market.recheck": "重新检查更新",
3832
3954
  "panels.market.checkUpdates": "检查更新",
3955
+ "panels.market.checkingNow": "正在检查…",
3956
+ "panels.market.checkFailed": "最近一次没查到,检查网络后重试",
3833
3957
  "panels.market.checkedAt": "最近检查:{time}",
3958
+ "panels.market.latestPartial": "{n} 个模块没查成",
3959
+ "panels.market.latestNoRegistry": "没配来源,未检查新版",
3960
+ "panels.market.latestProbeFailed": "问不到源,稍后重试",
3834
3961
  "panels.market.justNow": "刚刚",
3835
3962
  "panels.market.minutesAgo": "{n} 分钟前",
3836
3963
  "panels.market.hoursAgo": "{n} 小时前",
@@ -4007,6 +4134,9 @@ var dictionaries = {
4007
4134
  "panels.discover.transportTest": "试这个地址",
4008
4135
  "panels.discover.transportPlaceholder": "或贴一个别的地址(公司镜像、别名)",
4009
4136
  "panels.discover.transportNeedsAuth": "这个仓库要凭证:先在终端里把它 clone 一次,或配好 SSH key / 凭据助手;配好后再点安装。",
4137
+ "panels.discover.transportChange": "换一个地址",
4138
+ "panels.discover.transportChangeHide": "收起",
4139
+ "panels.discover.transportNone": "没有可读的地址",
4010
4140
  "panels.discover.expand": "展开版本",
4011
4141
  "panels.discover.collapse": "收起版本",
4012
4142
  "panels.discover.versionCount": "{n} 个版本",
@@ -4292,6 +4422,9 @@ var dictionaries = {
4292
4422
  "approval.record.noSwitch": "录完不会替你切回来(左栏底部会亮一条状态)",
4293
4423
  "approval.longTask.what": "要停的那次任务",
4294
4424
  "approval.longTask.signal": "停了只是让工作台发出中断信号 —— 这次任务怎么收尾由模块自己负责",
4425
+ "approval.plugin.name": "插件",
4426
+ "approval.plugin.command": "命令",
4427
+ "approval.plugin.note": "agent 说",
4295
4428
  "approval.publish.module": "模块",
4296
4429
  "approval.publish.target": "目标",
4297
4430
  "approval.publish.version": "版本",
@@ -4815,14 +4948,14 @@ function bumpCapabilityEpoch() {
4815
4948
  epoch$1 += 1;
4816
4949
  }
4817
4950
  var current$1 = null;
4818
- var listeners$7 = /* @__PURE__ */ new Set();
4951
+ var listeners$8 = /* @__PURE__ */ new Set();
4819
4952
  function capabilityValue() {
4820
4953
  return current$1;
4821
4954
  }
4822
4955
  function subscribeCapabilities(listener) {
4823
- listeners$7.add(listener);
4956
+ listeners$8.add(listener);
4824
4957
  return () => {
4825
- listeners$7.delete(listener);
4958
+ listeners$8.delete(listener);
4826
4959
  };
4827
4960
  }
4828
4961
  function setCapabilities(next, rechecked = false) {
@@ -4835,7 +4968,7 @@ function setCapabilities(next, rechecked = false) {
4835
4968
  });
4836
4969
  if (next === current$1) return;
4837
4970
  current$1 = next;
4838
- for (const listener of [...listeners$7]) listener();
4971
+ for (const listener of [...listeners$8]) listener();
4839
4972
  }
4840
4973
  function beginProbe() {
4841
4974
  probing += 1;
@@ -4990,7 +5123,7 @@ function useCapabilityMap(refreshToken) {
4990
5123
  //#endregion
4991
5124
  //#region src/app/layouts/panel-hint.ts
4992
5125
  var hints = /* @__PURE__ */ new Map();
4993
- var listeners$6 = /* @__PURE__ */ new Set();
5126
+ var listeners$7 = /* @__PURE__ */ new Set();
4994
5127
  function sameHint(left, right) {
4995
5128
  if (left === null || right === null) return left === right;
4996
5129
  if (left.labelKey !== right.labelKey || left.tone !== right.tone) return false;
@@ -5002,15 +5135,15 @@ function publishPanelHint(id, hint) {
5002
5135
  if (sameHint(hints.get(id) ?? null, hint)) return;
5003
5136
  if (hint === null) hints.delete(id);
5004
5137
  else hints.set(id, hint);
5005
- for (const listener of [...listeners$6]) listener();
5138
+ for (const listener of [...listeners$7]) listener();
5006
5139
  }
5007
5140
  function panelHintOf(id) {
5008
5141
  return id === null ? null : hints.get(id) ?? null;
5009
5142
  }
5010
5143
  function subscribePanelHints(listener) {
5011
- listeners$6.add(listener);
5144
+ listeners$7.add(listener);
5012
5145
  return () => {
5013
- listeners$6.delete(listener);
5146
+ listeners$7.delete(listener);
5014
5147
  };
5015
5148
  }
5016
5149
  function usePanelHint(id) {
@@ -5026,6 +5159,16 @@ function panelRowName(label, hint, t) {
5026
5159
  //#endregion
5027
5160
  //#region src/app/layouts/rightbar/market-freshness.ts
5028
5161
  var MARKET_STALE_MS = VERSION_CHECK_TTL_MS;
5162
+ function checkedAgoText(at, now, t) {
5163
+ const seconds = Math.max(0, Math.floor((now - at) / 1e3));
5164
+ if (seconds < 60) return t("panels.market.justNow");
5165
+ const minutes = Math.floor(seconds / 60);
5166
+ if (minutes < 60) return t("panels.market.minutesAgo", { n: String(minutes) });
5167
+ return t("panels.market.hoursAgo", { n: String(Math.floor(minutes / 60)) });
5168
+ }
5169
+ function checkedAgo(at, t) {
5170
+ return checkedAgoText(at, Date.now(), t);
5171
+ }
5029
5172
  function marketSettled(freshness, installedRead) {
5030
5173
  return freshness.loaded && installedRead !== false;
5031
5174
  }
@@ -5034,85 +5177,6 @@ function shouldProbeOnEnter(input) {
5034
5177
  return input.now - input.checkedAt >= input.staleMs;
5035
5178
  }
5036
5179
  //#endregion
5037
- //#region src/app/layouts/rightbar/market-settle.ts
5038
- var MODULE_SETTLE_MS = 15e3;
5039
- function holdBack(installed, roster, active, previous) {
5040
- const pending = installed.filter((unit) => !roster.has(unit));
5041
- const fresh = previous === null ? [] : pending.filter((unit) => !previous.has(unit));
5042
- return pending.filter((unit) => active.has(unit) || fresh.includes(unit));
5043
- }
5044
- var WORKBENCH_SWAP_MS = 18e4;
5045
- function swapLanded(until, installed) {
5046
- return until !== void 0 && installed === until;
5047
- }
5048
- function swapUntil(action, application, latest) {
5049
- if (action !== "update-workbench" || application !== "restart-required") return void 0;
5050
- return latest;
5051
- }
5052
- var READ_BACK_ACTIONS = /* @__PURE__ */ new Set([
5053
- "update",
5054
- "update-bundle",
5055
- "update-dependency",
5056
- "update-plugin"
5057
- ]);
5058
- var REMOVAL_ACTIONS = /* @__PURE__ */ new Set([
5059
- "remove-bundle",
5060
- "uninstall",
5061
- "uninstall-plugin"
5062
- ]);
5063
- function awaitsReadBack(action, application, version) {
5064
- if (application !== "applied") return false;
5065
- if (REMOVAL_ACTIONS.has(action)) return true;
5066
- if (!READ_BACK_ACTIONS.has(action)) return false;
5067
- return action === "update-bundle" ? version !== void 0 : true;
5068
- }
5069
- function readBackDone(input) {
5070
- if (input.action === "update") return !input.outdated;
5071
- if (input.entry === void 0 || input.entry.local === true || input.entry.latest === void 0) return true;
5072
- if (input.entry.latest === input.entry.installed) return true;
5073
- if (input.clicked === void 0) return true;
5074
- return input.entry.installed !== input.clicked;
5075
- }
5076
- function settleLanded(input) {
5077
- if (input.until !== void 0) return swapLanded(input.until, input.installed);
5078
- if (input.readBack !== true) return true;
5079
- if (input.action === "remove-bundle" || input.action === "uninstall") return input.unitGone === true;
5080
- if (input.action === "uninstall-plugin") return input.pluginGone === true;
5081
- const settled = (state) => state !== void 0 && state !== "outdated" && state !== "unsatisfied" && state !== "checking" && state !== "unchecked";
5082
- if (input.action === "update-dependency") return settled(input.sharedState);
5083
- if (input.action === "update-plugin") return input.pluginOutdated === false;
5084
- return readBackDone({
5085
- action: input.action,
5086
- entry: input.entry,
5087
- clicked: input.clicked,
5088
- outdated: input.outdated
5089
- });
5090
- }
5091
- function tailReason(tail) {
5092
- if (tail === void 0) return void 0;
5093
- const last = tail.split(" / ").map((part) => part.trim()).filter((part) => part !== "").at(-1);
5094
- if (last === void 0) return void 0;
5095
- return last.length <= 240 ? last : `${last.slice(0, 240)}…`;
5096
- }
5097
- function selfUpdateStop(input) {
5098
- const { until, since, update } = input;
5099
- if (until === void 0 || update === void 0 || update === null) return void 0;
5100
- if (update.state !== "failed" && update.state !== "rolled-back") return void 0;
5101
- if (update.to !== until && update.version !== until) return void 0;
5102
- if (since !== void 0 && update.at !== void 0) {
5103
- const at = (0, import_dayjs_min.default)(update.at).valueOf();
5104
- if (Number.isFinite(at) && at < since - 5e3) return void 0;
5105
- }
5106
- return {
5107
- kind: update.state,
5108
- ...update.version === void 0 ? {} : { version: update.version },
5109
- ...update.state === "failed" && tailReason(update.tail) !== void 0 ? { reason: tailReason(update.tail) } : {}
5110
- };
5111
- }
5112
- function holdWindowMs(until) {
5113
- return until === void 0 ? MODULE_SETTLE_MS : WORKBENCH_SWAP_MS;
5114
- }
5115
- //#endregion
5116
5180
  //#region src/app/layouts/rightbar/market-shared-rows.ts
5117
5181
  var SHARED_STATE_KEY = {
5118
5182
  checking: "panels.market.checking",
@@ -5247,6 +5311,26 @@ function installedIdSet(installed) {
5247
5311
  if (installed === void 0) return null;
5248
5312
  return new Set(installed.map((item) => item.unit));
5249
5313
  }
5314
+ function latestUnavailableNote(unavailable) {
5315
+ if (unavailable === "no-registry") return {
5316
+ key: "panels.market.latestNoRegistry",
5317
+ params: {}
5318
+ };
5319
+ if (unavailable === "probe-failed") return {
5320
+ key: "panels.market.latestProbeFailed",
5321
+ params: {}
5322
+ };
5323
+ }
5324
+ function latestCheckSummary(modules) {
5325
+ let checked = 0;
5326
+ let unknown = 0;
5327
+ for (const module of modules ?? []) if (module.latest !== void 0) checked += 1;
5328
+ else if (module.latestUnavailable === "no-registry" || module.latestUnavailable === "probe-failed") unknown += 1;
5329
+ return {
5330
+ checked,
5331
+ unknown
5332
+ };
5333
+ }
5250
5334
  function installedRows(modules, manifests, listed, names, defaults = /* @__PURE__ */ new Set(), changed = {}) {
5251
5335
  const titles = new Map(manifests.map((manifest) => [manifest.id, manifest.titleKey]));
5252
5336
  const rows = [];
@@ -5260,16 +5344,17 @@ function installedRows(modules, manifests, listed, names, defaults = /* @__PURE_
5260
5344
  const pending = !loaded && refused.length === 0;
5261
5345
  const titleKey = titles.get(module.unit);
5262
5346
  const remembered = titleKey === void 0 ? names?.get(module.unit) : void 0;
5347
+ const note = refused.length > 0 ? {
5348
+ key: "panels.market.moduleRefused",
5349
+ params: {}
5350
+ } : latestUnavailableNote(module.latestUnavailable);
5263
5351
  rows.push({
5264
5352
  id: module.unit,
5265
5353
  titleKey: titleKey ?? module.unit,
5266
5354
  ...remembered === void 0 ? {} : { label: remembered },
5267
5355
  state: outdated ? "outdated" : refused.length > 0 ? "unusable" : pending ? "inactive" : "installed",
5268
5356
  ...pending ? { hint: "panels.market.moduleRestartHint" } : blocked === void 0 ? {} : { hint: updateBlockHintOf(blocked) },
5269
- ...refused.length === 0 ? {} : { note: {
5270
- key: "panels.market.moduleRefused",
5271
- params: {}
5272
- } },
5357
+ ...note === void 0 ? {} : { note },
5273
5358
  ...module.local === true ? { local: true } : {},
5274
5359
  pkg: module.pkg,
5275
5360
  canInstall: false,
@@ -5282,8 +5367,10 @@ function installedRows(modules, manifests, listed, names, defaults = /* @__PURE_
5282
5367
  ...outdated ? { moduleUpdate: {
5283
5368
  installed: module.installed,
5284
5369
  latest,
5285
- ...blocked === void 0 ? {} : { blocked }
5370
+ ...blocked === void 0 ? {} : { blocked },
5371
+ ...module.market === void 0 ? {} : { market: module.market }
5286
5372
  } } : {},
5373
+ ...module.market === void 0 ? {} : { market: module.market },
5287
5374
  defaultShown: defaults.has(module.unit),
5288
5375
  defaultChanged: changed[module.unit] ?? 0
5289
5376
  });
@@ -5294,6 +5381,13 @@ var SWITCH_LOCKED = /* @__PURE__ */ new Set(["unusable", "broken"]);
5294
5381
  function marketSwitchLocked(row) {
5295
5382
  return SWITCH_LOCKED.has(row.state);
5296
5383
  }
5384
+ function marketAsksAgent(row) {
5385
+ if (row.workbench === true || row.plugin === true) return false;
5386
+ if (row.state === "installed" || row.state === "inactive" || row.state === "outdated") return false;
5387
+ if (row.state === "checking" || row.state === "pending-restart") return false;
5388
+ if (row.state === "pending-followup") return false;
5389
+ return !marketActions$1(row).includes("install");
5390
+ }
5297
5391
  function marketActions$1(row) {
5298
5392
  if (row.workbench === true) {
5299
5393
  if (row.followUp !== void 0 && row.state === "pending-followup") return row.followUp.hard ? ["migrate-workbench"] : ["migrate-workbench", "dismiss-followup"];
@@ -5302,7 +5396,7 @@ function marketActions$1(row) {
5302
5396
  if (row.plugin === true) return [...row.canUpdate ? ["update-plugin"] : [], ...row.canUninstall ? ["uninstall-plugin"] : []];
5303
5397
  return [
5304
5398
  ...row.canInstall ? ["install"] : [],
5305
- ...row.moduleUpdate === void 0 ? row.canUpdate ? ["update"] : [] : row.moduleUpdate.blocked === void 0 ? ["update-bundle"] : [],
5399
+ ...row.moduleUpdate === void 0 ? row.canUpdate ? ["update"] : [] : row.moduleUpdate.blocked === void 0 ? [row.market === void 0 || row.pkg === void 0 ? "update-bundle" : "install-version"] : [],
5306
5400
  ...row.canUninstall ? [row.pkg === void 0 ? "uninstall" : "remove-bundle"] : []
5307
5401
  ];
5308
5402
  }
@@ -5391,7 +5485,8 @@ function marketUpdatesOf(modules) {
5391
5485
  installed: module.installed,
5392
5486
  ...local || module.latest === void 0 ? {} : { latest: module.latest },
5393
5487
  ...local || module.latest === void 0 || module.latestBlocked === void 0 ? {} : { blocked: module.latestBlocked },
5394
- ...local ? { local: true } : {}
5488
+ ...local ? { local: true } : {},
5489
+ ...local || module.market === void 0 ? {} : { market: module.market }
5395
5490
  };
5396
5491
  }
5397
5492
  return next;
@@ -5415,6 +5510,18 @@ function marketSections(rows) {
5415
5510
  rows: rest
5416
5511
  }]];
5417
5512
  }
5513
+ function checkingRows(rows, scope) {
5514
+ return rows.map((row) => {
5515
+ if (row.state !== "unknown" && row.state !== "unchecked") return row;
5516
+ if (!scope.all && !scope.units.has(row.id)) return row;
5517
+ return {
5518
+ ...row,
5519
+ state: "checking",
5520
+ hint: void 0,
5521
+ note: void 0
5522
+ };
5523
+ });
5524
+ }
5418
5525
  function marketRows(manifests, capabilities, updates = {}, defaults = /* @__PURE__ */ new Set(), changed = {}) {
5419
5526
  const rows = [];
5420
5527
  for (const manifest of manifests) {
@@ -5430,7 +5537,8 @@ function marketRows(manifests, capabilities, updates = {}, defaults = /* @__PURE
5430
5537
  const moduleUpdate = entry === void 0 || entry.latest === void 0 || entry.latest === entry.installed ? void 0 : {
5431
5538
  installed: entry.installed,
5432
5539
  latest: entry.latest,
5433
- ...entry.blocked === void 0 ? {} : { blocked: entry.blocked }
5540
+ ...entry.blocked === void 0 ? {} : { blocked: entry.blocked },
5541
+ ...entry.market === void 0 ? {} : { market: entry.market }
5434
5542
  };
5435
5543
  const shown = moduleUpdate === void 0 ? state : "outdated";
5436
5544
  const hint = moduleUpdate?.blocked === void 0 ? shown === "unknown" || shown === "unchecked" ? "panels.market.uncheckedHint" : void 0 : updateBlockHintOf(moduleUpdate.blocked);
@@ -5447,6 +5555,10 @@ function marketRows(manifests, capabilities, updates = {}, defaults = /* @__PURE
5447
5555
  ...entry.latest === void 0 ? {} : { latest: entry.latest }
5448
5556
  } },
5449
5557
  ...moduleUpdate === void 0 ? {} : { moduleUpdate },
5558
+ ...entry?.market === void 0 ? {} : {
5559
+ market: entry.market,
5560
+ pkg: entry.market.pkg
5561
+ },
5450
5562
  ...moduleUpdate === void 0 ? note === void 0 ? {} : { note } : {},
5451
5563
  ...local ? { local: true } : {},
5452
5564
  defaultShown: defaults.has(manifest.id),
@@ -5538,8 +5650,9 @@ var UPDATES_KEY = "panels.market.hasNew";
5538
5650
  function isProblem(row) {
5539
5651
  return row.broken === true || row.state === "broken" || row.state === "unusable" || row.note?.key === "panels.market.moduleRefused";
5540
5652
  }
5541
- function isRestart(row) {
5542
- return row.state === "inactive" || row.state === "pending-restart";
5653
+ function isRestart(row, installing) {
5654
+ if (row.state === "pending-restart") return true;
5655
+ return !installing && row.state === "inactive";
5543
5656
  }
5544
5657
  function isUnknown(row, rosterRead) {
5545
5658
  return row.state === "unchecked" || rosterRead && row.state === "unknown";
@@ -5549,9 +5662,10 @@ function awaitsRestart(manifests, installed) {
5549
5662
  return installed.some((module) => !loaded.has(module.unit) && refusalReasons(module.refused, module.clientRefused).length === 0);
5550
5663
  }
5551
5664
  function marketHintOf(input) {
5552
- const busy = input.busy ?? /* @__PURE__ */ new Set();
5553
- const marketable = marketCatalog(input.manifests, input.installable).filter((manifest) => !busy.has(manifest.id));
5554
- const installed = (input.installed ?? []).filter((module) => !busy.has(module.unit));
5665
+ const installing = input.installing === true;
5666
+ const held = /* @__PURE__ */ new Set([...input.busy ?? [], ...input.applied ?? []]);
5667
+ const marketable = marketCatalog(input.manifests, input.installable).filter((manifest) => !held.has(manifest.id));
5668
+ const installed = (input.installed ?? []).filter((module) => !held.has(module.unit));
5555
5669
  const catalog = marketRows(marketable, input.capabilities, marketUpdatesOf(input.modules));
5556
5670
  const listed = new Set(catalog.map((row) => row.id));
5557
5671
  const self = workbenchRow(input.workbench);
@@ -5562,10 +5676,10 @@ function marketHintOf(input) {
5562
5676
  ...self === void 0 ? [] : [self]
5563
5677
  ];
5564
5678
  const problem = rows.some(isProblem);
5565
- const restart = rows.some(isRestart) || awaitsRestart(input.manifests, installed);
5679
+ const restart = rows.some((row) => isRestart(row, installing)) || !installing && awaitsRestart(input.manifests, installed);
5566
5680
  const followUp = rows.some((row) => row.state === "pending-followup");
5567
5681
  const rosterRead = input.modules !== null;
5568
- const unknown = rows.some((row) => isUnknown(row, rosterRead));
5682
+ const unknown = !installing && rows.some((row) => isUnknown(row, rosterRead));
5569
5683
  const updates = marketHasUpdates(rows, sharedRows(marketable, input.capabilities));
5570
5684
  const more = [];
5571
5685
  if (problem) {
@@ -5613,11 +5727,91 @@ function marketHintOf(input) {
5613
5727
  return null;
5614
5728
  }
5615
5729
  //#endregion
5730
+ //#region src/app/layouts/rightbar/market-settle.ts
5731
+ var MODULE_SETTLE_MS = 15e3;
5732
+ function holdBack(installed, roster, active, previous) {
5733
+ const pending = installed.filter((unit) => !roster.has(unit));
5734
+ const fresh = previous === null ? [] : pending.filter((unit) => !previous.has(unit));
5735
+ return pending.filter((unit) => active.has(unit) || fresh.includes(unit));
5736
+ }
5737
+ var WORKBENCH_SWAP_MS = 18e4;
5738
+ function swapLanded(until, installed) {
5739
+ return until !== void 0 && installed === until;
5740
+ }
5741
+ function swapUntil(action, application, latest) {
5742
+ if (action !== "update-workbench" || application !== "restart-required") return void 0;
5743
+ return latest;
5744
+ }
5745
+ var READ_BACK_ACTIONS = /* @__PURE__ */ new Set([
5746
+ "update",
5747
+ "update-bundle",
5748
+ "install-version",
5749
+ "update-dependency",
5750
+ "update-plugin"
5751
+ ]);
5752
+ var REMOVAL_ACTIONS = /* @__PURE__ */ new Set([
5753
+ "remove-bundle",
5754
+ "uninstall",
5755
+ "uninstall-plugin"
5756
+ ]);
5757
+ function awaitsReadBack(action, application, version) {
5758
+ if (application !== "applied") return false;
5759
+ if (REMOVAL_ACTIONS.has(action)) return true;
5760
+ if (!READ_BACK_ACTIONS.has(action)) return false;
5761
+ return action === "update-bundle" || action === "install-version" ? version !== void 0 : true;
5762
+ }
5763
+ function readBackDone(input) {
5764
+ if (input.action === "update") return !input.outdated;
5765
+ if (input.entry === void 0 || input.entry.local === true || input.entry.latest === void 0) return true;
5766
+ if (input.entry.latest === input.entry.installed) return true;
5767
+ if (input.clicked === void 0) return true;
5768
+ return input.entry.installed !== input.clicked;
5769
+ }
5770
+ function settleLanded(input) {
5771
+ if (input.until !== void 0) return swapLanded(input.until, input.installed);
5772
+ if (input.readBack !== true) return true;
5773
+ if (input.action === "remove-bundle" || input.action === "uninstall") return input.unitGone === true;
5774
+ if (input.action === "uninstall-plugin") return input.pluginGone === true;
5775
+ const settled = (state) => state !== void 0 && state !== "outdated" && state !== "unsatisfied" && state !== "checking" && state !== "unchecked";
5776
+ if (input.action === "update-dependency") return settled(input.sharedState);
5777
+ if (input.action === "update-plugin") return input.pluginOutdated === false;
5778
+ return readBackDone({
5779
+ action: input.action,
5780
+ entry: input.entry,
5781
+ clicked: input.clicked,
5782
+ outdated: input.outdated
5783
+ });
5784
+ }
5785
+ function tailReason(tail) {
5786
+ if (tail === void 0) return void 0;
5787
+ const last = tail.split(" / ").map((part) => part.trim()).filter((part) => part !== "").at(-1);
5788
+ if (last === void 0) return void 0;
5789
+ return last.length <= 240 ? last : `${last.slice(0, 240)}…`;
5790
+ }
5791
+ function selfUpdateStop(input) {
5792
+ const { until, since, update } = input;
5793
+ if (until === void 0 || update === void 0 || update === null) return void 0;
5794
+ if (update.state !== "failed" && update.state !== "rolled-back") return void 0;
5795
+ if (update.to !== until && update.version !== until) return void 0;
5796
+ if (since !== void 0 && update.at !== void 0) {
5797
+ const at = (0, import_dayjs_min.default)(update.at).valueOf();
5798
+ if (Number.isFinite(at) && at < since - 5e3) return void 0;
5799
+ }
5800
+ return {
5801
+ kind: update.state,
5802
+ ...update.version === void 0 ? {} : { version: update.version },
5803
+ ...update.state === "failed" && tailReason(update.tail) !== void 0 ? { reason: tailReason(update.tail) } : {}
5804
+ };
5805
+ }
5806
+ function holdWindowMs(until) {
5807
+ return until === void 0 ? MODULE_SETTLE_MS : WORKBENCH_SWAP_MS;
5808
+ }
5809
+ //#endregion
5616
5810
  //#region src/app/layouts/rightbar/market-busy.ts
5617
- var listeners$5 = /* @__PURE__ */ new Set();
5811
+ var listeners$6 = /* @__PURE__ */ new Set();
5618
5812
  var published = /* @__PURE__ */ new Map();
5619
5813
  var live$2 = /* @__PURE__ */ new Set();
5620
- var timer$2;
5814
+ var timer$3;
5621
5815
  var MARKET_BUSY_MS = WORKBENCH_SWAP_MS;
5622
5816
  function marketBusyIds() {
5623
5817
  return live$2;
@@ -5627,12 +5821,12 @@ function publishMarketBusy(ids) {
5627
5821
  const next = /* @__PURE__ */ new Map();
5628
5822
  for (const id of new Set(ids)) next.set(id, published.get(id) ?? now);
5629
5823
  published = next;
5630
- refresh(now);
5824
+ refresh$1(now);
5631
5825
  }
5632
5826
  function subscribeMarketBusy(listener) {
5633
- listeners$5.add(listener);
5827
+ listeners$6.add(listener);
5634
5828
  return () => {
5635
- listeners$5.delete(listener);
5829
+ listeners$6.delete(listener);
5636
5830
  };
5637
5831
  }
5638
5832
  function useMarketBusy() {
@@ -5648,29 +5842,100 @@ function sameSet(left, right) {
5648
5842
  for (const id of left) if (!right.has(id)) return false;
5649
5843
  return true;
5650
5844
  }
5651
- function schedule$1(now) {
5652
- if (timer$2 !== void 0) clearTimeout(timer$2);
5653
- timer$2 = void 0;
5845
+ function schedule$2(now) {
5846
+ if (timer$3 !== void 0) clearTimeout(timer$3);
5847
+ timer$3 = void 0;
5654
5848
  let soonest = Number.POSITIVE_INFINITY;
5655
5849
  for (const at of published.values()) soonest = Math.min(soonest, at);
5656
5850
  if (soonest === Number.POSITIVE_INFINITY) return;
5657
- timer$2 = setTimeout(() => refresh(Date.now()), Math.max(0, soonest + MARKET_BUSY_MS - now) + 1);
5851
+ timer$3 = setTimeout(() => refresh$1(Date.now()), Math.max(0, soonest + MARKET_BUSY_MS - now) + 1);
5658
5852
  }
5659
- function refresh(now) {
5853
+ function refresh$1(now) {
5660
5854
  for (const [id, at] of published) if (now - at >= MARKET_BUSY_MS) published.delete(id);
5661
5855
  const next = new Set(published.keys());
5662
5856
  if (!sameSet(live$2, next)) {
5663
5857
  live$2 = next;
5858
+ for (const listener of [...listeners$6]) listener();
5859
+ }
5860
+ schedule$2(now);
5861
+ }
5862
+ //#endregion
5863
+ //#region src/app/layouts/rightbar/market-install.ts
5864
+ var NO_UNITS$2 = /* @__PURE__ */ new Set();
5865
+ var IDLE$1 = {
5866
+ installing: false,
5867
+ applied: NO_UNITS$2
5868
+ };
5869
+ var tokens = /* @__PURE__ */ new Set();
5870
+ var applied = /* @__PURE__ */ new Map();
5871
+ var listeners$5 = /* @__PURE__ */ new Set();
5872
+ var snapshot$1 = IDLE$1;
5873
+ var timer$2;
5874
+ function sameUnits(left, right) {
5875
+ if (left.size !== right.size) return false;
5876
+ for (const unit of left) if (!right.has(unit)) return false;
5877
+ return true;
5878
+ }
5879
+ function schedule$1(now) {
5880
+ if (timer$2 !== void 0) clearTimeout(timer$2);
5881
+ timer$2 = void 0;
5882
+ if (applied.size === 0) return;
5883
+ let soonest = Number.POSITIVE_INFINITY;
5884
+ for (const at of applied.values()) soonest = Math.min(soonest, at);
5885
+ timer$2 = setTimeout(() => refresh(Date.now()), Math.max(0, soonest + MODULE_SETTLE_MS - now) + 1);
5886
+ }
5887
+ function refresh(now) {
5888
+ for (const [unit, at] of applied) if (now - at >= 15e3) applied.delete(unit);
5889
+ const next = tokens.size === 0 && applied.size === 0 ? IDLE$1 : {
5890
+ installing: tokens.size > 0,
5891
+ applied: applied.size === 0 ? NO_UNITS$2 : new Set(applied.keys())
5892
+ };
5893
+ if (next.installing !== snapshot$1.installing || !sameUnits(next.applied, snapshot$1.applied)) {
5894
+ snapshot$1 = next;
5664
5895
  for (const listener of [...listeners$5]) listener();
5665
5896
  }
5666
5897
  schedule$1(now);
5667
5898
  }
5899
+ function marketInstallState() {
5900
+ return snapshot$1;
5901
+ }
5902
+ function subscribeMarketInstall(listener) {
5903
+ listeners$5.add(listener);
5904
+ return () => {
5905
+ listeners$5.delete(listener);
5906
+ };
5907
+ }
5908
+ function publishMarketInstalling(token, active) {
5909
+ if (active) tokens.add(token);
5910
+ else tokens.delete(token);
5911
+ refresh(Date.now());
5912
+ }
5913
+ function publishMarketApplied(units) {
5914
+ const now = Date.now();
5915
+ for (const unit of new Set(units)) if (unit !== "" && !applied.has(unit)) applied.set(unit, now);
5916
+ refresh(now);
5917
+ }
5918
+ function useMarketInstallState() {
5919
+ return (0, react.useSyncExternalStore)(subscribeMarketInstall, marketInstallState);
5920
+ }
5921
+ function usePublishMarketInstalling(token, active) {
5922
+ (0, react.useEffect)(() => {
5923
+ publishMarketInstalling(token, active);
5924
+ return () => publishMarketInstalling(token, false);
5925
+ }, [token, active]);
5926
+ }
5668
5927
  //#endregion
5669
5928
  //#region src/shared/api/write-outcome.ts
5670
5929
  function writeRoute(channel, resource) {
5671
5930
  if (channel === "provision") return "provision";
5672
5931
  return `${channel}/${resource}`;
5673
5932
  }
5933
+ function installFailureOf(value) {
5934
+ if (typeof value !== "object" || value === null) return void 0;
5935
+ const record = value;
5936
+ if (typeof record.kind !== "string" || typeof record.command !== "string") return void 0;
5937
+ return value;
5938
+ }
5674
5939
  function writeOutcomeOf(response, networkText) {
5675
5940
  if (response === null) return {
5676
5941
  ok: false,
@@ -5682,11 +5947,13 @@ function writeOutcomeOf(response, networkText) {
5682
5947
  const fallback = typeof box.text === "string" && box.text !== "" ? box.text : networkText;
5683
5948
  const detail = typeof box.error?.detail === "string" ? box.error.detail : void 0;
5684
5949
  const helpUrl = typeof box.error?.helpUrl === "string" && box.error.helpUrl !== "" ? box.error.helpUrl : void 0;
5950
+ const failure = installFailureOf(box.error?.failure);
5685
5951
  return {
5686
5952
  ok: false,
5687
5953
  message: own ?? fallback,
5688
5954
  ...detail === void 0 ? {} : { detail },
5689
- ...helpUrl === void 0 ? {} : { helpUrl }
5955
+ ...helpUrl === void 0 ? {} : { helpUrl },
5956
+ ...failure === void 0 ? {} : { failure }
5690
5957
  };
5691
5958
  }
5692
5959
  return {
@@ -5893,138 +6160,138 @@ function useMarketTransient(input) {
5893
6160
  };
5894
6161
  }
5895
6162
  var MarketPage_module_default = {
5896
- marketList: "_marketList_jfyof_1",
5897
- marketRow: "_marketRow_jfyof_10",
5898
- marketIcon: "_marketIcon_jfyof_20",
5899
- marketMain: "_marketMain_jfyof_32",
5900
- marketName: "_marketName_jfyof_39",
5901
- marketStatus: "_marketStatus_jfyof_48",
5902
- marketStateText: "_marketStateText_jfyof_58",
5903
- marketSep: "_marketSep_jfyof_62",
5904
- marketReason: "_marketReason_jfyof_66",
5905
- marketVersion: "_marketVersion_jfyof_72",
5906
- marketLocalTag: "_marketLocalTag_jfyof_94",
5907
- marketEnd: "_marketEnd_jfyof_105",
5908
- marketSwitchSeat: "_marketSwitchSeat_jfyof_112",
5909
- marketActions: "_marketActions_jfyof_125",
5910
- marketUpdateAction: "_marketUpdateAction_jfyof_131",
5911
- marketSelfDivider: "_marketSelfDivider_jfyof_137",
5912
- marketSection: "_marketSection_jfyof_143",
5913
- marketSectionHead: "_marketSectionHead_jfyof_150",
5914
- marketSectionIcon: "_marketSectionIcon_jfyof_156",
5915
- marketSectionTitle: "_marketSectionTitle_jfyof_163",
5916
- marketSectionCount: "_marketSectionCount_jfyof_169",
5917
- marketSectionQuiet: "_marketSectionQuiet_jfyof_175",
5918
- marketProgress: "_marketProgress_jfyof_188",
5919
- marketNote: "_marketNote_jfyof_198",
5920
- marketFailure: "_marketFailure_jfyof_205",
5921
- marketEmpty: "_marketEmpty_jfyof_212",
5922
- marketPage: "_marketPage_jfyof_217",
5923
- marketPageHead: "_marketPageHead_jfyof_235",
5924
- marketPageTitle: "_marketPageTitle_jfyof_243",
5925
- marketPageIntro: "_marketPageIntro_jfyof_248",
5926
- marketPageTools: "_marketPageTools_jfyof_254",
5927
- marketPanel: "_marketPanel_jfyof_263",
5928
- marketTabs: "_marketTabs_jfyof_273",
5929
- marketTabList: "_marketTabList_jfyof_278",
5930
- marketIconButton: "_marketIconButton_jfyof_283",
5931
- marketIconWrap: "_marketIconWrap_jfyof_308",
5932
- marketIconButtonSpinning: "_marketIconButtonSpinning_jfyof_312",
5933
- "wb-spin": "_wb-spin_jfyof_1",
5934
- marketAddButton: "_marketAddButton_jfyof_316",
5935
- marketEmptyTitle: "_marketEmptyTitle_jfyof_333",
5936
- discoverPage: "_discoverPage_jfyof_347",
5937
- discoverBar: "_discoverBar_jfyof_354",
5938
- discoverTools: "_discoverTools_jfyof_361",
5939
- discoverMarket: "_discoverMarket_jfyof_367",
5940
- discoverMarketButton: "_discoverMarketButton_jfyof_372",
5941
- discoverMarketName: "_discoverMarketName_jfyof_379",
5942
- discoverLabels: "_discoverLabels_jfyof_385",
5943
- discoverSort: "_discoverSort_jfyof_390",
5944
- discoverRefresh: "_discoverRefresh_jfyof_395",
5945
- discoverSearch: "_discoverSearch_jfyof_399",
5946
- discoverSearchField: "_discoverSearchField_jfyof_407",
5947
- discoverSearchFieldFilled: "_discoverSearchFieldFilled_jfyof_412",
5948
- discoverSearchClear: "_discoverSearchClear_jfyof_421",
5949
- discoverChips: "_discoverChips_jfyof_472",
5950
- discoverList: "_discoverList_jfyof_479",
5951
- discoverCard: "_discoverCard_jfyof_488",
5952
- discoverArtwork: "_discoverArtwork_jfyof_502",
5953
- discoverArtworkImage: "_discoverArtworkImage_jfyof_514",
5954
- discoverMain: "_discoverMain_jfyof_518",
5955
- discoverTitleRow: "_discoverTitleRow_jfyof_526",
5956
- discoverCardOpen: "_discoverCardOpen_jfyof_534",
5957
- discoverStrong: "_discoverStrong_jfyof_565",
5958
- discoverDesc: "_discoverDesc_jfyof_571",
5959
- discoverMeta: "_discoverMeta_jfyof_580",
5960
- discoverMuted: "_discoverMuted_jfyof_587",
5961
- discoverEnd: "_discoverEnd_jfyof_593",
5962
- discoverBlocked: "_discoverBlocked_jfyof_602",
5963
- discoverEmpty: "_discoverEmpty_jfyof_607",
5964
- discoverEmptyTitle: "_discoverEmptyTitle_jfyof_616",
5965
- discoverDetail: "_discoverDetail_jfyof_626",
5966
- discoverCrumb: "_discoverCrumb_jfyof_632",
5967
- discoverCrumbIcon: "_discoverCrumbIcon_jfyof_655",
5968
- discoverDetailHead: "_discoverDetailHead_jfyof_659",
5969
- discoverDetailTitle: "_discoverDetailTitle_jfyof_665",
5970
- discoverDetailText: "_discoverDetailText_jfyof_671",
5971
- discoverDetailPanel: "_discoverDetailPanel_jfyof_678",
5972
- discoverDetailTabs: "_discoverDetailTabs_jfyof_685",
5973
- discoverDetailTabList: "_discoverDetailTabList_jfyof_690",
5974
- discoverDocBody: "_discoverDocBody_jfyof_695",
5975
- discoverDocNotice: "_discoverDocNotice_jfyof_700",
5976
- discoverSection: "_discoverSection_jfyof_706",
5977
- discoverSectionTitle: "_discoverSectionTitle_jfyof_713",
5978
- discoverFacts: "_discoverFacts_jfyof_719",
5979
- discoverFactRow: "_discoverFactRow_jfyof_724",
5980
- discoverFactKind: "_discoverFactKind_jfyof_734",
5981
- discoverFactValue: "_discoverFactValue_jfyof_740",
5982
- discoverCode: "_discoverCode_jfyof_748",
5983
- discoverTags: "_discoverTags_jfyof_757",
5984
- discoverLink: "_discoverLink_jfyof_764",
5985
- discoverVersions: "_discoverVersions_jfyof_774",
5986
- discoverVersionRow: "_discoverVersionRow_jfyof_782",
5987
- discoverVersionName: "_discoverVersionName_jfyof_790",
5988
- discoverError: "_discoverError_jfyof_795",
5989
- discoverFailure: "_discoverFailure_jfyof_804",
5990
- discoverLoading: "_discoverLoading_jfyof_810",
5991
- discoverNotice: "_discoverNotice_jfyof_819",
5992
- discoverMore: "_discoverMore_jfyof_837",
5993
- discoverTransport: "_discoverTransport_jfyof_841",
5994
- discoverTransportTitle: "_discoverTransportTitle_jfyof_847",
5995
- discoverTransportRows: "_discoverTransportRows_jfyof_852",
5996
- discoverTransportRow: "_discoverTransportRow_jfyof_852",
5997
- discoverTransportRadio: "_discoverTransportRadio_jfyof_873",
5998
- discoverTransportKind: "_discoverTransportKind_jfyof_887",
5999
- discoverTransportState: "_discoverTransportState_jfyof_893",
6000
- discoverTransportCustom: "_discoverTransportCustom_jfyof_913",
6001
- discoverTransportInput: "_discoverTransportInput_jfyof_919",
6002
- discoverInstallBar: "_discoverInstallBar_jfyof_924",
6003
- discoverInstallText: "_discoverInstallText_jfyof_935",
6004
- discoverDialog: "_discoverDialog_jfyof_941",
6005
- discoverDialogBody: "_discoverDialogBody_jfyof_945",
6006
- discoverSourceList: "_discoverSourceList_jfyof_951",
6007
- discoverSourceRow: "_discoverSourceRow_jfyof_959",
6008
- discoverSourceConfirm: "_discoverSourceConfirm_jfyof_968",
6009
- discoverSourcePick: "_discoverSourcePick_jfyof_974",
6010
- discoverSourceRadio: "_discoverSourceRadio_jfyof_983",
6011
- discoverSourceMain: "_discoverSourceMain_jfyof_991",
6012
- discoverSourceHead: "_discoverSourceHead_jfyof_999",
6013
- discoverSourceUrl: "_discoverSourceUrl_jfyof_1007",
6014
- discoverSourceMore: "_discoverSourceMore_jfyof_1017",
6015
- discoverSourceLoading: "_discoverSourceLoading_jfyof_1021",
6016
- discoverSourceHint: "_discoverSourceHint_jfyof_1031",
6017
- discoverSourceError: "_discoverSourceError_jfyof_1045",
6018
- discoverSourceForm: "_discoverSourceForm_jfyof_1051",
6019
- discoverGrow: "_discoverGrow_jfyof_1057",
6020
- discoverField: "_discoverField_jfyof_1062",
6021
- discoverFieldLabel: "_discoverFieldLabel_jfyof_1068",
6022
- discoverConfirmHead: "_discoverConfirmHead_jfyof_1073",
6023
- discoverSkeletonFill: "_discoverSkeletonFill_jfyof_1079",
6024
- "wb-skeleton": "_wb-skeleton_jfyof_1",
6025
- discoverSkeletonBar: "_discoverSkeletonBar_jfyof_1088",
6026
- discoverSkeletonTitle: "_discoverSkeletonTitle_jfyof_1095",
6027
- discoverSkeletonDesc: "_discoverSkeletonDesc_jfyof_1099"
6163
+ marketList: "_marketList_485ym_1",
6164
+ marketRow: "_marketRow_485ym_10",
6165
+ marketIcon: "_marketIcon_485ym_20",
6166
+ marketMain: "_marketMain_485ym_32",
6167
+ marketName: "_marketName_485ym_39",
6168
+ marketStatus: "_marketStatus_485ym_48",
6169
+ marketStateText: "_marketStateText_485ym_58",
6170
+ marketSep: "_marketSep_485ym_62",
6171
+ marketReason: "_marketReason_485ym_66",
6172
+ marketVersion: "_marketVersion_485ym_72",
6173
+ marketLocalTag: "_marketLocalTag_485ym_94",
6174
+ marketEnd: "_marketEnd_485ym_105",
6175
+ marketSwitchSeat: "_marketSwitchSeat_485ym_112",
6176
+ marketActions: "_marketActions_485ym_125",
6177
+ marketUpdateAction: "_marketUpdateAction_485ym_131",
6178
+ marketSelfDivider: "_marketSelfDivider_485ym_137",
6179
+ marketSection: "_marketSection_485ym_143",
6180
+ marketSectionHead: "_marketSectionHead_485ym_150",
6181
+ marketSectionIcon: "_marketSectionIcon_485ym_156",
6182
+ marketSectionTitle: "_marketSectionTitle_485ym_163",
6183
+ marketSectionCount: "_marketSectionCount_485ym_169",
6184
+ marketSectionAction: "_marketSectionAction_485ym_175",
6185
+ marketSectionQuiet: "_marketSectionQuiet_485ym_183",
6186
+ marketProgress: "_marketProgress_485ym_196",
6187
+ marketNote: "_marketNote_485ym_206",
6188
+ marketFailure: "_marketFailure_485ym_213",
6189
+ marketFailureSeat: "_marketFailureSeat_485ym_220",
6190
+ marketEmpty: "_marketEmpty_485ym_225",
6191
+ marketPage: "_marketPage_485ym_230",
6192
+ marketPageHead: "_marketPageHead_485ym_248",
6193
+ marketPageTitle: "_marketPageTitle_485ym_256",
6194
+ marketPageIntro: "_marketPageIntro_485ym_261",
6195
+ marketPageTools: "_marketPageTools_485ym_267",
6196
+ marketPanel: "_marketPanel_485ym_276",
6197
+ marketTabs: "_marketTabs_485ym_286",
6198
+ marketTabList: "_marketTabList_485ym_291",
6199
+ marketAddButton: "_marketAddButton_485ym_296",
6200
+ marketEmptyTitle: "_marketEmptyTitle_485ym_313",
6201
+ discoverPage: "_discoverPage_485ym_318",
6202
+ discoverBar: "_discoverBar_485ym_325",
6203
+ discoverTools: "_discoverTools_485ym_332",
6204
+ discoverMarket: "_discoverMarket_485ym_338",
6205
+ discoverMarketButton: "_discoverMarketButton_485ym_343",
6206
+ discoverMarketName: "_discoverMarketName_485ym_350",
6207
+ discoverLabels: "_discoverLabels_485ym_356",
6208
+ discoverSort: "_discoverSort_485ym_361",
6209
+ discoverRefresh: "_discoverRefresh_485ym_366",
6210
+ discoverSearch: "_discoverSearch_485ym_370",
6211
+ discoverSearchField: "_discoverSearchField_485ym_378",
6212
+ discoverSearchFieldFilled: "_discoverSearchFieldFilled_485ym_383",
6213
+ discoverSearchClear: "_discoverSearchClear_485ym_392",
6214
+ discoverChips: "_discoverChips_485ym_443",
6215
+ discoverList: "_discoverList_485ym_450",
6216
+ discoverCard: "_discoverCard_485ym_459",
6217
+ discoverArtwork: "_discoverArtwork_485ym_473",
6218
+ discoverArtworkImage: "_discoverArtworkImage_485ym_485",
6219
+ discoverMain: "_discoverMain_485ym_489",
6220
+ discoverTitleRow: "_discoverTitleRow_485ym_497",
6221
+ discoverCardOpen: "_discoverCardOpen_485ym_505",
6222
+ discoverStrong: "_discoverStrong_485ym_536",
6223
+ discoverDesc: "_discoverDesc_485ym_542",
6224
+ discoverMeta: "_discoverMeta_485ym_551",
6225
+ discoverMuted: "_discoverMuted_485ym_558",
6226
+ discoverEnd: "_discoverEnd_485ym_564",
6227
+ discoverUpdateAction: "_discoverUpdateAction_485ym_573",
6228
+ discoverBlocked: "_discoverBlocked_485ym_578",
6229
+ discoverEmpty: "_discoverEmpty_485ym_583",
6230
+ discoverEmptyTitle: "_discoverEmptyTitle_485ym_592",
6231
+ discoverDetail: "_discoverDetail_485ym_602",
6232
+ discoverCrumb: "_discoverCrumb_485ym_608",
6233
+ discoverCrumbIcon: "_discoverCrumbIcon_485ym_631",
6234
+ discoverDetailHead: "_discoverDetailHead_485ym_635",
6235
+ discoverDetailTitle: "_discoverDetailTitle_485ym_641",
6236
+ discoverDetailText: "_discoverDetailText_485ym_647",
6237
+ discoverDetailPanel: "_discoverDetailPanel_485ym_654",
6238
+ discoverDetailTabs: "_discoverDetailTabs_485ym_661",
6239
+ discoverDetailTabList: "_discoverDetailTabList_485ym_666",
6240
+ discoverDocBody: "_discoverDocBody_485ym_671",
6241
+ discoverDocNotice: "_discoverDocNotice_485ym_676",
6242
+ discoverSection: "_discoverSection_485ym_682",
6243
+ discoverSectionTitle: "_discoverSectionTitle_485ym_689",
6244
+ discoverFacts: "_discoverFacts_485ym_695",
6245
+ discoverFactRow: "_discoverFactRow_485ym_700",
6246
+ discoverFactKind: "_discoverFactKind_485ym_710",
6247
+ discoverFactValue: "_discoverFactValue_485ym_716",
6248
+ discoverCode: "_discoverCode_485ym_724",
6249
+ discoverTags: "_discoverTags_485ym_733",
6250
+ discoverLink: "_discoverLink_485ym_740",
6251
+ discoverVersions: "_discoverVersions_485ym_750",
6252
+ discoverVersionRow: "_discoverVersionRow_485ym_758",
6253
+ discoverVersionName: "_discoverVersionName_485ym_766",
6254
+ discoverError: "_discoverError_485ym_771",
6255
+ discoverFailure: "_discoverFailure_485ym_780",
6256
+ discoverLoading: "_discoverLoading_485ym_786",
6257
+ discoverNotice: "_discoverNotice_485ym_795",
6258
+ discoverMore: "_discoverMore_485ym_813",
6259
+ discoverTransport: "_discoverTransport_485ym_817",
6260
+ discoverTransportHead: "_discoverTransportHead_485ym_823",
6261
+ discoverTransportTitle: "_discoverTransportTitle_485ym_830",
6262
+ discoverTransportKind: "_discoverTransportKind_485ym_835",
6263
+ discoverTransportState: "_discoverTransportState_485ym_840",
6264
+ discoverTransportRows: "_discoverTransportRows_485ym_848",
6265
+ discoverTransportRow: "_discoverTransportRow_485ym_848",
6266
+ discoverTransportRadio: "_discoverTransportRadio_485ym_869",
6267
+ discoverTransportCustom: "_discoverTransportCustom_485ym_909",
6268
+ discoverTransportInput: "_discoverTransportInput_485ym_915",
6269
+ discoverInstallBar: "_discoverInstallBar_485ym_920",
6270
+ discoverInstallText: "_discoverInstallText_485ym_931",
6271
+ discoverDialog: "_discoverDialog_485ym_937",
6272
+ discoverDialogBody: "_discoverDialogBody_485ym_941",
6273
+ discoverSourceList: "_discoverSourceList_485ym_947",
6274
+ discoverSourceRow: "_discoverSourceRow_485ym_955",
6275
+ discoverSourceConfirm: "_discoverSourceConfirm_485ym_964",
6276
+ discoverSourcePick: "_discoverSourcePick_485ym_970",
6277
+ discoverSourceRadio: "_discoverSourceRadio_485ym_979",
6278
+ discoverSourceMain: "_discoverSourceMain_485ym_987",
6279
+ discoverSourceHead: "_discoverSourceHead_485ym_995",
6280
+ discoverSourceUrl: "_discoverSourceUrl_485ym_1003",
6281
+ discoverSourceMore: "_discoverSourceMore_485ym_1013",
6282
+ discoverSourceLoading: "_discoverSourceLoading_485ym_1017",
6283
+ discoverSourceHint: "_discoverSourceHint_485ym_1027",
6284
+ discoverSourceError: "_discoverSourceError_485ym_1041",
6285
+ discoverSourceForm: "_discoverSourceForm_485ym_1047",
6286
+ discoverGrow: "_discoverGrow_485ym_1053",
6287
+ discoverField: "_discoverField_485ym_1058",
6288
+ discoverFieldLabel: "_discoverFieldLabel_485ym_1064",
6289
+ discoverConfirmHead: "_discoverConfirmHead_485ym_1069",
6290
+ discoverSkeletonFill: "_discoverSkeletonFill_485ym_1075",
6291
+ "wb-skeleton": "_wb-skeleton_485ym_1",
6292
+ discoverSkeletonBar: "_discoverSkeletonBar_485ym_1084",
6293
+ discoverSkeletonTitle: "_discoverSkeletonTitle_485ym_1091",
6294
+ discoverSkeletonDesc: "_discoverSkeletonDesc_485ym_1095"
6028
6295
  };
6029
6296
  //#endregion
6030
6297
  //#region src/app/layouts/market/discover-states.tsx
@@ -6105,6 +6372,151 @@ function MarketEmpty({ t }) {
6105
6372
  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")));
6106
6373
  }
6107
6374
  //#endregion
6375
+ //#region src/app/layouts/rightbar/failure-card-text.ts
6376
+ var TITLE_KEY = {
6377
+ permission: "panels.market.failure.permission",
6378
+ "disk-full": "panels.market.failure.diskFull",
6379
+ sandbox: "panels.market.failure.sandbox",
6380
+ unknown: "panels.market.failure.unknown"
6381
+ };
6382
+ var ASK_AGENT_KEY = "panels.market.failure.askAgent";
6383
+ function shellPath(path) {
6384
+ return /^[\w./@%+-]+$/.test(path) ? path : `'${path.replaceAll("'", "'\\''")}'`;
6385
+ }
6386
+ function ownerLabel(uid) {
6387
+ return uid === 0 ? "root" : `uid ${uid}`;
6388
+ }
6389
+ function failureCardOf(failure, t) {
6390
+ const path = failure.path ?? "";
6391
+ const fix = failure.fix;
6392
+ if (fix.kind === "chown") {
6393
+ const ownerUid = failure.owner?.uid;
6394
+ return {
6395
+ title: t(TITLE_KEY[failure.kind]),
6396
+ fact: ownerUid === void 0 ? t("panels.market.failure.factMode", {
6397
+ path,
6398
+ mode: failure.mode ?? "?"
6399
+ }) : t("panels.market.failure.factOwner", {
6400
+ path,
6401
+ owner: ownerLabel(ownerUid),
6402
+ me: ownerLabel(failure.current.uid)
6403
+ }),
6404
+ fixLabel: t("panels.market.failure.copyFix"),
6405
+ fix: `sudo chown -R ${fix.uid}:${fix.gid} ${shellPath(fix.path)}`,
6406
+ copiedHint: t("panels.market.failure.copiedHint"),
6407
+ command: failure.command,
6408
+ output: failure.output,
6409
+ exitCode: failure.exitCode
6410
+ };
6411
+ }
6412
+ if (fix.kind === "chmod") return {
6413
+ title: t(TITLE_KEY[failure.kind]),
6414
+ fact: t("panels.market.failure.factMode", {
6415
+ path,
6416
+ mode: failure.mode ?? "?"
6417
+ }),
6418
+ fixLabel: t("panels.market.failure.copyFix"),
6419
+ fix: `chmod -R u+w ${shellPath(fix.path)}`,
6420
+ copiedHint: t("panels.market.failure.copiedHint"),
6421
+ command: failure.command,
6422
+ output: failure.output,
6423
+ exitCode: failure.exitCode
6424
+ };
6425
+ if (fix.kind === "space") return {
6426
+ title: t(TITLE_KEY[failure.kind]),
6427
+ fact: t("panels.market.failure.factSpace", { path }),
6428
+ fixLabel: t("panels.market.failure.copyFix"),
6429
+ fix: `du -sh ${shellPath(fix.path)}`,
6430
+ copiedHint: t("panels.market.failure.copiedHint"),
6431
+ command: failure.command,
6432
+ output: failure.output,
6433
+ exitCode: failure.exitCode
6434
+ };
6435
+ return {
6436
+ title: t(TITLE_KEY[failure.kind]),
6437
+ fact: t("panels.market.failure.factStuck", { path: path === "" ? t("panels.market.failure.nowhere") : path }),
6438
+ fixLabel: t(ASK_AGENT_KEY),
6439
+ fix: t("panels.market.failure.askAgentText", {
6440
+ command: failure.command,
6441
+ path: path === "" ? t("panels.market.failure.nowhere") : path,
6442
+ code: failure.exitCode === null ? "?" : String(failure.exitCode)
6443
+ }),
6444
+ copiedHint: t("panels.market.failure.askAgentHint"),
6445
+ command: failure.command,
6446
+ output: failure.output,
6447
+ exitCode: failure.exitCode
6448
+ };
6449
+ }
6450
+ var FailureCard_module_default = {
6451
+ block: "_block_mxnbc_1",
6452
+ head: "_head_mxnbc_9",
6453
+ title: "_title_mxnbc_16",
6454
+ fact: "_fact_mxnbc_22",
6455
+ actions: "_actions_mxnbc_30",
6456
+ hint: "_hint_mxnbc_38",
6457
+ output: "_output_mxnbc_44"
6458
+ };
6459
+ //#endregion
6460
+ //#region src/app/layouts/rightbar/FailureCard.tsx
6461
+ var COPIED_MS$1 = 1200;
6462
+ function terminalLabels(t) {
6463
+ return {
6464
+ commandLine: (line) => t("panels.market.failure.term.commandLine", { line }),
6465
+ signal: (signal) => t("panels.market.failure.term.signal", { signal }),
6466
+ exitCode: (exitCode) => t("panels.market.failure.term.exitCode", { exitCode }),
6467
+ noExitCode: t("panels.market.failure.term.noExitCode"),
6468
+ running: t("panels.market.failure.term.running"),
6469
+ failed: t("panels.market.failure.term.failed"),
6470
+ done: t("panels.market.failure.term.done"),
6471
+ copy: t("panels.market.failure.term.copy"),
6472
+ copied: t("panels.market.failure.term.copied"),
6473
+ noOutput: t("panels.market.failure.term.noOutput"),
6474
+ collapseAria: t("panels.market.failure.term.collapse"),
6475
+ collapse: t("panels.market.failure.term.collapse"),
6476
+ expandAria: (hidden) => t("panels.market.failure.term.expandAria", { hidden }),
6477
+ expand: (hidden) => t("panels.market.failure.term.expand", { hidden })
6478
+ };
6479
+ }
6480
+ function FailureCard({ t, failure, onRecheck, rechecking }) {
6481
+ const model = failureCardOf(failure, t);
6482
+ const [copied, setCopied] = (0, react.useState)(false);
6483
+ const [open, setOpen] = (0, react.useState)(false);
6484
+ const onCopy = (0, react.useCallback)(() => {
6485
+ (0, _deepseek_ai_dsh_client_ui_primitives.writeClipboard)(model.fix).then((ok) => {
6486
+ if (!ok) return;
6487
+ setCopied(true);
6488
+ setTimeout(() => setCopied(false), COPIED_MS$1);
6489
+ });
6490
+ }, [model.fix]);
6491
+ 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, {
6492
+ state: "error",
6493
+ size: 8
6494
+ }), /* @__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, {
6495
+ type: "button",
6496
+ size: "sm",
6497
+ variant: "ghost",
6498
+ onClick: onCopy
6499
+ }, copied ? t("panels.market.failure.copied") : model.fixLabel), /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
6500
+ type: "button",
6501
+ size: "sm",
6502
+ variant: "ghost",
6503
+ disabled: rechecking,
6504
+ onClick: onRecheck
6505
+ }, t("panels.market.failure.recheck")), /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
6506
+ type: "button",
6507
+ size: "sm",
6508
+ variant: "ghost",
6509
+ onClick: () => setOpen(!open)
6510
+ }, open ? t("panels.market.failure.hideOutput") : t("panels.market.failure.showOutput"))), copied ? /* @__PURE__ */ (0, react.createElement)("p", { className: FailureCard_module_default.hint }, model.copiedHint) : null, open ? /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.TerminalBlock, {
6511
+ command: model.command,
6512
+ output: model.output,
6513
+ exitCode: model.exitCode,
6514
+ maxLines: 8,
6515
+ labels: terminalLabels(t),
6516
+ className: FailureCard_module_default.output
6517
+ }) : null);
6518
+ }
6519
+ //#endregion
6108
6520
  //#region src/app/layouts/rightbar/market-section-icon.ts
6109
6521
  var SIZE$1 = 14;
6110
6522
  function marketSectionIcon(kind) {
@@ -6153,6 +6565,7 @@ var PROGRESS_KEY = {
6153
6565
  install: "panels.market.installing",
6154
6566
  update: "panels.market.updating",
6155
6567
  "update-bundle": "panels.market.updating",
6568
+ "install-version": "panels.market.updating",
6156
6569
  "remove-bundle": "panels.market.uninstalling",
6157
6570
  uninstall: "panels.market.uninstalling",
6158
6571
  "update-dependency": "panels.market.updating",
@@ -6166,6 +6579,7 @@ var ACTION_LABEL_KEY = {
6166
6579
  install: "panels.market.install",
6167
6580
  update: "panels.market.update",
6168
6581
  "update-bundle": "panels.market.update",
6582
+ "install-version": "panels.market.update",
6169
6583
  "remove-bundle": "panels.market.uninstall",
6170
6584
  uninstall: "panels.market.uninstall",
6171
6585
  "update-dependency": "panels.market.update",
@@ -6272,9 +6686,21 @@ function pendingRowOf(input) {
6272
6686
  ...pending.version === void 0 ? {} : { version: { installed: pending.version } }
6273
6687
  };
6274
6688
  }
6689
+ function askAgentReason(row, t) {
6690
+ if (row.hint !== void 0) return t(row.hint);
6691
+ if (row.note !== void 0) return t(row.note.key, row.note.params);
6692
+ return t(MARKET_STATE_KEY[row.state]);
6693
+ }
6694
+ function askAgentText(row, t) {
6695
+ return t("panels.market.askAgentText", {
6696
+ name: marketRowTitle(row, t),
6697
+ unit: row.id,
6698
+ reason: askAgentReason(row, t)
6699
+ });
6700
+ }
6275
6701
  //#endregion
6276
6702
  //#region src/app/layouts/rightbar/SharedSection.tsx
6277
- function SharedLine({ t, row, pending, failure, onAct }) {
6703
+ function SharedLine({ t, row, pending, failure, onAct, onRecheck, rechecking }) {
6278
6704
  const running = pending !== null && pending.id === row.id ? pending : null;
6279
6705
  const locked = pending !== null;
6280
6706
  const actions = sharedActions(row);
@@ -6293,60 +6719,32 @@ function SharedLine({ t, row, pending, failure, onAct }) {
6293
6719
  }, "·"), /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.marketReason }, t("panels.market.sharedUsedBy", { modules: row.usedByKeys.map((key) => t(key)).join(t("panels.market.listSeparator")) })))), /* @__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) => /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
6294
6720
  key: action,
6295
6721
  type: "button",
6296
- size: "sm",
6297
- variant: "outline",
6298
- disabled: locked,
6299
- onClick: () => onAct(action)
6300
- }, t(ACTION_LABEL_KEY[action]))))), failure === null ? null : /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketFailure }, failure));
6301
- }
6302
- function SharedSection({ t, rows, pending, failureOf, act }) {
6303
- if (rows.length === 0) return null;
6304
- 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", {
6305
- className: MarketPage_module_default.marketSectionIcon,
6306
- "aria-hidden": "true"
6307
- }, marketSectionIcon("shared")), /* @__PURE__ */ (0, react.createElement)("h2", { className: MarketPage_module_default.marketSectionTitle }, t("panels.market.sectionShared")), /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.marketSectionCount }, rows.length)), /* @__PURE__ */ (0, react.createElement)("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ (0, react.createElement)(SharedLine, {
6308
- key: row.id,
6309
- t,
6310
- row,
6311
- pending,
6312
- failure: failureOf(row.id),
6313
- onAct: (action) => void act(row.id, action)
6314
- }))));
6315
- }
6316
- //#endregion
6317
- //#region src/app/layouts/rightbar/panel-write.ts
6318
- var PANEL_SETTLE_MS = 4e3;
6319
- function rowKey(row) {
6320
- return `${row.id}:${row.shown ? "1" : "0"}:${row.source}`;
6321
- }
6322
- function rowKeys(rows) {
6323
- return rows.map(rowKey).join(",");
6324
- }
6325
- function panelBoardSignature(units, plugins, own) {
6326
- return `${rowKeys(units)}|${rowKeys(plugins)}|${own ? "1" : "0"}`;
6327
- }
6328
- function machineBoardSignature(defaults, changed) {
6329
- const counts = Object.entries(changed).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0).map(([id, count]) => `${id}:${String(count)}`);
6330
- return `${[...defaults].sort().join(",")}|${counts.join(",")}`;
6331
- }
6332
- function nextPending(pending, signature) {
6333
- return pending !== null && pending !== signature ? null : pending;
6334
- }
6335
- function useBoardSettle(signature) {
6336
- const [held, setHeld] = (0, react.useState)(null);
6337
- (0, react.useEffect)(() => {
6338
- setHeld((current) => nextPending(current, signature));
6339
- }, [signature]);
6340
- (0, react.useEffect)(() => {
6341
- if (held === null) return void 0;
6342
- const timer = setTimeout(() => setHeld(null), PANEL_SETTLE_MS);
6343
- return () => clearTimeout(timer);
6344
- }, [held]);
6345
- return {
6346
- pending: held !== null,
6347
- begin: () => setHeld(signature),
6348
- clear: () => setHeld(null)
6349
- };
6722
+ size: "sm",
6723
+ variant: "outline",
6724
+ disabled: locked,
6725
+ onClick: () => onAct(action)
6726
+ }, 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, {
6727
+ t,
6728
+ failure: failure.failure,
6729
+ onRecheck,
6730
+ rechecking
6731
+ })));
6732
+ }
6733
+ function SharedSection({ t, rows, pending, failureOf, act, onRecheck, rechecking }) {
6734
+ if (rows.length === 0) return null;
6735
+ 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", {
6736
+ className: MarketPage_module_default.marketSectionIcon,
6737
+ "aria-hidden": "true"
6738
+ }, marketSectionIcon("shared")), /* @__PURE__ */ (0, react.createElement)("h2", { className: MarketPage_module_default.marketSectionTitle }, t("panels.market.sectionShared")), /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.marketSectionCount }, rows.length)), /* @__PURE__ */ (0, react.createElement)("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ (0, react.createElement)(SharedLine, {
6739
+ key: row.id,
6740
+ t,
6741
+ row,
6742
+ pending,
6743
+ failure: failureOf(row.id),
6744
+ onAct: (action) => void act(row.id, action),
6745
+ onRecheck,
6746
+ rechecking
6747
+ }))));
6350
6748
  }
6351
6749
  //#endregion
6352
6750
  //#region src/shared/components/Tip.tsx
@@ -6368,6 +6766,25 @@ function Tip({ side = "bottom", align = "end", gap = 6, portal = true, ...rest }
6368
6766
  });
6369
6767
  }
6370
6768
  //#endregion
6769
+ //#region src/app/layouts/rightbar/AskAgentButton.tsx
6770
+ var COPIED_MS = 1200;
6771
+ function AskAgentButton({ t, text, label }) {
6772
+ const [copied, setCopied] = (0, react.useState)(false);
6773
+ const onCopy = (0, react.useCallback)(() => {
6774
+ (0, _deepseek_ai_dsh_client_ui_primitives.writeClipboard)(text).then((ok) => {
6775
+ if (!ok) return;
6776
+ setCopied(true);
6777
+ setTimeout(() => setCopied(false), COPIED_MS);
6778
+ });
6779
+ }, [text]);
6780
+ return /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
6781
+ type: "button",
6782
+ size: "sm",
6783
+ variant: "ghost",
6784
+ onClick: onCopy
6785
+ }, copied ? t("panels.market.askAgentCopied") : label);
6786
+ }
6787
+ //#endregion
6371
6788
  //#region src/app/layouts/rightbar/market-section.tsx
6372
6789
  var dangerActions = [
6373
6790
  "uninstall",
@@ -6438,13 +6855,14 @@ function MarketLineStatus({ t, row, quiet }) {
6438
6855
  "aria-hidden": "true"
6439
6856
  }, "·"), /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.marketReason }, noteText)));
6440
6857
  }
6441
- function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy }) {
6858
+ function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy, onRecheck, rechecking }) {
6442
6859
  const running = pending !== null && pending.id === row.id ? pending : null;
6443
6860
  const locked = pending !== null;
6444
6861
  const [migrationOpen, setMigrationOpen] = (0, react.useState)(false);
6445
6862
  const [dismissOpen, setDismissOpen] = (0, react.useState)(false);
6446
6863
  const quiet = row.workbench === true && row.state === "installed" && row.hint === void 0;
6447
6864
  const actions = marketActions$1(row);
6865
+ const asksAgent = marketAsksAgent(row);
6448
6866
  const switchLocked = marketSwitchLocked(row);
6449
6867
  return /* @__PURE__ */ (0, react.createElement)("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ (0, react.createElement)("span", {
6450
6868
  className: MarketPage_module_default.marketIcon,
@@ -6456,7 +6874,11 @@ function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy }) {
6456
6874
  t,
6457
6875
  row,
6458
6876
  quiet
6459
- })), /* @__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) => {
6877
+ })), /* @__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, {
6878
+ t,
6879
+ text: askAgentText(row, t),
6880
+ label: t("panels.market.askAgent")
6881
+ }) : null, actions.map((action) => {
6460
6882
  const danger = dangerActions.includes(action);
6461
6883
  const update = updateActions.includes(action);
6462
6884
  return /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
@@ -6479,7 +6901,12 @@ function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy }) {
6479
6901
  disabled: boardBusy === true || locked || switchLocked,
6480
6902
  label: `${marketRowTitle(row, t)} · ${t("panels.market.defaultLabel")}`,
6481
6903
  onChange: (next) => onDefault?.(next)
6482
- })))), failure === null ? null : /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketFailure }, failure), /* @__PURE__ */ (0, react.createElement)(MarketLineDialogs, {
6904
+ })))), 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, {
6905
+ t,
6906
+ failure: failure.failure,
6907
+ onRecheck,
6908
+ rechecking
6909
+ })), /* @__PURE__ */ (0, react.createElement)(MarketLineDialogs, {
6483
6910
  t,
6484
6911
  migrationOpen,
6485
6912
  dismissOpen,
@@ -6495,12 +6922,12 @@ function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy }) {
6495
6922
  }
6496
6923
  }));
6497
6924
  }
6498
- function MarketSection({ t, titleKey, icon, rows, pending, failureOf, act, confirmActions, onConfirming, onDefault, boardBusy }) {
6499
- if (rows.length === 0) return null;
6925
+ function MarketSection({ t, titleKey, icon, rows, pending, failureOf, act, confirmActions, onConfirming, onDefault, boardBusy, headAction, keepHead, onRecheck, rechecking }) {
6926
+ if (rows.length === 0 && keepHead !== true) return null;
6500
6927
  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", {
6501
6928
  className: MarketPage_module_default.marketSectionIcon,
6502
6929
  "aria-hidden": "true"
6503
- }, icon), /* @__PURE__ */ (0, react.createElement)("h2", { className: MarketPage_module_default.marketSectionTitle }, t(titleKey)), rows.length === 0 ? null : /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.marketSectionCount }, rows.length)), rows.length === 0 ? null : /* @__PURE__ */ (0, react.createElement)("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ (0, react.createElement)(MarketLine, {
6930
+ }, icon), /* @__PURE__ */ (0, react.createElement)("h2", { className: MarketPage_module_default.marketSectionTitle }, t(titleKey)), /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.marketSectionCount }, rows.length), headAction === void 0 ? null : /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.marketSectionAction }, headAction)), rows.length === 0 ? null : /* @__PURE__ */ (0, react.createElement)("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ (0, react.createElement)(MarketLine, {
6504
6931
  key: row.id,
6505
6932
  t,
6506
6933
  row,
@@ -6508,7 +6935,9 @@ function MarketSection({ t, titleKey, icon, rows, pending, failureOf, act, confi
6508
6935
  failure: failureOf(row.id),
6509
6936
  onAct: (action) => confirmActions.includes(action) ? onConfirming(row.id) : void act(row.id, action),
6510
6937
  onDefault: (next) => onDefault?.(row.id, next),
6511
- boardBusy
6938
+ boardBusy,
6939
+ onRecheck,
6940
+ rechecking
6512
6941
  }))));
6513
6942
  }
6514
6943
  //#endregion
@@ -6741,6 +7170,14 @@ function changeFailure(change, t) {
6741
7170
  if (change === void 0 || SHIPPED$1.includes(change.application)) return void 0;
6742
7171
  return failureReason(failureCode(change), change.application, t);
6743
7172
  }
7173
+ function appliedUnitsOf(value) {
7174
+ if (changeOf(value)?.application !== "applied") return [];
7175
+ const module = value?.module;
7176
+ if (typeof module !== "object" || module === null) return [];
7177
+ const record = module;
7178
+ if (record.kind !== "module") return [];
7179
+ return typeof record.unit === "string" && record.unit !== "" ? [record.unit] : [];
7180
+ }
6744
7181
  //#endregion
6745
7182
  //#region src/app/layouts/rightbar/market-update-verdict.ts
6746
7183
  function updateVerdictOf(input) {
@@ -6772,7 +7209,11 @@ function updateVerdictText(verdict, t, input) {
6772
7209
  }
6773
7210
  //#endregion
6774
7211
  //#region src/app/layouts/rightbar/market-act.ts
6775
- var STEADY_ACTIONS = /* @__PURE__ */ new Set(["update", "update-bundle"]);
7212
+ var STEADY_ACTIONS = /* @__PURE__ */ new Set([
7213
+ "update",
7214
+ "update-bundle",
7215
+ "install-version"
7216
+ ]);
6776
7217
  function assumedApplied(action) {
6777
7218
  return action === "update" || action === "update-dependency" || action === "update-plugin" || REMOVAL_ACTIONS.has(action);
6778
7219
  }
@@ -6816,18 +7257,34 @@ function marketActOf(options) {
6816
7257
  seats.setConfirming(null);
6817
7258
  seats.setFailed(null);
6818
7259
  seats.setNotice(null);
7260
+ const dependency = action === "update-dependency";
7261
+ const byName = action === "remove-bundle" || action === "update-plugin" || action === "uninstall-plugin" || action === "update-workbench" || action === "migrate-workbench";
7262
+ const market = action === "install-version" ? row?.market : void 0;
7263
+ const marketSpec = market === void 0 || row?.pkg === void 0 ? void 0 : marketInstallTarget(row.pkg, market.version, market.source).spec;
7264
+ if (action === "install-version" && marketSpec === void 0) {
7265
+ seats.setPending(null);
7266
+ seats.setFailed({
7267
+ id,
7268
+ message: t("panels.market.failed", { reason: t("panels.market.noMarketSource") })
7269
+ });
7270
+ return;
7271
+ }
6819
7272
  const outcome = await send(action === "dismiss-followup" ? {
6820
7273
  action,
6821
7274
  id: row?.followUp?.id ?? ""
6822
- } : action === "update-dependency" ? {
7275
+ } : dependency ? {
6823
7276
  action,
6824
7277
  id
6825
- } : action === "remove-bundle" || action === "update-plugin" || action === "uninstall-plugin" || action === "update-workbench" || action === "migrate-workbench" ? {
7278
+ } : byName ? {
6826
7279
  action,
6827
7280
  name: row?.pkg ?? ""
6828
- } : {
7281
+ } : marketSpec === void 0 ? {
6829
7282
  action,
6830
7283
  unit: id
7284
+ } : {
7285
+ action,
7286
+ spec: marketSpec,
7287
+ requestId: globalThis.crypto.randomUUID()
6831
7288
  });
6832
7289
  if (!outcome.ok) {
6833
7290
  onChanged({ force: true });
@@ -6835,7 +7292,8 @@ function marketActOf(options) {
6835
7292
  seats.setHeld(void 0);
6836
7293
  seats.setFailed({
6837
7294
  id,
6838
- message: t("panels.market.failed", { reason: outcome.message })
7295
+ message: t("panels.market.failed", { reason: outcome.message }),
7296
+ ...outcome.failure === void 0 ? {} : { failure: outcome.failure }
6839
7297
  });
6840
7298
  return;
6841
7299
  }
@@ -6892,6 +7350,109 @@ function marketActOf(options) {
6892
7350
  });
6893
7351
  };
6894
7352
  }
7353
+ //#endregion
7354
+ //#region src/app/layouts/rightbar/panel-write.ts
7355
+ var PANEL_SETTLE_MS = 4e3;
7356
+ function rowKey(row) {
7357
+ return `${row.id}:${row.shown ? "1" : "0"}:${row.source}`;
7358
+ }
7359
+ function rowKeys(rows) {
7360
+ return rows.map(rowKey).join(",");
7361
+ }
7362
+ function panelBoardSignature(units, plugins, own) {
7363
+ return `${rowKeys(units)}|${rowKeys(plugins)}|${own ? "1" : "0"}`;
7364
+ }
7365
+ function machineBoardSignature(defaults, changed) {
7366
+ const counts = Object.entries(changed).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0).map(([id, count]) => `${id}:${String(count)}`);
7367
+ return `${[...defaults].sort().join(",")}|${counts.join(",")}`;
7368
+ }
7369
+ function nextPending(pending, signature) {
7370
+ return pending !== null && pending !== signature ? null : pending;
7371
+ }
7372
+ function useBoardSettle(signature) {
7373
+ const [held, setHeld] = (0, react.useState)(null);
7374
+ (0, react.useEffect)(() => {
7375
+ setHeld((current) => nextPending(current, signature));
7376
+ }, [signature]);
7377
+ (0, react.useEffect)(() => {
7378
+ if (held === null) return void 0;
7379
+ const timer = setTimeout(() => setHeld(null), PANEL_SETTLE_MS);
7380
+ return () => clearTimeout(timer);
7381
+ }, [held]);
7382
+ return {
7383
+ pending: held !== null,
7384
+ begin: () => setHeld(signature),
7385
+ clear: () => setHeld(null)
7386
+ };
7387
+ }
7388
+ //#endregion
7389
+ //#region src/app/layouts/rightbar/use-market-default.ts
7390
+ function useMarketDefault(input) {
7391
+ const { t, mocked, defaults, changed, setNotice } = input;
7392
+ const boardWrite = useHostWrite({
7393
+ channel: "prefs",
7394
+ resource: "panels",
7395
+ networkText: t("panels.failed")
7396
+ });
7397
+ const [writing, setWriting] = (0, react.useState)(false);
7398
+ const settle = useBoardSettle(machineBoardSignature(defaults, changed));
7399
+ const setDefault = async (id, next) => {
7400
+ if (mocked) return;
7401
+ setWriting(true);
7402
+ settle.begin();
7403
+ const outcome = await boardWrite.send({
7404
+ action: next ? "show" : "hide",
7405
+ id,
7406
+ scope: "machine"
7407
+ });
7408
+ setWriting(false);
7409
+ if (!outcome.ok) {
7410
+ settle.clear();
7411
+ setNotice(t("panels.failed"));
7412
+ }
7413
+ };
7414
+ return {
7415
+ pending: writing || settle.pending,
7416
+ setDefault
7417
+ };
7418
+ }
7419
+ var market_check_module_default = {
7420
+ check: "_check_1g6tv_1",
7421
+ status: "_status_1g6tv_8",
7422
+ button: "_button_1g6tv_15",
7423
+ icon: "_icon_1g6tv_22"
7424
+ };
7425
+ //#endregion
7426
+ //#region src/app/layouts/market/market-check.tsx
7427
+ function MarketCheck({ t, checkedAt, latestCheck = {
7428
+ checked: 0,
7429
+ unknown: 0
7430
+ }, checking, failed, disabled, onCheck }) {
7431
+ const parts = [];
7432
+ if (checking) parts.push(t("panels.market.checkingNow"));
7433
+ else {
7434
+ if (latestCheck.checked > 0 && checkedAt !== null) parts.push(t("panels.market.checkedAt", { time: checkedAgo(checkedAt, t) }));
7435
+ if (failed) parts.push(t("panels.market.checkFailed"));
7436
+ else if (latestCheck.unknown > 0) parts.push(t("panels.market.latestPartial", { n: String(latestCheck.unknown) }));
7437
+ }
7438
+ const status = parts.length === 0 ? null : parts.join(" · ");
7439
+ return /* @__PURE__ */ (0, react.createElement)("span", { className: market_check_module_default.check }, status === null ? null : /* @__PURE__ */ (0, react.createElement)("span", {
7440
+ className: market_check_module_default.status,
7441
+ "aria-live": "polite"
7442
+ }, status), /* @__PURE__ */ (0, react.createElement)(Tip, { label: t("panels.market.checkUpdates") }, /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7443
+ type: "button",
7444
+ variant: "ghost",
7445
+ size: "sm",
7446
+ className: market_check_module_default.button,
7447
+ "aria-label": t("panels.market.checkUpdates"),
7448
+ disabled: disabled || checking,
7449
+ icon: /* @__PURE__ */ (0, react.createElement)("span", {
7450
+ className: `${market_check_module_default.icon}${checking ? " wb-spinning" : ""}`,
7451
+ "aria-hidden": "true"
7452
+ }, /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutlineRegular, { size: 14 })),
7453
+ onClick: onCheck
7454
+ })));
7455
+ }
6895
7456
  var PanelFoot_module_default = {
6896
7457
  foot: "_foot_1ud1j_1",
6897
7458
  footText: "_footText_1ud1j_13",
@@ -6909,6 +7470,8 @@ var CONFIRM_UNINSTALL = [
6909
7470
  "remove-bundle",
6910
7471
  "uninstall-plugin"
6911
7472
  ];
7473
+ var NO_ROWS = [];
7474
+ var NO_UNITS$1 = /* @__PURE__ */ new Set();
6912
7475
  function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
6913
7476
  const [acknowledged, setAcknowledged] = (0, react.useState)(false);
6914
7477
  return /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.RiskConfirmation, {
@@ -6925,9 +7488,12 @@ function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
6925
7488
  onConfirm
6926
7489
  });
6927
7490
  }
6928
- function MarketBody({ t, self, shown, pluginList, installedList, shared, pending, failed, notice, act, onConfirming, setDefault, boardBusy }) {
6929
- const failureOf = (id) => failed?.id === id ? failed.message : null;
7491
+ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending, failed, notice, act, onConfirming, setDefault, boardBusy, check, onRecheck, rechecking }) {
7492
+ const failureOf = (id) => failed?.id === id ? failed : null;
6930
7493
  const foot = marketFootVisible(shown, installedList);
7494
+ const sections = marketSections(marketOrder([...shown, ...installedList], (row) => marketRowTitle(row, t)));
7495
+ const installed = sections.find((section) => section.id === "installed");
7496
+ const pendingSection = sections.find((section) => section.id === "not-installed");
6931
7497
  return /* @__PURE__ */ (0, react.createElement)(react.Fragment, null, notice === null ? null : /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketNote }, notice), /* @__PURE__ */ (0, react.createElement)(MarketSection, {
6932
7498
  t,
6933
7499
  rows: self === void 0 ? [] : [self],
@@ -6937,35 +7503,57 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
6937
7503
  failureOf,
6938
7504
  act,
6939
7505
  confirmActions: CONFIRM_UNINSTALL,
6940
- onConfirming
7506
+ onConfirming,
7507
+ onRecheck,
7508
+ rechecking
6941
7509
  }), self === void 0 ? null : /* @__PURE__ */ (0, react.createElement)("div", {
6942
7510
  className: MarketPage_module_default.marketSelfDivider,
6943
7511
  "aria-hidden": "true"
6944
- }), marketSections(marketOrder([...shown, ...installedList], (row) => marketRowTitle(row, t))).map((section) => /* @__PURE__ */ (0, react.createElement)(MarketSection, {
6945
- key: section.id,
7512
+ }), /* @__PURE__ */ (0, react.createElement)(MarketSection, {
7513
+ t,
7514
+ titleKey: "panels.market.sectionInstalled",
7515
+ icon: marketSectionIcon("installed"),
7516
+ rows: installed?.rows ?? NO_ROWS,
7517
+ keepHead: true,
7518
+ headAction: check,
7519
+ onDefault: setDefault,
7520
+ boardBusy,
7521
+ pending,
7522
+ failureOf,
7523
+ act,
7524
+ confirmActions: CONFIRM_UNINSTALL,
7525
+ onConfirming,
7526
+ onRecheck,
7527
+ rechecking
7528
+ }), pendingSection === void 0 ? null : /* @__PURE__ */ (0, react.createElement)(MarketSection, {
6946
7529
  t,
6947
- titleKey: section.titleKey,
6948
- icon: marketSectionIcon(section.id === "installed" ? "installed" : "pending"),
6949
- rows: section.rows,
7530
+ titleKey: pendingSection.titleKey,
7531
+ icon: marketSectionIcon("pending"),
7532
+ rows: pendingSection.rows,
6950
7533
  onDefault: setDefault,
6951
7534
  boardBusy,
6952
7535
  pending,
6953
7536
  failureOf,
6954
7537
  act,
6955
7538
  confirmActions: CONFIRM_UNINSTALL,
6956
- onConfirming
6957
- })), /* @__PURE__ */ (0, react.createElement)(MarketSection, {
7539
+ onConfirming,
7540
+ onRecheck,
7541
+ rechecking
7542
+ }), /* @__PURE__ */ (0, react.createElement)(MarketSection, {
6958
7543
  t,
6959
7544
  titleKey: "panels.market.sectionPlugins",
6960
7545
  icon: marketSectionIcon("plugins"),
6961
7546
  rows: pluginList,
7547
+ headAction: check,
6962
7548
  onDefault: setDefault,
6963
7549
  boardBusy,
6964
7550
  pending,
6965
7551
  failureOf,
6966
7552
  act,
6967
7553
  confirmActions: CONFIRM_UNINSTALL,
6968
- onConfirming
7554
+ onConfirming,
7555
+ onRecheck,
7556
+ rechecking
6969
7557
  }), foot ? /* @__PURE__ */ (0, react.createElement)(PanelFoot, {
6970
7558
  size: "md",
6971
7559
  text: t("panels.market.foot")
@@ -6974,11 +7562,13 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
6974
7562
  rows: shared,
6975
7563
  pending,
6976
7564
  failureOf,
6977
- act
7565
+ act,
7566
+ onRecheck,
7567
+ rechecking
6978
7568
  }));
6979
7569
  }
6980
7570
  function useMarketScene(input) {
6981
- const { t, titleOf, manifests, installable, capabilities, updates, installed, settling, mock, defaults, changed, pending, failed } = input;
7571
+ const { t, titleOf, manifests, installable, capabilities, updates, installed, settling, installing, mock, defaults, changed, pending, failed } = input;
6982
7572
  const names = marketNamesOf(t, installed ?? [], titleOf, mock !== void 0);
6983
7573
  const catalog = mock?.manifests ?? manifests;
6984
7574
  const marketable = mock === void 0 ? marketCatalog(manifests, installable) : catalog;
@@ -6986,7 +7576,10 @@ function useMarketScene(input) {
6986
7576
  const source = liveManifests(marketable, effective, installedIdSet(mock === void 0 ? installed : void 0));
6987
7577
  const byDefault = new Set(defaults);
6988
7578
  const updateMap = mock?.updates ?? updates ?? {};
6989
- const rows = marketRows(source, effective, updateMap, byDefault, changed);
7579
+ const rows = checkingRows(marketRows(source, effective, updateMap, byDefault, changed), {
7580
+ all: installing,
7581
+ units: settling ?? NO_UNITS$1
7582
+ });
6990
7583
  const shared = sharedRows(source, effective);
6991
7584
  const removing = removingIdOf(pending, failed);
6992
7585
  const steady = useHeldRow(pending, (id) => catalog.some((manifest) => manifest.id === id));
@@ -7007,7 +7600,7 @@ function useMarketScene(input) {
7007
7600
  busyId
7008
7601
  };
7009
7602
  }
7010
- function MarketView({ t, titleOf, manifests, installable, capabilities, freshness, onChanged, onPending, updates, installed, installedRead, workbench, selfUpdate, plugins, settling, mock, defaults = [], changed = {} }) {
7603
+ function MarketView({ t, titleOf, manifests, installable, capabilities, freshness, onChanged, onPending, updates, updatesCheckedAt = null, updatesFailed = false, installed, installedRead, workbench, selfUpdate, plugins, settling, installing = false, mock, defaults = [], changed = {} }) {
7011
7604
  const { pending, setPending, confirming, setConfirming, failed, setFailed, notice, setNotice } = useMarketTransient({
7012
7605
  mock,
7013
7606
  onPending
@@ -7021,6 +7614,7 @@ function MarketView({ t, titleOf, manifests, installable, capabilities, freshnes
7021
7614
  updates,
7022
7615
  installed,
7023
7616
  settling,
7617
+ installing,
7024
7618
  mock,
7025
7619
  defaults,
7026
7620
  changed,
@@ -7032,29 +7626,14 @@ function MarketView({ t, titleOf, manifests, installable, capabilities, freshnes
7032
7626
  channel: "provision",
7033
7627
  networkText: t("panels.failed")
7034
7628
  });
7035
- const boardWrite = useHostWrite({
7036
- channel: "prefs",
7037
- resource: "panels",
7038
- networkText: t("panels.failed")
7629
+ const { pending: defaultPending, setDefault } = useMarketDefault({
7630
+ t,
7631
+ mocked: mock !== void 0,
7632
+ defaults,
7633
+ changed,
7634
+ setNotice
7039
7635
  });
7040
- const [writingDefault, setWritingDefault] = (0, react.useState)(false);
7041
- const settleDefault = useBoardSettle(machineBoardSignature(defaults, changed));
7042
- const { busy: boardBusy } = useVisibleBusy(writingDefault || settleDefault.pending, 500);
7043
- const setDefault = async (id, next) => {
7044
- if (mock !== void 0) return;
7045
- setWritingDefault(true);
7046
- settleDefault.begin();
7047
- const outcome = await boardWrite.send({
7048
- action: next ? "show" : "hide",
7049
- id,
7050
- scope: "machine"
7051
- });
7052
- setWritingDefault(false);
7053
- if (!outcome.ok) {
7054
- settleDefault.clear();
7055
- setNotice(t("panels.failed"));
7056
- }
7057
- };
7636
+ const { busy: boardBusy } = useVisibleBusy(defaultPending, 500);
7058
7637
  const pendingRow = pendingRowOf({
7059
7638
  pending,
7060
7639
  removing,
@@ -7101,6 +7680,21 @@ function MarketView({ t, titleOf, manifests, installable, capabilities, freshnes
7101
7680
  });
7102
7681
  const settled = marketSettled(freshness, installedRead);
7103
7682
  const nothing = shown.length === 0 && self === void 0 && installedList.length === 0 && pluginList.length === 0;
7683
+ const { busy: checkingShown } = useVisibleBusy(freshness.checking, 500);
7684
+ const recheck = () => {
7685
+ setFailed(null);
7686
+ if (mock === void 0) onChanged({ force: true });
7687
+ };
7688
+ const latestCheck = latestCheckSummary(mock?.installed ?? installed);
7689
+ const check = /* @__PURE__ */ (0, react.createElement)(MarketCheck, {
7690
+ t,
7691
+ checkedAt: updatesCheckedAt,
7692
+ latestCheck,
7693
+ checking: checkingShown,
7694
+ failed: updatesFailed,
7695
+ disabled: pending !== null,
7696
+ onCheck: () => onChanged({ force: true })
7697
+ });
7104
7698
  if (!settled || (settling?.size ?? 0) > 0 && shown.length === 0 && installedList.length === 0) return /* @__PURE__ */ (0, react.createElement)(MarketChecking, { t });
7105
7699
  if (nothing) return /* @__PURE__ */ (0, react.createElement)(MarketEmpty, { t });
7106
7700
  return /* @__PURE__ */ (0, react.createElement)(react.Fragment, null, /* @__PURE__ */ (0, react.createElement)(MarketBody, {
@@ -7116,20 +7710,33 @@ function MarketView({ t, titleOf, manifests, installable, capabilities, freshnes
7116
7710
  act,
7117
7711
  onConfirming: setConfirming,
7118
7712
  setDefault,
7119
- boardBusy
7120
- }), /* @__PURE__ */ (0, react.createElement)(ConfirmUninstall, {
7713
+ boardBusy,
7714
+ check,
7715
+ onRecheck: recheck,
7716
+ rechecking: checkingShown
7717
+ }), /* @__PURE__ */ (0, react.createElement)(UninstallConfirm, {
7718
+ t,
7719
+ confirming,
7720
+ row: confirmingRow,
7721
+ onClose: () => setConfirming(null),
7722
+ act,
7723
+ rowById
7724
+ }));
7725
+ }
7726
+ function UninstallConfirm({ t, confirming, row, onClose, act, rowById }) {
7727
+ return /* @__PURE__ */ (0, react.createElement)(ConfirmUninstall, {
7121
7728
  key: confirming ?? "",
7122
7729
  t,
7123
- name: confirmingRow === void 0 ? null : marketRowTitle(confirmingRow, t),
7124
- onCancel: () => setConfirming(null),
7730
+ name: row === void 0 ? null : marketRowTitle(row, t),
7731
+ onCancel: onClose,
7125
7732
  onConfirm: () => {
7126
7733
  const id = confirming;
7127
- setConfirming(null);
7734
+ onClose();
7128
7735
  if (id === null) return;
7129
- const row = rowById.get(id);
7130
- act(id, row?.plugin === true ? "uninstall-plugin" : row?.pkg === void 0 ? "uninstall" : "remove-bundle");
7736
+ const target = rowById.get(id);
7737
+ act(id, target?.plugin === true ? "uninstall-plugin" : target?.pkg === void 0 ? "uninstall" : "remove-bundle");
7131
7738
  }
7132
- }));
7739
+ });
7133
7740
  }
7134
7741
  //#endregion
7135
7742
  //#region ../../node_modules/.pnpm/dayjs@1.11.23/node_modules/dayjs/plugin/localizedFormat.js
@@ -7406,13 +8013,17 @@ function MarketIcon({ src, size = ICON }) {
7406
8013
  function EntryAction({ t, entry, title, onInstall, onShowInstalled, installDisabled = false }) {
7407
8014
  const latest = latestVersionOf(entry);
7408
8015
  if (latest === void 0) return null;
7409
- if (latest.install === "installed" || latest.install === "update-available") return /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
7410
- type: "button",
7411
- variant: "ghost",
7412
- size: "sm",
7413
- "aria-label": t("panels.discover.openInstalled", { name: title }),
7414
- onClick: () => onShowInstalled(entry.name)
7415
- }, t(latest.install === "update-available" ? "panels.discover.cardUpdate" : "panels.discover.cardInstalled"));
8016
+ if (latest.install === "installed" || latest.install === "update-available") {
8017
+ const update = latest.install === "update-available";
8018
+ return /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8019
+ type: "button",
8020
+ variant: "ghost",
8021
+ size: "sm",
8022
+ className: update ? MarketPage_module_default.discoverUpdateAction : void 0,
8023
+ "aria-label": t("panels.discover.openInstalled", { name: title }),
8024
+ onClick: () => onShowInstalled(entry.name)
8025
+ }, t(update ? "panels.discover.cardUpdate" : "panels.discover.cardInstalled"));
8026
+ }
7416
8027
  if (latest.compat === "incompatible") return /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
7417
8028
  label: t("panels.discover.noCompatibleVersion", { runtime: latest.engines?.dsh ?? "" }),
7418
8029
  side: "bottom",
@@ -7513,6 +8124,7 @@ function DiscoverVersions({ t, locale, entry, onInstall, installDisabled = false
7513
8124
  var MARKET_DISCOVER_ROUTE = "panels/market-discover";
7514
8125
  var MARKET_DOC_ROUTE = "panels/market-doc";
7515
8126
  var MARKET_GIT_PROBE_ROUTE = "panels/git-probe";
8127
+ var MARKET_INSTALLED_ROUTE = "panels/market-installed";
7516
8128
  var MARKET_PUBLISH_PREVIEW_ROUTE = "panels/market-publish-preview";
7517
8129
  var MARKET_SOURCES_ROUTE = "panels/market-sources";
7518
8130
  //#endregion
@@ -7526,6 +8138,9 @@ function readMarketSources() {
7526
8138
  function readGitProbe(url) {
7527
8139
  return apiGet(MARKET_GIT_PROBE_ROUTE, { url });
7528
8140
  }
8141
+ function readMarketInstalled() {
8142
+ return apiGet(MARKET_INSTALLED_ROUTE);
8143
+ }
7529
8144
  function readMarketDoc(name, version, kind) {
7530
8145
  return apiGet(MARKET_DOC_ROUTE, {
7531
8146
  name,
@@ -7729,10 +8344,24 @@ function stateText(t, state) {
7729
8344
  if (state === "unknown") return t("panels.discover.transportUnknown");
7730
8345
  return t("panels.discover.transportChecking");
7731
8346
  }
8347
+ function kindText(t, kind) {
8348
+ return t(kind === "ssh" ? "panels.discover.transportSsh" : "panels.discover.transportHttps");
8349
+ }
7732
8350
  function DiscoverTransport({ t, transport }) {
8351
+ const [open, setOpen] = (0, react.useState)(false);
8352
+ const chosenRow = transport.rows.find((row) => row.url === transport.chosen);
8353
+ const chosenState = chosenRow === void 0 ? void 0 : transport.states[chosenRow.url] ?? "checking";
8354
+ const probing = transport.probing;
8355
+ const summary = chosenRow !== void 0 ? kindText(t, chosenRow.kind) : probing ? t("panels.discover.transportChecking") : t("panels.discover.transportNone");
8356
+ const summaryState = probing || chosenState === void 0 ? "" : stateText(t, chosenState);
7733
8357
  const needsAuth = transport.rows.length > 0 && transport.rows.every((row) => transport.states[row.url] === "auth") && transport.customState !== "ok";
7734
8358
  const customBusy = transport.customState === "checking";
7735
- return /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.discoverTransport }, /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.discoverTransportTitle }, t("panels.discover.transportTitle")), /* @__PURE__ */ (0, react.createElement)("div", {
8359
+ return /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.discoverTransport }, /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.discoverTransportHead }, /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.discoverTransportTitle }, t("panels.discover.transportTitle")), /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.discoverTransportKind }, summary), summaryState === "" ? null : /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.discoverTransportState }, summaryState), /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
8360
+ type: "button",
8361
+ variant: "ghost",
8362
+ size: "sm",
8363
+ onClick: () => setOpen((value) => !value)
8364
+ }, t(open ? "panels.discover.transportChangeHide" : "panels.discover.transportChange"))), open ? /* @__PURE__ */ (0, react.createElement)("div", {
7736
8365
  className: MarketPage_module_default.discoverTransportRows,
7737
8366
  role: "radiogroup",
7738
8367
  "aria-label": t("panels.discover.transportTitle")
@@ -7751,8 +8380,8 @@ function DiscoverTransport({ t, transport }) {
7751
8380
  value: row.url,
7752
8381
  checked: transport.chosen === row.url,
7753
8382
  onChange: () => transport.setChosen(row.url)
7754
- }), /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.discoverTransportKind }, t(row.kind === "ssh" ? "panels.discover.transportSsh" : "panels.discover.transportHttps")), label === "" ? null : /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.discoverTransportState }, label));
7755
- })), /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.discoverTransportCustom }, /* @__PURE__ */ (0, react.createElement)(TextField, {
8383
+ }), /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.discoverTransportKind }, kindText(t, row.kind)), label === "" ? null : /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.discoverTransportState }, label));
8384
+ })) : null, open ? /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.discoverTransportCustom }, /* @__PURE__ */ (0, react.createElement)(TextField, {
7756
8385
  type: "text",
7757
8386
  className: MarketPage_module_default.discoverTransportInput,
7758
8387
  value: transport.custom,
@@ -7771,7 +8400,7 @@ function DiscoverTransport({ t, transport }) {
7771
8400
  disabled: transport.custom.trim() === "" || customBusy,
7772
8401
  "aria-busy": customBusy,
7773
8402
  onClick: transport.checkCustom
7774
- }, t(customBusy ? "panels.discover.transportChecking" : "panels.discover.transportTest")), transport.customState === null || stateText(t, transport.customState) === "" ? null : /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.discoverTransportState }, stateText(t, transport.customState))), needsAuth ? /* @__PURE__ */ (0, react.createElement)("p", {
8403
+ }, t(customBusy ? "panels.discover.transportChecking" : "panels.discover.transportTest")), transport.customState === null || stateText(t, transport.customState) === "" ? null : /* @__PURE__ */ (0, react.createElement)("span", { className: MarketPage_module_default.discoverTransportState }, stateText(t, transport.customState))) : null, needsAuth ? /* @__PURE__ */ (0, react.createElement)("p", {
7775
8404
  className: MarketPage_module_default.discoverNotice,
7776
8405
  role: "note"
7777
8406
  }, /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutlineRegular, {
@@ -7793,8 +8422,13 @@ function defaultOf(rows, states) {
7793
8422
  const fallback = rows.find((row) => usable(states[row.url]));
7794
8423
  return fallback === void 0 ? null : fallback.url;
7795
8424
  }
7796
- function useGitTransport(source) {
7797
- const rows = (0, react.useMemo)(() => source === null ? [] : gitTransportCandidates(source.url), [source]);
8425
+ function useGitTransport(source, preferredKind) {
8426
+ const rows = (0, react.useMemo)(() => {
8427
+ if (source === null) return [];
8428
+ const candidates = gitTransportCandidates(source.url);
8429
+ if (preferredKind === void 0) return candidates;
8430
+ return [...candidates].sort((left, right) => Number(right.kind === preferredKind) - Number(left.kind === preferredKind));
8431
+ }, [source, preferredKind]);
7798
8432
  const [results, setResults] = (0, react.useState)({});
7799
8433
  const [picked, setPicked] = (0, react.useState)(null);
7800
8434
  const [custom, setCustom] = (0, react.useState)("");
@@ -7845,12 +8479,13 @@ function useGitTransport(source) {
7845
8479
  }
7846
8480
  //#endregion
7847
8481
  //#region src/app/layouts/market/discover-confirm.tsx
7848
- function DiscoverConfirm({ t, locale, choice, onCancel, onConfirm }) {
8482
+ function DiscoverConfirm({ t, locale, choice, transports, onCancel, onConfirm }) {
7849
8483
  if (choice === null) return null;
7850
8484
  return /* @__PURE__ */ (0, react.createElement)(DiscoverConfirmBody, {
7851
8485
  t,
7852
8486
  locale,
7853
8487
  choice,
8488
+ transports,
7854
8489
  onCancel,
7855
8490
  onConfirm
7856
8491
  });
@@ -7858,9 +8493,10 @@ function DiscoverConfirm({ t, locale, choice, onCancel, onConfirm }) {
7858
8493
  function factLabel(t, kind) {
7859
8494
  return t(kind === "package" ? "panels.discover.factPackage" : kind === "registry" ? "panels.discover.factRegistry" : kind === "repository" ? "panels.discover.factRepository" : kind === "commit" ? "panels.discover.factCommit" : "panels.discover.factDirectory");
7860
8495
  }
7861
- function DiscoverConfirmBody({ t, locale, choice, onCancel, onConfirm }) {
8496
+ function DiscoverConfirmBody({ t, locale, choice, transports, onCancel, onConfirm }) {
7862
8497
  const git = choice.version.source.type === "git" ? choice.version.source : null;
7863
- const transport = useGitTransport(git);
8498
+ const host = git === null ? void 0 : gitAddressOf(git.url)?.host;
8499
+ const transport = useGitTransport(git, host === void 0 ? void 0 : transports[host]);
7864
8500
  const title = displayTitleOf(choice.entry, locale) || choice.entry.name;
7865
8501
  const facts = sourceFactsOf(choice.entry.name, choice.version).filter((fact) => git === null || fact.kind !== "repository");
7866
8502
  const ready = git === null || transport.ready;
@@ -7881,7 +8517,7 @@ function DiscoverConfirmBody({ t, locale, choice, onCancel, onConfirm }) {
7881
8517
  disabled: !ready,
7882
8518
  "aria-busy": git !== null && transport.probing,
7883
8519
  onClick: () => onConfirm(transport.chosen ?? void 0)
7884
- }, t("panels.discover.cardInstall")))
8520
+ }, git !== null && transport.probing ? /* @__PURE__ */ (0, react.createElement)(Spinner, { size: 12 }) : null, t(git !== null && transport.probing ? "panels.discover.transportChecking" : "panels.discover.cardInstall")))
7885
8521
  }, /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.discoverDialogBody }, /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.discoverConfirmHead }, /* @__PURE__ */ (0, react.createElement)("span", {
7886
8522
  className: MarketPage_module_default.discoverArtwork,
7887
8523
  "aria-hidden": "true"
@@ -8168,6 +8804,7 @@ function DiscoverDialogs({ t, d }) {
8168
8804
  t,
8169
8805
  locale: d.locale,
8170
8806
  choice: d.choice,
8807
+ transports: d.transports,
8171
8808
  onCancel: () => d.setChoice(null),
8172
8809
  onConfirm: d.install
8173
8810
  }), /* @__PURE__ */ (0, react.createElement)(DiscoverInitDialog, {
@@ -8409,6 +9046,8 @@ function useDiscover(t, active, onInstalled) {
8409
9046
  const [addingSource, setAddingSource] = (0, react.useState)(false);
8410
9047
  const [pendingSourceId, setPendingSourceId] = (0, react.useState)(null);
8411
9048
  const [knownSources, setKnownSources] = (0, react.useState)(null);
9049
+ const [installToken] = (0, react.useState)(() => `market-install:${globalThis.crypto.randomUUID()}`);
9050
+ usePublishMarketInstalling(installToken, installing !== null);
8412
9051
  const loaded = (0, react.useRef)(false);
8413
9052
  const loadTicket = (0, react.useRef)(0);
8414
9053
  const sourceTicket = (0, react.useRef)(0);
@@ -8434,7 +9073,8 @@ function useDiscover(t, active, onInstalled) {
8434
9073
  if (response === null || !response.ok) return;
8435
9074
  setKnownSources({
8436
9075
  sources: sourceRowsOf(response.sources),
8437
- selected: response.selected
9076
+ selected: response.selected,
9077
+ transports: response.transports ?? {}
8438
9078
  });
8439
9079
  }, []);
8440
9080
  const load = (0, react.useCallback)(async (force = false) => {
@@ -8454,7 +9094,8 @@ function useDiscover(t, active, onInstalled) {
8454
9094
  setPayload(response);
8455
9095
  setKnownSources({
8456
9096
  sources: response.sources,
8457
- selected: response.selected
9097
+ selected: response.selected,
9098
+ transports: {}
8458
9099
  });
8459
9100
  setLimit(50);
8460
9101
  }, [t]);
@@ -8620,7 +9261,7 @@ function useDiscover(t, active, onInstalled) {
8620
9261
  setDetail(null);
8621
9262
  beginSwitch();
8622
9263
  setKnownSources((current) => current === null ? current : {
8623
- sources: current.sources,
9264
+ ...current,
8624
9265
  selected: id
8625
9266
  });
8626
9267
  sources.send({
@@ -8659,6 +9300,7 @@ function useDiscover(t, active, onInstalled) {
8659
9300
  ...target.registry === void 0 ? {} : { registry: target.registry }
8660
9301
  }).then((outcome) => {
8661
9302
  if (!outcome.ok) return;
9303
+ publishMarketApplied(appliedUnitsOf(outcome.value));
8662
9304
  const verdict = installVerdictOf(outcome.value, t);
8663
9305
  if (verdict.kind === "failed") {
8664
9306
  provision.fail(verdict.text);
@@ -8700,6 +9342,7 @@ function useDiscover(t, active, onInstalled) {
8700
9342
  failure,
8701
9343
  sources: knownSources?.sources ?? payload?.sources ?? [],
8702
9344
  selected: knownSources?.selected ?? payload?.selected ?? null,
9345
+ transports: knownSources?.transports ?? {},
8703
9346
  entries,
8704
9347
  shown,
8705
9348
  total: sorted.length,
@@ -8869,7 +9512,7 @@ function DiscoverPanel({ t, active, onInstalled, onShowInstalled }) {
8869
9512
  }
8870
9513
  //#endregion
8871
9514
  //#region src/app/layouts/market/market-header.tsx
8872
- function MarketHeader({ t, idPrefix, tab, busy, checking, onTab, onReload, onAdd }) {
9515
+ function MarketHeader({ t, idPrefix, tab, busy, onTab, onAdd }) {
8873
9516
  const tabItems = (0, react.useMemo)(() => [{
8874
9517
  value: "installed",
8875
9518
  label: t("panels.market.tabInstalled"),
@@ -8881,23 +9524,14 @@ function MarketHeader({ t, idPrefix, tab, busy, checking, onTab, onReload, onAdd
8881
9524
  id: `${idPrefix}-tab-discover`,
8882
9525
  panelId: `${idPrefix}-panel-discover`
8883
9526
  }], [idPrefix, t]);
8884
- 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)(Tip, { label: t("panels.market.recheck") }, /* @__PURE__ */ (0, react.createElement)("button", {
8885
- type: "button",
8886
- className: `${MarketPage_module_default.marketIconButton}${checking ? ` ${MarketPage_module_default.marketIconButtonSpinning}` : ""}`,
8887
- "aria-label": t("panels.market.checkUpdates"),
8888
- disabled: busy,
8889
- onClick: onReload
8890
- }, /* @__PURE__ */ (0, react.createElement)("span", {
8891
- className: MarketPage_module_default.marketIconWrap,
8892
- "aria-hidden": "true"
8893
- }, /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutlineRegular, null)))), /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
9527
+ 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, {
8894
9528
  variant: "primary",
8895
9529
  size: "sm",
8896
9530
  className: MarketPage_module_default.marketAddButton,
8897
9531
  icon: /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutlineRegular, { size: 13 }),
8898
9532
  disabled: busy,
8899
9533
  onClick: onAdd
8900
- }, 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, {
9534
+ }, 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, {
8901
9535
  className: MarketPage_module_default.marketTabList,
8902
9536
  items: tabItems,
8903
9537
  value: tab,
@@ -9271,6 +9905,30 @@ function useBoardWorkspace(workspaces, sessions) {
9271
9905
  };
9272
9906
  }
9273
9907
  //#endregion
9908
+ //#region src/app/layouts/market/use-settling-modules.ts
9909
+ var NO_UNITS = /* @__PURE__ */ new Set();
9910
+ function unitsOf(key) {
9911
+ return key === "" ? [] : key.split("|");
9912
+ }
9913
+ function useSettlingModules(installedKey, rosterKey, activeKey) {
9914
+ const seenRef = (0, react.useRef)(null);
9915
+ const [settling, setSettling] = (0, react.useState)(NO_UNITS);
9916
+ (0, react.useEffect)(() => {
9917
+ const units = unitsOf(installedKey);
9918
+ const held = holdBack(units, new Set(unitsOf(rosterKey)), new Set(unitsOf(activeKey)), seenRef.current);
9919
+ seenRef.current = new Set(units);
9920
+ setSettling(held.length === 0 ? NO_UNITS : new Set(held));
9921
+ if (held.length === 0) return;
9922
+ const timer = setTimeout(() => setSettling(NO_UNITS), MODULE_SETTLE_MS);
9923
+ return () => clearTimeout(timer);
9924
+ }, [
9925
+ installedKey,
9926
+ rosterKey,
9927
+ activeKey
9928
+ ]);
9929
+ return settling;
9930
+ }
9931
+ //#endregion
9274
9932
  //#region src/shared/api/installed-plugins.ts
9275
9933
  var INSTALLED_PLUGINS_ROUTE = "panels/plugins";
9276
9934
  //#endregion
@@ -9297,6 +9955,7 @@ var state = {
9297
9955
  selfUpdate: null,
9298
9956
  read: false,
9299
9957
  checking: false,
9958
+ failed: false,
9300
9959
  checkedAt: null
9301
9960
  };
9302
9961
  var listeners$2 = /* @__PURE__ */ new Set();
@@ -9316,6 +9975,18 @@ function subscribeModuleVersions(listener) {
9316
9975
  listeners$2.delete(listener);
9317
9976
  };
9318
9977
  }
9978
+ function withMarketUpdates(modules, rows) {
9979
+ if (rows.length === 0) return modules;
9980
+ const byPkg = new Map(rows.map((row) => [row.pkg, row]));
9981
+ return modules.map((module) => {
9982
+ const row = byPkg.get(module.pkg);
9983
+ return row === void 0 ? module : {
9984
+ ...module,
9985
+ latest: row.version,
9986
+ market: row
9987
+ };
9988
+ });
9989
+ }
9319
9990
  function publish$1(next) {
9320
9991
  state = next;
9321
9992
  for (const listener of [...listeners$2]) listener();
@@ -9329,19 +10000,26 @@ function runModuleVersionsRead(force = false, fresh = false) {
9329
10000
  ...state,
9330
10001
  checking: true
9331
10002
  });
9332
- const promise = Promise.all([readModuleVersions(force), readInstalledPlugins(force)]).catch(() => null).then((responses) => {
10003
+ const promise = Promise.all([
10004
+ readModuleVersions(force),
10005
+ readInstalledPlugins(force),
10006
+ readMarketInstalled()
10007
+ ]).catch(() => null).then((responses) => {
9333
10008
  if (at !== epoch) return;
9334
10009
  if (!force && seq < newestForceSeq) return;
9335
10010
  const versions = responses?.[0];
9336
10011
  const plugins = responses?.[1];
10012
+ const market = responses?.[2];
10013
+ const read = versions?.ok === true;
9337
10014
  publish$1({
9338
- modules: versions?.ok === true ? versions.modules : state.modules,
10015
+ modules: read ? withMarketUpdates(versions.modules, market?.ok === true ? market.modules : []) : state.modules,
9339
10016
  plugins: plugins?.ok === true ? plugins.plugins : state.plugins,
9340
- workbench: versions?.ok === true ? versions.workbench ?? null : state.workbench,
9341
- selfUpdate: versions?.ok === true ? versions.selfUpdate ?? null : state.selfUpdate,
10017
+ workbench: read ? versions.workbench ?? null : state.workbench,
10018
+ selfUpdate: read ? versions.selfUpdate ?? null : state.selfUpdate,
9342
10019
  read: true,
9343
10020
  checking: false,
9344
- checkedAt: Date.now()
10021
+ failed: !read,
10022
+ checkedAt: read ? Date.now() : state.checkedAt
9345
10023
  });
9346
10024
  }).finally(() => {
9347
10025
  if (inFlight?.promise === promise) inFlight = null;
@@ -9377,6 +10055,7 @@ function useModuleVersions() {
9377
10055
  selfUpdate: value.selfUpdate,
9378
10056
  read: value.read,
9379
10057
  checking: value.checking,
10058
+ failed: value.failed,
9380
10059
  checkedAt: value.checkedAt,
9381
10060
  reload
9382
10061
  };
@@ -9632,18 +10311,79 @@ function AddModuleResult({ t, state }) {
9632
10311
  }, 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)));
9633
10312
  }
9634
10313
  //#endregion
10314
+ //#region src/app/layouts/market/add-module-registry-prefs.ts
10315
+ var DEFAULT_REGISTRY_CHOICE = {
10316
+ kind: "default",
10317
+ value: ""
10318
+ };
10319
+ function isRegistryKind(value) {
10320
+ return value === "default" || value === "url" || value === "custom";
10321
+ }
10322
+ function parseRegistryChoice(raw) {
10323
+ if (raw === null) return DEFAULT_REGISTRY_CHOICE;
10324
+ let value;
10325
+ try {
10326
+ value = JSON.parse(raw);
10327
+ } catch {
10328
+ return DEFAULT_REGISTRY_CHOICE;
10329
+ }
10330
+ if (typeof value !== "object" || value === null) return DEFAULT_REGISTRY_CHOICE;
10331
+ const record = value;
10332
+ if (!isRegistryKind(record.kind)) return DEFAULT_REGISTRY_CHOICE;
10333
+ if (record.kind === "default") return DEFAULT_REGISTRY_CHOICE;
10334
+ if (record.kind === "custom") return {
10335
+ kind: "custom",
10336
+ value: ""
10337
+ };
10338
+ if (typeof record.value !== "string" || !customRegistryAllowed(record.value)) return DEFAULT_REGISTRY_CHOICE;
10339
+ return {
10340
+ kind: "url",
10341
+ value: record.value.trim()
10342
+ };
10343
+ }
10344
+ function readRegistryPrefs() {
10345
+ const custom = readText(STORAGE_KEY_MARKET_REGISTRY_CUSTOM);
10346
+ return {
10347
+ choice: parseRegistryChoice(readText(STORAGE_KEY_MARKET_REGISTRY)),
10348
+ custom: custom === null ? "" : custom.trim()
10349
+ };
10350
+ }
10351
+ function writeRegistryChoice(choice) {
10352
+ if (choice.kind === "custom") {
10353
+ writeText(STORAGE_KEY_MARKET_REGISTRY, JSON.stringify({
10354
+ kind: "custom",
10355
+ value: ""
10356
+ }));
10357
+ return;
10358
+ }
10359
+ if (choice.kind === "url" && customRegistryAllowed(choice.value)) {
10360
+ writeText(STORAGE_KEY_MARKET_REGISTRY, JSON.stringify({
10361
+ kind: "url",
10362
+ value: choice.value.trim()
10363
+ }));
10364
+ return;
10365
+ }
10366
+ writeText(STORAGE_KEY_MARKET_REGISTRY, JSON.stringify(DEFAULT_REGISTRY_CHOICE));
10367
+ }
10368
+ function writeRegistryCustom(value) {
10369
+ const text = value.trim();
10370
+ writeText(STORAGE_KEY_MARKET_REGISTRY_CUSTOM, text === "" ? null : text);
10371
+ }
10372
+ function reconcileRegistryChoice(choice, choices) {
10373
+ if (choice.kind !== "url") return choice;
10374
+ return choices.some((option) => option.choice.kind === "url" && option.choice.value === choice.value) ? choice : DEFAULT_REGISTRY_CHOICE;
10375
+ }
10376
+ //#endregion
9635
10377
  //#region src/app/layouts/market/use-add-module.ts
9636
10378
  function newRequestId() {
9637
10379
  return crypto.randomUUID();
9638
10380
  }
9639
10381
  function useAddModule(options) {
9640
10382
  const { onInstalled, failedText } = options;
10383
+ const [prefs] = (0, react.useState)(readRegistryPrefs);
9641
10384
  const [spec, setSpec] = (0, react.useState)("");
9642
- const [choice, setChoice] = (0, react.useState)({
9643
- kind: "default",
9644
- value: ""
9645
- });
9646
- const [custom, setCustom] = (0, react.useState)("");
10385
+ const [choice, setChoice] = (0, react.useState)(prefs.choice);
10386
+ const [custom, setCustom] = (0, react.useState)(prefs.custom);
9647
10387
  const [registryOpen, setRegistryOpen] = (0, react.useState)(false);
9648
10388
  const [guideOpen, setGuideOpen] = (0, react.useState)(false);
9649
10389
  const [phase, setPhase] = (0, react.useState)("idle");
@@ -9655,6 +10395,8 @@ function useAddModule(options) {
9655
10395
  const generationRef = (0, react.useRef)(0);
9656
10396
  const requestIdRef = (0, react.useRef)("");
9657
10397
  const { busy: classifying } = useVisibleBusy(phase === "inspecting", 500);
10398
+ const [installToken] = (0, react.useState)(() => `market-install:${newRequestId()}`);
10399
+ usePublishMarketInstalling(installToken, phase === "installing");
9658
10400
  const write = useHostWrite({
9659
10401
  channel: "provision",
9660
10402
  networkText: failedText
@@ -9671,7 +10413,9 @@ function useAddModule(options) {
9671
10413
  let alive = true;
9672
10414
  readBundleRegistries().then((response) => {
9673
10415
  if (!alive) return;
9674
- setChoices(registryOptions(response.ok ? response.registries : null));
10416
+ const options = registryOptions(response.ok ? response.registries : null);
10417
+ setChoices(options);
10418
+ setChoice((previous) => reconcileRegistryChoice(previous, options));
9675
10419
  });
9676
10420
  return () => {
9677
10421
  alive = false;
@@ -9738,6 +10482,7 @@ function useAddModule(options) {
9738
10482
  supply: value.supply,
9739
10483
  ...value.plugin === void 0 ? {} : { plugin: value.plugin }
9740
10484
  });
10485
+ publishMarketApplied(appliedUnitsOf(value));
9741
10486
  setPhase("result");
9742
10487
  if (value.change.application === "applied" || value.change.application === "restart-required") onInstalled();
9743
10488
  });
@@ -9782,6 +10527,14 @@ function useAddModule(options) {
9782
10527
  setPreview(null);
9783
10528
  setPhase("idle");
9784
10529
  }, []);
10530
+ const choose = (0, react.useCallback)((next) => {
10531
+ setChoice(next);
10532
+ writeRegistryChoice(next);
10533
+ }, []);
10534
+ const chooseCustom = (0, react.useCallback)((value) => {
10535
+ setCustom(value);
10536
+ writeRegistryCustom(value);
10537
+ }, []);
9785
10538
  return {
9786
10539
  spec,
9787
10540
  choice,
@@ -9797,10 +10550,8 @@ function useAddModule(options) {
9797
10550
  removing,
9798
10551
  builds: outcome?.change.pendingBuilds ?? [],
9799
10552
  setSpec,
9800
- setChoice: (0, react.useCallback)((next) => {
9801
- setChoice(next);
9802
- }, []),
9803
- setCustom,
10553
+ setChoice: choose,
10554
+ setCustom: chooseCustom,
9804
10555
  toggleRegistry: (0, react.useCallback)(() => setRegistryOpen((value) => !value), []),
9805
10556
  closeRegistry: (0, react.useCallback)(() => setRegistryOpen(false), []),
9806
10557
  toggleGuide: (0, react.useCallback)(() => setGuideOpen((value) => !value), []),
@@ -9923,7 +10674,6 @@ var MOCK_FRESHNESS = {
9923
10674
  checking: false,
9924
10675
  checkedAt: null
9925
10676
  };
9926
- var NO_UNITS = /* @__PURE__ */ new Set();
9927
10677
  function useLiveManifests(units) {
9928
10678
  const subscribe = (0, react.useCallback)((listener) => units.subscribe(listener), [units]);
9929
10679
  const revision = (0, react.useCallback)(() => units.version(), [units]);
@@ -9950,7 +10700,8 @@ function makeMarketEntryIcon(units) {
9950
10700
  installed: modules === null ? void 0 : withClientRefusals(modules, units.refusals()),
9951
10701
  plugins,
9952
10702
  workbench,
9953
- busy: useMarketBusy()
10703
+ busy: useMarketBusy(),
10704
+ ...useMarketInstallState()
9954
10705
  });
9955
10706
  (0, react.useEffect)(() => {
9956
10707
  publishPanelHint(MARKET_PANEL_ID, hint);
@@ -9965,8 +10716,9 @@ function MarketPanel({ t, units, titleOf }) {
9965
10716
  const manifests = useLiveManifests(units);
9966
10717
  const installable = useInstallableUnits(units);
9967
10718
  const { capabilities, checkedAt, checking, forceProbe, reload: reloadCapability } = useCapabilityMap(0);
9968
- const { modules, plugins, workbench, selfUpdate, checking: versionsChecking, read: installedRead, reload: reloadVersions } = useModuleVersions();
10719
+ const { modules, plugins, workbench, selfUpdate, checking: versionsChecking, failed: versionsFailed, checkedAt: versionsCheckedAt, read: installedRead, reload: reloadVersions } = useModuleVersions();
9969
10720
  const machineBoard = useEnabledUnits(0, null);
10721
+ const install = useMarketInstallState();
9970
10722
  const [adding, setAdding] = (0, react.useState)(false);
9971
10723
  const [acting, setActing] = (0, react.useState)(false);
9972
10724
  const [tab, setTab] = (0, react.useState)("installed");
@@ -10008,27 +10760,11 @@ function MarketPanel({ t, units, titleOf }) {
10008
10760
  forceProbe,
10009
10761
  reloadVersions
10010
10762
  ]);
10011
- const installedKey = (installed ?? []).map((module) => module.unit).join("|");
10012
- const rosterKey = manifests.map((manifest) => manifest.id).join("|");
10013
- const activeKey = Object.keys(capabilities ?? {}).join("|");
10014
- const seenRef = (0, react.useRef)(null);
10015
- const [settling, setSettling] = (0, react.useState)(NO_UNITS);
10016
- (0, react.useEffect)(() => {
10017
- const units = installedKey === "" ? [] : installedKey.split("|");
10018
- const held = holdBack(units, new Set(rosterKey === "" ? [] : rosterKey.split("|")), new Set(activeKey === "" ? [] : activeKey.split("|")), seenRef.current);
10019
- seenRef.current = new Set(units);
10020
- setSettling(held.length === 0 ? NO_UNITS : new Set(held));
10021
- if (held.length === 0) return;
10022
- const timer = setTimeout(() => setSettling(NO_UNITS), MODULE_SETTLE_MS);
10023
- return () => clearTimeout(timer);
10024
- }, [
10025
- installedKey,
10026
- rosterKey,
10027
- activeKey
10028
- ]);
10763
+ const settling = useSettlingModules((installed ?? []).map((module) => module.unit).join("|"), manifests.map((manifest) => manifest.id).join("|"), Object.keys(capabilities ?? {}).join("|"));
10764
+ const held = install.applied.size === 0 ? settling : /* @__PURE__ */ new Set([...settling, ...install.applied]);
10029
10765
  const freshness = {
10030
10766
  loaded: capabilities !== null,
10031
- checking,
10767
+ checking: checking || versionsChecking,
10032
10768
  checkedAt
10033
10769
  };
10034
10770
  const pendingFreshness = {
@@ -10041,16 +10777,13 @@ function MarketPanel({ t, units, titleOf }) {
10041
10777
  const mockNonce = devMarket.pick.nonce;
10042
10778
  const shownFreshness = mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS;
10043
10779
  const shownRead = mock === void 0 ? installedRead : mock.installedRead ?? true;
10044
- const shownChecking = shownFreshness.checking || mock === void 0 && versionsChecking;
10045
- const busy = !marketSettled(shownFreshness, shownRead) || shownChecking || acting;
10780
+ const busy = !marketSettled(shownFreshness, shownRead) || acting;
10046
10781
  return /* @__PURE__ */ (0, react.createElement)("div", { className: MarketPage_module_default.marketPage }, /* @__PURE__ */ (0, react.createElement)(MarketHeader, {
10047
10782
  t,
10048
10783
  idPrefix: MARKET_PANEL_ID,
10049
10784
  tab,
10050
10785
  busy,
10051
- checking: shownChecking,
10052
10786
  onTab: setTab,
10053
- onReload: () => reload({ force: true }),
10054
10787
  onAdd: openAddModule
10055
10788
  }), devMarket.strip, /* @__PURE__ */ (0, react.createElement)("div", {
10056
10789
  id: `${MARKET_PANEL_ID}-panel-installed`,
@@ -10068,12 +10801,15 @@ function MarketPanel({ t, units, titleOf }) {
10068
10801
  onChanged: reload,
10069
10802
  onPending: setActing,
10070
10803
  updates,
10804
+ updatesCheckedAt: versionsCheckedAt,
10805
+ updatesFailed: versionsFailed,
10071
10806
  installed,
10072
10807
  installedRead: shownRead,
10073
10808
  workbench,
10074
10809
  selfUpdate,
10075
10810
  plugins,
10076
- settling: mock === void 0 ? settling : void 0,
10811
+ settling: mock === void 0 ? held : void 0,
10812
+ installing: mock === void 0 ? install.installing : false,
10077
10813
  mock,
10078
10814
  defaults: machineBoard?.defaults ?? [],
10079
10815
  changed: machineBoard?.changed ?? {}
@@ -11560,6 +12296,7 @@ function createClientUnitRegistry(options = {}) {
11560
12296
  return manifestsCache;
11561
12297
  },
11562
12298
  refusals: () => refusals,
12299
+ declared: () => [...known.values()],
11563
12300
  installable: () => installableIds,
11564
12301
  setManifests(manifests, installable) {
11565
12302
  known = new Map(manifests.map((manifest) => [manifest.id, manifest]));
@@ -12504,6 +13241,45 @@ function MarketSourceApprovalSeat({ tool, args, t }) {
12504
13241
  }, []);
12505
13242
  return (0, react.createElement)(ApprovalPlan, { rows: marketSourceRows(tool, args, payload, t) });
12506
13243
  }
13244
+ function pluginToolIndexOf(manifests) {
13245
+ const index = /* @__PURE__ */ new Map();
13246
+ for (const manifest of manifests) for (const tool of manifest.tools) {
13247
+ if (tool.opencli === void 0) continue;
13248
+ index.set(tool.name, tool.opencli);
13249
+ }
13250
+ return index;
13251
+ }
13252
+ function argText(value) {
13253
+ if (typeof value === "string") return value;
13254
+ if (typeof value === "number" || typeof value === "boolean") return String(value);
13255
+ const text = JSON.stringify(value);
13256
+ return text === void 0 ? String(value) : text;
13257
+ }
13258
+ function pluginApprovalRows(origin, args, t) {
13259
+ const rows = [{
13260
+ label: t("approval.plugin.name"),
13261
+ value: origin.plugin
13262
+ }, {
13263
+ label: t("approval.plugin.command"),
13264
+ value: origin.command
13265
+ }];
13266
+ const note = args[APPROVAL_NOTE_ARG];
13267
+ if (typeof note === "string" && note.trim() !== "") rows.push({
13268
+ label: t("approval.plugin.note"),
13269
+ value: note.replace(/\s+/g, " ").trim()
13270
+ });
13271
+ for (const name of origin.args) {
13272
+ if (!(name in args)) continue;
13273
+ rows.push({
13274
+ label: name,
13275
+ value: argText(args[name])
13276
+ });
13277
+ }
13278
+ return rows;
13279
+ }
13280
+ function shellApprovalRenderer(manifests) {
13281
+ return (input, t) => shellApprovalDetail(input, t, pluginToolIndexOf(manifests()));
13282
+ }
12507
13283
  function shellClaimsApprovalDetail(tool) {
12508
13284
  return ALL_TOOLS.includes(tool);
12509
13285
  }
@@ -12515,7 +13291,9 @@ function stopApprovalRows(args, t) {
12515
13291
  value: `${unit === "" ? "<unit>" : unit} · ${id === "" ? "<id>" : id}`
12516
13292
  }];
12517
13293
  }
12518
- function shellApprovalPlan(input, t) {
13294
+ function shellApprovalPlan(input, t, pluginTools) {
13295
+ const origin = pluginTools?.get(input.tool);
13296
+ if (origin !== void 0) return { rows: pluginApprovalRows(origin, input.args, t) };
12519
13297
  if (input.tool === "workbench_diy_record_prepare") return {
12520
13298
  rows: recordApprovalRows(input.args, t),
12521
13299
  warn: t("approval.record.noSwitch")
@@ -12526,7 +13304,7 @@ function shellApprovalPlan(input, t) {
12526
13304
  };
12527
13305
  return shellClaimsApprovalDetail(input.tool) ? { rows: [] } : void 0;
12528
13306
  }
12529
- function shellApprovalDetail(input, t) {
13307
+ function shellApprovalDetail(input, t, pluginTools) {
12530
13308
  if (input.tool === "workbench_diy_publish") return (0, react.createElement)(PublishApprovalSeat, {
12531
13309
  args: input.args,
12532
13310
  t
@@ -12536,7 +13314,7 @@ function shellApprovalDetail(input, t) {
12536
13314
  args: input.args,
12537
13315
  t
12538
13316
  });
12539
- const plan = shellApprovalPlan(input, t);
13317
+ const plan = shellApprovalPlan(input, t, pluginTools);
12540
13318
  if (plan === void 0) return void 0;
12541
13319
  if (plan.rows.length === 0) return (0, react.createElement)(react.Fragment, null);
12542
13320
  return /* @__PURE__ */ (0, react.createElement)(ApprovalPlan, {
@@ -12886,6 +13664,10 @@ function Breadcrumbs({ trail, onGoTo, titleKeyOf, t }) {
12886
13664
  }, /* @__PURE__ */ (0, react.createElement)("span", { className: Breadcrumbs_module_default.tabTitle }, stepLabel(step, titleKeyOf, t))));
12887
13665
  }));
12888
13666
  }
13667
+ var BoardEmpty_module_default = {
13668
+ actions: "_actions_smeq7_1",
13669
+ action: "_action_smeq7_1"
13670
+ };
12889
13671
  //#endregion
12890
13672
  //#region src/app/layouts/rightbar/BoardEmpty.tsx
12891
13673
  function BoardEmpty({ t, onBuildModule, onOpenModules, onOpenMarket }) {
@@ -12893,20 +13675,23 @@ function BoardEmpty({ t, onBuildModule, onOpenModules, onOpenMarket }) {
12893
13675
  icon: /* @__PURE__ */ (0, react.createElement)(IconBrandMark, { size: 32 }),
12894
13676
  title: t("panels.empty"),
12895
13677
  hint: t("panels.emptyHint"),
12896
- action: /* @__PURE__ */ (0, react.createElement)(react.Fragment, null, /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
13678
+ action: /* @__PURE__ */ (0, react.createElement)("div", { className: BoardEmpty_module_default.actions }, /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
12897
13679
  type: "button",
12898
13680
  size: "sm",
12899
13681
  variant: "primary",
13682
+ className: BoardEmpty_module_default.action,
12900
13683
  onClick: onBuildModule
12901
13684
  }, t("panels.buildModule")), /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
12902
13685
  type: "button",
12903
13686
  size: "sm",
12904
13687
  variant: "toolbar",
13688
+ className: BoardEmpty_module_default.action,
12905
13689
  onClick: onOpenModules
12906
13690
  }, t("panels.choose")), /* @__PURE__ */ (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
12907
13691
  type: "button",
12908
13692
  size: "sm",
12909
13693
  variant: "toolbar",
13694
+ className: BoardEmpty_module_default.action,
12910
13695
  onClick: onOpenMarket
12911
13696
  }, t("panels.browseMarket")))
12912
13697
  });
@@ -15449,7 +16234,7 @@ function messagesOf(units) {
15449
16234
  ...face.messages === void 0 ? {} : { messages: face.messages }
15450
16235
  }));
15451
16236
  }
15452
- 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_jfyof_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_jfyof_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_jfyof_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_jfyof_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_jfyof_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_jfyof_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_jfyof_58 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSep_jfyof_62 {\n color: var(--dsw-alias-label-caption);\n}\n\n._marketReason_jfyof_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_jfyof_39 ._marketVersion_jfyof_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_jfyof_72 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_jfyof_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_jfyof_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_jfyof_105 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_jfyof_112 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_jfyof_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_jfyof_125 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_jfyof_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_jfyof_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_jfyof_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_jfyof_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_jfyof_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_jfyof_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_jfyof_169 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionQuiet_jfyof_175 ._marketSectionTitle_jfyof_163 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSectionQuiet_jfyof_175 ._marketName_jfyof_39 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSectionQuiet_jfyof_175 ._marketIcon_jfyof_20 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n\n._marketProgress_jfyof_188 {\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_jfyof_198 {\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_jfyof_205 {\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_jfyof_212 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_jfyof_217 {\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_jfyof_217 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_jfyof_235 {\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_jfyof_243 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_jfyof_248 {\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_jfyof_254 {\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_jfyof_263 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-32);\n}\n\n._marketPanel_jfyof_263[hidden] {\n display: none;\n}\n\n._marketTabs_jfyof_273 {\n display: flex;\n margin: calc(0px - var(--wb-len-16)) 0;\n}\n\n._marketTabList_jfyof_278 {\n width: fit-content;\n min-width: var(--wb-len-240);\n}\n\n._marketIconButton_jfyof_283 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n color: var(--dsw-alias-label-caption);\n cursor: pointer;\n}\n\n._marketIconButton_jfyof_283:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_jfyof_283:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_jfyof_308 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_jfyof_312 svg {\n animation: _wb-spin_jfyof_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_jfyof_316 {\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_jfyof_212 {\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_jfyof_333 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_jfyof_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n._discoverPage_jfyof_347 {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-16);\n}\n\n._discoverBar_jfyof_354 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n container-type: inline-size;\n}\n\n._discoverTools_jfyof_361 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._discoverMarket_jfyof_367 {\n flex: 0 1 auto;\n min-width: 0;\n}\n\n._discoverMarketButton_jfyof_372 {\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_jfyof_379 {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._discoverLabels_jfyof_385 {\n flex: none;\n white-space: nowrap;\n}\n\n._discoverSort_jfyof_390 {\n flex: none;\n white-space: nowrap;\n}\n\n._discoverRefresh_jfyof_395 {\n flex: none;\n}\n\n._discoverSearch_jfyof_399 {\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_jfyof_407 {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._discoverSearchFieldFilled_jfyof_412 input {\n padding-inline-end: var(--wb-len-20);\n}\n\n._discoverSearchField_jfyof_407 input::-webkit-search-cancel-button {\n appearance: none;\n -webkit-appearance: none;\n}\n\n._discoverSearch_jfyof_399 ._discoverSearchClear_jfyof_421 {\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_jfyof_421:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n@container (max-width: 560px) {\n ._discoverTools_jfyof_361 {\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_jfyof_367 {\n grid-area: market;\n }\n\n ._discoverMarketButton_jfyof_372 {\n margin-left: 0;\n }\n\n ._discoverLabels_jfyof_385 {\n grid-area: labels;\n }\n\n ._discoverSearch_jfyof_399 {\n grid-area: search;\n }\n\n ._discoverSort_jfyof_390 {\n grid-area: sort;\n justify-self: end;\n }\n\n ._discoverRefresh_jfyof_395 {\n grid-area: refresh;\n }\n}\n\n._discoverChips_jfyof_472 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n._discoverList_jfyof_479 {\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_jfyof_488 {\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_jfyof_488:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._discoverArtwork_jfyof_502 {\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_jfyof_514 {\n object-fit: contain;\n}\n\n._discoverMain_jfyof_518 {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--wb-len-2);\n min-width: 0;\n}\n\n._discoverTitleRow_jfyof_526 {\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_jfyof_534 {\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_jfyof_534::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: var(--dsw-radius-xl);\n}\n\n._discoverCardOpen_jfyof_534:focus-visible {\n outline: none;\n}\n\n._discoverCardOpen_jfyof_534: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_jfyof_565 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n overflow-wrap: anywhere;\n}\n\n._discoverDesc_jfyof_571 {\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_jfyof_580 {\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_jfyof_587 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._discoverEnd_jfyof_593 {\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._discoverBlocked_jfyof_602 {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n._discoverEmpty_jfyof_607 {\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_jfyof_616 {\n margin: var(--wb-len-8) 0 0;\n font: var(--dsw-font-s-14);\n font-weight: 500;\n}\n\n._discoverEmpty_jfyof_607 > button {\n margin-top: var(--wb-len-8);\n}\n\n._discoverDetail_jfyof_626 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-16);\n}\n\n._discoverCrumb_jfyof_632 {\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_jfyof_632:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._discoverCrumb_jfyof_632: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_jfyof_655 {\n transform: rotate(90deg);\n}\n\n._discoverDetailHead_jfyof_659 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-14);\n}\n\n._discoverDetailTitle_jfyof_665 {\n margin: 0;\n font: var(--dsw-font-l-20);\n font-weight: 500;\n}\n\n._discoverDetailText_jfyof_671 {\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_jfyof_678 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-16);\n min-width: 0;\n}\n\n._discoverDetailTabs_jfyof_685 {\n display: flex;\n margin-bottom: calc(0px - var(--wb-len-4));\n}\n\n._discoverDetailTabList_jfyof_690 {\n width: fit-content;\n min-width: var(--wb-len-240);\n}\n\n._discoverDocBody_jfyof_695 {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n._discoverDocNotice_jfyof_700 {\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_jfyof_706 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n margin-top: var(--wb-len-16);\n}\n\n._discoverSectionTitle_jfyof_713 {\n margin: 0;\n font: var(--dsw-font-s-14);\n font-weight: 500;\n}\n\n._discoverFacts_jfyof_719 {\n margin: 0;\n padding: 0;\n}\n\n._discoverFactRow_jfyof_724 {\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_jfyof_734 {\n flex: none;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._discoverFactValue_jfyof_740 {\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_jfyof_748 {\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_jfyof_757 {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--wb-len-6);\n}\n\n._discoverLink_jfyof_764 {\n color: var(--dsw-alias-link);\n overflow-wrap: anywhere;\n text-decoration: none;\n}\n\n._discoverLink_jfyof_764:hover {\n text-decoration: underline;\n}\n\n._discoverVersions_jfyof_774 {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n}\n\n._discoverVersionRow_jfyof_782 {\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_jfyof_790 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n}\n\n._discoverError_jfyof_795 {\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_jfyof_804 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._discoverLoading_jfyof_810 {\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_jfyof_819 {\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_jfyof_819 svg {\n flex: none;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._discoverMore_jfyof_837 {\n align-self: center;\n}\n\n._discoverTransport_jfyof_841 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n}\n\n._discoverTransportTitle_jfyof_847 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._discoverTransportRows_jfyof_852 {\n display: flex;\n gap: var(--wb-len-8);\n}\n\n._discoverTransportRow_jfyof_852 {\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_jfyof_852:hover {\n border-color: var(--dsw-alias-border-l3);\n}\n\n._discoverTransportRow_jfyof_852:has(._discoverTransportRadio_jfyof_873:checked) {\n border-color: var(--dsw-alias-label-primary);\n}\n\n._discoverTransportRow_jfyof_852:has(._discoverTransportRadio_jfyof_873:focus-visible) {\n outline: 2px solid var(--dsw-alias-label-primary);\n outline-offset: 1px;\n}\n\n._discoverTransportRadio_jfyof_873 {\n flex: none;\n margin: 0;\n}\n\n._discoverTransportKind_jfyof_887 {\n flex: none;\n font: var(--dsw-font-xs-13);\n font-weight: 500;\n}\n\n._discoverTransportState_jfyof_893 {\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_jfyof_852[data-state='ok'] ._discoverTransportState_jfyof_893 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._discoverTransportRow_jfyof_852[data-state='auth'] ._discoverTransportState_jfyof_893 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._discoverTransportRow_jfyof_852[data-state='unreachable'] ._discoverTransportState_jfyof_893,\n._discoverTransportRow_jfyof_852[data-state='unknown'] ._discoverTransportState_jfyof_893 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._discoverTransportCustom_jfyof_913 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._discoverTransportInput_jfyof_919 {\n flex: 1;\n min-width: 0;\n}\n\n._discoverInstallBar_jfyof_924 {\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_jfyof_935 {\n flex: 1;\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n._discoverDialog_jfyof_941 {\n width: min(var(--wb-len-560), calc(100vw - var(--wb-len-32)));\n}\n\n._discoverDialogBody_jfyof_945 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._discoverSourceList_jfyof_951 {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n}\n\n._discoverSourceRow_jfyof_959 {\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_jfyof_968 {\n margin: 0;\n padding: var(--wb-len-2) 0 var(--wb-len-10);\n list-style: none;\n}\n\n._discoverSourcePick_jfyof_974 {\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_jfyof_983 {\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_jfyof_991 {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._discoverSourceHead_jfyof_999 {\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_jfyof_1007 {\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_jfyof_1017 {\n flex: none;\n}\n\n._discoverSourceLoading_jfyof_1021 {\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_jfyof_1031 {\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_jfyof_1031 svg {\n flex: none;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._discoverSourceError_jfyof_1045 {\n font: var(--dsw-font-xxs-12);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._discoverSourceForm_jfyof_1051 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._discoverGrow_jfyof_1057 {\n flex: 1;\n min-width: 0;\n}\n\n._discoverField_jfyof_1062 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n\n._discoverFieldLabel_jfyof_1068 {\n font: var(--dsw-font-xxs-12);\n color: var(--dsw-alias-label-secondary);\n}\n\n._discoverConfirmHead_jfyof_1073 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-14);\n}\n\n._discoverSkeletonFill_jfyof_1079 {\n background: var(--dsw-alias-bg-skeleton);\n animation: _wb-skeleton_jfyof_1 var(--wb-dur-1-5) cubic-bezier(0.36, 0, 0.64, 1) infinite;\n}\n\n._discoverArtwork_jfyof_502._discoverSkeletonFill_jfyof_1079 {\n border-color: transparent;\n}\n\n._discoverSkeletonBar_jfyof_1088 {\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_jfyof_1095 {\n width: min(var(--wb-len-144), 60%);\n}\n\n._discoverSkeletonDesc_jfyof_1099 {\n width: min(var(--wb-len-280), 85%);\n}\n\n@keyframes _wb-skeleton_jfyof_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_jfyof_1079 {\n animation: none;\n }\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*/";
16237
+ 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_485ym_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_485ym_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_485ym_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_485ym_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_485ym_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_485ym_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_485ym_58 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSep_485ym_62 {\n color: var(--dsw-alias-label-caption);\n}\n\n._marketReason_485ym_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_485ym_39 ._marketVersion_485ym_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_485ym_72 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_485ym_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_485ym_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_485ym_105 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_485ym_112 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_485ym_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_485ym_125 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_485ym_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_485ym_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_485ym_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_485ym_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_485ym_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_485ym_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_485ym_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_485ym_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_485ym_183 ._marketSectionTitle_485ym_163 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSectionQuiet_485ym_183 ._marketName_485ym_39 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSectionQuiet_485ym_183 ._marketIcon_485ym_20 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n\n._marketProgress_485ym_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_485ym_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_485ym_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._marketFailureSeat_485ym_220 {\n grid-column: 2 / -1;\n min-width: 0;\n}\n\n._marketEmpty_485ym_225 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_485ym_230 {\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_485ym_230 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_485ym_248 {\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_485ym_256 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_485ym_261 {\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_485ym_267 {\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_485ym_276 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-32);\n}\n\n._marketPanel_485ym_276[hidden] {\n display: none;\n}\n\n._marketTabs_485ym_286 {\n display: flex;\n margin: calc(0px - var(--wb-len-16)) 0;\n}\n\n._marketTabList_485ym_291 {\n width: fit-content;\n min-width: var(--wb-len-240);\n}\n\n._marketAddButton_485ym_296 {\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_485ym_225 {\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_485ym_313 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._discoverPage_485ym_318 {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-16);\n}\n\n._discoverBar_485ym_325 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n container-type: inline-size;\n}\n\n._discoverTools_485ym_332 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._discoverMarket_485ym_338 {\n flex: 0 1 auto;\n min-width: 0;\n}\n\n._discoverMarketButton_485ym_343 {\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_485ym_350 {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._discoverLabels_485ym_356 {\n flex: none;\n white-space: nowrap;\n}\n\n._discoverSort_485ym_361 {\n flex: none;\n white-space: nowrap;\n}\n\n._discoverRefresh_485ym_366 {\n flex: none;\n}\n\n._discoverSearch_485ym_370 {\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_485ym_378 {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._discoverSearchFieldFilled_485ym_383 input {\n padding-inline-end: var(--wb-len-20);\n}\n\n._discoverSearchField_485ym_378 input::-webkit-search-cancel-button {\n appearance: none;\n -webkit-appearance: none;\n}\n\n._discoverSearch_485ym_370 ._discoverSearchClear_485ym_392 {\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_485ym_392:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n@container (max-width: 560px) {\n ._discoverTools_485ym_332 {\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_485ym_338 {\n grid-area: market;\n }\n\n ._discoverMarketButton_485ym_343 {\n margin-left: 0;\n }\n\n ._discoverLabels_485ym_356 {\n grid-area: labels;\n }\n\n ._discoverSearch_485ym_370 {\n grid-area: search;\n }\n\n ._discoverSort_485ym_361 {\n grid-area: sort;\n justify-self: end;\n }\n\n ._discoverRefresh_485ym_366 {\n grid-area: refresh;\n }\n}\n\n._discoverChips_485ym_443 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n._discoverList_485ym_450 {\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_485ym_459 {\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_485ym_459:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._discoverArtwork_485ym_473 {\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_485ym_485 {\n object-fit: contain;\n}\n\n._discoverMain_485ym_489 {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--wb-len-2);\n min-width: 0;\n}\n\n._discoverTitleRow_485ym_497 {\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_485ym_505 {\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_485ym_505::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: var(--dsw-radius-xl);\n}\n\n._discoverCardOpen_485ym_505:focus-visible {\n outline: none;\n}\n\n._discoverCardOpen_485ym_505: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_485ym_536 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n overflow-wrap: anywhere;\n}\n\n._discoverDesc_485ym_542 {\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_485ym_551 {\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_485ym_558 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._discoverEnd_485ym_564 {\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_485ym_573 {\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_485ym_578 {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n._discoverEmpty_485ym_583 {\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_485ym_592 {\n margin: var(--wb-len-8) 0 0;\n font: var(--dsw-font-s-14);\n font-weight: 500;\n}\n\n._discoverEmpty_485ym_583 > button {\n margin-top: var(--wb-len-8);\n}\n\n._discoverDetail_485ym_602 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-16);\n}\n\n._discoverCrumb_485ym_608 {\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_485ym_608:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._discoverCrumb_485ym_608: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_485ym_631 {\n transform: rotate(90deg);\n}\n\n._discoverDetailHead_485ym_635 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-14);\n}\n\n._discoverDetailTitle_485ym_641 {\n margin: 0;\n font: var(--dsw-font-l-20);\n font-weight: 500;\n}\n\n._discoverDetailText_485ym_647 {\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_485ym_654 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-16);\n min-width: 0;\n}\n\n._discoverDetailTabs_485ym_661 {\n display: flex;\n margin-bottom: calc(0px - var(--wb-len-4));\n}\n\n._discoverDetailTabList_485ym_666 {\n width: fit-content;\n min-width: var(--wb-len-240);\n}\n\n._discoverDocBody_485ym_671 {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n._discoverDocNotice_485ym_676 {\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_485ym_682 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n margin-top: var(--wb-len-16);\n}\n\n._discoverSectionTitle_485ym_689 {\n margin: 0;\n font: var(--dsw-font-s-14);\n font-weight: 500;\n}\n\n._discoverFacts_485ym_695 {\n margin: 0;\n padding: 0;\n}\n\n._discoverFactRow_485ym_700 {\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_485ym_710 {\n flex: none;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._discoverFactValue_485ym_716 {\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_485ym_724 {\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_485ym_733 {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--wb-len-6);\n}\n\n._discoverLink_485ym_740 {\n color: var(--dsw-alias-link);\n overflow-wrap: anywhere;\n text-decoration: none;\n}\n\n._discoverLink_485ym_740:hover {\n text-decoration: underline;\n}\n\n._discoverVersions_485ym_750 {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n}\n\n._discoverVersionRow_485ym_758 {\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_485ym_766 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n}\n\n._discoverError_485ym_771 {\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_485ym_780 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._discoverLoading_485ym_786 {\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_485ym_795 {\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_485ym_795 svg {\n flex: none;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._discoverMore_485ym_813 {\n align-self: center;\n}\n\n._discoverTransport_485ym_817 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n}\n\n._discoverTransportHead_485ym_823 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._discoverTransportTitle_485ym_830 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._discoverTransportHead_485ym_823 ._discoverTransportKind_485ym_835 {\n font: var(--dsw-font-xs-13);\n font-weight: 500;\n}\n\n._discoverTransportHead_485ym_823 ._discoverTransportState_485ym_840 {\n margin-left: 0;\n}\n\n._discoverTransportHead_485ym_823 > :last-child {\n margin-left: auto;\n}\n\n._discoverTransportRows_485ym_848 {\n display: flex;\n gap: var(--wb-len-8);\n}\n\n._discoverTransportRow_485ym_848 {\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_485ym_848:hover {\n border-color: var(--dsw-alias-border-l3);\n}\n\n._discoverTransportRow_485ym_848:has(._discoverTransportRadio_485ym_869:checked) {\n border-color: var(--dsw-alias-label-primary);\n}\n\n._discoverTransportRow_485ym_848:has(._discoverTransportRadio_485ym_869:focus-visible) {\n outline: 2px solid var(--dsw-alias-label-primary);\n outline-offset: 1px;\n}\n\n._discoverTransportRadio_485ym_869 {\n flex: none;\n margin: 0;\n}\n\n._discoverTransportKind_485ym_835 {\n flex: none;\n font: var(--dsw-font-xs-13);\n font-weight: 500;\n}\n\n._discoverTransportState_485ym_840 {\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_485ym_848[data-state='ok'] ._discoverTransportState_485ym_840 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._discoverTransportRow_485ym_848[data-state='auth'] ._discoverTransportState_485ym_840 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._discoverTransportRow_485ym_848[data-state='unreachable'] ._discoverTransportState_485ym_840,\n._discoverTransportRow_485ym_848[data-state='unknown'] ._discoverTransportState_485ym_840 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._discoverTransportCustom_485ym_909 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._discoverTransportInput_485ym_915 {\n flex: 1;\n min-width: 0;\n}\n\n._discoverInstallBar_485ym_920 {\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_485ym_931 {\n flex: 1;\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n._discoverDialog_485ym_937 {\n width: min(var(--wb-len-560), calc(100vw - var(--wb-len-32)));\n}\n\n._discoverDialogBody_485ym_941 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._discoverSourceList_485ym_947 {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n}\n\n._discoverSourceRow_485ym_955 {\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_485ym_964 {\n margin: 0;\n padding: var(--wb-len-2) 0 var(--wb-len-10);\n list-style: none;\n}\n\n._discoverSourcePick_485ym_970 {\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_485ym_979 {\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_485ym_987 {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._discoverSourceHead_485ym_995 {\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_485ym_1003 {\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_485ym_1013 {\n flex: none;\n}\n\n._discoverSourceLoading_485ym_1017 {\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_485ym_1027 {\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_485ym_1027 svg {\n flex: none;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._discoverSourceError_485ym_1041 {\n font: var(--dsw-font-xxs-12);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._discoverSourceForm_485ym_1047 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._discoverGrow_485ym_1053 {\n flex: 1;\n min-width: 0;\n}\n\n._discoverField_485ym_1058 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n\n._discoverFieldLabel_485ym_1064 {\n font: var(--dsw-font-xxs-12);\n color: var(--dsw-alias-label-secondary);\n}\n\n._discoverConfirmHead_485ym_1069 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-14);\n}\n\n._discoverSkeletonFill_485ym_1075 {\n background: var(--dsw-alias-bg-skeleton);\n animation: _wb-skeleton_485ym_1 var(--wb-dur-1-5) cubic-bezier(0.36, 0, 0.64, 1) infinite;\n}\n\n._discoverArtwork_485ym_473._discoverSkeletonFill_485ym_1075 {\n border-color: transparent;\n}\n\n._discoverSkeletonBar_485ym_1084 {\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_485ym_1091 {\n width: min(var(--wb-len-144), 60%);\n}\n\n._discoverSkeletonDesc_485ym_1095 {\n width: min(var(--wb-len-280), 85%);\n}\n\n@keyframes _wb-skeleton_485ym_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_485ym_1075 {\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*/";
15453
16238
  function workbenchCss() {
15454
16239
  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}`;
15455
16240
  }
@@ -15698,7 +16483,7 @@ function mount(ctx) {
15698
16483
  inject: () => ({
15699
16484
  t: ctx.locale.bind(LOCALE_NS),
15700
16485
  units: units.all(),
15701
- renderShell: shellApprovalDetail
16486
+ renderShell: shellApprovalRenderer(units.declared)
15702
16487
  })
15703
16488
  }, ApprovalDetail));
15704
16489
  ctx.slots.inject("conversation.session.header.corner", () => ctx.slots.register({