@dsh-workbench/core 0.1.17 → 0.2.0

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 (64) hide show
  1. package/client.js +1026 -554
  2. package/dist/board.css +31 -0
  3. package/dist/client/client.body.js +1026 -554
  4. package/dist/client/index.js +1027 -555
  5. package/dist/host/index.js +1175 -146
  6. package/dist/types/app/client.d.ts +111 -69
  7. package/dist/types/app/layouts/market/__tests__/add-module-stages.test.d.ts +1 -0
  8. package/dist/types/app/layouts/market/add-module-text.d.ts +16 -1
  9. package/dist/types/app/layouts/market/use-add-module.d.ts +2 -8
  10. package/dist/types/app/layouts/market/use-module-versions.d.ts +2 -1
  11. package/dist/types/app/layouts/rightbar/MarketView.d.ts +5 -1
  12. package/dist/types/app/layouts/rightbar/ModulesPage.d.ts +4 -2
  13. package/dist/types/app/layouts/rightbar/PanelModules.d.ts +2 -2
  14. package/dist/types/app/layouts/rightbar/PanelPluginRows.d.ts +9 -0
  15. package/dist/types/app/layouts/rightbar/PanelRowControls.d.ts +14 -0
  16. package/dist/types/app/layouts/rightbar/__tests__/market-row-icon.test.d.ts +1 -0
  17. package/dist/types/app/layouts/rightbar/__tests__/market-section-icon.test.d.ts +1 -0
  18. package/dist/types/app/layouts/rightbar/__tests__/market-workbench.test.d.ts +1 -0
  19. package/dist/types/app/layouts/rightbar/__tests__/panel-plugin-rows.test.d.ts +1 -0
  20. package/dist/types/app/layouts/rightbar/__tests__/panel-scope-ui.test.d.ts +1 -0
  21. package/dist/types/app/layouts/rightbar/board-selection.d.ts +11 -0
  22. package/dist/types/app/layouts/rightbar/market-act.d.ts +21 -0
  23. package/dist/types/app/layouts/rightbar/market-freshness.d.ts +1 -0
  24. package/dist/types/app/layouts/rightbar/market-mock.d.ts +6 -1
  25. package/dist/types/app/layouts/rightbar/market-plugin-rows.d.ts +3 -1
  26. package/dist/types/app/layouts/rightbar/market-row-icon.d.ts +7 -0
  27. package/dist/types/app/layouts/rightbar/market-row-types.d.ts +35 -0
  28. package/dist/types/app/layouts/rightbar/market-rows.d.ts +8 -35
  29. package/dist/types/app/layouts/rightbar/market-section-icon.d.ts +3 -0
  30. package/dist/types/app/layouts/rightbar/market-section.d.ts +18 -0
  31. package/dist/types/app/layouts/rightbar/market-view-text.d.ts +7 -1
  32. package/dist/types/app/layouts/rightbar/market-workbench-row.d.ts +5 -0
  33. package/dist/types/app/layouts/rightbar/panel-mock.d.ts +2 -1
  34. package/dist/types/app/layouts/rightbar/use-panels.d.ts +15 -1
  35. package/dist/types/app/units/registry.d.ts +1 -1
  36. package/dist/types/modules/panels/__tests__/plugin-panel-market-parity.test.d.ts +1 -0
  37. package/dist/types/modules/panels/__tests__/plugin-panel.test.d.ts +1 -0
  38. package/dist/types/modules/panels/__tests__/plugin-tool-units.test.d.ts +1 -0
  39. package/dist/types/modules/panels/__tests__/scope-machine.test.d.ts +1 -0
  40. package/dist/types/modules/panels/__tests__/scope-support.d.ts +51 -0
  41. package/dist/types/modules/panels/model/config.d.ts +19 -0
  42. package/dist/types/modules/panels/model/market-dispatch.d.ts +4 -0
  43. package/dist/types/modules/panels/model/market-registry.d.ts +12 -0
  44. package/dist/types/modules/panels/model/market-registry.test.d.ts +1 -0
  45. package/dist/types/modules/panels/model/market-types.d.ts +1 -0
  46. package/dist/types/modules/panels/model/market.d.ts +3 -2
  47. package/dist/types/modules/panels/model/plugin-panel.d.ts +3 -0
  48. package/dist/types/modules/panels/model/prefs.d.ts +3 -1
  49. package/dist/types/modules/panels/model/service.d.ts +5 -1
  50. package/dist/types/shared/api/bundle-install.d.ts +15 -1
  51. package/dist/types/shared/api/host/__tests__/plugin-catalog.test.d.ts +1 -0
  52. package/dist/types/shared/api/host/__tests__/plugin-login-hint.test.d.ts +1 -0
  53. package/dist/types/shared/api/host/__tests__/plugin-tools.test.d.ts +1 -0
  54. package/dist/types/shared/api/host/bundle-inspect-kind.test.d.ts +1 -0
  55. package/dist/types/shared/api/host/bundle-routes-self.test.d.ts +1 -0
  56. package/dist/types/shared/api/host/installed-module.d.ts +10 -0
  57. package/dist/types/shared/api/host/plugin-catalog.d.ts +60 -0
  58. package/dist/types/shared/api/host/plugin-login-hint.d.ts +2 -0
  59. package/dist/types/shared/api/host/plugin-tools.d.ts +10 -0
  60. package/dist/types/shared/api/host/plugin-units.d.ts +47 -0
  61. package/dist/types/shared/api/host/unit-registry.d.ts +3 -0
  62. package/package.json +2 -2
  63. package/skills/workbench-module-diy/REVIEW.md +2 -2
  64. package/skills/workbench-module-diy/TOOLS.md +4 -1
@@ -1,4 +1,4 @@
1
- import { Button, CodeBlock, DisclosureRow, IconCheckCircleFillRegular, IconCheckOutlineRegular, IconChevronDownOutlineRegular, IconCodeOutlineRegular, IconEditOutlineRegular, IconEllipsisOutlineRegular, IconFlatListOutlineRegular, IconFolderCloseRegular, IconFolderOpenRegular, IconInfoOutlineRegular, IconNewChatOutlineRegular, IconPanelLeftOutlineRegular, IconPinOutlineRegular, 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, DisclosureRow, IconArchiveOutlineRegular, IconCheckCircleFillRegular, IconCheckOutlineRegular, IconChevronDownOutlineRegular, IconCodeOutlineRegular, IconCordisPluginOutlineRegular, IconDownloadOutlineRegular, IconEditOutlineRegular, IconEllipsisOutlineRegular, IconFlatListOutlineRegular, IconFolderCloseRegular, IconFolderOpenOutlineRegular, IconFolderOpenRegular, IconInfoOutlineRegular, IconLinkOutlineRegular, IconNewChatOutlineRegular, IconPanelLeftOutlineRegular, IconPinOutlineRegular, 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) => {
@@ -439,7 +439,12 @@ var DECLARATION_REQUIRED_KEYS = [
439
439
  "host"
440
440
  ];
441
441
  var CARD_KEYS = ["titleKey", "order"];
442
- var TOOL_KEYS = ["name", "writes"];
442
+ var TOOL_KEYS = [
443
+ "name",
444
+ "writes",
445
+ "key"
446
+ ];
447
+ var TOOL_KEY_SHAPE = /^[a-z][a-zA-Z0-9]*$/;
443
448
  var HOST_KEYS = ["inject", "optional"];
444
449
  function text(value) {
445
450
  return typeof value === "string" ? value.trim() : "";
@@ -481,6 +486,7 @@ function declarationProblemsOf(subject, raw) {
481
486
  if (!Array.isArray(tools)) problems.push(`${subject}: dsh.workbench.tools 要是一串声明,现在是 ${JSON.stringify(tools)}`);
482
487
  else {
483
488
  const seen = /* @__PURE__ */ new Set();
489
+ const seenKeys = /* @__PURE__ */ new Set();
484
490
  tools.forEach((tool, index) => {
485
491
  const at = `dsh.workbench.tools[${index}]`;
486
492
  if (!isRecord(tool)) {
@@ -494,6 +500,12 @@ function declarationProblemsOf(subject, raw) {
494
500
  else if (seen.has(name)) problems.push(`${subject}: ${at}.name「${name}」与前面那条撞了 —— 工具名会进 dsh 的工具表,不许重`);
495
501
  else seen.add(name);
496
502
  if (typeof tool.writes !== "boolean") problems.push(`${subject}: ${at}.writes 要是 true / false(它是"这会写"的唯一声明,缺了审批无从认领)`);
503
+ if (tool.key !== void 0) {
504
+ const key = text(tool.key);
505
+ if (!TOOL_KEY_SHAPE.test(key)) problems.push(`${subject}: ${at}.key 要是 lowerCamelCase 的标识符(如 \`sync\` / \`podLogs\`),现在是 ${JSON.stringify(tool.key)} —— 它会变成生成物里的键名,所以不引号、不许带点或横线`);
506
+ else if (seenKeys.has(key)) problems.push(`${subject}: ${at}.key「${key}」与前面那条撞了 —— 生成物里的键只能有一个`);
507
+ else seenKeys.add(key);
508
+ }
497
509
  });
498
510
  }
499
511
  }
@@ -1078,6 +1090,50 @@ function IconBrandMark({ size = 24 }) {
1078
1090
  strokeLinecap: "round"
1079
1091
  }));
1080
1092
  }
1093
+ function IconOpencli({ size = 16 }) {
1094
+ return h(Shell, {
1095
+ size,
1096
+ viewBox: "0 0 64 64"
1097
+ }, h("defs", null, h("linearGradient", {
1098
+ id: "opencli-mark",
1099
+ x1: "0%",
1100
+ y1: "0%",
1101
+ x2: "100%",
1102
+ y2: "100%"
1103
+ }, h("stop", {
1104
+ offset: "0%",
1105
+ stopColor: "#00e5a0"
1106
+ }), h("stop", {
1107
+ offset: "50%",
1108
+ stopColor: "#00b4d8"
1109
+ }), h("stop", {
1110
+ offset: "100%",
1111
+ stopColor: "#7b61ff"
1112
+ }))), h("rect", {
1113
+ width: 64,
1114
+ height: 64,
1115
+ rx: 14,
1116
+ fill: "#0a0a0f"
1117
+ }), h("text", {
1118
+ x: "50%",
1119
+ y: "54%",
1120
+ dominantBaseline: "middle",
1121
+ textAnchor: "middle",
1122
+ fontFamily: "monospace",
1123
+ fontWeight: 700,
1124
+ fontSize: 28,
1125
+ fill: "url(#opencli-mark)"
1126
+ }, ">_"));
1127
+ }
1128
+ function IconNpm({ size = 16 }) {
1129
+ return h(Shell, {
1130
+ size,
1131
+ viewBox: "0 0 1024 1024"
1132
+ }, h("path", {
1133
+ d: "M64 337.76h896v298.72H512v49.792H312.896v-49.824H64z m49.792 248.928h99.552v-149.376h49.76v149.344h49.792v-199.104H113.792z m248.896-199.136v248.928h99.552v-49.792h99.552v-199.136z m99.552 49.792H512v99.584h-49.792z m149.344-49.792v199.136h99.552v-149.376h49.792v149.344h49.792v-149.344h49.792v149.344h49.792v-199.104z",
1134
+ fill: "#CB3837"
1135
+ }));
1136
+ }
1081
1137
  function IconModules({ size = 16 }) {
1082
1138
  return h("svg", {
1083
1139
  width: size,
@@ -1200,7 +1256,12 @@ var en = {
1200
1256
  "time.hours": "{n} h ago",
1201
1257
  "time.days": "{n} d ago",
1202
1258
  "panels.title": "Panel modules",
1203
- "panels.reset": "Reset",
1259
+ "panels.market.defaultNote": "This default covers every workspace that has not changed this row; ones that have keep their own choice.",
1260
+ "panels.market.changedBy": "{count} workspaces have already changed this row",
1261
+ "panels.market.defaultLabel": "On by default in all workspaces",
1262
+ "panels.followGlobal": "Default",
1263
+ "panels.followGlobalHint": "This row follows the default board (the switch shows that state). Clicking the switch makes it this project's own choice.",
1264
+ "panels.followAll": "Restore the default everywhere",
1204
1265
  "panels.enabled": "enabled in this project",
1205
1266
  "panels.disabled": "not enabled in this project",
1206
1267
  "panels.choose": "Choose modules",
@@ -1219,17 +1280,17 @@ var en = {
1219
1280
  "panels.browseMarket": "Browse the module market",
1220
1281
  "panels.noneInstalled": "None of these modules has its plugin installed yet",
1221
1282
  "panels.noneInstalledHint": "Once installed they come back here, and you pick which go on the panel.",
1283
+ "panels.rowPlugin": "Plugin",
1222
1284
  "panels.market.installed": "installed",
1223
1285
  "panels.market.outdated": "needs update",
1224
1286
  "panels.market.hasNew": "New version",
1225
1287
  "panels.market.missing": "not installed",
1226
1288
  "panels.market.unchecked": "unknown",
1227
1289
  "panels.market.checking": "checking",
1228
- "panels.market.sectionInstalled": "Installed",
1290
+ "panels.market.sectionInstalled": "Installed modules",
1229
1291
  "panels.market.sectionPending": "Not installed",
1230
1292
  "panels.market.sectionShared": "Shared dependencies",
1231
- "panels.market.sharedUsedBy": "Used by {modules}",
1232
- "panels.market.sharedFoot": "These cannot be uninstalled here: they come with modules, and would be reinstalled anyway. To stop using one, turn off the modules that use it.",
1293
+ "panels.market.sharedUsedBy": "Used by module {modules}",
1233
1294
  "panels.market.listSeparator": ", ",
1234
1295
  "panels.market.sharedMissing": "not installed",
1235
1296
  "panels.market.sharedOutdated": "update available",
@@ -1254,21 +1315,20 @@ var en = {
1254
1315
  "panels.market.noSource": "This module declares no install method — install it yourself",
1255
1316
  "panels.market.badSource": "The install method is incomplete — install it yourself",
1256
1317
  "panels.market.empty": "No modules available",
1257
- "panels.market.installedSection": "Installed",
1258
- "panels.market.sectionLocal": "Linked locally",
1318
+ "panels.market.sectionLocal": "Local modules",
1259
1319
  "panels.market.sectionUnlisted": "Not from the market",
1260
1320
  "panels.market.sectionPlugins": "Installed opencli plugins",
1261
1321
  "panels.market.moduleOutdated": "update available",
1262
1322
  "panels.market.moduleRefused": "This module was built for an older version of the workbench, so it does not work here. Update it, or uninstall.",
1263
1323
  "panels.market.moduleRefusedDetail": "Why it cannot be used: {reason}",
1264
1324
  "panels.market.moduleRestartHint": "installed but not active — restart dsh once to bring it up",
1265
- "panels.market.pluginLocalNoUpdate": "Installed from a local folder, so there is nowhere to check for a newer version — uninstall only",
1325
+ "panels.market.workbenchName": "Workbench",
1326
+ "panels.market.workbenchLocal": "This is the copy from your working repository; it does not come from the registry.",
1266
1327
  "panels.market.pluginKeptInUse": "Files kept for now: {names} still uses it.",
1267
1328
  "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.",
1268
1329
  "panels.market.pluginKeptHeld": "Files kept: this one is yours, and a module letting go will not remove it.",
1269
1330
  "panels.market.pluginKeptUnnamed": "Files kept for now: this one cannot be identified as a plugin, so it is unclear who needs it.",
1270
- "panels.market.pluginAlsoKnownAs": "Its package is {pkg} (updates and uninstall use that)",
1271
- "panels.market.pluginBroken": "This install is broken: it cannot be identified as a plugin. Uninstall it, or install it again by package name above.",
1331
+ "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).",
1272
1332
  "panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
1273
1333
  "panels.market.foot": "After installing, enable it in the panel page of that project.",
1274
1334
  "panels.market.recheck": "Check for updates",
@@ -1277,7 +1337,7 @@ var en = {
1277
1337
  "panels.market.justNow": "just now",
1278
1338
  "panels.market.minutesAgo": "{n} min ago",
1279
1339
  "panels.market.hoursAgo": "{n} h ago",
1280
- "panels.market.add.description": "Enter a package name, a Git URL, or a path to a local directory.",
1340
+ "panels.market.add.description": "Enter a module or opencli plugin package name, Git repository URL, or local directory path.",
1281
1341
  "panels.market.add.specPlaceholder": "e.g. @dsh-workbench/module-hello",
1282
1342
  "panels.market.add.guideToggle": "Install guide and examples",
1283
1343
  "panels.market.add.guideHide": "Hide guide",
@@ -1316,11 +1376,13 @@ var en = {
1316
1376
  "panels.market.add.problemInstalled": "This module is already installed",
1317
1377
  "panels.market.add.problemNotFound": "No such module found",
1318
1378
  "panels.market.add.problemNotPackage": "That path does not exist or is not a valid module package",
1319
- "panels.market.add.problemNotBundle": "This package cannot be installed here: {reason}. If it is actually an opencli plugin, use its package name (for example opencli-plugin-cmdb) or a local folder — a git URL or tarball does not reveal what it is.",
1379
+ "panels.market.add.problemNotBundle": "This package cannot be installed here: {reason}. This entry recognises workbench modules and opencli plugins by package name, and installs either; but a git URL or a tarball does not reveal what it is — if it is really one of those two, use its package name or a local folder instead.",
1320
1380
  "panels.market.add.problemNotWorkbenchModule": "This package does not match the workbench you are running, so installing it would not work. Pick another version, or ask the module author.",
1321
1381
  "panels.market.add.problemNotModuleOrPlugin": "This package is neither a workbench module nor an opencli plugin, so installing it would do nothing. Pick another version, or ask the package author.",
1322
1382
  "panels.market.add.failureNotModuleOrPlugin": "This package is neither a workbench module nor an opencli plugin, so installing it would do nothing",
1323
1383
  "panels.market.add.installedPlugin": "Installed: the opencli plugin {name}",
1384
+ "panels.market.add.pluginPreview": "This is an opencli plugin: it goes into the opencli plugin area and works as soon as it is installed — no restart.",
1385
+ "panels.market.add.pluginAlias": "Plugin name: {name}",
1324
1386
  "panels.market.add.problemNetwork": "Cannot reach the module source; check the network and retry",
1325
1387
  "panels.market.add.problemUnknown": "Cannot fetch module information: {reason}",
1326
1388
  "panels.market.add.failureNetwork": "The network connection failed",
@@ -1531,7 +1593,12 @@ var zh = {
1531
1593
  "time.hours": "{n} 小时前",
1532
1594
  "time.days": "{n} 天前",
1533
1595
  "panels.title": "面板模块",
1534
- "panels.reset": "恢复默认",
1596
+ "panels.market.defaultNote": "这份默认给所有没在这一行改过的工作区;改过的保持自己的选择。",
1597
+ "panels.market.changedBy": "{count} 个工作区已在这一行改过",
1598
+ "panels.market.defaultLabel": "开启后所有工作区默认启用",
1599
+ "panels.followGlobal": "默认",
1600
+ "panels.followGlobalHint": "这一行跟着默认板走(右边那颗开关显示的就是默认的状态)。点一下开关 = 改成这个项目自己定。",
1601
+ "panels.followAll": "全部恢复默认",
1535
1602
  "panels.enabled": "这个项目已启用",
1536
1603
  "panels.disabled": "这个项目未启用",
1537
1604
  "panels.choose": "选择模块",
@@ -1550,17 +1617,17 @@ var zh = {
1550
1617
  "panels.browseMarket": "浏览模块市场",
1551
1618
  "panels.noneInstalled": "这些模块要的插件都还没装",
1552
1619
  "panels.noneInstalledHint": "装好之后它们会回到这里,再由你决定放哪几个上板。",
1620
+ "panels.rowPlugin": "插件",
1553
1621
  "panels.market.installed": "已安装",
1554
1622
  "panels.market.outdated": "要更新",
1555
1623
  "panels.market.hasNew": "有新版本",
1556
1624
  "panels.market.missing": "未装",
1557
1625
  "panels.market.unchecked": "状态未知",
1558
1626
  "panels.market.checking": "检测中",
1559
- "panels.market.sectionInstalled": "已安装",
1627
+ "panels.market.sectionInstalled": "已安装模块",
1560
1628
  "panels.market.sectionPending": "未安装",
1561
1629
  "panels.market.sectionShared": "共用依赖",
1562
- "panels.market.sharedUsedBy": "供 {modules} 使用",
1563
- "panels.market.sharedFoot": "这一段不给卸载:它们跟着模块来,卸掉也会被装回来。要停用一份,就去关掉正在用它的那些模块。",
1630
+ "panels.market.sharedUsedBy": "供 {modules} 模块使用",
1564
1631
  "panels.market.listSeparator": "、",
1565
1632
  "panels.market.sharedMissing": "未装",
1566
1633
  "panels.market.sharedOutdated": "有新版",
@@ -1585,21 +1652,20 @@ var zh = {
1585
1652
  "panels.market.noSource": "这个模块没声明怎么装,只能自己动手",
1586
1653
  "panels.market.badSource": "安装方式没写全,只能自己动手",
1587
1654
  "panels.market.empty": "暂无可用模块",
1588
- "panels.market.installedSection": "已安装",
1589
- "panels.market.sectionLocal": "本地装的",
1655
+ "panels.market.sectionLocal": "本地模块",
1590
1656
  "panels.market.sectionUnlisted": "不是从市场装的",
1591
1657
  "panels.market.sectionPlugins": "已安装 opencli 插件",
1592
1658
  "panels.market.moduleOutdated": "有新版",
1593
1659
  "panels.market.moduleRefused": "这个模块是给旧版本的工作台写的,现在用不了。更新它,或者卸载。",
1594
1660
  "panels.market.moduleRefusedDetail": "装不上的原因:{reason}",
1595
1661
  "panels.market.moduleRestartHint": "装好了但还没生效 —— 重启一次 dsh 就会出来",
1596
- "panels.market.pluginLocalNoUpdate": "本地装的,没地方查新版,所以只给卸载",
1662
+ "panels.market.workbenchName": "工作台",
1663
+ "panels.market.workbenchLocal": "这份是本仓正在开发的那一份,不从源上取。",
1597
1664
  "panels.market.pluginKeptInUse": "文件先留着:{names} 还要用它。",
1598
1665
  "panels.market.pluginKeptUnsure": "文件先留着:这台机器上还有模块看不出用了什么,说不准谁在用它。",
1599
1666
  "panels.market.pluginKeptHeld": "文件留着:你自己装的那一份,模块放手不动它。",
1600
1667
  "panels.market.pluginKeptUnnamed": "文件先留着:看不出这是哪个插件,说不准谁在用它。",
1601
- "panels.market.pluginAlsoKnownAs": "包名是 {pkg}(更新与卸载按它来)",
1602
- "panels.market.pluginBroken": "这份装坏了:看不出它是个插件。可以卸载,或者去上面按包名再装一次。",
1668
+ "panels.market.pluginBroken": "这份装坏了:看不出它是个插件。可以卸载,或者直接跟 agent 说:用 workbench_modules 的 install-bundle 按包名再装一次。",
1603
1669
  "panels.market.restartNeeded": "新版装好了,重启一次才生效。",
1604
1670
  "panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
1605
1671
  "panels.market.recheck": "重新检查更新",
@@ -1608,7 +1674,7 @@ var zh = {
1608
1674
  "panels.market.justNow": "刚刚",
1609
1675
  "panels.market.minutesAgo": "{n} 分钟前",
1610
1676
  "panels.market.hoursAgo": "{n} 小时前",
1611
- "panels.market.add.description": "输入模块的包名、Git 仓库地址或本地目录路径。",
1677
+ "panels.market.add.description": "输入模块或 opencli 插件的包名、Git 仓库地址或本地目录路径。",
1612
1678
  "panels.market.add.specPlaceholder": "例如 @dsh-workbench/module-hello",
1613
1679
  "panels.market.add.guideToggle": "模块安装引导和示例",
1614
1680
  "panels.market.add.guideHide": "收起引导",
@@ -1647,11 +1713,13 @@ var zh = {
1647
1713
  "panels.market.add.problemInstalled": "该模块已安装",
1648
1714
  "panels.market.add.problemNotFound": "未找到相关模块",
1649
1715
  "panels.market.add.problemNotPackage": "该路径不存在或不是有效的模块包",
1650
- "panels.market.add.problemNotBundle": "这个包装不进这里:{reason}。要是它其实是个 opencli 插件,请改用包名(例如 opencli-plugin-cmdb)或者本地目录 —— 从 git 地址和 tarball 判断不出它是什么。",
1716
+ "panels.market.add.problemNotBundle": "这个包装不进这里:{reason}。这个入口按包名认工作台模块和 opencli 插件,两种都能装;但 git 地址和 tarball 判断不出它是什么 —— 要是它其实是这两样之一,请改填包名或本地目录。",
1651
1717
  "panels.market.add.problemNotWorkbenchModule": "这个包跟现在的工作台对不上,装上也用不了。换一个版本,或者找这个模块的作者。",
1652
1718
  "panels.market.add.problemNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上。换一个版本,或者找这个包的作者。",
1653
1719
  "panels.market.add.failureNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上",
1654
1720
  "panels.market.add.installedPlugin": "装上了:opencli 插件 {name}",
1721
+ "panels.market.add.pluginPreview": "这是一份 opencli 插件:装进 opencli 的插件区,装完就能用,不用重启。",
1722
+ "panels.market.add.pluginAlias": "插件名:{name}",
1655
1723
  "panels.market.add.problemNetwork": "无法连接模块源,请检查网络后重试",
1656
1724
  "panels.market.add.problemUnknown": "无法获取模块信息:{reason}",
1657
1725
  "panels.market.add.failureNetwork": "网络连接失败",
@@ -1973,6 +2041,8 @@ var dist_exports = /* @__PURE__ */ __exportAll({
1973
2041
  IconBrandMark: () => IconBrandMark,
1974
2042
  IconConversation: () => IconConversation,
1975
2043
  IconModules: () => IconModules,
2044
+ IconNpm: () => IconNpm,
2045
+ IconOpencli: () => IconOpencli,
1976
2046
  IconPanelScreen: () => IconPanelScreen,
1977
2047
  LOCALES: () => LOCALES,
1978
2048
  LOCALE_NS: () => LOCALE_NS,
@@ -2395,6 +2465,9 @@ function panelRowName(label, hint, t) {
2395
2465
  //#endregion
2396
2466
  //#region src/app/layouts/rightbar/market-freshness.ts
2397
2467
  var MARKET_STALE_MS = VERSION_CHECK_TTL_MS;
2468
+ function marketSettled(freshness, installedRead) {
2469
+ return freshness.loaded && installedRead !== false;
2470
+ }
2398
2471
  function shouldProbeOnEnter(input) {
2399
2472
  if (input.checkedAt === null) return true;
2400
2473
  return input.now - input.checkedAt >= input.staleMs;
@@ -2881,7 +2954,7 @@ function buildMarketMocks(roster) {
2881
2954
  },
2882
2955
  {
2883
2956
  id: "plugin-local",
2884
- label: "本地目录装的 opencli 插件:没有版本源(只给卸载,行上说清为什么)",
2957
+ label: "本地目录装的 opencli 插件:没有版本源,只给卸载",
2885
2958
  manifests: [],
2886
2959
  capabilities: {},
2887
2960
  plugins: [{
@@ -2893,8 +2966,7 @@ function buildMarketMocks(roster) {
2893
2966
  rows: 0,
2894
2967
  plugins: 1,
2895
2968
  pluginActions: ["uninstall-plugin"],
2896
- pluginNote: true,
2897
- pluginNoteKey: "panels.market.pluginLocalNoUpdate"
2969
+ pluginNote: false
2898
2970
  }
2899
2971
  },
2900
2972
  {
@@ -2911,8 +2983,7 @@ function buildMarketMocks(roster) {
2911
2983
  expect: {
2912
2984
  rows: 0,
2913
2985
  plugins: 1,
2914
- pluginActions: ["update-plugin", "uninstall-plugin"],
2915
- pluginNoteKey: "panels.market.pluginAlsoKnownAs"
2986
+ pluginActions: ["update-plugin", "uninstall-plugin"]
2916
2987
  }
2917
2988
  },
2918
2989
  {
@@ -2951,6 +3022,70 @@ function buildMarketMocks(roster) {
2951
3022
  notice: true
2952
3023
  }
2953
3024
  },
3025
+ {
3026
+ id: "workbench-update",
3027
+ label: "工作台有新版(这一行也给「更新」,装完面板自己换上)",
3028
+ manifests: [],
3029
+ capabilities: {},
3030
+ workbench: {
3031
+ pkg: "@dsh-workbench/core",
3032
+ installed: "0.1.18",
3033
+ latest: "0.1.19"
3034
+ },
3035
+ expect: {
3036
+ rows: 0,
3037
+ workbenchState: "outdated",
3038
+ workbenchActions: ["update-workbench"]
3039
+ }
3040
+ },
3041
+ {
3042
+ id: "workbench-current",
3043
+ label: "工作台已经最新(只显示版本,没有按钮)",
3044
+ manifests: [],
3045
+ capabilities: {},
3046
+ workbench: {
3047
+ pkg: "@dsh-workbench/core",
3048
+ installed: "0.1.19"
3049
+ },
3050
+ expect: {
3051
+ rows: 0,
3052
+ workbenchState: "installed",
3053
+ workbenchActions: []
3054
+ }
3055
+ },
3056
+ {
3057
+ id: "workbench-local",
3058
+ label: "工作台是本仓那份(link: 装的:不给更新,行上说清)",
3059
+ manifests: [],
3060
+ capabilities: {},
3061
+ workbench: {
3062
+ pkg: "@dsh-workbench/core",
3063
+ installed: "0.1.18",
3064
+ latest: "0.1.19",
3065
+ local: true
3066
+ },
3067
+ expect: {
3068
+ rows: 0,
3069
+ workbenchState: "installed",
3070
+ workbenchActions: [],
3071
+ workbenchNoteKey: "panels.market.workbenchLocal"
3072
+ }
3073
+ },
3074
+ {
3075
+ id: "workbench-updated",
3076
+ label: "工作台刚更新完(新版已经在盘上:行上就是新版,没有按钮、也不劝人重启)",
3077
+ manifests: [],
3078
+ capabilities: {},
3079
+ workbench: {
3080
+ pkg: "@dsh-workbench/core",
3081
+ installed: "0.1.19"
3082
+ },
3083
+ expect: {
3084
+ rows: 0,
3085
+ workbenchState: "installed",
3086
+ workbenchActions: []
3087
+ }
3088
+ },
2954
3089
  {
2955
3090
  id: "empty",
2956
3091
  label: "市场空态",
@@ -3020,11 +3155,13 @@ function createBoardRegistry() {
3020
3155
  //#endregion
3021
3156
  //#region src/app/units/registry.ts
3022
3157
  function toBoardModule(face, manifest) {
3158
+ const View = face.card;
3159
+ if (View === void 0) return void 0;
3023
3160
  return {
3024
3161
  id: manifest.id,
3025
3162
  titleKey: manifest.card?.titleKey ?? manifest.id,
3026
3163
  order: manifest.card?.order ?? 100,
3027
- View: face.card,
3164
+ View,
3028
3165
  ...face.steps === void 0 ? {} : { steps: face.steps }
3029
3166
  };
3030
3167
  }
@@ -3057,9 +3194,10 @@ function createClientUnitRegistry(options = {}) {
3057
3194
  function attach(entry) {
3058
3195
  const manifest = known.get(entry.unit);
3059
3196
  if (manifest === void 0) return false;
3197
+ const boardModule = toBoardModule(entry.face, manifest);
3060
3198
  entry.mounted = {
3061
3199
  manifest,
3062
- unmount: board.register(toBoardModule(entry.face, manifest))
3200
+ unmount: boardModule === void 0 ? () => {} : board.register(boardModule)
3063
3201
  };
3064
3202
  takeBackRefusal(entry.unit);
3065
3203
  return true;
@@ -3227,9 +3365,46 @@ function hasCard(roster) {
3227
3365
  function fixtureRoster(roster) {
3228
3366
  return hasCard(roster) ? roster : SAMPLE_ROSTER;
3229
3367
  }
3368
+ function boardModuleOf(face) {
3369
+ const module = toBoardModule(face, face.manifest);
3370
+ return module === void 0 ? [] : [module];
3371
+ }
3230
3372
  function fixtureSeed(roster, all, crash = false) {
3231
- const base = hasCard(roster) ? all : [toBoardModule(FIXTURE_FACE, FIXTURE_FACE.manifest)];
3232
- return crash ? [toBoardModule(CRASH_FACE, CRASH_FACE.manifest), ...base] : base;
3373
+ const base = hasCard(roster) ? all : boardModuleOf(FIXTURE_FACE);
3374
+ return crash ? [...boardModuleOf(CRASH_FACE), ...base] : base;
3375
+ }
3376
+ //#endregion
3377
+ //#region src/app/layouts/rightbar/market-workbench-row.ts
3378
+ var WORKBENCH_ROW_ID = "workbench:self";
3379
+ var WORKBENCH_TITLE_KEY = "panels.market.workbenchName";
3380
+ function workbenchRow(version) {
3381
+ if (version === null || version === void 0 || version.installed === "") return void 0;
3382
+ const local = version.local === true;
3383
+ const latest = local ? void 0 : version.latest;
3384
+ const update = latest !== void 0 && latest !== version.installed ? {
3385
+ installed: version.installed,
3386
+ latest
3387
+ } : void 0;
3388
+ const note = local ? {
3389
+ key: "panels.market.workbenchLocal",
3390
+ params: {}
3391
+ } : void 0;
3392
+ return {
3393
+ id: WORKBENCH_ROW_ID,
3394
+ titleKey: WORKBENCH_TITLE_KEY,
3395
+ workbench: true,
3396
+ state: update === void 0 ? "installed" : "outdated",
3397
+ canInstall: false,
3398
+ canUpdate: update !== void 0,
3399
+ canUninstall: false,
3400
+ ...note === void 0 ? {} : { note },
3401
+ version: {
3402
+ installed: version.installed,
3403
+ ...latest === void 0 ? {} : { latest }
3404
+ },
3405
+ ...update === void 0 ? {} : { moduleUpdate: update },
3406
+ pkg: version.pkg
3407
+ };
3233
3408
  }
3234
3409
  //#endregion
3235
3410
  //#region src/app/layouts/rightbar/market-rows.ts
@@ -3278,7 +3453,7 @@ function mergeTitles(known, manifests) {
3278
3453
  }
3279
3454
  return next ?? known;
3280
3455
  }
3281
- function installedRows(modules, manifests, listed, known) {
3456
+ function installedRows(modules, manifests, listed, known, defaults = /* @__PURE__ */ new Set(), changed = {}) {
3282
3457
  const titles = new Map(manifests.map((manifest) => [manifest.id, manifest.card?.titleKey]));
3283
3458
  const rows = [];
3284
3459
  for (const module of modules) {
@@ -3308,12 +3483,15 @@ function installedRows(modules, manifests, listed, known) {
3308
3483
  ...outdated ? { moduleUpdate: {
3309
3484
  installed: module.installed,
3310
3485
  latest
3311
- } } : {}
3486
+ } } : {},
3487
+ defaultShown: defaults.has(module.unit),
3488
+ defaultChanged: changed[module.unit] ?? 0
3312
3489
  });
3313
3490
  }
3314
3491
  return rows;
3315
3492
  }
3316
3493
  function marketActions$1(row) {
3494
+ if (row.workbench === true) return row.canUpdate ? ["update-workbench"] : [];
3317
3495
  if (row.plugin === true) return [...row.canUpdate ? ["update-plugin"] : [], ...row.canUninstall ? ["uninstall-plugin"] : []];
3318
3496
  return [
3319
3497
  ...row.canInstall ? ["install"] : [],
@@ -3374,8 +3552,9 @@ function marketUpdatesOf(modules) {
3374
3552
  };
3375
3553
  return next;
3376
3554
  }
3377
- function marketHintVisible(manifests, capabilities, modules) {
3378
- return marketHasUpdates(marketRows(manifests, capabilities, marketUpdatesOf(modules)), sharedRows(manifests, capabilities));
3555
+ function marketHintVisible(manifests, capabilities, modules, workbench) {
3556
+ const self = workbenchRow(workbench);
3557
+ return marketHasUpdates([...marketRows(manifests, capabilities, marketUpdatesOf(modules)), ...self === void 0 ? [] : [self]], sharedRows(manifests, capabilities));
3379
3558
  }
3380
3559
  function marketSections(rows) {
3381
3560
  const installed = rows.filter((row) => isOnMachine(row.state));
@@ -3390,7 +3569,7 @@ function marketSections(rows) {
3390
3569
  rows: rest
3391
3570
  }]];
3392
3571
  }
3393
- function marketRows(manifests, capabilities, updates = {}) {
3572
+ function marketRows(manifests, capabilities, updates = {}, defaults = /* @__PURE__ */ new Set(), changed = {}) {
3394
3573
  const catalog = manifests.filter((manifest) => (manifest.env?.plugins ?? []).length > 0 || (manifest.env?.libs ?? []).length > 0);
3395
3574
  const rows = [];
3396
3575
  for (const manifest of catalog) {
@@ -3417,7 +3596,9 @@ function marketRows(manifests, capabilities, updates = {}) {
3417
3596
  ...entry.latest === void 0 ? {} : { latest: entry.latest }
3418
3597
  } },
3419
3598
  ...moduleUpdate === void 0 ? {} : { moduleUpdate },
3420
- ...moduleUpdate === void 0 ? note === void 0 ? {} : { note } : {}
3599
+ ...moduleUpdate === void 0 ? note === void 0 ? {} : { note } : {},
3600
+ defaultShown: defaults.has(manifest.id),
3601
+ defaultChanged: changed[manifest.id] ?? 0
3421
3602
  });
3422
3603
  }
3423
3604
  return rows;
@@ -3506,6 +3687,7 @@ function sharedRows(manifests, capabilities) {
3506
3687
  const detail = bucket.purpose === void 0 ? void 0 : `${bucket.label} —— ${bucket.purpose}`;
3507
3688
  rows.push({
3508
3689
  id: `${bucket.kind}:${bucket.name}`,
3690
+ kind: bucket.kind,
3509
3691
  label: bucket.label,
3510
3692
  usedByKeys: bucket.users.map((unit) => byId.get(unit)?.card?.titleKey ?? unit),
3511
3693
  state,
@@ -3586,27 +3768,27 @@ function installedPluginKept(value) {
3586
3768
  names
3587
3769
  };
3588
3770
  }
3771
+ function installedPluginNotice(value, t) {
3772
+ const kept = installedPluginKept(value);
3773
+ if (kept === void 0) return null;
3774
+ return t(kept.key, kept.names === void 0 ? {} : { names: kept.names.join(t("panels.market.listSeparator")) });
3775
+ }
3589
3776
  function noteOf(plugin) {
3590
3777
  if (plugin.broken === true) return {
3591
3778
  key: "panels.market.pluginBroken",
3592
- params: {}
3593
- };
3594
- if (plugin.local === true) return {
3595
- key: "panels.market.pluginLocalNoUpdate",
3596
- params: {}
3597
- };
3598
- if (plugin.name !== void 0 && plugin.name !== plugin.pkg) return {
3599
- key: "panels.market.pluginAlsoKnownAs",
3600
- params: { pkg: plugin.pkg }
3779
+ params: {},
3780
+ tone: "alert"
3601
3781
  };
3782
+ if (plugin.local === true) return void 0;
3602
3783
  }
3603
- function installedPluginRows(plugins) {
3784
+ function installedPluginRows(plugins, defaults = /* @__PURE__ */ new Set(), changed = {}) {
3604
3785
  return plugins.map((plugin) => {
3786
+ const id = `plugin:${plugin.pkg}`;
3605
3787
  const name = plugin.name ?? plugin.pkg;
3606
3788
  const outdated = plugin.installed !== void 0 && plugin.latest !== void 0 && plugin.latest !== plugin.installed;
3607
3789
  const note = noteOf(plugin);
3608
3790
  return {
3609
- id: `plugin:${plugin.pkg}`,
3791
+ id,
3610
3792
  titleKey: plugin.pkg,
3611
3793
  label: name,
3612
3794
  plugin: true,
@@ -3616,7 +3798,12 @@ function installedPluginRows(plugins) {
3616
3798
  canUninstall: true,
3617
3799
  ...plugin.local === true ? { local: true } : {},
3618
3800
  ...plugin.broken === true ? { broken: true } : {},
3801
+ ...plugin.broken === true ? {} : {
3802
+ defaultShown: defaults.has(id),
3803
+ defaultChanged: changed[id] ?? 0
3804
+ },
3619
3805
  ...note === void 0 ? {} : { note },
3806
+ ...plugin.installed === void 0 ? {} : { versionLabel: `${plugin.pkg}@${plugin.installed}` },
3620
3807
  pkg: plugin.pkg,
3621
3808
  ...plugin.installed === void 0 ? {} : { version: {
3622
3809
  installed: plugin.installed,
@@ -3625,8 +3812,279 @@ function installedPluginRows(plugins) {
3625
3812
  };
3626
3813
  });
3627
3814
  }
3815
+ var MarketPage_module_default = {
3816
+ marketList: "_marketList_1v8dy_1",
3817
+ marketRow: "_marketRow_1v8dy_10",
3818
+ marketIcon: "_marketIcon_1v8dy_20",
3819
+ marketMain: "_marketMain_1v8dy_32",
3820
+ marketName: "_marketName_1v8dy_39",
3821
+ marketDesc: "_marketDesc_1v8dy_48",
3822
+ marketUsedBy: "_marketUsedBy_1v8dy_59",
3823
+ marketVersion: "_marketVersion_1v8dy_73",
3824
+ marketEnd: "_marketEnd_1v8dy_95",
3825
+ marketSwitchSeat: "_marketSwitchSeat_1v8dy_103",
3826
+ marketIconAction: "_marketIconAction_1v8dy_108",
3827
+ marketActions: "_marketActions_1v8dy_113",
3828
+ marketDefaultNote: "_marketDefaultNote_1v8dy_119",
3829
+ marketSelfDivider: "_marketSelfDivider_1v8dy_126",
3830
+ marketSection: "_marketSection_1v8dy_131",
3831
+ marketSectionHead: "_marketSectionHead_1v8dy_138",
3832
+ marketSectionIcon: "_marketSectionIcon_1v8dy_144",
3833
+ marketSectionTitle: "_marketSectionTitle_1v8dy_151",
3834
+ marketSectionCount: "_marketSectionCount_1v8dy_157",
3835
+ marketProgress: "_marketProgress_1v8dy_164",
3836
+ marketNote: "_marketNote_1v8dy_174",
3837
+ marketNotePlain: "_marketNotePlain_1v8dy_181",
3838
+ marketFailure: "_marketFailure_1v8dy_189",
3839
+ marketEmpty: "_marketEmpty_1v8dy_196",
3840
+ marketPage: "_marketPage_1v8dy_201",
3841
+ marketPageHead: "_marketPageHead_1v8dy_219",
3842
+ marketPageTitle: "_marketPageTitle_1v8dy_227",
3843
+ marketPageIntro: "_marketPageIntro_1v8dy_232",
3844
+ marketPageTools: "_marketPageTools_1v8dy_238",
3845
+ marketIconButton: "_marketIconButton_1v8dy_247",
3846
+ marketIconWrap: "_marketIconWrap_1v8dy_272",
3847
+ marketIconButtonSpinning: "_marketIconButtonSpinning_1v8dy_276",
3848
+ "wb-spin": "_wb-spin_1v8dy_1",
3849
+ marketAddButton: "_marketAddButton_1v8dy_280",
3850
+ marketChecking: "_marketChecking_1v8dy_297",
3851
+ marketEmptyTitle: "_marketEmptyTitle_1v8dy_305"
3852
+ };
3853
+ //#endregion
3854
+ //#region src/app/layouts/rightbar/MarketStates.tsx
3855
+ function MarketChecking({ t }) {
3856
+ return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketChecking }, /* @__PURE__ */ h(StateDot, {
3857
+ state: "ongoing",
3858
+ size: 14
3859
+ }), t("panels.market.checking")));
3860
+ }
3861
+ function MarketEmpty({ t }) {
3862
+ return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmptyTitle }, t("panels.market.empty")));
3863
+ }
3864
+ //#endregion
3865
+ //#region src/app/layouts/rightbar/market-section-icon.ts
3866
+ var SIZE$1 = 14;
3867
+ function marketSectionIcon(kind) {
3868
+ switch (kind) {
3869
+ case "installed": return h(IconModules, { size: SIZE$1 });
3870
+ case "pending": return h(IconDownloadOutlineRegular, { size: SIZE$1 });
3871
+ case "plugins": return h(IconCordisPluginOutlineRegular, { size: SIZE$1 });
3872
+ case "local": return h(IconFolderOpenOutlineRegular, { size: SIZE$1 });
3873
+ case "shared": return h(IconLinkOutlineRegular, { size: SIZE$1 });
3874
+ }
3875
+ }
3876
+ //#endregion
3877
+ //#region src/app/layouts/rightbar/market-row-icon.ts
3878
+ var SIZE = 18;
3879
+ function packageIcon(kind) {
3880
+ switch (kind) {
3881
+ case "module": return h(IconArchiveOutlineRegular, { size: SIZE });
3882
+ case "plugin": return h(IconOpencli, { size: SIZE });
3883
+ case "lib": return h(IconNpm, { size: SIZE });
3884
+ case "workbench": return h(IconPanelScreen, { size: SIZE });
3885
+ }
3886
+ }
3887
+ function marketRowKind(row) {
3888
+ if (row.workbench === true) return "workbench";
3889
+ if (row.plugin === true) return "plugin";
3890
+ return "module";
3891
+ }
3892
+ function sharedRowKind(row) {
3893
+ return row.kind === "plugin" ? "plugin" : "lib";
3894
+ }
3895
+ //#endregion
3896
+ //#region src/app/layouts/rightbar/market-view-text.ts
3897
+ var PROGRESS_KEY = {
3898
+ install: "panels.market.installing",
3899
+ update: "panels.market.updating",
3900
+ "update-bundle": "panels.market.updating",
3901
+ "remove-bundle": "panels.market.uninstalling",
3902
+ uninstall: "panels.market.uninstalling",
3903
+ "update-dependency": "panels.market.updating",
3904
+ "update-plugin": "panels.market.updating",
3905
+ "uninstall-plugin": "panels.market.uninstalling",
3906
+ "update-workbench": "panels.market.updating"
3907
+ };
3908
+ var ACTION_LABEL_KEY = {
3909
+ install: "panels.market.install",
3910
+ update: "panels.market.update",
3911
+ "update-bundle": "panels.market.update",
3912
+ "remove-bundle": "panels.market.uninstall",
3913
+ uninstall: "panels.market.uninstall",
3914
+ "update-dependency": "panels.market.update",
3915
+ "update-plugin": "panels.market.update",
3916
+ "uninstall-plugin": "panels.market.uninstall",
3917
+ "update-workbench": "panels.market.update"
3918
+ };
3919
+ function pendingRowOf(input) {
3920
+ const { pending, removing } = input;
3921
+ if (removing === null || pending === null) return void 0;
3922
+ if (input.rows.some((row) => row.id === removing)) return void 0;
3923
+ return {
3924
+ id: removing,
3925
+ titleKey: pending.titleKey ?? input.titles.get(removing) ?? removing,
3926
+ state: "installed",
3927
+ canInstall: false,
3928
+ canUpdate: false,
3929
+ canUninstall: true,
3930
+ ...pending.pkg === void 0 ? {} : { pkg: pending.pkg },
3931
+ ...pending.version === void 0 ? {} : { version: { installed: pending.version } }
3932
+ };
3933
+ }
3934
+ //#endregion
3935
+ //#region src/app/layouts/rightbar/SharedSection.tsx
3936
+ function SharedLine({ t, row, pending, failure, onAct }) {
3937
+ const running = pending !== null && pending.id === row.id ? pending : null;
3938
+ const locked = pending !== null;
3939
+ const actions = sharedActions(row);
3940
+ const stateText = t(SHARED_STATE_KEY[row.state]);
3941
+ const version = row.version;
3942
+ const name = /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketName }, row.label, version === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketVersion }, version.installed !== void 0 && version.latest !== void 0 && version.installed !== version.latest ? t("panels.market.versionArrow", {
3943
+ from: version.installed,
3944
+ to: version.latest
3945
+ }) : version.installed ?? version.latest ?? ""));
3946
+ return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
3947
+ className: MarketPage_module_default.marketIcon,
3948
+ "aria-hidden": "true"
3949
+ }, packageIcon(sharedRowKind(row))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketMain }, row.detail === void 0 ? name : /* @__PURE__ */ h(Tip, { label: row.detail }, name), /* @__PURE__ */ h("span", {
3950
+ className: MarketPage_module_default.marketDesc,
3951
+ role: "img",
3952
+ "aria-label": stateText
3953
+ }, row.state === "checking" ? /* @__PURE__ */ h(StateDot, {
3954
+ state: "ongoing",
3955
+ size: 14
3956
+ }) : /* @__PURE__ */ h(StateDot, {
3957
+ state: SHARED_DOT[row.state],
3958
+ size: 9
3959
+ }), stateText, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketUsedBy }, t("panels.market.sharedUsedBy", { modules: row.usedByKeys.map((key) => t(key)).join(t("panels.market.listSeparator")) })))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ h(StateDot, {
3960
+ state: "ongoing",
3961
+ size: 14
3962
+ }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => /* @__PURE__ */ h(Button, {
3963
+ key: action,
3964
+ type: "button",
3965
+ size: "sm",
3966
+ variant: "outline",
3967
+ disabled: locked,
3968
+ onClick: () => onAct(action)
3969
+ }, t(ACTION_LABEL_KEY[action]))))), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
3970
+ }
3971
+ function SharedSection({ t, rows, pending, failureOf, act }) {
3972
+ if (rows.length === 0) return null;
3973
+ return /* @__PURE__ */ h("section", { className: MarketPage_module_default.marketSection }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ h("span", {
3974
+ className: MarketPage_module_default.marketSectionIcon,
3975
+ "aria-hidden": "true"
3976
+ }, marketSectionIcon("shared")), /* @__PURE__ */ h("h2", { className: MarketPage_module_default.marketSectionTitle }, t("panels.market.sectionShared")), /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketSectionCount }, rows.length)), /* @__PURE__ */ h("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ h(SharedLine, {
3977
+ key: row.id,
3978
+ t,
3979
+ row,
3980
+ pending,
3981
+ failure: failureOf(row.id),
3982
+ onAct: (action) => void act(row.id, action)
3983
+ }))));
3984
+ }
3985
+ //#endregion
3986
+ //#region src/app/layouts/rightbar/market-section.tsx
3987
+ function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy }) {
3988
+ const running = pending !== null && pending.id === row.id ? pending : null;
3989
+ const locked = pending !== null;
3990
+ const quiet = row.workbench === true && row.state === "installed" && row.hint === void 0;
3991
+ const actions = marketActions$1(row);
3992
+ const stateText = t(row.moduleUpdate === void 0 ? MARKET_STATE_KEY[row.state] : "panels.market.moduleOutdated");
3993
+ return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
3994
+ className: MarketPage_module_default.marketIcon,
3995
+ "aria-hidden": "true"
3996
+ }, packageIcon(marketRowKind(row))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketMain }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketName }, marketRowTitle(row, t), row.versionLabel === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketVersion }, row.versionLabel), row.version === void 0 || row.versionLabel !== void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketVersion }, row.version.installed !== void 0 && row.version.latest !== void 0 && row.version.installed !== row.version.latest ? t("panels.market.versionArrow", {
3997
+ from: row.version.installed,
3998
+ to: row.version.latest
3999
+ }) : row.version.installed ?? row.version.latest ?? "")), quiet ? null : /* @__PURE__ */ h("span", {
4000
+ className: MarketPage_module_default.marketDesc,
4001
+ role: "img",
4002
+ "aria-label": stateText
4003
+ }, row.state === "checking" ? /* @__PURE__ */ h(StateDot, {
4004
+ state: "ongoing",
4005
+ size: 14
4006
+ }) : /* @__PURE__ */ h(StateDot, {
4007
+ state: MARKET_DOT[row.state],
4008
+ size: 9
4009
+ }), stateText, row.hint === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketUsedBy }, t(row.hint)))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEnd }, row.defaultShown === void 0 ? null : /* @__PURE__ */ h(Tip, { label: (row.defaultChanged ?? 0) === 0 ? t("panels.market.defaultLabel") : `${t("panels.market.defaultLabel")} · ${t("panels.market.changedBy", { count: row.defaultChanged ?? 0 })}` }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketSwitchSeat }, /* @__PURE__ */ h(Switch, {
4010
+ checked: row.defaultShown,
4011
+ disabled: boardBusy === true || locked,
4012
+ label: `${marketRowTitle(row, t)} · ${t("panels.market.defaultLabel")}`,
4013
+ onChange: (next) => onDefault?.(next)
4014
+ }))), running !== null ? /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ h(StateDot, {
4015
+ state: "ongoing",
4016
+ size: 14
4017
+ }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => {
4018
+ const danger = action === "uninstall" || action === "remove-bundle" || action === "uninstall-plugin";
4019
+ const label = t(ACTION_LABEL_KEY[action]);
4020
+ if (!danger) return /* @__PURE__ */ h(Button, {
4021
+ key: action,
4022
+ type: "button",
4023
+ size: "sm",
4024
+ variant: action === "install" ? "primary" : "outline",
4025
+ disabled: locked,
4026
+ onClick: () => onAct(action)
4027
+ }, label);
4028
+ return /* @__PURE__ */ h(Tip, {
4029
+ key: action,
4030
+ label
4031
+ }, /* @__PURE__ */ h(Button, {
4032
+ type: "button",
4033
+ size: "sm",
4034
+ variant: "ghost",
4035
+ className: `wb-dangerAction ${MarketPage_module_default.marketIconAction}`,
4036
+ icon: /* @__PURE__ */ h(IconTrashOutlineRegular, { size: 14 }),
4037
+ "aria-label": t("panels.market.uninstallLabel", { name: marketRowTitle(row, t) }),
4038
+ disabled: locked,
4039
+ onClick: () => onAct(action)
4040
+ }));
4041
+ }))), row.note === void 0 ? null : /* @__PURE__ */ h("div", {
4042
+ className: row.note.tone === "plain" ? MarketPage_module_default.marketNotePlain : MarketPage_module_default.marketNote,
4043
+ title: row.note.params.reason === void 0 ? void 0 : t("panels.market.moduleRefusedDetail", row.note.params)
4044
+ }, t(row.note.key, row.note.params)), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
4045
+ }
4046
+ function MarketSection({ t, titleKey, icon, rows, pending, failureOf, act, confirmActions, onConfirming, onDefault, boardBusy }) {
4047
+ if (rows.length === 0) return null;
4048
+ return /* @__PURE__ */ h("section", { className: MarketPage_module_default.marketSection }, titleKey === void 0 ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ h("span", {
4049
+ className: MarketPage_module_default.marketSectionIcon,
4050
+ "aria-hidden": "true"
4051
+ }, icon), /* @__PURE__ */ h("h2", { className: MarketPage_module_default.marketSectionTitle }, t(titleKey)), rows.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketSectionCount }, rows.length)), rows.length === 0 ? null : /* @__PURE__ */ h("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ h(MarketLine, {
4052
+ key: row.id,
4053
+ t,
4054
+ row,
4055
+ pending,
4056
+ failure: failureOf(row.id),
4057
+ onAct: (action) => confirmActions.includes(action) ? onConfirming(row.id) : void act(row.id, action),
4058
+ onDefault: (next) => onDefault?.(row.id, next),
4059
+ boardBusy
4060
+ }))));
4061
+ }
3628
4062
  //#endregion
3629
4063
  //#region src/app/layouts/market/add-module-text.ts
4064
+ function previewOf(inspection, fallback) {
4065
+ if (inspection.status === "plugin") return {
4066
+ kind: "plugin",
4067
+ name: inspection.pkg,
4068
+ version: inspection.version ?? "",
4069
+ description: "",
4070
+ registry: inspection.registry ?? "",
4071
+ ...inspection.pluginName === void 0 ? {} : { pluginName: inspection.pluginName }
4072
+ };
4073
+ return {
4074
+ kind: "module",
4075
+ name: inspection.name ?? fallback,
4076
+ version: inspection.version ?? "",
4077
+ description: inspection.description ?? "",
4078
+ registry: inspection.registry ?? ""
4079
+ };
4080
+ }
4081
+ function resultKindOf(input) {
4082
+ if (input.plugin) return "plugin";
4083
+ if (input.change.application === "failed") return "failed";
4084
+ if (input.change.application === "restart-required") return "restart";
4085
+ if (input.change.application === "cancelled" || input.supplyState === "not-a-module") return "quiet";
4086
+ return "took-effect";
4087
+ }
3630
4088
  var GUIDE_ITEMS = [
3631
4089
  {
3632
4090
  titleKey: "panels.market.add.guideIdTitle",
@@ -3814,48 +4272,50 @@ function changeFailure(change, t) {
3814
4272
  if (change === void 0 || SHIPPED.includes(change.application)) return void 0;
3815
4273
  return failureReason(failureCode(change), change.application, t);
3816
4274
  }
3817
- var MarketPage_module_default = {
3818
- marketList: "_marketList_z6vtq_1",
3819
- marketRow: "_marketRow_z6vtq_10",
3820
- marketIcon: "_marketIcon_z6vtq_20",
3821
- marketMain: "_marketMain_z6vtq_32",
3822
- marketName: "_marketName_z6vtq_39",
3823
- marketDesc: "_marketDesc_z6vtq_48",
3824
- marketUsedBy: "_marketUsedBy_z6vtq_59",
3825
- marketVersion: "_marketVersion_z6vtq_73",
3826
- marketEnd: "_marketEnd_z6vtq_95",
3827
- marketActions: "_marketActions_z6vtq_102",
3828
- marketSection: "_marketSection_z6vtq_108",
3829
- marketSectionHead: "_marketSectionHead_z6vtq_115",
3830
- marketSectionTitle: "_marketSectionTitle_z6vtq_121",
3831
- marketSectionCount: "_marketSectionCount_z6vtq_127",
3832
- marketProgress: "_marketProgress_z6vtq_133",
3833
- marketNote: "_marketNote_z6vtq_143",
3834
- marketFailure: "_marketFailure_z6vtq_150",
3835
- marketEmpty: "_marketEmpty_z6vtq_157",
3836
- marketPage: "_marketPage_z6vtq_162",
3837
- marketPageHead: "_marketPageHead_z6vtq_180",
3838
- marketPageTitle: "_marketPageTitle_z6vtq_188",
3839
- marketPageIntro: "_marketPageIntro_z6vtq_193",
3840
- marketPageTools: "_marketPageTools_z6vtq_199",
3841
- marketIconButton: "_marketIconButton_z6vtq_208",
3842
- marketIconWrap: "_marketIconWrap_z6vtq_233",
3843
- marketIconButtonSpinning: "_marketIconButtonSpinning_z6vtq_237",
3844
- "wb-spin": "_wb-spin_z6vtq_1",
3845
- marketAddButton: "_marketAddButton_z6vtq_241",
3846
- marketChecking: "_marketChecking_z6vtq_258",
3847
- marketEmptyTitle: "_marketEmptyTitle_z6vtq_266"
3848
- };
3849
4275
  //#endregion
3850
- //#region src/app/layouts/rightbar/MarketStates.tsx
3851
- function MarketChecking({ t }) {
3852
- return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketChecking }, /* @__PURE__ */ h(StateDot, {
3853
- state: "ongoing",
3854
- size: 14
3855
- }), t("panels.market.checking")));
3856
- }
3857
- function MarketEmpty({ t }) {
3858
- return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmptyTitle }, t("panels.market.empty")));
4276
+ //#region src/app/layouts/rightbar/market-act.ts
4277
+ function marketActOf(options) {
4278
+ const { t, mocked, rowOf, seats, send, onChanged } = options;
4279
+ return async (id, action) => {
4280
+ if (mocked) return;
4281
+ const row = rowOf(id);
4282
+ seats.setPending({
4283
+ id,
4284
+ action,
4285
+ ...row?.titleKey === void 0 ? {} : { titleKey: row.titleKey },
4286
+ ...row?.pkg === void 0 ? {} : { pkg: row.pkg },
4287
+ ...row?.version?.installed === void 0 ? {} : { version: row.version.installed }
4288
+ });
4289
+ seats.setConfirming(null);
4290
+ seats.setFailed(null);
4291
+ if (action !== "uninstall-plugin") seats.setNotice(null);
4292
+ const outcome = await send(action === "update-dependency" ? {
4293
+ action,
4294
+ id
4295
+ } : action === "remove-bundle" || action === "update-plugin" || action === "uninstall-plugin" || action === "update-workbench" ? {
4296
+ action,
4297
+ name: row?.pkg ?? ""
4298
+ } : {
4299
+ action,
4300
+ unit: id
4301
+ });
4302
+ seats.setPending(null);
4303
+ if (!outcome.ok) {
4304
+ onChanged();
4305
+ seats.setFailed({
4306
+ id,
4307
+ message: t("panels.market.failed", { reason: outcome.message })
4308
+ });
4309
+ return;
4310
+ }
4311
+ if (action === "uninstall-plugin") seats.setNotice(installedPluginNotice(outcome.value, t));
4312
+ const reason = changeFailure(changeOf(outcome.value), t);
4313
+ onChanged();
4314
+ if (reason !== void 0) seats.setFailed({
4315
+ id,
4316
+ message: t("panels.market.failed", { reason })
4317
+ });
4318
+ };
3859
4319
  }
3860
4320
  var PanelFoot_module_default = {
3861
4321
  foot: "_foot_1us83_1",
@@ -3868,79 +4328,6 @@ function PanelFoot({ text, size = "sm", children }) {
3868
4328
  return /* @__PURE__ */ h("footer", { className: PanelFoot_module_default.foot }, /* @__PURE__ */ h("span", { className: size === "md" ? PanelFoot_module_default.footTextMd : PanelFoot_module_default.footText }, text), children ?? null);
3869
4329
  }
3870
4330
  //#endregion
3871
- //#region src/app/layouts/rightbar/market-view-text.ts
3872
- var PROGRESS_KEY = {
3873
- install: "panels.market.installing",
3874
- update: "panels.market.updating",
3875
- "update-bundle": "panels.market.updating",
3876
- "remove-bundle": "panels.market.uninstalling",
3877
- uninstall: "panels.market.uninstalling",
3878
- "update-dependency": "panels.market.updating",
3879
- "update-plugin": "panels.market.updating",
3880
- "uninstall-plugin": "panels.market.uninstalling"
3881
- };
3882
- var ACTION_LABEL_KEY = {
3883
- install: "panels.market.install",
3884
- update: "panels.market.update",
3885
- "update-bundle": "panels.market.update",
3886
- "remove-bundle": "panels.market.uninstall",
3887
- uninstall: "panels.market.uninstall",
3888
- "update-dependency": "panels.market.update",
3889
- "update-plugin": "panels.market.update",
3890
- "uninstall-plugin": "panels.market.uninstall"
3891
- };
3892
- //#endregion
3893
- //#region src/app/layouts/rightbar/SharedSection.tsx
3894
- function SharedLine({ t, row, pending, failure, onAct }) {
3895
- const running = pending !== null && pending.id === row.id ? pending : null;
3896
- const locked = pending !== null;
3897
- const actions = sharedActions(row);
3898
- const stateText = t(SHARED_STATE_KEY[row.state]);
3899
- const version = row.version;
3900
- const name = /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketName }, row.label, version === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketVersion }, version.installed !== void 0 && version.latest !== void 0 && version.installed !== version.latest ? t("panels.market.versionArrow", {
3901
- from: version.installed,
3902
- to: version.latest
3903
- }) : version.installed ?? version.latest ?? ""));
3904
- return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
3905
- className: MarketPage_module_default.marketIcon,
3906
- "aria-hidden": "true"
3907
- }, /* @__PURE__ */ h(IconModules, { size: 18 })), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketMain }, row.detail === void 0 ? name : /* @__PURE__ */ h(Tip, { label: row.detail }, name), /* @__PURE__ */ h("span", {
3908
- className: MarketPage_module_default.marketDesc,
3909
- role: "img",
3910
- "aria-label": stateText
3911
- }, row.state === "checking" ? /* @__PURE__ */ h(StateDot, {
3912
- state: "ongoing",
3913
- size: 14
3914
- }) : /* @__PURE__ */ h(StateDot, {
3915
- state: SHARED_DOT[row.state],
3916
- size: 9
3917
- }), stateText, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketUsedBy }, t("panels.market.sharedUsedBy", { modules: row.usedByKeys.map((key) => t(key)).join(t("panels.market.listSeparator")) })))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ h(StateDot, {
3918
- state: "ongoing",
3919
- size: 14
3920
- }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => /* @__PURE__ */ h(Button, {
3921
- key: action,
3922
- type: "button",
3923
- size: "sm",
3924
- variant: "outline",
3925
- disabled: locked,
3926
- onClick: () => onAct(action)
3927
- }, t(ACTION_LABEL_KEY[action]))))), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
3928
- }
3929
- function SharedSection({ t, rows, pending, failureOf, act }) {
3930
- if (rows.length === 0) return null;
3931
- return /* @__PURE__ */ h("section", { className: MarketPage_module_default.marketSection }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ h("h2", { className: MarketPage_module_default.marketSectionTitle }, t("panels.market.sectionShared")), /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketSectionCount }, rows.length)), /* @__PURE__ */ h("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ h(SharedLine, {
3932
- key: row.id,
3933
- t,
3934
- row,
3935
- pending,
3936
- failure: failureOf(row.id),
3937
- onAct: (action) => void act(row.id, action)
3938
- }))), /* @__PURE__ */ h(PanelFoot, {
3939
- size: "md",
3940
- text: t("panels.market.sharedFoot")
3941
- }));
3942
- }
3943
- //#endregion
3944
4331
  //#region src/app/layouts/rightbar/MarketView.tsx
3945
4332
  var CONFIRM_UNINSTALL = [
3946
4333
  "uninstall",
@@ -3948,48 +4335,6 @@ var CONFIRM_UNINSTALL = [
3948
4335
  "uninstall-plugin"
3949
4336
  ];
3950
4337
  var CONFIRM_REMOVE = ["remove-bundle"];
3951
- function MarketLine({ t, row, pending, failure, onAct }) {
3952
- const running = pending !== null && pending.id === row.id ? pending : null;
3953
- const locked = pending !== null;
3954
- const actions = marketActions$1(row);
3955
- const stateText = t(row.moduleUpdate === void 0 ? MARKET_STATE_KEY[row.state] : "panels.market.moduleOutdated");
3956
- return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
3957
- className: MarketPage_module_default.marketIcon,
3958
- "aria-hidden": "true"
3959
- }, /* @__PURE__ */ h(IconModules, { size: 18 })), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketMain }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketName }, marketRowTitle(row, t), row.version === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketVersion }, row.version.installed !== void 0 && row.version.latest !== void 0 && row.version.installed !== row.version.latest ? t("panels.market.versionArrow", {
3960
- from: row.version.installed,
3961
- to: row.version.latest
3962
- }) : row.version.installed ?? row.version.latest ?? "")), /* @__PURE__ */ h("span", {
3963
- className: MarketPage_module_default.marketDesc,
3964
- role: "img",
3965
- "aria-label": stateText
3966
- }, row.state === "checking" ? /* @__PURE__ */ h(StateDot, {
3967
- state: "ongoing",
3968
- size: 14
3969
- }) : /* @__PURE__ */ h(StateDot, {
3970
- state: MARKET_DOT[row.state],
3971
- size: 9
3972
- }), stateText, row.hint === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketUsedBy }, t(row.hint)))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ h(StateDot, {
3973
- state: "ongoing",
3974
- size: 14
3975
- }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => {
3976
- const danger = action === "uninstall" || action === "remove-bundle";
3977
- return /* @__PURE__ */ h(Button, {
3978
- key: action,
3979
- type: "button",
3980
- size: "sm",
3981
- variant: action === "install" ? "primary" : "outline",
3982
- className: danger ? "wb-dangerAction" : void 0,
3983
- icon: danger ? /* @__PURE__ */ h(IconTrashOutlineRegular, { size: 13 }) : void 0,
3984
- "aria-label": danger ? t("panels.market.uninstallLabel", { name: marketRowTitle(row, t) }) : void 0,
3985
- disabled: locked,
3986
- onClick: () => onAct(action)
3987
- }, t(ACTION_LABEL_KEY[action]));
3988
- }))), row.note === void 0 ? null : /* @__PURE__ */ h("div", {
3989
- className: MarketPage_module_default.marketNote,
3990
- title: row.note.params.reason === void 0 ? void 0 : t("panels.market.moduleRefusedDetail", row.note.params)
3991
- }, t(row.note.key, row.note.params)), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
3992
- }
3993
4338
  function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
3994
4339
  const [acknowledged, setAcknowledged] = useState(false);
3995
4340
  return /* @__PURE__ */ h(RiskConfirmation, {
@@ -4006,24 +4351,33 @@ function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
4006
4351
  onConfirm
4007
4352
  });
4008
4353
  }
4009
- function MarketSection({ t, titleKey, rows, pending, failureOf, act, confirmActions, onConfirming }) {
4010
- if (rows.length === 0) return null;
4011
- return /* @__PURE__ */ h("section", { className: MarketPage_module_default.marketSection }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ h("h2", { className: MarketPage_module_default.marketSectionTitle }, t(titleKey)), /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketSectionCount }, rows.length)), /* @__PURE__ */ h("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ h(MarketLine, {
4012
- key: row.id,
4354
+ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending, failed, notice, act, onConfirming, setDefault, boardBusy }) {
4355
+ const failureOf = (id) => failed?.id === id ? failed.message : null;
4356
+ return /* @__PURE__ */ h(Fragment, null, notice === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketNote }, notice), /* @__PURE__ */ h(MarketSection, {
4013
4357
  t,
4014
- row,
4358
+ rows: self === void 0 ? [] : [self],
4359
+ onDefault: setDefault,
4360
+ boardBusy,
4015
4361
  pending,
4016
- failure: failureOf(row.id),
4017
- onAct: (action) => confirmActions.includes(action) ? onConfirming(row.id) : void act(row.id, action)
4018
- }))));
4019
- }
4020
- function MarketBody({ t, shown, pluginList, installedList, shared, pending, failed, notice, act, onConfirming }) {
4021
- const failureOf = (id) => failed?.id === id ? failed.message : null;
4022
- return /* @__PURE__ */ h(Fragment, null, notice === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketNote }, notice), marketSections(shown).map((section) => /* @__PURE__ */ h(MarketSection, {
4362
+ failureOf,
4363
+ act,
4364
+ confirmActions: CONFIRM_UNINSTALL,
4365
+ onConfirming
4366
+ }), self === void 0 ? null : /* @__PURE__ */ h("div", {
4367
+ className: MarketPage_module_default.marketSelfDivider,
4368
+ "aria-hidden": "true"
4369
+ }), [
4370
+ ...shown,
4371
+ ...installedList,
4372
+ ...pluginList
4373
+ ].some((row) => row.defaultShown !== void 0) ? /* @__PURE__ */ h("p", { className: MarketPage_module_default.marketDefaultNote }, t("panels.market.defaultNote")) : null, marketSections(shown).map((section) => /* @__PURE__ */ h(MarketSection, {
4023
4374
  key: section.id,
4024
4375
  t,
4025
4376
  titleKey: section.titleKey,
4377
+ icon: marketSectionIcon(section.id === "installed" ? "installed" : "pending"),
4026
4378
  rows: section.rows,
4379
+ onDefault: setDefault,
4380
+ boardBusy,
4027
4381
  pending,
4028
4382
  failureOf,
4029
4383
  act,
@@ -4032,7 +4386,10 @@ function MarketBody({ t, shown, pluginList, installedList, shared, pending, fail
4032
4386
  })), /* @__PURE__ */ h(MarketSection, {
4033
4387
  t,
4034
4388
  titleKey: "panels.market.sectionPlugins",
4389
+ icon: marketSectionIcon("plugins"),
4035
4390
  rows: pluginList,
4391
+ onDefault: setDefault,
4392
+ boardBusy,
4036
4393
  pending,
4037
4394
  failureOf,
4038
4395
  act,
@@ -4041,7 +4398,10 @@ function MarketBody({ t, shown, pluginList, installedList, shared, pending, fail
4041
4398
  }), /* @__PURE__ */ h(MarketSection, {
4042
4399
  t,
4043
4400
  titleKey: installedList.length > 0 && installedList.every((row) => row.local === true) ? "panels.market.sectionLocal" : "panels.market.sectionUnlisted",
4401
+ icon: marketSectionIcon("local"),
4044
4402
  rows: installedList,
4403
+ onDefault: setDefault,
4404
+ boardBusy,
4045
4405
  pending,
4046
4406
  failureOf,
4047
4407
  act,
@@ -4058,7 +4418,7 @@ function MarketBody({ t, shown, pluginList, installedList, shared, pending, fail
4058
4418
  act
4059
4419
  }));
4060
4420
  }
4061
- function MarketView({ t, manifests, capabilities, freshness, onChanged, updates, installed, installedRead, plugins, settling, mock }) {
4421
+ function MarketView({ t, manifests, capabilities, freshness, onChanged, updates, installed, installedRead, workbench, plugins, settling, mock, defaults = [], changed = {} }) {
4062
4422
  const [titles, setTitles] = useState(/* @__PURE__ */ new Map());
4063
4423
  useEffect(() => {
4064
4424
  if (mock === void 0) setTitles((known) => mergeTitles(known, manifests));
@@ -4066,87 +4426,72 @@ function MarketView({ t, manifests, capabilities, freshness, onChanged, updates,
4066
4426
  const catalog = mock?.manifests ?? manifests;
4067
4427
  const effective = mock === void 0 ? capabilities : mock.capabilities;
4068
4428
  const source = liveManifests(catalog, effective, mock === void 0 && installed !== void 0 ? new Set(installed.map((item) => item.unit)) : null);
4069
- const rows = marketRows(source, effective, mock?.updates ?? updates ?? {});
4429
+ const byDefault = new Set(defaults);
4430
+ const rows = marketRows(source, effective, mock?.updates ?? updates ?? {}, byDefault, changed);
4070
4431
  const shared = sharedRows(source, effective);
4071
4432
  const [pending, setPending] = useState(mock?.pending ?? null);
4072
4433
  const provision = useHostWrite({
4073
4434
  channel: "provision",
4074
4435
  networkText: t("panels.failed")
4075
4436
  });
4437
+ const boardWrite = useHostWrite({
4438
+ channel: "prefs",
4439
+ resource: "panels",
4440
+ networkText: t("panels.failed")
4441
+ });
4442
+ const [boardBusy, setBoardBusy] = useState(false);
4443
+ const setDefault = async (id, next) => {
4444
+ if (mock !== void 0) return;
4445
+ setBoardBusy(true);
4446
+ const outcome = await boardWrite.send({
4447
+ action: next ? "show" : "hide",
4448
+ id,
4449
+ scope: "machine"
4450
+ });
4451
+ setBoardBusy(false);
4452
+ if (!outcome.ok) setNotice(t("panels.failed"));
4453
+ };
4076
4454
  const [confirming, setConfirming] = useState(mock?.confirming ?? null);
4077
4455
  const [failed, setFailed] = useState(mock?.failure ?? null);
4078
4456
  const [notice, setNotice] = useState(mock?.notice ?? null);
4079
4457
  const removing = pending !== null && pending.action === "remove-bundle" && failed?.id !== pending.id ? pending.id : null;
4080
- const installedList = installedRows((mock?.installed ?? installed ?? []).filter((module) => !(settling?.has(module.unit) ?? false) && module.unit !== removing), catalog, new Set(rows.map((row) => row.id)), titles);
4081
- const pendingRow = removing === null || pending === null || rows.some((row) => row.id === removing) ? void 0 : {
4082
- id: removing,
4083
- titleKey: pending.titleKey ?? titles.get(removing) ?? removing,
4084
- state: "installed",
4085
- canInstall: false,
4086
- canUpdate: false,
4087
- canUninstall: true,
4088
- ...pending.pkg === void 0 ? {} : { pkg: pending.pkg },
4089
- ...pending.version === void 0 ? {} : { version: { installed: pending.version } }
4090
- };
4458
+ const installedList = installedRows((mock?.installed ?? installed ?? []).filter((module) => !(settling?.has(module.unit) ?? false) && module.unit !== removing), catalog, new Set(rows.map((row) => row.id)), titles, byDefault, changed);
4459
+ const pendingRow = pendingRowOf({
4460
+ pending,
4461
+ removing,
4462
+ rows,
4463
+ titles
4464
+ });
4091
4465
  const shown = pendingRow === void 0 ? rows : [...rows, pendingRow];
4092
- const pluginList = installedPluginRows(mock?.plugins ?? plugins ?? []);
4466
+ const self = workbenchRow(mock === void 0 ? workbench : mock.workbench);
4467
+ const pluginList = installedPluginRows(mock?.plugins ?? plugins ?? [], byDefault, changed);
4093
4468
  const rowById = new Map([
4094
4469
  ...shown,
4470
+ ...self === void 0 ? [] : [self],
4095
4471
  ...installedList,
4096
4472
  ...pluginList
4097
4473
  ].map((row) => [row.id, row]));
4098
4474
  const confirmingRow = confirming === null ? void 0 : rowById.get(confirming);
4099
- const act = async (id, action) => {
4100
- if (mock !== void 0) return;
4101
- const row = rowById.get(id);
4102
- setPending({
4103
- id,
4104
- action,
4105
- ...row?.titleKey === void 0 ? {} : { titleKey: row.titleKey },
4106
- ...row?.pkg === void 0 ? {} : { pkg: row.pkg },
4107
- ...row?.version?.installed === void 0 ? {} : { version: row.version.installed }
4108
- });
4109
- setConfirming(null);
4110
- setFailed(null);
4111
- if (action !== "uninstall-plugin") setNotice(null);
4112
- const dependency = action === "update-dependency";
4113
- const byName = action === "remove-bundle" || action === "update-plugin" || action === "uninstall-plugin";
4114
- const outcome = await provision.send(dependency ? {
4115
- action,
4116
- id
4117
- } : byName ? {
4118
- action,
4119
- name: row?.pkg ?? ""
4120
- } : {
4121
- action,
4122
- unit: id
4123
- });
4124
- setPending(null);
4125
- if (!outcome.ok) {
4126
- onChanged();
4127
- setFailed({
4128
- id,
4129
- message: t("panels.market.failed", { reason: outcome.message })
4130
- });
4131
- return;
4132
- }
4133
- if (action === "uninstall-plugin") {
4134
- const kept = installedPluginKept(outcome.value);
4135
- setNotice(kept === void 0 ? null : t(kept.key, kept.names === void 0 ? {} : { names: kept.names.join(t("panels.market.listSeparator")) }));
4136
- }
4137
- const reason = changeFailure(changeOf(outcome.value), t);
4138
- onChanged();
4139
- if (reason !== void 0) setFailed({
4140
- id,
4141
- message: t("panels.market.failed", { reason })
4142
- });
4143
- };
4144
- const settled = freshness.loaded && installedRead !== false;
4145
- const nothing = shown.length === 0 && installedList.length === 0 && pluginList.length === 0;
4475
+ const act = marketActOf({
4476
+ t,
4477
+ mocked: mock !== void 0,
4478
+ rowOf: (id) => rowById.get(id),
4479
+ seats: {
4480
+ setPending,
4481
+ setConfirming,
4482
+ setFailed,
4483
+ setNotice
4484
+ },
4485
+ send: (body) => provision.send(body),
4486
+ onChanged
4487
+ });
4488
+ const settled = marketSettled(freshness, installedRead);
4489
+ const nothing = shown.length === 0 && self === void 0 && installedList.length === 0 && pluginList.length === 0;
4146
4490
  if (!settled || (settling?.size ?? 0) > 0 && shown.length === 0 && installedList.length === 0) return /* @__PURE__ */ h(MarketChecking, { t });
4147
4491
  if (nothing) return /* @__PURE__ */ h(MarketEmpty, { t });
4148
4492
  return /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(MarketBody, {
4149
4493
  t,
4494
+ self,
4150
4495
  shown,
4151
4496
  pluginList,
4152
4497
  installedList,
@@ -4155,7 +4500,9 @@ function MarketView({ t, manifests, capabilities, freshness, onChanged, updates,
4155
4500
  failed,
4156
4501
  notice,
4157
4502
  act,
4158
- onConfirming: setConfirming
4503
+ onConfirming: setConfirming,
4504
+ setDefault,
4505
+ boardBusy
4159
4506
  }), /* @__PURE__ */ h(ConfirmUninstall, {
4160
4507
  key: confirming ?? "",
4161
4508
  t,
@@ -4171,6 +4518,182 @@ function MarketView({ t, manifests, capabilities, freshness, onChanged, updates,
4171
4518
  }));
4172
4519
  }
4173
4520
  //#endregion
4521
+ //#region src/modules/sessions/model/session-node.ts
4522
+ function visiblePendingKind(kind) {
4523
+ switch (kind) {
4524
+ case "approval":
4525
+ case "plan-review":
4526
+ case "question": return kind;
4527
+ default: return;
4528
+ }
4529
+ }
4530
+ function sessionNode(summary, statusById, list, pinnedIds, archivedIds) {
4531
+ const status = statusById.get(summary.id);
4532
+ const catalog = list.projectionsBySession[summary.id]?.values?.subagentCatalog;
4533
+ let runningSubagentCount = 0;
4534
+ for (const child of catalog ?? []) {
4535
+ const childStatus = statusById.get(child.id);
4536
+ const childRow = list.byId[child.id];
4537
+ if ((childStatus?.running ?? childRow?.running) === true) runningSubagentCount += 1;
4538
+ }
4539
+ return {
4540
+ id: summary.id,
4541
+ title: summary.blank ? "" : summary.displayTitle,
4542
+ blank: summary.blank,
4543
+ running: status?.running ?? summary.running,
4544
+ runningSubagentCount,
4545
+ completed: status?.completionUnread === true,
4546
+ pinned: !archivedIds.has(summary.id) && pinnedIds.has(summary.id),
4547
+ updatedAt: summary.updatedAt,
4548
+ pendingInteraction: visiblePendingKind(status?.pendingInteraction?.kind)
4549
+ };
4550
+ }
4551
+ function sessionStatuses(node, t) {
4552
+ const subagents = node.runningSubagentCount > 0 ? {
4553
+ state: "ongoing",
4554
+ label: t(node.runningSubagentCount === 1 ? "status.subagentsRunning.one" : "status.subagentsRunning.other", { n: node.runningSubagentCount })
4555
+ } : void 0;
4556
+ let pending;
4557
+ switch (node.pendingInteraction) {
4558
+ case "approval":
4559
+ pending = {
4560
+ state: "warning",
4561
+ label: t("status.waitingApproval")
4562
+ };
4563
+ break;
4564
+ case "plan-review":
4565
+ pending = {
4566
+ state: "warning",
4567
+ label: t("status.planReview")
4568
+ };
4569
+ break;
4570
+ case "question":
4571
+ pending = {
4572
+ state: "warning",
4573
+ label: t("status.waitingAnswer")
4574
+ };
4575
+ break;
4576
+ default: pending = void 0;
4577
+ }
4578
+ if (pending !== void 0) return subagents === void 0 ? [pending] : [pending, subagents];
4579
+ if (node.running) {
4580
+ const primary = {
4581
+ state: "ongoing",
4582
+ label: t("status.running")
4583
+ };
4584
+ return subagents === void 0 ? [primary] : [primary, subagents];
4585
+ }
4586
+ if (subagents !== void 0) return [subagents];
4587
+ if (node.completed) return [{
4588
+ state: "done",
4589
+ label: t("status.completed")
4590
+ }];
4591
+ return [{
4592
+ state: "idle",
4593
+ label: t("status.idle")
4594
+ }];
4595
+ }
4596
+ function currentSessionId(list, panelActive) {
4597
+ if (panelActive) return void 0;
4598
+ return Object.values(list.byId).find((session) => (session.retainedBy?.mainView ?? 0) > 0)?.id;
4599
+ }
4600
+ function orderSessionRows(rows, pinnedIds, archivedIds) {
4601
+ const placeholders = [];
4602
+ const leading = [];
4603
+ const rest = [];
4604
+ for (const row of rows) if (row.blank) placeholders.push(row);
4605
+ else if (!archivedIds.has(row.id) && pinnedIds.has(row.id)) leading.push(row);
4606
+ else rest.push(row);
4607
+ return [
4608
+ ...placeholders,
4609
+ ...leading,
4610
+ ...rest
4611
+ ];
4612
+ }
4613
+ function workspaceOfSession(workspaces, sessionId) {
4614
+ if (sessionId === void 0) return null;
4615
+ return workspaces.find((workspace) => workspace.sessionIds.includes(sessionId)) ?? null;
4616
+ }
4617
+ function sessionRows(workspaceSessionIds, list, archivedIds, current) {
4618
+ const rows = [];
4619
+ for (const id of workspaceSessionIds) {
4620
+ if (archivedIds.has(id)) continue;
4621
+ const row = list.byId[id];
4622
+ if (row === void 0 || row.origin === "subagent") continue;
4623
+ if (row.blank && row.id !== current) continue;
4624
+ rows.push(row);
4625
+ }
4626
+ return rows;
4627
+ }
4628
+ //#endregion
4629
+ //#region src/app/layouts/project-selection.ts
4630
+ var listeners$1 = /* @__PURE__ */ new Set();
4631
+ function selectedProjectId() {
4632
+ const stored = readText(STORAGE_KEY_PROJECT);
4633
+ return stored === "" ? null : stored;
4634
+ }
4635
+ function selectProject(workspaceId) {
4636
+ writeText(STORAGE_KEY_PROJECT, workspaceId);
4637
+ for (const listener of [...listeners$1]) try {
4638
+ listener();
4639
+ } catch {}
4640
+ }
4641
+ function subscribeProject(listener) {
4642
+ listeners$1.add(listener);
4643
+ return () => {
4644
+ listeners$1.delete(listener);
4645
+ };
4646
+ }
4647
+ //#endregion
4648
+ //#region src/app/layouts/rightbar/use-panels.ts
4649
+ function shouldDropPanels(workspace, previous) {
4650
+ return workspace !== previous;
4651
+ }
4652
+ function useEnabledUnits(refreshToken, workspace) {
4653
+ const [enabled, setEnabled] = useState(null);
4654
+ const lastWorkspace = useRef(workspace);
4655
+ useEffect(() => {
4656
+ let cancelled = false;
4657
+ if (shouldDropPanels(workspace, lastWorkspace.current)) {
4658
+ lastWorkspace.current = workspace;
4659
+ setEnabled(null);
4660
+ }
4661
+ const read = async () => {
4662
+ const response = await apiGet("panels", workspace === null ? {} : { path: workspace }).catch(() => null);
4663
+ if (cancelled) return;
4664
+ if (response?.ok === true && Array.isArray(response.units)) setEnabled({
4665
+ units: response.units,
4666
+ plugins: Array.isArray(response.plugins) ? response.plugins : [],
4667
+ defaults: Array.isArray(response.defaults) ? response.defaults : [],
4668
+ own: response.own === true,
4669
+ changed: response.changed ?? {}
4670
+ });
4671
+ };
4672
+ read();
4673
+ return () => {
4674
+ cancelled = true;
4675
+ };
4676
+ }, [
4677
+ refreshToken,
4678
+ useFactRevision("panels"),
4679
+ workspace
4680
+ ]);
4681
+ return enabled;
4682
+ }
4683
+ function useSelectedProjectId() {
4684
+ const [id, setId] = useState(() => selectedProjectId());
4685
+ useEffect(() => subscribeProject(() => setId(selectedProjectId())), []);
4686
+ return id;
4687
+ }
4688
+ function useBoardWorkspace(workspaces, sessions) {
4689
+ const projectId = useSelectedProjectId();
4690
+ const workspace = workspaces.items.find((item) => item.workspaceId === projectId) ?? workspaceOfSession(workspaces.items, currentSessionId(sessions, false));
4691
+ return {
4692
+ workspace,
4693
+ path: workspace?.path ?? null
4694
+ };
4695
+ }
4696
+ //#endregion
4174
4697
  //#region src/shared/api/bundle-install.ts
4175
4698
  var BUNDLE_REGISTRIES_ROUTE = "bundle-registries";
4176
4699
  var BUNDLE_INSPECT_ROUTE = "bundle-inspect";
@@ -4200,10 +4723,11 @@ function readInstalledPlugins(force = false) {
4200
4723
  var state = {
4201
4724
  modules: null,
4202
4725
  plugins: null,
4726
+ workbench: null,
4203
4727
  read: false,
4204
4728
  checkedAt: null
4205
4729
  };
4206
- var listeners$1 = /* @__PURE__ */ new Set();
4730
+ var listeners = /* @__PURE__ */ new Set();
4207
4731
  var inFlight = null;
4208
4732
  var readSeq = 0;
4209
4733
  var newestForceSeq = -1;
@@ -4211,14 +4735,14 @@ function moduleVersionsValue() {
4211
4735
  return state;
4212
4736
  }
4213
4737
  function subscribeModuleVersions(listener) {
4214
- listeners$1.add(listener);
4738
+ listeners.add(listener);
4215
4739
  return () => {
4216
- listeners$1.delete(listener);
4740
+ listeners.delete(listener);
4217
4741
  };
4218
4742
  }
4219
4743
  function publish(next) {
4220
4744
  state = next;
4221
- for (const listener of [...listeners$1]) listener();
4745
+ for (const listener of [...listeners]) listener();
4222
4746
  }
4223
4747
  function runModuleVersionsRead(force = false) {
4224
4748
  if (inFlight !== null && inFlight.force === force) return inFlight.promise;
@@ -4231,6 +4755,7 @@ function runModuleVersionsRead(force = false) {
4231
4755
  publish({
4232
4756
  modules: versions?.ok === true ? versions.modules : state.modules,
4233
4757
  plugins: plugins?.ok === true ? plugins.plugins : state.plugins,
4758
+ workbench: versions?.ok === true ? versions.workbench ?? null : state.workbench,
4234
4759
  read: true,
4235
4760
  checkedAt: Date.now()
4236
4761
  });
@@ -4263,6 +4788,7 @@ function useModuleVersions() {
4263
4788
  return {
4264
4789
  modules: value.modules,
4265
4790
  plugins: value.plugins,
4791
+ workbench: value.workbench,
4266
4792
  read: value.read,
4267
4793
  checkedAt: value.checkedAt,
4268
4794
  reload
@@ -4487,7 +5013,9 @@ function AddModulePreview({ t, state }) {
4487
5013
  const preview = state.preview;
4488
5014
  if (preview === null) return null;
4489
5015
  const source = preview.registry === "" ? t("panels.market.add.registryDefault") : preview.registry;
4490
- return /* @__PURE__ */ h("div", { className: AddModule_module_default.body }, /* @__PURE__ */ h("div", { className: AddModule_module_default.subject }, /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectName }, preview.name), preview.version === "" ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectMeta }, t("panels.market.add.installVersion", { version: preview.version })), preview.description === "" ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectDesc }, preview.description), /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectMeta }, source)));
5016
+ const plugin = preview.kind === "plugin";
5017
+ const pluginName = plugin ? preview.pluginName : void 0;
5018
+ return /* @__PURE__ */ h("div", { className: AddModule_module_default.body }, /* @__PURE__ */ h("div", { className: AddModule_module_default.subject }, /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectName }, preview.name), preview.version === "" ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectMeta }, t("panels.market.add.installVersion", { version: preview.version })), pluginName === void 0 || pluginName === preview.name ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectMeta }, t("panels.market.add.pluginAlias", { name: pluginName })), preview.description === "" ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectDesc }, preview.description), /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectMeta }, source)), plugin ? /* @__PURE__ */ h("p", { className: AddModule_module_default.result }, t("panels.market.add.pluginPreview")) : null);
4491
5019
  }
4492
5020
  function AddModuleResult({ t, state }) {
4493
5021
  const outcome = state.outcome;
@@ -4495,26 +5023,27 @@ function AddModuleResult({ t, state }) {
4495
5023
  const reason = failureReason(failureCode(outcome.change), outcome.change.application, t);
4496
5024
  const supply = supplyKey(outcome.supply.state);
4497
5025
  const builds = state.builds;
4498
- const failed = outcome.change.application === "failed";
4499
- const restart = outcome.change.application === "restart-required";
4500
- const cancelled = outcome.change.application === "cancelled";
4501
- const notModule = outcome.supply.state === "not-a-module";
4502
5026
  const plugin = outcome.plugin;
5027
+ const kind = resultKindOf({
5028
+ change: outcome.change,
5029
+ supplyState: outcome.supply.state,
5030
+ plugin: plugin !== void 0
5031
+ });
4503
5032
  const name = outcome.module.kind === "module" ? outcome.module.unit : outcome.module.pkg;
4504
5033
  return /* @__PURE__ */ h("div", { className: AddModule_module_default.body }, /* @__PURE__ */ h("div", { className: AddModule_module_default.hero }, /* @__PURE__ */ h("span", {
4505
5034
  className: AddModule_module_default.heroIcon,
4506
- "data-state": failed ? "error" : cancelled ? "idle" : "done",
5035
+ "data-state": kind === "failed" ? "error" : kind === "cancelled" ? "idle" : "done",
4507
5036
  "aria-hidden": "true"
4508
- }, failed ? /* @__PURE__ */ h(IconWarningOutlineRegular, { size: 28 }) : cancelled ? /* @__PURE__ */ h(StateDot, {
5037
+ }, kind === "failed" ? /* @__PURE__ */ h(IconWarningOutlineRegular, { size: 28 }) : kind === "cancelled" ? /* @__PURE__ */ h(StateDot, {
4509
5038
  state: "idle",
4510
5039
  size: 28
4511
5040
  }) : /* @__PURE__ */ h(IconCheckCircleFillRegular, { size: 28 })), /* @__PURE__ */ h("h2", {
4512
5041
  className: AddModule_module_default.wizardTitle,
4513
- role: failed ? "alert" : "status"
4514
- }, failed ? t("panels.market.add.failedTitle") : cancelled ? t("panels.market.add.cancelledTitle") : t("panels.market.add.installedTitle"))), /* @__PURE__ */ h("div", { className: AddModule_module_default.subject }, /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectName }, outcome.module.pkg), name === outcome.module.pkg ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectMeta }, name), outcome.module.version === void 0 ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectMeta }, t("panels.market.add.installVersion", { version: outcome.module.version }))), plugin !== void 0 ? /* @__PURE__ */ h("p", { className: AddModule_module_default.result }, t("panels.market.add.installedPlugin", { name: plugin.name ?? plugin.pkg })) : failed ? /* @__PURE__ */ h("p", {
5042
+ role: kind === "failed" ? "alert" : "status"
5043
+ }, kind === "failed" ? t("panels.market.add.failedTitle") : kind === "cancelled" ? t("panels.market.add.cancelledTitle") : t("panels.market.add.installedTitle"))), /* @__PURE__ */ h("div", { className: AddModule_module_default.subject }, /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectName }, outcome.module.pkg), name === outcome.module.pkg ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectMeta }, name), outcome.module.version === void 0 ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.subjectMeta }, t("panels.market.add.installVersion", { version: outcome.module.version }))), kind === "plugin" && plugin !== void 0 ? /* @__PURE__ */ h("p", { className: AddModule_module_default.result }, t("panels.market.add.installedPlugin", { name: plugin.name ?? plugin.pkg })) : kind === "failed" ? /* @__PURE__ */ h("p", {
4515
5044
  className: AddModule_module_default.resultWarn,
4516
5045
  role: "alert"
4517
- }, t("panels.market.add.failed", { reason })) : restart ? /* @__PURE__ */ h("p", { className: AddModule_module_default.resultWarn }, t("panels.market.add.doneRestart")) : cancelled || notModule ? 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" && (failed || 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)));
5046
+ }, t("panels.market.add.failed", { reason })) : kind === "restart" ? /* @__PURE__ */ h("p", { className: AddModule_module_default.resultWarn }, t("panels.market.add.doneRestart")) : 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)));
4518
5047
  }
4519
5048
  //#endregion
4520
5049
  //#region src/app/layouts/market/add-module-mock.ts
@@ -4591,6 +5120,7 @@ var ADD_MODULE_MOCKS = [
4591
5120
  phase: "preview",
4592
5121
  spec: "@dsh-workbench/module-hello",
4593
5122
  preview: {
5123
+ kind: "module",
4594
5124
  name: "@dsh-workbench/module-hello",
4595
5125
  version: "0.1.2",
4596
5126
  description: "最小样本模块:一枚「你好」卡片",
@@ -4603,12 +5133,27 @@ var ADD_MODULE_MOCKS = [
4603
5133
  phase: "preview",
4604
5134
  spec: "@dsh-workbench/module-hello",
4605
5135
  preview: {
5136
+ kind: "module",
4606
5137
  name: "@dsh-workbench/module-hello",
4607
5138
  version: "",
4608
5139
  description: "",
4609
5140
  registry: ""
4610
5141
  }
4611
5142
  },
5143
+ {
5144
+ id: "preview-plugin",
5145
+ label: "预览(opencli 插件)",
5146
+ phase: "preview",
5147
+ spec: "opencli-plugin-grafana",
5148
+ preview: {
5149
+ kind: "plugin",
5150
+ name: "opencli-plugin-grafana",
5151
+ version: "1.0.16",
5152
+ description: "",
5153
+ registry: "registry.npmmirror.com",
5154
+ pluginName: "grafana"
5155
+ }
5156
+ },
4612
5157
  {
4613
5158
  id: "installing",
4614
5159
  label: "正在安装(可取消)",
@@ -4898,12 +5443,7 @@ function useAddModule(options) {
4898
5443
  setPhase("idle");
4899
5444
  return;
4900
5445
  }
4901
- setPreview({
4902
- name: inspection.name ?? wanted,
4903
- version: inspection.version ?? "",
4904
- description: inspection.description ?? "",
4905
- registry: inspection.registry ?? ""
4906
- });
5446
+ setPreview(previewOf(inspection, wanted));
4907
5447
  setPhase("preview");
4908
5448
  });
4909
5449
  }, [spec, registry]);
@@ -5125,8 +5665,8 @@ function makeMarketEntryIcon(units) {
5125
5665
  return function MarketEntryIcon({ size = 16 }) {
5126
5666
  const manifests = useLiveManifests(units);
5127
5667
  const { capabilities } = useCapabilityMap(0);
5128
- const { modules } = useModuleVersions();
5129
- const hasUpdates = marketHintVisible(manifests, capabilities, modules);
5668
+ const { modules, workbench } = useModuleVersions();
5669
+ const hasUpdates = marketHintVisible(manifests, capabilities, modules, workbench);
5130
5670
  useEffect(() => {
5131
5671
  publishPanelHint(MARKET_PANEL_ID, hasUpdates ? { labelKey: "panels.market.hasNew" } : null);
5132
5672
  return () => publishPanelHint(MARKET_PANEL_ID, null);
@@ -5137,8 +5677,10 @@ function makeMarketEntryIcon(units) {
5137
5677
  function MarketPanel({ t, units }) {
5138
5678
  const manifests = useLiveManifests(units);
5139
5679
  const { capabilities, checkedAt, checking, forceProbe, reload: reloadCapability } = useCapabilityMap(0);
5140
- const { modules, plugins, read: installedRead, reload: reloadVersions } = useModuleVersions();
5680
+ const { modules, plugins, workbench, read: installedRead, reload: reloadVersions } = useModuleVersions();
5681
+ const machineBoard = useEnabledUnits(0, null);
5141
5682
  const [adding, setAdding] = useState(false);
5683
+ const openAddModule = useCallback(() => setAdding(true), []);
5142
5684
  const updates = useMemo(() => marketUpdatesOf(modules), [modules]);
5143
5685
  const installed = modules === null ? void 0 : withClientRefusals(modules, units.refusals());
5144
5686
  const reload = useCallback(() => {
@@ -5197,11 +5739,14 @@ function MarketPanel({ t, units }) {
5197
5739
  });
5198
5740
  const mock = fixturePick.enabled ? fixturePick.current : void 0;
5199
5741
  const mockNonce = fixturePick.nonce;
5742
+ const shownFreshness = mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS;
5743
+ const shownRead = mock === void 0 ? installedRead : mock.installedRead ?? true;
5744
+ const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking;
5200
5745
  return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketPage }, /* @__PURE__ */ h("header", { className: MarketPage_module_default.marketPageHead }, /* @__PURE__ */ h("div", null, /* @__PURE__ */ h("h1", { className: MarketPage_module_default.marketPageTitle }, t("panels.tab.market")), /* @__PURE__ */ h("p", { className: MarketPage_module_default.marketPageIntro }, t("panels.market.lead"))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketPageTools }, /* @__PURE__ */ h(Tip, { label: t("panels.market.recheck") }, /* @__PURE__ */ h("button", {
5201
5746
  type: "button",
5202
- className: `${MarketPage_module_default.marketIconButton}${checking ? ` ${MarketPage_module_default.marketIconButtonSpinning}` : ""}`,
5747
+ className: `${MarketPage_module_default.marketIconButton}${shownFreshness.checking ? ` ${MarketPage_module_default.marketIconButtonSpinning}` : ""}`,
5203
5748
  "aria-label": t("panels.market.checkUpdates"),
5204
- disabled: checking,
5749
+ disabled: busy,
5205
5750
  onClick: () => {
5206
5751
  forceProbe();
5207
5752
  reloadVersions({ force: true });
@@ -5214,7 +5759,8 @@ function MarketPanel({ t, units }) {
5214
5759
  size: "sm",
5215
5760
  className: MarketPage_module_default.marketAddButton,
5216
5761
  icon: /* @__PURE__ */ h(IconPlusOutlineRegular, { size: 13 }),
5217
- onClick: () => setAdding(true)
5762
+ disabled: busy,
5763
+ onClick: openAddModule
5218
5764
  }, t("panels.market.add.open")))), fixturePick.enabled ? /* @__PURE__ */ h(MockStrip, {
5219
5765
  mocks: marketMocks,
5220
5766
  index: fixturePick.index,
@@ -5224,14 +5770,17 @@ function MarketPanel({ t, units }) {
5224
5770
  t,
5225
5771
  manifests,
5226
5772
  capabilities,
5227
- freshness: mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS,
5773
+ freshness: shownFreshness,
5228
5774
  onChanged: reload,
5229
5775
  updates,
5230
5776
  installed,
5231
- installedRead: mock === void 0 ? installedRead : mock.installedRead ?? true,
5777
+ installedRead: shownRead,
5778
+ workbench,
5232
5779
  plugins,
5233
5780
  settling: mock === void 0 ? settling : void 0,
5234
- mock
5781
+ mock,
5782
+ defaults: machineBoard?.defaults ?? [],
5783
+ changed: machineBoard?.changed ?? {}
5235
5784
  }), /* @__PURE__ */ h(AddModuleDialog, {
5236
5785
  t,
5237
5786
  open: adding,
@@ -5256,25 +5805,6 @@ function registerMarketPanel(ctx, units) {
5256
5805
  }, MarketPanel));
5257
5806
  }
5258
5807
  //#endregion
5259
- //#region src/app/layouts/project-selection.ts
5260
- var listeners = /* @__PURE__ */ new Set();
5261
- function selectedProjectId() {
5262
- const stored = readText(STORAGE_KEY_PROJECT);
5263
- return stored === "" ? null : stored;
5264
- }
5265
- function selectProject(workspaceId) {
5266
- writeText(STORAGE_KEY_PROJECT, workspaceId);
5267
- for (const listener of [...listeners]) try {
5268
- listener();
5269
- } catch {}
5270
- }
5271
- function subscribeProject(listener) {
5272
- listeners.add(listener);
5273
- return () => {
5274
- listeners.delete(listener);
5275
- };
5276
- }
5277
- //#endregion
5278
5808
  //#region src/shared/api/diy.ts
5279
5809
  var DIY_PRESET_ID = "workbench-diy";
5280
5810
  var WORKSHOP_TITLE = "工作台DIY";
@@ -6212,20 +6742,26 @@ function BoardMockStrip({ fixtures, show }) {
6212
6742
  });
6213
6743
  }
6214
6744
  var ModulesPage_module_default = {
6215
- trigger: "_trigger_1weg4_1",
6216
- pop: "_pop_1weg4_7",
6217
- head: "_head_1weg4_21",
6218
- title: "_title_1weg4_29",
6219
- reset: "_reset_1weg4_37",
6220
- list: "_list_1weg4_59",
6221
- row: "_row_1weg4_68",
6222
- rowOver: "_rowOver_1weg4_83",
6223
- ghost: "_ghost_1weg4_93",
6224
- grip: "_grip_1weg4_108",
6225
- label: "_label_1weg4_116",
6226
- name: "_name_1weg4_123",
6227
- error: "_error_1weg4_134",
6228
- dep: "_dep_1weg4_142"
6745
+ trigger: "_trigger_1yptb_1",
6746
+ pop: "_pop_1yptb_6",
6747
+ head: "_head_1yptb_20",
6748
+ title: "_title_1yptb_28",
6749
+ rowControls: "_rowControls_1yptb_36",
6750
+ followBox: "_followBox_1yptb_43",
6751
+ switchFollowing: "_switchFollowing_1yptb_49",
6752
+ reset: "_reset_1yptb_53",
6753
+ list: "_list_1yptb_75",
6754
+ row: "_row_1yptb_36",
6755
+ rowOver: "_rowOver_1yptb_99",
6756
+ ghost: "_ghost_1yptb_109",
6757
+ grip: "_grip_1yptb_124",
6758
+ label: "_label_1yptb_132",
6759
+ name: "_name_1yptb_139",
6760
+ error: "_error_1yptb_150",
6761
+ dep: "_dep_1yptb_158",
6762
+ pluginList: "_pluginList_1yptb_166",
6763
+ pluginRow: "_pluginRow_1yptb_171",
6764
+ plugin: "_plugin_1yptb_166"
6229
6765
  };
6230
6766
  //#endregion
6231
6767
  //#region src/app/layouts/rightbar/panel-mock.ts
@@ -6238,6 +6774,23 @@ function row$1(id, titleKey, shown) {
6238
6774
  hasCard: true
6239
6775
  };
6240
6776
  }
6777
+ function plugin(id, pkg, title, shown) {
6778
+ return {
6779
+ id,
6780
+ pkg,
6781
+ title,
6782
+ shown,
6783
+ source: "user"
6784
+ };
6785
+ }
6786
+ var PLUGIN_MOCK = {
6787
+ id: "plugin",
6788
+ label: "opencli 插件行(标出是插件,能开能关)",
6789
+ units: [],
6790
+ plugins: [plugin("plugin:opencli-plugin-cmdb", "opencli-plugin-cmdb", "cmdb", true), plugin("plugin:opencli-plugin-notes", "opencli-plugin-notes", "notes", false)],
6791
+ capabilities: {},
6792
+ expect: { rows: 0 }
6793
+ };
6241
6794
  function probe(unit, status) {
6242
6795
  return { [unit]: {
6243
6796
  unit,
@@ -6255,7 +6808,7 @@ function buildPanelMocks(roster) {
6255
6808
  units: [],
6256
6809
  capabilities: {},
6257
6810
  expect: { rows: 0 }
6258
- }];
6811
+ }, PLUGIN_MOCK];
6259
6812
  const titleKey = found.card?.titleKey ?? found.id;
6260
6813
  const id = found.id;
6261
6814
  const on = row$1(id, titleKey, true);
@@ -6401,7 +6954,8 @@ function buildPanelMocks(roster) {
6401
6954
  rows: 3,
6402
6955
  on: true
6403
6956
  }
6404
- }
6957
+ },
6958
+ PLUGIN_MOCK
6405
6959
  ];
6406
6960
  }
6407
6961
  //#endregion
@@ -6421,6 +6975,29 @@ function panelBadgeKey(capability) {
6421
6975
  if (capability.status === "missing-commands") return "panels.dep.missingCommands";
6422
6976
  return "panels.dep.unchecked";
6423
6977
  }
6978
+ function moduleRow(unit, capability) {
6979
+ const badge = panelBadgeKey(capability);
6980
+ return {
6981
+ id: unit.id,
6982
+ titleKey: unit.titleKey,
6983
+ plugin: false,
6984
+ ...badge === void 0 ? {} : { badgeKey: badge },
6985
+ shown: unit.shown,
6986
+ source: unit.source
6987
+ };
6988
+ }
6989
+ function pluginRow(plugin) {
6990
+ return {
6991
+ id: plugin.id,
6992
+ title: plugin.title,
6993
+ plugin: true,
6994
+ shown: plugin.shown,
6995
+ source: plugin.source
6996
+ };
6997
+ }
6998
+ function selectPanelRows(units, plugins, capabilities) {
6999
+ return [...selectPanelUnits(units, capabilities).map((unit) => moduleRow(unit, capabilities?.[unit.id])), ...plugins.map(pluginRow)];
7000
+ }
6424
7001
  function selectBoardModules(units, byId, capabilities) {
6425
7002
  if (units === null) return [];
6426
7003
  return units.filter((unit) => unit.shown && available(capabilities?.[unit.id])).map((unit) => byId(unit.id)).filter((module) => module !== void 0);
@@ -6434,13 +7011,56 @@ function aggregateSummaries(summaries) {
6434
7011
  };
6435
7012
  }
6436
7013
  //#endregion
7014
+ //#region src/app/layouts/rightbar/PanelRowControls.tsx
7015
+ function PanelRowControls({ t, unit, label, busy, onWrite }) {
7016
+ return /* @__PURE__ */ h("span", { className: ModulesPage_module_default.rowControls }, /* @__PURE__ */ h(Checkbox, {
7017
+ checked: unit.source !== "user",
7018
+ disabled: busy,
7019
+ label: t("panels.followGlobal"),
7020
+ title: t("panels.followGlobalHint"),
7021
+ className: ModulesPage_module_default.followBox,
7022
+ onChange: (next) => onWrite(next ? {
7023
+ action: "follow",
7024
+ id: unit.id
7025
+ } : {
7026
+ action: unit.shown ? "show" : "hide",
7027
+ id: unit.id
7028
+ })
7029
+ }), /* @__PURE__ */ h("span", { className: unit.source === "user" ? void 0 : ModulesPage_module_default.switchFollowing }, /* @__PURE__ */ h(Switch, {
7030
+ checked: unit.shown,
7031
+ label: `${label} · ${unit.shown ? t("panels.enabled") : t("panels.disabled")}`,
7032
+ disabled: busy,
7033
+ onChange: (next) => onWrite({
7034
+ action: next ? "show" : "hide",
7035
+ id: unit.id
7036
+ })
7037
+ })));
7038
+ }
7039
+ //#endregion
7040
+ //#region src/app/layouts/rightbar/PanelPluginRows.tsx
7041
+ function PanelPluginRows({ t, rows, busy, onWrite }) {
7042
+ if (rows.length === 0) return null;
7043
+ return /* @__PURE__ */ h("ul", { className: `${ModulesPage_module_default.list} ${ModulesPage_module_default.pluginList}` }, rows.map((row) => /* @__PURE__ */ h("li", {
7044
+ className: `${ModulesPage_module_default.row} ${ModulesPage_module_default.pluginRow}`,
7045
+ key: row.id
7046
+ }, /* @__PURE__ */ h("span", { "aria-hidden": "true" }), /* @__PURE__ */ h("span", { className: ModulesPage_module_default.label }, /* @__PURE__ */ h("span", { className: ModulesPage_module_default.name }, row.title ?? t(row.titleKey ?? row.id)), /* @__PURE__ */ h("span", { className: ModulesPage_module_default.plugin }, t("panels.rowPlugin"))), /* @__PURE__ */ h(PanelRowControls, {
7047
+ t,
7048
+ unit: row,
7049
+ label: row.title ?? row.id,
7050
+ busy,
7051
+ onWrite
7052
+ }))));
7053
+ }
7054
+ //#endregion
6437
7055
  //#region src/app/layouts/rightbar/ModulesPage.tsx
6438
7056
  var BLANK_DRAG_IMAGE = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
6439
- function ModulesPage({ t, units, workspace, capabilities, loading = false, onOpenMarket, mocked = false, mock }) {
7057
+ function ModulesPage({ t, units, plugins = [], workspace, capabilities, loading = false, onOpenMarket, mocked = false, mock, own = false }) {
6440
7058
  const [drag, setDrag] = useState(mock?.drag ?? null);
6441
7059
  const [busy, setBusy] = useState(mock?.busy ?? false);
6442
7060
  const [failed, setFailed] = useState(mock?.failed ?? false);
6443
- const rows = selectPanelUnits(units, capabilities);
7061
+ const rows = selectPanelRows(units, plugins, capabilities);
7062
+ const modules = rows.filter((row) => !row.plugin);
7063
+ const pluginRows = rows.filter((row) => row.plugin);
6444
7064
  const empty = !loading && rows.length === 0;
6445
7065
  const prefWrite = useHostWrite({
6446
7066
  channel: "prefs",
@@ -6458,9 +7078,10 @@ function ModulesPage({ t, units, workspace, capabilities, loading = false, onOpe
6458
7078
  setBusy(false);
6459
7079
  if (!outcome.ok) setFailed(true);
6460
7080
  };
7081
+ const writeRow = (body) => void write(body);
6461
7082
  const drop = () => {
6462
7083
  if (drag === null) return;
6463
- const moved = rows[drag.from];
7084
+ const moved = modules[drag.from];
6464
7085
  setDrag(null);
6465
7086
  if (moved === void 0 || drag.from === drag.over) return;
6466
7087
  write({
@@ -6469,14 +7090,14 @@ function ModulesPage({ t, units, workspace, capabilities, loading = false, onOpe
6469
7090
  index: drag.over
6470
7091
  });
6471
7092
  };
6472
- const dragging = drag === null ? void 0 : rows[drag.from];
7093
+ const dragging = drag === null ? void 0 : modules[drag.from];
6473
7094
  return /* @__PURE__ */ h(Fragment, null, drag?.at === void 0 || dragging === void 0 ? null : /* @__PURE__ */ h("div", {
6474
7095
  className: ModulesPage_module_default.ghost,
6475
7096
  style: {
6476
7097
  left: `${drag.at.x + 12}px`,
6477
7098
  top: `${drag.at.y - 12}px`
6478
7099
  }
6479
- }, t(dragging.titleKey)), empty ? /* @__PURE__ */ h(CenteredState, {
7100
+ }, t(dragging.titleKey ?? dragging.id)), empty ? /* @__PURE__ */ h(CenteredState, {
6480
7101
  compact: true,
6481
7102
  icon: null,
6482
7103
  title: t("panels.noneInstalled"),
@@ -6487,60 +7108,59 @@ function ModulesPage({ t, units, workspace, capabilities, loading = false, onOpe
6487
7108
  variant: "outline",
6488
7109
  onClick: onOpenMarket
6489
7110
  }, t("panels.browseMarket"))
6490
- }) : /* @__PURE__ */ h("ul", { className: ModulesPage_module_default.list }, rows.map((unit, index) => {
6491
- const badge = panelBadgeKey(capabilities?.[unit.id]);
6492
- const dep = badge === void 0 ? void 0 : t(badge);
6493
- return /* @__PURE__ */ h("li", {
6494
- className: `${ModulesPage_module_default.row}${drag?.over === index ? ` ${ModulesPage_module_default.rowOver}` : ""}`,
6495
- key: unit.id,
6496
- draggable: true,
6497
- onDragStart: (event) => {
6498
- const blank = new Image();
6499
- blank.src = BLANK_DRAG_IMAGE;
6500
- event.dataTransfer.setDragImage(blank, 0, 0);
6501
- setDrag({
6502
- from: index,
6503
- over: index,
6504
- at: {
6505
- x: event.clientX,
6506
- y: event.clientY
6507
- }
6508
- });
6509
- },
6510
- onDragOver: (event) => {
6511
- event.preventDefault();
6512
- if (drag !== null) setDrag({
6513
- from: drag.from,
6514
- over: index,
6515
- at: {
6516
- x: event.clientX,
6517
- y: event.clientY
6518
- }
6519
- });
6520
- },
6521
- onDragEnd: drop,
6522
- onDrop: (event) => {
6523
- event.preventDefault();
6524
- drop();
6525
- }
6526
- }, /* @__PURE__ */ h(Tip, { label: t("panels.dragHint") }, /* @__PURE__ */ h("span", {
6527
- className: ModulesPage_module_default.grip,
6528
- "aria-hidden": "true"
6529
- }, "⠿")), /* @__PURE__ */ h("span", { className: ModulesPage_module_default.label }, /* @__PURE__ */ h("span", { className: ModulesPage_module_default.name }, t(unit.titleKey)), dep === void 0 ? null : /* @__PURE__ */ h("span", { className: ModulesPage_module_default.dep }, dep)), /* @__PURE__ */ h(Switch, {
6530
- checked: unit.shown,
6531
- label: `${t(unit.titleKey)} · ${unit.shown ? t("panels.enabled") : t("panels.disabled")}`,
6532
- disabled: busy,
6533
- onChange: (next) => void write({
6534
- action: next ? "show" : "hide",
6535
- id: unit.id
6536
- })
6537
- }));
6538
- })), /* @__PURE__ */ h(PanelFoot, { text: t("panels.hintEffect") }, /* @__PURE__ */ h("button", {
7111
+ }) : null, modules.length === 0 ? null : /* @__PURE__ */ h("ul", { className: ModulesPage_module_default.list }, modules.map((row, index) => /* @__PURE__ */ h("li", {
7112
+ className: `${ModulesPage_module_default.row}${drag?.over === index ? ` ${ModulesPage_module_default.rowOver}` : ""}`,
7113
+ key: row.id,
7114
+ draggable: true,
7115
+ onDragStart: (event) => {
7116
+ const blank = new Image();
7117
+ blank.src = BLANK_DRAG_IMAGE;
7118
+ event.dataTransfer.setDragImage(blank, 0, 0);
7119
+ setDrag({
7120
+ from: index,
7121
+ over: index,
7122
+ at: {
7123
+ x: event.clientX,
7124
+ y: event.clientY
7125
+ }
7126
+ });
7127
+ },
7128
+ onDragOver: (event) => {
7129
+ event.preventDefault();
7130
+ if (drag !== null) setDrag({
7131
+ from: drag.from,
7132
+ over: index,
7133
+ at: {
7134
+ x: event.clientX,
7135
+ y: event.clientY
7136
+ }
7137
+ });
7138
+ },
7139
+ onDragEnd: drop,
7140
+ onDrop: (event) => {
7141
+ event.preventDefault();
7142
+ drop();
7143
+ }
7144
+ }, /* @__PURE__ */ h(Tip, { label: t("panels.dragHint") }, /* @__PURE__ */ h("span", {
7145
+ className: ModulesPage_module_default.grip,
7146
+ "aria-hidden": "true"
7147
+ }, "⠿")), /* @__PURE__ */ h("span", { className: ModulesPage_module_default.label }, /* @__PURE__ */ h("span", { className: ModulesPage_module_default.name }, t(row.titleKey ?? row.id)), row.badgeKey === void 0 ? null : /* @__PURE__ */ h("span", { className: ModulesPage_module_default.dep }, t(row.badgeKey))), /* @__PURE__ */ h(PanelRowControls, {
7148
+ t,
7149
+ unit: row,
7150
+ label: t(row.titleKey ?? row.id),
7151
+ busy,
7152
+ onWrite: writeRow
7153
+ })))), /* @__PURE__ */ h(PanelPluginRows, {
7154
+ t,
7155
+ rows: pluginRows,
7156
+ busy,
7157
+ onWrite: writeRow
7158
+ }), /* @__PURE__ */ h(PanelFoot, { text: t("panels.hintEffect") }, own ? /* @__PURE__ */ h("button", {
6539
7159
  type: "button",
6540
7160
  className: ModulesPage_module_default.reset,
6541
7161
  disabled: busy,
6542
7162
  onClick: () => void write({ action: "reset" })
6543
- }, t("panels.reset"))), failed ? /* @__PURE__ */ h("p", { className: ModulesPage_module_default.error }, t("panels.failed")) : null);
7163
+ }, t("panels.followAll")) : null), failed ? /* @__PURE__ */ h("p", { className: ModulesPage_module_default.error }, t("panels.failed")) : null);
6544
7164
  }
6545
7165
  //#endregion
6546
7166
  //#region src/app/layouts/rightbar/PanelModules.tsx
@@ -6572,7 +7192,7 @@ function PanelModules({ t, open, onOpenChange, enabledUnits, workspace, refreshT
6572
7192
  const panelMock = fixturePick.enabled ? fixturePick.current : void 0;
6573
7193
  const mockNonce = fixturePick.nonce;
6574
7194
  useDismissOnOutsidePointer(root, open, onOpenChange);
6575
- const units = enabledUnits ?? [];
7195
+ const units = enabledUnits?.units ?? [];
6576
7196
  return /* @__PURE__ */ h("div", {
6577
7197
  className: ModulesPage_module_default.trigger,
6578
7198
  ref: root
@@ -6597,8 +7217,10 @@ function PanelModules({ t, open, onOpenChange, enabledUnits, workspace, refreshT
6597
7217
  key: `${panelMock?.id ?? "real-modules"}-${mockNonce}`,
6598
7218
  t,
6599
7219
  units: panelMock?.units ?? units,
7220
+ plugins: panelMock?.plugins ?? enabledUnits?.plugins ?? [],
6600
7221
  capabilities: panelMock === void 0 ? fixturePick.enabled ? null : capabilities : panelMock.capabilities,
6601
7222
  loading: enabledUnits === null,
7223
+ own: enabledUnits?.own === true,
6602
7224
  onOpenMarket,
6603
7225
  mocked: fixturePick.enabled,
6604
7226
  workspace,
@@ -6775,114 +7397,6 @@ function rightbarPresentation(input) {
6775
7397
  };
6776
7398
  }
6777
7399
  //#endregion
6778
- //#region src/modules/sessions/model/session-node.ts
6779
- function visiblePendingKind(kind) {
6780
- switch (kind) {
6781
- case "approval":
6782
- case "plan-review":
6783
- case "question": return kind;
6784
- default: return;
6785
- }
6786
- }
6787
- function sessionNode(summary, statusById, list, pinnedIds, archivedIds) {
6788
- const status = statusById.get(summary.id);
6789
- const catalog = list.projectionsBySession[summary.id]?.values?.subagentCatalog;
6790
- let runningSubagentCount = 0;
6791
- for (const child of catalog ?? []) {
6792
- const childStatus = statusById.get(child.id);
6793
- const childRow = list.byId[child.id];
6794
- if ((childStatus?.running ?? childRow?.running) === true) runningSubagentCount += 1;
6795
- }
6796
- return {
6797
- id: summary.id,
6798
- title: summary.blank ? "" : summary.displayTitle,
6799
- blank: summary.blank,
6800
- running: status?.running ?? summary.running,
6801
- runningSubagentCount,
6802
- completed: status?.completionUnread === true,
6803
- pinned: !archivedIds.has(summary.id) && pinnedIds.has(summary.id),
6804
- updatedAt: summary.updatedAt,
6805
- pendingInteraction: visiblePendingKind(status?.pendingInteraction?.kind)
6806
- };
6807
- }
6808
- function sessionStatuses(node, t) {
6809
- const subagents = node.runningSubagentCount > 0 ? {
6810
- state: "ongoing",
6811
- label: t(node.runningSubagentCount === 1 ? "status.subagentsRunning.one" : "status.subagentsRunning.other", { n: node.runningSubagentCount })
6812
- } : void 0;
6813
- let pending;
6814
- switch (node.pendingInteraction) {
6815
- case "approval":
6816
- pending = {
6817
- state: "warning",
6818
- label: t("status.waitingApproval")
6819
- };
6820
- break;
6821
- case "plan-review":
6822
- pending = {
6823
- state: "warning",
6824
- label: t("status.planReview")
6825
- };
6826
- break;
6827
- case "question":
6828
- pending = {
6829
- state: "warning",
6830
- label: t("status.waitingAnswer")
6831
- };
6832
- break;
6833
- default: pending = void 0;
6834
- }
6835
- if (pending !== void 0) return subagents === void 0 ? [pending] : [pending, subagents];
6836
- if (node.running) {
6837
- const primary = {
6838
- state: "ongoing",
6839
- label: t("status.running")
6840
- };
6841
- return subagents === void 0 ? [primary] : [primary, subagents];
6842
- }
6843
- if (subagents !== void 0) return [subagents];
6844
- if (node.completed) return [{
6845
- state: "done",
6846
- label: t("status.completed")
6847
- }];
6848
- return [{
6849
- state: "idle",
6850
- label: t("status.idle")
6851
- }];
6852
- }
6853
- function currentSessionId(list, panelActive) {
6854
- if (panelActive) return void 0;
6855
- return Object.values(list.byId).find((session) => (session.retainedBy?.mainView ?? 0) > 0)?.id;
6856
- }
6857
- function orderSessionRows(rows, pinnedIds, archivedIds) {
6858
- const placeholders = [];
6859
- const leading = [];
6860
- const rest = [];
6861
- for (const row of rows) if (row.blank) placeholders.push(row);
6862
- else if (!archivedIds.has(row.id) && pinnedIds.has(row.id)) leading.push(row);
6863
- else rest.push(row);
6864
- return [
6865
- ...placeholders,
6866
- ...leading,
6867
- ...rest
6868
- ];
6869
- }
6870
- function workspaceOfSession(workspaces, sessionId) {
6871
- if (sessionId === void 0) return null;
6872
- return workspaces.find((workspace) => workspace.sessionIds.includes(sessionId)) ?? null;
6873
- }
6874
- function sessionRows(workspaceSessionIds, list, archivedIds, current) {
6875
- const rows = [];
6876
- for (const id of workspaceSessionIds) {
6877
- if (archivedIds.has(id)) continue;
6878
- const row = list.byId[id];
6879
- if (row === void 0 || row.origin === "subagent") continue;
6880
- if (row.blank && row.id !== current) continue;
6881
- rows.push(row);
6882
- }
6883
- return rows;
6884
- }
6885
- //#endregion
6886
7400
  //#region src/app/layouts/rightbar/suite-world.ts
6887
7401
  function createSuiteWorld(input) {
6888
7402
  const sessionId = currentSessionId(input.sessions, false);
@@ -6898,49 +7412,6 @@ function createSuiteWorld(input) {
6898
7412
  }
6899
7413
  };
6900
7414
  }
6901
- //#endregion
6902
- //#region src/app/layouts/rightbar/use-panels.ts
6903
- function shouldDropPanels(workspace, previous) {
6904
- return workspace !== previous;
6905
- }
6906
- function useEnabledUnits(refreshToken, workspace) {
6907
- const [enabled, setEnabled] = useState(null);
6908
- const lastWorkspace = useRef(workspace);
6909
- useEffect(() => {
6910
- let cancelled = false;
6911
- if (shouldDropPanels(workspace, lastWorkspace.current)) {
6912
- lastWorkspace.current = workspace;
6913
- setEnabled(null);
6914
- }
6915
- const read = async () => {
6916
- const response = await apiGet("panels", workspace === null ? {} : { path: workspace }).catch(() => null);
6917
- if (cancelled) return;
6918
- if (response?.ok === true && Array.isArray(response.units)) setEnabled(response.units);
6919
- };
6920
- read();
6921
- return () => {
6922
- cancelled = true;
6923
- };
6924
- }, [
6925
- refreshToken,
6926
- useFactRevision("panels"),
6927
- workspace
6928
- ]);
6929
- return enabled;
6930
- }
6931
- function useSelectedProjectId() {
6932
- const [id, setId] = useState(() => selectedProjectId());
6933
- useEffect(() => subscribeProject(() => setId(selectedProjectId())), []);
6934
- return id;
6935
- }
6936
- function useBoardWorkspace(workspaces, sessions) {
6937
- const projectId = useSelectedProjectId();
6938
- const workspace = workspaces.items.find((item) => item.workspaceId === projectId) ?? workspaceOfSession(workspaces.items, currentSessionId(sessions, false));
6939
- return {
6940
- workspace,
6941
- path: workspace?.path ?? null
6942
- };
6943
- }
6944
7415
  var Rightbar_module_default = {
6945
7416
  panel: "_panel_135e7_1",
6946
7417
  columns: "_columns_135e7_18",
@@ -7065,13 +7536,14 @@ function Rightbar(props) {
7065
7536
  const { capabilities } = useCapabilityMap(panelToken);
7066
7537
  const board = useBoardWorkspace(workspaces, sessions);
7067
7538
  const boardWorkspace = board.path;
7068
- const enabledUnits = useEnabledUnits(panelToken, boardWorkspace);
7539
+ const panelBoard = useEnabledUnits(panelToken, boardWorkspace);
7540
+ const enabledUnits = panelBoard?.units ?? null;
7069
7541
  const [modulesOpen, setModulesOpen] = useState(false);
7070
7542
  const fixtures = useBoardMock(fixtureRoster(manifests));
7071
7543
  const visibleModules = selectBoardModules(enabledUnits, (id) => modules.byId(id), capabilities);
7072
7544
  const plan = planBoard(fixtures.shape, {
7073
7545
  modules: visibleModules,
7074
- configRead: enabledUnits !== null
7546
+ configRead: panelBoard !== null
7075
7547
  }, fixtureSeed(manifests, modules.all(), crashModeOn(window.location.search)));
7076
7548
  const world = createSuiteWorld({
7077
7549
  workspaces,
@@ -7132,7 +7604,7 @@ function Rightbar(props) {
7132
7604
  onRefresh: refreshPanel,
7133
7605
  modulesOpen,
7134
7606
  onModulesOpenChange: setModulesOpen,
7135
- enabledUnits,
7607
+ enabledUnits: panelBoard,
7136
7608
  manifests,
7137
7609
  workspace: boardWorkspace,
7138
7610
  refreshToken: panelToken,
@@ -8214,7 +8686,7 @@ function messagesOf(units) {
8214
8686
  ...face.messages === void 0 ? {} : { messages: face.messages }
8215
8687
  }));
8216
8688
  }
8217
- 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}\n.wb-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-1);\n}\n.wb-settingsHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n.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-xxs-12-font-size);\n line-height: var(--wb-line-18);\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_z6vtq_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_z6vtq_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_z6vtq_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_z6vtq_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_z6vtq_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_z6vtq_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_z6vtq_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_z6vtq_59::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_z6vtq_39 ._marketVersion_z6vtq_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_z6vtq_73 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_z6vtq_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._marketEnd_z6vtq_95 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._marketActions_z6vtq_102 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketSection_z6vtq_108 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_z6vtq_115 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionTitle_z6vtq_121 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_z6vtq_127 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketProgress_z6vtq_133 {\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_z6vtq_143 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-warn-primary);\n overflow-wrap: anywhere;\n}\n\n._marketFailure_z6vtq_150 {\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_z6vtq_157 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_z6vtq_162 {\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_z6vtq_162 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_z6vtq_180 {\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_z6vtq_188 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_z6vtq_193 {\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_z6vtq_199 {\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_z6vtq_208 {\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_z6vtq_208:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_z6vtq_208:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_z6vtq_233 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_z6vtq_237 svg {\n animation: _wb-spin_z6vtq_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_z6vtq_241 {\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_z6vtq_157 {\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_z6vtq_258 {\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_z6vtq_266 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_z6vtq_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._foot_1us83_1 {\n display: flex;\n align-items: center;\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_1us83_12 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1us83_17 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._wide_1coeb_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_1coeb_8 {\n width: min(var(--wb-len-560), 100%);\n max-height: min(var(--wb-len-800), 100%);\n}\n\n._content_1coeb_13 {\n min-height: 0;\n overflow: auto;\n}\n\n._stack_1coeb_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._body_1coeb_25 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._field_1coeb_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_1coeb_39 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-14);\n}\n\n._registryField_1coeb_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_1coeb_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_1coeb_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_1coeb_59:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._guideToggle_1coeb_59 svg,\n._registryToggle_1coeb_78 svg {\n transition: transform var(--wb-dur-0-12) ease;\n}\n\n._guideToggle_1coeb_59[aria-expanded='true'] svg,\n._registryToggle_1coeb_78[aria-expanded='true'] svg {\n transform: rotate(180deg);\n}\n\n._registryWrap_1coeb_87 {\n position: relative;\n flex: none;\n}\n\n._registryToggle_1coeb_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_1coeb_78:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._registryToggle_1coeb_78:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n._registryToggle_1coeb_78[aria-expanded='true'] {\n border-color: var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n._registryChosen_1coeb_121 {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n._registry_1coeb_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_1coeb_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_1coeb_143 {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wb-len-10);\n}\n\n._registryPick_1coeb_159 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n cursor: pointer;\n}\n\n._registryOption_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_244 {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0;\n min-width: 0;\n}\n\n._guideTitle_1coeb_252 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._guideHint_1coeb_258 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._guideExample_1coeb_264 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._guideExample_1coeb_264 code {\n font-family: var(--dsw-font-mono, monospace);\n}\n\n._guideExampleLabel_1coeb_274 {\n color: var(--dsw-alias-label-caption);\n}\n\n._footer_1coeb_278 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-20);\n width: 100%;\n}\n\n._hero_1coeb_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_1coeb_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_1coeb_294[data-state='done'] {\n color: var(--dsw-alias-state-success-secondary);\n}\n\n._heroIcon_1coeb_294[data-state='error'] {\n color: var(--dsw-alias-state-warn-label);\n}\n\n._pendingTitle_1coeb_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_1coeb_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_1coeb_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_1coeb_337 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n overflow-wrap: anywhere;\n}\n\n._subjectMeta_1coeb_343,\n._subjectDesc_1coeb_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_1coeb_351,\n._resultWarn_1coeb_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_1coeb_352 {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n}\n\n._approval_1coeb_365 {\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_1coeb_375 {\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_1coeb_382 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._approvalCaution_1coeb_388 {\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_1coeb_395 {\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_1coeb_402 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._noteError_1coeb_406 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._problem_1coeb_410 {\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_1coeb_417 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._detail_1coeb_417 {\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._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_1weg4_1 {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n._pop_1weg4_7 {\n position: absolute;\n top: calc(100% + var(--wb-len-8));\n right: 0;\n z-index: var(--wb-z-30);\n width: var(--wb-len-360);\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_1weg4_21 {\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_1weg4_29 {\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._reset_1weg4_37 {\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_1weg4_37:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_1weg4_37:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_1weg4_59 {\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_1weg4_68 {\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: grab;\n}\n\n._row_1weg4_68:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOver_1weg4_83::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_1weg4_93 {\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_1weg4_108 {\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}\n\n._label_1weg4_116 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_1weg4_123 {\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_1weg4_134 {\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_1weg4_142 {\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._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*/";
8689
+ 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}\n.wb-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-1);\n}\n.wb-settingsHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n.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-xxs-12-font-size);\n line-height: var(--wb-line-18);\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_1v8dy_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_1v8dy_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_1v8dy_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_1v8dy_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_1v8dy_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_1v8dy_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_1v8dy_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_1v8dy_59::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_1v8dy_39 ._marketVersion_1v8dy_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_1v8dy_73 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_1v8dy_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._marketEnd_1v8dy_95 {\n flex: none;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: var(--wb-len-4);\n}\n\n._marketSwitchSeat_1v8dy_103 {\n display: inline-flex;\n align-items: center;\n}\n\n._marketIconAction_1v8dy_108 {\n width: var(--wb-len-28);\n padding: 0;\n}\n\n._marketActions_1v8dy_113 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketDefaultNote_1v8dy_119 {\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._marketSelfDivider_1v8dy_126 {\n height: 0;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_1v8dy_131 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_1v8dy_138 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_1v8dy_144 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_1v8dy_151 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_1v8dy_157 {\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_1v8dy_164 {\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_1v8dy_174 {\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_1v8dy_181 {\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_1v8dy_189 {\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_1v8dy_196 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_1v8dy_201 {\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_1v8dy_201 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_1v8dy_219 {\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_1v8dy_227 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_1v8dy_232 {\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_1v8dy_238 {\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_1v8dy_247 {\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_1v8dy_247:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_1v8dy_247:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_1v8dy_272 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_1v8dy_276 svg {\n animation: _wb-spin_1v8dy_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_1v8dy_280 {\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_1v8dy_196 {\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_1v8dy_297 {\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_1v8dy_305 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_1v8dy_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._foot_1us83_1 {\n display: flex;\n align-items: center;\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_1us83_12 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1us83_17 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._wide_1coeb_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_1coeb_8 {\n width: min(var(--wb-len-560), 100%);\n max-height: min(var(--wb-len-800), 100%);\n}\n\n._content_1coeb_13 {\n min-height: 0;\n overflow: auto;\n}\n\n._stack_1coeb_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._body_1coeb_25 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._field_1coeb_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_1coeb_39 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-14);\n}\n\n._registryField_1coeb_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_1coeb_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_1coeb_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_1coeb_59:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._guideToggle_1coeb_59 svg,\n._registryToggle_1coeb_78 svg {\n transition: transform var(--wb-dur-0-12) ease;\n}\n\n._guideToggle_1coeb_59[aria-expanded='true'] svg,\n._registryToggle_1coeb_78[aria-expanded='true'] svg {\n transform: rotate(180deg);\n}\n\n._registryWrap_1coeb_87 {\n position: relative;\n flex: none;\n}\n\n._registryToggle_1coeb_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_1coeb_78:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._registryToggle_1coeb_78:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n._registryToggle_1coeb_78[aria-expanded='true'] {\n border-color: var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n._registryChosen_1coeb_121 {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n._registry_1coeb_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_1coeb_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_1coeb_143 {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wb-len-10);\n}\n\n._registryPick_1coeb_159 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n cursor: pointer;\n}\n\n._registryOption_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_244 {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0;\n min-width: 0;\n}\n\n._guideTitle_1coeb_252 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._guideHint_1coeb_258 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._guideExample_1coeb_264 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._guideExample_1coeb_264 code {\n font-family: var(--dsw-font-mono, monospace);\n}\n\n._guideExampleLabel_1coeb_274 {\n color: var(--dsw-alias-label-caption);\n}\n\n._footer_1coeb_278 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-20);\n width: 100%;\n}\n\n._hero_1coeb_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_1coeb_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_1coeb_294[data-state='done'] {\n color: var(--dsw-alias-state-success-secondary);\n}\n\n._heroIcon_1coeb_294[data-state='error'] {\n color: var(--dsw-alias-state-warn-label);\n}\n\n._pendingTitle_1coeb_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_1coeb_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_1coeb_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_1coeb_337 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n overflow-wrap: anywhere;\n}\n\n._subjectMeta_1coeb_343,\n._subjectDesc_1coeb_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_1coeb_351,\n._resultWarn_1coeb_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_1coeb_352 {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n}\n\n._approval_1coeb_365 {\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_1coeb_375 {\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_1coeb_382 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._approvalCaution_1coeb_388 {\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_1coeb_395 {\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_1coeb_402 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._noteError_1coeb_406 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._problem_1coeb_410 {\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_1coeb_417 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._detail_1coeb_417 {\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._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_1yptb_1 {\n display: flex;\n align-items: center;\n}\n\n._pop_1yptb_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_1yptb_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_1yptb_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_1yptb_36 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._followBox_1yptb_43 {\n font-size: var(--dsw-font-xxxs-11-font-size);\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n\n._switchFollowing_1yptb_49 {\n opacity: 0.55;\n}\n\n._reset_1yptb_53 {\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_1yptb_53:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_1yptb_53:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_1yptb_75 {\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_1yptb_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: grab;\n}\n\n._row_1yptb_36:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOver_1yptb_99::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_1yptb_109 {\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_1yptb_124 {\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}\n\n._label_1yptb_132 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_1yptb_139 {\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_1yptb_150 {\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_1yptb_158 {\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._pluginList_1yptb_166 {\n padding-top: var(--wb-len-6);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._pluginRow_1yptb_171 {\n cursor: default;\n}\n\n._plugin_1yptb_166 {\n flex: none;\n padding: 0 var(--wb-len-6);\n border-radius: var(--wb-radius-6);\n background: var(--dsw-alias-interactive-bg-hover);\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._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*/";
8218
8690
  function workbenchCss() {
8219
8691
  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}`;
8220
8692
  }