@dsh-workbench/core 0.2.10 → 0.2.12

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 (60) hide show
  1. package/client.js +785 -2361
  2. package/dist/board.css +0 -12
  3. package/dist/client/client.body.js +785 -2361
  4. package/dist/client/index.js +786 -2362
  5. package/dist/host/index.js +2902 -859
  6. package/dist/types/app/client.d.ts +42 -52
  7. package/dist/types/app/layouts/rightbar/board-mock.d.ts +1 -1
  8. package/dist/types/app/layouts/rightbar/board-plan.d.ts +2 -12
  9. package/dist/types/app/layouts/rightbar/board-shape.d.ts +14 -0
  10. package/dist/types/app/layouts/rightbar/kit-preview-controls.d.ts +10 -0
  11. package/dist/types/app/layouts/rightbar/kit-preview-frame.d.ts +14 -0
  12. package/dist/types/app/layouts/rightbar/kit-preview-rows.d.ts +5 -0
  13. package/dist/types/app/layouts/rightbar/kit-preview.d.ts +3 -0
  14. package/dist/types/app/layouts/rightbar/market-row-icon.d.ts +1 -1
  15. package/dist/types/app/layouts/rightbar/market-section-icon.d.ts +1 -1
  16. package/dist/types/app/layouts/sidebar/workspace-groups.d.ts +0 -1
  17. package/dist/types/app/layouts/sidebar/workspace-items.d.ts +2 -3
  18. package/dist/types/dev/MockStrip.d.ts +15 -0
  19. package/dist/types/dev/surface-types.d.ts +53 -0
  20. package/dist/types/dev/surface.d.ts +2 -0
  21. package/dist/types/dev/surface.stub.d.ts +2 -0
  22. package/dist/types/modules/panels/__tests__/diy-harness.d.ts +32 -0
  23. package/dist/types/modules/panels/__tests__/market-tools-harness.d.ts +1 -1
  24. package/dist/types/modules/panels/__tests__/scope-support.d.ts +1 -1
  25. package/dist/types/modules/panels/model/diy-act.d.ts +4 -0
  26. package/dist/types/modules/panels/model/diy-act.test.d.ts +1 -0
  27. package/dist/types/modules/panels/model/diy-browser-act.d.ts +47 -0
  28. package/dist/types/modules/panels/model/diy-browser.d.ts +47 -0
  29. package/dist/types/modules/panels/model/diy-browser.test.d.ts +1 -0
  30. package/dist/types/modules/panels/model/diy-context.d.ts +102 -0
  31. package/dist/types/modules/panels/model/diy-context.test.d.ts +1 -0
  32. package/dist/types/modules/panels/model/diy-logs.d.ts +18 -0
  33. package/dist/types/modules/panels/model/diy-logs.test.d.ts +1 -0
  34. package/dist/types/modules/panels/model/diy-look.d.ts +14 -0
  35. package/dist/types/modules/panels/model/diy-look.test.d.ts +1 -0
  36. package/dist/types/modules/panels/model/diy-net.d.ts +3 -0
  37. package/dist/types/modules/panels/model/diy-net.test.d.ts +1 -0
  38. package/dist/types/modules/panels/model/diy-page.d.ts +15 -0
  39. package/dist/types/modules/panels/model/diy-page.test.d.ts +1 -0
  40. package/dist/types/modules/panels/model/diy-schema.d.ts +9 -0
  41. package/dist/types/modules/panels/model/diy-schema.test.d.ts +1 -0
  42. package/dist/types/modules/panels/model/diy-scripts.d.ts +64 -0
  43. package/dist/types/modules/panels/unit.d.ts +43 -3
  44. package/dist/types/shared/api/diy.d.ts +4 -0
  45. package/dist/types/shared/api/host/__tests__/png-fixtures.d.ts +17 -0
  46. package/dist/types/shared/api/host/mount-units.d.ts +6 -0
  47. package/dist/types/shared/api/host/png-crop.d.ts +21 -0
  48. package/dist/types/shared/api/host/png-crop.test.d.ts +1 -0
  49. package/package.json +2 -2
  50. package/skills/workbench-module-diy/BUILD.md +4 -3
  51. package/skills/workbench-module-diy/DATASOURCE.md +4 -4
  52. package/skills/workbench-module-diy/DESIGN.md +1 -1
  53. package/skills/workbench-module-diy/KIT.md +121 -0
  54. package/skills/workbench-module-diy/PANEL.md +12 -2
  55. package/skills/workbench-module-diy/REVIEW.md +12 -6
  56. package/skills/workbench-module-diy/SKILL.md +7 -6
  57. package/skills/workbench-module-diy/TOOLING.md +5 -4
  58. package/skills/workbench-module-diy/TOOLS.md +3 -3
  59. package/skills/workbench-module-diy/WIRING.md +6 -6
  60. package/dist/types/app/layouts/sidebar/WorkspaceSearchField.d.ts +0 -9
package/client.js CHANGED
@@ -679,6 +679,8 @@ window.__ModuleLoader__.load({
679
679
  var h = react.createElement;
680
680
  var Fragment = react.Fragment;
681
681
  var Component = react.Component;
682
+ var createContext = react.createContext;
683
+ var useContext = react.useContext;
682
684
  var useState = react.useState;
683
685
  var useEffect = react.useEffect;
684
686
  var useLayoutEffect = react.useLayoutEffect;
@@ -886,6 +888,18 @@ window.__ModuleLoader__.load({
886
888
  meta
887
889
  }) : head, h("div", { className: "wb-cardBody" }, children));
888
890
  }
891
+ var CardAnchor_module_default = { anchor: "_anchor_yq4s2_1" };
892
+ //#endregion
893
+ //#region ../shared/dist/components/CardAnchor.js
894
+ function cardIdOf(unit) {
895
+ return unit === null || unit === "" ? void 0 : `wb-card-${unit}`;
896
+ }
897
+ function CardAnchor({ unit, children }) {
898
+ return h("div", {
899
+ id: cardIdOf(unit),
900
+ className: CardAnchor_module_default.anchor
901
+ }, children);
902
+ }
889
903
  //#endregion
890
904
  //#region ../shared/dist/components/ChoiceGroup.js
891
905
  function ChoiceMenu(input) {
@@ -1016,20 +1030,6 @@ window.__ModuleLoader__.load({
1016
1030
  }))));
1017
1031
  }
1018
1032
  //#endregion
1019
- //#region ../shared/dist/components/MockStrip.js
1020
- function MockStrip({ mocks, index, onPick, note, real }) {
1021
- return h("div", { className: "wb-mockStrip" }, h("span", { className: "wb-mockNote" }, note ?? "夹具:只切状态,不发请求"), real === void 0 ? null : h("button", {
1022
- type: "button",
1023
- className: `wb-mockChip${real.active ? " wb-mockChipOn" : ""}`,
1024
- onClick: real.onPick
1025
- }, real.label), mocks.map((mock, at) => h("button", {
1026
- key: mock.id,
1027
- type: "button",
1028
- className: `wb-mockChip${at === index ? " wb-mockChipOn" : ""}`,
1029
- onClick: () => onPick(at)
1030
- }, mock.label)));
1031
- }
1032
- //#endregion
1033
1033
  //#region ../shared/dist/components/ResourceStates.js
1034
1034
  function SkeletonRows({ rows = 4 }) {
1035
1035
  return h("div", {
@@ -1091,14 +1091,9 @@ window.__ModuleLoader__.load({
1091
1091
  }, h("header", { className: "wb-settingsHead" }, h("span", { className: "wb-settingsTitle" }, title), action), children);
1092
1092
  }
1093
1093
  //#endregion
1094
- //#region ../shared/dist/components/Stack.js
1095
- function Stack({ children }) {
1096
- return h("div", { className: "wb-stack" }, children);
1097
- }
1098
- //#endregion
1099
- //#region ../shared/dist/components/StateBlock.js
1100
- function StateBlock({ title, dot, hint, actions, resolving, children }) {
1101
- return h("div", { className: "wb-stateBlock" }, title === void 0 && dot === void 0 ? null : h("p", { className: "wb-stateBlockTitle" }, dot, title), resolving === void 0 ? null : h("p", { className: "wb-stateBlockResolving" }, resolving), hint === void 0 ? null : h("p", { className: "wb-stateBlockHint" }, hint), children, actions === void 0 ? null : h("div", { className: "wb-stateBlockActions" }, actions));
1094
+ //#region ../shared/dist/components/Field.js
1095
+ function Field({ label, hint, children }) {
1096
+ return h("label", { className: "wb-field" }, h("span", { className: "wb-fieldLabel" }, label), children, hint === void 0 ? null : h("span", { className: "wb-fieldHint" }, hint));
1102
1097
  }
1103
1098
  //#endregion
1104
1099
  //#region ../shared/dist/components/TextField.js
@@ -1110,9 +1105,280 @@ window.__ModuleLoader__.load({
1110
1105
  });
1111
1106
  }
1112
1107
  //#endregion
1113
- //#region ../shared/dist/components/Field.js
1114
- function Field({ label, hint, children }) {
1115
- return h("label", { className: "wb-field" }, h("span", { className: "wb-fieldLabel" }, label), children, hint === void 0 ? null : h("span", { className: "wb-fieldHint" }, hint));
1108
+ //#region ../shared/dist/components/SelectField.js
1109
+ var FOOTER_ID = "__wb-select-footer__";
1110
+ var EMPTY_ID = "__wb-select-empty__";
1111
+ function mergeClass(...parts) {
1112
+ return parts.filter((one) => one !== void 0 && one !== "").join(" ");
1113
+ }
1114
+ function itemOf(option) {
1115
+ return {
1116
+ id: option.value,
1117
+ label: option.label,
1118
+ ...option.icon === void 0 ? {} : { icon: option.icon },
1119
+ ...option.disabled === true ? { disabled: true } : {}
1120
+ };
1121
+ }
1122
+ function triggerNode(args) {
1123
+ return h("button", {
1124
+ type: "button",
1125
+ id: args.id,
1126
+ className: args.className,
1127
+ disabled: args.disabled,
1128
+ "aria-haspopup": "listbox",
1129
+ "aria-expanded": args.open,
1130
+ "aria-label": args.ariaLabel,
1131
+ title: args.title,
1132
+ onClick: args.onOpen
1133
+ }, args.icon === void 0 ? null : h("span", { className: "wb-selectIcon" }, args.icon), h("span", { className: "wb-selectValue" }, args.value), h("span", { className: "wb-selectChevron" }, h(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, { size: 14 })));
1134
+ }
1135
+ function loadingNode(args) {
1136
+ return h("button", {
1137
+ type: "button",
1138
+ id: args.id,
1139
+ className: `${args.className} wb-selectLoading`,
1140
+ disabled: true,
1141
+ "aria-busy": "true",
1142
+ "aria-label": args.ariaLabel,
1143
+ title: args.loadingText
1144
+ }, h("span", { className: "wb-selectValue" }, h(_deepseek_ai_dsh_client_ui_primitives.TextShimmer, { active: true }, args.loadingText ?? "…")), h("span", { className: "wb-selectChevron" }, h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
1145
+ state: "ongoing",
1146
+ size: 14
1147
+ })));
1148
+ }
1149
+ function searchNode(args) {
1150
+ return h("span", {
1151
+ ref: args.boxRef,
1152
+ className: args.className
1153
+ }, h("span", { className: "wb-selectSearchIcon" }, h(_deepseek_ai_dsh_client_ui_primitives.IconSearchOutlineRegular, { size: 14 })), h(TextField, {
1154
+ id: args.id,
1155
+ name: args.name,
1156
+ className: "wb-selectSearchInput",
1157
+ "aria-label": args.ariaLabel,
1158
+ placeholder: args.placeholder,
1159
+ value: args.query,
1160
+ onChange: (event) => args.onQuery(event.currentTarget.value),
1161
+ onKeyDown: (event) => {
1162
+ if (event.nativeEvent.isComposing) return;
1163
+ args.onKey(event);
1164
+ }
1165
+ }));
1166
+ }
1167
+ function menuNode(args) {
1168
+ return h(_deepseek_ai_dsh_client_ui_primitives.Menu, {
1169
+ open: args.open,
1170
+ portal: true,
1171
+ className: "wb-selectAnchor",
1172
+ listClassName: args.listClassName,
1173
+ anchor: args.anchor,
1174
+ align: "start",
1175
+ side: "bottom",
1176
+ selection: args.selection,
1177
+ selectedId: args.selectedId,
1178
+ items: args.items,
1179
+ footer: args.footer,
1180
+ onSelect: args.onPick,
1181
+ onClose: args.onCancel
1182
+ });
1183
+ }
1184
+ function framed(label, hint, className, control) {
1185
+ const inner = label === void 0 ? hint === void 0 ? control : h("span", { className: "wb-select" }, control, h("span", { className: "wb-selectHint" }, hint)) : h(Field, {
1186
+ label,
1187
+ hint
1188
+ }, control);
1189
+ return className === void 0 ? inner : h("div", { className }, inner);
1190
+ }
1191
+ function searchTextOf(option) {
1192
+ if (option.searchText !== void 0) return option.searchText;
1193
+ return typeof option.label === "string" ? option.label : "";
1194
+ }
1195
+ function defaultSelectFilter(option, query) {
1196
+ const needle = query.trim().toLowerCase();
1197
+ if (needle === "") return true;
1198
+ return searchTextOf(option).toLowerCase().includes(needle);
1199
+ }
1200
+ function filterSelectOptions(options, query, filter = defaultSelectFilter) {
1201
+ return options.filter((option) => filter(option, query));
1202
+ }
1203
+ function selectCursorValue(shown, cursor) {
1204
+ if (cursor === null || shown.length === 0) return null;
1205
+ return shown[Math.min(cursor, shown.length - 1)]?.value ?? null;
1206
+ }
1207
+ function stepSelectCursor(shown, cursor, step) {
1208
+ if (shown.length === 0) return null;
1209
+ if (cursor === null) return step === 1 ? 0 : shown.length - 1;
1210
+ return (cursor + step + shown.length) % shown.length;
1211
+ }
1212
+ function selectEntries(shown, emptyText) {
1213
+ if (shown.length === 0) return emptyText === void 0 ? [] : [{
1214
+ type: "label",
1215
+ id: EMPTY_ID,
1216
+ text: emptyText
1217
+ }];
1218
+ const out = [];
1219
+ let group = null;
1220
+ for (const option of shown) {
1221
+ if (option.group !== void 0 && option.group !== group) {
1222
+ out.push({
1223
+ type: "label",
1224
+ id: `__wb-select-group-${String(out.length)}`,
1225
+ text: option.group
1226
+ });
1227
+ group = option.group;
1228
+ }
1229
+ out.push(itemOf(option));
1230
+ }
1231
+ return out;
1232
+ }
1233
+ function useSelectState(props) {
1234
+ const { options, filter = defaultSelectFilter, emptyText, open: openProp, onOpenChange } = props;
1235
+ const [openState, setOpenState] = useState(false);
1236
+ const [query, setQuery] = useState("");
1237
+ const [cursor, setCursor] = useState(null);
1238
+ const boxRef = useRef(null);
1239
+ const triggerRef = useRef(null);
1240
+ const wasOpenRef = useRef(false);
1241
+ const pickedRef = useRef(false);
1242
+ const closedByUsRef = useRef(false);
1243
+ const open = openProp ?? openState;
1244
+ const setOpen = (next) => {
1245
+ if (openProp === void 0) setOpenState(next);
1246
+ onOpenChange?.(next);
1247
+ };
1248
+ useEffect(() => {
1249
+ if (!open || props.search === false) return;
1250
+ boxRef.current?.querySelector("input")?.focus();
1251
+ }, [open, props.search]);
1252
+ useEffect(() => {
1253
+ if (open) {
1254
+ wasOpenRef.current = true;
1255
+ return;
1256
+ }
1257
+ if (!wasOpenRef.current) return;
1258
+ wasOpenRef.current = false;
1259
+ const closedByUs = closedByUsRef.current;
1260
+ const picked = pickedRef.current;
1261
+ closedByUsRef.current = false;
1262
+ pickedRef.current = false;
1263
+ if (!closedByUs || picked) return;
1264
+ triggerRef.current?.focus();
1265
+ }, [open]);
1266
+ const shown = useMemo(() => filterSelectOptions(options, query, filter), [
1267
+ options,
1268
+ query,
1269
+ filter
1270
+ ]);
1271
+ const close = (picked) => {
1272
+ closedByUsRef.current = true;
1273
+ pickedRef.current = picked;
1274
+ setOpen(false);
1275
+ setQuery("");
1276
+ setCursor(null);
1277
+ };
1278
+ return {
1279
+ open,
1280
+ setOpen,
1281
+ query,
1282
+ cursor,
1283
+ setCursor,
1284
+ setQuery,
1285
+ shown,
1286
+ close,
1287
+ boxRef,
1288
+ triggerRef,
1289
+ empty: typeof emptyText === "function" ? emptyText(query) : emptyText
1290
+ };
1291
+ }
1292
+ function SelectField(props) {
1293
+ const { value, options, onChange, label, hint, icon, renderValue, placeholder, search = true, searchLabel, searchPlaceholder, footer, onFooter, disabled = false, loading = false, loadingText, fallback, selection = "fill", variant = "boxed", ariaLabel, title, id, name, className, menuClassName } = props;
1294
+ const state = useSelectState(props);
1295
+ const current = options.find((option) => option.value === value);
1296
+ const variantClass = variant === "ghost" ? "wb-selectGhost" : void 0;
1297
+ const triggerClass = mergeClass("wb-selectTrigger", variantClass);
1298
+ if (loading) return framed(label, hint, className, loadingNode({
1299
+ id,
1300
+ className: triggerClass,
1301
+ ariaLabel,
1302
+ loadingText
1303
+ }));
1304
+ if (fallback !== void 0 && options.length === 0) return framed(label, hint, className, h(TextField, {
1305
+ id,
1306
+ name,
1307
+ className: "wb-selectFallback",
1308
+ "aria-label": ariaLabel,
1309
+ value: fallback.value,
1310
+ onChange: (event) => fallback.onChange(event.currentTarget.value)
1311
+ }));
1312
+ const trigger = triggerNode({
1313
+ id,
1314
+ className: triggerClass,
1315
+ disabled,
1316
+ open: state.open,
1317
+ ariaLabel,
1318
+ title,
1319
+ icon,
1320
+ value: current === void 0 ? h("span", { className: "wb-selectPlaceholder" }, placeholder ?? "—") : renderValue === void 0 ? current.label : renderValue(current),
1321
+ onOpen: () => state.setOpen(true)
1322
+ });
1323
+ const anchor = state.open && search ? searchNode({
1324
+ boxRef: state.boxRef,
1325
+ className: mergeClass("wb-selectSearch", variantClass),
1326
+ id,
1327
+ name,
1328
+ ariaLabel: searchLabel,
1329
+ placeholder: searchPlaceholder,
1330
+ query: state.query,
1331
+ onQuery: (next) => {
1332
+ state.setQuery(next);
1333
+ state.setCursor(null);
1334
+ },
1335
+ onKey: (event) => {
1336
+ if (event.key === "ArrowDown" || event.key === "ArrowUp") {
1337
+ event.stopPropagation();
1338
+ event.preventDefault();
1339
+ state.setCursor((at) => stepSelectCursor(state.shown, at, event.key === "ArrowDown" ? 1 : -1));
1340
+ return;
1341
+ }
1342
+ if (event.key !== "Enter") return;
1343
+ event.stopPropagation();
1344
+ const pick = state.shown[Math.min(state.cursor ?? 0, state.shown.length - 1)];
1345
+ if (pick === void 0) return;
1346
+ state.close(true);
1347
+ onChange(pick.value);
1348
+ }
1349
+ }) : trigger;
1350
+ return framed(label, hint, className, menuNode({
1351
+ open: state.open,
1352
+ listClassName: mergeClass("wb-selectMenu", menuClassName),
1353
+ anchor,
1354
+ selection,
1355
+ selectedId: selectCursorValue(state.shown, state.cursor) ?? void 0,
1356
+ items: selectEntries(state.shown, state.empty),
1357
+ footer: footer === void 0 ? void 0 : [{
1358
+ id: FOOTER_ID,
1359
+ label: footer.label,
1360
+ ...footer.icon === void 0 ? {} : { icon: footer.icon }
1361
+ }],
1362
+ onPick: (picked) => {
1363
+ state.close(true);
1364
+ if (picked === FOOTER_ID) {
1365
+ onFooter?.();
1366
+ return;
1367
+ }
1368
+ onChange(picked);
1369
+ },
1370
+ onCancel: () => state.close(false)
1371
+ }));
1372
+ }
1373
+ //#endregion
1374
+ //#region ../shared/dist/components/Stack.js
1375
+ function Stack({ children }) {
1376
+ return h("div", { className: "wb-stack" }, children);
1377
+ }
1378
+ //#endregion
1379
+ //#region ../shared/dist/components/StateBlock.js
1380
+ function StateBlock({ title, dot, hint, actions, resolving, children }) {
1381
+ return h("div", { className: "wb-stateBlock" }, title === void 0 && dot === void 0 ? null : h("p", { className: "wb-stateBlockTitle" }, dot, title), resolving === void 0 ? null : h("p", { className: "wb-stateBlockResolving" }, resolving), hint === void 0 ? null : h("p", { className: "wb-stateBlockHint" }, hint), children, actions === void 0 ? null : h("div", { className: "wb-stateBlockActions" }, actions));
1116
1382
  }
1117
1383
  //#endregion
1118
1384
  //#region ../shared/dist/components/icons.js
@@ -1241,6 +1507,62 @@ window.__ModuleLoader__.load({
1241
1507
  strokeWidth: "1.2"
1242
1508
  }));
1243
1509
  }
1510
+ function IconModuleMark({ size = 16 }) {
1511
+ return h(Shell, {
1512
+ size,
1513
+ viewBox: "0 0 24 24"
1514
+ }, h("defs", null, h("linearGradient", {
1515
+ id: "workbench-module-mark",
1516
+ x1: "0%",
1517
+ y1: "0%",
1518
+ x2: "100%",
1519
+ y2: "100%"
1520
+ }, h("stop", {
1521
+ offset: "0%",
1522
+ stopColor: "#3b82f6"
1523
+ }), h("stop", {
1524
+ offset: "55%",
1525
+ stopColor: "#8b5cf6"
1526
+ }), h("stop", {
1527
+ offset: "100%",
1528
+ stopColor: "#14b8a6"
1529
+ }))), h("rect", {
1530
+ width: 24,
1531
+ height: 24,
1532
+ rx: 7,
1533
+ fill: "url(#workbench-module-mark)"
1534
+ }), h("rect", {
1535
+ x: "4.6",
1536
+ y: "4.6",
1537
+ width: "6.2",
1538
+ height: "6.2",
1539
+ rx: "1.9",
1540
+ fill: "#ffffff"
1541
+ }), h("rect", {
1542
+ x: "13.2",
1543
+ y: "4.6",
1544
+ width: "6.2",
1545
+ height: "6.2",
1546
+ rx: "1.9",
1547
+ fill: "#ffffff",
1548
+ fillOpacity: .78
1549
+ }), h("rect", {
1550
+ x: "4.6",
1551
+ y: "13.2",
1552
+ width: "6.2",
1553
+ height: "6.2",
1554
+ rx: "1.9",
1555
+ fill: "#ffffff",
1556
+ fillOpacity: .78
1557
+ }), h("rect", {
1558
+ x: "13.2",
1559
+ y: "13.2",
1560
+ width: "6.2",
1561
+ height: "6.2",
1562
+ rx: "1.9",
1563
+ fill: "#ffffff"
1564
+ }));
1565
+ }
1244
1566
  function IconPanelScreen({ size = 16 }) {
1245
1567
  return h("svg", {
1246
1568
  width: size,
@@ -1419,7 +1741,7 @@ window.__ModuleLoader__.load({
1419
1741
  "panels.market.pluginKeptUnsure": "Files kept for now: some modules on this machine do not say what they use, so it is unclear who needs it.",
1420
1742
  "panels.market.pluginKeptHeld": "Files kept: this one is yours, and a module letting go will not remove it.",
1421
1743
  "panels.market.pluginKeptUnnamed": "Files kept for now: this one cannot be identified as a plugin, so it is unclear who needs it.",
1422
- "panels.market.pluginBroken": "This install is broken: it cannot be identified as a plugin. Uninstall it, or tell the agent to reinstall it by package name with workbench_modules (the install-bundle action).",
1744
+ "panels.market.pluginBroken": "This install is broken: it cannot be identified as a plugin. Uninstall it, or tell the agent to reinstall it by package name with workbench_modules_install_bundle.",
1423
1745
  "panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
1424
1746
  "panels.market.foot": "After installing, enable it in the panel page of that project.",
1425
1747
  "panels.market.recheck": "Check for updates",
@@ -1821,7 +2143,7 @@ window.__ModuleLoader__.load({
1821
2143
  "panels.market.pluginKeptUnsure": "文件先留着:这台机器上还有模块看不出用了什么,说不准谁在用它。",
1822
2144
  "panels.market.pluginKeptHeld": "文件留着:你自己装的那一份,模块放手不动它。",
1823
2145
  "panels.market.pluginKeptUnnamed": "文件先留着:看不出这是哪个插件,说不准谁在用它。",
1824
- "panels.market.pluginBroken": "这份装坏了:看不出它是个插件。可以卸载,或者直接跟 agent 说:用 workbench_modules 的 install-bundle 按包名再装一次。",
2146
+ "panels.market.pluginBroken": "这份装坏了:看不出它是个插件。可以卸载,或者直接跟 agent 说:用 workbench_modules_install_bundle 按包名再装一次。",
1825
2147
  "panels.market.restartNeeded": "新版装好了,重启一次才生效。",
1826
2148
  "panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
1827
2149
  "panels.market.recheck": "重新检查更新",
@@ -2429,6 +2751,7 @@ window.__ModuleLoader__.load({
2429
2751
  CODING_ISSUES_SERVICE: () => CODING_ISSUES_SERVICE,
2430
2752
  CONTEXT_MARKER_NAME: () => CONTEXT_MARKER_NAME,
2431
2753
  Card: () => Card,
2754
+ CardAnchor: () => CardAnchor,
2432
2755
  CardBoundary: () => CardBoundary,
2433
2756
  CardHead: () => CardHead,
2434
2757
  CenteredState: () => CenteredState,
@@ -2447,6 +2770,7 @@ window.__ModuleLoader__.load({
2447
2770
  INSTALL_TIMEOUT_MS: () => INSTALL_TIMEOUT_MS,
2448
2771
  IconBrandMark: () => IconBrandMark,
2449
2772
  IconConversation: () => IconConversation,
2773
+ IconModuleMark: () => IconModuleMark,
2450
2774
  IconModules: () => IconModules,
2451
2775
  IconNpm: () => IconNpm,
2452
2776
  IconOpencli: () => IconOpencli,
@@ -2458,7 +2782,6 @@ window.__ModuleLoader__.load({
2458
2782
  Link: () => Link,
2459
2783
  LongTaskRow: () => LongTaskRow,
2460
2784
  MIN_BUSY_MS: () => 500,
2461
- MockStrip: () => MockStrip,
2462
2785
  Note: () => Note,
2463
2786
  OPENCLI_MAX_CONCURRENT: () => 4,
2464
2787
  OPENCLI_PIN: () => OPENCLI_PIN,
@@ -2487,6 +2810,7 @@ window.__ModuleLoader__.load({
2487
2810
  STORAGE_KEY_RIGHTBAR_COLUMN: () => STORAGE_KEY_RIGHTBAR_COLUMN,
2488
2811
  SUPPORTED_API_VERSIONS: () => SUPPORTED_API_VERSIONS,
2489
2812
  SaveBar: () => SaveBar,
2813
+ SelectField: () => SelectField,
2490
2814
  SettingsSection: () => SettingsSection,
2491
2815
  SkeletonRows: () => SkeletonRows,
2492
2816
  Stack: () => Stack,
@@ -2504,17 +2828,21 @@ window.__ModuleLoader__.load({
2504
2828
  blockerOfError: () => blockerOfError,
2505
2829
  blockerPending: () => blockerPending,
2506
2830
  buildMarker: () => buildMarker,
2831
+ cardIdOf: () => cardIdOf,
2832
+ createContext: () => createContext,
2507
2833
  createFactChannel: () => createFactChannel,
2508
2834
  createPanelStateStore: () => createPanelStateStore,
2509
2835
  cx: () => cx,
2510
2836
  declarationProblemsOf: () => declarationProblemsOf,
2511
2837
  decodeRef: () => decodeRef,
2838
+ defaultSelectFilter: () => defaultSelectFilter,
2512
2839
  dictionaries: () => dictionaries,
2513
2840
  en: () => en,
2514
2841
  encodeRef: () => encodeRef,
2515
2842
  errorReasonOf: () => errorReasonOf,
2516
2843
  excerpt: () => excerpt,
2517
2844
  factOfRoute: () => factOfRoute,
2845
+ filterSelectOptions: () => filterSelectOptions,
2518
2846
  gateOf: () => gateOf,
2519
2847
  h: () => h,
2520
2848
  hasEnvSupply: () => hasEnvSupply,
@@ -2543,11 +2871,16 @@ window.__ModuleLoader__.load({
2543
2871
  relativeTimeCompact: () => relativeTimeCompact,
2544
2872
  runsRouteOf: () => runsRouteOf,
2545
2873
  scopePrefixOf: () => scopePrefixOf,
2874
+ searchTextOf: () => searchTextOf,
2875
+ selectCursorValue: () => selectCursorValue,
2876
+ selectEntries: () => selectEntries,
2546
2877
  shortenPath: () => shortenPath,
2547
2878
  splitBlocker: () => splitBlocker,
2879
+ stepSelectCursor: () => stepSelectCursor,
2548
2880
  tailLines: () => tailLines,
2549
2881
  unitFactScope: () => unitFactScope,
2550
2882
  useCallback: () => useCallback,
2883
+ useContext: () => useContext,
2551
2884
  useEffect: () => useEffect,
2552
2885
  useLayoutEffect: () => useLayoutEffect,
2553
2886
  useMemo: () => useMemo,
@@ -2677,10 +3010,10 @@ window.__ModuleLoader__.load({
2677
3010
  function markNextProbeSilent() {
2678
3011
  silentNextProbe = true;
2679
3012
  }
2680
- var probe$2 = NO_PROBE;
3013
+ var probe = NO_PROBE;
2681
3014
  var probeListeners = /* @__PURE__ */ new Set();
2682
3015
  function probeValue() {
2683
- return probe$2;
3016
+ return probe;
2684
3017
  }
2685
3018
  function subscribeProbe(listener) {
2686
3019
  probeListeners.add(listener);
@@ -2689,8 +3022,8 @@ window.__ModuleLoader__.load({
2689
3022
  };
2690
3023
  }
2691
3024
  function setProbe(next) {
2692
- if (next === probe$2) return;
2693
- probe$2 = next;
3025
+ if (next === probe) return;
3026
+ probe = next;
2694
3027
  for (const listener of [...probeListeners]) listener();
2695
3028
  }
2696
3029
  var CAPABILITY_FACT = "capability";
@@ -2709,7 +3042,7 @@ window.__ModuleLoader__.load({
2709
3042
  function setCapabilities(next, rechecked = false) {
2710
3043
  if (next === null) setProbe(NO_PROBE);
2711
3044
  else if (rechecked) setProbe({
2712
- ...probe$2,
3045
+ ...probe,
2713
3046
  checkedAt: Date.now()
2714
3047
  });
2715
3048
  if (next === current$1) return;
@@ -2717,15 +3050,15 @@ window.__ModuleLoader__.load({
2717
3050
  for (const listener of [...listeners$3]) listener();
2718
3051
  }
2719
3052
  function beginProbe() {
2720
- if (probe$2.checking) return;
3053
+ if (probe.checking) return;
2721
3054
  setProbe({
2722
- ...probe$2,
3055
+ ...probe,
2723
3056
  checking: true
2724
3057
  });
2725
3058
  }
2726
3059
  function endProbe() {
2727
3060
  setProbe({
2728
- ...probe$2,
3061
+ ...probe,
2729
3062
  checking: false
2730
3063
  });
2731
3064
  }
@@ -2821,41 +3154,34 @@ window.__ModuleLoader__.load({
2821
3154
  };
2822
3155
  }
2823
3156
  //#endregion
2824
- //#region src/shared/hooks/mock-mode.ts
2825
- var mock_mode_exports = /* @__PURE__ */ __exportAll({
2826
- crashModeOn: () => crashModeOn,
2827
- mockModeOn: () => mockModeOn
2828
- });
2829
- function mockModeOn(search) {
2830
- return /(?:^|[?&])(?:wbMock|wbMarketMock)=1(?:&|$)/.test(search);
2831
- }
2832
- function crashModeOn(search) {
2833
- return /(?:^|[?&])wbCrash=1(?:&|$)/.test(search);
2834
- }
2835
- //#endregion
2836
- //#region src/shared/hooks/use-fixture-pick.ts
2837
- var use_fixture_pick_exports = /* @__PURE__ */ __exportAll({ useFixturePick: () => useFixturePick });
2838
- function useFixturePick(options) {
2839
- const controlled = options.selected !== void 0 || options.onSelect !== void 0;
2840
- const [ownActive, setOwnActive] = useState(options.initial ?? null);
2841
- const [nonce, setNonce] = useState(0);
2842
- const [on] = useState(() => mockModeOn(window.location.search));
2843
- const enabled = options.enabled ?? on;
2844
- const active = controlled ? options.selected ?? null : ownActive;
2845
- const pick = useCallback((id) => {
2846
- if (!controlled) setOwnActive(id);
2847
- options.onSelect?.(id);
2848
- setNonce((value) => value + 1);
2849
- }, [controlled, options]);
2850
- return {
2851
- enabled,
2852
- active,
2853
- current: options.fixtures.find((fixture) => fixture.id === active),
2854
- pick,
2855
- nonce,
2856
- index: options.fixtures.findIndex((fixture) => fixture.id === active)
2857
- };
2858
- }
3157
+ //#region src/dev/surface.stub.ts
3158
+ var noop = () => void 0;
3159
+ var devSurface = {
3160
+ on: () => false,
3161
+ crash: () => false,
3162
+ useBoard: ({ all }) => ({
3163
+ shape: { kind: "real" },
3164
+ seed: all,
3165
+ strip: () => null,
3166
+ mode: false
3167
+ }),
3168
+ useStrips: () => ({
3169
+ pick: {
3170
+ enabled: false,
3171
+ active: null,
3172
+ current: void 0,
3173
+ nonce: 0,
3174
+ index: 0,
3175
+ pick: noop
3176
+ },
3177
+ current: void 0,
3178
+ enabled: false,
3179
+ strip: null
3180
+ }),
3181
+ addModuleState: (base) => base,
3182
+ gateStrip: () => null,
3183
+ kitModule: null
3184
+ };
2859
3185
  //#endregion
2860
3186
  //#region src/app/layouts/panel-hint.ts
2861
3187
  var hints = /* @__PURE__ */ new Map();
@@ -2879,1113 +3205,61 @@ window.__ModuleLoader__.load({
2879
3205
  return useSyncExternalStore(subscribePanelHints, () => panelHintOf(id));
2880
3206
  }
2881
3207
  function panelRowName(label, hint, t) {
2882
- if (hint === null) return label;
2883
- return t("panels.labelWithHint", {
2884
- label,
2885
- hint: t(hint.labelKey)
2886
- });
2887
- }
2888
- //#endregion
2889
- //#region src/app/layouts/rightbar/market-freshness.ts
2890
- var MARKET_STALE_MS = VERSION_CHECK_TTL_MS;
2891
- function marketSettled(freshness, installedRead) {
2892
- return freshness.loaded && installedRead !== false;
2893
- }
2894
- function shouldProbeOnEnter(input) {
2895
- if (input.checkedAt === null) return true;
2896
- return input.now - input.checkedAt >= input.staleMs;
2897
- }
2898
- //#endregion
2899
- //#region src/app/layouts/rightbar/market-settle.ts
2900
- var MODULE_SETTLE_MS = 15e3;
2901
- function holdBack(installed, roster, active, previous) {
2902
- const pending = installed.filter((unit) => !roster.has(unit));
2903
- const fresh = previous === null ? [] : pending.filter((unit) => !previous.has(unit));
2904
- return pending.filter((unit) => active.has(unit) || fresh.includes(unit));
2905
- }
2906
- var WORKBENCH_SWAP_MS = 18e4;
2907
- function swapLanded(until, installed) {
2908
- return until !== void 0 && installed === until;
2909
- }
2910
- function swapUntil(action, application, latest) {
2911
- if (action !== "update-workbench" || application !== "restart-required") return void 0;
2912
- return latest;
2913
- }
2914
- var READ_BACK_ACTIONS = /* @__PURE__ */ new Set(["update", "update-bundle"]);
2915
- function awaitsReadBack(action, application, version) {
2916
- return application === "applied" && version !== void 0 && READ_BACK_ACTIONS.has(action);
2917
- }
2918
- function readBackDone(input) {
2919
- if (input.action === "update") return !input.outdated;
2920
- if (input.entry === void 0 || input.entry.local === true || input.entry.latest === void 0) return true;
2921
- if (input.entry.latest === input.entry.installed) return true;
2922
- if (input.clicked === void 0) return true;
2923
- return input.entry.installed !== input.clicked;
2924
- }
2925
- function settleLanded(input) {
2926
- if (input.until !== void 0) return swapLanded(input.until, input.installed);
2927
- if (input.readBack !== true) return true;
2928
- return readBackDone({
2929
- action: input.action,
2930
- entry: input.entry,
2931
- clicked: input.clicked,
2932
- outdated: input.outdated
2933
- });
2934
- }
2935
- function holdWindowMs(until) {
2936
- return until === void 0 ? MODULE_SETTLE_MS : WORKBENCH_SWAP_MS;
2937
- }
2938
- //#endregion
2939
- //#region src/app/layouts/rightbar/market-installed-mock.ts
2940
- function installedMocks(input) {
2941
- const { id, found, mine, probe } = input;
2942
- return [
2943
- {
2944
- id: "no-supply",
2945
- label: "没有环境依赖的模块(供给是基座命令那种):市场里有它这一行",
2946
- manifests: [found],
2947
- capabilities: probe(id, "ok"),
2948
- installed: [{
2949
- unit: id,
2950
- pkg: "@dsh-workbench/module-one",
2951
- installed: "0.1.2"
2952
- }],
2953
- expect: {
2954
- rows: 1,
2955
- state: "installed",
2956
- actions: ["uninstall"],
2957
- installed: 0,
2958
- shared: 0
2959
- }
2960
- },
2961
- {
2962
- id: "no-card",
2963
- label: "没有卡片的模块(只有基座命令那种):市场里有它这一行,有版本、有「更新」",
2964
- manifests: [{
2965
- ...found,
2966
- card: null
2967
- }],
2968
- capabilities: probe(id, "ok"),
2969
- updates: { [id]: {
2970
- installed: "0.1.2",
2971
- latest: "0.2.0"
2972
- } },
2973
- installed: [{
2974
- unit: id,
2975
- pkg: "@dsh-workbench/module-one",
2976
- installed: "0.1.2"
2977
- }],
2978
- expect: {
2979
- rows: 1,
2980
- state: "outdated",
2981
- actions: ["update-bundle", "uninstall"],
2982
- version: {
2983
- installed: "0.1.2",
2984
- latest: "0.2.0"
2985
- },
2986
- installed: 0,
2987
- shared: 0
2988
- }
2989
- },
2990
- {
2991
- id: "no-env-installed",
2992
- label: "本机装着、又没有依赖要探(DIY 本地那份那种):写「已安装」,不是「状态未知」",
2993
- manifests: [{
2994
- ...found,
2995
- env: void 0
2996
- }],
2997
- capabilities: {},
2998
- updates: { [id]: { installed: "0.1.2" } },
2999
- installed: [{
3000
- unit: id,
3001
- pkg: "@dsh-workbench/module-one",
3002
- installed: "0.1.2"
3003
- }],
3004
- expect: {
3005
- rows: 1,
3006
- state: "installed",
3007
- actions: ["uninstall"],
3008
- version: { installed: "0.1.2" },
3009
- installed: 0
3010
- }
3011
- },
3012
- {
3013
- id: "local-no-update",
3014
- label: "本机那份(link: 装的):有「本地」标记、不给「更新」",
3015
- manifests: [mine],
3016
- capabilities: probe(id, "ok", { plugins: [{
3017
- name: "fixture",
3018
- status: "ok",
3019
- missing: []
3020
- }] }),
3021
- updates: { [id]: {
3022
- installed: "0.1.0",
3023
- local: true
3024
- } },
3025
- installed: [{
3026
- unit: id,
3027
- pkg: "@dsh-workbench/module-one",
3028
- installed: "0.1.0",
3029
- local: true
3030
- }],
3031
- expect: {
3032
- rows: 1,
3033
- state: "installed",
3034
- actions: ["uninstall"],
3035
- local: true,
3036
- version: { installed: "0.1.0" },
3037
- installed: 0
3038
- }
3039
- },
3040
- {
3041
- id: "installed-refused",
3042
- label: "本机装了,但宿主不认它的声明(行上说得出理由)",
3043
- manifests: [],
3044
- capabilities: {},
3045
- installed: [{
3046
- unit: id,
3047
- pkg: "@dsh-workbench/module-one",
3048
- installed: "0.1.2",
3049
- refused: ["dsh.workbench 缺 apiVersion —— 协议从 v1 起,写 \"apiVersion\": 1"]
3050
- }],
3051
- expect: {
3052
- rows: 0,
3053
- installed: 1,
3054
- installedState: "unusable",
3055
- installedActions: ["remove-bundle"],
3056
- installedNote: true
3057
- }
3058
- },
3059
- {
3060
- id: "installed-pending",
3061
- label: "本机装了、宿主还没加载它(重启一次就会出来)",
3062
- manifests: [],
3063
- capabilities: {},
3064
- installed: [{
3065
- unit: id,
3066
- pkg: "@dsh-workbench/module-one",
3067
- installed: "0.1.2"
3068
- }],
3069
- expect: {
3070
- rows: 0,
3071
- installed: 1,
3072
- installedState: "inactive",
3073
- installedActions: ["remove-bundle"],
3074
- installedHint: "panels.market.moduleRestartHint"
3075
- }
3076
- },
3077
- {
3078
- id: "installed-pending-update",
3079
- label: "本机装了、还没加载 + 源上有新版(给「更新」,也说明要重启)",
3080
- manifests: [],
3081
- capabilities: {},
3082
- installed: [{
3083
- unit: id,
3084
- pkg: "@dsh-workbench/module-one",
3085
- installed: "0.1.0",
3086
- latest: "0.1.2"
3087
- }],
3088
- expect: {
3089
- rows: 0,
3090
- installed: 1,
3091
- installedState: "outdated",
3092
- installedActions: ["update-bundle", "remove-bundle"],
3093
- installedHint: "panels.market.moduleRestartHint"
3094
- }
3095
- },
3096
- {
3097
- id: "installed-confirm",
3098
- label: "卸载本机模块(还没加载的那种:Modal 确认,标题是包名)",
3099
- manifests: [],
3100
- capabilities: {},
3101
- installed: [{
3102
- unit: id,
3103
- pkg: "@dsh-workbench/module-one",
3104
- installed: "0.1.2"
3105
- }],
3106
- confirming: id,
3107
- expect: {
3108
- rows: 0,
3109
- installed: 1,
3110
- installedState: "inactive",
3111
- installedActions: ["remove-bundle"]
3112
- }
3113
- },
3114
- {
3115
- id: "first-paint",
3116
- label: "刚进页面(检测中:能力与本机清单都还没结论)",
3117
- manifests: [mine],
3118
- capabilities: null,
3119
- installedRead: false,
3120
- loaded: false,
3121
- expect: {
3122
- rows: 1,
3123
- state: "checking",
3124
- actions: []
3125
- }
3126
- }
3127
- ];
3128
- }
3129
- //#endregion
3130
- //#region src/app/layouts/rightbar/market-mock.ts
3131
- function installable(manifest) {
3132
- return {
3133
- ...manifest,
3134
- env: {
3135
- command: "opencli",
3136
- plugins: [{
3137
- name: "fixture",
3138
- commands: ["x"]
3139
- }]
3140
- }
3141
- };
3142
- }
3143
- function withEnvSource(manifest, env) {
3144
- const [first, ...rest] = manifest.env?.plugins ?? [];
3145
- if (first === void 0) return manifest;
3146
- return {
3147
- ...manifest,
3148
- env: {
3149
- ...manifest.env,
3150
- plugins: [{
3151
- ...first,
3152
- installSource: {
3153
- kind: "local",
3154
- env
3155
- }
3156
- }, ...rest]
3157
- }
3158
- };
3159
- }
3160
- function withSecondNeed(manifest) {
3161
- return {
3162
- ...manifest,
3163
- env: {
3164
- ...manifest.env,
3165
- plugins: [...manifest.env?.plugins ?? [], {
3166
- name: "fixture-second",
3167
- commands: ["y"]
3168
- }]
3169
- }
3170
- };
3171
- }
3172
- function twin(manifest) {
3173
- return {
3174
- ...manifest,
3175
- id: `${manifest.id}-b`
3176
- };
3177
- }
3178
- function copies(manifest, count) {
3179
- return Array.from({ length: count }, (_, index) => ({
3180
- ...manifest,
3181
- id: `${manifest.id}-${index}`,
3182
- env: {
3183
- ...manifest.env,
3184
- plugins: [{
3185
- name: `fixture-${index}`,
3186
- commands: manifest.env?.plugins?.[0]?.commands ?? []
3187
- }]
3188
- }
3189
- }));
3190
- }
3191
- function probe$1(unit, status, extra = {}) {
3192
- return { [unit]: {
3193
- unit,
3194
- status,
3195
- required: ["x"],
3196
- missing: [],
3197
- detail: "夹具",
3198
- ...extra
3199
- } };
3200
- }
3201
- function buildMarketMocks(roster) {
3202
- const found = roster.find((manifest) => manifest.card !== null);
3203
- if (found === void 0) return [{
3204
- id: "empty",
3205
- label: "市场空态",
3206
- manifests: [],
3207
- capabilities: {},
3208
- expect: { rows: 0 }
3209
- }];
3210
- const mine = installable(found);
3211
- const second = twin(mine);
3212
- const id = mine.id;
3213
- const secondId = second.id;
3214
- return [
3215
- {
3216
- id: "installed",
3217
- label: "已装",
3218
- manifests: [mine],
3219
- capabilities: probe$1(id, "ok", { plugins: [{
3220
- name: "fixture",
3221
- status: "ok",
3222
- missing: []
3223
- }] }),
3224
- expect: {
3225
- rows: 1,
3226
- state: "installed",
3227
- actions: ["uninstall"],
3228
- shared: 1,
3229
- sharedActions: []
3230
- }
3231
- },
3232
- {
3233
- id: "outdated",
3234
- label: "要更新",
3235
- manifests: [mine],
3236
- capabilities: probe$1(id, "missing-commands", { missing: ["x"] }),
3237
- expect: {
3238
- rows: 1,
3239
- state: "outdated",
3240
- actions: ["update", "uninstall"],
3241
- noteKey: "panels.market.needCommands"
3242
- }
3243
- },
3244
- {
3245
- id: "module-update",
3246
- label: "模块包有新版(行上给「更新」,装了要重启)",
3247
- manifests: [mine],
3248
- capabilities: probe$1(id, "ok", { plugins: [{
3249
- name: "fixture",
3250
- status: "ok",
3251
- missing: []
3252
- }] }),
3253
- updates: { [id]: {
3254
- installed: "0.1.2",
3255
- latest: "0.2.0"
3256
- } },
3257
- expect: {
3258
- rows: 1,
3259
- state: "outdated",
3260
- actions: ["update-bundle", "uninstall"],
3261
- shared: 1,
3262
- sharedActions: []
3263
- }
3264
- },
3265
- {
3266
- id: "outdated-release",
3267
- label: "源上有新版(模块行不变,共用依赖行给「更新」)",
3268
- manifests: [mine],
3269
- capabilities: probe$1(id, "ok", { plugins: [{
3270
- name: "fixture",
3271
- status: "outdated",
3272
- missing: [],
3273
- release: {
3274
- installed: "1.0.16",
3275
- latest: "1.0.17"
3276
- }
3277
- }] }),
3278
- expect: {
3279
- rows: 1,
3280
- state: "installed",
3281
- actions: ["uninstall"],
3282
- shared: 1,
3283
- sharedActions: ["update-dependency"]
3284
- }
3285
- },
3286
- {
3287
- id: "missing",
3288
- label: "未装(可装)",
3289
- manifests: [mine],
3290
- capabilities: probe$1(id, "missing-plugin", {
3291
- install: "ready",
3292
- plugins: [{
3293
- name: "fixture",
3294
- status: "missing",
3295
- missing: ["x"],
3296
- install: "ready"
3297
- }]
3298
- }),
3299
- expect: {
3300
- rows: 1,
3301
- state: "missing",
3302
- actions: ["install"],
3303
- shared: 1,
3304
- sharedActions: []
3305
- }
3306
- },
3307
- {
3308
- id: "missing-env",
3309
- label: "未装 + 要先设环境变量",
3310
- manifests: [withEnvSource(mine, "WB_FIXTURE_HOME")],
3311
- capabilities: probe$1(id, "missing-plugin", { install: "env-missing" }),
3312
- expect: {
3313
- rows: 1,
3314
- state: "missing",
3315
- actions: []
3316
- }
3317
- },
3318
- {
3319
- id: "missing-undeclared",
3320
- label: "未装 + 没声明怎么装",
3321
- manifests: [mine],
3322
- capabilities: probe$1(id, "missing-plugin", { install: "not-declared" }),
3323
- expect: {
3324
- rows: 1,
3325
- state: "missing",
3326
- actions: []
3327
- }
3328
- },
3329
- {
3330
- id: "unknown",
3331
- label: "探测失败(状态未知)",
3332
- manifests: [mine],
3333
- capabilities: {},
3334
- expect: {
3335
- rows: 1,
3336
- state: "unknown",
3337
- actions: []
3338
- }
3339
- },
3340
- {
3341
- id: "checking",
3342
- label: "检测中",
3343
- manifests: [mine],
3344
- capabilities: null,
3345
- expect: {
3346
- rows: 1,
3347
- state: "checking",
3348
- actions: []
3349
- }
3350
- },
3351
- {
3352
- id: "shared",
3353
- label: "两个模块(第二行是复制的)",
3354
- manifests: [mine, second],
3355
- capabilities: {
3356
- ...probe$1(id, "ok"),
3357
- ...probe$1(secondId, "ok")
3358
- },
3359
- expect: {
3360
- rows: 2,
3361
- state: "installed",
3362
- actions: ["uninstall"],
3363
- shared: 1
3364
- }
3365
- },
3366
- {
3367
- id: "busy",
3368
- label: "正在装",
3369
- manifests: [mine],
3370
- capabilities: probe$1(id, "missing-plugin", { install: "ready" }),
3371
- pending: {
3372
- id,
3373
- action: "install"
3374
- },
3375
- expect: {
3376
- rows: 1,
3377
- state: "missing",
3378
- actions: ["install"]
3379
- }
3380
- },
3381
- {
3382
- id: "confirm",
3383
- label: "等确认卸载",
3384
- manifests: [mine],
3385
- capabilities: probe$1(id, "ok"),
3386
- confirming: id,
3387
- expect: {
3388
- rows: 1,
3389
- state: "installed",
3390
- actions: ["uninstall"]
3391
- }
3392
- },
3393
- {
3394
- id: "failed",
3395
- label: "失败(红字贴行)",
3396
- manifests: [mine],
3397
- capabilities: probe$1(id, "ok"),
3398
- failure: {
3399
- id,
3400
- message: "没成功:命令失败(退出码 1):夹具里的一条失败原因"
3401
- },
3402
- expect: {
3403
- rows: 1,
3404
- state: "installed",
3405
- actions: ["uninstall"]
3406
- }
3407
- },
3408
- {
3409
- id: "long-title",
3410
- label: "超长模块名",
3411
- manifests: [{
3412
- ...mine,
3413
- card: {
3414
- titleKey: "一个名字特别特别长的模块用来验证省略号会不会把按钮挤下去",
3415
- order: 10
3416
- }
3417
- }],
3418
- capabilities: probe$1(id, "ok"),
3419
- expect: {
3420
- rows: 1,
3421
- state: "installed",
3422
- actions: ["uninstall"],
3423
- titleChars: 25
3424
- }
3425
- },
3426
- {
3427
- id: "long-env",
3428
- label: "超长环境变量名",
3429
- manifests: [withEnvSource(mine, "DSH_WORKBENCH_SOMETHING_VERY_LONG_ENV_NAME_FOR_THE_MODULE")],
3430
- capabilities: probe$1(id, "missing-plugin", { install: "env-missing" }),
3431
- expect: {
3432
- rows: 1,
3433
- state: "missing",
3434
- actions: []
3435
- }
3436
- },
3437
- {
3438
- id: "long-error",
3439
- label: "超长错误信息",
3440
- manifests: [mine],
3441
- capabilities: probe$1(id, "ok"),
3442
- failure: {
3443
- id,
3444
- message: "没成功:命令失败(退出码 1):Error: EPERM: operation not permitted, unlink '/Users/someone/.dsh/workbench/opencli/home/.opencli/plugins/example-permission-copy-with-a-very-long-directory-name'"
3445
- },
3446
- expect: {
3447
- rows: 1,
3448
- state: "installed",
3449
- actions: ["uninstall"]
3450
- }
3451
- },
3452
- {
3453
- id: "two-deps",
3454
- label: "两份依赖(只装缺的)",
3455
- manifests: [withSecondNeed(mine)],
3456
- capabilities: probe$1(id, "missing-plugin", {
3457
- install: "ready",
3458
- plugins: [{
3459
- name: "fixture",
3460
- status: "ok",
3461
- missing: []
3462
- }, {
3463
- name: "fixture-second",
3464
- status: "missing",
3465
- missing: ["y"],
3466
- install: "ready"
3467
- }]
3468
- }),
3469
- expect: {
3470
- rows: 1,
3471
- state: "missing",
3472
- actions: ["install"]
3473
- }
3474
- },
3475
- {
3476
- id: "many",
3477
- label: "很多行(要滚)",
3478
- manifests: [mine, ...copies(mine, 13)],
3479
- capabilities: Object.fromEntries([id, ...copies(mine, 13).map((item) => item.id)].map((unit) => [unit, probe$1(unit, "ok")[unit]])),
3480
- expect: {
3481
- rows: 14,
3482
- state: "installed",
3483
- actions: ["uninstall"]
3484
- }
3485
- },
3486
- ...installedMocks({
3487
- id,
3488
- found,
3489
- mine,
3490
- probe: probe$1
3491
- }),
3492
- {
3493
- id: "shared-many",
3494
- label: "三个模块(同一份安装)",
3495
- manifests: [
3496
- mine,
3497
- twin(mine),
3498
- {
3499
- ...twin(mine),
3500
- id: `${mine.id}-c`
3501
- }
3502
- ],
3503
- capabilities: {
3504
- ...probe$1(id, "ok"),
3505
- ...probe$1(secondId, "ok"),
3506
- ...probe$1(`${mine.id}-c`, "ok")
3507
- },
3508
- expect: {
3509
- rows: 3,
3510
- state: "installed",
3511
- actions: ["uninstall"]
3512
- }
3513
- },
3514
- {
3515
- id: "plugin-outdated",
3516
- label: "用户装的 opencli 插件:有新版(给更新 / 卸载)",
3517
- manifests: [],
3518
- capabilities: {},
3519
- plugins: [{
3520
- pkg: "opencli-plugin-cmdb",
3521
- name: "cmdb",
3522
- installed: "1.0.24",
3523
- latest: "1.0.25"
3524
- }],
3525
- expect: {
3526
- rows: 0,
3527
- plugins: 1,
3528
- pluginActions: ["update-plugin", "uninstall-plugin"]
3529
- }
3530
- },
3531
- {
3532
- id: "plugin-local",
3533
- label: "本地目录装的 opencli 插件:没有版本源,只给卸载",
3534
- manifests: [],
3535
- capabilities: {},
3536
- plugins: [{
3537
- pkg: "/Users/me/my-local-plugin",
3538
- name: "my-local-plugin",
3539
- local: true
3540
- }],
3541
- expect: {
3542
- rows: 0,
3543
- plugins: 1,
3544
- pluginActions: ["uninstall-plugin"],
3545
- pluginNote: false
3546
- }
3547
- },
3548
- {
3549
- id: "plugin-alias",
3550
- label: "插件名 ≠ 包名:行上两个都写出来(更新 / 卸载按包名)",
3551
- manifests: [],
3552
- capabilities: {},
3553
- plugins: [{
3554
- pkg: "opencli-plugin-cmdb",
3555
- name: "cmdb",
3556
- installed: "1.0.24",
3557
- latest: "1.0.25"
3558
- }],
3559
- expect: {
3560
- rows: 0,
3561
- plugins: 1,
3562
- pluginActions: ["update-plugin", "uninstall-plugin"]
3563
- }
3564
- },
3565
- {
3566
- id: "plugin-broken",
3567
- label: "装坏了的那一份(目录在但看不出是个插件):行上直说,给卸载与指路",
3568
- manifests: [],
3569
- capabilities: {},
3570
- plugins: [{
3571
- pkg: "opencli-plugin-cmdb",
3572
- name: "cmdb",
3573
- installed: "1.0.24",
3574
- broken: true
3575
- }],
3576
- expect: {
3577
- rows: 0,
3578
- plugins: 1,
3579
- pluginState: "broken",
3580
- pluginActions: ["uninstall-plugin"],
3581
- pluginNoteKey: "panels.market.pluginBroken"
3582
- }
3583
- },
3584
- {
3585
- id: "plugin-kept",
3586
- label: "卸掉用户装的插件,但还有模块在用:文件先留着(行上给一句为什么)",
3587
- manifests: [],
3588
- capabilities: {},
3589
- plugins: [{
3590
- pkg: "opencli-plugin-cmdb",
3591
- name: "cmdb",
3592
- installed: "1.0.24"
3593
- }],
3594
- notice: "文件先留着:cmdb、argocd 还要用它。",
3595
- expect: {
3596
- rows: 0,
3597
- plugins: 1,
3598
- pluginActions: ["uninstall-plugin"],
3599
- notice: true
3600
- }
3601
- },
3602
- {
3603
- id: "workbench-update",
3604
- label: "工作台有新版(这一行也给「更新」,装完面板自己换上)",
3605
- manifests: [],
3606
- capabilities: {},
3607
- workbench: {
3608
- pkg: "@dsh-workbench/core",
3609
- installed: "0.1.18",
3610
- latest: "0.1.19"
3611
- },
3612
- expect: {
3613
- rows: 0,
3614
- workbenchState: "outdated",
3615
- workbenchActions: ["update-workbench"]
3616
- }
3617
- },
3618
- {
3619
- id: "workbench-current",
3620
- label: "工作台已经最新(只显示版本,没有按钮)",
3621
- manifests: [],
3622
- capabilities: {},
3623
- workbench: {
3624
- pkg: "@dsh-workbench/core",
3625
- installed: "0.1.19"
3626
- },
3627
- expect: {
3628
- rows: 0,
3629
- workbenchState: "installed",
3630
- workbenchActions: []
3631
- }
3632
- },
3633
- {
3634
- id: "workbench-local",
3635
- label: "工作台是本仓那份(link: 装的:不给更新,行上说清)",
3636
- manifests: [],
3637
- capabilities: {},
3638
- workbench: {
3639
- pkg: "@dsh-workbench/core",
3640
- installed: "0.1.18",
3641
- latest: "0.1.19",
3642
- local: true
3643
- },
3644
- expect: {
3645
- rows: 0,
3646
- workbenchState: "installed",
3647
- workbenchActions: [],
3648
- workbenchNoteKey: "panels.market.workbenchLocal"
3649
- }
3650
- },
3651
- {
3652
- id: "workbench-updated",
3653
- label: "工作台刚更新完(新版已经在盘上:行上就是新版,没有按钮、也不劝人重启)",
3654
- manifests: [],
3655
- capabilities: {},
3656
- workbench: {
3657
- pkg: "@dsh-workbench/core",
3658
- installed: "0.1.19"
3659
- },
3660
- expect: {
3661
- rows: 0,
3662
- workbenchState: "installed",
3663
- workbenchActions: []
3664
- }
3665
- },
3666
- {
3667
- id: "workbench-restart-pending",
3668
- label: "工作台更新完了但这份进程里还是旧的(盘上 0.1.19、跑着的 0.1.18:状态那格是红点「重启后生效」——重启一次 dsh 才真的换上)",
3669
- manifests: [],
3670
- capabilities: {},
3671
- workbench: {
3672
- pkg: "@dsh-workbench/core",
3673
- installed: "0.1.19",
3674
- running: "0.1.18"
3675
- },
3676
- expect: {
3677
- rows: 0,
3678
- workbenchState: "pending-restart",
3679
- workbenchActions: []
3680
- }
3681
- },
3682
- {
3683
- id: "workbench-restart-pending-local",
3684
- label: "本仓那份(link: 装的)永远等于盘上那份 → 不亮这句、也不劝重启",
3685
- manifests: [],
3686
- capabilities: {},
3687
- workbench: {
3688
- pkg: "@dsh-workbench/core",
3689
- installed: "0.1.19",
3690
- running: "0.1.18",
3691
- local: true
3692
- },
3693
- expect: {
3694
- rows: 0,
3695
- workbenchState: "installed",
3696
- workbenchActions: []
3697
- }
3698
- },
3699
- {
3700
- id: "empty",
3701
- label: "市场空态",
3702
- manifests: [],
3703
- capabilities: {},
3704
- expect: {
3705
- rows: 0,
3706
- shared: 0
3707
- }
3708
- }
3709
- ];
3710
- }
3711
- //#endregion
3712
- //#region src/app/layouts/rightbar/registry.ts
3713
- function createBoardRegistry() {
3714
- const modules = [];
3715
- const listeners = /* @__PURE__ */ new Set();
3716
- let revision = 0;
3717
- let sorted = [];
3718
- let index = /* @__PURE__ */ new Map();
3719
- let steps = /* @__PURE__ */ new Map();
3720
- function rebuild() {
3721
- sorted = [...modules].sort((a, b) => a.order - b.order || a.id.localeCompare(b.id));
3722
- index = new Map(sorted.map((module) => [module.id, module]));
3723
- const table = /* @__PURE__ */ new Map();
3724
- for (const module of sorted) for (const kind of Object.keys(module.steps ?? {})) {
3725
- const owner = table.get(kind);
3726
- if (owner !== void 0) throw new Error(`看板层名重复:${kind}(${owner.id} 与 ${module.id} 都声明了它)`);
3727
- table.set(kind, module);
3728
- }
3729
- steps = table;
3730
- }
3731
- function notify() {
3732
- revision += 1;
3733
- for (const listener of listeners) listener();
3734
- }
3735
- return {
3736
- register(module) {
3737
- if (modules.some((item) => item.id === module.id)) throw new Error(`看板模块 id 重复:${module.id}(id 会进持久化配置,不能撞)`);
3738
- modules.push(module);
3739
- try {
3740
- rebuild();
3741
- } catch (error) {
3742
- modules.pop();
3743
- rebuild();
3744
- throw error;
3745
- }
3746
- notify();
3747
- return () => {
3748
- const at = modules.indexOf(module);
3749
- if (at < 0) return;
3750
- modules.splice(at, 1);
3751
- rebuild();
3752
- notify();
3753
- };
3754
- },
3755
- all: () => sorted,
3756
- byId: (id) => index.get(id),
3757
- stepOwner: (kind) => steps.get(kind),
3758
- subscribe(listener) {
3759
- listeners.add(listener);
3760
- return () => listeners.delete(listener);
3761
- },
3762
- version: () => revision
3763
- };
3764
- }
3765
- //#endregion
3766
- //#region src/app/units/registry.ts
3767
- function toBoardModule(face, manifest) {
3768
- const View = face.card;
3769
- if (View === void 0) return void 0;
3770
- return {
3771
- id: manifest.id,
3772
- titleKey: manifest.card?.titleKey ?? manifest.id,
3773
- order: manifest.card?.order ?? 100,
3774
- View,
3775
- ...face.steps === void 0 ? {} : { steps: face.steps }
3776
- };
3777
- }
3778
- function createClientUnitRegistry(options = {}) {
3779
- const registrations = [];
3780
- const refusals = [];
3781
- const listeners = /* @__PURE__ */ new Set();
3782
- const board = createBoardRegistry();
3783
- let known = /* @__PURE__ */ new Map();
3784
- let installableIds = null;
3785
- let revision = 0;
3786
- let manifestsCache;
3787
- function notify() {
3788
- revision += 1;
3789
- for (const listener of [...listeners]) try {
3790
- listener();
3791
- } catch (error) {
3792
- console.warn(`[dsh-workbench] 套件注册的订阅者报错(不影响其它订阅者与这次注册):${String(error)}`);
3793
- }
3794
- }
3795
- function warnRefusal(unit, kind, reasons) {
3796
- refusals.push({
3797
- unit,
3798
- kind,
3799
- reasons
3800
- });
3801
- console.warn(`[dsh-workbench] ${unit === "" ? "这个模块" : unit} 的卡片没挂上:${reasons.join(";")}`);
3802
- }
3803
- function takeBackRefusal(unit) {
3804
- for (let at = refusals.length - 1; at >= 0; at -= 1) if (refusals[at]?.unit === unit) refusals.splice(at, 1);
3805
- }
3806
- function attach(entry) {
3807
- const manifest = known.get(entry.unit);
3808
- if (manifest === void 0) return false;
3809
- const boardModule = toBoardModule(entry.face, manifest);
3810
- entry.mounted = {
3811
- manifest,
3812
- unmount: boardModule === void 0 ? () => {} : board.register(boardModule)
3813
- };
3814
- takeBackRefusal(entry.unit);
3815
- return true;
3816
- }
3817
- function detach(entry) {
3818
- entry.mounted?.unmount();
3819
- entry.mounted = null;
3820
- }
3821
- return {
3822
- register(face) {
3823
- const unit = typeof face?.unit === "string" ? face.unit.trim() : "";
3824
- if (unit === "") {
3825
- warnRefusal("", "old-shape", ["registerUnit({ unit, card }) 里的 unit 是空的 —— U1b 之前的旧形状是 registerUnit({ manifest, card });现在清单由外壳从**已装清单**读出来、按 unit 交给浏览器(ADR-0038 §2.2)"]);
3826
- notify();
3827
- return () => {};
3828
- }
3829
- if (registrations.some((entry) => entry.unit === unit)) throw new Error(`套件 id 重复:${unit}(id 会进持久化配置,不能撞)`);
3830
- const entry = {
3831
- face,
3832
- unit,
3833
- mounted: null
3834
- };
3835
- registrations.push(entry);
3836
- manifestsCache = void 0;
3837
- if (!attach(entry)) {
3838
- warnRefusal(unit, "no-manifest", [`宿主没有担保 unit「${unit}」的清单 —— 这个包要么没装进这份 profile,要么它的 dsh.workbench 没通过校验。卡片先不挂:清单只有一处真相(ADR-0038 §2.2)`]);
3839
- options.onUnknownUnit?.(unit);
3840
- }
3841
- notify();
3842
- return () => {
3843
- const at = registrations.indexOf(entry);
3844
- if (at < 0) return;
3845
- registrations.splice(at, 1);
3846
- detach(entry);
3847
- takeBackRefusal(unit);
3848
- manifestsCache = void 0;
3849
- notify();
3850
- };
3851
- },
3852
- all: () => registrations.map((entry) => entry.face),
3853
- manifests: () => {
3854
- manifestsCache ??= registrations.flatMap((entry) => entry.mounted === null ? [] : [entry.mounted.manifest]);
3855
- return manifestsCache;
3856
- },
3857
- refusals: () => refusals,
3858
- installable: () => installableIds,
3859
- setManifests(manifests, installable) {
3860
- known = new Map(manifests.map((manifest) => [manifest.id, manifest]));
3861
- installableIds = installable === void 0 ? null : new Set(installable);
3862
- let changed = false;
3863
- for (const entry of registrations) {
3864
- const next = known.get(entry.unit);
3865
- if (entry.mounted === null) {
3866
- if (next !== void 0 && attach(entry)) changed = true;
3867
- continue;
3868
- }
3869
- if (next === void 0) {
3870
- detach(entry);
3871
- warnRefusal(entry.unit, "withdrawn", [`宿主不再担保 unit「${entry.unit}」的清单(模块被卸了?)—— 这张卡片先摘下来`]);
3872
- changed = true;
3873
- }
3874
- }
3875
- if (!changed) return;
3876
- manifestsCache = void 0;
3877
- notify();
3878
- },
3879
- board,
3880
- subscribe(listener) {
3881
- listeners.add(listener);
3882
- return () => listeners.delete(listener);
3883
- },
3884
- version: () => revision
3885
- };
3208
+ if (hint === null) return label;
3209
+ return t("panels.labelWithHint", {
3210
+ label,
3211
+ hint: t(hint.labelKey)
3212
+ });
3886
3213
  }
3887
3214
  //#endregion
3888
- //#region src/app/units/fixture-unit-mock.tsx
3889
- var FIXTURE_UNIT_ID = "wb-fixture";
3890
- var CRASH_UNIT_ID = "wb-fixture-crash";
3891
- var KEY = {
3892
- cardTitle: `${FIXTURE_UNIT_ID}.cardTitle`,
3893
- cardMeta: `${FIXTURE_UNIT_ID}.cardMeta`,
3894
- rowKey: `${FIXTURE_UNIT_ID}.rowKey`,
3895
- rowValue: `${FIXTURE_UNIT_ID}.rowValue`
3896
- };
3897
- var messages = {
3898
- zh: {
3899
- [KEY.cardTitle]: "示例模块",
3900
- [KEY.cardMeta]: "夹具",
3901
- [KEY.rowKey]: "示例",
3902
- [KEY.rowValue]: "第 {n} 行"
3903
- },
3904
- en: {
3905
- [KEY.cardTitle]: "Sample module",
3906
- [KEY.cardMeta]: "Fixture",
3907
- [KEY.rowKey]: "Sample",
3908
- [KEY.rowValue]: "Row {n}"
3909
- }
3910
- };
3911
- var manifest = {
3912
- id: FIXTURE_UNIT_ID,
3913
- card: {
3914
- titleKey: KEY.cardTitle,
3915
- order: 900
3916
- },
3917
- tools: [],
3918
- host: { inject: [] }
3919
- };
3920
- function FixtureCard({ t, onRefresh }) {
3921
- return /* @__PURE__ */ h(Card, {
3922
- t,
3923
- title: t(KEY.cardTitle),
3924
- meta: t(KEY.cardMeta),
3925
- refreshing: false,
3926
- onRefresh
3927
- }, /* @__PURE__ */ h(Rows, null, [
3928
- 1,
3929
- 2,
3930
- 3
3931
- ].map((n) => /* @__PURE__ */ h(Row, {
3932
- key: String(n),
3933
- label: t(KEY.rowKey),
3934
- value: t(KEY.rowValue, { n: String(n) })
3935
- }))));
3215
+ //#region src/app/layouts/rightbar/market-freshness.ts
3216
+ var MARKET_STALE_MS = VERSION_CHECK_TTL_MS;
3217
+ function marketSettled(freshness, installedRead) {
3218
+ return freshness.loaded && installedRead !== false;
3936
3219
  }
3937
- var FIXTURE_FACE = {
3938
- unit: FIXTURE_UNIT_ID,
3939
- manifest,
3940
- messages,
3941
- card: FixtureCard
3942
- };
3943
- var CRASH_KEY = {
3944
- cardTitle: `${CRASH_UNIT_ID}.cardTitle`,
3945
- cardMeta: `${CRASH_UNIT_ID}.cardMeta`
3946
- };
3947
- var crashMessages = {
3948
- zh: {
3949
- [CRASH_KEY.cardTitle]: "崩溃的卡片",
3950
- [CRASH_KEY.cardMeta]: "夹具:渲染时抛错"
3951
- },
3952
- en: {
3953
- [CRASH_KEY.cardTitle]: "Crashing card",
3954
- [CRASH_KEY.cardMeta]: "Fixture: throws while rendering"
3955
- }
3956
- };
3957
- var crashManifest = {
3958
- id: CRASH_UNIT_ID,
3959
- card: {
3960
- titleKey: CRASH_KEY.cardTitle,
3961
- order: 899
3962
- },
3963
- tools: [],
3964
- host: { inject: [] }
3965
- };
3966
- function CrashingCard() {
3967
- throw new Error("夹具:这张卡片按 wbCrash=1 故意渲染失败(守「一张卡片崩溃不带走面板」)");
3968
- }
3969
- var CRASH_FACE = {
3970
- unit: CRASH_UNIT_ID,
3971
- manifest: crashManifest,
3972
- messages: crashMessages,
3973
- card: CrashingCard
3974
- };
3975
- var SAMPLE_ROSTER = [manifest];
3976
- function hasCard(roster) {
3977
- return roster.some((item) => item.card !== null);
3220
+ function shouldProbeOnEnter(input) {
3221
+ if (input.checkedAt === null) return true;
3222
+ return input.now - input.checkedAt >= input.staleMs;
3223
+ }
3224
+ //#endregion
3225
+ //#region src/app/layouts/rightbar/market-settle.ts
3226
+ var MODULE_SETTLE_MS = 15e3;
3227
+ function holdBack(installed, roster, active, previous) {
3228
+ const pending = installed.filter((unit) => !roster.has(unit));
3229
+ const fresh = previous === null ? [] : pending.filter((unit) => !previous.has(unit));
3230
+ return pending.filter((unit) => active.has(unit) || fresh.includes(unit));
3231
+ }
3232
+ var WORKBENCH_SWAP_MS = 18e4;
3233
+ function swapLanded(until, installed) {
3234
+ return until !== void 0 && installed === until;
3235
+ }
3236
+ function swapUntil(action, application, latest) {
3237
+ if (action !== "update-workbench" || application !== "restart-required") return void 0;
3238
+ return latest;
3239
+ }
3240
+ var READ_BACK_ACTIONS = /* @__PURE__ */ new Set(["update", "update-bundle"]);
3241
+ function awaitsReadBack(action, application, version) {
3242
+ return application === "applied" && version !== void 0 && READ_BACK_ACTIONS.has(action);
3978
3243
  }
3979
- function fixtureRoster(roster) {
3980
- return hasCard(roster) ? roster : SAMPLE_ROSTER;
3244
+ function readBackDone(input) {
3245
+ if (input.action === "update") return !input.outdated;
3246
+ if (input.entry === void 0 || input.entry.local === true || input.entry.latest === void 0) return true;
3247
+ if (input.entry.latest === input.entry.installed) return true;
3248
+ if (input.clicked === void 0) return true;
3249
+ return input.entry.installed !== input.clicked;
3981
3250
  }
3982
- function boardModuleOf(face) {
3983
- const module = toBoardModule(face, face.manifest);
3984
- return module === void 0 ? [] : [module];
3251
+ function settleLanded(input) {
3252
+ if (input.until !== void 0) return swapLanded(input.until, input.installed);
3253
+ if (input.readBack !== true) return true;
3254
+ return readBackDone({
3255
+ action: input.action,
3256
+ entry: input.entry,
3257
+ clicked: input.clicked,
3258
+ outdated: input.outdated
3259
+ });
3985
3260
  }
3986
- function fixtureSeed(roster, all, crash = false) {
3987
- const base = hasCard(roster) ? all : boardModuleOf(FIXTURE_FACE);
3988
- return crash ? [...boardModuleOf(CRASH_FACE), ...base] : base;
3261
+ function holdWindowMs(until) {
3262
+ return until === void 0 ? MODULE_SETTLE_MS : WORKBENCH_SWAP_MS;
3989
3263
  }
3990
3264
  //#endregion
3991
3265
  //#region src/app/layouts/rightbar/market-shared-rows.ts
@@ -4638,7 +3912,7 @@ window.__ModuleLoader__.load({
4638
3912
  var SIZE = 18;
4639
3913
  function packageIcon(kind) {
4640
3914
  switch (kind) {
4641
- case "module": return h(_deepseek_ai_dsh_client_ui_primitives.IconArchiveOutlineRegular, { size: SIZE });
3915
+ case "module": return h(IconModuleMark, { size: SIZE });
4642
3916
  case "plugin": return h(IconOpencli, { size: SIZE });
4643
3917
  case "lib": return h(IconNpm, { size: SIZE });
4644
3918
  case "workbench": return h(IconPanelScreen, { size: SIZE });
@@ -5968,285 +5242,6 @@ window.__ModuleLoader__.load({
5968
5242
  }, t("panels.market.add.failed", { reason })) : kind === "restart" ? /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h("p", { className: AddModule_module_default.resultWarn }, t("panels.market.add.doneRestart")), why === void 0 ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.resultMeta }, why)) : kind === "quiet" ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.result }, t("panels.market.add.tookEffect")), builds.length === 0 ? null : /* @__PURE__ */ h("div", { className: AddModule_module_default.approval }, /* @__PURE__ */ h("p", { className: AddModule_module_default.approvalTitle }, t("panels.market.add.approveTitle")), /* @__PURE__ */ h("p", { className: AddModule_module_default.approvalText }, t("panels.market.add.approveHint", { packages: builds.join("、") })), /* @__PURE__ */ h("p", { className: AddModule_module_default.approvalCaution }, t("panels.market.add.approveCaution"))), supply === void 0 || outcome.supply.state !== "failed" && (kind === "failed" || kind === "cancelled") ? null : /* @__PURE__ */ h("p", { className: supplyTone(outcome.supply.state) }, t(supply, { reason: outcome.supply.reason ?? "" })), state.failure === null ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.problem }, state.failure), outcome.change.errorDetail === void 0 ? null : /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h("p", { className: AddModule_module_default.detailLabel }, t("panels.market.add.details")), /* @__PURE__ */ h("p", { className: AddModule_module_default.detail }, outcome.change.errorDetail)));
5969
5243
  }
5970
5244
  //#endregion
5971
- //#region src/app/layouts/market/add-module-mock.ts
5972
- function change(over) {
5973
- return {
5974
- application: "applied",
5975
- stage: "install",
5976
- changed: true,
5977
- target: "@dsh-workbench/module-hello",
5978
- ...over
5979
- };
5980
- }
5981
- function outcome(over, supply = { state: "installed" }) {
5982
- return {
5983
- change: change(over),
5984
- module: {
5985
- kind: "module",
5986
- pkg: "@dsh-workbench/module-hello",
5987
- unit: "hello",
5988
- version: "0.1.2"
5989
- },
5990
- supply
5991
- };
5992
- }
5993
- function refused(problem, reason = "") {
5994
- return {
5995
- id: `refused-${problem}`,
5996
- label: `预检拒:${problem}`,
5997
- phase: "idle",
5998
- spec: "@dsh-workbench/module-nope",
5999
- problem: {
6000
- problem,
6001
- reason
6002
- }
6003
- };
6004
- }
6005
- var ADD_MODULE_MOCKS = [
6006
- {
6007
- id: "empty",
6008
- label: "刚打开",
6009
- phase: "idle",
6010
- spec: ""
6011
- },
6012
- {
6013
- id: "typed",
6014
- label: "填了包名",
6015
- phase: "idle",
6016
- spec: "@dsh-workbench/module-hello"
6017
- },
6018
- {
6019
- id: "guide",
6020
- label: "展开了示例",
6021
- phase: "idle",
6022
- spec: "",
6023
- guideOpen: true
6024
- },
6025
- {
6026
- id: "inspecting",
6027
- label: "正在预检",
6028
- phase: "inspecting",
6029
- spec: "@dsh-workbench/module-hello"
6030
- },
6031
- refused("invalid-spec"),
6032
- refused("already-installed", "已经在 profile 里:@dsh-workbench/module-hello@0.1.2"),
6033
- refused("not-found"),
6034
- refused("not-a-package"),
6035
- refused("not-a-bundle"),
6036
- refused("not-a-module-or-plugin", "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上"),
6037
- refused("network", "getaddrinfo ENOTFOUND registry.example.com"),
6038
- refused("unknown", "pnpm 的返回码是 1"),
6039
- {
6040
- id: "preview",
6041
- label: "预览(可装)",
6042
- phase: "preview",
6043
- spec: "@dsh-workbench/module-hello",
6044
- preview: {
6045
- kind: "module",
6046
- name: "@dsh-workbench/module-hello",
6047
- version: "0.1.2",
6048
- description: "最小样本模块:一枚「你好」卡片",
6049
- registry: "registry.npmmirror.com"
6050
- }
6051
- },
6052
- {
6053
- id: "preview-no-source",
6054
- label: "预览(问不出源)",
6055
- phase: "preview",
6056
- spec: "@dsh-workbench/module-hello",
6057
- preview: {
6058
- kind: "module",
6059
- name: "@dsh-workbench/module-hello",
6060
- version: "",
6061
- description: "",
6062
- registry: ""
6063
- }
6064
- },
6065
- {
6066
- id: "preview-plugin",
6067
- label: "预览(opencli 插件)",
6068
- phase: "preview",
6069
- spec: "opencli-plugin-grafana",
6070
- preview: {
6071
- kind: "plugin",
6072
- name: "opencli-plugin-grafana",
6073
- version: "1.0.16",
6074
- description: "",
6075
- registry: "registry.npmmirror.com",
6076
- pluginName: "grafana"
6077
- }
6078
- },
6079
- {
6080
- id: "installing",
6081
- label: "正在安装(可取消)",
6082
- phase: "installing",
6083
- spec: "@dsh-workbench/module-hello"
6084
- },
6085
- {
6086
- id: "needs-approval",
6087
- label: "安装脚本待批",
6088
- phase: "result",
6089
- spec: "@dsh-workbench/module-hello",
6090
- outcome: {
6091
- ...outcome({
6092
- application: "failed",
6093
- stage: "install",
6094
- errorCode: "build-blocked",
6095
- pendingBuilds: ["esbuild", "sharp"]
6096
- }),
6097
- supply: {
6098
- state: "failed",
6099
- reason: "装上之前得先允许安装脚本"
6100
- }
6101
- }
6102
- },
6103
- {
6104
- id: "failed-registry",
6105
- label: "失败:源上没有",
6106
- phase: "result",
6107
- spec: "@dsh-workbench/module-nope",
6108
- outcome: outcome({
6109
- application: "failed",
6110
- stage: "install",
6111
- failedAt: "registry",
6112
- errorCode: "not-found"
6113
- })
6114
- },
6115
- {
6116
- id: "failed-pnpm",
6117
- label: "失败:pnpm 执行出错",
6118
- phase: "result",
6119
- spec: "@dsh-workbench/module-hello",
6120
- outcome: outcome({
6121
- application: "failed",
6122
- stage: "install",
6123
- errorCode: "operation-error",
6124
- errorDetail: "ERR_PNPM_FETCH_404 GET https://registry.example.com/@dsh-workbench%2Fmodule-hello: Not Found"
6125
- })
6126
- },
6127
- {
6128
- id: "done-applied",
6129
- label: "装好了(已生效)",
6130
- phase: "result",
6131
- spec: "@dsh-workbench/module-hello",
6132
- outcome: outcome({})
6133
- },
6134
- {
6135
- id: "done-plugin",
6136
- label: "装好了(opencli 插件)",
6137
- phase: "result",
6138
- spec: "opencli-plugin-cmdb",
6139
- outcome: {
6140
- change: change({ target: "opencli-plugin-cmdb" }),
6141
- module: {
6142
- kind: "unknown",
6143
- pkg: "opencli-plugin-cmdb"
6144
- },
6145
- supply: { state: "no-needs" },
6146
- plugin: {
6147
- kind: "opencli-plugin",
6148
- pkg: "opencli-plugin-cmdb",
6149
- name: "cmdb"
6150
- }
6151
- }
6152
- },
6153
- {
6154
- id: "done-restart",
6155
- label: "装好了(要重启,并说清是哪种:这一格是「某个已装的包换了目录」)",
6156
- phase: "result",
6157
- spec: "@dsh-workbench/module-hello",
6158
- outcome: outcome({
6159
- application: "restart-required",
6160
- restartReason: "package-moved"
6161
- }, { state: "pending-restart" })
6162
- },
6163
- {
6164
- id: "not-a-module",
6165
- label: "装进来的不是模块",
6166
- phase: "result",
6167
- spec: "some-random-package",
6168
- outcome: {
6169
- change: change({ target: "some-random-package" }),
6170
- module: {
6171
- kind: "not-module",
6172
- pkg: "some-random-package"
6173
- },
6174
- supply: { state: "not-a-module" }
6175
- }
6176
- },
6177
- {
6178
- id: "cancelled",
6179
- label: "已取消",
6180
- phase: "result",
6181
- spec: "@dsh-workbench/module-hello",
6182
- outcome: outcome({
6183
- application: "cancelled",
6184
- changed: false
6185
- }, { state: "no-needs" })
6186
- },
6187
- {
6188
- id: "done-no-needs",
6189
- label: "装好了(不要额外供给)",
6190
- phase: "result",
6191
- spec: "@dsh-workbench/module-plain",
6192
- outcome: {
6193
- change: change({ target: "@dsh-workbench/module-plain" }),
6194
- module: {
6195
- kind: "module",
6196
- pkg: "@dsh-workbench/module-plain",
6197
- unit: "plain",
6198
- version: "1.0.0"
6199
- },
6200
- supply: { state: "no-needs" }
6201
- }
6202
- },
6203
- {
6204
- id: "removed",
6205
- label: "移除掉了",
6206
- phase: "result",
6207
- spec: "some-random-package",
6208
- outcome: {
6209
- change: change({
6210
- stage: "remove",
6211
- target: "some-random-package"
6212
- }),
6213
- module: {
6214
- kind: "not-module",
6215
- pkg: "some-random-package"
6216
- },
6217
- supply: { state: "not-a-module" }
6218
- }
6219
- }
6220
- ];
6221
- var frozen = () => {};
6222
- function stateOfMock(base, mock) {
6223
- return {
6224
- ...base,
6225
- spec: mock.spec,
6226
- guideOpen: mock.guideOpen ?? false,
6227
- phase: mock.phase,
6228
- choices: base.choices,
6229
- custom: "",
6230
- registryOpen: false,
6231
- problem: mock.problem ?? null,
6232
- preview: mock.preview ?? null,
6233
- outcome: mock.outcome ?? null,
6234
- failure: mock.failure ?? null,
6235
- builds: mock.outcome?.change.pendingBuilds ?? [],
6236
- setSpec: frozen,
6237
- setChoice: frozen,
6238
- setCustom: frozen,
6239
- toggleRegistry: frozen,
6240
- closeRegistry: frozen,
6241
- toggleGuide: frozen,
6242
- check: frozen,
6243
- edit: frozen,
6244
- install: frozen,
6245
- cancelInstall: frozen,
6246
- removeIt: frozen
6247
- };
6248
- }
6249
- //#endregion
6250
5245
  //#region src/app/layouts/market/use-add-module.ts
6251
5246
  function newRequestId() {
6252
5247
  return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
@@ -6446,12 +5441,9 @@ window.__ModuleLoader__.load({
6446
5441
  onInstalled,
6447
5442
  failedText: t("panels.failed")
6448
5443
  });
6449
- const pick = useFixturePick({
6450
- fixtures: ADD_MODULE_MOCKS,
6451
- initial: ADD_MODULE_MOCKS[0]?.id ?? null
6452
- });
6453
- const mock = pick.enabled ? pick.current : void 0;
6454
- const state = mock === void 0 ? real : stateOfMock(real, mock);
5444
+ const devAdd = devSurface.useStrips("addModule", []);
5445
+ const mock = devAdd.current;
5446
+ const state = mock === void 0 ? real : devSurface.addModuleState(real, mock);
6455
5447
  if (!open) return null;
6456
5448
  const installing = state.phase === "installing";
6457
5449
  const checking = state.phase === "inspecting";
@@ -6528,12 +5520,7 @@ window.__ModuleLoader__.load({
6528
5520
  className: AddModule_module_default.dialog,
6529
5521
  contentClassName: AddModule_module_default.content,
6530
5522
  footer
6531
- }, /* @__PURE__ */ h("div", { className: AddModule_module_default.stack }, pick.enabled ? /* @__PURE__ */ h(MockStrip, {
6532
- mocks: ADD_MODULE_MOCKS,
6533
- index: pick.index,
6534
- note: "夹具:只切状态,不发请求",
6535
- onPick: (at) => pick.pick(ADD_MODULE_MOCKS[at]?.id ?? null)
6536
- }) : null, state.phase === "idle" ? /* @__PURE__ */ h(AddModuleForm, {
5523
+ }, /* @__PURE__ */ h("div", { className: AddModule_module_default.stack }, devAdd.strip, state.phase === "idle" ? /* @__PURE__ */ h(AddModuleForm, {
6537
5524
  t,
6538
5525
  state
6539
5526
  }) : null, state.phase === "inspecting" ? /* @__PURE__ */ h(AddModulePending, {
@@ -6641,13 +5628,9 @@ window.__ModuleLoader__.load({
6641
5628
  checking: true,
6642
5629
  checkedAt: null
6643
5630
  };
6644
- const marketMocks = useMemo(() => buildMarketMocks(fixtureRoster(manifests)), [manifests]);
6645
- const fixturePick = useFixturePick({
6646
- fixtures: marketMocks,
6647
- initial: marketMocks[0]?.id ?? null
6648
- });
6649
- const mock = fixturePick.enabled ? fixturePick.current : void 0;
6650
- const mockNonce = fixturePick.nonce;
5631
+ const devMarket = devSurface.useStrips("market", manifests);
5632
+ const mock = devMarket.current;
5633
+ const mockNonce = devMarket.pick.nonce;
6651
5634
  const shownFreshness = mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS;
6652
5635
  const shownRead = mock === void 0 ? installedRead : mock.installedRead ?? true;
6653
5636
  const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking || acting;
@@ -6670,11 +5653,7 @@ window.__ModuleLoader__.load({
6670
5653
  icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutlineRegular, { size: 13 }),
6671
5654
  disabled: busy,
6672
5655
  onClick: openAddModule
6673
- }, t("panels.market.add.open")))), fixturePick.enabled ? /* @__PURE__ */ h(MockStrip, {
6674
- mocks: marketMocks,
6675
- index: fixturePick.index,
6676
- onPick: (at) => fixturePick.pick(marketMocks[at]?.id ?? null)
6677
- }) : null, /* @__PURE__ */ h(MarketView, {
5656
+ }, t("panels.market.add.open")))), devMarket.strip, /* @__PURE__ */ h(MarketView, {
6678
5657
  key: `${mock?.id ?? "real-market"}-${mockNonce}`,
6679
5658
  t,
6680
5659
  manifests,
@@ -7166,6 +6145,9 @@ window.__ModuleLoader__.load({
7166
6145
  function isWorkshopPath(path) {
7167
6146
  return path.replace(/\\/g, "/").replace(/\/+$/, "").endsWith(`/${WORKSHOP_RELATIVE}`);
7168
6147
  }
6148
+ function diyStartOptions(workspaceId, workshopId) {
6149
+ return workshopId !== void 0 && workshopId === workspaceId ? { agentPreset: DIY_PRESET_ID } : void 0;
6150
+ }
7169
6151
  //#endregion
7170
6152
  //#region src/app/units/index.ts
7171
6153
  var CLIENT_UNITS = [];
@@ -7173,6 +6155,182 @@ window.__ModuleLoader__.load({
7173
6155
  for (const face of CLIENT_UNITS) registry.register(face);
7174
6156
  }
7175
6157
  //#endregion
6158
+ //#region src/app/layouts/rightbar/registry.ts
6159
+ function createBoardRegistry() {
6160
+ const modules = [];
6161
+ const listeners = /* @__PURE__ */ new Set();
6162
+ let revision = 0;
6163
+ let sorted = [];
6164
+ let index = /* @__PURE__ */ new Map();
6165
+ let steps = /* @__PURE__ */ new Map();
6166
+ function rebuild() {
6167
+ sorted = [...modules].sort((a, b) => a.order - b.order || a.id.localeCompare(b.id));
6168
+ index = new Map(sorted.map((module) => [module.id, module]));
6169
+ const table = /* @__PURE__ */ new Map();
6170
+ for (const module of sorted) for (const kind of Object.keys(module.steps ?? {})) {
6171
+ const owner = table.get(kind);
6172
+ if (owner !== void 0) throw new Error(`看板层名重复:${kind}(${owner.id} 与 ${module.id} 都声明了它)`);
6173
+ table.set(kind, module);
6174
+ }
6175
+ steps = table;
6176
+ }
6177
+ function notify() {
6178
+ revision += 1;
6179
+ for (const listener of listeners) listener();
6180
+ }
6181
+ return {
6182
+ register(module) {
6183
+ if (modules.some((item) => item.id === module.id)) throw new Error(`看板模块 id 重复:${module.id}(id 会进持久化配置,不能撞)`);
6184
+ modules.push(module);
6185
+ try {
6186
+ rebuild();
6187
+ } catch (error) {
6188
+ modules.pop();
6189
+ rebuild();
6190
+ throw error;
6191
+ }
6192
+ notify();
6193
+ return () => {
6194
+ const at = modules.indexOf(module);
6195
+ if (at < 0) return;
6196
+ modules.splice(at, 1);
6197
+ rebuild();
6198
+ notify();
6199
+ };
6200
+ },
6201
+ all: () => sorted,
6202
+ byId: (id) => index.get(id),
6203
+ stepOwner: (kind) => steps.get(kind),
6204
+ subscribe(listener) {
6205
+ listeners.add(listener);
6206
+ return () => listeners.delete(listener);
6207
+ },
6208
+ version: () => revision
6209
+ };
6210
+ }
6211
+ //#endregion
6212
+ //#region src/app/units/registry.ts
6213
+ function toBoardModule(face, manifest) {
6214
+ const View = face.card;
6215
+ if (View === void 0) return void 0;
6216
+ return {
6217
+ id: manifest.id,
6218
+ titleKey: manifest.card?.titleKey ?? manifest.id,
6219
+ order: manifest.card?.order ?? 100,
6220
+ View,
6221
+ ...face.steps === void 0 ? {} : { steps: face.steps }
6222
+ };
6223
+ }
6224
+ function createClientUnitRegistry(options = {}) {
6225
+ const registrations = [];
6226
+ const refusals = [];
6227
+ const listeners = /* @__PURE__ */ new Set();
6228
+ const board = createBoardRegistry();
6229
+ let known = /* @__PURE__ */ new Map();
6230
+ let installableIds = null;
6231
+ let revision = 0;
6232
+ let manifestsCache;
6233
+ function notify() {
6234
+ revision += 1;
6235
+ for (const listener of [...listeners]) try {
6236
+ listener();
6237
+ } catch (error) {
6238
+ console.warn(`[dsh-workbench] 套件注册的订阅者报错(不影响其它订阅者与这次注册):${String(error)}`);
6239
+ }
6240
+ }
6241
+ function warnRefusal(unit, kind, reasons) {
6242
+ refusals.push({
6243
+ unit,
6244
+ kind,
6245
+ reasons
6246
+ });
6247
+ console.warn(`[dsh-workbench] ${unit === "" ? "这个模块" : unit} 的卡片没挂上:${reasons.join(";")}`);
6248
+ }
6249
+ function takeBackRefusal(unit) {
6250
+ for (let at = refusals.length - 1; at >= 0; at -= 1) if (refusals[at]?.unit === unit) refusals.splice(at, 1);
6251
+ }
6252
+ function attach(entry) {
6253
+ const manifest = known.get(entry.unit);
6254
+ if (manifest === void 0) return false;
6255
+ const boardModule = toBoardModule(entry.face, manifest);
6256
+ entry.mounted = {
6257
+ manifest,
6258
+ unmount: boardModule === void 0 ? () => {} : board.register(boardModule)
6259
+ };
6260
+ takeBackRefusal(entry.unit);
6261
+ return true;
6262
+ }
6263
+ function detach(entry) {
6264
+ entry.mounted?.unmount();
6265
+ entry.mounted = null;
6266
+ }
6267
+ return {
6268
+ register(face) {
6269
+ const unit = typeof face?.unit === "string" ? face.unit.trim() : "";
6270
+ if (unit === "") {
6271
+ warnRefusal("", "old-shape", ["registerUnit({ unit, card }) 里的 unit 是空的 —— U1b 之前的旧形状是 registerUnit({ manifest, card });现在清单由外壳从**已装清单**读出来、按 unit 交给浏览器(ADR-0038 §2.2)"]);
6272
+ notify();
6273
+ return () => {};
6274
+ }
6275
+ if (registrations.some((entry) => entry.unit === unit)) throw new Error(`套件 id 重复:${unit}(id 会进持久化配置,不能撞)`);
6276
+ const entry = {
6277
+ face,
6278
+ unit,
6279
+ mounted: null
6280
+ };
6281
+ registrations.push(entry);
6282
+ manifestsCache = void 0;
6283
+ if (!attach(entry)) {
6284
+ warnRefusal(unit, "no-manifest", [`宿主没有担保 unit「${unit}」的清单 —— 这个包要么没装进这份 profile,要么它的 dsh.workbench 没通过校验。卡片先不挂:清单只有一处真相(ADR-0038 §2.2)`]);
6285
+ options.onUnknownUnit?.(unit);
6286
+ }
6287
+ notify();
6288
+ return () => {
6289
+ const at = registrations.indexOf(entry);
6290
+ if (at < 0) return;
6291
+ registrations.splice(at, 1);
6292
+ detach(entry);
6293
+ takeBackRefusal(unit);
6294
+ manifestsCache = void 0;
6295
+ notify();
6296
+ };
6297
+ },
6298
+ all: () => registrations.map((entry) => entry.face),
6299
+ manifests: () => {
6300
+ manifestsCache ??= registrations.flatMap((entry) => entry.mounted === null ? [] : [entry.mounted.manifest]);
6301
+ return manifestsCache;
6302
+ },
6303
+ refusals: () => refusals,
6304
+ installable: () => installableIds,
6305
+ setManifests(manifests, installable) {
6306
+ known = new Map(manifests.map((manifest) => [manifest.id, manifest]));
6307
+ installableIds = installable === void 0 ? null : new Set(installable);
6308
+ let changed = false;
6309
+ for (const entry of registrations) {
6310
+ const next = known.get(entry.unit);
6311
+ if (entry.mounted === null) {
6312
+ if (next !== void 0 && attach(entry)) changed = true;
6313
+ continue;
6314
+ }
6315
+ if (next === void 0) {
6316
+ detach(entry);
6317
+ warnRefusal(entry.unit, "withdrawn", [`宿主不再担保 unit「${entry.unit}」的清单(模块被卸了?)—— 这张卡片先摘下来`]);
6318
+ changed = true;
6319
+ }
6320
+ }
6321
+ if (!changed) return;
6322
+ manifestsCache = void 0;
6323
+ notify();
6324
+ },
6325
+ board,
6326
+ subscribe(listener) {
6327
+ listeners.add(listener);
6328
+ return () => listeners.delete(listener);
6329
+ },
6330
+ version: () => revision
6331
+ };
6332
+ }
6333
+ //#endregion
7176
6334
  //#region src/shared/api/unit-manifests.ts
7177
6335
  var UNIT_MANIFESTS_ROUTE = "unit-manifests";
7178
6336
  //#endregion
@@ -7336,281 +6494,12 @@ window.__ModuleLoader__.load({
7336
6494
  svg.append(group);
7337
6495
  return svg;
7338
6496
  }
7339
- function el$1(tag, className, text) {
7340
- const node = document.createElement(tag);
7341
- node.className = className;
7342
- if (text !== void 0) node.textContent = text;
7343
- return node;
7344
- }
7345
- //#endregion
7346
- //#region src/app/layouts/env-gate/gate-mock.ts
7347
- var INSTALL_COMMAND = "npm i --prefix '/Users/you/.dsh/workbench/opencli/toolchain' @jackwener/opencli@1.8.8";
7348
- var EXTENSION_REPORT = [
7349
- "[OK] Daemon: running on port 19825 (v1.8.8)",
7350
- "[MISSING] Extension: not connected",
7351
- "[OK] Connectivity: connected in 0.0s",
7352
- "",
7353
- "Issues:",
7354
- " • Daemon is running but the Chrome/Chromium extension is not connected.",
7355
- "If the extension is already installed, try: opencli daemon restart",
7356
- "If the extension is not installed:",
7357
- " 1. Download from https://github.com/jackwener/opencli/releases",
7358
- " 2. Open chrome://extensions/ → Enable Developer Mode",
7359
- " 3. Click \"Load unpacked\" → select the extension folder"
7360
- ].join("\n");
7361
- var DAEMON_REPORT = [
7362
- "[MISSING] Daemon: not running",
7363
- "[MISSING] Extension: not connected",
7364
- "[FAIL] Connectivity: failed (daemon not reachable)",
7365
- "",
7366
- "Issues:",
7367
- " • Daemon is not running. It should start automatically when you run an opencli browser command.",
7368
- " • Daemon is running but the Chrome/Chromium extension is not connected.",
7369
- "If the extension is already installed, try: opencli daemon restart"
7370
- ].join("\n");
7371
- var PROFILE_REPORT = [
7372
- "[OK] Daemon: running on port 19825 (v1.8.8)",
7373
- "[MISSING] Extension: not connected",
7374
- "[FAIL] Connectivity: failed (profile-required)",
7375
- "",
7376
- "Issues:",
7377
- " • Multiple Chrome profiles are connected to the daemon, but no default profile was selected.",
7378
- " Run opencli profile list, then opencli profile use <name>, or pass --profile <name>."
7379
- ].join("\n");
7380
- var AT = 1790574156506;
7381
- function mock(id, label, note, snapshot, expect) {
7382
- return {
7383
- id,
7384
- label,
7385
- note,
7386
- snapshot: {
7387
- ...snapshot,
7388
- at: AT
7389
- },
7390
- expect
7391
- };
7392
- }
7393
- var BRIDGE_PENDING = {
7394
- id: "bridge",
7395
- status: "pending"
7396
- };
7397
- var GATE_MOCKS = [
7398
- mock("boot", "刚立起来", "还没拿到体检结果的那一帧:只有标题 + 一句\"正在检测运行环境…\",一行步骤都还没有。", {
7399
- phase: "idle",
7400
- steps: []
7401
- }, {
7402
- hint: "checking",
7403
- command: false
7404
- }),
7405
- mock("checking", "检测中", "第一步在跑(转圈 + 它正在执行的命令),第二步还没轮到(短横)。", {
7406
- phase: "checking",
7407
- steps: [{
7408
- id: "opencli",
7409
- status: "running",
7410
- action: "opencli --version"
7411
- }, BRIDGE_PENDING]
7412
- }, {
7413
- hint: "checking",
7414
- command: false
7415
- }),
7416
- mock("installing", "安装中(npm 在跑)", "缺 opencli:正在装。右边会**数秒**(静止的圆点看不出在干活)。", {
7417
- phase: "installing",
7418
- steps: [{
7419
- id: "opencli",
7420
- status: "running",
7421
- action: INSTALL_COMMAND,
7422
- command: INSTALL_COMMAND
7423
- }, BRIDGE_PENDING]
7424
- }, {
7425
- hint: "installing",
7426
- command: false
7427
- }),
7428
- mock("ready", "都就绪(真机到这就放行)", "两步都过。这一帧之后 gate 立刻撤掉 —— 钉住它只是为了看一眼这两行长什么样。", {
7429
- phase: "ready",
7430
- steps: [{
7431
- id: "opencli",
7432
- status: "ok",
7433
- detail: "1.8.8"
7434
- }, {
7435
- id: "bridge",
7436
- status: "ok",
7437
- detail: "Everything looks good!"
7438
- }]
7439
- }, {
7440
- hint: "checking",
7441
- command: false
7442
- }),
7443
- mock("warn-extension", "浏览器通道:扩展没连上", "daemon 在跑、扩展没连上(最常见):行尾说\"没连上\",下面给「去应用商店装扩展」+ `daemon restart`,原文折叠当证据。", {
7444
- phase: "ready",
7445
- steps: [{
7446
- id: "opencli",
7447
- status: "ok",
7448
- detail: "1.8.8"
7449
- }, {
7450
- id: "bridge",
7451
- status: "warn",
7452
- detail: EXTENSION_REPORT,
7453
- command: "opencli daemon restart"
7454
- }],
7455
- bridgeIssues: ["extension"]
7456
- }, {
7457
- hint: "checking",
7458
- command: false,
7459
- bridgeIssues: ["extension"]
7460
- }),
7461
- mock("warn-daemon", "浏览器通道:服务没起来", "daemon 没起来(扩展跟着也连不上):两条人话都摆出来,命令给 `daemon restart`。", {
7462
- phase: "ready",
7463
- steps: [{
7464
- id: "opencli",
7465
- status: "ok",
7466
- detail: "1.8.8"
7467
- }, {
7468
- id: "bridge",
7469
- status: "warn",
7470
- detail: DAEMON_REPORT,
7471
- command: "opencli daemon restart"
7472
- }],
7473
- bridgeIssues: ["daemon", "extension"]
7474
- }, {
7475
- hint: "checking",
7476
- command: false,
7477
- bridgeIssues: ["daemon", "extension"]
7478
- }),
7479
- mock("warn-profile", "浏览器通道:没选默认 profile", "连了多个浏览器 profile 但没选默认:只说\"选哪个\"(重启服务解决不了它),命令给 `profile list`。", {
7480
- phase: "ready",
7481
- steps: [{
7482
- id: "opencli",
7483
- status: "ok",
7484
- detail: "1.8.8"
7485
- }, {
7486
- id: "bridge",
7487
- status: "warn",
7488
- detail: PROFILE_REPORT,
7489
- command: "opencli profile list"
7490
- }],
7491
- bridgeIssues: ["profile"]
7492
- }, {
7493
- hint: "checking",
7494
- command: false,
7495
- bridgeIssues: ["profile"]
7496
- }),
7497
- mock("failed-permission", "装不上:权限不足", "失败态:为什么需要它 → 确切命令(可复制)→ 照做能解决的一句人话(EACCES → 换目录 / sudo)。", {
7498
- phase: "failed",
7499
- steps: [{
7500
- id: "opencli",
7501
- status: "failed",
7502
- detail: "npm ERR! code EACCES",
7503
- command: INSTALL_COMMAND
7504
- }, BRIDGE_PENDING],
7505
- error: "npm ERR! code EACCES\nnpm ERR! syscall mkdir\nnpm ERR! path /usr/local/lib/node_modules",
7506
- failure: "permission",
7507
- guidance: "install"
7508
- }, {
7509
- hint: "failed",
7510
- guidance: "install",
7511
- command: true
7512
- }),
7513
- mock("failed-network", "装不上:网络不通", "同一档失败,但人话换成\"查代理\"那条(EAI_AGAIN / ENOTFOUND)。", {
7514
- phase: "failed",
7515
- steps: [{
7516
- id: "opencli",
7517
- status: "failed",
7518
- detail: "npm ERR! code EAI_AGAIN",
7519
- command: INSTALL_COMMAND
7520
- }, BRIDGE_PENDING],
7521
- error: "npm ERR! code EAI_AGAIN\nnpm ERR! network request to https://registry.npmjs.org failed",
7522
- failure: "network",
7523
- guidance: "install"
7524
- }, {
7525
- hint: "failed",
7526
- guidance: "install",
7527
- command: true
7528
- }),
7529
- mock("failed-unknown", "装不上:认不出的错", "认不出失败种类时**不编**建议:只给命令与原文(多一句假建议比少一句更糟)。", {
7530
- phase: "failed",
7531
- steps: [{
7532
- id: "opencli",
7533
- status: "failed",
7534
- detail: "something went wrong",
7535
- command: INSTALL_COMMAND
7536
- }, BRIDGE_PENDING],
7537
- error: "something went wrong",
7538
- failure: "unknown",
7539
- guidance: "install"
7540
- }, {
7541
- hint: "failed",
7542
- guidance: "install",
7543
- command: true
7544
- }),
7545
- mock("failed-path", "装了但还找不到", "装完了 `--version` 还是不行:**不再让用户装一遍**(PATH / 新终端的事),所以不给命令。", {
7546
- phase: "failed",
7547
- steps: [{
7548
- id: "opencli",
7549
- status: "failed",
7550
- detail: "zsh: command not found: opencli",
7551
- command: INSTALL_COMMAND
7552
- }, BRIDGE_PENDING],
7553
- error: "zsh: command not found: opencli",
7554
- failure: "missing",
7555
- guidance: "path"
7556
- }, {
7557
- hint: "failed",
7558
- guidance: "path",
7559
- command: false
7560
- }),
7561
- mock("failed-shell", "执行缝坏了", "连 shell 都调不动:装也不可能成功。没有\"正在执行的动作\"、也没有命令 —— 该做的是重启宿主。", {
7562
- phase: "failed",
7563
- steps: [{
7564
- id: "opencli",
7565
- status: "failed",
7566
- detail: "Error: spawn /bin/sh ENOENT"
7567
- }, BRIDGE_PENDING],
7568
- error: "Error: spawn /bin/sh ENOENT",
7569
- failure: "unknown",
7570
- guidance: "shell"
7571
- }, {
7572
- hint: "failed",
7573
- guidance: "shell",
7574
- command: false
7575
- })
7576
- ];
7577
6497
  function el(tag, className, text) {
7578
6498
  const node = document.createElement(tag);
7579
6499
  node.className = className;
7580
6500
  if (text !== void 0) node.textContent = text;
7581
6501
  return node;
7582
6502
  }
7583
- function mountGateMockStrip(options) {
7584
- const strip = el("div", `wb-mockStrip ${BootGate_module_default.mockSlot}`);
7585
- const note = el("span", "wb-mockNote");
7586
- const chips = [];
7587
- const paint = (active) => {
7588
- note.textContent = `夹具:钉住启动页的状态,不轮询、不放行 —— ${active?.note ?? "不接管:按真机走(就绪就放行)。"}`;
7589
- chips.forEach((chip) => {
7590
- chip.className = `wb-mockChip${chip.dataset.mock === active?.id ? " wb-mockChipOn" : ""}`;
7591
- });
7592
- };
7593
- const pick = (active) => {
7594
- paint(active);
7595
- options.onPick(active === null ? null : active.snapshot);
7596
- };
7597
- const real = el("button", "wb-mockChip", "真实");
7598
- real.setAttribute("type", "button");
7599
- real.dataset.mock = "";
7600
- real.addEventListener("click", () => pick(null));
7601
- strip.append(note, real);
7602
- chips.push(real);
7603
- for (const item of GATE_MOCKS) {
7604
- const chip = el("button", "wb-mockChip", item.label);
7605
- chip.setAttribute("type", "button");
7606
- chip.dataset.mock = item.id;
7607
- chip.addEventListener("click", () => pick(item));
7608
- strip.append(chip);
7609
- chips.push(chip);
7610
- }
7611
- pick(GATE_MOCKS[0] ?? null);
7612
- return strip;
7613
- }
7614
6503
  //#endregion
7615
6504
  //#region src/app/layouts/env-gate/boot-gate.ts
7616
6505
  var POLL_MS = 400;
@@ -7641,9 +6530,9 @@ window.__ModuleLoader__.load({
7641
6530
  };
7642
6531
  }
7643
6532
  function commandRow(t) {
7644
- const row = el$1("div", BootGate_module_default.commandRow);
7645
- const code = el$1("code", BootGate_module_default.command);
7646
- const copy = el$1("button", BootGate_module_default.copy);
6533
+ const row = el("div", BootGate_module_default.commandRow);
6534
+ const code = el("code", BootGate_module_default.command);
6535
+ const copy = el("button", BootGate_module_default.copy);
7647
6536
  copy.setAttribute("type", "button");
7648
6537
  copy.setAttribute("aria-label", t("env.copyCommand"));
7649
6538
  copy.title = t("env.copyCommand");
@@ -7676,47 +6565,47 @@ window.__ModuleLoader__.load({
7676
6565
  const request = options.request ?? apiGet;
7677
6566
  if (typeof document === "undefined" || typeof document.getElementById !== "function" || document.body === void 0) return { close: () => {} };
7678
6567
  const root = document.getElementById("root");
7679
- const overlay = el$1("div", BootGate_module_default.gate);
6568
+ const overlay = el("div", BootGate_module_default.gate);
7680
6569
  overlay.setAttribute("role", "dialog");
7681
6570
  overlay.setAttribute("aria-modal", "true");
7682
6571
  overlay.setAttribute("aria-label", t("env.title"));
7683
- const card = el$1("div", BootGate_module_default.card);
7684
- const title = el$1("h1", BootGate_module_default.title, t("env.title"));
7685
- const hint = el$1("p", BootGate_module_default.hint, t("env.checking"));
7686
- const list = el$1("ul", BootGate_module_default.steps);
7687
- const progressRow = el$1("div", BootGate_module_default.progress);
6572
+ const card = el("div", BootGate_module_default.card);
6573
+ const title = el("h1", BootGate_module_default.title, t("env.title"));
6574
+ const hint = el("p", BootGate_module_default.hint, t("env.checking"));
6575
+ const list = el("ul", BootGate_module_default.steps);
6576
+ const progressRow = el("div", BootGate_module_default.progress);
7688
6577
  progressRow.hidden = true;
7689
- const elapsed = el$1("span", BootGate_module_default.elapsed);
6578
+ const elapsed = el("span", BootGate_module_default.elapsed);
7690
6579
  progressRow.append(elapsed);
7691
- const actions = el$1("div", BootGate_module_default.actions);
6580
+ const actions = el("div", BootGate_module_default.actions);
7692
6581
  actions.hidden = true;
7693
- const fixTitle = el$1("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
7694
- const fixWhy = el$1("p", BootGate_module_default.hint);
7695
- const fixStep = el$1("p", BootGate_module_default.hint);
7696
- const fixAdvice = el$1("p", BootGate_module_default.hint);
7697
- const raw = el$1("details", BootGate_module_default.raw);
7698
- const rawSummary = el$1("summary", BootGate_module_default.rawSummary, t("env.fix.details"));
7699
- const errorBox = el$1("pre", BootGate_module_default.error);
6582
+ const fixTitle = el("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
6583
+ const fixWhy = el("p", BootGate_module_default.hint);
6584
+ const fixStep = el("p", BootGate_module_default.hint);
6585
+ const fixAdvice = el("p", BootGate_module_default.hint);
6586
+ const raw = el("details", BootGate_module_default.raw);
6587
+ const rawSummary = el("summary", BootGate_module_default.rawSummary, t("env.fix.details"));
6588
+ const errorBox = el("pre", BootGate_module_default.error);
7700
6589
  raw.append(rawSummary, errorBox);
7701
- const buttons = el$1("div", BootGate_module_default.buttons);
7702
- const retry = el$1("button", BootGate_module_default.button, t("env.retry"));
6590
+ const buttons = el("div", BootGate_module_default.buttons);
6591
+ const retry = el("button", BootGate_module_default.button, t("env.retry"));
7703
6592
  retry.setAttribute("type", "button");
7704
6593
  const fixCommand = commandRow(t);
7705
6594
  buttons.append(retry);
7706
6595
  actions.append(fixTitle, fixWhy, fixStep, fixCommand.row, fixAdvice, buttons, raw);
7707
- const bridge = el$1("div", BootGate_module_default.bridge);
6596
+ const bridge = el("div", BootGate_module_default.bridge);
7708
6597
  bridge.hidden = true;
7709
- const bridgeTitle = el$1("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
7710
- const bridgeWhy = el$1("p", BootGate_module_default.hint, t("env.bridge.why"));
7711
- const bridgeLines = el$1("ul", BootGate_module_default.bridgeLines);
6598
+ const bridgeTitle = el("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
6599
+ const bridgeWhy = el("p", BootGate_module_default.hint, t("env.bridge.why"));
6600
+ const bridgeLines = el("ul", BootGate_module_default.bridgeLines);
7712
6601
  const bridgeCommand = commandRow(t);
7713
- const bridgeRetry = el$1("button", BootGate_module_default.button, t("env.retry"));
6602
+ const bridgeRetry = el("button", BootGate_module_default.button, t("env.retry"));
7714
6603
  bridgeRetry.setAttribute("type", "button");
7715
- const bridgeButtons = el$1("div", BootGate_module_default.buttons);
6604
+ const bridgeButtons = el("div", BootGate_module_default.buttons);
7716
6605
  bridgeButtons.append(bridgeRetry);
7717
- const bridgeRaw = el$1("details", BootGate_module_default.raw);
7718
- const bridgeRawText = el$1("pre", BootGate_module_default.error);
7719
- bridgeRaw.append(el$1("summary", BootGate_module_default.rawSummary, t("env.fix.details")), bridgeRawText);
6606
+ const bridgeRaw = el("details", BootGate_module_default.raw);
6607
+ const bridgeRawText = el("pre", BootGate_module_default.error);
6608
+ bridgeRaw.append(el("summary", BootGate_module_default.rawSummary, t("env.fix.details")), bridgeRawText);
7720
6609
  bridge.append(bridgeTitle, bridgeWhy, bridgeLines, bridgeCommand.row, bridgeButtons, bridgeRaw);
7721
6610
  card.append(title, hint, list, progressRow, actions, bridge);
7722
6611
  overlay.append(card);
@@ -7762,16 +6651,16 @@ window.__ModuleLoader__.load({
7762
6651
  function ensureRow(step) {
7763
6652
  const existing = rows.get(step.id);
7764
6653
  if (existing !== void 0) return existing;
7765
- const item = el$1("li", BootGate_module_default.step);
7766
- const mark = el$1("span", BootGate_module_default.mark);
6654
+ const item = el("li", BootGate_module_default.step);
6655
+ const mark = el("span", BootGate_module_default.mark);
7767
6656
  mark.setAttribute("aria-hidden", "true");
7768
6657
  const row = {
7769
6658
  item,
7770
6659
  mark,
7771
- detail: el$1("span", BootGate_module_default.detail),
6660
+ detail: el("span", BootGate_module_default.detail),
7772
6661
  status: ""
7773
6662
  };
7774
- item.append(mark, el$1("span", BootGate_module_default.label, stepLabel$1(step.id, t)), row.detail);
6663
+ item.append(mark, el("span", BootGate_module_default.label, stepLabel$1(step.id, t)), row.detail);
7775
6664
  rows.set(step.id, row);
7776
6665
  return row;
7777
6666
  }
@@ -7818,7 +6707,7 @@ window.__ModuleLoader__.load({
7818
6707
  if (bridgeBroken && bridgeStep !== void 0) {
7819
6708
  bridgeLines.replaceChildren(...(snapshot.bridgeIssues ?? ["unknown"]).map((issue) => {
7820
6709
  const advice = bridgeAdvice(issue);
7821
- const item = el$1("li", BootGate_module_default.bridgeLine, t(advice.textKey));
6710
+ const item = el("li", BootGate_module_default.bridgeLine, t(advice.textKey));
7822
6711
  if (advice.link !== void 0) {
7823
6712
  const link = document.createElement("a");
7824
6713
  link.className = BootGate_module_default.link;
@@ -7867,8 +6756,9 @@ window.__ModuleLoader__.load({
7867
6756
  }
7868
6757
  retry.addEventListener("click", retryNow);
7869
6758
  bridgeRetry.addEventListener("click", retryNow);
7870
- if (mockModeOn(typeof window === "undefined" ? "" : window.location?.search ?? "")) {
7871
- const strip = mountGateMockStrip({ onPick: (snapshot) => {
6759
+ const search = typeof window === "undefined" ? "" : window.location?.search ?? "";
6760
+ if (devSurface.on(search)) {
6761
+ const strip = devSurface.gateStrip({ onPick: (snapshot) => {
7872
6762
  pinned = snapshot;
7873
6763
  if (snapshot !== null) {
7874
6764
  render(snapshot);
@@ -7876,7 +6766,7 @@ window.__ModuleLoader__.load({
7876
6766
  }
7877
6767
  poll();
7878
6768
  } });
7879
- overlay.append(strip);
6769
+ if (strip !== null) overlay.append(strip);
7880
6770
  }
7881
6771
  poll();
7882
6772
  return { close };
@@ -8211,18 +7101,6 @@ window.__ModuleLoader__.load({
8211
7101
  }, t("panels.browseMarket")))
8212
7102
  });
8213
7103
  }
8214
- //#endregion
8215
- //#region src/app/layouts/rightbar/BoardMockStrip.tsx
8216
- function BoardMockStrip({ fixtures, show }) {
8217
- const current = fixtures.mock;
8218
- if (!show || current === void 0) return null;
8219
- return /* @__PURE__ */ h(MockStrip, {
8220
- note: `夹具:只切形状,不碰真实配置;卡片上的数据看卡片夹具 —— ${current.note}`,
8221
- mocks: fixtures.mocks,
8222
- index: fixtures.index,
8223
- onPick: fixtures.pick
8224
- });
8225
- }
8226
7104
  var ModulesPage_module_default = {
8227
7105
  trigger: "_trigger_15ptp_1",
8228
7106
  pop: "_pop_15ptp_6",
@@ -8249,250 +7127,6 @@ window.__ModuleLoader__.load({
8249
7127
  groupTitle: "_groupTitle_15ptp_191"
8250
7128
  };
8251
7129
  //#endregion
8252
- //#region src/app/layouts/rightbar/panel-mock.ts
8253
- function row$1(id, titleKey, shown) {
8254
- return {
8255
- id,
8256
- titleKey,
8257
- shown,
8258
- source: "user",
8259
- hasCard: true
8260
- };
8261
- }
8262
- function noCardRow(id, titleKey) {
8263
- return {
8264
- id,
8265
- titleKey,
8266
- shown: false,
8267
- source: "user",
8268
- hasCard: false
8269
- };
8270
- }
8271
- function plugin(id, pkg, title, shown) {
8272
- return {
8273
- id,
8274
- pkg,
8275
- title,
8276
- shown,
8277
- source: "user"
8278
- };
8279
- }
8280
- var PLUGIN_MOCK = {
8281
- id: "plugin",
8282
- label: "opencli 插件行(标出是插件,能开能关)",
8283
- units: [],
8284
- plugins: [plugin("plugin:opencli-plugin-cmdb", "opencli-plugin-cmdb", "cmdb", true), plugin("plugin:opencli-plugin-notes", "opencli-plugin-notes", "notes", false)],
8285
- capabilities: {},
8286
- expect: { rows: 0 }
8287
- };
8288
- function probe(unit, status) {
8289
- return { [unit]: {
8290
- unit,
8291
- status,
8292
- required: [],
8293
- missing: [],
8294
- detail: "夹具"
8295
- } };
8296
- }
8297
- function buildPanelMocks(roster) {
8298
- const found = roster.find((manifest) => manifest.card !== null);
8299
- if (found === void 0) return [{
8300
- id: "empty",
8301
- label: "列表空(都卸了/都关了)",
8302
- units: [],
8303
- capabilities: {},
8304
- expect: { rows: 0 }
8305
- }, PLUGIN_MOCK];
8306
- const titleKey = found.card?.titleKey ?? found.id;
8307
- const id = found.id;
8308
- const on = row$1(id, titleKey, true);
8309
- const off = row$1(id, titleKey, false);
8310
- const twin = row$1(`${id}-b`, titleKey, true);
8311
- const third = row$1(`${id}-c`, titleKey, false);
8312
- return [
8313
- {
8314
- id: "one",
8315
- label: "一行:已启用、装好了",
8316
- units: [on],
8317
- capabilities: probe(id, "ok"),
8318
- expect: {
8319
- rows: 1,
8320
- badge: null,
8321
- on: true
8322
- }
8323
- },
8324
- {
8325
- id: "off",
8326
- label: "已停用(开关关着)",
8327
- units: [off],
8328
- capabilities: probe(id, "ok"),
8329
- expect: {
8330
- rows: 1,
8331
- badge: null,
8332
- on: false
8333
- }
8334
- },
8335
- {
8336
- id: "missing",
8337
- label: "⚠ 没装好 → 不列(去市场装)",
8338
- units: [on],
8339
- capabilities: probe(id, "missing-plugin"),
8340
- expect: { rows: 0 }
8341
- },
8342
- {
8343
- id: "outdated",
8344
- label: "⚠ 缺命令(也没装好)→ 同样不列",
8345
- units: [on],
8346
- capabilities: probe(id, "missing-commands"),
8347
- expect: { rows: 0 }
8348
- },
8349
- {
8350
- id: "unchecked",
8351
- label: "⚠ 检测不了",
8352
- units: [on],
8353
- capabilities: probe(id, "unchecked"),
8354
- expect: {
8355
- rows: 1,
8356
- badge: "panels.dep.unchecked",
8357
- on: true
8358
- }
8359
- },
8360
- {
8361
- id: "checking",
8362
- label: "还没探到(没有徽标)",
8363
- units: [on],
8364
- capabilities: null,
8365
- expect: {
8366
- rows: 1,
8367
- badge: null,
8368
- on: true
8369
- }
8370
- },
8371
- {
8372
- id: "many",
8373
- label: "三行(顺序 / 停用混着)",
8374
- units: [
8375
- on,
8376
- twin,
8377
- third
8378
- ],
8379
- capabilities: {
8380
- ...probe(id, "ok"),
8381
- ...probe(`${id}-b`, "ok"),
8382
- ...probe(`${id}-c`, "ok")
8383
- },
8384
- expect: {
8385
- rows: 3,
8386
- badge: null,
8387
- on: true
8388
- }
8389
- },
8390
- {
8391
- id: "no-card",
8392
- label: "没看板的模块(只有基座命令那种):也列出来、带「无看板」标签,开关照常能用,只是不参与排序",
8393
- units: [on, noCardRow(`${id}-c`, `${titleKey}(无看板)`)],
8394
- capabilities: {
8395
- ...probe(id, "ok"),
8396
- ...probe(`${id}-c`, "ok")
8397
- },
8398
- expect: {
8399
- rows: 2,
8400
- badge: null,
8401
- on: true
8402
- }
8403
- },
8404
- {
8405
- id: "long",
8406
- label: "超长模块名",
8407
- units: [row$1(id, "一个名字特别特别长的模块用来验证省略号会不会把开关挤下去", true)],
8408
- capabilities: probe(id, "ok"),
8409
- expect: {
8410
- rows: 1,
8411
- badge: null
8412
- }
8413
- },
8414
- {
8415
- id: "hidden",
8416
- label: "卸载后不显示(未启用 + 没装)",
8417
- units: [off],
8418
- capabilities: probe(id, "missing-plugin"),
8419
- expect: { rows: 0 }
8420
- },
8421
- {
8422
- id: "busy",
8423
- label: "正在改配置(开关禁用)",
8424
- units: [on, twin],
8425
- capabilities: {
8426
- ...probe(id, "ok"),
8427
- ...probe(`${id}-b`, "ok")
8428
- },
8429
- busy: true,
8430
- expect: { rows: 2 }
8431
- },
8432
- {
8433
- id: "failed",
8434
- label: "改配置失败(红字)",
8435
- units: [on],
8436
- capabilities: probe(id, "ok"),
8437
- failed: true,
8438
- expect: { rows: 1 }
8439
- },
8440
- {
8441
- id: "drag",
8442
- label: "拖动中的落点提示",
8443
- units: [
8444
- on,
8445
- twin,
8446
- third
8447
- ],
8448
- capabilities: {
8449
- ...probe(id, "ok"),
8450
- ...probe(`${id}-b`, "ok"),
8451
- ...probe(`${id}-c`, "ok")
8452
- },
8453
- drag: {
8454
- from: 1,
8455
- over: 0,
8456
- at: {
8457
- x: 1230,
8458
- y: 300
8459
- }
8460
- },
8461
- expect: {
8462
- rows: 3,
8463
- on: true
8464
- }
8465
- },
8466
- {
8467
- id: "drag-off",
8468
- label: "拖到未开启的那一行上:落点不亮(松手也不动)",
8469
- units: [
8470
- on,
8471
- twin,
8472
- third
8473
- ],
8474
- capabilities: {
8475
- ...probe(id, "ok"),
8476
- ...probe(`${id}-b`, "ok"),
8477
- ...probe(`${id}-c`, "ok")
8478
- },
8479
- drag: {
8480
- from: 0,
8481
- over: null,
8482
- at: {
8483
- x: 1230,
8484
- y: 300
8485
- }
8486
- },
8487
- expect: {
8488
- rows: 3,
8489
- on: true
8490
- }
8491
- },
8492
- PLUGIN_MOCK
8493
- ];
8494
- }
8495
- //#endregion
8496
7130
  //#region src/app/layouts/rightbar/board-selection.ts
8497
7131
  function available(capability) {
8498
7132
  if (capability === void 0) return true;
@@ -8868,13 +7502,9 @@ window.__ModuleLoader__.load({
8868
7502
  forceProbe
8869
7503
  ]);
8870
7504
  const root = useRef(null);
8871
- const panelMocks = useMemo(() => buildPanelMocks(fixtureRoster(manifests)), [manifests]);
8872
- const fixturePick = useFixturePick({
8873
- fixtures: panelMocks,
8874
- initial: panelMocks[0]?.id ?? null
8875
- });
8876
- const panelMock = fixturePick.enabled ? fixturePick.current : void 0;
8877
- const mockNonce = fixturePick.nonce;
7505
+ const devPanel = devSurface.useStrips("panel", manifests);
7506
+ const panelMock = devPanel.current;
7507
+ const mockNonce = devPanel.pick.nonce;
8878
7508
  (0, _deepseek_ai_dsh_client_ui_primitives.useDismissOnOutsidePointer)(root, open, (next) => dismissPanelByPointer(next, document, onOpenChange));
8879
7509
  const units = enabledUnits?.units ?? [];
8880
7510
  return /* @__PURE__ */ h("div", {
@@ -8893,20 +7523,16 @@ window.__ModuleLoader__.load({
8893
7523
  className: ModulesPage_module_default.pop,
8894
7524
  role: "dialog",
8895
7525
  "aria-label": t("panels.title")
8896
- }, /* @__PURE__ */ h("header", { className: ModulesPage_module_default.head }, /* @__PURE__ */ h("span", { className: ModulesPage_module_default.title }, t("panels.tab.modules"))), fixturePick.enabled ? /* @__PURE__ */ h(MockStrip, {
8897
- mocks: panelMocks,
8898
- index: fixturePick.index,
8899
- onPick: (at) => fixturePick.pick(panelMocks[at]?.id ?? null)
8900
- }) : null, /* @__PURE__ */ h(ModulesPage, {
7526
+ }, /* @__PURE__ */ h("header", { className: ModulesPage_module_default.head }, /* @__PURE__ */ h("span", { className: ModulesPage_module_default.title }, t("panels.tab.modules"))), devPanel.strip, /* @__PURE__ */ h(ModulesPage, {
8901
7527
  key: `${panelMock?.id ?? "real-modules"}-${mockNonce}`,
8902
7528
  t,
8903
7529
  units: panelMock?.units ?? units,
8904
7530
  plugins: panelMock?.plugins ?? enabledUnits?.plugins ?? [],
8905
- capabilities: panelMock === void 0 ? fixturePick.enabled ? null : capabilities : panelMock.capabilities,
7531
+ capabilities: panelMock === void 0 ? devPanel.enabled ? null : capabilities : panelMock.capabilities,
8906
7532
  loading: enabledUnits === null,
8907
7533
  own: enabledUnits?.own === true,
8908
7534
  onOpenMarket,
8909
- mocked: fixturePick.enabled,
7535
+ mocked: devPanel.enabled,
8910
7536
  workspace,
8911
7537
  mock: panelMock
8912
7538
  })) : null);
@@ -8927,106 +7553,6 @@ window.__ModuleLoader__.load({
8927
7553
  return splitBoardColumns(items);
8928
7554
  }
8929
7555
  //#endregion
8930
- //#region src/app/layouts/rightbar/board-mock.ts
8931
- var REAL = {
8932
- id: "real",
8933
- label: "真实",
8934
- note: "不接管:宿主配置里开着什么就摆什么。",
8935
- shape: { kind: "real" }
8936
- };
8937
- var EMPTY = {
8938
- id: "empty",
8939
- label: "空看板",
8940
- note: "一个模块都没开:内容区那条空态与它的两条出路。",
8941
- shape: { kind: "empty" },
8942
- expect: {
8943
- cards: 0,
8944
- empty: true
8945
- }
8946
- };
8947
- var UNREAD = {
8948
- id: "unread",
8949
- label: "配置还没读到",
8950
- note: "还没读到配置:内容区说一句\"正在读取面板配置…\",头部 ⟳ 留着(按一下立刻重读)。",
8951
- shape: { kind: "unread" },
8952
- expect: {
8953
- cards: 0,
8954
- empty: false
8955
- }
8956
- };
8957
- function buildBoardMocks(roster) {
8958
- return [
8959
- REAL,
8960
- ...!roster.some((manifest) => manifest.card !== null) ? [] : [
8961
- {
8962
- id: "one",
8963
- label: "一张卡",
8964
- note: "常态:面板上只有一个模块时的样子。",
8965
- shape: {
8966
- kind: "copies",
8967
- count: 1
8968
- },
8969
- expect: {
8970
- cards: 1,
8971
- empty: false
8972
- }
8973
- },
8974
- {
8975
- id: "two",
8976
- label: "两张卡",
8977
- note: "同一个模块摆两份 —— 量卡片之间的间距与分界(卡片夹具条已收起)。",
8978
- shape: {
8979
- kind: "copies",
8980
- count: 2
8981
- },
8982
- expect: {
8983
- cards: 2,
8984
- empty: false
8985
- }
8986
- },
8987
- {
8988
- id: "many",
8989
- label: "八张卡(要滚)",
8990
- note: "同一个模块摆八份 —— 量滚动、滚动条与底部留白(卡片夹具条已收起)。",
8991
- shape: {
8992
- kind: "copies",
8993
- count: 8
8994
- },
8995
- expect: {
8996
- cards: 8,
8997
- empty: false
8998
- }
8999
- },
9000
- {
9001
- id: "crash",
9002
- label: "坏卡 + 好卡",
9003
- note: "一张渲染必炸的卡 + 你装的模块(配 ?wbCrash=1 才摆得出来):要看到坏的那张只剩一句\"这个模块起不来\",别的卡与面板壳都还在。",
9004
- shape: { kind: "all" },
9005
- expect: {
9006
- cards: 1,
9007
- empty: false
9008
- }
9009
- }
9010
- ],
9011
- EMPTY,
9012
- UNREAD
9013
- ];
9014
- }
9015
- var REAL_SHAPE = { kind: "real" };
9016
- function useBoardMock(roster) {
9017
- const [on] = useState(() => mockModeOn(window.location.search));
9018
- const mocks = useMemo(() => on ? buildBoardMocks(roster) : [], [on, roster]);
9019
- const [index, setIndex] = useState(0);
9020
- const mock = mocks[index];
9021
- return {
9022
- mock,
9023
- mocks,
9024
- index,
9025
- pick: setIndex,
9026
- shape: mock?.shape ?? REAL_SHAPE
9027
- };
9028
- }
9029
- //#endregion
9030
7556
  //#region src/app/layouts/rightbar/board-plan.ts
9031
7557
  function planBoard(shape, real, all) {
9032
7558
  if (shape.kind === "real") return {
@@ -9050,6 +7576,18 @@ window.__ModuleLoader__.load({
9050
7576
  reading: true,
9051
7577
  repeated: false
9052
7578
  };
7579
+ if (shape.kind === "kit") {
7580
+ const kit = devSurface.kitModule;
7581
+ return {
7582
+ modules: kit === null ? [] : [{
7583
+ key: kit.id,
7584
+ module: kit
7585
+ }],
7586
+ empty: false,
7587
+ reading: false,
7588
+ repeated: false
7589
+ };
7590
+ }
9053
7591
  if (shape.kind === "all") return {
9054
7592
  modules: all.map((module) => ({
9055
7593
  key: module.id,
@@ -9157,8 +7695,10 @@ window.__ModuleLoader__.load({
9157
7695
  title: t("panels.unknownStep")
9158
7696
  });
9159
7697
  const key = `${owner.id}:${top.kind}`;
9160
- return /* @__PURE__ */ h(CardBoundary, {
7698
+ return /* @__PURE__ */ h(CardAnchor, {
9161
7699
  key,
7700
+ unit: owner.id
7701
+ }, /* @__PURE__ */ h(CardBoundary, {
9162
7702
  unit: owner.id,
9163
7703
  resetKey: `${key}:${panelToken}:${workspacePathOf(world)}`,
9164
7704
  t,
@@ -9173,7 +7713,7 @@ window.__ModuleLoader__.load({
9173
7713
  onOpenMarket,
9174
7714
  onSummary,
9175
7715
  t
9176
- }));
7716
+ })));
9177
7717
  }
9178
7718
  const columns = boardColumnsOf(plan.modules, twoColumns);
9179
7719
  const split = columns.length > 1;
@@ -9191,8 +7731,10 @@ window.__ModuleLoader__.load({
9191
7731
  }, columns.map((column, index) => /* @__PURE__ */ h("div", {
9192
7732
  className: Rightbar_module_default.column,
9193
7733
  key: index === 0 ? "left" : "right"
9194
- }, column.map(({ key, module }) => /* @__PURE__ */ h(CardBoundary, {
7734
+ }, column.map(({ key, module }) => /* @__PURE__ */ h(CardAnchor, {
9195
7735
  key,
7736
+ unit: module.id
7737
+ }, /* @__PURE__ */ h(CardBoundary, {
9196
7738
  unit: module.id,
9197
7739
  resetKey: `${key}:${panelToken}:${workspacePathOf(world)}`,
9198
7740
  t,
@@ -9206,7 +7748,7 @@ window.__ModuleLoader__.load({
9206
7748
  onOpenMarket,
9207
7749
  onSummary,
9208
7750
  t
9209
- })))))));
7751
+ }))))))));
9210
7752
  }
9211
7753
  function Rightbar(props) {
9212
7754
  const units = props.units;
@@ -9225,12 +7767,16 @@ window.__ModuleLoader__.load({
9225
7767
  const panelBoard = useEnabledUnits(panelToken, boardWorkspace);
9226
7768
  const enabledUnits = panelBoard?.units ?? null;
9227
7769
  const [modulesOpen, setModulesOpen] = useState(false);
9228
- const fixtures = useBoardMock(fixtureRoster(manifests));
7770
+ const devBoard = devSurface.useBoard({
7771
+ manifests,
7772
+ all: modules.all(),
7773
+ search: window.location.search
7774
+ });
9229
7775
  const visibleModules = selectBoardModules(enabledUnits, (id) => modules.byId(id), capabilities);
9230
- const plan = planBoard(fixtures.shape, {
7776
+ const plan = planBoard(devBoard.shape, {
9231
7777
  modules: visibleModules,
9232
7778
  configRead: panelBoard !== null
9233
- }, fixtureSeed(manifests, modules.all(), crashModeOn(window.location.search)));
7779
+ }, devBoard.seed);
9234
7780
  const world = createSuiteWorld({
9235
7781
  workspaces,
9236
7782
  sessions,
@@ -9252,7 +7798,7 @@ window.__ModuleLoader__.load({
9252
7798
  reason
9253
7799
  });
9254
7800
  }, []);
9255
- const fixtureMode = mockModeOn(window.location.search) || crashModeOn(window.location.search);
7801
+ const fixtureMode = devBoard.mode;
9256
7802
  useEffect(() => {
9257
7803
  setPanelWorkspace(fixtureMode ? null : boardWorkspace);
9258
7804
  }, [boardWorkspace, fixtureMode]);
@@ -9306,10 +7852,7 @@ window.__ModuleLoader__.load({
9306
7852
  refreshToken: panelToken,
9307
7853
  onOpenMarket: openMarket,
9308
7854
  onCollapse: props.toggleRightbar
9309
- }), /* @__PURE__ */ h(BoardMockStrip, {
9310
- fixtures,
9311
- show: top.kind === "board"
9312
- }), /* @__PURE__ */ h("div", { className: `wb-panelBody${plan.repeated ? " wb-fixtureMany" : ""}` }, /* @__PURE__ */ h(BoardContent, {
7855
+ }), devBoard.strip(top.kind === "board"), /* @__PURE__ */ h("div", { className: `wb-panelBody${plan.repeated ? " wb-panelMany" : ""}` }, /* @__PURE__ */ h(BoardContent, {
9313
7856
  top,
9314
7857
  plan,
9315
7858
  world,
@@ -9456,6 +7999,10 @@ window.__ModuleLoader__.load({
9456
7999
  }
9457
8000
  function openNewSession(input) {
9458
8001
  if (input.workspace === null) return;
8002
+ if (isWorkshopPath(input.workspace.path)) {
8003
+ input.startSession(input.workspace.workspaceId);
8004
+ return;
8005
+ }
9459
8006
  const blank = blankSessionIdOf(input.workspace, input.sessions, input.archivedIds);
9460
8007
  if (blank === null) input.startSession(input.workspace.workspaceId);
9461
8008
  else input.openSession(blank);
@@ -9497,23 +8044,16 @@ window.__ModuleLoader__.load({
9497
8044
  }, t(hint.labelKey))));
9498
8045
  }
9499
8046
  var ProjectSwitcher_module_default = {
9500
- root: "_root_1vd78_1",
9501
- anchor: "_anchor_1vd78_7",
9502
- menu: "_menu_1vd78_12",
9503
- trigger: "_trigger_1vd78_17",
9504
- glyph: "_glyph_1vd78_44",
9505
- glyphActive: "_glyphActive_1vd78_54",
9506
- triggerName: "_triggerName_1vd78_58",
9507
- dir: "_dir_1vd78_69",
9508
- name: "_name_1vd78_77",
9509
- chevron: "_chevron_1vd78_90",
9510
- row: "_row_1vd78_96",
9511
- trailing: "_trailing_1vd78_104",
9512
- rowAction: "_rowAction_1vd78_114",
9513
- current: "_current_1vd78_127",
9514
- field: "_field_1vd78_134",
9515
- searchIcon: "_searchIcon_1vd78_151",
9516
- search: "_search_1vd78_151"
8047
+ root: "_root_1ubj2_1",
8048
+ glyph: "_glyph_1ubj2_7",
8049
+ glyphActive: "_glyphActive_1ubj2_17",
8050
+ triggerName: "_triggerName_1ubj2_21",
8051
+ dir: "_dir_1ubj2_32",
8052
+ name: "_name_1ubj2_40",
8053
+ row: "_row_1ubj2_53",
8054
+ trailing: "_trailing_1ubj2_61",
8055
+ rowAction: "_rowAction_1ubj2_71",
8056
+ current: "_current_1ubj2_84"
9517
8057
  };
9518
8058
  var WorkspaceRenameDialog_module_default = {
9519
8059
  dialog: "_dialog_1vye5_1",
@@ -9613,38 +8153,6 @@ window.__ModuleLoader__.load({
9613
8153
  }, `${draft.trim().length}/20`)), failed ? /* @__PURE__ */ h(Note, { tone: "problem" }, t("project.rename.failed")) : null));
9614
8154
  }
9615
8155
  //#endregion
9616
- //#region src/app/layouts/sidebar/WorkspaceSearchField.tsx
9617
- function WorkspaceSearchField({ t, query, onQuery, onCursor, onSubmit }) {
9618
- const boxRef = useRef(null);
9619
- useEffect(() => {
9620
- boxRef.current?.querySelector("input")?.focus();
9621
- }, []);
9622
- return /* @__PURE__ */ h("span", {
9623
- ref: boxRef,
9624
- className: ProjectSwitcher_module_default.field
9625
- }, /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.searchIcon }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconSearchOutlineRegular, { size: 14 })), /* @__PURE__ */ h(TextField, {
9626
- className: ProjectSwitcher_module_default.search,
9627
- id: "wb-workspace-search",
9628
- name: "wb-workspace-search",
9629
- "aria-label": t("project.search.label"),
9630
- placeholder: t("project.search.placeholder"),
9631
- value: query,
9632
- onChange: (event) => onQuery(event.currentTarget.value),
9633
- onKeyDown: (event) => {
9634
- if (event.nativeEvent.isComposing) return;
9635
- if (event.key === "ArrowDown" || event.key === "ArrowUp") {
9636
- event.stopPropagation();
9637
- event.preventDefault();
9638
- onCursor(event.key === "ArrowDown" ? 1 : -1);
9639
- return;
9640
- }
9641
- if (event.key !== "Enter") return;
9642
- event.stopPropagation();
9643
- onSubmit();
9644
- }
9645
- }));
9646
- }
9647
- //#endregion
9648
8156
  //#region src/app/layouts/sidebar/workspace-groups.ts
9649
8157
  function workspaceSections(items, headings) {
9650
8158
  const workspaces = [];
@@ -9672,9 +8180,6 @@ window.__ModuleLoader__.load({
9672
8180
  });
9673
8181
  return sections;
9674
8182
  }
9675
- function flattenSections(sections) {
9676
- return sections.flatMap((section) => section.items);
9677
- }
9678
8183
  //#endregion
9679
8184
  //#region src/app/layouts/sidebar/WorkspaceRowAction.tsx
9680
8185
  function WorkspaceRowAction({ workspace, t, onEdit }) {
@@ -9722,10 +8227,11 @@ window.__ModuleLoader__.load({
9722
8227
  }
9723
8228
  //#endregion
9724
8229
  //#region src/app/layouts/sidebar/workspace-items.tsx
9725
- function workspaceMenuItems(options) {
8230
+ function workspaceOptions(options) {
9726
8231
  const { sections, currentId, hoverId, t, onHover, onEdit } = options;
9727
- const rowOf = (workspace) => ({
9728
- id: workspace.workspaceId,
8232
+ const rowOf = (workspace, group) => ({
8233
+ value: workspace.workspaceId,
8234
+ group,
9729
8235
  icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconFolderOpenRegular, { size: 16 }),
9730
8236
  label: /* @__PURE__ */ h(WorkspaceRowLabel, {
9731
8237
  workspace,
@@ -9738,118 +8244,69 @@ window.__ModuleLoader__.load({
9738
8244
  }) : void 0
9739
8245
  })
9740
8246
  });
9741
- return sections.flatMap((section) => [...section.heading === null ? [] : [{
9742
- type: "label",
9743
- id: section.id,
9744
- text: section.heading
9745
- }], ...section.items.map(rowOf)]);
8247
+ return sections.flatMap((section) => section.items.map((workspace) => rowOf(workspace, section.heading ?? void 0)));
9746
8248
  }
9747
8249
  //#endregion
9748
8250
  //#region src/app/layouts/sidebar/ProjectSwitcher.tsx
9749
- var ADD_WORKSPACE_ID = "__wb-add-workspace__";
9750
- function triggerName(current, t) {
9751
- if (current === null) return t("project.none");
9752
- const { dir, name } = displayNameOf(current);
9753
- return /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.dir }, dir), name === "" ? null : /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.name }, name));
9754
- }
9755
8251
  function ProjectSwitcher({ items, current, onPick, onAdd, onRename, t }) {
9756
8252
  const [open, setOpen] = useState(false);
9757
- const [query, setQuery] = useState("");
9758
- const [cursor, setCursor] = useState(null);
9759
8253
  const [hoverId, setHoverId] = useState(null);
9760
8254
  const [naming, setNaming] = useState(null);
9761
- const triggerRef = useRef(null);
9762
- const wasOpenRef = useRef(false);
9763
- const currentId = current?.workspaceId ?? null;
9764
- const results = useMemo(() => matchWorkspaces(items, query), [items, query]);
9765
- const sections = useMemo(() => workspaceSections(results, {
8255
+ const currentId = current?.workspaceId ?? "";
8256
+ const byId = useMemo(() => new Map(items.map((workspace) => [workspace.workspaceId, workspace])), [items]);
8257
+ const sections = useMemo(() => workspaceSections(items, {
9766
8258
  workspaces: t("project.group.workspaces"),
9767
8259
  defaultWorkspace: t("project.group.defaultWorkspace"),
9768
8260
  workshop: t("project.group.workshop")
9769
- }), [results, t]);
9770
- const ordered = useMemo(() => flattenSections(sections), [sections]);
9771
- const cursorId = cursor === null || ordered.length === 0 ? null : ordered[Math.min(cursor, ordered.length - 1)]?.workspaceId ?? null;
9772
- useEffect(() => {
9773
- if (open) {
9774
- wasOpenRef.current = true;
9775
- return;
9776
- }
9777
- setQuery("");
9778
- setCursor(null);
9779
- setHoverId(null);
9780
- if (wasOpenRef.current && naming === null) {
9781
- wasOpenRef.current = false;
9782
- triggerRef.current?.focus();
9783
- }
9784
- }, [open, naming]);
9785
- const close = () => setOpen(false);
9786
- const anchor = open ? /* @__PURE__ */ h(WorkspaceSearchField, {
8261
+ }), [items, t]);
8262
+ const options = useMemo(() => workspaceOptions({
8263
+ sections,
8264
+ currentId,
8265
+ hoverId,
9787
8266
  t,
9788
- query,
9789
- onQuery: (next) => {
9790
- setQuery(next);
9791
- setCursor(null);
9792
- },
9793
- onCursor: (step) => {
9794
- if (ordered.length === 0) return;
9795
- setCursor((at) => at === null ? step === 1 ? 0 : ordered.length - 1 : (at + step + ordered.length) % ordered.length);
9796
- },
9797
- onSubmit: () => {
9798
- const pick = ordered[Math.min(cursor ?? 0, ordered.length - 1)];
9799
- if (pick === void 0) return;
9800
- close();
9801
- onPick(pick.workspaceId);
8267
+ onHover: setHoverId,
8268
+ onEdit: (workspace) => {
8269
+ setOpen(false);
8270
+ setNaming(workspace);
9802
8271
  }
9803
- }) : /* @__PURE__ */ h("button", {
9804
- type: "button",
9805
- ref: triggerRef,
9806
- className: ProjectSwitcher_module_default.trigger,
9807
- "aria-haspopup": "listbox",
9808
- "aria-expanded": open,
9809
- "aria-label": t("project.label"),
9810
- title: current?.path ?? void 0,
9811
- onClick: () => setOpen(true)
9812
- }, /* @__PURE__ */ h("span", { className: cx(ProjectSwitcher_module_default.glyph, ProjectSwitcher_module_default.glyphActive) }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconFolderCloseRegular, { size: 16 })), /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.triggerName }, triggerName(current, t)), /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.chevron }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, { size: 14 })));
9813
- return /* @__PURE__ */ h("div", { className: ProjectSwitcher_module_default.root }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Menu, {
8272
+ }), [
8273
+ sections,
8274
+ currentId,
8275
+ hoverId,
8276
+ t
8277
+ ]);
8278
+ const valueNodes = useMemo(() => {
8279
+ const out = /* @__PURE__ */ new Map();
8280
+ for (const workspace of items) {
8281
+ const { dir, name } = displayNameOf(workspace);
8282
+ out.set(workspace.workspaceId, /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.triggerName }, /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.dir }, dir), name === "" ? null : /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.name }, name)));
8283
+ }
8284
+ return out;
8285
+ }, [items]);
8286
+ return /* @__PURE__ */ h("div", { className: ProjectSwitcher_module_default.root }, /* @__PURE__ */ h(SelectField, {
8287
+ value: currentId,
8288
+ options,
8289
+ onChange: onPick,
9814
8290
  open,
9815
- portal: true,
9816
- className: ProjectSwitcher_module_default.anchor,
9817
- listClassName: ProjectSwitcher_module_default.menu,
9818
- anchor,
9819
- align: "start",
9820
- side: "bottom",
9821
- selection: "fill",
9822
- selectedId: cursorId ?? void 0,
9823
- items: [...results.length === 0 ? [{
9824
- type: "label",
9825
- id: "empty",
9826
- text: t("project.search.empty", { query: query.trim() })
9827
- }] : [], ...workspaceMenuItems({
9828
- sections,
9829
- currentId,
9830
- hoverId,
9831
- t,
9832
- onHover: setHoverId,
9833
- onEdit: (workspace) => {
9834
- close();
9835
- setNaming(workspace);
9836
- }
9837
- })],
9838
- footer: [{
9839
- id: ADD_WORKSPACE_ID,
8291
+ onOpenChange: setOpen,
8292
+ icon: /* @__PURE__ */ h("span", { className: cx(ProjectSwitcher_module_default.glyph, ProjectSwitcher_module_default.glyphActive) }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconFolderCloseRegular, { size: 16 })),
8293
+ renderValue: (option) => option === void 0 ? t("project.none") : valueNodes.get(option.value) ?? option.label,
8294
+ placeholder: t("project.none"),
8295
+ variant: "ghost",
8296
+ ariaLabel: t("project.label"),
8297
+ title: current?.path ?? void 0,
8298
+ searchLabel: t("project.search.label"),
8299
+ searchPlaceholder: t("project.search.placeholder"),
8300
+ emptyText: (query) => t("project.search.empty", { query: query.trim() }),
8301
+ filter: (option, query) => {
8302
+ const workspace = byId.get(option.value);
8303
+ return workspace !== void 0 && matchWorkspaces([workspace], query).length > 0;
8304
+ },
8305
+ footer: {
9840
8306
  label: t("project.add"),
9841
8307
  icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutlineRegular, { size: 14 })
9842
- }],
9843
- onSelect: (id) => {
9844
- if (id === ADD_WORKSPACE_ID) {
9845
- close();
9846
- onAdd();
9847
- return;
9848
- }
9849
- close();
9850
- onPick(id);
9851
8308
  },
9852
- onClose: close
8309
+ onFooter: onAdd
9853
8310
  }), naming === null ? null : /* @__PURE__ */ h(WorkspaceRenameDialog, {
9854
8311
  key: naming.workspaceId,
9855
8312
  workspace: naming,
@@ -10178,28 +8635,28 @@ window.__ModuleLoader__.load({
10178
8635
  }
10179
8636
  //#endregion
10180
8637
  //#region src/shared/styles/rightbar.css?raw
10181
- var rightbar_default = ".wb-rightbar {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-width: 0;\n overflow: hidden;\n background: var(--dsw-alias-bg-base);\n border-left: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-panelHeader {\n flex: none;\n height: var(--wb-len-38);\n}\n\n.wb-tabStrip {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n height: var(--wb-len-38);\n padding: var(--wb-len-10) var(--wb-len-6) 0 var(--wb-len-10);\n}\n\n.wb-stripFill {\n flex: 1 1 0;\n min-width: 0;\n}\n\n.wb-rightbar :is(button, [role='tab']):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}\n\n.wb-rightbar {\n container-type: inline-size;\n}\n\n.wb-dangerAction {\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-stripChrome {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n flex: none;\n margin-left: var(--wb-len-4);\n}\n\n.wb-panelBody {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n scrollbar-gutter: stable;\n padding: var(--wb-len-12);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n.wb-panelBody {\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n}\n@container (max-width: 340px) {\n .wb-panelBody {\n padding: var(--wb-len-8);\n }}\n";
8638
+ var rightbar_default = ".wb-rightbar {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-width: 0;\n overflow: hidden;\n background: var(--dsw-alias-bg-base);\n border-left: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-panelHeader {\n flex: none;\n height: var(--wb-len-38);\n}\n\n.wb-tabStrip {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n height: var(--wb-len-38);\n padding: var(--wb-len-10) var(--wb-len-6) 0 var(--wb-len-10);\n}\n\n.wb-stripFill {\n flex: 1 1 0;\n min-width: 0;\n}\n\n.wb-rightbar :is(button, [role='tab']):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}\n\n.wb-rightbar {\n container-type: inline-size;\n}\n\n.wb-dangerAction {\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-stripChrome {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n flex: none;\n margin-left: var(--wb-len-4);\n}\n\n.wb-panelBody {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n scrollbar-gutter: stable;\n padding: var(--wb-len-12);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n}\n@container (max-width: 340px) {\n .wb-panelBody {\n padding: var(--wb-len-8);\n }}\n";
10182
8639
  //#endregion
10183
8640
  //#region src/shared/styles/tokens.css?raw
10184
- var tokens_default = ".wb-root,\n.wb-rightbar {\n --wb-bar-height: 36px;\n --wb-gap-xs: 6px;\n --wb-font-row: 14px;\n}\n";
8641
+ var tokens_default = ".wb-root,\n.wb-rightbar {\n --wb-gap-xs: 6px;\n --wb-font-row: 14px;\n --wb-card-gutter: var(--wb-len-16);\n}\n";
10185
8642
  //#endregion
10186
8643
  //#region src/shared/styles/tokens/palette.css?raw
10187
- var palette_default = ":root {\n --wb-static-titlebar-fill: #ffffff8c;\n --wb-static-titlebar-fill-hover: #ffffff4d;\n --wb-static-titlebar-fill-dark: #ffffff26;\n --wb-static-titlebar-fill-dark-hover: #fff3;\n --wb-static-mask-opaque: #000;\n --wb-static-shadow-ghost: 0 8px 20px rgba(0, 0, 0, 0.4);\n}\n";
8644
+ var palette_default = ":root {\n --wb-static-mask-opaque: #000;\n --wb-static-shadow-ghost: 0 8px 20px rgba(0, 0, 0, 0.4);\n}\n";
10188
8645
  //#endregion
10189
8646
  //#region src/shared/styles/tokens/scale.css?raw
10190
- var scale_default = ":root {\n --wb-dur-0-12: 0.12s;\n --wb-dur-0-15: 0.15s;\n --wb-dur-0-9: 0.9s;\n --wb-dur-1-4: 1.4s;\n --wb-dur-1-5: 1.5s;\n --wb-font-10: 10px;\n --wb-font-11-5: 11.5px;\n --wb-font-12-5: 12.5px;\n --wb-font-17: 17px;\n --wb-font-18: 18px;\n --wb-font-6: 6px;\n --wb-len-0-5: 0.5px;\n --wb-len-1: 1px;\n --wb-len-10: 10px;\n --wb-len-12: 12px;\n --wb-len-120: 120px;\n --wb-len-13: 13px;\n --wb-len-132: 132px;\n --wb-len-14: 14px;\n --wb-len-144: 144px;\n --wb-len-15: 15px;\n --wb-len-16: 16px;\n --wb-len-18: 18px;\n --wb-len-2: 2px;\n --wb-len-20: 20px;\n --wb-len-200: 200px;\n --wb-len-22: 22px;\n --wb-len-220: 220px;\n --wb-len-24: 24px;\n --wb-len-240: 240px;\n --wb-len-26: 26px;\n --wb-len-260: 260px;\n --wb-len-28: 28px;\n --wb-len-3: 3px;\n --wb-len-3-4em: 3.4em;\n --wb-len-30: 30px;\n --wb-len-300: 300px;\n --wb-len-32: 32px;\n --wb-len-320: 320px;\n --wb-len-34: 34px;\n --wb-len-36: 36px;\n --wb-len-360: 360px;\n --wb-len-38: 38px;\n --wb-len-4: 4px;\n --wb-len-440: 440px;\n --wb-len-40: 40px;\n --wb-len-420: 420px;\n --wb-len-42em: 42em;\n --wb-len-44: 44px;\n --wb-len-48: 48px;\n --wb-len-5: 5px;\n --wb-len-52: 52px;\n --wb-len-520: 520px;\n --wb-len-56: 56px;\n --wb-len-560: 560px;\n --wb-len-6: 6px;\n --wb-len-60: 60px;\n --wb-len-64: 64px;\n --wb-len-7: 7px;\n --wb-len-72: 72px;\n --wb-len-8: 8px;\n --wb-len-800: 800px;\n --wb-len-9: 9px;\n --wb-len-96: 96px;\n --wb-len-960: 960px;\n --wb-len-neg-0-5: -0.5px;\n --wb-len-neg-1-5: -1.5px;\n --wb-len-neg-12: -12px;\n --wb-len-neg-2: -2px;\n --wb-len-neg-3: -3px;\n --wb-len-neg-4: -4px;\n --wb-len-neg-6: -6px;\n --wb-len-neg-8: -8px;\n --wb-line-10: 10px;\n --wb-line-13: 13px;\n --wb-line-14: 14px;\n --wb-line-15: 15px;\n --wb-line-16: 16px;\n --wb-line-17: 17px;\n --wb-line-18: 18px;\n --wb-line-19: 19px;\n --wb-line-20: 20px;\n --wb-line-22: 22px;\n --wb-line-24: 24px;\n --wb-radius-14: 14px;\n --wb-radius-2: 2px;\n --wb-radius-6: 6px;\n --wb-radius-pill: 999px;\n --wb-track-brand: .04em;\n --wb-z-1100: 1100;\n --wb-z-10: 10;\n --wb-z-30: 30;\n --wb-z-40: 40;\n --wb-z-top: 2147483000;\n --wb-project-menu-min-width: 0;\n}\n";
8647
+ var scale_default = ":root {\n --wb-dur-0-12: 0.12s;\n --wb-dur-0-9: 0.9s;\n --wb-dur-1-4: 1.4s;\n --wb-dur-1-5: 1.5s;\n --wb-font-10: 10px;\n --wb-font-11-5: 11.5px;\n --wb-font-12-5: 12.5px;\n --wb-font-18: 18px;\n --wb-len-0-5: 0.5px;\n --wb-len-1: 1px;\n --wb-len-10: 10px;\n --wb-len-12: 12px;\n --wb-len-120: 120px;\n --wb-len-13: 13px;\n --wb-len-132: 132px;\n --wb-len-14: 14px;\n --wb-len-15: 15px;\n --wb-len-16: 16px;\n --wb-len-18: 18px;\n --wb-len-2: 2px;\n --wb-len-20: 20px;\n --wb-len-22: 22px;\n --wb-len-220: 220px;\n --wb-len-24: 24px;\n --wb-len-240: 240px;\n --wb-len-26: 26px;\n --wb-len-28: 28px;\n --wb-len-3: 3px;\n --wb-len-3-4em: 3.4em;\n --wb-len-30: 30px;\n --wb-len-300: 300px;\n --wb-len-32: 32px;\n --wb-len-320: 320px;\n --wb-len-34: 34px;\n --wb-len-36: 36px;\n --wb-len-360: 360px;\n --wb-len-38: 38px;\n --wb-len-4: 4px;\n --wb-len-440: 440px;\n --wb-len-40: 40px;\n --wb-len-420: 420px;\n --wb-len-42em: 42em;\n --wb-len-44: 44px;\n --wb-len-48: 48px;\n --wb-len-5: 5px;\n --wb-len-52: 52px;\n --wb-len-520: 520px;\n --wb-len-56: 56px;\n --wb-len-560: 560px;\n --wb-len-6: 6px;\n --wb-len-60: 60px;\n --wb-len-64: 64px;\n --wb-len-7: 7px;\n --wb-len-72: 72px;\n --wb-len-8: 8px;\n --wb-len-800: 800px;\n --wb-len-9: 9px;\n --wb-len-96: 96px;\n --wb-len-960: 960px;\n --wb-len-neg-0-5: -0.5px;\n --wb-len-neg-1-5: -1.5px;\n --wb-len-neg-2: -2px;\n --wb-len-neg-3: -3px;\n --wb-len-neg-4: -4px;\n --wb-len-neg-8: -8px;\n --wb-line-14: 14px;\n --wb-line-15: 15px;\n --wb-line-16: 16px;\n --wb-line-17: 17px;\n --wb-line-18: 18px;\n --wb-line-19: 19px;\n --wb-line-20: 20px;\n --wb-line-22: 22px;\n --wb-line-24: 24px;\n --wb-radius-14: 14px;\n --wb-radius-6: 6px;\n --wb-radius-pill: 999px;\n --wb-track-brand: .04em;\n --wb-z-1100: 1100;\n --wb-z-10: 10;\n --wb-z-30: 30;\n --wb-z-40: 40;\n --wb-z-top: 2147483000;\n}\n";
10191
8648
  //#endregion
10192
8649
  //#region src/shared/styles/sidebar-app.css?raw
10193
- var sidebar_app_default = ".wb-wsSection {\n position: relative;\n flex: none;\n --dsh-session-list-edge-inset: var(--dsh-sidebar-inline-padding);\n --dsh-session-list-scrollbar-width: 5px;\n --dsh-session-list-scrollbar-offset: 2px;\n margin: 0 var(--dsh-session-list-scrollbar-offset) var(--wb-len-4) 0;\n padding-right: calc( var(--dsh-session-list-edge-inset) - var(--dsh-session-list-scrollbar-width) - var(--dsh-session-list-scrollbar-offset) );\n}.wb-sectionHeader {\n box-sizing: border-box;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n gap: var(--wb-len-4);\n height: var(--wb-len-36);\n flex: none;\n margin-bottom: var(--wb-len-4);\n padding-left: var(--wb-len-8);\n padding-right: var(--wb-len-2);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-tertiary);\n overflow: hidden;\n}.wb-wsNew {\n margin-left: auto;\n}.wb-sectionLabel {\n flex: none;\n min-width: 0;\n max-width: 45%;\n overflow: hidden;\n white-space: nowrap;\n line-height: var(--wb-line-20);\n}.wb-collapsed .wb-wsSection {\n margin: 0 0 var(--wb-len-12);\n padding-right: 0;\n}.wb-collapsed .wb-sectionHeader {\n justify-content: flex-start;\n gap: 0;\n margin-bottom: 0;\n padding-left: 0;\n padding-right: 0;\n}.wb-collapsed .wb-wsNew {\n margin-left: 0;\n}.wb-project {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}.wb-projectAnchor {\n display: block;\n width: 100%;\n min-width: var(--wb-project-menu-min-width, 0);\n}.wb-projectButton {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n width: 100%;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n text-align: left;\n cursor: pointer;\n user-select: none;\n}.wb-projectButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}.wb-projectButton: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}.wb-collapsed .wb-projectButton {\n justify-content: center;\n width: var(--wb-bar-height);\n height: var(--wb-bar-height);\n padding: 0;\n}.wb-collapsed .wb-projectName,\n.wb-collapsed .wb-projectChevron {\n display: none;\n}.wb-projectGlyph {\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}.wb-projectGlyphActive {\n color: var(--dsw-alias-state-business-primary);\n}.wb-projectName {\n flex: 1;\n min-width: 0;\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}.wb-projectChevron {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n transition: transform var(--wb-dur-0-15) var(--ds-ease-in-out);\n}.wb-projectChevronOpen {\n transform: rotate(180deg);\n}.wb-sessions {\n --dsh-session-list-edge-inset: var(--dsh-sidebar-inline-padding);\n --dsh-session-list-scrollbar-width: 5px;\n --dsh-session-list-scrollbar-offset: 2px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n margin-left: var(--wb-len-neg-4);\n margin-right: var(--dsh-session-list-scrollbar-offset);\n padding-left: var(--wb-len-4);\n padding-right: calc( var(--dsh-session-list-edge-inset) - var(--dsh-session-list-scrollbar-width) - var(--dsh-session-list-scrollbar-offset) );\n padding-bottom: var(--wb-len-16);\n scrollbar-gutter: stable;\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n}.wb-sessions.wb-fadeTop {\n mask-image: linear-gradient(\n to bottom,\n transparent 0,\n var(--wb-static-mask-opaque) var(--wb-len-24),\n var(--wb-static-mask-opaque) 100%\n );\n}.wb-sessions.wb-fadeBottom {\n mask-image: linear-gradient(\n to bottom,\n var(--wb-static-mask-opaque) 0,\n var(--wb-static-mask-opaque) calc(100% - var(--wb-len-24)),\n transparent 100%\n );\n}.wb-sessions.wb-fadeTop.wb-fadeBottom {\n mask-image: linear-gradient(\n to bottom,\n transparent 0,\n var(--wb-static-mask-opaque) var(--wb-len-24),\n var(--wb-static-mask-opaque) calc(100% - var(--wb-len-24)),\n transparent 100%\n );\n}.wb-sessions > * {\n flex: none;\n}.wb-sessions > * + * {\n margin-top: var(--wb-len-2);\n}.wb-sessionLeading {\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}.wb-sessionPin {\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 margin-left: var(--wb-len-6);\n color: var(--dsw-alias-label-caption);\n}.wb-rowActions {\n flex: none;\n display: none;\n align-items: center;\n gap: var(--wb-len-15);\n}.wb-rowActions .wb-iconButton {\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n border-radius: var(--dsw-radius-xs);\n color: var(--dsw-alias-label-tertiary);\n}.wb-rowActions .wb-iconButton:hover {\n background: transparent;\n color: var(--dsw-alias-label-primary);\n}.wb-sessionRow:hover .wb-rowActions,\n.wb-sessionRow.wb-menuOpen .wb-rowActions {\n display: inline-flex;\n}.wb-sessionRow:hover .wb-sessionTime,\n.wb-sessionRow.wb-menuOpen .wb-sessionTime,\n.wb-sessionRow:hover .wb-sessionPin,\n.wb-sessionRow.wb-menuOpen .wb-sessionPin {\n display: none;\n}.wb-sessionRow.wb-menuOpen {\n background: var(--dsw-alias-interactive-bg-hover);\n}.wb-rowMenu {\n left: auto;\n right: 0;\n min-width: var(--wb-len-144);\n max-width: var(--wb-len-260);\n}.wb-sessionRow {\n position: relative;\n flex: none;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: 0;\n width: 100%;\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-8);\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n text-align: left;\n cursor: pointer;\n user-select: none;\n}.wb-sessionRow:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}.wb-sessionRow: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}.wb-visuallyHidden {\n clip: rect(0 0 0 0);\n white-space: nowrap;\n width: var(--wb-len-1);\n height: var(--wb-len-1);\n position: absolute;\n overflow: hidden;\n}.wb-sessionTitle {\n flex: 1;\n min-width: 0;\n margin: 0 var(--wb-len-6) 0 var(--wb-len-4);\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}.wb-sessionTitle[data-scrolled] {\n mask-image: linear-gradient(90deg, transparent, var(--wb-static-mask-opaque) var(--wb-len-12));\n}.wb-sessionTitle[data-clipped] {\n mask-image: linear-gradient(270deg, transparent, var(--wb-static-mask-opaque) var(--wb-len-12));\n}.wb-sessionTitle[data-scrolled][data-clipped] {\n mask-image: linear-gradient(\n 90deg,\n transparent,\n var(--wb-static-mask-opaque) var(--wb-len-12) calc(100% - var(--wb-len-12)),\n transparent\n );\n}@media (hover: hover) {\n .wb-sessionRow:hover .wb-sessionTitle,\n .wb-sessionRow.wb-menuOpen .wb-sessionTitle {\n text-overflow: clip;\n }\n}.wb-sessionHover {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n}.wb-sessionHoverTitle {\n color: var(--dsw-static-neutral-bluish-00);\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n overflow-wrap: break-word;\n}.wb-sessionHoverTime {\n color: var(--dsw-static-neutral-bluish-300);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-16);\n}.wb-sessionHoverStatus {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n color: var(--dsw-static-neutral-bluish-400);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-20);\n}.wb-sessionTime {\n flex: none;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}.wb-workspaceBusy {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: var(--wb-len-4) var(--wb-len-8) 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}.wb-workspaceError {\n margin: var(--wb-len-4) var(--wb-len-8) 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}.wb-empty {\n padding: var(--wb-len-16) var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n color: var(--dsw-alias-label-tertiary);\n}@media (prefers-reduced-motion: reduce) {\n .wb-projectChevron {\n transition: none;\n }}.wb-sessionRow.wb-selected {\n background: var(--dsw-alias-interactive-bg-hover);\n}.wb-panelTag {\n flex: none;\n margin-left: auto;\n}.wb-panelGlyph {\n position: relative;\n}.wb-panelDot {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: var(--wb-len-neg-3);\n right: var(--wb-len-neg-3);\n}button.pXSMma_workspace {\n display: none;\n}";
8650
+ var sidebar_app_default = ".wb-wsSection {\n position: relative;\n flex: none;\n --dsh-session-list-edge-inset: var(--dsh-sidebar-inline-padding);\n --dsh-session-list-scrollbar-width: 5px;\n --dsh-session-list-scrollbar-offset: 2px;\n margin: 0 var(--dsh-session-list-scrollbar-offset) var(--wb-len-4) 0;\n padding-right: calc( var(--dsh-session-list-edge-inset) - var(--dsh-session-list-scrollbar-width) - var(--dsh-session-list-scrollbar-offset) );\n}.wb-sectionHeader {\n box-sizing: border-box;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n gap: var(--wb-len-4);\n height: var(--wb-len-36);\n flex: none;\n margin-bottom: var(--wb-len-4);\n padding-left: var(--wb-len-8);\n padding-right: var(--wb-len-2);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-tertiary);\n overflow: hidden;\n}.wb-wsNew {\n margin-left: auto;\n}.wb-sectionLabel {\n flex: none;\n min-width: 0;\n max-width: 45%;\n overflow: hidden;\n white-space: nowrap;\n line-height: var(--wb-line-20);\n}.wb-collapsed .wb-wsSection {\n margin: 0 0 var(--wb-len-12);\n padding-right: 0;\n}.wb-collapsed .wb-sectionHeader {\n justify-content: flex-start;\n gap: 0;\n margin-bottom: 0;\n padding-left: 0;\n padding-right: 0;\n}.wb-collapsed .wb-wsNew {\n margin-left: 0;\n}.wb-sessions {\n --dsh-session-list-edge-inset: var(--dsh-sidebar-inline-padding);\n --dsh-session-list-scrollbar-width: 5px;\n --dsh-session-list-scrollbar-offset: 2px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n margin-left: var(--wb-len-neg-4);\n margin-right: var(--dsh-session-list-scrollbar-offset);\n padding-left: var(--wb-len-4);\n padding-right: calc( var(--dsh-session-list-edge-inset) - var(--dsh-session-list-scrollbar-width) - var(--dsh-session-list-scrollbar-offset) );\n padding-bottom: var(--wb-len-16);\n scrollbar-gutter: stable;\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n}.wb-sessions.wb-fadeTop {\n mask-image: linear-gradient(\n to bottom,\n transparent 0,\n var(--wb-static-mask-opaque) var(--wb-len-24),\n var(--wb-static-mask-opaque) 100%\n );\n}.wb-sessions.wb-fadeBottom {\n mask-image: linear-gradient(\n to bottom,\n var(--wb-static-mask-opaque) 0,\n var(--wb-static-mask-opaque) calc(100% - var(--wb-len-24)),\n transparent 100%\n );\n}.wb-sessions.wb-fadeTop.wb-fadeBottom {\n mask-image: linear-gradient(\n to bottom,\n transparent 0,\n var(--wb-static-mask-opaque) var(--wb-len-24),\n var(--wb-static-mask-opaque) calc(100% - var(--wb-len-24)),\n transparent 100%\n );\n}.wb-sessions > * {\n flex: none;\n}.wb-sessions > * + * {\n margin-top: var(--wb-len-2);\n}.wb-sessionLeading {\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}.wb-sessionPin {\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 margin-left: var(--wb-len-6);\n color: var(--dsw-alias-label-caption);\n}.wb-rowActions {\n flex: none;\n display: none;\n align-items: center;\n gap: var(--wb-len-15);\n}.wb-rowActions .wb-iconButton {\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n border-radius: var(--dsw-radius-xs);\n color: var(--dsw-alias-label-tertiary);\n}.wb-rowActions .wb-iconButton:hover {\n background: transparent;\n color: var(--dsw-alias-label-primary);\n}.wb-sessionRow:hover .wb-rowActions,\n.wb-sessionRow.wb-menuOpen .wb-rowActions {\n display: inline-flex;\n}.wb-sessionRow:hover .wb-sessionTime,\n.wb-sessionRow.wb-menuOpen .wb-sessionTime,\n.wb-sessionRow:hover .wb-sessionPin,\n.wb-sessionRow.wb-menuOpen .wb-sessionPin {\n display: none;\n}.wb-sessionRow.wb-menuOpen {\n background: var(--dsw-alias-interactive-bg-hover);\n}.wb-sessionRow {\n position: relative;\n flex: none;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: 0;\n width: 100%;\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-8);\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n text-align: left;\n cursor: pointer;\n user-select: none;\n}.wb-sessionRow:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}.wb-sessionRow: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}.wb-visuallyHidden {\n clip: rect(0 0 0 0);\n white-space: nowrap;\n width: var(--wb-len-1);\n height: var(--wb-len-1);\n position: absolute;\n overflow: hidden;\n}.wb-sessionTitle {\n flex: 1;\n min-width: 0;\n margin: 0 var(--wb-len-6) 0 var(--wb-len-4);\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}.wb-sessionTitle[data-scrolled] {\n mask-image: linear-gradient(90deg, transparent, var(--wb-static-mask-opaque) var(--wb-len-12));\n}.wb-sessionTitle[data-clipped] {\n mask-image: linear-gradient(270deg, transparent, var(--wb-static-mask-opaque) var(--wb-len-12));\n}.wb-sessionTitle[data-scrolled][data-clipped] {\n mask-image: linear-gradient(\n 90deg,\n transparent,\n var(--wb-static-mask-opaque) var(--wb-len-12) calc(100% - var(--wb-len-12)),\n transparent\n );\n}@media (hover: hover) {\n .wb-sessionRow:hover .wb-sessionTitle,\n .wb-sessionRow.wb-menuOpen .wb-sessionTitle {\n text-overflow: clip;\n }\n}.wb-sessionHover {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n}.wb-sessionHoverTitle {\n color: var(--dsw-static-neutral-bluish-00);\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n overflow-wrap: break-word;\n}.wb-sessionHoverTime {\n color: var(--dsw-static-neutral-bluish-300);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-16);\n}.wb-sessionHoverStatus {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n color: var(--dsw-static-neutral-bluish-400);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-20);\n}.wb-sessionTime {\n flex: none;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}.wb-workspaceBusy {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: var(--wb-len-4) var(--wb-len-8) 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}.wb-workspaceError {\n margin: var(--wb-len-4) var(--wb-len-8) 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}.wb-empty {\n padding: var(--wb-len-16) var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n color: var(--dsw-alias-label-tertiary);\n}.wb-sessionRow.wb-selected {\n background: var(--dsw-alias-interactive-bg-hover);\n}.wb-panelTag {\n flex: none;\n margin-left: auto;\n}.wb-panelGlyph {\n position: relative;\n}.wb-panelDot {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: var(--wb-len-neg-3);\n right: var(--wb-len-neg-3);\n}button.pXSMma_workspace {\n display: none;\n}";
10194
8651
  //#endregion
10195
8652
  //#region src/shared/styles/sidebar.css?raw
10196
- var sidebar_default = ".wb-root{--dsh-sidebar-inline-padding:12px;height:100%;padding:var(--wb-len-6) var(--dsh-sidebar-inline-padding);box-sizing:border-box;background:var(--dsw-specific-sidebar-fill);color:var(--dsw-alias-label-primary);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);flex-direction:column;font-size:var(--dsw-font-s-14-font-size);display:flex}[data-platform=darwin] .wb-root{background:0 0}.wb-root.wb-collapsed{padding:var(--wb-len-18) var(--wb-len-10) var(--wb-len-6)}[data-windows-titlebar] .wb-root .wb-logoRow{height:var(--wb-len-40);margin:0;padding:0}[data-windows-titlebar] .wb-toggle{top:calc((var(--dsh-windows-titlebar-height) - var(--wb-len-28)) / 2);z-index:var(--wb-z-30);-webkit-app-region:no-drag;position:fixed;left:var(--wb-len-12)}[data-windows-titlebar] .wb-root.wb-collapsed .wb-logoRow{height:0}[data-windows-titlebar] .wb-root:not(.wb-collapsed) .wb-brand{padding-left:var(--wb-len-4)}[data-windows-titlebar] .wb-brandIdentity{transform:translateY(1px)}[data-windows-titlebar] .wb-brandMark{transform:translate(1px)}[data-windows-titlebar] .wb-brandName{font-weight:400}[data-windows-titlebar] .wb-root.wb-collapsed{padding:0}[data-windows-titlebar] .wb-root:not(.wb-collapsed) .wb-newSession{margin-top:var(--wb-len-8);margin-left:0}[data-windows-titlebar] .wb-collapsed .wb-panelList,[data-windows-titlebar] .wb-collapsed .wb-regionArea,[data-windows-titlebar] .wb-collapsed .wb-footArea{display:none}html[data-windows-titlebar]:has([data-sidebar-collapsed=true]){--dsh-windows-menu-start:84px}[data-windows-titlebar] .wb-collapsed .wb-newSession{top:calc((var(--dsh-windows-titlebar-height) - var(--wb-len-28)) / 2);z-index:var(--wb-z-30);-webkit-app-region:no-drag;border:none;margin:0;padding:0;position:fixed;left:var(--wb-len-48)}[data-windows-titlebar] .wb-railIn .wb-iconButton,[data-windows-titlebar] .wb-railIn .wb-newSession{animation:none}[data-windows-titlebar] .wb-collapsed .wb-toggle,[data-windows-titlebar] .wb-collapsed .wb-newSession{corner-shape:round;width:var(--wb-len-28);height:var(--wb-len-28);color:var(--dsw-alias-label-secondary);border-radius:50%}[data-windows-titlebar] .wb-collapsed .wb-toggle .wb-panelIcon{display:inline-flex}.wb-root.wb-quietBars{--dsh-scrollbar-thumb:transparent;--dsh-scrollbar-thumb-hover:transparent}.wb-fading>*{opacity:0;transition:opacity var(--wb-dur-0-15) var(--ds-ease-in-out)}.wb-wide{animation:wb-wide-in var(--ds-transition-duration) var(--ds-ease-in-out)}@keyframes wb-wide-in{0%{opacity:0}}.wb-railIn .wb-iconButton,.wb-railIn .wb-newSession,.wb-railIn .wb-panelList,.wb-railIn .wb-regionArea{animation:wb-rail-in var(--wb-dur-0-15) var(--ds-ease-in-out) backwards}.wb-railIn .wb-footArea{animation:wb-rail-fade-in var(--wb-dur-0-15) var(--ds-ease-in-out) backwards}@keyframes wb-rail-in{0%{opacity:0;transform:translate(49px)}}@keyframes wb-rail-fade-in{0%{opacity:0}}.wb-topStrip{box-sizing:border-box;height:var(--wb-len-52);margin:var(--wb-len-neg-6) calc(-1 * var(--dsh-sidebar-inline-padding)) 0;flex:none;justify-content:flex-end;align-items:center;padding:0 var(--wb-len-12) var(--wb-len-2);display:flex}[data-fullscreen] .wb-topStrip{justify-content:flex-start}.wb-topStrip+.wb-logoRow{margin-top:var(--wb-len-neg-12)}.wb-logoRow{box-sizing:border-box;flex:none;justify-content:flex-end;align-items:center;gap:var(--wb-len-8);height:var(--wb-len-60);margin-bottom:var(--wb-len-4);padding:var(--wb-len-8) 0 var(--wb-len-8) var(--wb-len-4);display:flex;overflow:hidden}.wb-collapsed .wb-logoRow{justify-content:flex-start;height:var(--wb-len-36);margin-bottom:var(--wb-len-12);padding:0;overflow:visible}.wb-brand{min-width:0;color:inherit;cursor:pointer;background:0 0;border:none;flex:1;align-items:center;padding:0;display:inline-flex;overflow:hidden}[data-platform=darwin] .wb-brand{cursor:default}.wb-brandIdentity{align-items:center;gap:var(--wb-len-8);min-width:0;height:var(--wb-len-24);display:inline-flex}.wb-brandMark{flex:none;justify-content:center;align-items:center;display:inline-flex}.wb-brandName{letter-spacing:var(--wb-track-brand);align-items:center;gap:var(--wb-len-6);min-width:0;height:var(--wb-len-24);font-size:var(--wb-font-18);font-weight:600;line-height:var(--wb-line-24);display:inline-flex}.wb-fallbackBrandName{letter-spacing:0;white-space:nowrap;font-size:var(--wb-font-17)}.wb-localBuildBrand{white-space:nowrap;flex-direction:column;flex:none;justify-content:center;align-items:flex-start;gap:var(--wb-len-1);height:var(--wb-len-24);display:inline-flex}.wb-localBuildTitle{letter-spacing:0;font-size:var(--dsw-font-xxs-12-font-size);line-height:var(--wb-line-13)}.wb-panelIcon{display:inline-flex;align-items:center;justify-content:center}.wb-iconButton{border-radius:var(--dsw-radius-sm);cursor:pointer;width:var(--wb-len-28);height:var(--wb-len-28);color:var(--dsw-alias-label-secondary);background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex;position:relative}.wb-iconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.wb-iconButton.wb-toggle:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}.wb-collapsed .wb-iconButton{border-radius:var(--dsw-radius-md);width:var(--wb-len-36);height:var(--wb-len-36)}.wb-collapsed .wb-toggle .wb-panelIcon{display:none}.wb-collapsed .wb-toggle:hover .wb-panelIcon{display:inline}.wb-collapsed .wb-toggle:hover .wb-railMark{display:none}.wb-railMark{justify-content:center;align-items:center;display:inline-flex}.wb-collapsed .wb-iconButton{color:var(--dsw-alias-label-primary)}.wb-buildVersion{height:var(--wb-len-10);color:var(--dsw-alias-label-primary-inverted);background:var(--dsw-alias-label-primary);font-family:var(--ds-font-family-code);white-space:nowrap;border-radius:var(--wb-radius-2);flex:none;align-items:center;padding:0 var(--wb-len-3);font-size:var(--wb-font-6);font-weight:500;line-height:var(--wb-line-10);display:inline-flex}.wb-newSession{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-button-elevated-fill);height:var(--wb-len-38);color:var(--dsw-alias-label-primary);cursor:pointer;flex:none;justify-content:center;align-items:center;gap:0;margin:0 var(--wb-len-2) var(--wb-len-12);padding:var(--wb-len-8) var(--wb-len-12);font-size:var(--dsw-font-s-14-font-size);font-weight:500;line-height:var(--wb-line-22);display:flex;position:relative;overflow:hidden;container-type:inline-size}.wb-newSession:hover{background:var(--dsw-alias-button-floating-hover)}[data-platform=darwin] .wb-newSession{background:var(--wb-static-titlebar-fill)}[data-platform=darwin] .wb-newSession:hover{background:var(--wb-static-titlebar-fill-hover)}[data-platform=darwin] [data-ds-dark-theme] .wb-newSession{background:var(--wb-static-titlebar-fill-dark)}[data-platform=darwin] [data-ds-dark-theme] .wb-newSession:hover{background:var(--wb-static-titlebar-fill-dark-hover)}.wb-collapsed .wb-newSession{background:0 0;border-color:transparent;align-self:flex-start;gap:0;width:var(--wb-len-36);height:var(--wb-len-36);margin:0 0 var(--wb-len-12);padding:0}.wb-collapsed .wb-newSession:hover{background:var(--dsw-alias-interactive-bg-hover)}.wb-newSessionLabel{white-space:nowrap;max-width:var(--wb-len-200);overflow:hidden}.wb-collapsed .wb-newSessionLabel{max-width:0}.wb-newSessionLabelMask{flex:1;min-width:0}.wb-newSession:is(:hover,:focus-visible) .wb-newSessionLabelMask:has(+.wb-newSessionShortcut){overflow:hidden;mask-image:linear-gradient(90deg,var(--wb-static-mask-opaque) calc(100% - var(--wb-len-16)),transparent)}.wb-newSessionContent{justify-content:center;align-items:center;gap:var(--wb-len-6);width:100cqw;display:flex}.wb-newSessionContent>svg{flex:none}.wb-newSessionShortcut{opacity:0;pointer-events:none;flex:none;font-weight:400;display:inline-flex}.wb-newSession:is(:hover,:focus-visible) .wb-newSessionShortcut{opacity:1}.wb-panelList{flex-direction:column;flex:none;gap:var(--wb-len-4);margin-bottom:var(--wb-len-8);display:flex}.wb-panelRow{box-sizing:border-box;border-radius:var(--dsw-radius-md);min-height:var(--wb-len-36);color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:var(--wb-len-8);margin:0 var(--wb-len-2);padding:var(--wb-len-7) var(--wb-len-8);line-height:var(--wb-line-22);display:flex}.wb-panelRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.wb-panelRow.wb-panelActive{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.wb-panelRow:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}.wb-panelGlyph{flex:none;justify-content:center;align-items:center;display:inline-flex}.wb-panelTitle{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.wb-collapsed .wb-panelList{gap:var(--wb-len-12);margin-bottom:var(--wb-len-12)}.wb-collapsed .wb-panelRow{width:var(--wb-len-36);height:var(--wb-len-36);color:var(--dsw-alias-label-primary);justify-content:center;margin:0;padding:0}.wb-regionArea{min-height:0;margin-left:var(--wb-len-neg-4);margin-right:calc(-1 * var(--dsh-sidebar-inline-padding));flex-direction:column;flex:1;padding-left:var(--wb-len-4);display:flex;overflow:hidden}.wb-collapsed .wb-regionArea{margin-left:0;margin-right:0;padding-left:0}.wb-footArea{flex-direction:column;flex:none;display:flex}.wb-settingsArea,.wb-footerActions{flex:none;width:100%;min-width:0}.wb-footerActions{display:flex}.wb-collapsed .wb-footArea{align-items:center}.wb-collapsed .wb-settingsArea,.wb-collapsed .wb-footerActions{justify-content:center;width:auto;display:flex}@media (prefers-reduced-motion:reduce){.wb-wide,.wb-fading>*,.wb-railIn .wb-iconButton,.wb-railIn .wb-newSession,.wb-railIn .wb-panelList,.wb-railIn .wb-footArea,.wb-railIn .wb-regionArea{transition:none;animation:none}}\n";
8653
+ var sidebar_default = ".wb-root{--dsh-sidebar-inline-padding:12px;height:100%;padding:var(--wb-len-6) var(--dsh-sidebar-inline-padding);box-sizing:border-box;background:var(--dsw-specific-sidebar-fill);color:var(--dsw-alias-label-primary);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);flex-direction:column;font-size:var(--dsw-font-s-14-font-size);display:flex}[data-platform=darwin] .wb-root{background:0 0}.wb-root.wb-collapsed{padding:var(--wb-len-18) var(--wb-len-10) var(--wb-len-6)}[data-windows-titlebar] .wb-root .wb-logoRow{height:var(--wb-len-40);margin:0;padding:0}[data-windows-titlebar] .wb-toggle{top:calc((var(--dsh-windows-titlebar-height) - var(--wb-len-28)) / 2);z-index:var(--wb-z-30);-webkit-app-region:no-drag;position:fixed;left:var(--wb-len-12)}[data-windows-titlebar] .wb-root.wb-collapsed .wb-logoRow{height:0}[data-windows-titlebar] .wb-root:not(.wb-collapsed) .wb-brand{padding-left:var(--wb-len-4)}[data-windows-titlebar] .wb-brandIdentity{transform:translateY(1px)}[data-windows-titlebar] .wb-brandMark{transform:translate(1px)}[data-windows-titlebar] .wb-brandName{font-weight:400}[data-windows-titlebar] .wb-root.wb-collapsed{padding:0}[data-windows-titlebar] .wb-collapsed .wb-panelList,[data-windows-titlebar] .wb-collapsed .wb-regionArea,[data-windows-titlebar] .wb-collapsed .wb-footArea{display:none}html[data-windows-titlebar]:has([data-sidebar-collapsed=true]){--dsh-windows-menu-start:84px}[data-windows-titlebar] .wb-collapsed .wb-toggle{corner-shape:round;width:var(--wb-len-28);height:var(--wb-len-28);color:var(--dsw-alias-label-secondary);border-radius:50%}[data-windows-titlebar] .wb-collapsed .wb-toggle .wb-panelIcon{display:inline-flex}.wb-logoRow{box-sizing:border-box;flex:none;justify-content:flex-end;align-items:center;gap:var(--wb-len-8);height:var(--wb-len-60);margin-bottom:var(--wb-len-4);padding:var(--wb-len-8) 0 var(--wb-len-8) var(--wb-len-4);display:flex;overflow:hidden}.wb-collapsed .wb-logoRow{justify-content:flex-start;height:var(--wb-len-36);margin-bottom:var(--wb-len-12);padding:0;overflow:visible}.wb-brand{min-width:0;color:inherit;cursor:pointer;background:0 0;border:none;flex:1;align-items:center;padding:0;display:inline-flex;overflow:hidden}[data-platform=darwin] .wb-brand{cursor:default}.wb-brandIdentity{align-items:center;gap:var(--wb-len-8);min-width:0;height:var(--wb-len-24);display:inline-flex}.wb-brandMark{flex:none;justify-content:center;align-items:center;display:inline-flex}.wb-brandName{letter-spacing:var(--wb-track-brand);align-items:center;gap:var(--wb-len-6);min-width:0;height:var(--wb-len-24);font-size:var(--wb-font-18);font-weight:600;line-height:var(--wb-line-24);display:inline-flex}.wb-panelIcon{display:inline-flex;align-items:center;justify-content:center}.wb-iconButton{border-radius:var(--dsw-radius-sm);cursor:pointer;width:var(--wb-len-28);height:var(--wb-len-28);color:var(--dsw-alias-label-secondary);background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex;position:relative}.wb-iconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.wb-iconButton.wb-toggle:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}.wb-collapsed .wb-iconButton{border-radius:var(--dsw-radius-md);width:var(--wb-len-36);height:var(--wb-len-36)}.wb-collapsed .wb-toggle .wb-panelIcon{display:none}.wb-collapsed .wb-toggle:hover .wb-panelIcon{display:inline}.wb-collapsed .wb-toggle:hover .wb-railMark{display:none}.wb-railMark{justify-content:center;align-items:center;display:inline-flex}.wb-collapsed .wb-iconButton{color:var(--dsw-alias-label-primary)}.wb-panelList{flex-direction:column;flex:none;gap:var(--wb-len-4);margin-bottom:var(--wb-len-8);display:flex}.wb-panelRow{box-sizing:border-box;border-radius:var(--dsw-radius-md);min-height:var(--wb-len-36);color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:var(--wb-len-8);margin:0 var(--wb-len-2);padding:var(--wb-len-7) var(--wb-len-8);line-height:var(--wb-line-22);display:flex}.wb-panelRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.wb-panelRow.wb-panelActive{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.wb-panelRow:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}.wb-panelGlyph{flex:none;justify-content:center;align-items:center;display:inline-flex}.wb-panelTitle{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.wb-collapsed .wb-panelList{gap:var(--wb-len-12);margin-bottom:var(--wb-len-12)}.wb-collapsed .wb-panelRow{width:var(--wb-len-36);height:var(--wb-len-36);color:var(--dsw-alias-label-primary);justify-content:center;margin:0;padding:0}.wb-regionArea{min-height:0;margin-left:var(--wb-len-neg-4);margin-right:calc(-1 * var(--dsh-sidebar-inline-padding));flex-direction:column;flex:1;padding-left:var(--wb-len-4);display:flex;overflow:hidden}.wb-collapsed .wb-regionArea{margin-left:0;margin-right:0;padding-left:0}.wb-footArea{flex-direction:column;flex:none;display:flex}.wb-settingsArea,.wb-footerActions{flex:none;width:100%;min-width:0}.wb-footerActions{display:flex}.wb-collapsed .wb-footArea{align-items:center}.wb-collapsed .wb-settingsArea,.wb-collapsed .wb-footerActions{justify-content:center;width:auto;display:flex}\n";
10197
8654
  //#endregion
10198
8655
  //#region src/shared/styles/chrome.css?raw
10199
- var chrome_default = ".wb-stripButton {\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n}.wb-stripIconFlip {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transform: scaleX(-1);\n}.wb-stripButton:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}.wb-stripButton:disabled {\n cursor: default;\n opacity: 1;\n}.wb-stripButtonActive {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}.wb-panelBody.wb-fixtureMany .wb-mockStrip {\n display: none;\n}@keyframes wb-spin {\n from {\n transform: rotate(0deg);\n }to {\n transform: rotate(360deg);\n }}";
8656
+ var chrome_default = ".wb-stripButton {\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n}.wb-stripIconFlip {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transform: scaleX(-1);\n}.wb-stripButton:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}.wb-stripButton:disabled {\n cursor: default;\n opacity: 1;\n}.wb-stripButtonActive {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}@keyframes wb-spin {\n from {\n transform: rotate(0deg);\n }to {\n transform: rotate(360deg);\n }}";
10200
8657
  //#endregion
10201
8658
  //#region src/shared/styles/board.css?raw
10202
- var board_default = "[data-wb-dot] {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n.wb-iconButton:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-iconButton: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}\n\n.wb-spinning svg {\n animation: wb-spin var(--wb-dur-0-9) linear infinite;\n}\n\n@keyframes wb-dash {\n 0% {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }50% {\n stroke-dasharray: 24 150;\n stroke-dashoffset: -6;\n }to {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }}\n";
8659
+ var board_default = "[data-wb-dot] {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n.wb-iconButton:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-iconButton: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}\n\n.wb-spinning svg {\n animation: wb-spin var(--wb-dur-0-9) linear infinite;\n}\n";
10203
8660
  //#endregion
10204
8661
  //#region src/shared/styles/motion.css?raw
10205
8662
  var motion_default = "[data-animating],\n[data-sidebar-right-panel] {\n --ds-transition-duration-slow: 0s;\n}\n";
@@ -10416,11 +8873,9 @@ window.__ModuleLoader__.load({
10416
8873
  hooks: {
10417
8874
  ...use_api_resource_exports,
10418
8875
  ...use_card_summary_exports,
10419
- ...use_fixture_pick_exports,
10420
8876
  ...use_facts_exports,
10421
8877
  ...use_host_write_exports,
10422
8878
  ...use_long_task_exports,
10423
- ...mock_mode_exports,
10424
8879
  ...use_capability_gate_exports,
10425
8880
  ...use_unit_board_exports,
10426
8881
  ...use_visible_busy_exports
@@ -10435,7 +8890,6 @@ window.__ModuleLoader__.load({
10435
8890
  ...dist_exports,
10436
8891
  ...dist_exports,
10437
8892
  ...dist_exports,
10438
- ...dist_exports,
10439
8893
  Tip
10440
8894
  },
10441
8895
  api: {
@@ -10453,7 +8907,7 @@ window.__ModuleLoader__.load({
10453
8907
  ...face.messages === void 0 ? {} : { messages: face.messages }
10454
8908
  }));
10455
8909
  }
10456
- var COMPONENT_CSS_MARKER = "\n.wb-activityBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding-top: var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-activityBlock:first-child {\n border-top: none;\n}\n\n.wb-activityBlockHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8);\n}\n\n.wb-activityLine {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-activityLineText {\n flex: none;\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n max-height: var(--wb-len-72);\n overflow-y: auto;\n}\n\n.wb-activityLineAt {\n flex: none;\n margin-left: auto;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-16);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-activityLine > .wb-activityLineAt,\n.wb-activityLine > .wb-activityLineActions {\n margin-left: auto;\n}\n\n.wb-activityLine > .wb-activityLineAt + .wb-activityLineActions {\n margin-left: 0;\n}\n\n.wb-activityLineActions {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n.wb-activityActionFailed {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-note {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-problem {\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-approvalCommand {\n max-width: 100%;\n}\n.wb-approvalPlan {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-approvalHint {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n.wb-approvalRows {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n}\n.wb-approvalRow {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n.wb-approvalLabel {\n flex: none;\n width: var(--wb-len-56);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-approvalValue {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-approvalWarn {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-8) var(--wb-len-20);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-cardTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardMeta {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-cardMeta::before {\n content: '\\00b7';\n margin-right: var(--wb-len-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen ~ .wb-cardRefresh {\n margin-left: 0;\n}\n\n.wb-cardOpen:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh {\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardRefresh:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-cardGear {\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-3);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardGear:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh.wb-spinning svg {\n animation: wb-spin var(--wb-dur-0-9) linear infinite;\n}\n\n.wb-card {\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n flex: none;\n}\n.wb-cardBody {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12);\n}\n.wb-cardBody > :not([data-wb-bleed]) {\n padding-left: var(--wb-len-8);\n padding-right: var(--wb-len-8);\n}\n\n.wb-choiceMenu {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n padding: var(--wb-len-4);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: transparent;\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-30);\n padding: var(--wb-len-6) 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 opacity: 0.5;\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-choiceLabel {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\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 opacity: 0.5;\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}:where(.wb-link) {\n margin-left: var(--wb-len-2);\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n white-space: nowrap;\n vertical-align: baseline;\n}\n\n:where(.wb-link:hover) {\n text-decoration: underline;\n}\n\n:where(.wb-link:focus-visible) {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n.wb-longTask {\n padding-top: var(--wb-len-12);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n.wb-longTaskHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n}\n\n.wb-longTaskLink {\n flex: none;\n}\n\n.wb-longTaskHeadline {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-longTaskProblem {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-longTaskDump {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-longTaskDump pre {\n margin: var(--wb-len-4) 0 0;\n max-height: var(--wb-len-220);\n overflow: auto;\n}\n.wb-mockStrip {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wb-len-4);\n padding: var(--wb-len-8) var(--wb-len-12);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n flex: none;\n}\n\n.wb-mockNote {\n flex: 1 0 100%;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-14);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-mockChip {\n flex: none;\n padding: var(--wb-len-2) var(--wb-len-7);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-pill);\n corner-shape: round;\n background: transparent;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-14);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n.wb-mockChip:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-mockChipOn {\n border-color: transparent;\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-label-primary-foreground);\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\n.wb-row:has(> [data-wb-dot]) {\n grid-template-columns: 84px minmax(0, 1fr);\n}\n.wb-rows {\n display: flex;\n flex-direction: column;\n}\n.wb-row {\n display: grid;\n grid-template-columns: 56px 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 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-formActions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n}\nsection.wb-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: 0;\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-base-16-font-size);\n line-height: var(--wb-line-24);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-stack {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n min-height: 0;\n}\n\n.wb-stateBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-stateBlockTitle {\n margin: 0;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n.wb-stateBlockHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-stateBlockActions {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n.wb-stateBlockResolving {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n.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[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-32);\n padding: var(--wb-len-6) var(--wb-len-12);\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._marketList_csyus_1 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._marketRow_csyus_10 {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--wb-len-14);\n row-gap: var(--wb-len-4);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-lg);\n}\n\n._marketIcon_csyus_20 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-40);\n height: var(--wb-len-40);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketMain_csyus_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_csyus_39 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketDesc_csyus_48 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketUsedBy_csyus_59 {\n margin-left: var(--wb-len-8);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n opacity: 0.75;\n}\n\n._marketUsedBy_csyus_59::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_csyus_39 ._marketVersion_csyus_73 {\n margin-left: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n}\n\n._marketVersion_csyus_73 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_csyus_73::before {\n content: '';\n display: inline-block;\n width: var(--wb-len-1);\n height: var(--wb-len-10);\n margin: 0 var(--wb-len-8) 0 var(--wb-len-2);\n vertical-align: -1px;\n background: var(--dsw-alias-border-l2);\n}\n\n._marketLocalTag_csyus_95 {\n margin-left: var(--wb-len-8);\n padding: 0 var(--wb-len-6);\n border: var(--wb-len-1) solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n}\n\n._marketEnd_csyus_106 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113::before {\n content: '';\n width: 0;\n height: var(--wb-len-14);\n border-left: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketActions_csyus_126 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_csyus_132 {\n color: var(--dsw-alias-state-warn-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._marketSelfDivider_csyus_138 {\n height: 0;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_csyus_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_csyus_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_csyus_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_csyus_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_csyus_169 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n\n._marketProgress_csyus_176 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-height: var(--wb-len-32);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketNote_csyus_186 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-warn-primary);\n overflow-wrap: anywhere;\n}\n\n._marketNotePlain_csyus_193 {\n grid-column: 2 / -1;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n overflow-wrap: anywhere;\n}\n\n._marketFailure_csyus_201 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._marketEmpty_csyus_208 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_csyus_213 {\n box-sizing: border-box;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-32);\n padding: 0 clamp(var(--wb-len-24), 4vw, var(--wb-len-48)) var(--wb-len-48);\n overflow-x: hidden;\n overflow-y: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_csyus_213 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_csyus_231 {\n box-sizing: border-box;\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-16);\n padding-top: var(--wb-len-28);\n}\n\n._marketPageTitle_csyus_239 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_csyus_244 {\n margin: var(--wb-len-4) 0 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketPageTools_csyus_250 {\n flex: none;\n align-self: center;\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--wb-len-16);\n}\n\n._marketIconButton_csyus_259 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n color: var(--dsw-alias-label-caption);\n cursor: pointer;\n}\n\n._marketIconButton_csyus_259:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_csyus_259:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_csyus_284 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_csyus_288 svg {\n animation: _wb-spin_csyus_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_csyus_292 {\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n border-radius: var(--dsw-radius-md);\n}\n\n._marketEmpty_csyus_208 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-64) var(--wb-len-16);\n text-align: center;\n}\n\n._marketChecking_csyus_309 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketEmptyTitle_csyus_317 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_csyus_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._foot_1ud1j_1 {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._footText_1ud1j_13 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1ud1j_18 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._wide_1lv8f_1 {\n justify-content: center;\n width: 100%;\n height: var(--wb-len-40);\n border-radius: var(--dsw-radius-md);\n}\n\n._dialog_1lv8f_8 {\n width: min(var(--wb-len-560), 100%);\n max-height: min(var(--wb-len-800), 100%);\n}\n\n._content_1lv8f_13 {\n min-height: 0;\n overflow: auto;\n}\n\n._stack_1lv8f_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._body_1lv8f_25 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._field_1lv8f_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._input_1lv8f_39 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-14);\n}\n\n._registryField_1lv8f_45 {\n height: var(--wb-len-32);\n margin-left: var(--wb-len-26);\n padding: 0 var(--wb-len-10);\n}\n\n._options_1lv8f_51 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8) var(--wb-len-12);\n}\n\n._guideToggle_1lv8f_59 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-4);\n align-self: flex-start;\n margin-top: var(--wb-len-4);\n padding: 0;\n border: 0;\n background: transparent;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._guideToggle_1lv8f_59:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._guideToggle_1lv8f_59 svg,\n._registryToggle_1lv8f_78 svg {\n transition: transform var(--wb-dur-0-12) ease;\n}\n\n._guideToggle_1lv8f_59[aria-expanded='true'] svg,\n._registryToggle_1lv8f_78[aria-expanded='true'] svg {\n transform: rotate(180deg);\n}\n\n._registryWrap_1lv8f_87 {\n position: relative;\n flex: none;\n}\n\n._registryToggle_1lv8f_78 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n height: var(--wb-len-26);\n padding: 0 var(--wb-len-8) 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n font: inherit;\n font-size: var(--wb-font-12-5);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._registryToggle_1lv8f_78:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._registryToggle_1lv8f_78:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n._registryToggle_1lv8f_78[aria-expanded='true'] {\n border-color: var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n._registryChosen_1lv8f_121 {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n._registry_1lv8f_45 {\n position: fixed;\n z-index: var(--wb-z-1100);\n box-sizing: border-box;\n width: min(var(--wb-len-440), 100vw - var(--wb-len-24));\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-12);\n border: 0;\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-2);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l3);\n box-shadow: var(--dsw-elevation-prominent);\n}\n\n._registryOption_1lv8f_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid transparent;\n border-radius: var(--dsw-radius-lg);\n cursor: pointer;\n}\n\nlabel._registryOption_1lv8f_143 {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wb-len-10);\n}\n\n._registryPick_1lv8f_159 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n cursor: pointer;\n}\n\n._registryOption_1lv8f_143[data-checked='true'] {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 40%, transparent);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._registryOption_1lv8f_143 input[type='radio'] {\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: var(--wb-len-2) 0 0;\n accent-color: var(--dsw-alias-brand-primary);\n}\n\n._registryTitle_1lv8f_179 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n font: var(--dsw-font-xs-13);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n._registryHint_1lv8f_189 {\n margin-left: var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._inputError_1lv8f_197 {\n margin: var(--wb-len-neg-4) 0 0 var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._guide_1lv8f_59 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._guideList_1lv8f_214 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._guideItem_1lv8f_223 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0;\n}\n\n._guideIndex_1lv8f_230 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n border-radius: var(--wb-radius-pill);\n corner-shape: round;\n background: var(--dsw-alias-bg-module-platform);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._guideMain_1lv8f_244 {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0;\n min-width: 0;\n}\n\n._guideTitle_1lv8f_252 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._guideHint_1lv8f_258 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._guideExample_1lv8f_264 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._guideExample_1lv8f_264 code {\n font-family: var(--dsw-font-mono, monospace);\n}\n\n._guideExampleLabel_1lv8f_274 {\n color: var(--dsw-alias-label-caption);\n}\n\n._footer_1lv8f_278 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-20);\n width: 100%;\n}\n\n._hero_1lv8f_285 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0 var(--wb-len-4);\n text-align: center;\n}\n\n._heroIcon_1lv8f_294 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-44);\n height: var(--wb-len-44);\n color: var(--dsw-alias-label-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='done'] {\n color: var(--dsw-alias-state-success-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='error'] {\n color: var(--dsw-alias-state-warn-label);\n}\n\n._pendingTitle_1lv8f_311 {\n margin: 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n._wizardTitle_1lv8f_319 {\n margin: 0;\n font-size: var(--wb-font-18);\n line-height: var(--wb-len-26);\n font-weight: 600;\n}\n\n._subject_1lv8f_326 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\n text-align: center;\n}\n\n._subjectName_1lv8f_337 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n overflow-wrap: anywhere;\n}\n\n._subjectMeta_1lv8f_343,\n._subjectDesc_1lv8f_344 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._result_1lv8f_351,\n._resultWarn_1lv8f_352 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-primary);\n}\n\n._resultWarn_1lv8f_352 {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n}\n\n._resultMeta_1lv8f_365 {\n margin: 0;\n padding: 0 var(--wb-len-12);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._approval_1lv8f_373 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-state-warn-primary);\n border-radius: var(--dsw-radius-lg);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._approvalTitle_1lv8f_383 {\n margin: 0;\n font: var(--dsw-font-s-14);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._approvalText_1lv8f_390 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._approvalCaution_1lv8f_396 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._note_1lv8f_403 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._noteWarn_1lv8f_410 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._noteError_1lv8f_414 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._problem_1lv8f_418 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._detailLabel_1lv8f_425 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._detail_1lv8f_425 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-3);\n font-family: var(--dsw-font-mono, monospace);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n._note_1enlz_1 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-8);\n margin: 0;\n padding: var(--wb-len-10) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-state-warn-tertiary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._note_1enlz_1 > svg {\n flex: none;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-state-warn-primary);\n}\n._body_lw2ph_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._lead_lw2ph_7 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._sources_lw2ph_14 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._sourcesLabel_lw2ph_21 {\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-secondary);\n}\n\nbutton._sourceOn_lw2ph_26 {\n border-color: var(--dsw-alias-brand-primary);\n}\n._sourceCount_lw2ph_29 {\n margin-left: var(--wb-len-4);\n font-variant-numeric: tabular-nums;\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._reading_lw2ph_36 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._status_lw2ph_42 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failure_lw2ph_52 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n column-gap: var(--wb-len-10);\n row-gap: var(--wb-len-2);\n color: var(--dsw-alias-state-error-primary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n\n._failureTitle_lw2ph_62 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._failureHint_lw2ph_69 {\n grid-column: 1;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failureAction_lw2ph_74 {\n grid-column: 2;\n grid-row: 1;\n justify-self: end;\n}\n\n._rows_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._row_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-settings-card-stroke);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-settings-card-fill);\n}\n\n._head_lw2ph_99 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._pick_lw2ph_106 {\n flex: 0 1 auto;\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._pick_lw2ph_106 > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._code_lw2ph_118 {\n --dsl-code-block-background: var(--dsw-alias-bg-layer-1);\n margin: 0;\n}\n\n._missing_lw2ph_123,\n._conflict_lw2ph_124 {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._foot_lw2ph_130 {\n display: flex;\n justify-content: flex-end;\n}\n._actions_jlw8j_1[hidden],\n._progress_jlw8j_2[hidden],\n._commandRow_jlw8j_3[hidden],\n._bridge_jlw8j_4[hidden],\n._raw_jlw8j_5[hidden] {\n display: none;\n}\n\n._gate_jlw8j_9 {\n position: fixed;\n inset: 0;\n z-index: var(--wb-z-top);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--wb-len-24);\n background: var(--dsw-alias-bg-base);\n}\n\n._card_jlw8j_20 {\n width: 100%;\n max-width: var(--wb-len-420);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-16);\n text-align: center;\n}\n\n._card_jlw8j_20:has(._actions_jlw8j_1:not([hidden])),\n._card_jlw8j_20:has(._bridge_jlw8j_4:not([hidden])) {\n max-width: var(--wb-len-520);\n}\n\n._title_jlw8j_35 {\n margin: 0;\n font-size: var(--dsw-font-base-16-font-size);\n line-height: var(--wb-line-24);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._steps_jlw8j_50 {\n list-style: none;\n margin: var(--wb-len-6) 0 0;\n padding: 0;\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n text-align: left;\n}\n\n._step_jlw8j_50 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-6) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._step_jlw8j_50[data-status='running'] {\n color: var(--dsw-alias-label-primary);\n}\n\n._mark_jlw8j_77 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-14);\n height: var(--wb-len-14);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._step_jlw8j_50[data-status='ok'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._step_jlw8j_50[data-status='warn'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._step_jlw8j_50[data-status='failed'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._label_jlw8j_102 {\n flex: none;\n}\n\n._detail_jlw8j_106 {\n margin-left: auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._progress_jlw8j_2 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._elapsed_jlw8j_124 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._error_jlw8j_132 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n max-height: var(--wb-len-120);\n overflow: auto;\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n white-space: pre-wrap;\n word-break: break-all;\n text-align: left;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._commandRow_jlw8j_3 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n margin: 0 0 var(--wb-len-8);\n padding-right: var(--wb-len-4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._copy_jlw8j_158 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n padding: 0;\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._copy_jlw8j_158:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._command_jlw8j_3 {\n flex: 1;\n min-width: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-primary);\n}\n\n._buttons_jlw8j_191 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-12);\n}\n\n._mockSlot_jlw8j_198 {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n justify-content: center;\n background: var(--dsw-alias-bg-base);\n}\n\n._button_jlw8j_191 {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n._button_jlw8j_191:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._button_jlw8j_191:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n._actions_jlw8j_1,\n._bridge_jlw8j_4 {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-4);\n padding: var(--wb-len-14) var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-1);\n text-align: left;\n}\n\n._fixTitle_jlw8j_249 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._actions_jlw8j_1 ._hint_jlw8j_43,\n._bridge_jlw8j_4 ._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._actions_jlw8j_1 ._commandRow_jlw8j_3,\n._bridge_jlw8j_4 ._commandRow_jlw8j_3 {\n margin: 0;\n}\n\n._actions_jlw8j_1 ._buttons_jlw8j_191,\n._bridge_jlw8j_4 ._buttons_jlw8j_191 {\n justify-content: flex-start;\n}\n\n._raw_jlw8j_5 {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._rawSummary_jlw8j_282 {\n cursor: pointer;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._actions_jlw8j_1 ._error_jlw8j_132,\n._bridge_jlw8j_4 ._error_jlw8j_132 {\n margin-top: var(--wb-len-6);\n}\n\n._bridgeLines_jlw8j_292 {\n margin: 0;\n padding-left: var(--wb-len-18);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._bridgeLine_jlw8j_292 a {\n display: block;\n margin-top: var(--wb-len-4);\n width: fit-content;\n}\n\n._link_jlw8j_309 {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n\n._link_jlw8j_309::after {\n content: '↗';\n margin-left: var(--wb-len-2);\n}\n\n._link_jlw8j_309:hover {\n text-decoration: underline;\n}\n\n._loading_jlw8j_323 {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._loading_jlw8j_323[hidden] {\n display: none;\n}\n\n._loadingMotion_jlw8j_332 {\n transform-origin: center;\n animation: _wb-spin_jlw8j_1 var(--wb-dur-1-5) linear infinite;\n}\n\n._loadingTrack_jlw8j_337,\n._loadingArc_jlw8j_338 {\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n}\n\n._loadingTrack_jlw8j_337 {\n opacity: 0.25;\n}\n\n._loadingArc_jlw8j_338 {\n stroke-dasharray: 12 150;\n animation: _wb-dash_jlw8j_1 var(--wb-dur-1-5) ease-in-out infinite;\n}\n\n@keyframes _wb-spin_jlw8j_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes _wb-dash_jlw8j_1 {\n 0% {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n 50% {\n stroke-dasharray: 24 150;\n stroke-dashoffset: -6;\n }\n to {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._loadingMotion_jlw8j_332,\n ._loadingArc_jlw8j_338 {\n animation: none;\n }\n}\n._group_1hxis_1 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n}\n\n._button_1hxis_7 {\n flex: none;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n}\n\n._button_1hxis_7:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._active_1hxis_19 {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._icon_1hxis_23 {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n._icon_1hxis_23 svg {\n display: block;\n width: var(--wb-len-15);\n height: var(--wb-len-15);\n}\n\n._mirror_1hxis_35 {\n transform: scaleX(-1);\n}\n._stripTabs_1dqp4_1 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n min-width: 0;\n overflow: hidden;\n}\n\n._tab_1dqp4_9 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: none;\n font: inherit;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-16);\n max-width: 100%;\n}\n\n._tabActive_1dqp4_25 {\n color: var(--dsw-alias-label-primary);\n}\n\n._tabQuiet_1dqp4_29 {\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._tabQuiet_1dqp4_29:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._tabTitle_1dqp4_39 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._sep_1dqp4_49 {\n flex: none;\n color: var(--dsw-alias-label-dimmed);\n}\n._trigger_15ptp_1 {\n display: flex;\n align-items: center;\n}\n\n._pop_15ptp_6 {\n position: absolute;\n top: calc(var(--wb-len-38) + var(--wb-len-8));\n right: var(--wb-len-6);\n z-index: var(--wb-z-30);\n width: min(var(--wb-len-360), calc(100% - var(--wb-len-12)));\n max-width: calc(100vw - var(--wb-len-48));\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-2);\n box-shadow: var(--dsw-shadow-lv3);\n overflow: hidden;\n}\n\n._head_15ptp_20 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10) var(--wb-len-12) var(--wb-len-9) var(--wb-len-14);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._title_15ptp_28 {\n flex: 1;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._rowControls_15ptp_36 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._reset_15ptp_43 {\n flex: none;\n padding: var(--wb-len-3) var(--wb-len-8);\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._reset_15ptp_43:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_15ptp_43:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_15ptp_65 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._row_15ptp_36 {\n position: relative;\n display: grid;\n grid-template-columns: 12px minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-sm);\n cursor: default;\n}\n\n._rowDragging_15ptp_85 {\n cursor: grabbing;\n}\n\n._rowBlocked_15ptp_89 {\n cursor: not-allowed;\n}\n\n._listDragging_15ptp_93 ._rowControls_15ptp_36 {\n pointer-events: none;\n}\n\n._row_15ptp_36:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOff_15ptp_101 {\n opacity: 0.55;\n}\n\n._rowOff_15ptp_101:hover {\n opacity: 1;\n}\n\n._rowOver_15ptp_109::before {\n content: '';\n position: absolute;\n top: var(--wb-len-neg-3);\n left: var(--wb-len-8);\n right: var(--wb-len-8);\n height: var(--wb-len-2);\n background: var(--dsw-alias-brand-primary);\n}\n\n._ghost_15ptp_119 {\n position: fixed;\n z-index: var(--wb-z-40);\n pointer-events: none;\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--wb-static-shadow-ghost);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n}\n\n._grip_15ptp_134 {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n text-align: center;\n color: var(--dsw-alias-label-tertiary);\n user-select: none;\n cursor: grab;\n touch-action: none;\n}\n\n._gripDragging_15ptp_144 {\n cursor: grabbing;\n}\n\n._gripBlocked_15ptp_148 {\n cursor: not-allowed;\n}\n\n._label_15ptp_152 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_15ptp_159 {\n min-width: 0;\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n\n._error_15ptp_170 {\n margin: 0;\n padding: 0 var(--wb-len-14) var(--wb-len-10);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._dep_15ptp_178 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n\n._group_15ptp_186 {\n padding-top: var(--wb-len-6);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._groupTitle_15ptp_191 {\n margin: 0;\n padding: var(--wb-len-2) var(--wb-len-8) 0 var(--wb-len-14);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n font-weight: 400;\n color: var(--dsw-alias-label-tertiary);\n}\n._panel_135e7_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_135e7_1[data-fullscreen] {\n z-index: var(--wb-z-40);\n}\n\n._panel_135e7_1[data-open] {\n visibility: visible;\n}\n\n._columns_135e7_18 {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n align-items: start;\n gap: var(--wb-len-12);\n}\n\n._columns_135e7_18[data-two] {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n._column_135e7_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._root_1vd78_1 {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}\n\n._anchor_1vd78_7 {\n display: block;\n width: 100%;\n}\n\n._menu_1vd78_12 {\n min-width: var(--wb-len-240);\n max-width: var(--wb-len-360);\n}\n\n._trigger_1vd78_17 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n width: 100%;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n._trigger_1vd78_17:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._trigger_1vd78_17: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}\n\n._glyph_1vd78_44 {\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_1vd78_54 {\n color: var(--dsw-alias-state-business-primary);\n}\n\n._triggerName_1vd78_58 {\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_1vd78_69 {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._name_1vd78_77 {\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_1vd78_58 ._name_1vd78_77 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._chevron_1vd78_90 {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n}\n\n._row_1vd78_96 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n width: 100%;\n min-width: 0;\n}\n\n._trailing_1vd78_104 {\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_1vd78_104 ._rowAction_1vd78_114 {\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_1vd78_96 ._name_1vd78_77 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._current_1vd78_127 {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-primary);\n}\n\n._field_1vd78_134 {\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n box-sizing: border-box;\n width: 100%;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._field_1vd78_134:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n}\n\n._searchIcon_1vd78_151 {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._field_1vd78_134 ._search_1vd78_151 {\n flex: 1;\n min-width: 0;\n height: var(--wb-len-24);\n border: none;\n background: transparent;\n}\n\n._field_1vd78_134 ._search_1vd78_151:focus {\n border-color: transparent;\n box-shadow: none;\n}\n._dialog_1vye5_1 {\n width: min(var(--wb-len-420), 100%);\n}\n\n._stack_1vye5_5 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._input_1vye5_12 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-12);\n}\n\n._meta_1vye5_18 {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._blocker_1oaj0_1 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-20) var(--wb-len-16);\n text-align: center;\n}\n\n._icon_1oaj0_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_1oaj0_15 {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_1oaj0_23 {\n margin: 0;\n max-width: var(--wb-len-42em);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n text-wrap: pretty;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 {\n align-items: flex-start;\n gap: var(--wb-len-6);\n padding: var(--wb-len-4) 0 var(--wb-len-2);\n text-align: left;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._title_1oaj0_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._hint_1oaj0_23 {\n max-width: 100%;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._actions_1oaj0_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._raw_1oaj0_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_1oaj0_48 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-6);\n}\n\n._raw_1oaj0_52 {\n margin-top: var(--wb-len-10);\n width: 100%;\n max-width: var(--wb-len-360);\n text-align: left;\n}\n\n._notice_1oaj0_71 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n column-gap: var(--wb-len-10);\n margin: 0 0 var(--wb-len-10);\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-left: 2px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._notice_1oaj0_71._noticeFlat_1oaj0_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_1oaj0_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_1oaj0_98 {\n font-size: var(--wb-font-12-5);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._noticeHint_1oaj0_105 {\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._noticeActions_1oaj0_112 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin-top: var(--wb-len-neg-2);\n}\n\n._failure_1oaj0_119 {\n margin: var(--wb-len-8) 0 0;\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._failureDetail_1oaj0_127 {\n display: block;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-label-tertiary);\n white-space: pre-wrap;\n}\n\n._inlineAction_1oaj0_134 {\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n}\n\n._inlineAction_1oaj0_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n._rawText_1oaj0_146 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
8910
+ var COMPONENT_CSS_MARKER = "\n.wb-activityBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding-top: var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-activityBlock:first-child {\n padding-top: 0;\n border-top: none;\n}\n\n.wb-activityBlockHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8);\n}\n\n.wb-activityLine {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-activityLineText {\n flex: none;\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n max-height: var(--wb-len-72);\n overflow-y: auto;\n}\n\n.wb-activityLineAt {\n flex: none;\n margin-left: auto;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-16);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-activityLine > .wb-activityLineAt,\n.wb-activityLine > .wb-activityLineActions {\n margin-left: auto;\n}\n\n.wb-activityLine > .wb-activityLineAt + .wb-activityLineActions {\n margin-left: 0;\n}\n\n.wb-activityLineActions {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n.wb-activityActionFailed {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-note {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-problem {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-approvalCommand {\n max-width: 100%;\n}\n.wb-approvalPlan {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-approvalHint {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n.wb-approvalRows {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n}\n.wb-approvalRow {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n.wb-approvalLabel {\n flex: none;\n width: var(--wb-len-56);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-approvalValue {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-approvalWarn {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-8) var(--wb-card-gutter);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-cardTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardMeta {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-cardMeta::before {\n content: '\\00b7';\n margin-right: var(--wb-len-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen ~ .wb-cardRefresh {\n margin-left: 0;\n}\n\n.wb-cardOpen:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh {\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardRefresh:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-cardGear {\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-3);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardGear:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-card {\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n flex: none;\n}\n.wb-cardBody {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-card-gutter);\n font-size: var(--dsw-font-xxs-12-font-size);\n}\n.wb-cardBleed {\n margin-inline: calc(-1 * var(--wb-card-gutter));\n}\n._anchor_yq4s2_1 {\n display: contents;\n}\n\n.wb-choiceMenu {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n padding: var(--wb-len-4);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: transparent;\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-30);\n padding: var(--wb-len-6) 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 overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\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}:where(.wb-link) {\n margin-left: var(--wb-len-2);\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n white-space: nowrap;\n vertical-align: baseline;\n}\n\n:where(.wb-link:hover) {\n text-decoration: underline;\n}\n\n:where(.wb-link:focus-visible) {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n.wb-longTask {\n padding-top: var(--wb-len-12);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n.wb-longTaskHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n}\n\n.wb-longTaskLink {\n flex: none;\n}\n\n.wb-longTaskHeadline {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-longTaskProblem {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-longTaskDump {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-longTaskDump pre {\n margin: var(--wb-len-4) 0 0;\n max-height: var(--wb-len-220);\n overflow: auto;\n}\n.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\n.wb-row:has(> [data-wb-dot]) {\n grid-template-columns: 84px minmax(0, 1fr);\n}\n.wb-rows {\n display: flex;\n flex-direction: column;\n}\n.wb-row {\n display: grid;\n grid-template-columns: 56px 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 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-formActions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\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-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-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-32);\n padding: var(--wb-len-6) var(--wb-len-12);\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-32);\n padding: var(--wb-len-6) var(--wb-len-12);\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: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-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-32);\n padding: var(--wb-len-6) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n.wb-selectSearch:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectSearch.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-selectSearch.wb-selectGhost:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: none;\n}\n\n.wb-selectSearchIcon {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-textField.wb-selectSearchInput {\n flex: 1;\n min-width: 0;\n min-height: 0;\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.wb-textField.wb-selectSearchInput:focus {\n box-shadow: none;\n}\n\n.wb-selectFallback {\n width: 100%;\n}\n\n.wb-selectHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-stack {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n min-height: 0;\n}\n\n.wb-stateBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-stateBlockTitle {\n margin: 0;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n.wb-stateBlockHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-stateBlockActions {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n.wb-stateBlockResolving {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n._marketList_csyus_1 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._marketRow_csyus_10 {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--wb-len-14);\n row-gap: var(--wb-len-4);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-lg);\n}\n\n._marketIcon_csyus_20 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-40);\n height: var(--wb-len-40);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketMain_csyus_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_csyus_39 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketDesc_csyus_48 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketUsedBy_csyus_59 {\n margin-left: var(--wb-len-8);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n opacity: 0.75;\n}\n\n._marketUsedBy_csyus_59::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_csyus_39 ._marketVersion_csyus_73 {\n margin-left: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n}\n\n._marketVersion_csyus_73 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_csyus_73::before {\n content: '';\n display: inline-block;\n width: var(--wb-len-1);\n height: var(--wb-len-10);\n margin: 0 var(--wb-len-8) 0 var(--wb-len-2);\n vertical-align: -1px;\n background: var(--dsw-alias-border-l2);\n}\n\n._marketLocalTag_csyus_95 {\n margin-left: var(--wb-len-8);\n padding: 0 var(--wb-len-6);\n border: var(--wb-len-1) solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n}\n\n._marketEnd_csyus_106 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113::before {\n content: '';\n width: 0;\n height: var(--wb-len-14);\n border-left: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketActions_csyus_126 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_csyus_132 {\n color: var(--dsw-alias-state-warn-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._marketSelfDivider_csyus_138 {\n height: 0;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_csyus_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_csyus_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_csyus_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_csyus_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_csyus_169 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n\n._marketProgress_csyus_176 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-height: var(--wb-len-32);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketNote_csyus_186 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-warn-primary);\n overflow-wrap: anywhere;\n}\n\n._marketNotePlain_csyus_193 {\n grid-column: 2 / -1;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n overflow-wrap: anywhere;\n}\n\n._marketFailure_csyus_201 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._marketEmpty_csyus_208 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_csyus_213 {\n box-sizing: border-box;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-32);\n padding: 0 clamp(var(--wb-len-24), 4vw, var(--wb-len-48)) var(--wb-len-48);\n overflow-x: hidden;\n overflow-y: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_csyus_213 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_csyus_231 {\n box-sizing: border-box;\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-16);\n padding-top: var(--wb-len-28);\n}\n\n._marketPageTitle_csyus_239 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_csyus_244 {\n margin: var(--wb-len-4) 0 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketPageTools_csyus_250 {\n flex: none;\n align-self: center;\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--wb-len-16);\n}\n\n._marketIconButton_csyus_259 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n color: var(--dsw-alias-label-caption);\n cursor: pointer;\n}\n\n._marketIconButton_csyus_259:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_csyus_259:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_csyus_284 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_csyus_288 svg {\n animation: _wb-spin_csyus_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_csyus_292 {\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n border-radius: var(--dsw-radius-md);\n}\n\n._marketEmpty_csyus_208 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-64) var(--wb-len-16);\n text-align: center;\n}\n\n._marketChecking_csyus_309 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketEmptyTitle_csyus_317 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_csyus_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._foot_1ud1j_1 {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._footText_1ud1j_13 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1ud1j_18 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._wide_1lv8f_1 {\n justify-content: center;\n width: 100%;\n height: var(--wb-len-40);\n border-radius: var(--dsw-radius-md);\n}\n\n._dialog_1lv8f_8 {\n width: min(var(--wb-len-560), 100%);\n max-height: min(var(--wb-len-800), 100%);\n}\n\n._content_1lv8f_13 {\n min-height: 0;\n overflow: auto;\n}\n\n._stack_1lv8f_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._body_1lv8f_25 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._field_1lv8f_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._input_1lv8f_39 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-14);\n}\n\n._registryField_1lv8f_45 {\n height: var(--wb-len-32);\n margin-left: var(--wb-len-26);\n padding: 0 var(--wb-len-10);\n}\n\n._options_1lv8f_51 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8) var(--wb-len-12);\n}\n\n._guideToggle_1lv8f_59 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-4);\n align-self: flex-start;\n margin-top: var(--wb-len-4);\n padding: 0;\n border: 0;\n background: transparent;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._guideToggle_1lv8f_59:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._guideToggle_1lv8f_59 svg,\n._registryToggle_1lv8f_78 svg {\n transition: transform var(--wb-dur-0-12) ease;\n}\n\n._guideToggle_1lv8f_59[aria-expanded='true'] svg,\n._registryToggle_1lv8f_78[aria-expanded='true'] svg {\n transform: rotate(180deg);\n}\n\n._registryWrap_1lv8f_87 {\n position: relative;\n flex: none;\n}\n\n._registryToggle_1lv8f_78 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n height: var(--wb-len-26);\n padding: 0 var(--wb-len-8) 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n font: inherit;\n font-size: var(--wb-font-12-5);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._registryToggle_1lv8f_78:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._registryToggle_1lv8f_78:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n._registryToggle_1lv8f_78[aria-expanded='true'] {\n border-color: var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n._registryChosen_1lv8f_121 {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n._registry_1lv8f_45 {\n position: fixed;\n z-index: var(--wb-z-1100);\n box-sizing: border-box;\n width: min(var(--wb-len-440), 100vw - var(--wb-len-24));\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-12);\n border: 0;\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-2);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l3);\n box-shadow: var(--dsw-elevation-prominent);\n}\n\n._registryOption_1lv8f_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid transparent;\n border-radius: var(--dsw-radius-lg);\n cursor: pointer;\n}\n\nlabel._registryOption_1lv8f_143 {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wb-len-10);\n}\n\n._registryPick_1lv8f_159 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n cursor: pointer;\n}\n\n._registryOption_1lv8f_143[data-checked='true'] {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 40%, transparent);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._registryOption_1lv8f_143 input[type='radio'] {\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: var(--wb-len-2) 0 0;\n accent-color: var(--dsw-alias-brand-primary);\n}\n\n._registryTitle_1lv8f_179 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n font: var(--dsw-font-xs-13);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n._registryHint_1lv8f_189 {\n margin-left: var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._inputError_1lv8f_197 {\n margin: var(--wb-len-neg-4) 0 0 var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._guide_1lv8f_59 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._guideList_1lv8f_214 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._guideItem_1lv8f_223 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0;\n}\n\n._guideIndex_1lv8f_230 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n border-radius: var(--wb-radius-pill);\n corner-shape: round;\n background: var(--dsw-alias-bg-module-platform);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._guideMain_1lv8f_244 {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0;\n min-width: 0;\n}\n\n._guideTitle_1lv8f_252 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._guideHint_1lv8f_258 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._guideExample_1lv8f_264 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._guideExample_1lv8f_264 code {\n font-family: var(--dsw-font-mono, monospace);\n}\n\n._guideExampleLabel_1lv8f_274 {\n color: var(--dsw-alias-label-caption);\n}\n\n._footer_1lv8f_278 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-20);\n width: 100%;\n}\n\n._hero_1lv8f_285 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0 var(--wb-len-4);\n text-align: center;\n}\n\n._heroIcon_1lv8f_294 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-44);\n height: var(--wb-len-44);\n color: var(--dsw-alias-label-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='done'] {\n color: var(--dsw-alias-state-success-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='error'] {\n color: var(--dsw-alias-state-warn-label);\n}\n\n._pendingTitle_1lv8f_311 {\n margin: 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n._wizardTitle_1lv8f_319 {\n margin: 0;\n font-size: var(--wb-font-18);\n line-height: var(--wb-len-26);\n font-weight: 600;\n}\n\n._subject_1lv8f_326 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\n text-align: center;\n}\n\n._subjectName_1lv8f_337 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n overflow-wrap: anywhere;\n}\n\n._subjectMeta_1lv8f_343,\n._subjectDesc_1lv8f_344 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._result_1lv8f_351,\n._resultWarn_1lv8f_352 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-primary);\n}\n\n._resultWarn_1lv8f_352 {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n}\n\n._resultMeta_1lv8f_365 {\n margin: 0;\n padding: 0 var(--wb-len-12);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._approval_1lv8f_373 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-state-warn-primary);\n border-radius: var(--dsw-radius-lg);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._approvalTitle_1lv8f_383 {\n margin: 0;\n font: var(--dsw-font-s-14);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._approvalText_1lv8f_390 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._approvalCaution_1lv8f_396 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._note_1lv8f_403 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._noteWarn_1lv8f_410 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._noteError_1lv8f_414 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._problem_1lv8f_418 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._detailLabel_1lv8f_425 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._detail_1lv8f_425 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-3);\n font-family: var(--dsw-font-mono, monospace);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n._note_1enlz_1 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-8);\n margin: 0;\n padding: var(--wb-len-10) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-state-warn-tertiary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._note_1enlz_1 > svg {\n flex: none;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-state-warn-primary);\n}\n._body_lw2ph_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._lead_lw2ph_7 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._sources_lw2ph_14 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._sourcesLabel_lw2ph_21 {\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-secondary);\n}\n\nbutton._sourceOn_lw2ph_26 {\n border-color: var(--dsw-alias-brand-primary);\n}\n._sourceCount_lw2ph_29 {\n margin-left: var(--wb-len-4);\n font-variant-numeric: tabular-nums;\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._reading_lw2ph_36 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._status_lw2ph_42 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failure_lw2ph_52 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n column-gap: var(--wb-len-10);\n row-gap: var(--wb-len-2);\n color: var(--dsw-alias-state-error-primary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n\n._failureTitle_lw2ph_62 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._failureHint_lw2ph_69 {\n grid-column: 1;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failureAction_lw2ph_74 {\n grid-column: 2;\n grid-row: 1;\n justify-self: end;\n}\n\n._rows_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._row_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-settings-card-stroke);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-settings-card-fill);\n}\n\n._head_lw2ph_99 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._pick_lw2ph_106 {\n flex: 0 1 auto;\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._pick_lw2ph_106 > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._code_lw2ph_118 {\n --dsl-code-block-background: var(--dsw-alias-bg-layer-1);\n margin: 0;\n}\n\n._missing_lw2ph_123,\n._conflict_lw2ph_124 {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._foot_lw2ph_130 {\n display: flex;\n justify-content: flex-end;\n}\n._actions_jlw8j_1[hidden],\n._progress_jlw8j_2[hidden],\n._commandRow_jlw8j_3[hidden],\n._bridge_jlw8j_4[hidden],\n._raw_jlw8j_5[hidden] {\n display: none;\n}\n\n._gate_jlw8j_9 {\n position: fixed;\n inset: 0;\n z-index: var(--wb-z-top);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--wb-len-24);\n background: var(--dsw-alias-bg-base);\n}\n\n._card_jlw8j_20 {\n width: 100%;\n max-width: var(--wb-len-420);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-16);\n text-align: center;\n}\n\n._card_jlw8j_20:has(._actions_jlw8j_1:not([hidden])),\n._card_jlw8j_20:has(._bridge_jlw8j_4:not([hidden])) {\n max-width: var(--wb-len-520);\n}\n\n._title_jlw8j_35 {\n margin: 0;\n font-size: var(--dsw-font-base-16-font-size);\n line-height: var(--wb-line-24);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._steps_jlw8j_50 {\n list-style: none;\n margin: var(--wb-len-6) 0 0;\n padding: 0;\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n text-align: left;\n}\n\n._step_jlw8j_50 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-6) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._step_jlw8j_50[data-status='running'] {\n color: var(--dsw-alias-label-primary);\n}\n\n._mark_jlw8j_77 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-14);\n height: var(--wb-len-14);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._step_jlw8j_50[data-status='ok'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._step_jlw8j_50[data-status='warn'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._step_jlw8j_50[data-status='failed'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._label_jlw8j_102 {\n flex: none;\n}\n\n._detail_jlw8j_106 {\n margin-left: auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._progress_jlw8j_2 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._elapsed_jlw8j_124 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._error_jlw8j_132 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n max-height: var(--wb-len-120);\n overflow: auto;\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n white-space: pre-wrap;\n word-break: break-all;\n text-align: left;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._commandRow_jlw8j_3 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n margin: 0 0 var(--wb-len-8);\n padding-right: var(--wb-len-4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._copy_jlw8j_158 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n padding: 0;\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._copy_jlw8j_158:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._command_jlw8j_3 {\n flex: 1;\n min-width: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-primary);\n}\n\n._buttons_jlw8j_191 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-12);\n}\n\n._mockSlot_jlw8j_198 {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n justify-content: center;\n background: var(--dsw-alias-bg-base);\n}\n\n._button_jlw8j_191 {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n._button_jlw8j_191:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._button_jlw8j_191:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n._actions_jlw8j_1,\n._bridge_jlw8j_4 {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-4);\n padding: var(--wb-len-14) var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-1);\n text-align: left;\n}\n\n._fixTitle_jlw8j_249 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._actions_jlw8j_1 ._hint_jlw8j_43,\n._bridge_jlw8j_4 ._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._actions_jlw8j_1 ._commandRow_jlw8j_3,\n._bridge_jlw8j_4 ._commandRow_jlw8j_3 {\n margin: 0;\n}\n\n._actions_jlw8j_1 ._buttons_jlw8j_191,\n._bridge_jlw8j_4 ._buttons_jlw8j_191 {\n justify-content: flex-start;\n}\n\n._raw_jlw8j_5 {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._rawSummary_jlw8j_282 {\n cursor: pointer;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._actions_jlw8j_1 ._error_jlw8j_132,\n._bridge_jlw8j_4 ._error_jlw8j_132 {\n margin-top: var(--wb-len-6);\n}\n\n._bridgeLines_jlw8j_292 {\n margin: 0;\n padding-left: var(--wb-len-18);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._bridgeLine_jlw8j_292 a {\n display: block;\n margin-top: var(--wb-len-4);\n width: fit-content;\n}\n\n._link_jlw8j_309 {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n\n._link_jlw8j_309::after {\n content: '↗';\n margin-left: var(--wb-len-2);\n}\n\n._link_jlw8j_309:hover {\n text-decoration: underline;\n}\n\n._loading_jlw8j_323 {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._loading_jlw8j_323[hidden] {\n display: none;\n}\n\n._loadingMotion_jlw8j_332 {\n transform-origin: center;\n animation: _wb-spin_jlw8j_1 var(--wb-dur-1-5) linear infinite;\n}\n\n._loadingTrack_jlw8j_337,\n._loadingArc_jlw8j_338 {\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n}\n\n._loadingTrack_jlw8j_337 {\n opacity: 0.25;\n}\n\n._loadingArc_jlw8j_338 {\n stroke-dasharray: 12 150;\n animation: _wb-dash_jlw8j_1 var(--wb-dur-1-5) ease-in-out infinite;\n}\n\n@keyframes _wb-spin_jlw8j_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes _wb-dash_jlw8j_1 {\n 0% {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n 50% {\n stroke-dasharray: 24 150;\n stroke-dashoffset: -6;\n }\n to {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._loadingMotion_jlw8j_332,\n ._loadingArc_jlw8j_338 {\n animation: none;\n }\n}\n._group_1hxis_1 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n}\n\n._button_1hxis_7 {\n flex: none;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n}\n\n._button_1hxis_7:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._active_1hxis_19 {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._icon_1hxis_23 {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n._icon_1hxis_23 svg {\n display: block;\n width: var(--wb-len-15);\n height: var(--wb-len-15);\n}\n\n._mirror_1hxis_35 {\n transform: scaleX(-1);\n}\n._stripTabs_1dqp4_1 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n min-width: 0;\n overflow: hidden;\n}\n\n._tab_1dqp4_9 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: none;\n font: inherit;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-16);\n max-width: 100%;\n}\n\n._tabActive_1dqp4_25 {\n color: var(--dsw-alias-label-primary);\n}\n\n._tabQuiet_1dqp4_29 {\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._tabQuiet_1dqp4_29:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._tabTitle_1dqp4_39 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._sep_1dqp4_49 {\n flex: none;\n color: var(--dsw-alias-label-dimmed);\n}\n._trigger_15ptp_1 {\n display: flex;\n align-items: center;\n}\n\n._pop_15ptp_6 {\n position: absolute;\n top: calc(var(--wb-len-38) + var(--wb-len-8));\n right: var(--wb-len-6);\n z-index: var(--wb-z-30);\n width: min(var(--wb-len-360), calc(100% - var(--wb-len-12)));\n max-width: calc(100vw - var(--wb-len-48));\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-2);\n box-shadow: var(--dsw-shadow-lv3);\n overflow: hidden;\n}\n\n._head_15ptp_20 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10) var(--wb-len-12) var(--wb-len-9) var(--wb-len-14);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._title_15ptp_28 {\n flex: 1;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._rowControls_15ptp_36 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._reset_15ptp_43 {\n flex: none;\n padding: var(--wb-len-3) var(--wb-len-8);\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._reset_15ptp_43:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_15ptp_43:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_15ptp_65 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._row_15ptp_36 {\n position: relative;\n display: grid;\n grid-template-columns: 12px minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-sm);\n cursor: default;\n}\n\n._rowDragging_15ptp_85 {\n cursor: grabbing;\n}\n\n._rowBlocked_15ptp_89 {\n cursor: not-allowed;\n}\n\n._listDragging_15ptp_93 ._rowControls_15ptp_36 {\n pointer-events: none;\n}\n\n._row_15ptp_36:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOff_15ptp_101 {\n opacity: 0.55;\n}\n\n._rowOff_15ptp_101:hover {\n opacity: 1;\n}\n\n._rowOver_15ptp_109::before {\n content: '';\n position: absolute;\n top: var(--wb-len-neg-3);\n left: var(--wb-len-8);\n right: var(--wb-len-8);\n height: var(--wb-len-2);\n background: var(--dsw-alias-brand-primary);\n}\n\n._ghost_15ptp_119 {\n position: fixed;\n z-index: var(--wb-z-40);\n pointer-events: none;\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--wb-static-shadow-ghost);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n}\n\n._grip_15ptp_134 {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n text-align: center;\n color: var(--dsw-alias-label-tertiary);\n user-select: none;\n cursor: grab;\n touch-action: none;\n}\n\n._gripDragging_15ptp_144 {\n cursor: grabbing;\n}\n\n._gripBlocked_15ptp_148 {\n cursor: not-allowed;\n}\n\n._label_15ptp_152 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_15ptp_159 {\n min-width: 0;\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n\n._error_15ptp_170 {\n margin: 0;\n padding: 0 var(--wb-len-14) var(--wb-len-10);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._dep_15ptp_178 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n\n._group_15ptp_186 {\n padding-top: var(--wb-len-6);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._groupTitle_15ptp_191 {\n margin: 0;\n padding: var(--wb-len-2) var(--wb-len-8) 0 var(--wb-len-14);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n font-weight: 400;\n color: var(--dsw-alias-label-tertiary);\n}\n._panel_135e7_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_135e7_1[data-fullscreen] {\n z-index: var(--wb-z-40);\n}\n\n._panel_135e7_1[data-open] {\n visibility: visible;\n}\n\n._columns_135e7_18 {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n align-items: start;\n gap: var(--wb-len-12);\n}\n\n._columns_135e7_18[data-two] {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n._column_135e7_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._root_1ubj2_1 {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}\n\n._glyph_1ubj2_7 {\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_1ubj2_17 {\n color: var(--dsw-alias-state-business-primary);\n}\n\n._triggerName_1ubj2_21 {\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_1ubj2_32 {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._name_1ubj2_40 {\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_1ubj2_21 ._name_1ubj2_40 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._row_1ubj2_53 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n width: 100%;\n min-width: 0;\n}\n\n._trailing_1ubj2_61 {\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_1ubj2_61 ._rowAction_1ubj2_71 {\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_1ubj2_53 ._name_1ubj2_40 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._current_1ubj2_84 {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-primary);\n}\n._dialog_1vye5_1 {\n width: min(var(--wb-len-420), 100%);\n}\n\n._stack_1vye5_5 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._input_1vye5_12 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-12);\n}\n\n._meta_1vye5_18 {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._blocker_1oaj0_1 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-20) var(--wb-len-16);\n text-align: center;\n}\n\n._icon_1oaj0_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_1oaj0_15 {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_1oaj0_23 {\n margin: 0;\n max-width: var(--wb-len-42em);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n text-wrap: pretty;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 {\n align-items: flex-start;\n gap: var(--wb-len-6);\n padding: var(--wb-len-4) 0 var(--wb-len-2);\n text-align: left;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._title_1oaj0_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._hint_1oaj0_23 {\n max-width: 100%;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._actions_1oaj0_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._raw_1oaj0_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_1oaj0_48 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-6);\n}\n\n._raw_1oaj0_52 {\n margin-top: var(--wb-len-10);\n width: 100%;\n max-width: var(--wb-len-360);\n text-align: left;\n}\n\n._notice_1oaj0_71 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n column-gap: var(--wb-len-10);\n margin: 0 0 var(--wb-len-10);\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-left: 2px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._notice_1oaj0_71._noticeFlat_1oaj0_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_1oaj0_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_1oaj0_98 {\n font-size: var(--wb-font-12-5);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._noticeHint_1oaj0_105 {\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._noticeActions_1oaj0_112 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin-top: var(--wb-len-neg-2);\n}\n\n._failure_1oaj0_119 {\n margin: var(--wb-len-8) 0 0;\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._failureDetail_1oaj0_127 {\n display: block;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-label-tertiary);\n white-space: pre-wrap;\n}\n\n._inlineAction_1oaj0_134 {\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n}\n\n._inlineAction_1oaj0_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n._rawText_1oaj0_146 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
10457
8911
  function workbenchCss() {
10458
8912
  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}`;
10459
8913
  }
@@ -10524,34 +8978,10 @@ window.__ModuleLoader__.load({
10524
8978
  };
10525
8979
  }, "dsh-workbench: dictionaries");
10526
8980
  const workshopWorkspace = () => ctx.workspaces.list.getSnapshot().items.find((item) => isWorkshopPath(item.path));
10527
- const openDiySession = (workspaceId, fallback) => {
10528
- const remoteCreate = sessionCreateOf(ctx.remote);
10529
- try {
10530
- if (remoteCreate === void 0) throw new Error("session 那一组拿不到");
10531
- remoteCreate({
10532
- workspaceId,
10533
- agentPreset: DIY_PRESET_ID
10534
- }).then((created) => {
10535
- const id = created.sessionId;
10536
- if (id === void 0) throw new Error("没有 sessionId");
10537
- ctx.uiWorkspace.openSession(id);
10538
- }).catch((error) => {
10539
- console.warn(`[dsh-workbench] 落 DIY 模式失败,仍切工作区 —— ${String(error)}`);
10540
- fallback();
10541
- });
10542
- } catch (error) {
10543
- console.warn(`[dsh-workbench] ctx.remote 拿不到 —— ${String(error)}`);
10544
- fallback();
10545
- }
10546
- };
10547
8981
  const startSessionIn = (workspaceId) => {
10548
- const fallback = () => ctx.uiWorkspace.startSession(workspaceId);
10549
- const workshop = workshopWorkspace();
10550
- if (workshop === void 0 || workshop.workspaceId !== workspaceId) {
10551
- fallback();
10552
- return;
10553
- }
10554
- openDiySession(workspaceId, fallback);
8982
+ const options = diyStartOptions(workspaceId, workshopWorkspace()?.workspaceId);
8983
+ if (options === void 0) ctx.uiWorkspace.startSession(workspaceId);
8984
+ else ctx.uiWorkspace.startSession(workspaceId, options);
10555
8985
  };
10556
8986
  const buildModule = () => {
10557
8987
  const workshop = workshopWorkspace();
@@ -10560,9 +8990,7 @@ window.__ModuleLoader__.load({
10560
8990
  return;
10561
8991
  }
10562
8992
  selectProject(workshop.workspaceId);
10563
- openDiySession(workshop.workspaceId, () => {
10564
- ctx.uiWorkspace.startSession(workshop.workspaceId);
10565
- });
8993
+ startSessionIn(workshop.workspaceId);
10566
8994
  };
10567
8995
  const rightbarActions = {
10568
8996
  openMarket: () => ctx.layout.selectPanel(MARKET_PANEL_ID),
@@ -10759,10 +9187,6 @@ window.__ModuleLoader__.load({
10759
9187
  function menuOpenStateFactory(_standard, state) {
10760
9188
  return () => state;
10761
9189
  }
10762
- function sessionCreateOf(remote) {
10763
- const namespaces = remote?.namespaces;
10764
- return namespaces?.get?.("session")?.service?.create?.bind(namespaces.get("session")?.service);
10765
- }
10766
9190
  //#endregion
10767
9191
  exports.apply = apply;
10768
9192
  exports.inject = inject;