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