@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
@@ -672,6 +672,8 @@ var react = require("react");
672
672
  var h = react.createElement;
673
673
  var Fragment = react.Fragment;
674
674
  var Component = react.Component;
675
+ var createContext = react.createContext;
676
+ var useContext = react.useContext;
675
677
  var useState = react.useState;
676
678
  var useEffect = react.useEffect;
677
679
  var useLayoutEffect = react.useLayoutEffect;
@@ -879,6 +881,18 @@ function Card({ t, title, refreshing, onRefresh, meta, head, children }) {
879
881
  meta
880
882
  }) : head, h("div", { className: "wb-cardBody" }, children));
881
883
  }
884
+ var CardAnchor_module_default = { anchor: "_anchor_yq4s2_1" };
885
+ //#endregion
886
+ //#region ../shared/dist/components/CardAnchor.js
887
+ function cardIdOf(unit) {
888
+ return unit === null || unit === "" ? void 0 : `wb-card-${unit}`;
889
+ }
890
+ function CardAnchor({ unit, children }) {
891
+ return h("div", {
892
+ id: cardIdOf(unit),
893
+ className: CardAnchor_module_default.anchor
894
+ }, children);
895
+ }
882
896
  //#endregion
883
897
  //#region ../shared/dist/components/ChoiceGroup.js
884
898
  function ChoiceMenu(input) {
@@ -1009,20 +1023,6 @@ function LongTaskRow(props) {
1009
1023
  }))));
1010
1024
  }
1011
1025
  //#endregion
1012
- //#region ../shared/dist/components/MockStrip.js
1013
- function MockStrip({ mocks, index, onPick, note, real }) {
1014
- return h("div", { className: "wb-mockStrip" }, h("span", { className: "wb-mockNote" }, note ?? "夹具:只切状态,不发请求"), real === void 0 ? null : h("button", {
1015
- type: "button",
1016
- className: `wb-mockChip${real.active ? " wb-mockChipOn" : ""}`,
1017
- onClick: real.onPick
1018
- }, real.label), mocks.map((mock, at) => h("button", {
1019
- key: mock.id,
1020
- type: "button",
1021
- className: `wb-mockChip${at === index ? " wb-mockChipOn" : ""}`,
1022
- onClick: () => onPick(at)
1023
- }, mock.label)));
1024
- }
1025
- //#endregion
1026
1026
  //#region ../shared/dist/components/ResourceStates.js
1027
1027
  function SkeletonRows({ rows = 4 }) {
1028
1028
  return h("div", {
@@ -1084,14 +1084,9 @@ function SettingsSection({ label, title, action, children }) {
1084
1084
  }, h("header", { className: "wb-settingsHead" }, h("span", { className: "wb-settingsTitle" }, title), action), children);
1085
1085
  }
1086
1086
  //#endregion
1087
- //#region ../shared/dist/components/Stack.js
1088
- function Stack({ children }) {
1089
- return h("div", { className: "wb-stack" }, children);
1090
- }
1091
- //#endregion
1092
- //#region ../shared/dist/components/StateBlock.js
1093
- function StateBlock({ title, dot, hint, actions, resolving, children }) {
1094
- 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));
1087
+ //#region ../shared/dist/components/Field.js
1088
+ function Field({ label, hint, children }) {
1089
+ return h("label", { className: "wb-field" }, h("span", { className: "wb-fieldLabel" }, label), children, hint === void 0 ? null : h("span", { className: "wb-fieldHint" }, hint));
1095
1090
  }
1096
1091
  //#endregion
1097
1092
  //#region ../shared/dist/components/TextField.js
@@ -1103,9 +1098,280 @@ function TextField({ invalid = false, className, ...rest }) {
1103
1098
  });
1104
1099
  }
1105
1100
  //#endregion
1106
- //#region ../shared/dist/components/Field.js
1107
- function Field({ label, hint, children }) {
1108
- return h("label", { className: "wb-field" }, h("span", { className: "wb-fieldLabel" }, label), children, hint === void 0 ? null : h("span", { className: "wb-fieldHint" }, hint));
1101
+ //#region ../shared/dist/components/SelectField.js
1102
+ var FOOTER_ID = "__wb-select-footer__";
1103
+ var EMPTY_ID = "__wb-select-empty__";
1104
+ function mergeClass(...parts) {
1105
+ return parts.filter((one) => one !== void 0 && one !== "").join(" ");
1106
+ }
1107
+ function itemOf(option) {
1108
+ return {
1109
+ id: option.value,
1110
+ label: option.label,
1111
+ ...option.icon === void 0 ? {} : { icon: option.icon },
1112
+ ...option.disabled === true ? { disabled: true } : {}
1113
+ };
1114
+ }
1115
+ function triggerNode(args) {
1116
+ return h("button", {
1117
+ type: "button",
1118
+ id: args.id,
1119
+ className: args.className,
1120
+ disabled: args.disabled,
1121
+ "aria-haspopup": "listbox",
1122
+ "aria-expanded": args.open,
1123
+ "aria-label": args.ariaLabel,
1124
+ title: args.title,
1125
+ onClick: args.onOpen
1126
+ }, 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 })));
1127
+ }
1128
+ function loadingNode(args) {
1129
+ return h("button", {
1130
+ type: "button",
1131
+ id: args.id,
1132
+ className: `${args.className} wb-selectLoading`,
1133
+ disabled: true,
1134
+ "aria-busy": "true",
1135
+ "aria-label": args.ariaLabel,
1136
+ title: args.loadingText
1137
+ }, 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, {
1138
+ state: "ongoing",
1139
+ size: 14
1140
+ })));
1141
+ }
1142
+ function searchNode(args) {
1143
+ return h("span", {
1144
+ ref: args.boxRef,
1145
+ className: args.className
1146
+ }, h("span", { className: "wb-selectSearchIcon" }, h(_deepseek_ai_dsh_client_ui_primitives.IconSearchOutlineRegular, { size: 14 })), h(TextField, {
1147
+ id: args.id,
1148
+ name: args.name,
1149
+ className: "wb-selectSearchInput",
1150
+ "aria-label": args.ariaLabel,
1151
+ placeholder: args.placeholder,
1152
+ value: args.query,
1153
+ onChange: (event) => args.onQuery(event.currentTarget.value),
1154
+ onKeyDown: (event) => {
1155
+ if (event.nativeEvent.isComposing) return;
1156
+ args.onKey(event);
1157
+ }
1158
+ }));
1159
+ }
1160
+ function menuNode(args) {
1161
+ return h(_deepseek_ai_dsh_client_ui_primitives.Menu, {
1162
+ open: args.open,
1163
+ portal: true,
1164
+ className: "wb-selectAnchor",
1165
+ listClassName: args.listClassName,
1166
+ anchor: args.anchor,
1167
+ align: "start",
1168
+ side: "bottom",
1169
+ selection: args.selection,
1170
+ selectedId: args.selectedId,
1171
+ items: args.items,
1172
+ footer: args.footer,
1173
+ onSelect: args.onPick,
1174
+ onClose: args.onCancel
1175
+ });
1176
+ }
1177
+ function framed(label, hint, className, control) {
1178
+ const inner = label === void 0 ? hint === void 0 ? control : h("span", { className: "wb-select" }, control, h("span", { className: "wb-selectHint" }, hint)) : h(Field, {
1179
+ label,
1180
+ hint
1181
+ }, control);
1182
+ return className === void 0 ? inner : h("div", { className }, inner);
1183
+ }
1184
+ function searchTextOf(option) {
1185
+ if (option.searchText !== void 0) return option.searchText;
1186
+ return typeof option.label === "string" ? option.label : "";
1187
+ }
1188
+ function defaultSelectFilter(option, query) {
1189
+ const needle = query.trim().toLowerCase();
1190
+ if (needle === "") return true;
1191
+ return searchTextOf(option).toLowerCase().includes(needle);
1192
+ }
1193
+ function filterSelectOptions(options, query, filter = defaultSelectFilter) {
1194
+ return options.filter((option) => filter(option, query));
1195
+ }
1196
+ function selectCursorValue(shown, cursor) {
1197
+ if (cursor === null || shown.length === 0) return null;
1198
+ return shown[Math.min(cursor, shown.length - 1)]?.value ?? null;
1199
+ }
1200
+ function stepSelectCursor(shown, cursor, step) {
1201
+ if (shown.length === 0) return null;
1202
+ if (cursor === null) return step === 1 ? 0 : shown.length - 1;
1203
+ return (cursor + step + shown.length) % shown.length;
1204
+ }
1205
+ function selectEntries(shown, emptyText) {
1206
+ if (shown.length === 0) return emptyText === void 0 ? [] : [{
1207
+ type: "label",
1208
+ id: EMPTY_ID,
1209
+ text: emptyText
1210
+ }];
1211
+ const out = [];
1212
+ let group = null;
1213
+ for (const option of shown) {
1214
+ if (option.group !== void 0 && option.group !== group) {
1215
+ out.push({
1216
+ type: "label",
1217
+ id: `__wb-select-group-${String(out.length)}`,
1218
+ text: option.group
1219
+ });
1220
+ group = option.group;
1221
+ }
1222
+ out.push(itemOf(option));
1223
+ }
1224
+ return out;
1225
+ }
1226
+ function useSelectState(props) {
1227
+ const { options, filter = defaultSelectFilter, emptyText, open: openProp, onOpenChange } = props;
1228
+ const [openState, setOpenState] = useState(false);
1229
+ const [query, setQuery] = useState("");
1230
+ const [cursor, setCursor] = useState(null);
1231
+ const boxRef = useRef(null);
1232
+ const triggerRef = useRef(null);
1233
+ const wasOpenRef = useRef(false);
1234
+ const pickedRef = useRef(false);
1235
+ const closedByUsRef = useRef(false);
1236
+ const open = openProp ?? openState;
1237
+ const setOpen = (next) => {
1238
+ if (openProp === void 0) setOpenState(next);
1239
+ onOpenChange?.(next);
1240
+ };
1241
+ useEffect(() => {
1242
+ if (!open || props.search === false) return;
1243
+ boxRef.current?.querySelector("input")?.focus();
1244
+ }, [open, props.search]);
1245
+ useEffect(() => {
1246
+ if (open) {
1247
+ wasOpenRef.current = true;
1248
+ return;
1249
+ }
1250
+ if (!wasOpenRef.current) return;
1251
+ wasOpenRef.current = false;
1252
+ const closedByUs = closedByUsRef.current;
1253
+ const picked = pickedRef.current;
1254
+ closedByUsRef.current = false;
1255
+ pickedRef.current = false;
1256
+ if (!closedByUs || picked) return;
1257
+ triggerRef.current?.focus();
1258
+ }, [open]);
1259
+ const shown = useMemo(() => filterSelectOptions(options, query, filter), [
1260
+ options,
1261
+ query,
1262
+ filter
1263
+ ]);
1264
+ const close = (picked) => {
1265
+ closedByUsRef.current = true;
1266
+ pickedRef.current = picked;
1267
+ setOpen(false);
1268
+ setQuery("");
1269
+ setCursor(null);
1270
+ };
1271
+ return {
1272
+ open,
1273
+ setOpen,
1274
+ query,
1275
+ cursor,
1276
+ setCursor,
1277
+ setQuery,
1278
+ shown,
1279
+ close,
1280
+ boxRef,
1281
+ triggerRef,
1282
+ empty: typeof emptyText === "function" ? emptyText(query) : emptyText
1283
+ };
1284
+ }
1285
+ function SelectField(props) {
1286
+ 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;
1287
+ const state = useSelectState(props);
1288
+ const current = options.find((option) => option.value === value);
1289
+ const variantClass = variant === "ghost" ? "wb-selectGhost" : void 0;
1290
+ const triggerClass = mergeClass("wb-selectTrigger", variantClass);
1291
+ if (loading) return framed(label, hint, className, loadingNode({
1292
+ id,
1293
+ className: triggerClass,
1294
+ ariaLabel,
1295
+ loadingText
1296
+ }));
1297
+ if (fallback !== void 0 && options.length === 0) return framed(label, hint, className, h(TextField, {
1298
+ id,
1299
+ name,
1300
+ className: "wb-selectFallback",
1301
+ "aria-label": ariaLabel,
1302
+ value: fallback.value,
1303
+ onChange: (event) => fallback.onChange(event.currentTarget.value)
1304
+ }));
1305
+ const trigger = triggerNode({
1306
+ id,
1307
+ className: triggerClass,
1308
+ disabled,
1309
+ open: state.open,
1310
+ ariaLabel,
1311
+ title,
1312
+ icon,
1313
+ value: current === void 0 ? h("span", { className: "wb-selectPlaceholder" }, placeholder ?? "—") : renderValue === void 0 ? current.label : renderValue(current),
1314
+ onOpen: () => state.setOpen(true)
1315
+ });
1316
+ const anchor = state.open && search ? searchNode({
1317
+ boxRef: state.boxRef,
1318
+ className: mergeClass("wb-selectSearch", variantClass),
1319
+ id,
1320
+ name,
1321
+ ariaLabel: searchLabel,
1322
+ placeholder: searchPlaceholder,
1323
+ query: state.query,
1324
+ onQuery: (next) => {
1325
+ state.setQuery(next);
1326
+ state.setCursor(null);
1327
+ },
1328
+ onKey: (event) => {
1329
+ if (event.key === "ArrowDown" || event.key === "ArrowUp") {
1330
+ event.stopPropagation();
1331
+ event.preventDefault();
1332
+ state.setCursor((at) => stepSelectCursor(state.shown, at, event.key === "ArrowDown" ? 1 : -1));
1333
+ return;
1334
+ }
1335
+ if (event.key !== "Enter") return;
1336
+ event.stopPropagation();
1337
+ const pick = state.shown[Math.min(state.cursor ?? 0, state.shown.length - 1)];
1338
+ if (pick === void 0) return;
1339
+ state.close(true);
1340
+ onChange(pick.value);
1341
+ }
1342
+ }) : trigger;
1343
+ return framed(label, hint, className, menuNode({
1344
+ open: state.open,
1345
+ listClassName: mergeClass("wb-selectMenu", menuClassName),
1346
+ anchor,
1347
+ selection,
1348
+ selectedId: selectCursorValue(state.shown, state.cursor) ?? void 0,
1349
+ items: selectEntries(state.shown, state.empty),
1350
+ footer: footer === void 0 ? void 0 : [{
1351
+ id: FOOTER_ID,
1352
+ label: footer.label,
1353
+ ...footer.icon === void 0 ? {} : { icon: footer.icon }
1354
+ }],
1355
+ onPick: (picked) => {
1356
+ state.close(true);
1357
+ if (picked === FOOTER_ID) {
1358
+ onFooter?.();
1359
+ return;
1360
+ }
1361
+ onChange(picked);
1362
+ },
1363
+ onCancel: () => state.close(false)
1364
+ }));
1365
+ }
1366
+ //#endregion
1367
+ //#region ../shared/dist/components/Stack.js
1368
+ function Stack({ children }) {
1369
+ return h("div", { className: "wb-stack" }, children);
1370
+ }
1371
+ //#endregion
1372
+ //#region ../shared/dist/components/StateBlock.js
1373
+ function StateBlock({ title, dot, hint, actions, resolving, children }) {
1374
+ 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));
1109
1375
  }
1110
1376
  //#endregion
1111
1377
  //#region ../shared/dist/components/icons.js
@@ -1234,6 +1500,62 @@ function IconModules({ size = 16 }) {
1234
1500
  strokeWidth: "1.2"
1235
1501
  }));
1236
1502
  }
1503
+ function IconModuleMark({ size = 16 }) {
1504
+ return h(Shell, {
1505
+ size,
1506
+ viewBox: "0 0 24 24"
1507
+ }, h("defs", null, h("linearGradient", {
1508
+ id: "workbench-module-mark",
1509
+ x1: "0%",
1510
+ y1: "0%",
1511
+ x2: "100%",
1512
+ y2: "100%"
1513
+ }, h("stop", {
1514
+ offset: "0%",
1515
+ stopColor: "#3b82f6"
1516
+ }), h("stop", {
1517
+ offset: "55%",
1518
+ stopColor: "#8b5cf6"
1519
+ }), h("stop", {
1520
+ offset: "100%",
1521
+ stopColor: "#14b8a6"
1522
+ }))), h("rect", {
1523
+ width: 24,
1524
+ height: 24,
1525
+ rx: 7,
1526
+ fill: "url(#workbench-module-mark)"
1527
+ }), h("rect", {
1528
+ x: "4.6",
1529
+ y: "4.6",
1530
+ width: "6.2",
1531
+ height: "6.2",
1532
+ rx: "1.9",
1533
+ fill: "#ffffff"
1534
+ }), h("rect", {
1535
+ x: "13.2",
1536
+ y: "4.6",
1537
+ width: "6.2",
1538
+ height: "6.2",
1539
+ rx: "1.9",
1540
+ fill: "#ffffff",
1541
+ fillOpacity: .78
1542
+ }), h("rect", {
1543
+ x: "4.6",
1544
+ y: "13.2",
1545
+ width: "6.2",
1546
+ height: "6.2",
1547
+ rx: "1.9",
1548
+ fill: "#ffffff",
1549
+ fillOpacity: .78
1550
+ }), h("rect", {
1551
+ x: "13.2",
1552
+ y: "13.2",
1553
+ width: "6.2",
1554
+ height: "6.2",
1555
+ rx: "1.9",
1556
+ fill: "#ffffff"
1557
+ }));
1558
+ }
1237
1559
  function IconPanelScreen({ size = 16 }) {
1238
1560
  return h("svg", {
1239
1561
  width: size,
@@ -1412,7 +1734,7 @@ var en = {
1412
1734
  "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.",
1413
1735
  "panels.market.pluginKeptHeld": "Files kept: this one is yours, and a module letting go will not remove it.",
1414
1736
  "panels.market.pluginKeptUnnamed": "Files kept for now: this one cannot be identified as a plugin, so it is unclear who needs it.",
1415
- "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).",
1737
+ "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.",
1416
1738
  "panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
1417
1739
  "panels.market.foot": "After installing, enable it in the panel page of that project.",
1418
1740
  "panels.market.recheck": "Check for updates",
@@ -1814,7 +2136,7 @@ var zh = {
1814
2136
  "panels.market.pluginKeptUnsure": "文件先留着:这台机器上还有模块看不出用了什么,说不准谁在用它。",
1815
2137
  "panels.market.pluginKeptHeld": "文件留着:你自己装的那一份,模块放手不动它。",
1816
2138
  "panels.market.pluginKeptUnnamed": "文件先留着:看不出这是哪个插件,说不准谁在用它。",
1817
- "panels.market.pluginBroken": "这份装坏了:看不出它是个插件。可以卸载,或者直接跟 agent 说:用 workbench_modules 的 install-bundle 按包名再装一次。",
2139
+ "panels.market.pluginBroken": "这份装坏了:看不出它是个插件。可以卸载,或者直接跟 agent 说:用 workbench_modules_install_bundle 按包名再装一次。",
1818
2140
  "panels.market.restartNeeded": "新版装好了,重启一次才生效。",
1819
2141
  "panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
1820
2142
  "panels.market.recheck": "重新检查更新",
@@ -2422,6 +2744,7 @@ var dist_exports = /* @__PURE__ */ __exportAll({
2422
2744
  CODING_ISSUES_SERVICE: () => CODING_ISSUES_SERVICE,
2423
2745
  CONTEXT_MARKER_NAME: () => CONTEXT_MARKER_NAME,
2424
2746
  Card: () => Card,
2747
+ CardAnchor: () => CardAnchor,
2425
2748
  CardBoundary: () => CardBoundary,
2426
2749
  CardHead: () => CardHead,
2427
2750
  CenteredState: () => CenteredState,
@@ -2440,6 +2763,7 @@ var dist_exports = /* @__PURE__ */ __exportAll({
2440
2763
  INSTALL_TIMEOUT_MS: () => INSTALL_TIMEOUT_MS,
2441
2764
  IconBrandMark: () => IconBrandMark,
2442
2765
  IconConversation: () => IconConversation,
2766
+ IconModuleMark: () => IconModuleMark,
2443
2767
  IconModules: () => IconModules,
2444
2768
  IconNpm: () => IconNpm,
2445
2769
  IconOpencli: () => IconOpencli,
@@ -2451,7 +2775,6 @@ var dist_exports = /* @__PURE__ */ __exportAll({
2451
2775
  Link: () => Link,
2452
2776
  LongTaskRow: () => LongTaskRow,
2453
2777
  MIN_BUSY_MS: () => 500,
2454
- MockStrip: () => MockStrip,
2455
2778
  Note: () => Note,
2456
2779
  OPENCLI_MAX_CONCURRENT: () => 4,
2457
2780
  OPENCLI_PIN: () => OPENCLI_PIN,
@@ -2480,6 +2803,7 @@ var dist_exports = /* @__PURE__ */ __exportAll({
2480
2803
  STORAGE_KEY_RIGHTBAR_COLUMN: () => STORAGE_KEY_RIGHTBAR_COLUMN,
2481
2804
  SUPPORTED_API_VERSIONS: () => SUPPORTED_API_VERSIONS,
2482
2805
  SaveBar: () => SaveBar,
2806
+ SelectField: () => SelectField,
2483
2807
  SettingsSection: () => SettingsSection,
2484
2808
  SkeletonRows: () => SkeletonRows,
2485
2809
  Stack: () => Stack,
@@ -2497,17 +2821,21 @@ var dist_exports = /* @__PURE__ */ __exportAll({
2497
2821
  blockerOfError: () => blockerOfError,
2498
2822
  blockerPending: () => blockerPending,
2499
2823
  buildMarker: () => buildMarker,
2824
+ cardIdOf: () => cardIdOf,
2825
+ createContext: () => createContext,
2500
2826
  createFactChannel: () => createFactChannel,
2501
2827
  createPanelStateStore: () => createPanelStateStore,
2502
2828
  cx: () => cx,
2503
2829
  declarationProblemsOf: () => declarationProblemsOf,
2504
2830
  decodeRef: () => decodeRef,
2831
+ defaultSelectFilter: () => defaultSelectFilter,
2505
2832
  dictionaries: () => dictionaries,
2506
2833
  en: () => en,
2507
2834
  encodeRef: () => encodeRef,
2508
2835
  errorReasonOf: () => errorReasonOf,
2509
2836
  excerpt: () => excerpt,
2510
2837
  factOfRoute: () => factOfRoute,
2838
+ filterSelectOptions: () => filterSelectOptions,
2511
2839
  gateOf: () => gateOf,
2512
2840
  h: () => h,
2513
2841
  hasEnvSupply: () => hasEnvSupply,
@@ -2536,11 +2864,16 @@ var dist_exports = /* @__PURE__ */ __exportAll({
2536
2864
  relativeTimeCompact: () => relativeTimeCompact,
2537
2865
  runsRouteOf: () => runsRouteOf,
2538
2866
  scopePrefixOf: () => scopePrefixOf,
2867
+ searchTextOf: () => searchTextOf,
2868
+ selectCursorValue: () => selectCursorValue,
2869
+ selectEntries: () => selectEntries,
2539
2870
  shortenPath: () => shortenPath,
2540
2871
  splitBlocker: () => splitBlocker,
2872
+ stepSelectCursor: () => stepSelectCursor,
2541
2873
  tailLines: () => tailLines,
2542
2874
  unitFactScope: () => unitFactScope,
2543
2875
  useCallback: () => useCallback,
2876
+ useContext: () => useContext,
2544
2877
  useEffect: () => useEffect,
2545
2878
  useLayoutEffect: () => useLayoutEffect,
2546
2879
  useMemo: () => useMemo,
@@ -2670,10 +3003,10 @@ var silentNextProbe = false;
2670
3003
  function markNextProbeSilent() {
2671
3004
  silentNextProbe = true;
2672
3005
  }
2673
- var probe$2 = NO_PROBE;
3006
+ var probe = NO_PROBE;
2674
3007
  var probeListeners = /* @__PURE__ */ new Set();
2675
3008
  function probeValue() {
2676
- return probe$2;
3009
+ return probe;
2677
3010
  }
2678
3011
  function subscribeProbe(listener) {
2679
3012
  probeListeners.add(listener);
@@ -2682,8 +3015,8 @@ function subscribeProbe(listener) {
2682
3015
  };
2683
3016
  }
2684
3017
  function setProbe(next) {
2685
- if (next === probe$2) return;
2686
- probe$2 = next;
3018
+ if (next === probe) return;
3019
+ probe = next;
2687
3020
  for (const listener of [...probeListeners]) listener();
2688
3021
  }
2689
3022
  var CAPABILITY_FACT = "capability";
@@ -2702,7 +3035,7 @@ function subscribeCapabilities(listener) {
2702
3035
  function setCapabilities(next, rechecked = false) {
2703
3036
  if (next === null) setProbe(NO_PROBE);
2704
3037
  else if (rechecked) setProbe({
2705
- ...probe$2,
3038
+ ...probe,
2706
3039
  checkedAt: Date.now()
2707
3040
  });
2708
3041
  if (next === current$1) return;
@@ -2710,15 +3043,15 @@ function setCapabilities(next, rechecked = false) {
2710
3043
  for (const listener of [...listeners$3]) listener();
2711
3044
  }
2712
3045
  function beginProbe() {
2713
- if (probe$2.checking) return;
3046
+ if (probe.checking) return;
2714
3047
  setProbe({
2715
- ...probe$2,
3048
+ ...probe,
2716
3049
  checking: true
2717
3050
  });
2718
3051
  }
2719
3052
  function endProbe() {
2720
3053
  setProbe({
2721
- ...probe$2,
3054
+ ...probe,
2722
3055
  checking: false
2723
3056
  });
2724
3057
  }
@@ -2814,41 +3147,34 @@ function useCapabilityMap(refreshToken) {
2814
3147
  };
2815
3148
  }
2816
3149
  //#endregion
2817
- //#region src/shared/hooks/mock-mode.ts
2818
- var mock_mode_exports = /* @__PURE__ */ __exportAll({
2819
- crashModeOn: () => crashModeOn,
2820
- mockModeOn: () => mockModeOn
2821
- });
2822
- function mockModeOn(search) {
2823
- return /(?:^|[?&])(?:wbMock|wbMarketMock)=1(?:&|$)/.test(search);
2824
- }
2825
- function crashModeOn(search) {
2826
- return /(?:^|[?&])wbCrash=1(?:&|$)/.test(search);
2827
- }
2828
- //#endregion
2829
- //#region src/shared/hooks/use-fixture-pick.ts
2830
- var use_fixture_pick_exports = /* @__PURE__ */ __exportAll({ useFixturePick: () => useFixturePick });
2831
- function useFixturePick(options) {
2832
- const controlled = options.selected !== void 0 || options.onSelect !== void 0;
2833
- const [ownActive, setOwnActive] = useState(options.initial ?? null);
2834
- const [nonce, setNonce] = useState(0);
2835
- const [on] = useState(() => mockModeOn(window.location.search));
2836
- const enabled = options.enabled ?? on;
2837
- const active = controlled ? options.selected ?? null : ownActive;
2838
- const pick = useCallback((id) => {
2839
- if (!controlled) setOwnActive(id);
2840
- options.onSelect?.(id);
2841
- setNonce((value) => value + 1);
2842
- }, [controlled, options]);
2843
- return {
2844
- enabled,
2845
- active,
2846
- current: options.fixtures.find((fixture) => fixture.id === active),
2847
- pick,
2848
- nonce,
2849
- index: options.fixtures.findIndex((fixture) => fixture.id === active)
2850
- };
2851
- }
3150
+ //#region src/dev/surface.stub.ts
3151
+ var noop = () => void 0;
3152
+ var devSurface = {
3153
+ on: () => false,
3154
+ crash: () => false,
3155
+ useBoard: ({ all }) => ({
3156
+ shape: { kind: "real" },
3157
+ seed: all,
3158
+ strip: () => null,
3159
+ mode: false
3160
+ }),
3161
+ useStrips: () => ({
3162
+ pick: {
3163
+ enabled: false,
3164
+ active: null,
3165
+ current: void 0,
3166
+ nonce: 0,
3167
+ index: 0,
3168
+ pick: noop
3169
+ },
3170
+ current: void 0,
3171
+ enabled: false,
3172
+ strip: null
3173
+ }),
3174
+ addModuleState: (base) => base,
3175
+ gateStrip: () => null,
3176
+ kitModule: null
3177
+ };
2852
3178
  //#endregion
2853
3179
  //#region src/app/layouts/panel-hint.ts
2854
3180
  var hints = /* @__PURE__ */ new Map();
@@ -2872,1113 +3198,61 @@ function usePanelHint(id) {
2872
3198
  return useSyncExternalStore(subscribePanelHints, () => panelHintOf(id));
2873
3199
  }
2874
3200
  function panelRowName(label, hint, t) {
2875
- if (hint === null) return label;
2876
- return t("panels.labelWithHint", {
2877
- label,
2878
- hint: t(hint.labelKey)
2879
- });
2880
- }
2881
- //#endregion
2882
- //#region src/app/layouts/rightbar/market-freshness.ts
2883
- var MARKET_STALE_MS = VERSION_CHECK_TTL_MS;
2884
- function marketSettled(freshness, installedRead) {
2885
- return freshness.loaded && installedRead !== false;
2886
- }
2887
- function shouldProbeOnEnter(input) {
2888
- if (input.checkedAt === null) return true;
2889
- return input.now - input.checkedAt >= input.staleMs;
2890
- }
2891
- //#endregion
2892
- //#region src/app/layouts/rightbar/market-settle.ts
2893
- var MODULE_SETTLE_MS = 15e3;
2894
- function holdBack(installed, roster, active, previous) {
2895
- const pending = installed.filter((unit) => !roster.has(unit));
2896
- const fresh = previous === null ? [] : pending.filter((unit) => !previous.has(unit));
2897
- return pending.filter((unit) => active.has(unit) || fresh.includes(unit));
2898
- }
2899
- var WORKBENCH_SWAP_MS = 18e4;
2900
- function swapLanded(until, installed) {
2901
- return until !== void 0 && installed === until;
2902
- }
2903
- function swapUntil(action, application, latest) {
2904
- if (action !== "update-workbench" || application !== "restart-required") return void 0;
2905
- return latest;
2906
- }
2907
- var READ_BACK_ACTIONS = /* @__PURE__ */ new Set(["update", "update-bundle"]);
2908
- function awaitsReadBack(action, application, version) {
2909
- return application === "applied" && version !== void 0 && READ_BACK_ACTIONS.has(action);
2910
- }
2911
- function readBackDone(input) {
2912
- if (input.action === "update") return !input.outdated;
2913
- if (input.entry === void 0 || input.entry.local === true || input.entry.latest === void 0) return true;
2914
- if (input.entry.latest === input.entry.installed) return true;
2915
- if (input.clicked === void 0) return true;
2916
- return input.entry.installed !== input.clicked;
2917
- }
2918
- function settleLanded(input) {
2919
- if (input.until !== void 0) return swapLanded(input.until, input.installed);
2920
- if (input.readBack !== true) return true;
2921
- return readBackDone({
2922
- action: input.action,
2923
- entry: input.entry,
2924
- clicked: input.clicked,
2925
- outdated: input.outdated
2926
- });
2927
- }
2928
- function holdWindowMs(until) {
2929
- return until === void 0 ? MODULE_SETTLE_MS : WORKBENCH_SWAP_MS;
2930
- }
2931
- //#endregion
2932
- //#region src/app/layouts/rightbar/market-installed-mock.ts
2933
- function installedMocks(input) {
2934
- const { id, found, mine, probe } = input;
2935
- return [
2936
- {
2937
- id: "no-supply",
2938
- label: "没有环境依赖的模块(供给是基座命令那种):市场里有它这一行",
2939
- manifests: [found],
2940
- capabilities: probe(id, "ok"),
2941
- installed: [{
2942
- unit: id,
2943
- pkg: "@dsh-workbench/module-one",
2944
- installed: "0.1.2"
2945
- }],
2946
- expect: {
2947
- rows: 1,
2948
- state: "installed",
2949
- actions: ["uninstall"],
2950
- installed: 0,
2951
- shared: 0
2952
- }
2953
- },
2954
- {
2955
- id: "no-card",
2956
- label: "没有卡片的模块(只有基座命令那种):市场里有它这一行,有版本、有「更新」",
2957
- manifests: [{
2958
- ...found,
2959
- card: null
2960
- }],
2961
- capabilities: probe(id, "ok"),
2962
- updates: { [id]: {
2963
- installed: "0.1.2",
2964
- latest: "0.2.0"
2965
- } },
2966
- installed: [{
2967
- unit: id,
2968
- pkg: "@dsh-workbench/module-one",
2969
- installed: "0.1.2"
2970
- }],
2971
- expect: {
2972
- rows: 1,
2973
- state: "outdated",
2974
- actions: ["update-bundle", "uninstall"],
2975
- version: {
2976
- installed: "0.1.2",
2977
- latest: "0.2.0"
2978
- },
2979
- installed: 0,
2980
- shared: 0
2981
- }
2982
- },
2983
- {
2984
- id: "no-env-installed",
2985
- label: "本机装着、又没有依赖要探(DIY 本地那份那种):写「已安装」,不是「状态未知」",
2986
- manifests: [{
2987
- ...found,
2988
- env: void 0
2989
- }],
2990
- capabilities: {},
2991
- updates: { [id]: { installed: "0.1.2" } },
2992
- installed: [{
2993
- unit: id,
2994
- pkg: "@dsh-workbench/module-one",
2995
- installed: "0.1.2"
2996
- }],
2997
- expect: {
2998
- rows: 1,
2999
- state: "installed",
3000
- actions: ["uninstall"],
3001
- version: { installed: "0.1.2" },
3002
- installed: 0
3003
- }
3004
- },
3005
- {
3006
- id: "local-no-update",
3007
- label: "本机那份(link: 装的):有「本地」标记、不给「更新」",
3008
- manifests: [mine],
3009
- capabilities: probe(id, "ok", { plugins: [{
3010
- name: "fixture",
3011
- status: "ok",
3012
- missing: []
3013
- }] }),
3014
- updates: { [id]: {
3015
- installed: "0.1.0",
3016
- local: true
3017
- } },
3018
- installed: [{
3019
- unit: id,
3020
- pkg: "@dsh-workbench/module-one",
3021
- installed: "0.1.0",
3022
- local: true
3023
- }],
3024
- expect: {
3025
- rows: 1,
3026
- state: "installed",
3027
- actions: ["uninstall"],
3028
- local: true,
3029
- version: { installed: "0.1.0" },
3030
- installed: 0
3031
- }
3032
- },
3033
- {
3034
- id: "installed-refused",
3035
- label: "本机装了,但宿主不认它的声明(行上说得出理由)",
3036
- manifests: [],
3037
- capabilities: {},
3038
- installed: [{
3039
- unit: id,
3040
- pkg: "@dsh-workbench/module-one",
3041
- installed: "0.1.2",
3042
- refused: ["dsh.workbench 缺 apiVersion —— 协议从 v1 起,写 \"apiVersion\": 1"]
3043
- }],
3044
- expect: {
3045
- rows: 0,
3046
- installed: 1,
3047
- installedState: "unusable",
3048
- installedActions: ["remove-bundle"],
3049
- installedNote: true
3050
- }
3051
- },
3052
- {
3053
- id: "installed-pending",
3054
- label: "本机装了、宿主还没加载它(重启一次就会出来)",
3055
- manifests: [],
3056
- capabilities: {},
3057
- installed: [{
3058
- unit: id,
3059
- pkg: "@dsh-workbench/module-one",
3060
- installed: "0.1.2"
3061
- }],
3062
- expect: {
3063
- rows: 0,
3064
- installed: 1,
3065
- installedState: "inactive",
3066
- installedActions: ["remove-bundle"],
3067
- installedHint: "panels.market.moduleRestartHint"
3068
- }
3069
- },
3070
- {
3071
- id: "installed-pending-update",
3072
- label: "本机装了、还没加载 + 源上有新版(给「更新」,也说明要重启)",
3073
- manifests: [],
3074
- capabilities: {},
3075
- installed: [{
3076
- unit: id,
3077
- pkg: "@dsh-workbench/module-one",
3078
- installed: "0.1.0",
3079
- latest: "0.1.2"
3080
- }],
3081
- expect: {
3082
- rows: 0,
3083
- installed: 1,
3084
- installedState: "outdated",
3085
- installedActions: ["update-bundle", "remove-bundle"],
3086
- installedHint: "panels.market.moduleRestartHint"
3087
- }
3088
- },
3089
- {
3090
- id: "installed-confirm",
3091
- label: "卸载本机模块(还没加载的那种:Modal 确认,标题是包名)",
3092
- manifests: [],
3093
- capabilities: {},
3094
- installed: [{
3095
- unit: id,
3096
- pkg: "@dsh-workbench/module-one",
3097
- installed: "0.1.2"
3098
- }],
3099
- confirming: id,
3100
- expect: {
3101
- rows: 0,
3102
- installed: 1,
3103
- installedState: "inactive",
3104
- installedActions: ["remove-bundle"]
3105
- }
3106
- },
3107
- {
3108
- id: "first-paint",
3109
- label: "刚进页面(检测中:能力与本机清单都还没结论)",
3110
- manifests: [mine],
3111
- capabilities: null,
3112
- installedRead: false,
3113
- loaded: false,
3114
- expect: {
3115
- rows: 1,
3116
- state: "checking",
3117
- actions: []
3118
- }
3119
- }
3120
- ];
3121
- }
3122
- //#endregion
3123
- //#region src/app/layouts/rightbar/market-mock.ts
3124
- function installable(manifest) {
3125
- return {
3126
- ...manifest,
3127
- env: {
3128
- command: "opencli",
3129
- plugins: [{
3130
- name: "fixture",
3131
- commands: ["x"]
3132
- }]
3133
- }
3134
- };
3135
- }
3136
- function withEnvSource(manifest, env) {
3137
- const [first, ...rest] = manifest.env?.plugins ?? [];
3138
- if (first === void 0) return manifest;
3139
- return {
3140
- ...manifest,
3141
- env: {
3142
- ...manifest.env,
3143
- plugins: [{
3144
- ...first,
3145
- installSource: {
3146
- kind: "local",
3147
- env
3148
- }
3149
- }, ...rest]
3150
- }
3151
- };
3152
- }
3153
- function withSecondNeed(manifest) {
3154
- return {
3155
- ...manifest,
3156
- env: {
3157
- ...manifest.env,
3158
- plugins: [...manifest.env?.plugins ?? [], {
3159
- name: "fixture-second",
3160
- commands: ["y"]
3161
- }]
3162
- }
3163
- };
3164
- }
3165
- function twin(manifest) {
3166
- return {
3167
- ...manifest,
3168
- id: `${manifest.id}-b`
3169
- };
3170
- }
3171
- function copies(manifest, count) {
3172
- return Array.from({ length: count }, (_, index) => ({
3173
- ...manifest,
3174
- id: `${manifest.id}-${index}`,
3175
- env: {
3176
- ...manifest.env,
3177
- plugins: [{
3178
- name: `fixture-${index}`,
3179
- commands: manifest.env?.plugins?.[0]?.commands ?? []
3180
- }]
3181
- }
3182
- }));
3183
- }
3184
- function probe$1(unit, status, extra = {}) {
3185
- return { [unit]: {
3186
- unit,
3187
- status,
3188
- required: ["x"],
3189
- missing: [],
3190
- detail: "夹具",
3191
- ...extra
3192
- } };
3193
- }
3194
- function buildMarketMocks(roster) {
3195
- const found = roster.find((manifest) => manifest.card !== null);
3196
- if (found === void 0) return [{
3197
- id: "empty",
3198
- label: "市场空态",
3199
- manifests: [],
3200
- capabilities: {},
3201
- expect: { rows: 0 }
3202
- }];
3203
- const mine = installable(found);
3204
- const second = twin(mine);
3205
- const id = mine.id;
3206
- const secondId = second.id;
3207
- return [
3208
- {
3209
- id: "installed",
3210
- label: "已装",
3211
- manifests: [mine],
3212
- capabilities: probe$1(id, "ok", { plugins: [{
3213
- name: "fixture",
3214
- status: "ok",
3215
- missing: []
3216
- }] }),
3217
- expect: {
3218
- rows: 1,
3219
- state: "installed",
3220
- actions: ["uninstall"],
3221
- shared: 1,
3222
- sharedActions: []
3223
- }
3224
- },
3225
- {
3226
- id: "outdated",
3227
- label: "要更新",
3228
- manifests: [mine],
3229
- capabilities: probe$1(id, "missing-commands", { missing: ["x"] }),
3230
- expect: {
3231
- rows: 1,
3232
- state: "outdated",
3233
- actions: ["update", "uninstall"],
3234
- noteKey: "panels.market.needCommands"
3235
- }
3236
- },
3237
- {
3238
- id: "module-update",
3239
- label: "模块包有新版(行上给「更新」,装了要重启)",
3240
- manifests: [mine],
3241
- capabilities: probe$1(id, "ok", { plugins: [{
3242
- name: "fixture",
3243
- status: "ok",
3244
- missing: []
3245
- }] }),
3246
- updates: { [id]: {
3247
- installed: "0.1.2",
3248
- latest: "0.2.0"
3249
- } },
3250
- expect: {
3251
- rows: 1,
3252
- state: "outdated",
3253
- actions: ["update-bundle", "uninstall"],
3254
- shared: 1,
3255
- sharedActions: []
3256
- }
3257
- },
3258
- {
3259
- id: "outdated-release",
3260
- label: "源上有新版(模块行不变,共用依赖行给「更新」)",
3261
- manifests: [mine],
3262
- capabilities: probe$1(id, "ok", { plugins: [{
3263
- name: "fixture",
3264
- status: "outdated",
3265
- missing: [],
3266
- release: {
3267
- installed: "1.0.16",
3268
- latest: "1.0.17"
3269
- }
3270
- }] }),
3271
- expect: {
3272
- rows: 1,
3273
- state: "installed",
3274
- actions: ["uninstall"],
3275
- shared: 1,
3276
- sharedActions: ["update-dependency"]
3277
- }
3278
- },
3279
- {
3280
- id: "missing",
3281
- label: "未装(可装)",
3282
- manifests: [mine],
3283
- capabilities: probe$1(id, "missing-plugin", {
3284
- install: "ready",
3285
- plugins: [{
3286
- name: "fixture",
3287
- status: "missing",
3288
- missing: ["x"],
3289
- install: "ready"
3290
- }]
3291
- }),
3292
- expect: {
3293
- rows: 1,
3294
- state: "missing",
3295
- actions: ["install"],
3296
- shared: 1,
3297
- sharedActions: []
3298
- }
3299
- },
3300
- {
3301
- id: "missing-env",
3302
- label: "未装 + 要先设环境变量",
3303
- manifests: [withEnvSource(mine, "WB_FIXTURE_HOME")],
3304
- capabilities: probe$1(id, "missing-plugin", { install: "env-missing" }),
3305
- expect: {
3306
- rows: 1,
3307
- state: "missing",
3308
- actions: []
3309
- }
3310
- },
3311
- {
3312
- id: "missing-undeclared",
3313
- label: "未装 + 没声明怎么装",
3314
- manifests: [mine],
3315
- capabilities: probe$1(id, "missing-plugin", { install: "not-declared" }),
3316
- expect: {
3317
- rows: 1,
3318
- state: "missing",
3319
- actions: []
3320
- }
3321
- },
3322
- {
3323
- id: "unknown",
3324
- label: "探测失败(状态未知)",
3325
- manifests: [mine],
3326
- capabilities: {},
3327
- expect: {
3328
- rows: 1,
3329
- state: "unknown",
3330
- actions: []
3331
- }
3332
- },
3333
- {
3334
- id: "checking",
3335
- label: "检测中",
3336
- manifests: [mine],
3337
- capabilities: null,
3338
- expect: {
3339
- rows: 1,
3340
- state: "checking",
3341
- actions: []
3342
- }
3343
- },
3344
- {
3345
- id: "shared",
3346
- label: "两个模块(第二行是复制的)",
3347
- manifests: [mine, second],
3348
- capabilities: {
3349
- ...probe$1(id, "ok"),
3350
- ...probe$1(secondId, "ok")
3351
- },
3352
- expect: {
3353
- rows: 2,
3354
- state: "installed",
3355
- actions: ["uninstall"],
3356
- shared: 1
3357
- }
3358
- },
3359
- {
3360
- id: "busy",
3361
- label: "正在装",
3362
- manifests: [mine],
3363
- capabilities: probe$1(id, "missing-plugin", { install: "ready" }),
3364
- pending: {
3365
- id,
3366
- action: "install"
3367
- },
3368
- expect: {
3369
- rows: 1,
3370
- state: "missing",
3371
- actions: ["install"]
3372
- }
3373
- },
3374
- {
3375
- id: "confirm",
3376
- label: "等确认卸载",
3377
- manifests: [mine],
3378
- capabilities: probe$1(id, "ok"),
3379
- confirming: id,
3380
- expect: {
3381
- rows: 1,
3382
- state: "installed",
3383
- actions: ["uninstall"]
3384
- }
3385
- },
3386
- {
3387
- id: "failed",
3388
- label: "失败(红字贴行)",
3389
- manifests: [mine],
3390
- capabilities: probe$1(id, "ok"),
3391
- failure: {
3392
- id,
3393
- message: "没成功:命令失败(退出码 1):夹具里的一条失败原因"
3394
- },
3395
- expect: {
3396
- rows: 1,
3397
- state: "installed",
3398
- actions: ["uninstall"]
3399
- }
3400
- },
3401
- {
3402
- id: "long-title",
3403
- label: "超长模块名",
3404
- manifests: [{
3405
- ...mine,
3406
- card: {
3407
- titleKey: "一个名字特别特别长的模块用来验证省略号会不会把按钮挤下去",
3408
- order: 10
3409
- }
3410
- }],
3411
- capabilities: probe$1(id, "ok"),
3412
- expect: {
3413
- rows: 1,
3414
- state: "installed",
3415
- actions: ["uninstall"],
3416
- titleChars: 25
3417
- }
3418
- },
3419
- {
3420
- id: "long-env",
3421
- label: "超长环境变量名",
3422
- manifests: [withEnvSource(mine, "DSH_WORKBENCH_SOMETHING_VERY_LONG_ENV_NAME_FOR_THE_MODULE")],
3423
- capabilities: probe$1(id, "missing-plugin", { install: "env-missing" }),
3424
- expect: {
3425
- rows: 1,
3426
- state: "missing",
3427
- actions: []
3428
- }
3429
- },
3430
- {
3431
- id: "long-error",
3432
- label: "超长错误信息",
3433
- manifests: [mine],
3434
- capabilities: probe$1(id, "ok"),
3435
- failure: {
3436
- id,
3437
- 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'"
3438
- },
3439
- expect: {
3440
- rows: 1,
3441
- state: "installed",
3442
- actions: ["uninstall"]
3443
- }
3444
- },
3445
- {
3446
- id: "two-deps",
3447
- label: "两份依赖(只装缺的)",
3448
- manifests: [withSecondNeed(mine)],
3449
- capabilities: probe$1(id, "missing-plugin", {
3450
- install: "ready",
3451
- plugins: [{
3452
- name: "fixture",
3453
- status: "ok",
3454
- missing: []
3455
- }, {
3456
- name: "fixture-second",
3457
- status: "missing",
3458
- missing: ["y"],
3459
- install: "ready"
3460
- }]
3461
- }),
3462
- expect: {
3463
- rows: 1,
3464
- state: "missing",
3465
- actions: ["install"]
3466
- }
3467
- },
3468
- {
3469
- id: "many",
3470
- label: "很多行(要滚)",
3471
- manifests: [mine, ...copies(mine, 13)],
3472
- capabilities: Object.fromEntries([id, ...copies(mine, 13).map((item) => item.id)].map((unit) => [unit, probe$1(unit, "ok")[unit]])),
3473
- expect: {
3474
- rows: 14,
3475
- state: "installed",
3476
- actions: ["uninstall"]
3477
- }
3478
- },
3479
- ...installedMocks({
3480
- id,
3481
- found,
3482
- mine,
3483
- probe: probe$1
3484
- }),
3485
- {
3486
- id: "shared-many",
3487
- label: "三个模块(同一份安装)",
3488
- manifests: [
3489
- mine,
3490
- twin(mine),
3491
- {
3492
- ...twin(mine),
3493
- id: `${mine.id}-c`
3494
- }
3495
- ],
3496
- capabilities: {
3497
- ...probe$1(id, "ok"),
3498
- ...probe$1(secondId, "ok"),
3499
- ...probe$1(`${mine.id}-c`, "ok")
3500
- },
3501
- expect: {
3502
- rows: 3,
3503
- state: "installed",
3504
- actions: ["uninstall"]
3505
- }
3506
- },
3507
- {
3508
- id: "plugin-outdated",
3509
- label: "用户装的 opencli 插件:有新版(给更新 / 卸载)",
3510
- manifests: [],
3511
- capabilities: {},
3512
- plugins: [{
3513
- pkg: "opencli-plugin-cmdb",
3514
- name: "cmdb",
3515
- installed: "1.0.24",
3516
- latest: "1.0.25"
3517
- }],
3518
- expect: {
3519
- rows: 0,
3520
- plugins: 1,
3521
- pluginActions: ["update-plugin", "uninstall-plugin"]
3522
- }
3523
- },
3524
- {
3525
- id: "plugin-local",
3526
- label: "本地目录装的 opencli 插件:没有版本源,只给卸载",
3527
- manifests: [],
3528
- capabilities: {},
3529
- plugins: [{
3530
- pkg: "/Users/me/my-local-plugin",
3531
- name: "my-local-plugin",
3532
- local: true
3533
- }],
3534
- expect: {
3535
- rows: 0,
3536
- plugins: 1,
3537
- pluginActions: ["uninstall-plugin"],
3538
- pluginNote: false
3539
- }
3540
- },
3541
- {
3542
- id: "plugin-alias",
3543
- label: "插件名 ≠ 包名:行上两个都写出来(更新 / 卸载按包名)",
3544
- manifests: [],
3545
- capabilities: {},
3546
- plugins: [{
3547
- pkg: "opencli-plugin-cmdb",
3548
- name: "cmdb",
3549
- installed: "1.0.24",
3550
- latest: "1.0.25"
3551
- }],
3552
- expect: {
3553
- rows: 0,
3554
- plugins: 1,
3555
- pluginActions: ["update-plugin", "uninstall-plugin"]
3556
- }
3557
- },
3558
- {
3559
- id: "plugin-broken",
3560
- label: "装坏了的那一份(目录在但看不出是个插件):行上直说,给卸载与指路",
3561
- manifests: [],
3562
- capabilities: {},
3563
- plugins: [{
3564
- pkg: "opencli-plugin-cmdb",
3565
- name: "cmdb",
3566
- installed: "1.0.24",
3567
- broken: true
3568
- }],
3569
- expect: {
3570
- rows: 0,
3571
- plugins: 1,
3572
- pluginState: "broken",
3573
- pluginActions: ["uninstall-plugin"],
3574
- pluginNoteKey: "panels.market.pluginBroken"
3575
- }
3576
- },
3577
- {
3578
- id: "plugin-kept",
3579
- label: "卸掉用户装的插件,但还有模块在用:文件先留着(行上给一句为什么)",
3580
- manifests: [],
3581
- capabilities: {},
3582
- plugins: [{
3583
- pkg: "opencli-plugin-cmdb",
3584
- name: "cmdb",
3585
- installed: "1.0.24"
3586
- }],
3587
- notice: "文件先留着:cmdb、argocd 还要用它。",
3588
- expect: {
3589
- rows: 0,
3590
- plugins: 1,
3591
- pluginActions: ["uninstall-plugin"],
3592
- notice: true
3593
- }
3594
- },
3595
- {
3596
- id: "workbench-update",
3597
- label: "工作台有新版(这一行也给「更新」,装完面板自己换上)",
3598
- manifests: [],
3599
- capabilities: {},
3600
- workbench: {
3601
- pkg: "@dsh-workbench/core",
3602
- installed: "0.1.18",
3603
- latest: "0.1.19"
3604
- },
3605
- expect: {
3606
- rows: 0,
3607
- workbenchState: "outdated",
3608
- workbenchActions: ["update-workbench"]
3609
- }
3610
- },
3611
- {
3612
- id: "workbench-current",
3613
- label: "工作台已经最新(只显示版本,没有按钮)",
3614
- manifests: [],
3615
- capabilities: {},
3616
- workbench: {
3617
- pkg: "@dsh-workbench/core",
3618
- installed: "0.1.19"
3619
- },
3620
- expect: {
3621
- rows: 0,
3622
- workbenchState: "installed",
3623
- workbenchActions: []
3624
- }
3625
- },
3626
- {
3627
- id: "workbench-local",
3628
- label: "工作台是本仓那份(link: 装的:不给更新,行上说清)",
3629
- manifests: [],
3630
- capabilities: {},
3631
- workbench: {
3632
- pkg: "@dsh-workbench/core",
3633
- installed: "0.1.18",
3634
- latest: "0.1.19",
3635
- local: true
3636
- },
3637
- expect: {
3638
- rows: 0,
3639
- workbenchState: "installed",
3640
- workbenchActions: [],
3641
- workbenchNoteKey: "panels.market.workbenchLocal"
3642
- }
3643
- },
3644
- {
3645
- id: "workbench-updated",
3646
- label: "工作台刚更新完(新版已经在盘上:行上就是新版,没有按钮、也不劝人重启)",
3647
- manifests: [],
3648
- capabilities: {},
3649
- workbench: {
3650
- pkg: "@dsh-workbench/core",
3651
- installed: "0.1.19"
3652
- },
3653
- expect: {
3654
- rows: 0,
3655
- workbenchState: "installed",
3656
- workbenchActions: []
3657
- }
3658
- },
3659
- {
3660
- id: "workbench-restart-pending",
3661
- label: "工作台更新完了但这份进程里还是旧的(盘上 0.1.19、跑着的 0.1.18:状态那格是红点「重启后生效」——重启一次 dsh 才真的换上)",
3662
- manifests: [],
3663
- capabilities: {},
3664
- workbench: {
3665
- pkg: "@dsh-workbench/core",
3666
- installed: "0.1.19",
3667
- running: "0.1.18"
3668
- },
3669
- expect: {
3670
- rows: 0,
3671
- workbenchState: "pending-restart",
3672
- workbenchActions: []
3673
- }
3674
- },
3675
- {
3676
- id: "workbench-restart-pending-local",
3677
- label: "本仓那份(link: 装的)永远等于盘上那份 → 不亮这句、也不劝重启",
3678
- manifests: [],
3679
- capabilities: {},
3680
- workbench: {
3681
- pkg: "@dsh-workbench/core",
3682
- installed: "0.1.19",
3683
- running: "0.1.18",
3684
- local: true
3685
- },
3686
- expect: {
3687
- rows: 0,
3688
- workbenchState: "installed",
3689
- workbenchActions: []
3690
- }
3691
- },
3692
- {
3693
- id: "empty",
3694
- label: "市场空态",
3695
- manifests: [],
3696
- capabilities: {},
3697
- expect: {
3698
- rows: 0,
3699
- shared: 0
3700
- }
3701
- }
3702
- ];
3703
- }
3704
- //#endregion
3705
- //#region src/app/layouts/rightbar/registry.ts
3706
- function createBoardRegistry() {
3707
- const modules = [];
3708
- const listeners = /* @__PURE__ */ new Set();
3709
- let revision = 0;
3710
- let sorted = [];
3711
- let index = /* @__PURE__ */ new Map();
3712
- let steps = /* @__PURE__ */ new Map();
3713
- function rebuild() {
3714
- sorted = [...modules].sort((a, b) => a.order - b.order || a.id.localeCompare(b.id));
3715
- index = new Map(sorted.map((module) => [module.id, module]));
3716
- const table = /* @__PURE__ */ new Map();
3717
- for (const module of sorted) for (const kind of Object.keys(module.steps ?? {})) {
3718
- const owner = table.get(kind);
3719
- if (owner !== void 0) throw new Error(`看板层名重复:${kind}(${owner.id} 与 ${module.id} 都声明了它)`);
3720
- table.set(kind, module);
3721
- }
3722
- steps = table;
3723
- }
3724
- function notify() {
3725
- revision += 1;
3726
- for (const listener of listeners) listener();
3727
- }
3728
- return {
3729
- register(module) {
3730
- if (modules.some((item) => item.id === module.id)) throw new Error(`看板模块 id 重复:${module.id}(id 会进持久化配置,不能撞)`);
3731
- modules.push(module);
3732
- try {
3733
- rebuild();
3734
- } catch (error) {
3735
- modules.pop();
3736
- rebuild();
3737
- throw error;
3738
- }
3739
- notify();
3740
- return () => {
3741
- const at = modules.indexOf(module);
3742
- if (at < 0) return;
3743
- modules.splice(at, 1);
3744
- rebuild();
3745
- notify();
3746
- };
3747
- },
3748
- all: () => sorted,
3749
- byId: (id) => index.get(id),
3750
- stepOwner: (kind) => steps.get(kind),
3751
- subscribe(listener) {
3752
- listeners.add(listener);
3753
- return () => listeners.delete(listener);
3754
- },
3755
- version: () => revision
3756
- };
3757
- }
3758
- //#endregion
3759
- //#region src/app/units/registry.ts
3760
- function toBoardModule(face, manifest) {
3761
- const View = face.card;
3762
- if (View === void 0) return void 0;
3763
- return {
3764
- id: manifest.id,
3765
- titleKey: manifest.card?.titleKey ?? manifest.id,
3766
- order: manifest.card?.order ?? 100,
3767
- View,
3768
- ...face.steps === void 0 ? {} : { steps: face.steps }
3769
- };
3770
- }
3771
- function createClientUnitRegistry(options = {}) {
3772
- const registrations = [];
3773
- const refusals = [];
3774
- const listeners = /* @__PURE__ */ new Set();
3775
- const board = createBoardRegistry();
3776
- let known = /* @__PURE__ */ new Map();
3777
- let installableIds = null;
3778
- let revision = 0;
3779
- let manifestsCache;
3780
- function notify() {
3781
- revision += 1;
3782
- for (const listener of [...listeners]) try {
3783
- listener();
3784
- } catch (error) {
3785
- console.warn(`[dsh-workbench] 套件注册的订阅者报错(不影响其它订阅者与这次注册):${String(error)}`);
3786
- }
3787
- }
3788
- function warnRefusal(unit, kind, reasons) {
3789
- refusals.push({
3790
- unit,
3791
- kind,
3792
- reasons
3793
- });
3794
- console.warn(`[dsh-workbench] ${unit === "" ? "这个模块" : unit} 的卡片没挂上:${reasons.join(";")}`);
3795
- }
3796
- function takeBackRefusal(unit) {
3797
- for (let at = refusals.length - 1; at >= 0; at -= 1) if (refusals[at]?.unit === unit) refusals.splice(at, 1);
3798
- }
3799
- function attach(entry) {
3800
- const manifest = known.get(entry.unit);
3801
- if (manifest === void 0) return false;
3802
- const boardModule = toBoardModule(entry.face, manifest);
3803
- entry.mounted = {
3804
- manifest,
3805
- unmount: boardModule === void 0 ? () => {} : board.register(boardModule)
3806
- };
3807
- takeBackRefusal(entry.unit);
3808
- return true;
3809
- }
3810
- function detach(entry) {
3811
- entry.mounted?.unmount();
3812
- entry.mounted = null;
3813
- }
3814
- return {
3815
- register(face) {
3816
- const unit = typeof face?.unit === "string" ? face.unit.trim() : "";
3817
- if (unit === "") {
3818
- warnRefusal("", "old-shape", ["registerUnit({ unit, card }) 里的 unit 是空的 —— U1b 之前的旧形状是 registerUnit({ manifest, card });现在清单由外壳从**已装清单**读出来、按 unit 交给浏览器(ADR-0038 §2.2)"]);
3819
- notify();
3820
- return () => {};
3821
- }
3822
- if (registrations.some((entry) => entry.unit === unit)) throw new Error(`套件 id 重复:${unit}(id 会进持久化配置,不能撞)`);
3823
- const entry = {
3824
- face,
3825
- unit,
3826
- mounted: null
3827
- };
3828
- registrations.push(entry);
3829
- manifestsCache = void 0;
3830
- if (!attach(entry)) {
3831
- warnRefusal(unit, "no-manifest", [`宿主没有担保 unit「${unit}」的清单 —— 这个包要么没装进这份 profile,要么它的 dsh.workbench 没通过校验。卡片先不挂:清单只有一处真相(ADR-0038 §2.2)`]);
3832
- options.onUnknownUnit?.(unit);
3833
- }
3834
- notify();
3835
- return () => {
3836
- const at = registrations.indexOf(entry);
3837
- if (at < 0) return;
3838
- registrations.splice(at, 1);
3839
- detach(entry);
3840
- takeBackRefusal(unit);
3841
- manifestsCache = void 0;
3842
- notify();
3843
- };
3844
- },
3845
- all: () => registrations.map((entry) => entry.face),
3846
- manifests: () => {
3847
- manifestsCache ??= registrations.flatMap((entry) => entry.mounted === null ? [] : [entry.mounted.manifest]);
3848
- return manifestsCache;
3849
- },
3850
- refusals: () => refusals,
3851
- installable: () => installableIds,
3852
- setManifests(manifests, installable) {
3853
- known = new Map(manifests.map((manifest) => [manifest.id, manifest]));
3854
- installableIds = installable === void 0 ? null : new Set(installable);
3855
- let changed = false;
3856
- for (const entry of registrations) {
3857
- const next = known.get(entry.unit);
3858
- if (entry.mounted === null) {
3859
- if (next !== void 0 && attach(entry)) changed = true;
3860
- continue;
3861
- }
3862
- if (next === void 0) {
3863
- detach(entry);
3864
- warnRefusal(entry.unit, "withdrawn", [`宿主不再担保 unit「${entry.unit}」的清单(模块被卸了?)—— 这张卡片先摘下来`]);
3865
- changed = true;
3866
- }
3867
- }
3868
- if (!changed) return;
3869
- manifestsCache = void 0;
3870
- notify();
3871
- },
3872
- board,
3873
- subscribe(listener) {
3874
- listeners.add(listener);
3875
- return () => listeners.delete(listener);
3876
- },
3877
- version: () => revision
3878
- };
3201
+ if (hint === null) return label;
3202
+ return t("panels.labelWithHint", {
3203
+ label,
3204
+ hint: t(hint.labelKey)
3205
+ });
3879
3206
  }
3880
3207
  //#endregion
3881
- //#region src/app/units/fixture-unit-mock.tsx
3882
- var FIXTURE_UNIT_ID = "wb-fixture";
3883
- var CRASH_UNIT_ID = "wb-fixture-crash";
3884
- var KEY = {
3885
- cardTitle: `${FIXTURE_UNIT_ID}.cardTitle`,
3886
- cardMeta: `${FIXTURE_UNIT_ID}.cardMeta`,
3887
- rowKey: `${FIXTURE_UNIT_ID}.rowKey`,
3888
- rowValue: `${FIXTURE_UNIT_ID}.rowValue`
3889
- };
3890
- var messages = {
3891
- zh: {
3892
- [KEY.cardTitle]: "示例模块",
3893
- [KEY.cardMeta]: "夹具",
3894
- [KEY.rowKey]: "示例",
3895
- [KEY.rowValue]: "第 {n} 行"
3896
- },
3897
- en: {
3898
- [KEY.cardTitle]: "Sample module",
3899
- [KEY.cardMeta]: "Fixture",
3900
- [KEY.rowKey]: "Sample",
3901
- [KEY.rowValue]: "Row {n}"
3902
- }
3903
- };
3904
- var manifest = {
3905
- id: FIXTURE_UNIT_ID,
3906
- card: {
3907
- titleKey: KEY.cardTitle,
3908
- order: 900
3909
- },
3910
- tools: [],
3911
- host: { inject: [] }
3912
- };
3913
- function FixtureCard({ t, onRefresh }) {
3914
- return /* @__PURE__ */ h(Card, {
3915
- t,
3916
- title: t(KEY.cardTitle),
3917
- meta: t(KEY.cardMeta),
3918
- refreshing: false,
3919
- onRefresh
3920
- }, /* @__PURE__ */ h(Rows, null, [
3921
- 1,
3922
- 2,
3923
- 3
3924
- ].map((n) => /* @__PURE__ */ h(Row, {
3925
- key: String(n),
3926
- label: t(KEY.rowKey),
3927
- value: t(KEY.rowValue, { n: String(n) })
3928
- }))));
3208
+ //#region src/app/layouts/rightbar/market-freshness.ts
3209
+ var MARKET_STALE_MS = VERSION_CHECK_TTL_MS;
3210
+ function marketSettled(freshness, installedRead) {
3211
+ return freshness.loaded && installedRead !== false;
3929
3212
  }
3930
- var FIXTURE_FACE = {
3931
- unit: FIXTURE_UNIT_ID,
3932
- manifest,
3933
- messages,
3934
- card: FixtureCard
3935
- };
3936
- var CRASH_KEY = {
3937
- cardTitle: `${CRASH_UNIT_ID}.cardTitle`,
3938
- cardMeta: `${CRASH_UNIT_ID}.cardMeta`
3939
- };
3940
- var crashMessages = {
3941
- zh: {
3942
- [CRASH_KEY.cardTitle]: "崩溃的卡片",
3943
- [CRASH_KEY.cardMeta]: "夹具:渲染时抛错"
3944
- },
3945
- en: {
3946
- [CRASH_KEY.cardTitle]: "Crashing card",
3947
- [CRASH_KEY.cardMeta]: "Fixture: throws while rendering"
3948
- }
3949
- };
3950
- var crashManifest = {
3951
- id: CRASH_UNIT_ID,
3952
- card: {
3953
- titleKey: CRASH_KEY.cardTitle,
3954
- order: 899
3955
- },
3956
- tools: [],
3957
- host: { inject: [] }
3958
- };
3959
- function CrashingCard() {
3960
- throw new Error("夹具:这张卡片按 wbCrash=1 故意渲染失败(守「一张卡片崩溃不带走面板」)");
3961
- }
3962
- var CRASH_FACE = {
3963
- unit: CRASH_UNIT_ID,
3964
- manifest: crashManifest,
3965
- messages: crashMessages,
3966
- card: CrashingCard
3967
- };
3968
- var SAMPLE_ROSTER = [manifest];
3969
- function hasCard(roster) {
3970
- return roster.some((item) => item.card !== null);
3213
+ function shouldProbeOnEnter(input) {
3214
+ if (input.checkedAt === null) return true;
3215
+ return input.now - input.checkedAt >= input.staleMs;
3216
+ }
3217
+ //#endregion
3218
+ //#region src/app/layouts/rightbar/market-settle.ts
3219
+ var MODULE_SETTLE_MS = 15e3;
3220
+ function holdBack(installed, roster, active, previous) {
3221
+ const pending = installed.filter((unit) => !roster.has(unit));
3222
+ const fresh = previous === null ? [] : pending.filter((unit) => !previous.has(unit));
3223
+ return pending.filter((unit) => active.has(unit) || fresh.includes(unit));
3224
+ }
3225
+ var WORKBENCH_SWAP_MS = 18e4;
3226
+ function swapLanded(until, installed) {
3227
+ return until !== void 0 && installed === until;
3228
+ }
3229
+ function swapUntil(action, application, latest) {
3230
+ if (action !== "update-workbench" || application !== "restart-required") return void 0;
3231
+ return latest;
3232
+ }
3233
+ var READ_BACK_ACTIONS = /* @__PURE__ */ new Set(["update", "update-bundle"]);
3234
+ function awaitsReadBack(action, application, version) {
3235
+ return application === "applied" && version !== void 0 && READ_BACK_ACTIONS.has(action);
3971
3236
  }
3972
- function fixtureRoster(roster) {
3973
- return hasCard(roster) ? roster : SAMPLE_ROSTER;
3237
+ function readBackDone(input) {
3238
+ if (input.action === "update") return !input.outdated;
3239
+ if (input.entry === void 0 || input.entry.local === true || input.entry.latest === void 0) return true;
3240
+ if (input.entry.latest === input.entry.installed) return true;
3241
+ if (input.clicked === void 0) return true;
3242
+ return input.entry.installed !== input.clicked;
3974
3243
  }
3975
- function boardModuleOf(face) {
3976
- const module = toBoardModule(face, face.manifest);
3977
- return module === void 0 ? [] : [module];
3244
+ function settleLanded(input) {
3245
+ if (input.until !== void 0) return swapLanded(input.until, input.installed);
3246
+ if (input.readBack !== true) return true;
3247
+ return readBackDone({
3248
+ action: input.action,
3249
+ entry: input.entry,
3250
+ clicked: input.clicked,
3251
+ outdated: input.outdated
3252
+ });
3978
3253
  }
3979
- function fixtureSeed(roster, all, crash = false) {
3980
- const base = hasCard(roster) ? all : boardModuleOf(FIXTURE_FACE);
3981
- return crash ? [...boardModuleOf(CRASH_FACE), ...base] : base;
3254
+ function holdWindowMs(until) {
3255
+ return until === void 0 ? MODULE_SETTLE_MS : WORKBENCH_SWAP_MS;
3982
3256
  }
3983
3257
  //#endregion
3984
3258
  //#region src/app/layouts/rightbar/market-shared-rows.ts
@@ -4631,7 +3905,7 @@ function marketSectionIcon(kind) {
4631
3905
  var SIZE = 18;
4632
3906
  function packageIcon(kind) {
4633
3907
  switch (kind) {
4634
- case "module": return h(_deepseek_ai_dsh_client_ui_primitives.IconArchiveOutlineRegular, { size: SIZE });
3908
+ case "module": return h(IconModuleMark, { size: SIZE });
4635
3909
  case "plugin": return h(IconOpencli, { size: SIZE });
4636
3910
  case "lib": return h(IconNpm, { size: SIZE });
4637
3911
  case "workbench": return h(IconPanelScreen, { size: SIZE });
@@ -5961,285 +5235,6 @@ function AddModuleResult({ t, state }) {
5961
5235
  }, 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)));
5962
5236
  }
5963
5237
  //#endregion
5964
- //#region src/app/layouts/market/add-module-mock.ts
5965
- function change(over) {
5966
- return {
5967
- application: "applied",
5968
- stage: "install",
5969
- changed: true,
5970
- target: "@dsh-workbench/module-hello",
5971
- ...over
5972
- };
5973
- }
5974
- function outcome(over, supply = { state: "installed" }) {
5975
- return {
5976
- change: change(over),
5977
- module: {
5978
- kind: "module",
5979
- pkg: "@dsh-workbench/module-hello",
5980
- unit: "hello",
5981
- version: "0.1.2"
5982
- },
5983
- supply
5984
- };
5985
- }
5986
- function refused(problem, reason = "") {
5987
- return {
5988
- id: `refused-${problem}`,
5989
- label: `预检拒:${problem}`,
5990
- phase: "idle",
5991
- spec: "@dsh-workbench/module-nope",
5992
- problem: {
5993
- problem,
5994
- reason
5995
- }
5996
- };
5997
- }
5998
- var ADD_MODULE_MOCKS = [
5999
- {
6000
- id: "empty",
6001
- label: "刚打开",
6002
- phase: "idle",
6003
- spec: ""
6004
- },
6005
- {
6006
- id: "typed",
6007
- label: "填了包名",
6008
- phase: "idle",
6009
- spec: "@dsh-workbench/module-hello"
6010
- },
6011
- {
6012
- id: "guide",
6013
- label: "展开了示例",
6014
- phase: "idle",
6015
- spec: "",
6016
- guideOpen: true
6017
- },
6018
- {
6019
- id: "inspecting",
6020
- label: "正在预检",
6021
- phase: "inspecting",
6022
- spec: "@dsh-workbench/module-hello"
6023
- },
6024
- refused("invalid-spec"),
6025
- refused("already-installed", "已经在 profile 里:@dsh-workbench/module-hello@0.1.2"),
6026
- refused("not-found"),
6027
- refused("not-a-package"),
6028
- refused("not-a-bundle"),
6029
- refused("not-a-module-or-plugin", "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上"),
6030
- refused("network", "getaddrinfo ENOTFOUND registry.example.com"),
6031
- refused("unknown", "pnpm 的返回码是 1"),
6032
- {
6033
- id: "preview",
6034
- label: "预览(可装)",
6035
- phase: "preview",
6036
- spec: "@dsh-workbench/module-hello",
6037
- preview: {
6038
- kind: "module",
6039
- name: "@dsh-workbench/module-hello",
6040
- version: "0.1.2",
6041
- description: "最小样本模块:一枚「你好」卡片",
6042
- registry: "registry.npmmirror.com"
6043
- }
6044
- },
6045
- {
6046
- id: "preview-no-source",
6047
- label: "预览(问不出源)",
6048
- phase: "preview",
6049
- spec: "@dsh-workbench/module-hello",
6050
- preview: {
6051
- kind: "module",
6052
- name: "@dsh-workbench/module-hello",
6053
- version: "",
6054
- description: "",
6055
- registry: ""
6056
- }
6057
- },
6058
- {
6059
- id: "preview-plugin",
6060
- label: "预览(opencli 插件)",
6061
- phase: "preview",
6062
- spec: "opencli-plugin-grafana",
6063
- preview: {
6064
- kind: "plugin",
6065
- name: "opencli-plugin-grafana",
6066
- version: "1.0.16",
6067
- description: "",
6068
- registry: "registry.npmmirror.com",
6069
- pluginName: "grafana"
6070
- }
6071
- },
6072
- {
6073
- id: "installing",
6074
- label: "正在安装(可取消)",
6075
- phase: "installing",
6076
- spec: "@dsh-workbench/module-hello"
6077
- },
6078
- {
6079
- id: "needs-approval",
6080
- label: "安装脚本待批",
6081
- phase: "result",
6082
- spec: "@dsh-workbench/module-hello",
6083
- outcome: {
6084
- ...outcome({
6085
- application: "failed",
6086
- stage: "install",
6087
- errorCode: "build-blocked",
6088
- pendingBuilds: ["esbuild", "sharp"]
6089
- }),
6090
- supply: {
6091
- state: "failed",
6092
- reason: "装上之前得先允许安装脚本"
6093
- }
6094
- }
6095
- },
6096
- {
6097
- id: "failed-registry",
6098
- label: "失败:源上没有",
6099
- phase: "result",
6100
- spec: "@dsh-workbench/module-nope",
6101
- outcome: outcome({
6102
- application: "failed",
6103
- stage: "install",
6104
- failedAt: "registry",
6105
- errorCode: "not-found"
6106
- })
6107
- },
6108
- {
6109
- id: "failed-pnpm",
6110
- label: "失败:pnpm 执行出错",
6111
- phase: "result",
6112
- spec: "@dsh-workbench/module-hello",
6113
- outcome: outcome({
6114
- application: "failed",
6115
- stage: "install",
6116
- errorCode: "operation-error",
6117
- errorDetail: "ERR_PNPM_FETCH_404 GET https://registry.example.com/@dsh-workbench%2Fmodule-hello: Not Found"
6118
- })
6119
- },
6120
- {
6121
- id: "done-applied",
6122
- label: "装好了(已生效)",
6123
- phase: "result",
6124
- spec: "@dsh-workbench/module-hello",
6125
- outcome: outcome({})
6126
- },
6127
- {
6128
- id: "done-plugin",
6129
- label: "装好了(opencli 插件)",
6130
- phase: "result",
6131
- spec: "opencli-plugin-cmdb",
6132
- outcome: {
6133
- change: change({ target: "opencli-plugin-cmdb" }),
6134
- module: {
6135
- kind: "unknown",
6136
- pkg: "opencli-plugin-cmdb"
6137
- },
6138
- supply: { state: "no-needs" },
6139
- plugin: {
6140
- kind: "opencli-plugin",
6141
- pkg: "opencli-plugin-cmdb",
6142
- name: "cmdb"
6143
- }
6144
- }
6145
- },
6146
- {
6147
- id: "done-restart",
6148
- label: "装好了(要重启,并说清是哪种:这一格是「某个已装的包换了目录」)",
6149
- phase: "result",
6150
- spec: "@dsh-workbench/module-hello",
6151
- outcome: outcome({
6152
- application: "restart-required",
6153
- restartReason: "package-moved"
6154
- }, { state: "pending-restart" })
6155
- },
6156
- {
6157
- id: "not-a-module",
6158
- label: "装进来的不是模块",
6159
- phase: "result",
6160
- spec: "some-random-package",
6161
- outcome: {
6162
- change: change({ target: "some-random-package" }),
6163
- module: {
6164
- kind: "not-module",
6165
- pkg: "some-random-package"
6166
- },
6167
- supply: { state: "not-a-module" }
6168
- }
6169
- },
6170
- {
6171
- id: "cancelled",
6172
- label: "已取消",
6173
- phase: "result",
6174
- spec: "@dsh-workbench/module-hello",
6175
- outcome: outcome({
6176
- application: "cancelled",
6177
- changed: false
6178
- }, { state: "no-needs" })
6179
- },
6180
- {
6181
- id: "done-no-needs",
6182
- label: "装好了(不要额外供给)",
6183
- phase: "result",
6184
- spec: "@dsh-workbench/module-plain",
6185
- outcome: {
6186
- change: change({ target: "@dsh-workbench/module-plain" }),
6187
- module: {
6188
- kind: "module",
6189
- pkg: "@dsh-workbench/module-plain",
6190
- unit: "plain",
6191
- version: "1.0.0"
6192
- },
6193
- supply: { state: "no-needs" }
6194
- }
6195
- },
6196
- {
6197
- id: "removed",
6198
- label: "移除掉了",
6199
- phase: "result",
6200
- spec: "some-random-package",
6201
- outcome: {
6202
- change: change({
6203
- stage: "remove",
6204
- target: "some-random-package"
6205
- }),
6206
- module: {
6207
- kind: "not-module",
6208
- pkg: "some-random-package"
6209
- },
6210
- supply: { state: "not-a-module" }
6211
- }
6212
- }
6213
- ];
6214
- var frozen = () => {};
6215
- function stateOfMock(base, mock) {
6216
- return {
6217
- ...base,
6218
- spec: mock.spec,
6219
- guideOpen: mock.guideOpen ?? false,
6220
- phase: mock.phase,
6221
- choices: base.choices,
6222
- custom: "",
6223
- registryOpen: false,
6224
- problem: mock.problem ?? null,
6225
- preview: mock.preview ?? null,
6226
- outcome: mock.outcome ?? null,
6227
- failure: mock.failure ?? null,
6228
- builds: mock.outcome?.change.pendingBuilds ?? [],
6229
- setSpec: frozen,
6230
- setChoice: frozen,
6231
- setCustom: frozen,
6232
- toggleRegistry: frozen,
6233
- closeRegistry: frozen,
6234
- toggleGuide: frozen,
6235
- check: frozen,
6236
- edit: frozen,
6237
- install: frozen,
6238
- cancelInstall: frozen,
6239
- removeIt: frozen
6240
- };
6241
- }
6242
- //#endregion
6243
5238
  //#region src/app/layouts/market/use-add-module.ts
6244
5239
  function newRequestId() {
6245
5240
  return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
@@ -6439,12 +5434,9 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
6439
5434
  onInstalled,
6440
5435
  failedText: t("panels.failed")
6441
5436
  });
6442
- const pick = useFixturePick({
6443
- fixtures: ADD_MODULE_MOCKS,
6444
- initial: ADD_MODULE_MOCKS[0]?.id ?? null
6445
- });
6446
- const mock = pick.enabled ? pick.current : void 0;
6447
- const state = mock === void 0 ? real : stateOfMock(real, mock);
5437
+ const devAdd = devSurface.useStrips("addModule", []);
5438
+ const mock = devAdd.current;
5439
+ const state = mock === void 0 ? real : devSurface.addModuleState(real, mock);
6448
5440
  if (!open) return null;
6449
5441
  const installing = state.phase === "installing";
6450
5442
  const checking = state.phase === "inspecting";
@@ -6521,12 +5513,7 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
6521
5513
  className: AddModule_module_default.dialog,
6522
5514
  contentClassName: AddModule_module_default.content,
6523
5515
  footer
6524
- }, /* @__PURE__ */ h("div", { className: AddModule_module_default.stack }, pick.enabled ? /* @__PURE__ */ h(MockStrip, {
6525
- mocks: ADD_MODULE_MOCKS,
6526
- index: pick.index,
6527
- note: "夹具:只切状态,不发请求",
6528
- onPick: (at) => pick.pick(ADD_MODULE_MOCKS[at]?.id ?? null)
6529
- }) : null, state.phase === "idle" ? /* @__PURE__ */ h(AddModuleForm, {
5516
+ }, /* @__PURE__ */ h("div", { className: AddModule_module_default.stack }, devAdd.strip, state.phase === "idle" ? /* @__PURE__ */ h(AddModuleForm, {
6530
5517
  t,
6531
5518
  state
6532
5519
  }) : null, state.phase === "inspecting" ? /* @__PURE__ */ h(AddModulePending, {
@@ -6634,13 +5621,9 @@ function MarketPanel({ t, units }) {
6634
5621
  checking: true,
6635
5622
  checkedAt: null
6636
5623
  };
6637
- const marketMocks = useMemo(() => buildMarketMocks(fixtureRoster(manifests)), [manifests]);
6638
- const fixturePick = useFixturePick({
6639
- fixtures: marketMocks,
6640
- initial: marketMocks[0]?.id ?? null
6641
- });
6642
- const mock = fixturePick.enabled ? fixturePick.current : void 0;
6643
- const mockNonce = fixturePick.nonce;
5624
+ const devMarket = devSurface.useStrips("market", manifests);
5625
+ const mock = devMarket.current;
5626
+ const mockNonce = devMarket.pick.nonce;
6644
5627
  const shownFreshness = mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS;
6645
5628
  const shownRead = mock === void 0 ? installedRead : mock.installedRead ?? true;
6646
5629
  const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking || acting;
@@ -6663,11 +5646,7 @@ function MarketPanel({ t, units }) {
6663
5646
  icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutlineRegular, { size: 13 }),
6664
5647
  disabled: busy,
6665
5648
  onClick: openAddModule
6666
- }, t("panels.market.add.open")))), fixturePick.enabled ? /* @__PURE__ */ h(MockStrip, {
6667
- mocks: marketMocks,
6668
- index: fixturePick.index,
6669
- onPick: (at) => fixturePick.pick(marketMocks[at]?.id ?? null)
6670
- }) : null, /* @__PURE__ */ h(MarketView, {
5649
+ }, t("panels.market.add.open")))), devMarket.strip, /* @__PURE__ */ h(MarketView, {
6671
5650
  key: `${mock?.id ?? "real-market"}-${mockNonce}`,
6672
5651
  t,
6673
5652
  manifests,
@@ -7159,6 +6138,9 @@ var WORKSHOP_PAST_TITLES = ["DIY 工坊", "工作台自带 · DIY 模块住这
7159
6138
  function isWorkshopPath(path) {
7160
6139
  return path.replace(/\\/g, "/").replace(/\/+$/, "").endsWith(`/${WORKSHOP_RELATIVE}`);
7161
6140
  }
6141
+ function diyStartOptions(workspaceId, workshopId) {
6142
+ return workshopId !== void 0 && workshopId === workspaceId ? { agentPreset: DIY_PRESET_ID } : void 0;
6143
+ }
7162
6144
  //#endregion
7163
6145
  //#region src/app/units/index.ts
7164
6146
  var CLIENT_UNITS = [];
@@ -7166,6 +6148,182 @@ function assembleClientUnits(registry) {
7166
6148
  for (const face of CLIENT_UNITS) registry.register(face);
7167
6149
  }
7168
6150
  //#endregion
6151
+ //#region src/app/layouts/rightbar/registry.ts
6152
+ function createBoardRegistry() {
6153
+ const modules = [];
6154
+ const listeners = /* @__PURE__ */ new Set();
6155
+ let revision = 0;
6156
+ let sorted = [];
6157
+ let index = /* @__PURE__ */ new Map();
6158
+ let steps = /* @__PURE__ */ new Map();
6159
+ function rebuild() {
6160
+ sorted = [...modules].sort((a, b) => a.order - b.order || a.id.localeCompare(b.id));
6161
+ index = new Map(sorted.map((module) => [module.id, module]));
6162
+ const table = /* @__PURE__ */ new Map();
6163
+ for (const module of sorted) for (const kind of Object.keys(module.steps ?? {})) {
6164
+ const owner = table.get(kind);
6165
+ if (owner !== void 0) throw new Error(`看板层名重复:${kind}(${owner.id} 与 ${module.id} 都声明了它)`);
6166
+ table.set(kind, module);
6167
+ }
6168
+ steps = table;
6169
+ }
6170
+ function notify() {
6171
+ revision += 1;
6172
+ for (const listener of listeners) listener();
6173
+ }
6174
+ return {
6175
+ register(module) {
6176
+ if (modules.some((item) => item.id === module.id)) throw new Error(`看板模块 id 重复:${module.id}(id 会进持久化配置,不能撞)`);
6177
+ modules.push(module);
6178
+ try {
6179
+ rebuild();
6180
+ } catch (error) {
6181
+ modules.pop();
6182
+ rebuild();
6183
+ throw error;
6184
+ }
6185
+ notify();
6186
+ return () => {
6187
+ const at = modules.indexOf(module);
6188
+ if (at < 0) return;
6189
+ modules.splice(at, 1);
6190
+ rebuild();
6191
+ notify();
6192
+ };
6193
+ },
6194
+ all: () => sorted,
6195
+ byId: (id) => index.get(id),
6196
+ stepOwner: (kind) => steps.get(kind),
6197
+ subscribe(listener) {
6198
+ listeners.add(listener);
6199
+ return () => listeners.delete(listener);
6200
+ },
6201
+ version: () => revision
6202
+ };
6203
+ }
6204
+ //#endregion
6205
+ //#region src/app/units/registry.ts
6206
+ function toBoardModule(face, manifest) {
6207
+ const View = face.card;
6208
+ if (View === void 0) return void 0;
6209
+ return {
6210
+ id: manifest.id,
6211
+ titleKey: manifest.card?.titleKey ?? manifest.id,
6212
+ order: manifest.card?.order ?? 100,
6213
+ View,
6214
+ ...face.steps === void 0 ? {} : { steps: face.steps }
6215
+ };
6216
+ }
6217
+ function createClientUnitRegistry(options = {}) {
6218
+ const registrations = [];
6219
+ const refusals = [];
6220
+ const listeners = /* @__PURE__ */ new Set();
6221
+ const board = createBoardRegistry();
6222
+ let known = /* @__PURE__ */ new Map();
6223
+ let installableIds = null;
6224
+ let revision = 0;
6225
+ let manifestsCache;
6226
+ function notify() {
6227
+ revision += 1;
6228
+ for (const listener of [...listeners]) try {
6229
+ listener();
6230
+ } catch (error) {
6231
+ console.warn(`[dsh-workbench] 套件注册的订阅者报错(不影响其它订阅者与这次注册):${String(error)}`);
6232
+ }
6233
+ }
6234
+ function warnRefusal(unit, kind, reasons) {
6235
+ refusals.push({
6236
+ unit,
6237
+ kind,
6238
+ reasons
6239
+ });
6240
+ console.warn(`[dsh-workbench] ${unit === "" ? "这个模块" : unit} 的卡片没挂上:${reasons.join(";")}`);
6241
+ }
6242
+ function takeBackRefusal(unit) {
6243
+ for (let at = refusals.length - 1; at >= 0; at -= 1) if (refusals[at]?.unit === unit) refusals.splice(at, 1);
6244
+ }
6245
+ function attach(entry) {
6246
+ const manifest = known.get(entry.unit);
6247
+ if (manifest === void 0) return false;
6248
+ const boardModule = toBoardModule(entry.face, manifest);
6249
+ entry.mounted = {
6250
+ manifest,
6251
+ unmount: boardModule === void 0 ? () => {} : board.register(boardModule)
6252
+ };
6253
+ takeBackRefusal(entry.unit);
6254
+ return true;
6255
+ }
6256
+ function detach(entry) {
6257
+ entry.mounted?.unmount();
6258
+ entry.mounted = null;
6259
+ }
6260
+ return {
6261
+ register(face) {
6262
+ const unit = typeof face?.unit === "string" ? face.unit.trim() : "";
6263
+ if (unit === "") {
6264
+ warnRefusal("", "old-shape", ["registerUnit({ unit, card }) 里的 unit 是空的 —— U1b 之前的旧形状是 registerUnit({ manifest, card });现在清单由外壳从**已装清单**读出来、按 unit 交给浏览器(ADR-0038 §2.2)"]);
6265
+ notify();
6266
+ return () => {};
6267
+ }
6268
+ if (registrations.some((entry) => entry.unit === unit)) throw new Error(`套件 id 重复:${unit}(id 会进持久化配置,不能撞)`);
6269
+ const entry = {
6270
+ face,
6271
+ unit,
6272
+ mounted: null
6273
+ };
6274
+ registrations.push(entry);
6275
+ manifestsCache = void 0;
6276
+ if (!attach(entry)) {
6277
+ warnRefusal(unit, "no-manifest", [`宿主没有担保 unit「${unit}」的清单 —— 这个包要么没装进这份 profile,要么它的 dsh.workbench 没通过校验。卡片先不挂:清单只有一处真相(ADR-0038 §2.2)`]);
6278
+ options.onUnknownUnit?.(unit);
6279
+ }
6280
+ notify();
6281
+ return () => {
6282
+ const at = registrations.indexOf(entry);
6283
+ if (at < 0) return;
6284
+ registrations.splice(at, 1);
6285
+ detach(entry);
6286
+ takeBackRefusal(unit);
6287
+ manifestsCache = void 0;
6288
+ notify();
6289
+ };
6290
+ },
6291
+ all: () => registrations.map((entry) => entry.face),
6292
+ manifests: () => {
6293
+ manifestsCache ??= registrations.flatMap((entry) => entry.mounted === null ? [] : [entry.mounted.manifest]);
6294
+ return manifestsCache;
6295
+ },
6296
+ refusals: () => refusals,
6297
+ installable: () => installableIds,
6298
+ setManifests(manifests, installable) {
6299
+ known = new Map(manifests.map((manifest) => [manifest.id, manifest]));
6300
+ installableIds = installable === void 0 ? null : new Set(installable);
6301
+ let changed = false;
6302
+ for (const entry of registrations) {
6303
+ const next = known.get(entry.unit);
6304
+ if (entry.mounted === null) {
6305
+ if (next !== void 0 && attach(entry)) changed = true;
6306
+ continue;
6307
+ }
6308
+ if (next === void 0) {
6309
+ detach(entry);
6310
+ warnRefusal(entry.unit, "withdrawn", [`宿主不再担保 unit「${entry.unit}」的清单(模块被卸了?)—— 这张卡片先摘下来`]);
6311
+ changed = true;
6312
+ }
6313
+ }
6314
+ if (!changed) return;
6315
+ manifestsCache = void 0;
6316
+ notify();
6317
+ },
6318
+ board,
6319
+ subscribe(listener) {
6320
+ listeners.add(listener);
6321
+ return () => listeners.delete(listener);
6322
+ },
6323
+ version: () => revision
6324
+ };
6325
+ }
6326
+ //#endregion
7169
6327
  //#region src/shared/api/unit-manifests.ts
7170
6328
  var UNIT_MANIFESTS_ROUTE = "unit-manifests";
7171
6329
  //#endregion
@@ -7329,281 +6487,12 @@ function spinnerIcon(size = 14) {
7329
6487
  svg.append(group);
7330
6488
  return svg;
7331
6489
  }
7332
- function el$1(tag, className, text) {
7333
- const node = document.createElement(tag);
7334
- node.className = className;
7335
- if (text !== void 0) node.textContent = text;
7336
- return node;
7337
- }
7338
- //#endregion
7339
- //#region src/app/layouts/env-gate/gate-mock.ts
7340
- var INSTALL_COMMAND = "npm i --prefix '/Users/you/.dsh/workbench/opencli/toolchain' @jackwener/opencli@1.8.8";
7341
- var EXTENSION_REPORT = [
7342
- "[OK] Daemon: running on port 19825 (v1.8.8)",
7343
- "[MISSING] Extension: not connected",
7344
- "[OK] Connectivity: connected in 0.0s",
7345
- "",
7346
- "Issues:",
7347
- " • Daemon is running but the Chrome/Chromium extension is not connected.",
7348
- "If the extension is already installed, try: opencli daemon restart",
7349
- "If the extension is not installed:",
7350
- " 1. Download from https://github.com/jackwener/opencli/releases",
7351
- " 2. Open chrome://extensions/ → Enable Developer Mode",
7352
- " 3. Click \"Load unpacked\" → select the extension folder"
7353
- ].join("\n");
7354
- var DAEMON_REPORT = [
7355
- "[MISSING] Daemon: not running",
7356
- "[MISSING] Extension: not connected",
7357
- "[FAIL] Connectivity: failed (daemon not reachable)",
7358
- "",
7359
- "Issues:",
7360
- " • Daemon is not running. It should start automatically when you run an opencli browser command.",
7361
- " • Daemon is running but the Chrome/Chromium extension is not connected.",
7362
- "If the extension is already installed, try: opencli daemon restart"
7363
- ].join("\n");
7364
- var PROFILE_REPORT = [
7365
- "[OK] Daemon: running on port 19825 (v1.8.8)",
7366
- "[MISSING] Extension: not connected",
7367
- "[FAIL] Connectivity: failed (profile-required)",
7368
- "",
7369
- "Issues:",
7370
- " • Multiple Chrome profiles are connected to the daemon, but no default profile was selected.",
7371
- " Run opencli profile list, then opencli profile use <name>, or pass --profile <name>."
7372
- ].join("\n");
7373
- var AT = 1790574156506;
7374
- function mock(id, label, note, snapshot, expect) {
7375
- return {
7376
- id,
7377
- label,
7378
- note,
7379
- snapshot: {
7380
- ...snapshot,
7381
- at: AT
7382
- },
7383
- expect
7384
- };
7385
- }
7386
- var BRIDGE_PENDING = {
7387
- id: "bridge",
7388
- status: "pending"
7389
- };
7390
- var GATE_MOCKS = [
7391
- mock("boot", "刚立起来", "还没拿到体检结果的那一帧:只有标题 + 一句\"正在检测运行环境…\",一行步骤都还没有。", {
7392
- phase: "idle",
7393
- steps: []
7394
- }, {
7395
- hint: "checking",
7396
- command: false
7397
- }),
7398
- mock("checking", "检测中", "第一步在跑(转圈 + 它正在执行的命令),第二步还没轮到(短横)。", {
7399
- phase: "checking",
7400
- steps: [{
7401
- id: "opencli",
7402
- status: "running",
7403
- action: "opencli --version"
7404
- }, BRIDGE_PENDING]
7405
- }, {
7406
- hint: "checking",
7407
- command: false
7408
- }),
7409
- mock("installing", "安装中(npm 在跑)", "缺 opencli:正在装。右边会**数秒**(静止的圆点看不出在干活)。", {
7410
- phase: "installing",
7411
- steps: [{
7412
- id: "opencli",
7413
- status: "running",
7414
- action: INSTALL_COMMAND,
7415
- command: INSTALL_COMMAND
7416
- }, BRIDGE_PENDING]
7417
- }, {
7418
- hint: "installing",
7419
- command: false
7420
- }),
7421
- mock("ready", "都就绪(真机到这就放行)", "两步都过。这一帧之后 gate 立刻撤掉 —— 钉住它只是为了看一眼这两行长什么样。", {
7422
- phase: "ready",
7423
- steps: [{
7424
- id: "opencli",
7425
- status: "ok",
7426
- detail: "1.8.8"
7427
- }, {
7428
- id: "bridge",
7429
- status: "ok",
7430
- detail: "Everything looks good!"
7431
- }]
7432
- }, {
7433
- hint: "checking",
7434
- command: false
7435
- }),
7436
- mock("warn-extension", "浏览器通道:扩展没连上", "daemon 在跑、扩展没连上(最常见):行尾说\"没连上\",下面给「去应用商店装扩展」+ `daemon restart`,原文折叠当证据。", {
7437
- phase: "ready",
7438
- steps: [{
7439
- id: "opencli",
7440
- status: "ok",
7441
- detail: "1.8.8"
7442
- }, {
7443
- id: "bridge",
7444
- status: "warn",
7445
- detail: EXTENSION_REPORT,
7446
- command: "opencli daemon restart"
7447
- }],
7448
- bridgeIssues: ["extension"]
7449
- }, {
7450
- hint: "checking",
7451
- command: false,
7452
- bridgeIssues: ["extension"]
7453
- }),
7454
- mock("warn-daemon", "浏览器通道:服务没起来", "daemon 没起来(扩展跟着也连不上):两条人话都摆出来,命令给 `daemon restart`。", {
7455
- phase: "ready",
7456
- steps: [{
7457
- id: "opencli",
7458
- status: "ok",
7459
- detail: "1.8.8"
7460
- }, {
7461
- id: "bridge",
7462
- status: "warn",
7463
- detail: DAEMON_REPORT,
7464
- command: "opencli daemon restart"
7465
- }],
7466
- bridgeIssues: ["daemon", "extension"]
7467
- }, {
7468
- hint: "checking",
7469
- command: false,
7470
- bridgeIssues: ["daemon", "extension"]
7471
- }),
7472
- mock("warn-profile", "浏览器通道:没选默认 profile", "连了多个浏览器 profile 但没选默认:只说\"选哪个\"(重启服务解决不了它),命令给 `profile list`。", {
7473
- phase: "ready",
7474
- steps: [{
7475
- id: "opencli",
7476
- status: "ok",
7477
- detail: "1.8.8"
7478
- }, {
7479
- id: "bridge",
7480
- status: "warn",
7481
- detail: PROFILE_REPORT,
7482
- command: "opencli profile list"
7483
- }],
7484
- bridgeIssues: ["profile"]
7485
- }, {
7486
- hint: "checking",
7487
- command: false,
7488
- bridgeIssues: ["profile"]
7489
- }),
7490
- mock("failed-permission", "装不上:权限不足", "失败态:为什么需要它 → 确切命令(可复制)→ 照做能解决的一句人话(EACCES → 换目录 / sudo)。", {
7491
- phase: "failed",
7492
- steps: [{
7493
- id: "opencli",
7494
- status: "failed",
7495
- detail: "npm ERR! code EACCES",
7496
- command: INSTALL_COMMAND
7497
- }, BRIDGE_PENDING],
7498
- error: "npm ERR! code EACCES\nnpm ERR! syscall mkdir\nnpm ERR! path /usr/local/lib/node_modules",
7499
- failure: "permission",
7500
- guidance: "install"
7501
- }, {
7502
- hint: "failed",
7503
- guidance: "install",
7504
- command: true
7505
- }),
7506
- mock("failed-network", "装不上:网络不通", "同一档失败,但人话换成\"查代理\"那条(EAI_AGAIN / ENOTFOUND)。", {
7507
- phase: "failed",
7508
- steps: [{
7509
- id: "opencli",
7510
- status: "failed",
7511
- detail: "npm ERR! code EAI_AGAIN",
7512
- command: INSTALL_COMMAND
7513
- }, BRIDGE_PENDING],
7514
- error: "npm ERR! code EAI_AGAIN\nnpm ERR! network request to https://registry.npmjs.org failed",
7515
- failure: "network",
7516
- guidance: "install"
7517
- }, {
7518
- hint: "failed",
7519
- guidance: "install",
7520
- command: true
7521
- }),
7522
- mock("failed-unknown", "装不上:认不出的错", "认不出失败种类时**不编**建议:只给命令与原文(多一句假建议比少一句更糟)。", {
7523
- phase: "failed",
7524
- steps: [{
7525
- id: "opencli",
7526
- status: "failed",
7527
- detail: "something went wrong",
7528
- command: INSTALL_COMMAND
7529
- }, BRIDGE_PENDING],
7530
- error: "something went wrong",
7531
- failure: "unknown",
7532
- guidance: "install"
7533
- }, {
7534
- hint: "failed",
7535
- guidance: "install",
7536
- command: true
7537
- }),
7538
- mock("failed-path", "装了但还找不到", "装完了 `--version` 还是不行:**不再让用户装一遍**(PATH / 新终端的事),所以不给命令。", {
7539
- phase: "failed",
7540
- steps: [{
7541
- id: "opencli",
7542
- status: "failed",
7543
- detail: "zsh: command not found: opencli",
7544
- command: INSTALL_COMMAND
7545
- }, BRIDGE_PENDING],
7546
- error: "zsh: command not found: opencli",
7547
- failure: "missing",
7548
- guidance: "path"
7549
- }, {
7550
- hint: "failed",
7551
- guidance: "path",
7552
- command: false
7553
- }),
7554
- mock("failed-shell", "执行缝坏了", "连 shell 都调不动:装也不可能成功。没有\"正在执行的动作\"、也没有命令 —— 该做的是重启宿主。", {
7555
- phase: "failed",
7556
- steps: [{
7557
- id: "opencli",
7558
- status: "failed",
7559
- detail: "Error: spawn /bin/sh ENOENT"
7560
- }, BRIDGE_PENDING],
7561
- error: "Error: spawn /bin/sh ENOENT",
7562
- failure: "unknown",
7563
- guidance: "shell"
7564
- }, {
7565
- hint: "failed",
7566
- guidance: "shell",
7567
- command: false
7568
- })
7569
- ];
7570
6490
  function el(tag, className, text) {
7571
6491
  const node = document.createElement(tag);
7572
6492
  node.className = className;
7573
6493
  if (text !== void 0) node.textContent = text;
7574
6494
  return node;
7575
6495
  }
7576
- function mountGateMockStrip(options) {
7577
- const strip = el("div", `wb-mockStrip ${BootGate_module_default.mockSlot}`);
7578
- const note = el("span", "wb-mockNote");
7579
- const chips = [];
7580
- const paint = (active) => {
7581
- note.textContent = `夹具:钉住启动页的状态,不轮询、不放行 —— ${active?.note ?? "不接管:按真机走(就绪就放行)。"}`;
7582
- chips.forEach((chip) => {
7583
- chip.className = `wb-mockChip${chip.dataset.mock === active?.id ? " wb-mockChipOn" : ""}`;
7584
- });
7585
- };
7586
- const pick = (active) => {
7587
- paint(active);
7588
- options.onPick(active === null ? null : active.snapshot);
7589
- };
7590
- const real = el("button", "wb-mockChip", "真实");
7591
- real.setAttribute("type", "button");
7592
- real.dataset.mock = "";
7593
- real.addEventListener("click", () => pick(null));
7594
- strip.append(note, real);
7595
- chips.push(real);
7596
- for (const item of GATE_MOCKS) {
7597
- const chip = el("button", "wb-mockChip", item.label);
7598
- chip.setAttribute("type", "button");
7599
- chip.dataset.mock = item.id;
7600
- chip.addEventListener("click", () => pick(item));
7601
- strip.append(chip);
7602
- chips.push(chip);
7603
- }
7604
- pick(GATE_MOCKS[0] ?? null);
7605
- return strip;
7606
- }
7607
6496
  //#endregion
7608
6497
  //#region src/app/layouts/env-gate/boot-gate.ts
7609
6498
  var POLL_MS = 400;
@@ -7634,9 +6523,9 @@ function createForcePlan() {
7634
6523
  };
7635
6524
  }
7636
6525
  function commandRow(t) {
7637
- const row = el$1("div", BootGate_module_default.commandRow);
7638
- const code = el$1("code", BootGate_module_default.command);
7639
- const copy = el$1("button", BootGate_module_default.copy);
6526
+ const row = el("div", BootGate_module_default.commandRow);
6527
+ const code = el("code", BootGate_module_default.command);
6528
+ const copy = el("button", BootGate_module_default.copy);
7640
6529
  copy.setAttribute("type", "button");
7641
6530
  copy.setAttribute("aria-label", t("env.copyCommand"));
7642
6531
  copy.title = t("env.copyCommand");
@@ -7669,47 +6558,47 @@ function createBootGate(ctx, options = {}) {
7669
6558
  const request = options.request ?? apiGet;
7670
6559
  if (typeof document === "undefined" || typeof document.getElementById !== "function" || document.body === void 0) return { close: () => {} };
7671
6560
  const root = document.getElementById("root");
7672
- const overlay = el$1("div", BootGate_module_default.gate);
6561
+ const overlay = el("div", BootGate_module_default.gate);
7673
6562
  overlay.setAttribute("role", "dialog");
7674
6563
  overlay.setAttribute("aria-modal", "true");
7675
6564
  overlay.setAttribute("aria-label", t("env.title"));
7676
- const card = el$1("div", BootGate_module_default.card);
7677
- const title = el$1("h1", BootGate_module_default.title, t("env.title"));
7678
- const hint = el$1("p", BootGate_module_default.hint, t("env.checking"));
7679
- const list = el$1("ul", BootGate_module_default.steps);
7680
- const progressRow = el$1("div", BootGate_module_default.progress);
6565
+ const card = el("div", BootGate_module_default.card);
6566
+ const title = el("h1", BootGate_module_default.title, t("env.title"));
6567
+ const hint = el("p", BootGate_module_default.hint, t("env.checking"));
6568
+ const list = el("ul", BootGate_module_default.steps);
6569
+ const progressRow = el("div", BootGate_module_default.progress);
7681
6570
  progressRow.hidden = true;
7682
- const elapsed = el$1("span", BootGate_module_default.elapsed);
6571
+ const elapsed = el("span", BootGate_module_default.elapsed);
7683
6572
  progressRow.append(elapsed);
7684
- const actions = el$1("div", BootGate_module_default.actions);
6573
+ const actions = el("div", BootGate_module_default.actions);
7685
6574
  actions.hidden = true;
7686
- const fixTitle = el$1("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
7687
- const fixWhy = el$1("p", BootGate_module_default.hint);
7688
- const fixStep = el$1("p", BootGate_module_default.hint);
7689
- const fixAdvice = el$1("p", BootGate_module_default.hint);
7690
- const raw = el$1("details", BootGate_module_default.raw);
7691
- const rawSummary = el$1("summary", BootGate_module_default.rawSummary, t("env.fix.details"));
7692
- const errorBox = el$1("pre", BootGate_module_default.error);
6575
+ const fixTitle = el("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
6576
+ const fixWhy = el("p", BootGate_module_default.hint);
6577
+ const fixStep = el("p", BootGate_module_default.hint);
6578
+ const fixAdvice = el("p", BootGate_module_default.hint);
6579
+ const raw = el("details", BootGate_module_default.raw);
6580
+ const rawSummary = el("summary", BootGate_module_default.rawSummary, t("env.fix.details"));
6581
+ const errorBox = el("pre", BootGate_module_default.error);
7693
6582
  raw.append(rawSummary, errorBox);
7694
- const buttons = el$1("div", BootGate_module_default.buttons);
7695
- const retry = el$1("button", BootGate_module_default.button, t("env.retry"));
6583
+ const buttons = el("div", BootGate_module_default.buttons);
6584
+ const retry = el("button", BootGate_module_default.button, t("env.retry"));
7696
6585
  retry.setAttribute("type", "button");
7697
6586
  const fixCommand = commandRow(t);
7698
6587
  buttons.append(retry);
7699
6588
  actions.append(fixTitle, fixWhy, fixStep, fixCommand.row, fixAdvice, buttons, raw);
7700
- const bridge = el$1("div", BootGate_module_default.bridge);
6589
+ const bridge = el("div", BootGate_module_default.bridge);
7701
6590
  bridge.hidden = true;
7702
- const bridgeTitle = el$1("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
7703
- const bridgeWhy = el$1("p", BootGate_module_default.hint, t("env.bridge.why"));
7704
- const bridgeLines = el$1("ul", BootGate_module_default.bridgeLines);
6591
+ const bridgeTitle = el("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
6592
+ const bridgeWhy = el("p", BootGate_module_default.hint, t("env.bridge.why"));
6593
+ const bridgeLines = el("ul", BootGate_module_default.bridgeLines);
7705
6594
  const bridgeCommand = commandRow(t);
7706
- const bridgeRetry = el$1("button", BootGate_module_default.button, t("env.retry"));
6595
+ const bridgeRetry = el("button", BootGate_module_default.button, t("env.retry"));
7707
6596
  bridgeRetry.setAttribute("type", "button");
7708
- const bridgeButtons = el$1("div", BootGate_module_default.buttons);
6597
+ const bridgeButtons = el("div", BootGate_module_default.buttons);
7709
6598
  bridgeButtons.append(bridgeRetry);
7710
- const bridgeRaw = el$1("details", BootGate_module_default.raw);
7711
- const bridgeRawText = el$1("pre", BootGate_module_default.error);
7712
- bridgeRaw.append(el$1("summary", BootGate_module_default.rawSummary, t("env.fix.details")), bridgeRawText);
6599
+ const bridgeRaw = el("details", BootGate_module_default.raw);
6600
+ const bridgeRawText = el("pre", BootGate_module_default.error);
6601
+ bridgeRaw.append(el("summary", BootGate_module_default.rawSummary, t("env.fix.details")), bridgeRawText);
7713
6602
  bridge.append(bridgeTitle, bridgeWhy, bridgeLines, bridgeCommand.row, bridgeButtons, bridgeRaw);
7714
6603
  card.append(title, hint, list, progressRow, actions, bridge);
7715
6604
  overlay.append(card);
@@ -7755,16 +6644,16 @@ function createBootGate(ctx, options = {}) {
7755
6644
  function ensureRow(step) {
7756
6645
  const existing = rows.get(step.id);
7757
6646
  if (existing !== void 0) return existing;
7758
- const item = el$1("li", BootGate_module_default.step);
7759
- const mark = el$1("span", BootGate_module_default.mark);
6647
+ const item = el("li", BootGate_module_default.step);
6648
+ const mark = el("span", BootGate_module_default.mark);
7760
6649
  mark.setAttribute("aria-hidden", "true");
7761
6650
  const row = {
7762
6651
  item,
7763
6652
  mark,
7764
- detail: el$1("span", BootGate_module_default.detail),
6653
+ detail: el("span", BootGate_module_default.detail),
7765
6654
  status: ""
7766
6655
  };
7767
- item.append(mark, el$1("span", BootGate_module_default.label, stepLabel$1(step.id, t)), row.detail);
6656
+ item.append(mark, el("span", BootGate_module_default.label, stepLabel$1(step.id, t)), row.detail);
7768
6657
  rows.set(step.id, row);
7769
6658
  return row;
7770
6659
  }
@@ -7811,7 +6700,7 @@ function createBootGate(ctx, options = {}) {
7811
6700
  if (bridgeBroken && bridgeStep !== void 0) {
7812
6701
  bridgeLines.replaceChildren(...(snapshot.bridgeIssues ?? ["unknown"]).map((issue) => {
7813
6702
  const advice = bridgeAdvice(issue);
7814
- const item = el$1("li", BootGate_module_default.bridgeLine, t(advice.textKey));
6703
+ const item = el("li", BootGate_module_default.bridgeLine, t(advice.textKey));
7815
6704
  if (advice.link !== void 0) {
7816
6705
  const link = document.createElement("a");
7817
6706
  link.className = BootGate_module_default.link;
@@ -7860,8 +6749,9 @@ function createBootGate(ctx, options = {}) {
7860
6749
  }
7861
6750
  retry.addEventListener("click", retryNow);
7862
6751
  bridgeRetry.addEventListener("click", retryNow);
7863
- if (mockModeOn(typeof window === "undefined" ? "" : window.location?.search ?? "")) {
7864
- const strip = mountGateMockStrip({ onPick: (snapshot) => {
6752
+ const search = typeof window === "undefined" ? "" : window.location?.search ?? "";
6753
+ if (devSurface.on(search)) {
6754
+ const strip = devSurface.gateStrip({ onPick: (snapshot) => {
7865
6755
  pinned = snapshot;
7866
6756
  if (snapshot !== null) {
7867
6757
  render(snapshot);
@@ -7869,7 +6759,7 @@ function createBootGate(ctx, options = {}) {
7869
6759
  }
7870
6760
  poll();
7871
6761
  } });
7872
- overlay.append(strip);
6762
+ if (strip !== null) overlay.append(strip);
7873
6763
  }
7874
6764
  poll();
7875
6765
  return { close };
@@ -8204,18 +7094,6 @@ function BoardEmpty({ t, onBuildModule, onOpenModules, onOpenMarket }) {
8204
7094
  }, t("panels.browseMarket")))
8205
7095
  });
8206
7096
  }
8207
- //#endregion
8208
- //#region src/app/layouts/rightbar/BoardMockStrip.tsx
8209
- function BoardMockStrip({ fixtures, show }) {
8210
- const current = fixtures.mock;
8211
- if (!show || current === void 0) return null;
8212
- return /* @__PURE__ */ h(MockStrip, {
8213
- note: `夹具:只切形状,不碰真实配置;卡片上的数据看卡片夹具 —— ${current.note}`,
8214
- mocks: fixtures.mocks,
8215
- index: fixtures.index,
8216
- onPick: fixtures.pick
8217
- });
8218
- }
8219
7097
  var ModulesPage_module_default = {
8220
7098
  trigger: "_trigger_15ptp_1",
8221
7099
  pop: "_pop_15ptp_6",
@@ -8242,250 +7120,6 @@ var ModulesPage_module_default = {
8242
7120
  groupTitle: "_groupTitle_15ptp_191"
8243
7121
  };
8244
7122
  //#endregion
8245
- //#region src/app/layouts/rightbar/panel-mock.ts
8246
- function row$1(id, titleKey, shown) {
8247
- return {
8248
- id,
8249
- titleKey,
8250
- shown,
8251
- source: "user",
8252
- hasCard: true
8253
- };
8254
- }
8255
- function noCardRow(id, titleKey) {
8256
- return {
8257
- id,
8258
- titleKey,
8259
- shown: false,
8260
- source: "user",
8261
- hasCard: false
8262
- };
8263
- }
8264
- function plugin(id, pkg, title, shown) {
8265
- return {
8266
- id,
8267
- pkg,
8268
- title,
8269
- shown,
8270
- source: "user"
8271
- };
8272
- }
8273
- var PLUGIN_MOCK = {
8274
- id: "plugin",
8275
- label: "opencli 插件行(标出是插件,能开能关)",
8276
- units: [],
8277
- plugins: [plugin("plugin:opencli-plugin-cmdb", "opencli-plugin-cmdb", "cmdb", true), plugin("plugin:opencli-plugin-notes", "opencli-plugin-notes", "notes", false)],
8278
- capabilities: {},
8279
- expect: { rows: 0 }
8280
- };
8281
- function probe(unit, status) {
8282
- return { [unit]: {
8283
- unit,
8284
- status,
8285
- required: [],
8286
- missing: [],
8287
- detail: "夹具"
8288
- } };
8289
- }
8290
- function buildPanelMocks(roster) {
8291
- const found = roster.find((manifest) => manifest.card !== null);
8292
- if (found === void 0) return [{
8293
- id: "empty",
8294
- label: "列表空(都卸了/都关了)",
8295
- units: [],
8296
- capabilities: {},
8297
- expect: { rows: 0 }
8298
- }, PLUGIN_MOCK];
8299
- const titleKey = found.card?.titleKey ?? found.id;
8300
- const id = found.id;
8301
- const on = row$1(id, titleKey, true);
8302
- const off = row$1(id, titleKey, false);
8303
- const twin = row$1(`${id}-b`, titleKey, true);
8304
- const third = row$1(`${id}-c`, titleKey, false);
8305
- return [
8306
- {
8307
- id: "one",
8308
- label: "一行:已启用、装好了",
8309
- units: [on],
8310
- capabilities: probe(id, "ok"),
8311
- expect: {
8312
- rows: 1,
8313
- badge: null,
8314
- on: true
8315
- }
8316
- },
8317
- {
8318
- id: "off",
8319
- label: "已停用(开关关着)",
8320
- units: [off],
8321
- capabilities: probe(id, "ok"),
8322
- expect: {
8323
- rows: 1,
8324
- badge: null,
8325
- on: false
8326
- }
8327
- },
8328
- {
8329
- id: "missing",
8330
- label: "⚠ 没装好 → 不列(去市场装)",
8331
- units: [on],
8332
- capabilities: probe(id, "missing-plugin"),
8333
- expect: { rows: 0 }
8334
- },
8335
- {
8336
- id: "outdated",
8337
- label: "⚠ 缺命令(也没装好)→ 同样不列",
8338
- units: [on],
8339
- capabilities: probe(id, "missing-commands"),
8340
- expect: { rows: 0 }
8341
- },
8342
- {
8343
- id: "unchecked",
8344
- label: "⚠ 检测不了",
8345
- units: [on],
8346
- capabilities: probe(id, "unchecked"),
8347
- expect: {
8348
- rows: 1,
8349
- badge: "panels.dep.unchecked",
8350
- on: true
8351
- }
8352
- },
8353
- {
8354
- id: "checking",
8355
- label: "还没探到(没有徽标)",
8356
- units: [on],
8357
- capabilities: null,
8358
- expect: {
8359
- rows: 1,
8360
- badge: null,
8361
- on: true
8362
- }
8363
- },
8364
- {
8365
- id: "many",
8366
- label: "三行(顺序 / 停用混着)",
8367
- units: [
8368
- on,
8369
- twin,
8370
- third
8371
- ],
8372
- capabilities: {
8373
- ...probe(id, "ok"),
8374
- ...probe(`${id}-b`, "ok"),
8375
- ...probe(`${id}-c`, "ok")
8376
- },
8377
- expect: {
8378
- rows: 3,
8379
- badge: null,
8380
- on: true
8381
- }
8382
- },
8383
- {
8384
- id: "no-card",
8385
- label: "没看板的模块(只有基座命令那种):也列出来、带「无看板」标签,开关照常能用,只是不参与排序",
8386
- units: [on, noCardRow(`${id}-c`, `${titleKey}(无看板)`)],
8387
- capabilities: {
8388
- ...probe(id, "ok"),
8389
- ...probe(`${id}-c`, "ok")
8390
- },
8391
- expect: {
8392
- rows: 2,
8393
- badge: null,
8394
- on: true
8395
- }
8396
- },
8397
- {
8398
- id: "long",
8399
- label: "超长模块名",
8400
- units: [row$1(id, "一个名字特别特别长的模块用来验证省略号会不会把开关挤下去", true)],
8401
- capabilities: probe(id, "ok"),
8402
- expect: {
8403
- rows: 1,
8404
- badge: null
8405
- }
8406
- },
8407
- {
8408
- id: "hidden",
8409
- label: "卸载后不显示(未启用 + 没装)",
8410
- units: [off],
8411
- capabilities: probe(id, "missing-plugin"),
8412
- expect: { rows: 0 }
8413
- },
8414
- {
8415
- id: "busy",
8416
- label: "正在改配置(开关禁用)",
8417
- units: [on, twin],
8418
- capabilities: {
8419
- ...probe(id, "ok"),
8420
- ...probe(`${id}-b`, "ok")
8421
- },
8422
- busy: true,
8423
- expect: { rows: 2 }
8424
- },
8425
- {
8426
- id: "failed",
8427
- label: "改配置失败(红字)",
8428
- units: [on],
8429
- capabilities: probe(id, "ok"),
8430
- failed: true,
8431
- expect: { rows: 1 }
8432
- },
8433
- {
8434
- id: "drag",
8435
- label: "拖动中的落点提示",
8436
- units: [
8437
- on,
8438
- twin,
8439
- third
8440
- ],
8441
- capabilities: {
8442
- ...probe(id, "ok"),
8443
- ...probe(`${id}-b`, "ok"),
8444
- ...probe(`${id}-c`, "ok")
8445
- },
8446
- drag: {
8447
- from: 1,
8448
- over: 0,
8449
- at: {
8450
- x: 1230,
8451
- y: 300
8452
- }
8453
- },
8454
- expect: {
8455
- rows: 3,
8456
- on: true
8457
- }
8458
- },
8459
- {
8460
- id: "drag-off",
8461
- label: "拖到未开启的那一行上:落点不亮(松手也不动)",
8462
- units: [
8463
- on,
8464
- twin,
8465
- third
8466
- ],
8467
- capabilities: {
8468
- ...probe(id, "ok"),
8469
- ...probe(`${id}-b`, "ok"),
8470
- ...probe(`${id}-c`, "ok")
8471
- },
8472
- drag: {
8473
- from: 0,
8474
- over: null,
8475
- at: {
8476
- x: 1230,
8477
- y: 300
8478
- }
8479
- },
8480
- expect: {
8481
- rows: 3,
8482
- on: true
8483
- }
8484
- },
8485
- PLUGIN_MOCK
8486
- ];
8487
- }
8488
- //#endregion
8489
7123
  //#region src/app/layouts/rightbar/board-selection.ts
8490
7124
  function available(capability) {
8491
7125
  if (capability === void 0) return true;
@@ -8861,13 +7495,9 @@ function PanelModules({ t, open, onOpenChange, enabledUnits, workspace, refreshT
8861
7495
  forceProbe
8862
7496
  ]);
8863
7497
  const root = useRef(null);
8864
- const panelMocks = useMemo(() => buildPanelMocks(fixtureRoster(manifests)), [manifests]);
8865
- const fixturePick = useFixturePick({
8866
- fixtures: panelMocks,
8867
- initial: panelMocks[0]?.id ?? null
8868
- });
8869
- const panelMock = fixturePick.enabled ? fixturePick.current : void 0;
8870
- const mockNonce = fixturePick.nonce;
7498
+ const devPanel = devSurface.useStrips("panel", manifests);
7499
+ const panelMock = devPanel.current;
7500
+ const mockNonce = devPanel.pick.nonce;
8871
7501
  (0, _deepseek_ai_dsh_client_ui_primitives.useDismissOnOutsidePointer)(root, open, (next) => dismissPanelByPointer(next, document, onOpenChange));
8872
7502
  const units = enabledUnits?.units ?? [];
8873
7503
  return /* @__PURE__ */ h("div", {
@@ -8886,20 +7516,16 @@ function PanelModules({ t, open, onOpenChange, enabledUnits, workspace, refreshT
8886
7516
  className: ModulesPage_module_default.pop,
8887
7517
  role: "dialog",
8888
7518
  "aria-label": t("panels.title")
8889
- }, /* @__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, {
8890
- mocks: panelMocks,
8891
- index: fixturePick.index,
8892
- onPick: (at) => fixturePick.pick(panelMocks[at]?.id ?? null)
8893
- }) : null, /* @__PURE__ */ h(ModulesPage, {
7519
+ }, /* @__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, {
8894
7520
  key: `${panelMock?.id ?? "real-modules"}-${mockNonce}`,
8895
7521
  t,
8896
7522
  units: panelMock?.units ?? units,
8897
7523
  plugins: panelMock?.plugins ?? enabledUnits?.plugins ?? [],
8898
- capabilities: panelMock === void 0 ? fixturePick.enabled ? null : capabilities : panelMock.capabilities,
7524
+ capabilities: panelMock === void 0 ? devPanel.enabled ? null : capabilities : panelMock.capabilities,
8899
7525
  loading: enabledUnits === null,
8900
7526
  own: enabledUnits?.own === true,
8901
7527
  onOpenMarket,
8902
- mocked: fixturePick.enabled,
7528
+ mocked: devPanel.enabled,
8903
7529
  workspace,
8904
7530
  mock: panelMock
8905
7531
  })) : null);
@@ -8920,106 +7546,6 @@ function boardColumnsOf(items, twoColumns) {
8920
7546
  return splitBoardColumns(items);
8921
7547
  }
8922
7548
  //#endregion
8923
- //#region src/app/layouts/rightbar/board-mock.ts
8924
- var REAL = {
8925
- id: "real",
8926
- label: "真实",
8927
- note: "不接管:宿主配置里开着什么就摆什么。",
8928
- shape: { kind: "real" }
8929
- };
8930
- var EMPTY = {
8931
- id: "empty",
8932
- label: "空看板",
8933
- note: "一个模块都没开:内容区那条空态与它的两条出路。",
8934
- shape: { kind: "empty" },
8935
- expect: {
8936
- cards: 0,
8937
- empty: true
8938
- }
8939
- };
8940
- var UNREAD = {
8941
- id: "unread",
8942
- label: "配置还没读到",
8943
- note: "还没读到配置:内容区说一句\"正在读取面板配置…\",头部 ⟳ 留着(按一下立刻重读)。",
8944
- shape: { kind: "unread" },
8945
- expect: {
8946
- cards: 0,
8947
- empty: false
8948
- }
8949
- };
8950
- function buildBoardMocks(roster) {
8951
- return [
8952
- REAL,
8953
- ...!roster.some((manifest) => manifest.card !== null) ? [] : [
8954
- {
8955
- id: "one",
8956
- label: "一张卡",
8957
- note: "常态:面板上只有一个模块时的样子。",
8958
- shape: {
8959
- kind: "copies",
8960
- count: 1
8961
- },
8962
- expect: {
8963
- cards: 1,
8964
- empty: false
8965
- }
8966
- },
8967
- {
8968
- id: "two",
8969
- label: "两张卡",
8970
- note: "同一个模块摆两份 —— 量卡片之间的间距与分界(卡片夹具条已收起)。",
8971
- shape: {
8972
- kind: "copies",
8973
- count: 2
8974
- },
8975
- expect: {
8976
- cards: 2,
8977
- empty: false
8978
- }
8979
- },
8980
- {
8981
- id: "many",
8982
- label: "八张卡(要滚)",
8983
- note: "同一个模块摆八份 —— 量滚动、滚动条与底部留白(卡片夹具条已收起)。",
8984
- shape: {
8985
- kind: "copies",
8986
- count: 8
8987
- },
8988
- expect: {
8989
- cards: 8,
8990
- empty: false
8991
- }
8992
- },
8993
- {
8994
- id: "crash",
8995
- label: "坏卡 + 好卡",
8996
- note: "一张渲染必炸的卡 + 你装的模块(配 ?wbCrash=1 才摆得出来):要看到坏的那张只剩一句\"这个模块起不来\",别的卡与面板壳都还在。",
8997
- shape: { kind: "all" },
8998
- expect: {
8999
- cards: 1,
9000
- empty: false
9001
- }
9002
- }
9003
- ],
9004
- EMPTY,
9005
- UNREAD
9006
- ];
9007
- }
9008
- var REAL_SHAPE = { kind: "real" };
9009
- function useBoardMock(roster) {
9010
- const [on] = useState(() => mockModeOn(window.location.search));
9011
- const mocks = useMemo(() => on ? buildBoardMocks(roster) : [], [on, roster]);
9012
- const [index, setIndex] = useState(0);
9013
- const mock = mocks[index];
9014
- return {
9015
- mock,
9016
- mocks,
9017
- index,
9018
- pick: setIndex,
9019
- shape: mock?.shape ?? REAL_SHAPE
9020
- };
9021
- }
9022
- //#endregion
9023
7549
  //#region src/app/layouts/rightbar/board-plan.ts
9024
7550
  function planBoard(shape, real, all) {
9025
7551
  if (shape.kind === "real") return {
@@ -9043,6 +7569,18 @@ function planBoard(shape, real, all) {
9043
7569
  reading: true,
9044
7570
  repeated: false
9045
7571
  };
7572
+ if (shape.kind === "kit") {
7573
+ const kit = devSurface.kitModule;
7574
+ return {
7575
+ modules: kit === null ? [] : [{
7576
+ key: kit.id,
7577
+ module: kit
7578
+ }],
7579
+ empty: false,
7580
+ reading: false,
7581
+ repeated: false
7582
+ };
7583
+ }
9046
7584
  if (shape.kind === "all") return {
9047
7585
  modules: all.map((module) => ({
9048
7586
  key: module.id,
@@ -9150,8 +7688,10 @@ function BoardContent({ top, plan, world, board, twoColumns, panelToken, onPanel
9150
7688
  title: t("panels.unknownStep")
9151
7689
  });
9152
7690
  const key = `${owner.id}:${top.kind}`;
9153
- return /* @__PURE__ */ h(CardBoundary, {
7691
+ return /* @__PURE__ */ h(CardAnchor, {
9154
7692
  key,
7693
+ unit: owner.id
7694
+ }, /* @__PURE__ */ h(CardBoundary, {
9155
7695
  unit: owner.id,
9156
7696
  resetKey: `${key}:${panelToken}:${workspacePathOf(world)}`,
9157
7697
  t,
@@ -9166,7 +7706,7 @@ function BoardContent({ top, plan, world, board, twoColumns, panelToken, onPanel
9166
7706
  onOpenMarket,
9167
7707
  onSummary,
9168
7708
  t
9169
- }));
7709
+ })));
9170
7710
  }
9171
7711
  const columns = boardColumnsOf(plan.modules, twoColumns);
9172
7712
  const split = columns.length > 1;
@@ -9184,8 +7724,10 @@ function BoardContent({ top, plan, world, board, twoColumns, panelToken, onPanel
9184
7724
  }, columns.map((column, index) => /* @__PURE__ */ h("div", {
9185
7725
  className: Rightbar_module_default.column,
9186
7726
  key: index === 0 ? "left" : "right"
9187
- }, column.map(({ key, module }) => /* @__PURE__ */ h(CardBoundary, {
7727
+ }, column.map(({ key, module }) => /* @__PURE__ */ h(CardAnchor, {
9188
7728
  key,
7729
+ unit: module.id
7730
+ }, /* @__PURE__ */ h(CardBoundary, {
9189
7731
  unit: module.id,
9190
7732
  resetKey: `${key}:${panelToken}:${workspacePathOf(world)}`,
9191
7733
  t,
@@ -9199,7 +7741,7 @@ function BoardContent({ top, plan, world, board, twoColumns, panelToken, onPanel
9199
7741
  onOpenMarket,
9200
7742
  onSummary,
9201
7743
  t
9202
- })))))));
7744
+ }))))))));
9203
7745
  }
9204
7746
  function Rightbar(props) {
9205
7747
  const units = props.units;
@@ -9218,12 +7760,16 @@ function Rightbar(props) {
9218
7760
  const panelBoard = useEnabledUnits(panelToken, boardWorkspace);
9219
7761
  const enabledUnits = panelBoard?.units ?? null;
9220
7762
  const [modulesOpen, setModulesOpen] = useState(false);
9221
- const fixtures = useBoardMock(fixtureRoster(manifests));
7763
+ const devBoard = devSurface.useBoard({
7764
+ manifests,
7765
+ all: modules.all(),
7766
+ search: window.location.search
7767
+ });
9222
7768
  const visibleModules = selectBoardModules(enabledUnits, (id) => modules.byId(id), capabilities);
9223
- const plan = planBoard(fixtures.shape, {
7769
+ const plan = planBoard(devBoard.shape, {
9224
7770
  modules: visibleModules,
9225
7771
  configRead: panelBoard !== null
9226
- }, fixtureSeed(manifests, modules.all(), crashModeOn(window.location.search)));
7772
+ }, devBoard.seed);
9227
7773
  const world = createSuiteWorld({
9228
7774
  workspaces,
9229
7775
  sessions,
@@ -9245,7 +7791,7 @@ function Rightbar(props) {
9245
7791
  reason
9246
7792
  });
9247
7793
  }, []);
9248
- const fixtureMode = mockModeOn(window.location.search) || crashModeOn(window.location.search);
7794
+ const fixtureMode = devBoard.mode;
9249
7795
  useEffect(() => {
9250
7796
  setPanelWorkspace(fixtureMode ? null : boardWorkspace);
9251
7797
  }, [boardWorkspace, fixtureMode]);
@@ -9299,10 +7845,7 @@ function Rightbar(props) {
9299
7845
  refreshToken: panelToken,
9300
7846
  onOpenMarket: openMarket,
9301
7847
  onCollapse: props.toggleRightbar
9302
- }), /* @__PURE__ */ h(BoardMockStrip, {
9303
- fixtures,
9304
- show: top.kind === "board"
9305
- }), /* @__PURE__ */ h("div", { className: `wb-panelBody${plan.repeated ? " wb-fixtureMany" : ""}` }, /* @__PURE__ */ h(BoardContent, {
7848
+ }), devBoard.strip(top.kind === "board"), /* @__PURE__ */ h("div", { className: `wb-panelBody${plan.repeated ? " wb-panelMany" : ""}` }, /* @__PURE__ */ h(BoardContent, {
9306
7849
  top,
9307
7850
  plan,
9308
7851
  world,
@@ -9449,6 +7992,10 @@ function blankSessionIdOf(workspace, sessions, archivedIds) {
9449
7992
  }
9450
7993
  function openNewSession(input) {
9451
7994
  if (input.workspace === null) return;
7995
+ if (isWorkshopPath(input.workspace.path)) {
7996
+ input.startSession(input.workspace.workspaceId);
7997
+ return;
7998
+ }
9452
7999
  const blank = blankSessionIdOf(input.workspace, input.sessions, input.archivedIds);
9453
8000
  if (blank === null) input.startSession(input.workspace.workspaceId);
9454
8001
  else input.openSession(blank);
@@ -9490,23 +8037,16 @@ function PanelRow({ id, label, active, wide, onSelect, fallbackGlyph, renderEntr
9490
8037
  }, t(hint.labelKey))));
9491
8038
  }
9492
8039
  var ProjectSwitcher_module_default = {
9493
- root: "_root_1vd78_1",
9494
- anchor: "_anchor_1vd78_7",
9495
- menu: "_menu_1vd78_12",
9496
- trigger: "_trigger_1vd78_17",
9497
- glyph: "_glyph_1vd78_44",
9498
- glyphActive: "_glyphActive_1vd78_54",
9499
- triggerName: "_triggerName_1vd78_58",
9500
- dir: "_dir_1vd78_69",
9501
- name: "_name_1vd78_77",
9502
- chevron: "_chevron_1vd78_90",
9503
- row: "_row_1vd78_96",
9504
- trailing: "_trailing_1vd78_104",
9505
- rowAction: "_rowAction_1vd78_114",
9506
- current: "_current_1vd78_127",
9507
- field: "_field_1vd78_134",
9508
- searchIcon: "_searchIcon_1vd78_151",
9509
- search: "_search_1vd78_151"
8040
+ root: "_root_1ubj2_1",
8041
+ glyph: "_glyph_1ubj2_7",
8042
+ glyphActive: "_glyphActive_1ubj2_17",
8043
+ triggerName: "_triggerName_1ubj2_21",
8044
+ dir: "_dir_1ubj2_32",
8045
+ name: "_name_1ubj2_40",
8046
+ row: "_row_1ubj2_53",
8047
+ trailing: "_trailing_1ubj2_61",
8048
+ rowAction: "_rowAction_1ubj2_71",
8049
+ current: "_current_1ubj2_84"
9510
8050
  };
9511
8051
  var WorkspaceRenameDialog_module_default = {
9512
8052
  dialog: "_dialog_1vye5_1",
@@ -9606,38 +8146,6 @@ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
9606
8146
  }, `${draft.trim().length}/20`)), failed ? /* @__PURE__ */ h(Note, { tone: "problem" }, t("project.rename.failed")) : null));
9607
8147
  }
9608
8148
  //#endregion
9609
- //#region src/app/layouts/sidebar/WorkspaceSearchField.tsx
9610
- function WorkspaceSearchField({ t, query, onQuery, onCursor, onSubmit }) {
9611
- const boxRef = useRef(null);
9612
- useEffect(() => {
9613
- boxRef.current?.querySelector("input")?.focus();
9614
- }, []);
9615
- return /* @__PURE__ */ h("span", {
9616
- ref: boxRef,
9617
- className: ProjectSwitcher_module_default.field
9618
- }, /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.searchIcon }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconSearchOutlineRegular, { size: 14 })), /* @__PURE__ */ h(TextField, {
9619
- className: ProjectSwitcher_module_default.search,
9620
- id: "wb-workspace-search",
9621
- name: "wb-workspace-search",
9622
- "aria-label": t("project.search.label"),
9623
- placeholder: t("project.search.placeholder"),
9624
- value: query,
9625
- onChange: (event) => onQuery(event.currentTarget.value),
9626
- onKeyDown: (event) => {
9627
- if (event.nativeEvent.isComposing) return;
9628
- if (event.key === "ArrowDown" || event.key === "ArrowUp") {
9629
- event.stopPropagation();
9630
- event.preventDefault();
9631
- onCursor(event.key === "ArrowDown" ? 1 : -1);
9632
- return;
9633
- }
9634
- if (event.key !== "Enter") return;
9635
- event.stopPropagation();
9636
- onSubmit();
9637
- }
9638
- }));
9639
- }
9640
- //#endregion
9641
8149
  //#region src/app/layouts/sidebar/workspace-groups.ts
9642
8150
  function workspaceSections(items, headings) {
9643
8151
  const workspaces = [];
@@ -9665,9 +8173,6 @@ function workspaceSections(items, headings) {
9665
8173
  });
9666
8174
  return sections;
9667
8175
  }
9668
- function flattenSections(sections) {
9669
- return sections.flatMap((section) => section.items);
9670
- }
9671
8176
  //#endregion
9672
8177
  //#region src/app/layouts/sidebar/WorkspaceRowAction.tsx
9673
8178
  function WorkspaceRowAction({ workspace, t, onEdit }) {
@@ -9715,10 +8220,11 @@ function WorkspaceRowLabel({ workspace, current, action, onHover }) {
9715
8220
  }
9716
8221
  //#endregion
9717
8222
  //#region src/app/layouts/sidebar/workspace-items.tsx
9718
- function workspaceMenuItems(options) {
8223
+ function workspaceOptions(options) {
9719
8224
  const { sections, currentId, hoverId, t, onHover, onEdit } = options;
9720
- const rowOf = (workspace) => ({
9721
- id: workspace.workspaceId,
8225
+ const rowOf = (workspace, group) => ({
8226
+ value: workspace.workspaceId,
8227
+ group,
9722
8228
  icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconFolderOpenRegular, { size: 16 }),
9723
8229
  label: /* @__PURE__ */ h(WorkspaceRowLabel, {
9724
8230
  workspace,
@@ -9731,118 +8237,69 @@ function workspaceMenuItems(options) {
9731
8237
  }) : void 0
9732
8238
  })
9733
8239
  });
9734
- return sections.flatMap((section) => [...section.heading === null ? [] : [{
9735
- type: "label",
9736
- id: section.id,
9737
- text: section.heading
9738
- }], ...section.items.map(rowOf)]);
8240
+ return sections.flatMap((section) => section.items.map((workspace) => rowOf(workspace, section.heading ?? void 0)));
9739
8241
  }
9740
8242
  //#endregion
9741
8243
  //#region src/app/layouts/sidebar/ProjectSwitcher.tsx
9742
- var ADD_WORKSPACE_ID = "__wb-add-workspace__";
9743
- function triggerName(current, t) {
9744
- if (current === null) return t("project.none");
9745
- const { dir, name } = displayNameOf(current);
9746
- 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));
9747
- }
9748
8244
  function ProjectSwitcher({ items, current, onPick, onAdd, onRename, t }) {
9749
8245
  const [open, setOpen] = useState(false);
9750
- const [query, setQuery] = useState("");
9751
- const [cursor, setCursor] = useState(null);
9752
8246
  const [hoverId, setHoverId] = useState(null);
9753
8247
  const [naming, setNaming] = useState(null);
9754
- const triggerRef = useRef(null);
9755
- const wasOpenRef = useRef(false);
9756
- const currentId = current?.workspaceId ?? null;
9757
- const results = useMemo(() => matchWorkspaces(items, query), [items, query]);
9758
- const sections = useMemo(() => workspaceSections(results, {
8248
+ const currentId = current?.workspaceId ?? "";
8249
+ const byId = useMemo(() => new Map(items.map((workspace) => [workspace.workspaceId, workspace])), [items]);
8250
+ const sections = useMemo(() => workspaceSections(items, {
9759
8251
  workspaces: t("project.group.workspaces"),
9760
8252
  defaultWorkspace: t("project.group.defaultWorkspace"),
9761
8253
  workshop: t("project.group.workshop")
9762
- }), [results, t]);
9763
- const ordered = useMemo(() => flattenSections(sections), [sections]);
9764
- const cursorId = cursor === null || ordered.length === 0 ? null : ordered[Math.min(cursor, ordered.length - 1)]?.workspaceId ?? null;
9765
- useEffect(() => {
9766
- if (open) {
9767
- wasOpenRef.current = true;
9768
- return;
9769
- }
9770
- setQuery("");
9771
- setCursor(null);
9772
- setHoverId(null);
9773
- if (wasOpenRef.current && naming === null) {
9774
- wasOpenRef.current = false;
9775
- triggerRef.current?.focus();
9776
- }
9777
- }, [open, naming]);
9778
- const close = () => setOpen(false);
9779
- const anchor = open ? /* @__PURE__ */ h(WorkspaceSearchField, {
8254
+ }), [items, t]);
8255
+ const options = useMemo(() => workspaceOptions({
8256
+ sections,
8257
+ currentId,
8258
+ hoverId,
9780
8259
  t,
9781
- query,
9782
- onQuery: (next) => {
9783
- setQuery(next);
9784
- setCursor(null);
9785
- },
9786
- onCursor: (step) => {
9787
- if (ordered.length === 0) return;
9788
- setCursor((at) => at === null ? step === 1 ? 0 : ordered.length - 1 : (at + step + ordered.length) % ordered.length);
9789
- },
9790
- onSubmit: () => {
9791
- const pick = ordered[Math.min(cursor ?? 0, ordered.length - 1)];
9792
- if (pick === void 0) return;
9793
- close();
9794
- onPick(pick.workspaceId);
8260
+ onHover: setHoverId,
8261
+ onEdit: (workspace) => {
8262
+ setOpen(false);
8263
+ setNaming(workspace);
9795
8264
  }
9796
- }) : /* @__PURE__ */ h("button", {
9797
- type: "button",
9798
- ref: triggerRef,
9799
- className: ProjectSwitcher_module_default.trigger,
9800
- "aria-haspopup": "listbox",
9801
- "aria-expanded": open,
9802
- "aria-label": t("project.label"),
9803
- title: current?.path ?? void 0,
9804
- onClick: () => setOpen(true)
9805
- }, /* @__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 })));
9806
- return /* @__PURE__ */ h("div", { className: ProjectSwitcher_module_default.root }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Menu, {
8265
+ }), [
8266
+ sections,
8267
+ currentId,
8268
+ hoverId,
8269
+ t
8270
+ ]);
8271
+ const valueNodes = useMemo(() => {
8272
+ const out = /* @__PURE__ */ new Map();
8273
+ for (const workspace of items) {
8274
+ const { dir, name } = displayNameOf(workspace);
8275
+ 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)));
8276
+ }
8277
+ return out;
8278
+ }, [items]);
8279
+ return /* @__PURE__ */ h("div", { className: ProjectSwitcher_module_default.root }, /* @__PURE__ */ h(SelectField, {
8280
+ value: currentId,
8281
+ options,
8282
+ onChange: onPick,
9807
8283
  open,
9808
- portal: true,
9809
- className: ProjectSwitcher_module_default.anchor,
9810
- listClassName: ProjectSwitcher_module_default.menu,
9811
- anchor,
9812
- align: "start",
9813
- side: "bottom",
9814
- selection: "fill",
9815
- selectedId: cursorId ?? void 0,
9816
- items: [...results.length === 0 ? [{
9817
- type: "label",
9818
- id: "empty",
9819
- text: t("project.search.empty", { query: query.trim() })
9820
- }] : [], ...workspaceMenuItems({
9821
- sections,
9822
- currentId,
9823
- hoverId,
9824
- t,
9825
- onHover: setHoverId,
9826
- onEdit: (workspace) => {
9827
- close();
9828
- setNaming(workspace);
9829
- }
9830
- })],
9831
- footer: [{
9832
- id: ADD_WORKSPACE_ID,
8284
+ onOpenChange: setOpen,
8285
+ 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 })),
8286
+ renderValue: (option) => option === void 0 ? t("project.none") : valueNodes.get(option.value) ?? option.label,
8287
+ placeholder: t("project.none"),
8288
+ variant: "ghost",
8289
+ ariaLabel: t("project.label"),
8290
+ title: current?.path ?? void 0,
8291
+ searchLabel: t("project.search.label"),
8292
+ searchPlaceholder: t("project.search.placeholder"),
8293
+ emptyText: (query) => t("project.search.empty", { query: query.trim() }),
8294
+ filter: (option, query) => {
8295
+ const workspace = byId.get(option.value);
8296
+ return workspace !== void 0 && matchWorkspaces([workspace], query).length > 0;
8297
+ },
8298
+ footer: {
9833
8299
  label: t("project.add"),
9834
8300
  icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutlineRegular, { size: 14 })
9835
- }],
9836
- onSelect: (id) => {
9837
- if (id === ADD_WORKSPACE_ID) {
9838
- close();
9839
- onAdd();
9840
- return;
9841
- }
9842
- close();
9843
- onPick(id);
9844
8301
  },
9845
- onClose: close
8302
+ onFooter: onAdd
9846
8303
  }), naming === null ? null : /* @__PURE__ */ h(WorkspaceRenameDialog, {
9847
8304
  key: naming.workspaceId,
9848
8305
  workspace: naming,
@@ -10171,28 +8628,28 @@ function Sidebar(props) {
10171
8628
  }
10172
8629
  //#endregion
10173
8630
  //#region src/shared/styles/rightbar.css?raw
10174
- 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";
8631
+ 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";
10175
8632
  //#endregion
10176
8633
  //#region src/shared/styles/tokens.css?raw
10177
- 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";
8634
+ 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";
10178
8635
  //#endregion
10179
8636
  //#region src/shared/styles/tokens/palette.css?raw
10180
- 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";
8637
+ 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";
10181
8638
  //#endregion
10182
8639
  //#region src/shared/styles/tokens/scale.css?raw
10183
- 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";
8640
+ 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";
10184
8641
  //#endregion
10185
8642
  //#region src/shared/styles/sidebar-app.css?raw
10186
- 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}";
8643
+ 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}";
10187
8644
  //#endregion
10188
8645
  //#region src/shared/styles/sidebar.css?raw
10189
- 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";
8646
+ 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";
10190
8647
  //#endregion
10191
8648
  //#region src/shared/styles/chrome.css?raw
10192
- 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 }}";
8649
+ 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 }}";
10193
8650
  //#endregion
10194
8651
  //#region src/shared/styles/board.css?raw
10195
- 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";
8652
+ 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";
10196
8653
  //#endregion
10197
8654
  //#region src/shared/styles/motion.css?raw
10198
8655
  var motion_default = "[data-animating],\n[data-sidebar-right-panel] {\n --ds-transition-duration-slow: 0s;\n}\n";
@@ -10409,11 +8866,9 @@ var kit = {
10409
8866
  hooks: {
10410
8867
  ...use_api_resource_exports,
10411
8868
  ...use_card_summary_exports,
10412
- ...use_fixture_pick_exports,
10413
8869
  ...use_facts_exports,
10414
8870
  ...use_host_write_exports,
10415
8871
  ...use_long_task_exports,
10416
- ...mock_mode_exports,
10417
8872
  ...use_capability_gate_exports,
10418
8873
  ...use_unit_board_exports,
10419
8874
  ...use_visible_busy_exports
@@ -10428,7 +8883,6 @@ var kit = {
10428
8883
  ...dist_exports,
10429
8884
  ...dist_exports,
10430
8885
  ...dist_exports,
10431
- ...dist_exports,
10432
8886
  Tip
10433
8887
  },
10434
8888
  api: {
@@ -10446,7 +8900,7 @@ function messagesOf(units) {
10446
8900
  ...face.messages === void 0 ? {} : { messages: face.messages }
10447
8901
  }));
10448
8902
  }
10449
- 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*/";
8903
+ 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*/";
10450
8904
  function workbenchCss() {
10451
8905
  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}`;
10452
8906
  }
@@ -10517,34 +8971,10 @@ function mount(ctx) {
10517
8971
  };
10518
8972
  }, "dsh-workbench: dictionaries");
10519
8973
  const workshopWorkspace = () => ctx.workspaces.list.getSnapshot().items.find((item) => isWorkshopPath(item.path));
10520
- const openDiySession = (workspaceId, fallback) => {
10521
- const remoteCreate = sessionCreateOf(ctx.remote);
10522
- try {
10523
- if (remoteCreate === void 0) throw new Error("session 那一组拿不到");
10524
- remoteCreate({
10525
- workspaceId,
10526
- agentPreset: DIY_PRESET_ID
10527
- }).then((created) => {
10528
- const id = created.sessionId;
10529
- if (id === void 0) throw new Error("没有 sessionId");
10530
- ctx.uiWorkspace.openSession(id);
10531
- }).catch((error) => {
10532
- console.warn(`[dsh-workbench] 落 DIY 模式失败,仍切工作区 —— ${String(error)}`);
10533
- fallback();
10534
- });
10535
- } catch (error) {
10536
- console.warn(`[dsh-workbench] ctx.remote 拿不到 —— ${String(error)}`);
10537
- fallback();
10538
- }
10539
- };
10540
8974
  const startSessionIn = (workspaceId) => {
10541
- const fallback = () => ctx.uiWorkspace.startSession(workspaceId);
10542
- const workshop = workshopWorkspace();
10543
- if (workshop === void 0 || workshop.workspaceId !== workspaceId) {
10544
- fallback();
10545
- return;
10546
- }
10547
- openDiySession(workspaceId, fallback);
8975
+ const options = diyStartOptions(workspaceId, workshopWorkspace()?.workspaceId);
8976
+ if (options === void 0) ctx.uiWorkspace.startSession(workspaceId);
8977
+ else ctx.uiWorkspace.startSession(workspaceId, options);
10548
8978
  };
10549
8979
  const buildModule = () => {
10550
8980
  const workshop = workshopWorkspace();
@@ -10553,9 +8983,7 @@ function mount(ctx) {
10553
8983
  return;
10554
8984
  }
10555
8985
  selectProject(workshop.workspaceId);
10556
- openDiySession(workshop.workspaceId, () => {
10557
- ctx.uiWorkspace.startSession(workshop.workspaceId);
10558
- });
8986
+ startSessionIn(workshop.workspaceId);
10559
8987
  };
10560
8988
  const rightbarActions = {
10561
8989
  openMarket: () => ctx.layout.selectPanel(MARKET_PANEL_ID),
@@ -10752,10 +9180,6 @@ function sidebarChildren(ctx) {
10752
9180
  function menuOpenStateFactory(_standard, state) {
10753
9181
  return () => state;
10754
9182
  }
10755
- function sessionCreateOf(remote) {
10756
- const namespaces = remote?.namespaces;
10757
- return namespaces?.get?.("session")?.service?.create?.bind(namespaces.get("session")?.service);
10758
- }
10759
9183
  //#endregion
10760
9184
  exports.apply = apply;
10761
9185
  exports.inject = inject;