@dsh-workbench/core 0.1.18 → 0.2.1

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 (95) hide show
  1. package/client.js +2241 -955
  2. package/dist/client/client.body.js +2241 -955
  3. package/dist/client/index.js +2242 -956
  4. package/dist/host/index.js +1840 -332
  5. package/dist/types/app/client.d.ts +225 -81
  6. package/dist/types/app/layouts/__tests__/async-feedback.test.d.ts +1 -0
  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 +3 -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 +7 -1
  12. package/dist/types/app/layouts/rightbar/ModulesPage.d.ts +4 -2
  13. package/dist/types/app/layouts/rightbar/PanelGroupRows.d.ts +10 -0
  14. package/dist/types/app/layouts/rightbar/PanelModules.d.ts +2 -2
  15. package/dist/types/app/layouts/rightbar/PanelRowControls.d.ts +13 -0
  16. package/dist/types/app/layouts/rightbar/__tests__/market-catalog.test.d.ts +1 -0
  17. package/dist/types/app/layouts/rightbar/__tests__/market-dots.test.d.ts +1 -0
  18. package/dist/types/app/layouts/rightbar/__tests__/market-row-icon.test.d.ts +1 -0
  19. package/dist/types/app/layouts/rightbar/__tests__/market-section-icon.test.d.ts +1 -0
  20. package/dist/types/app/layouts/rightbar/__tests__/market-state-rules.test.d.ts +1 -0
  21. package/dist/types/app/layouts/rightbar/__tests__/market-workbench.test.d.ts +1 -0
  22. package/dist/types/app/layouts/rightbar/__tests__/panel-dismiss.test.d.ts +1 -0
  23. package/dist/types/app/layouts/rightbar/__tests__/panel-drag-target.test.d.ts +1 -0
  24. package/dist/types/app/layouts/rightbar/__tests__/panel-plugin-rows.test.d.ts +1 -0
  25. package/dist/types/app/layouts/rightbar/__tests__/panel-scope-ui.test.d.ts +1 -0
  26. package/dist/types/app/layouts/rightbar/__tests__/panel-write.test.d.ts +1 -0
  27. package/dist/types/app/layouts/rightbar/board-selection.d.ts +20 -0
  28. package/dist/types/app/layouts/rightbar/dsh-borrow.d.ts +15 -0
  29. package/dist/types/app/layouts/rightbar/dsh-borrow.test.d.ts +1 -0
  30. package/dist/types/app/layouts/rightbar/dsh-surface.d.ts +11 -0
  31. package/dist/types/app/layouts/rightbar/dsh-surface.test.d.ts +1 -0
  32. package/dist/types/app/layouts/rightbar/market-act.d.ts +21 -0
  33. package/dist/types/app/layouts/rightbar/market-installed-mock.d.ts +9 -0
  34. package/dist/types/app/layouts/rightbar/market-mock-types.d.ts +58 -0
  35. package/dist/types/app/layouts/rightbar/market-mock.d.ts +2 -43
  36. package/dist/types/app/layouts/rightbar/market-plugin-rows.d.ts +3 -1
  37. package/dist/types/app/layouts/rightbar/market-row-icon.d.ts +7 -0
  38. package/dist/types/app/layouts/rightbar/market-row-types.d.ts +37 -0
  39. package/dist/types/app/layouts/rightbar/market-rows.d.ts +13 -53
  40. package/dist/types/app/layouts/rightbar/market-section-icon.d.ts +3 -0
  41. package/dist/types/app/layouts/rightbar/market-section.d.ts +18 -0
  42. package/dist/types/app/layouts/rightbar/market-shared-rows.d.ts +21 -0
  43. package/dist/types/app/layouts/rightbar/market-view-text.d.ts +7 -1
  44. package/dist/types/app/layouts/rightbar/market-workbench-row.d.ts +5 -0
  45. package/dist/types/app/layouts/rightbar/panel-dismiss.d.ts +2 -0
  46. package/dist/types/app/layouts/rightbar/panel-mock.d.ts +3 -2
  47. package/dist/types/app/layouts/rightbar/panel-write.d.ts +15 -0
  48. package/dist/types/app/layouts/rightbar/use-drag-listeners.d.ts +6 -0
  49. package/dist/types/app/layouts/rightbar/use-panels.d.ts +15 -1
  50. package/dist/types/app/layouts/sidebar/__tests__/session-row-ui.test.d.ts +1 -0
  51. package/dist/types/app/units/registry.d.ts +5 -2
  52. package/dist/types/modules/panels/__tests__/diy-harness.d.ts +19 -0
  53. package/dist/types/modules/panels/__tests__/diy-report.test.d.ts +1 -0
  54. package/dist/types/modules/panels/__tests__/diy-tools-health.test.d.ts +1 -0
  55. package/dist/types/modules/panels/__tests__/diy-tools-panel.test.d.ts +1 -0
  56. package/dist/types/modules/panels/__tests__/plugin-panel-market-parity.test.d.ts +1 -0
  57. package/dist/types/modules/panels/__tests__/plugin-panel.test.d.ts +1 -0
  58. package/dist/types/modules/panels/__tests__/plugin-tool-units.test.d.ts +1 -0
  59. package/dist/types/modules/panels/__tests__/scope-machine.test.d.ts +1 -0
  60. package/dist/types/modules/panels/__tests__/scope-support.d.ts +51 -0
  61. package/dist/types/modules/panels/model/config.d.ts +23 -3
  62. package/dist/types/modules/panels/model/diy-report.d.ts +63 -0
  63. package/dist/types/modules/panels/model/market-dispatch.d.ts +4 -0
  64. package/dist/types/modules/panels/model/market-registry.d.ts +12 -0
  65. package/dist/types/modules/panels/model/market-registry.test.d.ts +1 -0
  66. package/dist/types/modules/panels/model/market-types.d.ts +1 -0
  67. package/dist/types/modules/panels/model/market.d.ts +3 -2
  68. package/dist/types/modules/panels/model/plugin-panel.d.ts +3 -0
  69. package/dist/types/modules/panels/model/prefs.d.ts +3 -1
  70. package/dist/types/modules/panels/model/service.d.ts +5 -1
  71. package/dist/types/shared/api/bundle-install.d.ts +15 -1
  72. package/dist/types/shared/api/host/__tests__/approval-note-injection.test.d.ts +1 -0
  73. package/dist/types/shared/api/host/__tests__/panel-state-route.test.d.ts +1 -0
  74. package/dist/types/shared/api/host/__tests__/plugin-catalog.test.d.ts +1 -0
  75. package/dist/types/shared/api/host/__tests__/plugin-login-hint.test.d.ts +1 -0
  76. package/dist/types/shared/api/host/__tests__/plugin-tools.test.d.ts +1 -0
  77. package/dist/types/shared/api/host/bundle-inspect-kind.test.d.ts +1 -0
  78. package/dist/types/shared/api/host/bundle-routes-self.test.d.ts +1 -0
  79. package/dist/types/shared/api/host/installed-module.d.ts +12 -0
  80. package/dist/types/shared/api/host/mount-units.d.ts +1 -0
  81. package/dist/types/shared/api/host/plugin-catalog.d.ts +60 -0
  82. package/dist/types/shared/api/host/plugin-login-hint.d.ts +2 -0
  83. package/dist/types/shared/api/host/plugin-tools.d.ts +10 -0
  84. package/dist/types/shared/api/host/plugin-units.d.ts +47 -0
  85. package/dist/types/shared/api/host/unit-registry.d.ts +9 -0
  86. package/dist/types/shared/api/unit-manifests.d.ts +1 -0
  87. package/dist/types/shared/components/PanelFoot.d.ts +1 -1
  88. package/dist/types/shared/hooks/panel-state-report.d.ts +13 -0
  89. package/dist/types/shared/hooks/panel-state-report.test.d.ts +1 -0
  90. package/docs/HANDOFF.md +7 -0
  91. package/package.json +2 -2
  92. package/preset/diy.patch.yml +5 -26
  93. package/skills/workbench-module-diy/REVIEW.md +22 -0
  94. package/skills/workbench-module-diy/SKILL.md +3 -1
  95. package/skills/workbench-module-diy/TOOLING.md +2 -0
package/client.js CHANGED
@@ -426,6 +426,11 @@ window.__ModuleLoader__.load({
426
426
  if (error === void 0) return null;
427
427
  return error.code === "" ? "unknown" : error.code;
428
428
  }
429
+ //#endregion
430
+ //#region ../shared/dist/api/unit.js
431
+ function hasEnvSupply(manifest) {
432
+ return (manifest.env?.plugins ?? []).length > 0 || (manifest.env?.libs ?? []).length > 0;
433
+ }
429
434
  var SUPPORTED_API_VERSIONS = [1];
430
435
  var DECLARATION_KEYS = [
431
436
  "apiVersion",
@@ -561,10 +566,13 @@ window.__ModuleLoader__.load({
561
566
  var EVENTS_PATH = "/workbench/events";
562
567
  var ACTIONS_PREFIX = `${API_PREFIX}/actions`;
563
568
  var PROVISION_PREFIX = `${API_PREFIX}/provision`;
569
+ var PANEL_STATE_PATH = "panel-state";
570
+ var PANEL_STATE_PREFIX = `${API_PREFIX}/${PANEL_STATE_PATH}`;
564
571
  var OPENCLI_PIN = "1.8.8";
565
572
  var CODING_ISSUES_SERVICE = "workbenchCodingIssues";
566
573
  var PANELS_SERVICE = "workbenchPanels";
567
574
  var UNITS_SERVICE = "workbenchUnits";
575
+ var PANEL_STATE_SERVICE = "workbenchPanelState";
568
576
  var OPENCLI_TIMEOUT_MS = 12e4;
569
577
  var WARM_TIMEOUT_MS = 2e4;
570
578
  var INSTALL_TIMEOUT_MS = 3e5;
@@ -684,7 +692,9 @@ window.__ModuleLoader__.load({
684
692
  return { reason: errorReasonOf(error) };
685
693
  }
686
694
  componentDidCatch(error) {
687
- console.error(`[dsh-workbench] 模块 ${this.props.unit} 渲染失败:${errorReasonOf(error)}`, error);
695
+ const reason = errorReasonOf(error);
696
+ console.error(`[dsh-workbench] 模块 ${this.props.unit} 渲染失败:${reason}`, error);
697
+ this.props.onFailure?.(reason);
688
698
  }
689
699
  componentDidUpdate(previous) {
690
700
  if (previous.resetKey !== this.props.resetKey && this.state.reason !== null) this.setState({ reason: null });
@@ -1094,6 +1104,50 @@ window.__ModuleLoader__.load({
1094
1104
  strokeLinecap: "round"
1095
1105
  }));
1096
1106
  }
1107
+ function IconOpencli({ size = 16 }) {
1108
+ return h(Shell, {
1109
+ size,
1110
+ viewBox: "0 0 64 64"
1111
+ }, h("defs", null, h("linearGradient", {
1112
+ id: "opencli-mark",
1113
+ x1: "0%",
1114
+ y1: "0%",
1115
+ x2: "100%",
1116
+ y2: "100%"
1117
+ }, h("stop", {
1118
+ offset: "0%",
1119
+ stopColor: "#00e5a0"
1120
+ }), h("stop", {
1121
+ offset: "50%",
1122
+ stopColor: "#00b4d8"
1123
+ }), h("stop", {
1124
+ offset: "100%",
1125
+ stopColor: "#7b61ff"
1126
+ }))), h("rect", {
1127
+ width: 64,
1128
+ height: 64,
1129
+ rx: 14,
1130
+ fill: "#0a0a0f"
1131
+ }), h("text", {
1132
+ x: "50%",
1133
+ y: "54%",
1134
+ dominantBaseline: "middle",
1135
+ textAnchor: "middle",
1136
+ fontFamily: "monospace",
1137
+ fontWeight: 700,
1138
+ fontSize: 28,
1139
+ fill: "url(#opencli-mark)"
1140
+ }, ">_"));
1141
+ }
1142
+ function IconNpm({ size = 16 }) {
1143
+ return h(Shell, {
1144
+ size,
1145
+ viewBox: "0 0 1024 1024"
1146
+ }, h("path", {
1147
+ 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",
1148
+ fill: "#CB3837"
1149
+ }));
1150
+ }
1097
1151
  function IconModules({ size = 16 }) {
1098
1152
  return h("svg", {
1099
1153
  width: size,
@@ -1183,6 +1237,8 @@ window.__ModuleLoader__.load({
1183
1237
  "project.none": "No project",
1184
1238
  "project.empty": "No projects yet. Use “Add project” below.",
1185
1239
  "project.add": "Add project…",
1240
+ "project.add.busy": "Creating the workspace…",
1241
+ "project.add.failed": "Creating the workspace failed",
1186
1242
  "project.search.label": "Search workspaces",
1187
1243
  "project.search.placeholder": "Search workspaces (folder / name / path)",
1188
1244
  "project.search.empty": "No workspace matches “{query}”.",
@@ -1216,13 +1272,22 @@ window.__ModuleLoader__.load({
1216
1272
  "time.hours": "{n} h ago",
1217
1273
  "time.days": "{n} d ago",
1218
1274
  "panels.title": "Panel modules",
1219
- "panels.reset": "Reset",
1275
+ "panels.groupBoardless": "No-board modules",
1276
+ "panels.groupPlugins": "opencli plugins",
1277
+ "panels.market.defaultHint": "When on, it is on by default in every workspace; you can also turn it off for a single workspace in Panel setup.",
1278
+ "panels.market.defaultLabel": "On by default everywhere",
1279
+ "panels.market.defaultLocked": "Unusable right now — update or uninstall it first",
1280
+ "panels.followAll": "Restore the default everywhere",
1281
+ "panels.followAllConfirmTitle": "Restore the default everywhere?",
1282
+ "panels.followAllConfirmDetail": "Every row changed in this workspace goes back to following the global default.",
1283
+ "panels.followAllConfirmAck": "I understand: to set them up for this workspace again, I will have to change them row by row.",
1284
+ "panels.followAllConfirmYes": "Restore",
1285
+ "panels.followAllConfirmNo": "Cancel",
1220
1286
  "panels.enabled": "enabled in this project",
1221
1287
  "panels.disabled": "not enabled in this project",
1222
1288
  "panels.choose": "Choose modules",
1223
1289
  "panels.buildModule": "Build a module",
1224
1290
  "panels.failed": "Could not save the change. Try again.",
1225
- "panels.hintEffect": "Disabling = the agent cannot reach that data",
1226
1291
  "panels.dragHint": "Drag to reorder",
1227
1292
  "panels.unknownStep": "No suite provides this view",
1228
1293
  "panels.labelWithHint": "{label} ({hint})",
@@ -1236,7 +1301,9 @@ window.__ModuleLoader__.load({
1236
1301
  "panels.noneInstalled": "None of these modules has its plugin installed yet",
1237
1302
  "panels.noneInstalledHint": "Once installed they come back here, and you pick which go on the panel.",
1238
1303
  "panels.market.installed": "installed",
1239
- "panels.market.outdated": "needs update",
1304
+ "panels.market.notActive": "not active",
1305
+ "panels.market.notUsable": "unusable",
1306
+ "panels.market.broken": "broken",
1240
1307
  "panels.market.hasNew": "New version",
1241
1308
  "panels.market.missing": "not installed",
1242
1309
  "panels.market.unchecked": "unknown",
@@ -1244,7 +1311,7 @@ window.__ModuleLoader__.load({
1244
1311
  "panels.market.sectionInstalled": "Installed modules",
1245
1312
  "panels.market.sectionPending": "Not installed",
1246
1313
  "panels.market.sectionShared": "Shared dependencies",
1247
- "panels.market.sharedUsedBy": "Used by {modules}",
1314
+ "panels.market.sharedUsedBy": "Used by module {modules}",
1248
1315
  "panels.market.listSeparator": ", ",
1249
1316
  "panels.market.sharedMissing": "not installed",
1250
1317
  "panels.market.sharedOutdated": "update available",
@@ -1266,22 +1333,24 @@ window.__ModuleLoader__.load({
1266
1333
  "panels.market.confirmNo": "Cancel",
1267
1334
  "panels.market.failed": "Failed: {reason}",
1268
1335
  "panels.market.needEnv": "Set {env} in the terminal that started the workbench first",
1336
+ "panels.market.needCommands": "Missing commands: {commands}",
1337
+ "panels.market.localMark": "local",
1338
+ "panels.market.localHint": "This is your machine’s own copy (not taken from the registry).",
1269
1339
  "panels.market.noSource": "This module declares no install method — install it yourself",
1270
1340
  "panels.market.badSource": "The install method is incomplete — install it yourself",
1271
1341
  "panels.market.empty": "No modules available",
1272
- "panels.market.sectionLocal": "Local modules",
1273
- "panels.market.sectionUnlisted": "Not from the market",
1274
1342
  "panels.market.sectionPlugins": "Installed opencli plugins",
1275
1343
  "panels.market.moduleOutdated": "update available",
1276
- "panels.market.moduleRefused": "This module was built for an older version of the workbench, so it does not work here. Update it, or uninstall.",
1344
+ "panels.market.moduleRefused": "This module does not match this workbench, so it cannot be used for now.",
1277
1345
  "panels.market.moduleRefusedDetail": "Why it cannot be used: {reason}",
1278
- "panels.market.moduleRestartHint": "installed but not active — restart dsh once to bring it up",
1346
+ "panels.market.moduleRestartHint": "restart dsh once to bring it up",
1347
+ "panels.market.workbenchName": "Workbench",
1348
+ "panels.market.workbenchLocal": "This is the copy from your working repository; it does not come from the registry.",
1279
1349
  "panels.market.pluginKeptInUse": "Files kept for now: {names} still uses it.",
1280
1350
  "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.",
1281
1351
  "panels.market.pluginKeptHeld": "Files kept: this one is yours, and a module letting go will not remove it.",
1282
1352
  "panels.market.pluginKeptUnnamed": "Files kept for now: this one cannot be identified as a plugin, so it is unclear who needs it.",
1283
- "panels.market.pluginAlsoKnownAs": "Its package is {pkg} (updates and uninstall use that)",
1284
- "panels.market.pluginBroken": "This install is broken: it cannot be identified as a plugin. Uninstall it, or install it again by package name above.",
1353
+ "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).",
1285
1354
  "panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
1286
1355
  "panels.market.foot": "After installing, enable it in the panel page of that project.",
1287
1356
  "panels.market.recheck": "Check for updates",
@@ -1290,7 +1359,7 @@ window.__ModuleLoader__.load({
1290
1359
  "panels.market.justNow": "just now",
1291
1360
  "panels.market.minutesAgo": "{n} min ago",
1292
1361
  "panels.market.hoursAgo": "{n} h ago",
1293
- "panels.market.add.description": "Enter a package name, a Git URL, or a path to a local directory.",
1362
+ "panels.market.add.description": "Enter a module or opencli plugin package name, Git repository URL, or local directory path.",
1294
1363
  "panels.market.add.specPlaceholder": "e.g. @dsh-workbench/module-hello",
1295
1364
  "panels.market.add.guideToggle": "Install guide and examples",
1296
1365
  "panels.market.add.guideHide": "Hide guide",
@@ -1329,11 +1398,13 @@ window.__ModuleLoader__.load({
1329
1398
  "panels.market.add.problemInstalled": "This module is already installed",
1330
1399
  "panels.market.add.problemNotFound": "No such module found",
1331
1400
  "panels.market.add.problemNotPackage": "That path does not exist or is not a valid module package",
1332
- "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.",
1401
+ "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.",
1333
1402
  "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.",
1334
1403
  "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.",
1335
1404
  "panels.market.add.failureNotModuleOrPlugin": "This package is neither a workbench module nor an opencli plugin, so installing it would do nothing",
1336
1405
  "panels.market.add.installedPlugin": "Installed: the opencli plugin {name}",
1406
+ "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.",
1407
+ "panels.market.add.pluginAlias": "Plugin name: {name}",
1337
1408
  "panels.market.add.problemNetwork": "Cannot reach the module source; check the network and retry",
1338
1409
  "panels.market.add.problemUnknown": "Cannot fetch module information: {reason}",
1339
1410
  "panels.market.add.failureNetwork": "The network connection failed",
@@ -1364,7 +1435,7 @@ window.__ModuleLoader__.load({
1364
1435
  "panels.market.add.registryPnpm": "pnpm's own registry",
1365
1436
  "panels.market.add.check": "Check",
1366
1437
  "panels.market.add.checking": "Checking…",
1367
- "panels.market.add.classifying": "Working out what it is…",
1438
+ "panels.market.add.classifying": "Checking…",
1368
1439
  "panels.market.add.change": "Edit",
1369
1440
  "panels.market.add.previewTitle": "About to install",
1370
1441
  "panels.market.add.fieldName": "Package",
@@ -1511,6 +1582,8 @@ window.__ModuleLoader__.load({
1511
1582
  "project.none": "未选择项目",
1512
1583
  "project.empty": "还没有项目。用下面的「添加项目」选一个目录。",
1513
1584
  "project.add": "添加项目…",
1585
+ "project.add.busy": "正在新建工作区…",
1586
+ "project.add.failed": "新建工作区没成功",
1514
1587
  "project.search.label": "搜索工作区",
1515
1588
  "project.search.placeholder": "搜索工作区(目录名 / 中文名 / 路径)",
1516
1589
  "project.search.empty": "没有匹配「{query}」的工作区。",
@@ -1544,13 +1617,22 @@ window.__ModuleLoader__.load({
1544
1617
  "time.hours": "{n} 小时前",
1545
1618
  "time.days": "{n} 天前",
1546
1619
  "panels.title": "面板模块",
1547
- "panels.reset": "恢复默认",
1620
+ "panels.groupBoardless": "无看板模块",
1621
+ "panels.groupPlugins": "opencli 插件",
1622
+ "panels.market.defaultHint": "打开后所有工作区默认开启,也可在工作区面板配置中单独关闭",
1623
+ "panels.market.defaultLabel": "全局默认开启",
1624
+ "panels.market.defaultLocked": "这份现在用不了,先更新或卸载",
1625
+ "panels.followAll": "全部恢复默认",
1626
+ "panels.followAllConfirmTitle": "全部恢复默认?",
1627
+ "panels.followAllConfirmDetail": "这个工作区里改过的每一行都会清掉,之后都跟随全局。",
1628
+ "panels.followAllConfirmAck": "我明白:清掉之后,想再按这个工作区配,得一行一行重新改。",
1629
+ "panels.followAllConfirmYes": "恢复默认",
1630
+ "panels.followAllConfirmNo": "取消",
1548
1631
  "panels.enabled": "这个项目已启用",
1549
1632
  "panels.disabled": "这个项目未启用",
1550
1633
  "panels.choose": "选择模块",
1551
1634
  "panels.buildModule": "造一个模块",
1552
1635
  "panels.failed": "改配置失败了,再试一次。",
1553
- "panels.hintEffect": "停用 = agent 拿不到相关数据",
1554
1636
  "panels.dragHint": "拖动调整顺序",
1555
1637
  "panels.unknownStep": "这一层没有套件提供",
1556
1638
  "panels.labelWithHint": "{label}({hint})",
@@ -1564,7 +1646,9 @@ window.__ModuleLoader__.load({
1564
1646
  "panels.noneInstalled": "这些模块要的插件都还没装",
1565
1647
  "panels.noneInstalledHint": "装好之后它们会回到这里,再由你决定放哪几个上板。",
1566
1648
  "panels.market.installed": "已安装",
1567
- "panels.market.outdated": "要更新",
1649
+ "panels.market.notActive": "未生效",
1650
+ "panels.market.notUsable": "不可用",
1651
+ "panels.market.broken": "装坏了",
1568
1652
  "panels.market.hasNew": "有新版本",
1569
1653
  "panels.market.missing": "未装",
1570
1654
  "panels.market.unchecked": "状态未知",
@@ -1572,7 +1656,7 @@ window.__ModuleLoader__.load({
1572
1656
  "panels.market.sectionInstalled": "已安装模块",
1573
1657
  "panels.market.sectionPending": "未安装",
1574
1658
  "panels.market.sectionShared": "共用依赖",
1575
- "panels.market.sharedUsedBy": "供 {modules} 使用",
1659
+ "panels.market.sharedUsedBy": "供 {modules} 模块使用",
1576
1660
  "panels.market.listSeparator": "、",
1577
1661
  "panels.market.sharedMissing": "未装",
1578
1662
  "panels.market.sharedOutdated": "有新版",
@@ -1594,22 +1678,24 @@ window.__ModuleLoader__.load({
1594
1678
  "panels.market.confirmNo": "取消",
1595
1679
  "panels.market.failed": "没成功:{reason}",
1596
1680
  "panels.market.needEnv": "先在启动工作台的终端里设 {env}",
1681
+ "panels.market.needCommands": "缺这几条命令:{commands}",
1682
+ "panels.market.localMark": "本地",
1683
+ "panels.market.localHint": "本机那份(不从源上取)。",
1597
1684
  "panels.market.noSource": "这个模块没声明怎么装,只能自己动手",
1598
1685
  "panels.market.badSource": "安装方式没写全,只能自己动手",
1599
1686
  "panels.market.empty": "暂无可用模块",
1600
- "panels.market.sectionLocal": "本地模块",
1601
- "panels.market.sectionUnlisted": "不是从市场装的",
1602
1687
  "panels.market.sectionPlugins": "已安装 opencli 插件",
1603
1688
  "panels.market.moduleOutdated": "有新版",
1604
- "panels.market.moduleRefused": "这个模块是给旧版本的工作台写的,现在用不了。更新它,或者卸载。",
1689
+ "panels.market.moduleRefused": "模块版本与工作台不匹配,暂时无法使用",
1605
1690
  "panels.market.moduleRefusedDetail": "装不上的原因:{reason}",
1606
- "panels.market.moduleRestartHint": "装好了但还没生效 —— 重启一次 dsh 就会出来",
1691
+ "panels.market.moduleRestartHint": "重启后生效",
1692
+ "panels.market.workbenchName": "工作台",
1693
+ "panels.market.workbenchLocal": "这份是本仓正在开发的那一份,不从源上取。",
1607
1694
  "panels.market.pluginKeptInUse": "文件先留着:{names} 还要用它。",
1608
1695
  "panels.market.pluginKeptUnsure": "文件先留着:这台机器上还有模块看不出用了什么,说不准谁在用它。",
1609
1696
  "panels.market.pluginKeptHeld": "文件留着:你自己装的那一份,模块放手不动它。",
1610
1697
  "panels.market.pluginKeptUnnamed": "文件先留着:看不出这是哪个插件,说不准谁在用它。",
1611
- "panels.market.pluginAlsoKnownAs": "包名是 {pkg}(更新与卸载按它来)",
1612
- "panels.market.pluginBroken": "这份装坏了:看不出它是个插件。可以卸载,或者去上面按包名再装一次。",
1698
+ "panels.market.pluginBroken": "这份装坏了:看不出它是个插件。可以卸载,或者直接跟 agent 说:用 workbench_modules 的 install-bundle 按包名再装一次。",
1613
1699
  "panels.market.restartNeeded": "新版装好了,重启一次才生效。",
1614
1700
  "panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
1615
1701
  "panels.market.recheck": "重新检查更新",
@@ -1618,7 +1704,7 @@ window.__ModuleLoader__.load({
1618
1704
  "panels.market.justNow": "刚刚",
1619
1705
  "panels.market.minutesAgo": "{n} 分钟前",
1620
1706
  "panels.market.hoursAgo": "{n} 小时前",
1621
- "panels.market.add.description": "输入模块的包名、Git 仓库地址或本地目录路径。",
1707
+ "panels.market.add.description": "输入模块或 opencli 插件的包名、Git 仓库地址或本地目录路径。",
1622
1708
  "panels.market.add.specPlaceholder": "例如 @dsh-workbench/module-hello",
1623
1709
  "panels.market.add.guideToggle": "模块安装引导和示例",
1624
1710
  "panels.market.add.guideHide": "收起引导",
@@ -1657,11 +1743,13 @@ window.__ModuleLoader__.load({
1657
1743
  "panels.market.add.problemInstalled": "该模块已安装",
1658
1744
  "panels.market.add.problemNotFound": "未找到相关模块",
1659
1745
  "panels.market.add.problemNotPackage": "该路径不存在或不是有效的模块包",
1660
- "panels.market.add.problemNotBundle": "这个包装不进这里:{reason}。要是它其实是个 opencli 插件,请改用包名(例如 opencli-plugin-cmdb)或者本地目录 —— 从 git 地址和 tarball 判断不出它是什么。",
1746
+ "panels.market.add.problemNotBundle": "这个包装不进这里:{reason}。这个入口按包名认工作台模块和 opencli 插件,两种都能装;但 git 地址和 tarball 判断不出它是什么 —— 要是它其实是这两样之一,请改填包名或本地目录。",
1661
1747
  "panels.market.add.problemNotWorkbenchModule": "这个包跟现在的工作台对不上,装上也用不了。换一个版本,或者找这个模块的作者。",
1662
1748
  "panels.market.add.problemNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上。换一个版本,或者找这个包的作者。",
1663
1749
  "panels.market.add.failureNotModuleOrPlugin": "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上",
1664
1750
  "panels.market.add.installedPlugin": "装上了:opencli 插件 {name}",
1751
+ "panels.market.add.pluginPreview": "这是一份 opencli 插件:装进 opencli 的插件区,装完就能用,不用重启。",
1752
+ "panels.market.add.pluginAlias": "插件名:{name}",
1665
1753
  "panels.market.add.problemNetwork": "无法连接模块源,请检查网络后重试",
1666
1754
  "panels.market.add.problemUnknown": "无法获取模块信息:{reason}",
1667
1755
  "panels.market.add.failureNetwork": "网络连接失败",
@@ -1692,7 +1780,7 @@ window.__ModuleLoader__.load({
1692
1780
  "panels.market.add.registryPnpm": "pnpm 自己配的源",
1693
1781
  "panels.market.add.check": "预检",
1694
1782
  "panels.market.add.checking": "正在预检…",
1695
- "panels.market.add.classifying": "判定中…",
1783
+ "panels.market.add.classifying": "检测中…",
1696
1784
  "panels.market.add.change": "改一下",
1697
1785
  "panels.market.add.previewTitle": "将要安装",
1698
1786
  "panels.market.add.fieldName": "包名",
@@ -1916,6 +2004,203 @@ window.__ModuleLoader__.load({
1916
2004
  releaseInMs: left
1917
2005
  };
1918
2006
  }
2007
+ var PANEL_STATE_CRASH_WINDOW_MS = 6e5;
2008
+ var PANEL_STATE_MAX_TEXT = 2e3;
2009
+ var PHASES = [
2010
+ "idle",
2011
+ "loading",
2012
+ "ready",
2013
+ "error"
2014
+ ];
2015
+ function asRecord(value) {
2016
+ return typeof value === "object" && value !== null ? value : void 0;
2017
+ }
2018
+ function textOf(value, max) {
2019
+ if (typeof value !== "string") return "";
2020
+ const trimmed = value.trim();
2021
+ return trimmed.length > max ? trimmed.slice(0, max) : trimmed;
2022
+ }
2023
+ function atOf(value) {
2024
+ if (typeof value !== "number" || !Number.isFinite(value)) return null;
2025
+ if (value < 0) return null;
2026
+ return Math.trunc(value);
2027
+ }
2028
+ function errorOf(raw) {
2029
+ const record = asRecord(raw);
2030
+ if (record === void 0) return void 0;
2031
+ const code = textOf(record["code"], 120);
2032
+ const message = textOf(record["message"], PANEL_STATE_MAX_TEXT);
2033
+ if (code === "" && message === "") return void 0;
2034
+ return {
2035
+ code: code === "" ? "unknown" : code,
2036
+ message
2037
+ };
2038
+ }
2039
+ function parseCardsReport(payload) {
2040
+ const record = asRecord(payload);
2041
+ if (record === void 0) return {
2042
+ ok: false,
2043
+ message: "请求体要是一个对象"
2044
+ };
2045
+ const workspace = textOf(record["workspace"], PANEL_STATE_MAX_TEXT);
2046
+ if (workspace === "") return {
2047
+ ok: false,
2048
+ message: "workspace 不能是空的 —— 面板按工作区存"
2049
+ };
2050
+ const raw = record["cards"];
2051
+ if (!Array.isArray(raw)) return {
2052
+ ok: false,
2053
+ message: "cards 要是一个数组"
2054
+ };
2055
+ const cards = [];
2056
+ for (const item of raw.slice(0, 32)) {
2057
+ const card = asRecord(item);
2058
+ if (card === void 0) continue;
2059
+ const unit = textOf(card["unit"], 200);
2060
+ const route = textOf(card["route"], 400);
2061
+ const phase = textOf(card["phase"], 20);
2062
+ const at = atOf(card["at"]);
2063
+ if (unit === "" || route === "" || at === null || !PHASES.includes(phase)) continue;
2064
+ const error = errorOf(card["error"]);
2065
+ cards.push({
2066
+ unit,
2067
+ route,
2068
+ phase,
2069
+ at,
2070
+ ...error === void 0 ? {} : { error }
2071
+ });
2072
+ }
2073
+ if (cards.length === 0) return {
2074
+ ok: false,
2075
+ message: "cards 里没有一条能认的(unit / route / phase / at 都要有)"
2076
+ };
2077
+ return {
2078
+ ok: true,
2079
+ value: {
2080
+ workspace,
2081
+ cards
2082
+ }
2083
+ };
2084
+ }
2085
+ function parseCrashReport(payload) {
2086
+ const record = asRecord(payload);
2087
+ if (record === void 0) return {
2088
+ ok: false,
2089
+ message: "请求体要是一个对象"
2090
+ };
2091
+ const workspace = textOf(record["workspace"], PANEL_STATE_MAX_TEXT);
2092
+ const unit = textOf(record["unit"], 200);
2093
+ const reason = textOf(record["reason"], PANEL_STATE_MAX_TEXT);
2094
+ if (workspace === "") return {
2095
+ ok: false,
2096
+ message: "workspace 不能是空的"
2097
+ };
2098
+ if (unit === "") return {
2099
+ ok: false,
2100
+ message: "unit 不能是空的"
2101
+ };
2102
+ if (reason === "") return {
2103
+ ok: false,
2104
+ message: "reason 不能是空的(没有原因的崩溃没法查)"
2105
+ };
2106
+ return {
2107
+ ok: true,
2108
+ value: {
2109
+ workspace,
2110
+ unit,
2111
+ reason,
2112
+ at: atOf(record["at"]) ?? Date.now()
2113
+ }
2114
+ };
2115
+ }
2116
+ function createPanelStateStore() {
2117
+ const workspaces = /* @__PURE__ */ new Map();
2118
+ function trim(entry, max) {
2119
+ while (entry.size > max) {
2120
+ const oldest = entry.keys().next();
2121
+ if (oldest.done === true) return;
2122
+ entry.delete(oldest.value);
2123
+ }
2124
+ }
2125
+ function workspaceEntryOf(workspace) {
2126
+ const existing = workspaces.get(workspace);
2127
+ if (existing !== void 0) return existing;
2128
+ const created = {
2129
+ at: 0,
2130
+ units: /* @__PURE__ */ new Map()
2131
+ };
2132
+ workspaces.set(workspace, created);
2133
+ trim(workspaces, 64);
2134
+ return created;
2135
+ }
2136
+ function unitEntryOf(entry, unit) {
2137
+ const existing = entry.units.get(unit);
2138
+ if (existing !== void 0) return existing;
2139
+ const created = {
2140
+ at: 0,
2141
+ cards: /* @__PURE__ */ new Map()
2142
+ };
2143
+ entry.units.set(unit, created);
2144
+ return created;
2145
+ }
2146
+ return {
2147
+ cards(report) {
2148
+ const entry = workspaceEntryOf(report.workspace);
2149
+ for (const card of report.cards) {
2150
+ const unit = unitEntryOf(entry, card.unit);
2151
+ unit.cards.delete(card.route);
2152
+ unit.cards.set(card.route, card);
2153
+ trim(unit.cards, 12);
2154
+ if (card.at > unit.at) unit.at = card.at;
2155
+ if (card.at > entry.at) entry.at = card.at;
2156
+ }
2157
+ },
2158
+ crash(report) {
2159
+ const entry = workspaceEntryOf(report.workspace);
2160
+ const unit = unitEntryOf(entry, report.unit);
2161
+ const previous = unit.crash;
2162
+ const counted = previous !== void 0 && previous.reason === report.reason && report.at >= previous.at && report.at - previous.at <= 6e5;
2163
+ unit.crash = {
2164
+ unit: report.unit,
2165
+ reason: report.reason,
2166
+ at: report.at,
2167
+ count: counted ? previous.count + 1 : 1
2168
+ };
2169
+ if (report.at > unit.at) unit.at = report.at;
2170
+ if (report.at > entry.at) entry.at = report.at;
2171
+ },
2172
+ snapshot(workspace) {
2173
+ if (workspace === null) return {
2174
+ workspace: null,
2175
+ at: 0,
2176
+ units: []
2177
+ };
2178
+ const entry = workspaces.get(workspace);
2179
+ if (entry === void 0) return {
2180
+ workspace,
2181
+ at: 0,
2182
+ units: []
2183
+ };
2184
+ const units = [...entry.units.entries()].map(([unit, one]) => {
2185
+ const cards = [...one.cards.values()].sort((a, b) => a.route.localeCompare(b.route));
2186
+ const okAt = cards.reduce((best, card) => card.phase === "ready" && (best === null || card.at > best) ? card.at : best, null);
2187
+ return {
2188
+ unit,
2189
+ at: one.at,
2190
+ okAt,
2191
+ cards,
2192
+ ...one.crash === void 0 ? {} : { crash: one.crash }
2193
+ };
2194
+ });
2195
+ units.sort((a, b) => b.at - a.at || a.unit.localeCompare(b.unit));
2196
+ return {
2197
+ workspace,
2198
+ at: entry.at,
2199
+ units
2200
+ };
2201
+ }
2202
+ };
2203
+ }
1919
2204
  //#endregion
1920
2205
  //#region ../shared/dist/lib/text.js
1921
2206
  function quoteShellArg(value) {
@@ -1983,6 +2268,8 @@ window.__ModuleLoader__.load({
1983
2268
  IconBrandMark: () => IconBrandMark,
1984
2269
  IconConversation: () => IconConversation,
1985
2270
  IconModules: () => IconModules,
2271
+ IconNpm: () => IconNpm,
2272
+ IconOpencli: () => IconOpencli,
1986
2273
  IconPanelScreen: () => IconPanelScreen,
1987
2274
  LOCALES: () => LOCALES,
1988
2275
  LOCALE_NS: () => LOCALE_NS,
@@ -1999,6 +2286,14 @@ window.__ModuleLoader__.load({
1999
2286
  PANELS_SERVICE: () => PANELS_SERVICE,
2000
2287
  PANEL_LIST_LIMIT: () => 50,
2001
2288
  PANEL_POLL_MS: () => PANEL_POLL_MS,
2289
+ PANEL_STATE_CRASH_WINDOW_MS: () => PANEL_STATE_CRASH_WINDOW_MS,
2290
+ PANEL_STATE_MAX_CARDS: () => 12,
2291
+ PANEL_STATE_MAX_REPORTS: () => 32,
2292
+ PANEL_STATE_MAX_TEXT: () => PANEL_STATE_MAX_TEXT,
2293
+ PANEL_STATE_MAX_UNITS: () => 64,
2294
+ PANEL_STATE_PATH: () => PANEL_STATE_PATH,
2295
+ PANEL_STATE_PREFIX: () => PANEL_STATE_PREFIX,
2296
+ PANEL_STATE_SERVICE: () => PANEL_STATE_SERVICE,
2002
2297
  PLUGIN_ID: () => PLUGIN_ID,
2003
2298
  PREFS_PREFIX: () => PREFS_PREFIX,
2004
2299
  PROBE_TTL_MS: () => PROBE_TTL_MS,
@@ -2029,6 +2324,7 @@ window.__ModuleLoader__.load({
2029
2324
  blockerPending: () => blockerPending,
2030
2325
  buildMarker: () => buildMarker,
2031
2326
  createFactChannel: () => createFactChannel,
2327
+ createPanelStateStore: () => createPanelStateStore,
2032
2328
  cx: () => cx,
2033
2329
  declarationProblemsOf: () => declarationProblemsOf,
2034
2330
  decodeRef: () => decodeRef,
@@ -2040,6 +2336,7 @@ window.__ModuleLoader__.load({
2040
2336
  factOfRoute: () => factOfRoute,
2041
2337
  gateOf: () => gateOf,
2042
2338
  h: () => h,
2339
+ hasEnvSupply: () => hasEnvSupply,
2043
2340
  holdBusy: () => holdBusy,
2044
2341
  isFactScope: () => isFactScope,
2045
2342
  longTaskDot: () => longTaskDot,
@@ -2048,6 +2345,8 @@ window.__ModuleLoader__.load({
2048
2345
  markerBody: () => markerBody,
2049
2346
  mergeMessages: () => mergeMessages,
2050
2347
  mergeMessagesSkipping: () => mergeMessagesSkipping,
2348
+ parseCardsReport: () => parseCardsReport,
2349
+ parseCrashReport: () => parseCrashReport,
2051
2350
  parseFactFrame: () => parseFactFrame,
2052
2351
  parseJsonLoose: () => parseJsonLoose,
2053
2352
  parseLocalTimestamp: () => parseLocalTimestamp,
@@ -2421,6 +2720,197 @@ window.__ModuleLoader__.load({
2421
2720
  return pending.filter((unit) => active.has(unit) || fresh.includes(unit));
2422
2721
  }
2423
2722
  //#endregion
2723
+ //#region src/app/layouts/rightbar/market-installed-mock.ts
2724
+ function installedMocks(input) {
2725
+ const { id, found, mine, probe } = input;
2726
+ return [
2727
+ {
2728
+ id: "no-supply",
2729
+ label: "没有环境依赖的模块(供给是基座命令那种):市场里有它这一行",
2730
+ manifests: [found],
2731
+ capabilities: probe(id, "ok"),
2732
+ installed: [{
2733
+ unit: id,
2734
+ pkg: "@dsh-workbench/module-one",
2735
+ installed: "0.1.2"
2736
+ }],
2737
+ expect: {
2738
+ rows: 1,
2739
+ state: "installed",
2740
+ actions: ["uninstall"],
2741
+ installed: 0,
2742
+ shared: 0
2743
+ }
2744
+ },
2745
+ {
2746
+ id: "no-card",
2747
+ label: "没有卡片的模块(只有基座命令那种):市场里有它这一行,有版本、有「更新」",
2748
+ manifests: [{
2749
+ ...found,
2750
+ card: null
2751
+ }],
2752
+ capabilities: probe(id, "ok"),
2753
+ updates: { [id]: {
2754
+ installed: "0.1.2",
2755
+ latest: "0.2.0"
2756
+ } },
2757
+ installed: [{
2758
+ unit: id,
2759
+ pkg: "@dsh-workbench/module-one",
2760
+ installed: "0.1.2"
2761
+ }],
2762
+ expect: {
2763
+ rows: 1,
2764
+ state: "outdated",
2765
+ actions: ["update-bundle", "uninstall"],
2766
+ version: {
2767
+ installed: "0.1.2",
2768
+ latest: "0.2.0"
2769
+ },
2770
+ installed: 0,
2771
+ shared: 0
2772
+ }
2773
+ },
2774
+ {
2775
+ id: "no-env-installed",
2776
+ label: "本机装着、又没有依赖要探(DIY 本地那份那种):写「已安装」,不是「状态未知」",
2777
+ manifests: [{
2778
+ ...found,
2779
+ env: void 0
2780
+ }],
2781
+ capabilities: {},
2782
+ updates: { [id]: { installed: "0.1.2" } },
2783
+ installed: [{
2784
+ unit: id,
2785
+ pkg: "@dsh-workbench/module-one",
2786
+ installed: "0.1.2"
2787
+ }],
2788
+ expect: {
2789
+ rows: 1,
2790
+ state: "installed",
2791
+ actions: ["uninstall"],
2792
+ version: { installed: "0.1.2" },
2793
+ installed: 0
2794
+ }
2795
+ },
2796
+ {
2797
+ id: "local-no-update",
2798
+ label: "本机那份(link: 装的):有「本地」标记、不给「更新」",
2799
+ manifests: [mine],
2800
+ capabilities: probe(id, "ok", { plugins: [{
2801
+ name: "fixture",
2802
+ status: "ok",
2803
+ missing: []
2804
+ }] }),
2805
+ updates: { [id]: {
2806
+ installed: "0.1.0",
2807
+ local: true
2808
+ } },
2809
+ installed: [{
2810
+ unit: id,
2811
+ pkg: "@dsh-workbench/module-one",
2812
+ installed: "0.1.0",
2813
+ local: true
2814
+ }],
2815
+ expect: {
2816
+ rows: 1,
2817
+ state: "installed",
2818
+ actions: ["uninstall"],
2819
+ local: true,
2820
+ version: { installed: "0.1.0" },
2821
+ installed: 0
2822
+ }
2823
+ },
2824
+ {
2825
+ id: "installed-refused",
2826
+ label: "本机装了,但宿主不认它的声明(行上说得出理由)",
2827
+ manifests: [],
2828
+ capabilities: {},
2829
+ installed: [{
2830
+ unit: id,
2831
+ pkg: "@dsh-workbench/module-one",
2832
+ installed: "0.1.2",
2833
+ refused: ["dsh.workbench 缺 apiVersion —— 协议从 v1 起,写 \"apiVersion\": 1"]
2834
+ }],
2835
+ expect: {
2836
+ rows: 0,
2837
+ installed: 1,
2838
+ installedState: "unusable",
2839
+ installedActions: ["remove-bundle"],
2840
+ installedNote: true
2841
+ }
2842
+ },
2843
+ {
2844
+ id: "installed-pending",
2845
+ label: "本机装了、宿主还没加载它(重启一次就会出来)",
2846
+ manifests: [],
2847
+ capabilities: {},
2848
+ installed: [{
2849
+ unit: id,
2850
+ pkg: "@dsh-workbench/module-one",
2851
+ installed: "0.1.2"
2852
+ }],
2853
+ expect: {
2854
+ rows: 0,
2855
+ installed: 1,
2856
+ installedState: "inactive",
2857
+ installedActions: ["remove-bundle"],
2858
+ installedHint: "panels.market.moduleRestartHint"
2859
+ }
2860
+ },
2861
+ {
2862
+ id: "installed-pending-update",
2863
+ label: "本机装了、还没加载 + 源上有新版(给「更新」,也说明要重启)",
2864
+ manifests: [],
2865
+ capabilities: {},
2866
+ installed: [{
2867
+ unit: id,
2868
+ pkg: "@dsh-workbench/module-one",
2869
+ installed: "0.1.0",
2870
+ latest: "0.1.2"
2871
+ }],
2872
+ expect: {
2873
+ rows: 0,
2874
+ installed: 1,
2875
+ installedState: "outdated",
2876
+ installedActions: ["update-bundle", "remove-bundle"],
2877
+ installedHint: "panels.market.moduleRestartHint"
2878
+ }
2879
+ },
2880
+ {
2881
+ id: "installed-confirm",
2882
+ label: "卸载本机模块(还没加载的那种:Modal 确认,标题是包名)",
2883
+ manifests: [],
2884
+ capabilities: {},
2885
+ installed: [{
2886
+ unit: id,
2887
+ pkg: "@dsh-workbench/module-one",
2888
+ installed: "0.1.2"
2889
+ }],
2890
+ confirming: id,
2891
+ expect: {
2892
+ rows: 0,
2893
+ installed: 1,
2894
+ installedState: "inactive",
2895
+ installedActions: ["remove-bundle"]
2896
+ }
2897
+ },
2898
+ {
2899
+ id: "first-paint",
2900
+ label: "刚进页面(检测中:能力与本机清单都还没结论)",
2901
+ manifests: [mine],
2902
+ capabilities: null,
2903
+ installedRead: false,
2904
+ loaded: false,
2905
+ expect: {
2906
+ rows: 1,
2907
+ state: "checking",
2908
+ actions: []
2909
+ }
2910
+ }
2911
+ ];
2912
+ }
2913
+ //#endregion
2424
2914
  //#region src/app/layouts/rightbar/market-mock.ts
2425
2915
  function installable(manifest) {
2426
2916
  return {
@@ -2531,7 +3021,8 @@ window.__ModuleLoader__.load({
2531
3021
  expect: {
2532
3022
  rows: 1,
2533
3023
  state: "outdated",
2534
- actions: ["update", "uninstall"]
3024
+ actions: ["update", "uninstall"],
3025
+ noteKey: "panels.market.needCommands"
2535
3026
  }
2536
3027
  },
2537
3028
  {
@@ -2776,109 +3267,38 @@ window.__ModuleLoader__.load({
2776
3267
  actions: ["uninstall"]
2777
3268
  }
2778
3269
  },
3270
+ ...installedMocks({
3271
+ id,
3272
+ found,
3273
+ mine,
3274
+ probe: probe$1
3275
+ }),
2779
3276
  {
2780
- id: "installed-half",
2781
- label: "本机装了模块,但它没有环境依赖(供给那半没有它)",
2782
- manifests: [found],
2783
- capabilities: {},
2784
- installed: [{
2785
- unit: id,
2786
- pkg: "@dsh-workbench/module-one",
2787
- installed: "0.1.2"
2788
- }],
3277
+ id: "shared-many",
3278
+ label: "三个模块(同一份安装)",
3279
+ manifests: [
3280
+ mine,
3281
+ twin(mine),
3282
+ {
3283
+ ...twin(mine),
3284
+ id: `${mine.id}-c`
3285
+ }
3286
+ ],
3287
+ capabilities: {
3288
+ ...probe$1(id, "ok"),
3289
+ ...probe$1(secondId, "ok"),
3290
+ ...probe$1(`${mine.id}-c`, "ok")
3291
+ },
2789
3292
  expect: {
2790
- rows: 0,
2791
- installed: 1,
2792
- installedActions: ["remove-bundle"]
3293
+ rows: 3,
3294
+ state: "installed",
3295
+ actions: ["uninstall"]
2793
3296
  }
2794
3297
  },
2795
3298
  {
2796
- id: "installed-half-update",
2797
- label: "本机装了模块 + 源上有新版(给「更新」,装完要重启)",
2798
- manifests: [found],
2799
- capabilities: {},
2800
- installed: [{
2801
- unit: id,
2802
- pkg: "@dsh-workbench/module-one",
2803
- installed: "0.1.0",
2804
- latest: "0.1.2"
2805
- }],
2806
- expect: {
2807
- rows: 0,
2808
- installed: 1,
2809
- installedActions: ["update-bundle", "remove-bundle"]
2810
- }
2811
- },
2812
- {
2813
- id: "installed-client-refused",
2814
- label: "本机装了,但浏览器这半没挂上(拒因由客户端报告)",
2815
- manifests: [found],
2816
- capabilities: {},
2817
- installed: [{
2818
- unit: id,
2819
- pkg: "@dsh-workbench/module-one",
2820
- installed: "0.1.2",
2821
- clientRefused: [`宿主没有担保 unit「${id}」的清单 —— 这个包要么没装进这份 profile,要么它的 dsh.workbench 没通过校验。卡片先不挂:清单只有一处真相(ADR-0038 §2.2)`]
2822
- }],
2823
- expect: {
2824
- rows: 0,
2825
- installed: 1,
2826
- installedActions: ["remove-bundle"],
2827
- installedNote: true
2828
- }
2829
- },
2830
- {
2831
- id: "installed-confirm",
2832
- label: "卸载本机模块(Modal 确认,标题带模块名)",
2833
- manifests: [found],
2834
- capabilities: {},
2835
- installed: [{
2836
- unit: id,
2837
- pkg: "@dsh-workbench/module-one",
2838
- installed: "0.1.2"
2839
- }],
2840
- confirming: id,
2841
- expect: {
2842
- rows: 0,
2843
- installed: 1,
2844
- installedActions: ["remove-bundle"]
2845
- }
2846
- },
2847
- {
2848
- id: "first-paint",
2849
- label: "刚进页面(检测中:能力与本机清单都还没结论)",
2850
- manifests: [found],
2851
- capabilities: null,
2852
- installedRead: false,
2853
- loaded: false,
2854
- expect: { rows: 0 }
2855
- },
2856
- {
2857
- id: "shared-many",
2858
- label: "三个模块(同一份安装)",
2859
- manifests: [
2860
- mine,
2861
- twin(mine),
2862
- {
2863
- ...twin(mine),
2864
- id: `${mine.id}-c`
2865
- }
2866
- ],
2867
- capabilities: {
2868
- ...probe$1(id, "ok"),
2869
- ...probe$1(secondId, "ok"),
2870
- ...probe$1(`${mine.id}-c`, "ok")
2871
- },
2872
- expect: {
2873
- rows: 3,
2874
- state: "installed",
2875
- actions: ["uninstall"]
2876
- }
2877
- },
2878
- {
2879
- id: "plugin-outdated",
2880
- label: "用户装的 opencli 插件:有新版(给更新 / 卸载)",
2881
- manifests: [],
3299
+ id: "plugin-outdated",
3300
+ label: "用户装的 opencli 插件:有新版(给更新 / 卸载)",
3301
+ manifests: [],
2882
3302
  capabilities: {},
2883
3303
  plugins: [{
2884
3304
  pkg: "opencli-plugin-cmdb",
@@ -2923,8 +3343,7 @@ window.__ModuleLoader__.load({
2923
3343
  expect: {
2924
3344
  rows: 0,
2925
3345
  plugins: 1,
2926
- pluginActions: ["update-plugin", "uninstall-plugin"],
2927
- pluginNoteKey: "panels.market.pluginAlsoKnownAs"
3346
+ pluginActions: ["update-plugin", "uninstall-plugin"]
2928
3347
  }
2929
3348
  },
2930
3349
  {
@@ -2941,6 +3360,7 @@ window.__ModuleLoader__.load({
2941
3360
  expect: {
2942
3361
  rows: 0,
2943
3362
  plugins: 1,
3363
+ pluginState: "broken",
2944
3364
  pluginActions: ["uninstall-plugin"],
2945
3365
  pluginNoteKey: "panels.market.pluginBroken"
2946
3366
  }
@@ -2963,6 +3383,70 @@ window.__ModuleLoader__.load({
2963
3383
  notice: true
2964
3384
  }
2965
3385
  },
3386
+ {
3387
+ id: "workbench-update",
3388
+ label: "工作台有新版(这一行也给「更新」,装完面板自己换上)",
3389
+ manifests: [],
3390
+ capabilities: {},
3391
+ workbench: {
3392
+ pkg: "@dsh-workbench/core",
3393
+ installed: "0.1.18",
3394
+ latest: "0.1.19"
3395
+ },
3396
+ expect: {
3397
+ rows: 0,
3398
+ workbenchState: "outdated",
3399
+ workbenchActions: ["update-workbench"]
3400
+ }
3401
+ },
3402
+ {
3403
+ id: "workbench-current",
3404
+ label: "工作台已经最新(只显示版本,没有按钮)",
3405
+ manifests: [],
3406
+ capabilities: {},
3407
+ workbench: {
3408
+ pkg: "@dsh-workbench/core",
3409
+ installed: "0.1.19"
3410
+ },
3411
+ expect: {
3412
+ rows: 0,
3413
+ workbenchState: "installed",
3414
+ workbenchActions: []
3415
+ }
3416
+ },
3417
+ {
3418
+ id: "workbench-local",
3419
+ label: "工作台是本仓那份(link: 装的:不给更新,行上说清)",
3420
+ manifests: [],
3421
+ capabilities: {},
3422
+ workbench: {
3423
+ pkg: "@dsh-workbench/core",
3424
+ installed: "0.1.18",
3425
+ latest: "0.1.19",
3426
+ local: true
3427
+ },
3428
+ expect: {
3429
+ rows: 0,
3430
+ workbenchState: "installed",
3431
+ workbenchActions: [],
3432
+ workbenchNoteKey: "panels.market.workbenchLocal"
3433
+ }
3434
+ },
3435
+ {
3436
+ id: "workbench-updated",
3437
+ label: "工作台刚更新完(新版已经在盘上:行上就是新版,没有按钮、也不劝人重启)",
3438
+ manifests: [],
3439
+ capabilities: {},
3440
+ workbench: {
3441
+ pkg: "@dsh-workbench/core",
3442
+ installed: "0.1.19"
3443
+ },
3444
+ expect: {
3445
+ rows: 0,
3446
+ workbenchState: "installed",
3447
+ workbenchActions: []
3448
+ }
3449
+ },
2966
3450
  {
2967
3451
  id: "empty",
2968
3452
  label: "市场空态",
@@ -3032,11 +3516,13 @@ window.__ModuleLoader__.load({
3032
3516
  //#endregion
3033
3517
  //#region src/app/units/registry.ts
3034
3518
  function toBoardModule(face, manifest) {
3519
+ const View = face.card;
3520
+ if (View === void 0) return void 0;
3035
3521
  return {
3036
3522
  id: manifest.id,
3037
3523
  titleKey: manifest.card?.titleKey ?? manifest.id,
3038
3524
  order: manifest.card?.order ?? 100,
3039
- View: face.card,
3525
+ View,
3040
3526
  ...face.steps === void 0 ? {} : { steps: face.steps }
3041
3527
  };
3042
3528
  }
@@ -3046,6 +3532,7 @@ window.__ModuleLoader__.load({
3046
3532
  const listeners = /* @__PURE__ */ new Set();
3047
3533
  const board = createBoardRegistry();
3048
3534
  let known = /* @__PURE__ */ new Map();
3535
+ let installableIds = null;
3049
3536
  let revision = 0;
3050
3537
  let manifestsCache;
3051
3538
  function notify() {
@@ -3056,9 +3543,10 @@ window.__ModuleLoader__.load({
3056
3543
  console.warn(`[dsh-workbench] 套件注册的订阅者报错(不影响其它订阅者与这次注册):${String(error)}`);
3057
3544
  }
3058
3545
  }
3059
- function warnRefusal(unit, reasons) {
3546
+ function warnRefusal(unit, kind, reasons) {
3060
3547
  refusals.push({
3061
3548
  unit,
3549
+ kind,
3062
3550
  reasons
3063
3551
  });
3064
3552
  console.warn(`[dsh-workbench] ${unit === "" ? "这个模块" : unit} 的卡片没挂上:${reasons.join(";")}`);
@@ -3069,9 +3557,10 @@ window.__ModuleLoader__.load({
3069
3557
  function attach(entry) {
3070
3558
  const manifest = known.get(entry.unit);
3071
3559
  if (manifest === void 0) return false;
3560
+ const boardModule = toBoardModule(entry.face, manifest);
3072
3561
  entry.mounted = {
3073
3562
  manifest,
3074
- unmount: board.register(toBoardModule(entry.face, manifest))
3563
+ unmount: boardModule === void 0 ? () => {} : board.register(boardModule)
3075
3564
  };
3076
3565
  takeBackRefusal(entry.unit);
3077
3566
  return true;
@@ -3084,7 +3573,7 @@ window.__ModuleLoader__.load({
3084
3573
  register(face) {
3085
3574
  const unit = typeof face?.unit === "string" ? face.unit.trim() : "";
3086
3575
  if (unit === "") {
3087
- warnRefusal("", ["registerUnit({ unit, card }) 里的 unit 是空的 —— U1b 之前的旧形状是 registerUnit({ manifest, card });现在清单由外壳从**已装清单**读出来、按 unit 交给浏览器(ADR-0038 §2.2)"]);
3576
+ warnRefusal("", "old-shape", ["registerUnit({ unit, card }) 里的 unit 是空的 —— U1b 之前的旧形状是 registerUnit({ manifest, card });现在清单由外壳从**已装清单**读出来、按 unit 交给浏览器(ADR-0038 §2.2)"]);
3088
3577
  notify();
3089
3578
  return () => {};
3090
3579
  }
@@ -3097,7 +3586,7 @@ window.__ModuleLoader__.load({
3097
3586
  registrations.push(entry);
3098
3587
  manifestsCache = void 0;
3099
3588
  if (!attach(entry)) {
3100
- warnRefusal(unit, [`宿主没有担保 unit「${unit}」的清单 —— 这个包要么没装进这份 profile,要么它的 dsh.workbench 没通过校验。卡片先不挂:清单只有一处真相(ADR-0038 §2.2)`]);
3589
+ warnRefusal(unit, "no-manifest", [`宿主没有担保 unit「${unit}」的清单 —— 这个包要么没装进这份 profile,要么它的 dsh.workbench 没通过校验。卡片先不挂:清单只有一处真相(ADR-0038 §2.2)`]);
3101
3590
  options.onUnknownUnit?.(unit);
3102
3591
  }
3103
3592
  notify();
@@ -3117,8 +3606,10 @@ window.__ModuleLoader__.load({
3117
3606
  return manifestsCache;
3118
3607
  },
3119
3608
  refusals: () => refusals,
3120
- setManifests(manifests) {
3609
+ installable: () => installableIds,
3610
+ setManifests(manifests, installable) {
3121
3611
  known = new Map(manifests.map((manifest) => [manifest.id, manifest]));
3612
+ installableIds = installable === void 0 ? null : new Set(installable);
3122
3613
  let changed = false;
3123
3614
  for (const entry of registrations) {
3124
3615
  const next = known.get(entry.unit);
@@ -3128,7 +3619,7 @@ window.__ModuleLoader__.load({
3128
3619
  }
3129
3620
  if (next === void 0) {
3130
3621
  detach(entry);
3131
- warnRefusal(entry.unit, [`宿主不再担保 unit「${entry.unit}」的清单(模块被卸了?)—— 这张卡片先摘下来`]);
3622
+ warnRefusal(entry.unit, "withdrawn", [`宿主不再担保 unit「${entry.unit}」的清单(模块被卸了?)—— 这张卡片先摘下来`]);
3132
3623
  changed = true;
3133
3624
  }
3134
3625
  }
@@ -3239,16 +3730,153 @@ window.__ModuleLoader__.load({
3239
3730
  function fixtureRoster(roster) {
3240
3731
  return hasCard(roster) ? roster : SAMPLE_ROSTER;
3241
3732
  }
3733
+ function boardModuleOf(face) {
3734
+ const module = toBoardModule(face, face.manifest);
3735
+ return module === void 0 ? [] : [module];
3736
+ }
3242
3737
  function fixtureSeed(roster, all, crash = false) {
3243
- const base = hasCard(roster) ? all : [toBoardModule(FIXTURE_FACE, FIXTURE_FACE.manifest)];
3244
- return crash ? [toBoardModule(CRASH_FACE, CRASH_FACE.manifest), ...base] : base;
3738
+ const base = hasCard(roster) ? all : boardModuleOf(FIXTURE_FACE);
3739
+ return crash ? [...boardModuleOf(CRASH_FACE), ...base] : base;
3740
+ }
3741
+ //#endregion
3742
+ //#region src/app/layouts/rightbar/market-shared-rows.ts
3743
+ var SHARED_STATE_KEY = {
3744
+ checking: "panels.market.checking",
3745
+ installed: "panels.market.sharedOk",
3746
+ outdated: "panels.market.sharedOutdated",
3747
+ unsatisfied: "panels.market.sharedUnsatisfied",
3748
+ missing: "panels.market.sharedMissing",
3749
+ unchecked: "panels.market.unchecked"
3750
+ };
3751
+ var SHARED_DOT = {
3752
+ checking: "ongoing",
3753
+ installed: "done",
3754
+ outdated: "warning",
3755
+ unsatisfied: "warning",
3756
+ missing: "idle",
3757
+ unchecked: "idle"
3758
+ };
3759
+ function sharedActions(row) {
3760
+ return [...row.canUpdate ? ["update-dependency"] : []];
3761
+ }
3762
+ var SHARED_RANK = {
3763
+ checking: -1,
3764
+ unchecked: 0,
3765
+ installed: 1,
3766
+ outdated: 2,
3767
+ unsatisfied: 3,
3768
+ missing: 4
3769
+ };
3770
+ function sharedRows(manifests, capabilities) {
3771
+ const catalog = manifests.filter((manifest) => (manifest.env?.plugins ?? []).length > 0 || (manifest.env?.libs ?? []).length > 0);
3772
+ const byId = new Map(catalog.map((manifest) => [manifest.id, manifest]));
3773
+ const buckets = /* @__PURE__ */ new Map();
3774
+ const bucketOf = (kind, name, label, purpose) => {
3775
+ const id = `${kind}:${name}`;
3776
+ const found = buckets.get(id);
3777
+ if (found !== void 0) return found;
3778
+ const created = {
3779
+ kind,
3780
+ name,
3781
+ label,
3782
+ users: [],
3783
+ states: [],
3784
+ ...purpose === void 0 ? {} : { purpose }
3785
+ };
3786
+ buckets.set(id, created);
3787
+ return created;
3788
+ };
3789
+ for (const manifest of catalog) {
3790
+ const capability = capabilities?.[manifest.id];
3791
+ const released = capability?.released === true;
3792
+ for (const need of manifest.env?.plugins ?? []) {
3793
+ const source = need.installSource;
3794
+ const bucket = bucketOf("plugin", need.name, source?.kind === "npm" ? source.package : need.name);
3795
+ if (released) continue;
3796
+ bucket.users.push(manifest.id);
3797
+ const state = capability?.plugins?.find((item) => item.name === need.name);
3798
+ bucket.states.push(state === void 0 ? "unchecked" : state.status === "ok" ? "installed" : state.status);
3799
+ if (state?.release !== void 0) {
3800
+ bucket.installed ??= state.release.installed;
3801
+ bucket.latest ??= state.release.latest;
3802
+ }
3803
+ bucket.command ??= state?.command;
3804
+ }
3805
+ for (const need of manifest.env?.libs ?? []) {
3806
+ const bucket = bucketOf("lib", need.name, need.name, need.purpose);
3807
+ if (released) continue;
3808
+ bucket.users.push(manifest.id);
3809
+ const state = capability?.libs?.find((item) => item.name === need.name);
3810
+ bucket.states.push(state === void 0 ? "unchecked" : state.status === "ok" ? "installed" : state.status);
3811
+ bucket.installed ??= state?.installed;
3812
+ bucket.latest ??= state?.latest;
3813
+ bucket.command ??= state?.command;
3814
+ }
3815
+ }
3816
+ const rows = [];
3817
+ for (const bucket of buckets.values()) {
3818
+ if (bucket.users.length === 0) continue;
3819
+ const state = capabilities === null ? "checking" : bucket.states.reduce((soFar, item) => SHARED_RANK[item] > SHARED_RANK[soFar] ? item : soFar, "unchecked");
3820
+ const version = bucket.installed === void 0 && bucket.latest === void 0 ? void 0 : {
3821
+ ...bucket.installed === void 0 ? {} : { installed: bucket.installed },
3822
+ ...bucket.latest === void 0 ? {} : { latest: bucket.latest }
3823
+ };
3824
+ const detail = bucket.purpose === void 0 ? void 0 : `${bucket.label} —— ${bucket.purpose}`;
3825
+ rows.push({
3826
+ id: `${bucket.kind}:${bucket.name}`,
3827
+ kind: bucket.kind,
3828
+ label: bucket.label,
3829
+ usedByKeys: bucket.users.map((unit) => byId.get(unit)?.card?.titleKey ?? unit),
3830
+ state,
3831
+ canUpdate: state === "outdated" || state === "unsatisfied",
3832
+ ...version === void 0 ? {} : { version },
3833
+ ...detail === void 0 ? {} : { detail }
3834
+ });
3835
+ }
3836
+ return rows;
3837
+ }
3838
+ //#endregion
3839
+ //#region src/app/layouts/rightbar/market-workbench-row.ts
3840
+ var WORKBENCH_ROW_ID = "workbench:self";
3841
+ var WORKBENCH_TITLE_KEY = "panels.market.workbenchName";
3842
+ function workbenchRow(version) {
3843
+ if (version === null || version === void 0 || version.installed === "") return void 0;
3844
+ const local = version.local === true;
3845
+ const latest = local ? void 0 : version.latest;
3846
+ const update = latest !== void 0 && latest !== version.installed ? {
3847
+ installed: version.installed,
3848
+ latest
3849
+ } : void 0;
3850
+ const note = local ? {
3851
+ key: "panels.market.workbenchLocal",
3852
+ params: {}
3853
+ } : void 0;
3854
+ return {
3855
+ id: WORKBENCH_ROW_ID,
3856
+ titleKey: WORKBENCH_TITLE_KEY,
3857
+ workbench: true,
3858
+ state: update === void 0 ? "installed" : "outdated",
3859
+ canInstall: false,
3860
+ canUpdate: update !== void 0,
3861
+ canUninstall: false,
3862
+ ...note === void 0 ? {} : { note },
3863
+ version: {
3864
+ installed: version.installed,
3865
+ ...latest === void 0 ? {} : { latest }
3866
+ },
3867
+ ...update === void 0 ? {} : { moduleUpdate: update },
3868
+ pkg: version.pkg
3869
+ };
3245
3870
  }
3246
3871
  //#endregion
3247
3872
  //#region src/app/layouts/rightbar/market-rows.ts
3248
3873
  var MARKET_STATE_KEY = {
3249
3874
  checking: "panels.market.checking",
3250
3875
  installed: "panels.market.installed",
3251
- outdated: "panels.market.outdated",
3876
+ inactive: "panels.market.notActive",
3877
+ unusable: "panels.market.notUsable",
3878
+ broken: "panels.market.broken",
3879
+ outdated: "panels.market.moduleOutdated",
3252
3880
  missing: "panels.market.missing",
3253
3881
  unchecked: "panels.market.unchecked",
3254
3882
  unknown: "panels.market.unchecked"
@@ -3256,6 +3884,9 @@ window.__ModuleLoader__.load({
3256
3884
  var MARKET_DOT = {
3257
3885
  checking: "ongoing",
3258
3886
  installed: "done",
3887
+ inactive: "error",
3888
+ unusable: "error",
3889
+ broken: "error",
3259
3890
  outdated: "warning",
3260
3891
  missing: "idle",
3261
3892
  unchecked: "idle",
@@ -3265,8 +3896,9 @@ window.__ModuleLoader__.load({
3265
3896
  return row.label ?? t(row.titleKey);
3266
3897
  }
3267
3898
  function withClientRefusals(modules, refusals) {
3268
- if (refusals.length === 0) return modules;
3269
- const byUnit = new Map(refusals.map((one) => [one.unit, one.reasons]));
3899
+ const refused = refusals.filter((one) => one.kind !== "no-manifest");
3900
+ if (refused.length === 0) return modules;
3901
+ const byUnit = new Map(refused.map((one) => [one.unit, one.reasons]));
3270
3902
  return modules.map((module) => {
3271
3903
  const reasons = byUnit.get(module.unit);
3272
3904
  return reasons === void 0 ? module : {
@@ -3290,20 +3922,21 @@ window.__ModuleLoader__.load({
3290
3922
  }
3291
3923
  return next ?? known;
3292
3924
  }
3293
- function installedRows(modules, manifests, listed, known) {
3925
+ function installedRows(modules, manifests, listed, known, defaults = /* @__PURE__ */ new Set(), changed = {}) {
3294
3926
  const titles = new Map(manifests.map((manifest) => [manifest.id, manifest.card?.titleKey]));
3295
3927
  const rows = [];
3296
3928
  for (const module of modules) {
3297
3929
  if (listed.has(module.unit)) continue;
3298
- const latest = module.latest;
3930
+ const latest = module.local === true ? void 0 : module.latest;
3299
3931
  const outdated = latest !== void 0 && latest !== module.installed;
3300
3932
  const loaded = titles.has(module.unit);
3301
3933
  const refused = refusalReasons(module.refused, module.clientRefused);
3934
+ const pending = !loaded && refused.length === 0;
3302
3935
  rows.push({
3303
3936
  id: module.unit,
3304
3937
  titleKey: titles.get(module.unit) ?? known?.get(module.unit) ?? module.pkg,
3305
- state: outdated ? "outdated" : "installed",
3306
- ...loaded || refused.length > 0 ? {} : { hint: "panels.market.moduleRestartHint" },
3938
+ state: outdated ? "outdated" : refused.length > 0 ? "unusable" : pending ? "inactive" : "installed",
3939
+ ...pending ? { hint: "panels.market.moduleRestartHint" } : {},
3307
3940
  ...refused.length === 0 ? {} : { note: {
3308
3941
  key: "panels.market.moduleRefused",
3309
3942
  params: { reason: refused.join(";") }
@@ -3320,12 +3953,19 @@ window.__ModuleLoader__.load({
3320
3953
  ...outdated ? { moduleUpdate: {
3321
3954
  installed: module.installed,
3322
3955
  latest
3323
- } } : {}
3956
+ } } : {},
3957
+ defaultShown: defaults.has(module.unit),
3958
+ defaultChanged: changed[module.unit] ?? 0
3324
3959
  });
3325
3960
  }
3326
3961
  return rows;
3327
3962
  }
3963
+ var SWITCH_LOCKED = /* @__PURE__ */ new Set(["unusable", "broken"]);
3964
+ function marketSwitchLocked(row) {
3965
+ return SWITCH_LOCKED.has(row.state);
3966
+ }
3328
3967
  function marketActions$1(row) {
3968
+ if (row.workbench === true) return row.canUpdate ? ["update-workbench"] : [];
3329
3969
  if (row.plugin === true) return [...row.canUpdate ? ["update-plugin"] : [], ...row.canUninstall ? ["uninstall-plugin"] : []];
3330
3970
  return [
3331
3971
  ...row.canInstall ? ["install"] : [],
@@ -3333,8 +3973,8 @@ window.__ModuleLoader__.load({
3333
3973
  ...row.canUninstall ? [row.pkg === void 0 ? "uninstall" : "remove-bundle"] : []
3334
3974
  ];
3335
3975
  }
3336
- function stateOf(capability) {
3337
- if (capability === void 0) return "unknown";
3976
+ function stateOf(capability, manifest, installed) {
3977
+ if (capability === void 0) return installed && !hasEnvSupply(manifest) ? "installed" : "unknown";
3338
3978
  if (capability.released === true) return "missing";
3339
3979
  if (capability.status === "missing-plugin") return "missing";
3340
3980
  if (capability.status === "unchecked") return "unchecked";
@@ -3350,8 +3990,9 @@ window.__ModuleLoader__.load({
3350
3990
  if (source.kind === "npm") return source.registryEnv;
3351
3991
  return "";
3352
3992
  }
3353
- function noteOf$1(state, install, manifest) {
3993
+ function noteOf$1(state, capability, manifest) {
3354
3994
  if (state === "installed") return void 0;
3995
+ const install = capability?.install;
3355
3996
  if (install === "env-missing") return {
3356
3997
  key: "panels.market.needEnv",
3357
3998
  params: { env: envNameOf((manifest.env?.plugins ?? []).find((need) => envNameOf(need.installSource) !== "")?.installSource) }
@@ -3364,9 +4005,19 @@ window.__ModuleLoader__.load({
3364
4005
  key: "panels.market.badSource",
3365
4006
  params: {}
3366
4007
  };
4008
+ const missing = capability?.missing ?? [];
4009
+ if (state === "outdated" && missing.length > 0) return {
4010
+ key: "panels.market.needCommands",
4011
+ params: { commands: missing.join("、") },
4012
+ tone: "plain"
4013
+ };
3367
4014
  }
3368
4015
  function isOnMachine(state) {
3369
- return state === "installed" || state === "outdated";
4016
+ return state === "installed" || state === "outdated" || state === "inactive" || state === "unusable" || state === "broken";
4017
+ }
4018
+ function marketCatalog(manifests, installable) {
4019
+ if (installable === void 0 || installable === null) return manifests.filter(hasEnvSupply);
4020
+ return manifests.filter((manifest) => installable.has(manifest.id));
3370
4021
  }
3371
4022
  function liveManifests(manifests, capabilities, installed) {
3372
4023
  if (capabilities === null || installed === null) return manifests;
@@ -3380,14 +4031,19 @@ window.__ModuleLoader__.load({
3380
4031
  function marketUpdatesOf(modules) {
3381
4032
  if (modules === null) return {};
3382
4033
  const next = {};
3383
- for (const module of modules) next[module.unit] = {
3384
- installed: module.installed,
3385
- ...module.latest === void 0 ? {} : { latest: module.latest }
3386
- };
4034
+ for (const module of modules) {
4035
+ const local = module.local === true;
4036
+ next[module.unit] = {
4037
+ installed: module.installed,
4038
+ ...local || module.latest === void 0 ? {} : { latest: module.latest },
4039
+ ...local ? { local: true } : {}
4040
+ };
4041
+ }
3387
4042
  return next;
3388
4043
  }
3389
- function marketHintVisible(manifests, capabilities, modules) {
3390
- return marketHasUpdates(marketRows(manifests, capabilities, marketUpdatesOf(modules)), sharedRows(manifests, capabilities));
4044
+ function marketHintVisible(manifests, capabilities, modules, workbench) {
4045
+ const self = workbenchRow(workbench);
4046
+ return marketHasUpdates([...marketRows(manifests, capabilities, marketUpdatesOf(modules)), ...self === void 0 ? [] : [self]], sharedRows(manifests, capabilities));
3391
4047
  }
3392
4048
  function marketSections(rows) {
3393
4049
  const installed = rows.filter((row) => isOnMachine(row.state));
@@ -3402,17 +4058,17 @@ window.__ModuleLoader__.load({
3402
4058
  rows: rest
3403
4059
  }]];
3404
4060
  }
3405
- function marketRows(manifests, capabilities, updates = {}) {
3406
- const catalog = manifests.filter((manifest) => (manifest.env?.plugins ?? []).length > 0 || (manifest.env?.libs ?? []).length > 0);
4061
+ function marketRows(manifests, capabilities, updates = {}, defaults = /* @__PURE__ */ new Set(), changed = {}) {
3407
4062
  const rows = [];
3408
- for (const manifest of catalog) {
4063
+ for (const manifest of manifests) {
3409
4064
  const capability = capabilities?.[manifest.id];
3410
4065
  const install = capability?.install;
3411
- const state = capabilities === null ? "checking" : stateOf(capability);
3412
- const note = noteOf$1(state, install, manifest);
4066
+ const entry = updates[manifest.id];
4067
+ const local = entry?.local === true;
4068
+ const state = capabilities === null ? "checking" : stateOf(capability, manifest, entry !== void 0);
4069
+ const note = noteOf$1(state, capability, manifest);
3413
4070
  const onMachine = isOnMachine(state);
3414
4071
  const reAdopt = capability?.released === true && install === void 0;
3415
- const entry = updates[manifest.id];
3416
4072
  const moduleUpdate = entry === void 0 || entry.latest === void 0 || entry.latest === entry.installed ? void 0 : {
3417
4073
  installed: entry.installed,
3418
4074
  latest: entry.latest
@@ -3429,101 +4085,10 @@ window.__ModuleLoader__.load({
3429
4085
  ...entry.latest === void 0 ? {} : { latest: entry.latest }
3430
4086
  } },
3431
4087
  ...moduleUpdate === void 0 ? {} : { moduleUpdate },
3432
- ...moduleUpdate === void 0 ? note === void 0 ? {} : { note } : {}
3433
- });
3434
- }
3435
- return rows;
3436
- }
3437
- var SHARED_STATE_KEY = {
3438
- checking: "panels.market.checking",
3439
- installed: "panels.market.sharedOk",
3440
- outdated: "panels.market.sharedOutdated",
3441
- unsatisfied: "panels.market.sharedUnsatisfied",
3442
- missing: "panels.market.sharedMissing",
3443
- unchecked: "panels.market.unchecked"
3444
- };
3445
- var SHARED_DOT = {
3446
- checking: "ongoing",
3447
- installed: "done",
3448
- outdated: "warning",
3449
- unsatisfied: "warning",
3450
- missing: "idle",
3451
- unchecked: "idle"
3452
- };
3453
- function sharedActions(row) {
3454
- return [...row.canUpdate ? ["update-dependency"] : []];
3455
- }
3456
- var SHARED_RANK = {
3457
- checking: -1,
3458
- unchecked: 0,
3459
- installed: 1,
3460
- outdated: 2,
3461
- unsatisfied: 3,
3462
- missing: 4
3463
- };
3464
- function sharedRows(manifests, capabilities) {
3465
- const catalog = manifests.filter((manifest) => (manifest.env?.plugins ?? []).length > 0 || (manifest.env?.libs ?? []).length > 0);
3466
- const byId = new Map(catalog.map((manifest) => [manifest.id, manifest]));
3467
- const buckets = /* @__PURE__ */ new Map();
3468
- const bucketOf = (kind, name, label, purpose) => {
3469
- const id = `${kind}:${name}`;
3470
- const found = buckets.get(id);
3471
- if (found !== void 0) return found;
3472
- const created = {
3473
- kind,
3474
- name,
3475
- label,
3476
- users: [],
3477
- states: [],
3478
- ...purpose === void 0 ? {} : { purpose }
3479
- };
3480
- buckets.set(id, created);
3481
- return created;
3482
- };
3483
- for (const manifest of catalog) {
3484
- const capability = capabilities?.[manifest.id];
3485
- const released = capability?.released === true;
3486
- for (const need of manifest.env?.plugins ?? []) {
3487
- const source = need.installSource;
3488
- const bucket = bucketOf("plugin", need.name, source?.kind === "npm" ? source.package : need.name);
3489
- if (released) continue;
3490
- bucket.users.push(manifest.id);
3491
- const state = capability?.plugins?.find((item) => item.name === need.name);
3492
- bucket.states.push(state === void 0 ? "unchecked" : state.status === "ok" ? "installed" : state.status);
3493
- if (state?.release !== void 0) {
3494
- bucket.installed ??= state.release.installed;
3495
- bucket.latest ??= state.release.latest;
3496
- }
3497
- bucket.command ??= state?.command;
3498
- }
3499
- for (const need of manifest.env?.libs ?? []) {
3500
- const bucket = bucketOf("lib", need.name, need.name, need.purpose);
3501
- if (released) continue;
3502
- bucket.users.push(manifest.id);
3503
- const state = capability?.libs?.find((item) => item.name === need.name);
3504
- bucket.states.push(state === void 0 ? "unchecked" : state.status === "ok" ? "installed" : state.status);
3505
- bucket.installed ??= state?.installed;
3506
- bucket.latest ??= state?.latest;
3507
- bucket.command ??= state?.command;
3508
- }
3509
- }
3510
- const rows = [];
3511
- for (const bucket of buckets.values()) {
3512
- if (bucket.users.length === 0) continue;
3513
- const state = capabilities === null ? "checking" : bucket.states.reduce((soFar, item) => SHARED_RANK[item] > SHARED_RANK[soFar] ? item : soFar, "unchecked");
3514
- const version = bucket.installed === void 0 && bucket.latest === void 0 ? void 0 : {
3515
- ...bucket.installed === void 0 ? {} : { installed: bucket.installed },
3516
- ...bucket.latest === void 0 ? {} : { latest: bucket.latest }
3517
- };
3518
- const detail = bucket.purpose === void 0 ? void 0 : `${bucket.label} —— ${bucket.purpose}`;
3519
- rows.push({
3520
- id: `${bucket.kind}:${bucket.name}`,
3521
- label: bucket.label,
3522
- usedByKeys: bucket.users.map((unit) => byId.get(unit)?.card?.titleKey ?? unit),
3523
- state,
3524
- canUpdate: state === "outdated" || state === "unsatisfied",
3525
- ...version === void 0 ? {} : { version },
3526
- ...detail === void 0 ? {} : { detail }
4088
+ ...moduleUpdate === void 0 ? note === void 0 ? {} : { note } : {},
4089
+ ...local ? { local: true } : {},
4090
+ defaultShown: defaults.has(manifest.id),
4091
+ defaultChanged: changed[manifest.id] ?? 0
3527
4092
  });
3528
4093
  }
3529
4094
  return rows;
@@ -3581,6 +4146,42 @@ window.__ModuleLoader__.load({
3581
4146
  };
3582
4147
  }
3583
4148
  //#endregion
4149
+ //#region src/shared/hooks/use-visible-busy.ts
4150
+ var use_visible_busy_exports = /* @__PURE__ */ __exportAll({
4151
+ busyView: () => busyView,
4152
+ heldPhase: () => heldPhase,
4153
+ useVisibleBusy: () => useVisibleBusy
4154
+ });
4155
+ function heldPhase(phase, refreshing) {
4156
+ return refreshing && phase === "ready" ? "loading" : phase;
4157
+ }
4158
+ function busyView(active, visible) {
4159
+ return {
4160
+ busy: visible,
4161
+ settling: visible && !active
4162
+ };
4163
+ }
4164
+ function useVisibleBusy(active, floorMs) {
4165
+ const [visible, setVisible] = useState(active);
4166
+ const since = useRef(null);
4167
+ useEffect(() => {
4168
+ if (active) {
4169
+ if (since.current === null) since.current = Date.now();
4170
+ setVisible(true);
4171
+ return;
4172
+ }
4173
+ const held = holdBusy(since.current, Date.now(), floorMs);
4174
+ since.current = null;
4175
+ if (!held.visible) {
4176
+ setVisible(false);
4177
+ return;
4178
+ }
4179
+ const timer = setTimeout(() => setVisible(false), held.releaseInMs);
4180
+ return () => clearTimeout(timer);
4181
+ }, [active, floorMs]);
4182
+ return busyView(active, visible);
4183
+ }
4184
+ //#endregion
3584
4185
  //#region src/app/layouts/rightbar/market-plugin-rows.ts
3585
4186
  function installedPluginKept(value) {
3586
4187
  if (typeof value !== "object" || value === null) return void 0;
@@ -3598,34 +4199,40 @@ window.__ModuleLoader__.load({
3598
4199
  names
3599
4200
  };
3600
4201
  }
4202
+ function installedPluginNotice(value, t) {
4203
+ const kept = installedPluginKept(value);
4204
+ if (kept === void 0) return null;
4205
+ return t(kept.key, kept.names === void 0 ? {} : { names: kept.names.join(t("panels.market.listSeparator")) });
4206
+ }
3601
4207
  function noteOf(plugin) {
3602
4208
  if (plugin.broken === true) return {
3603
4209
  key: "panels.market.pluginBroken",
3604
- params: {}
4210
+ params: {},
4211
+ tone: "alert"
3605
4212
  };
3606
4213
  if (plugin.local === true) return void 0;
3607
- if (plugin.name !== void 0 && plugin.name !== plugin.pkg) return {
3608
- key: "panels.market.pluginAlsoKnownAs",
3609
- params: { pkg: plugin.pkg }
3610
- };
3611
4214
  }
3612
- function installedPluginRows(plugins) {
4215
+ function installedPluginRows(plugins, defaults = /* @__PURE__ */ new Set(), changed = {}) {
3613
4216
  return plugins.map((plugin) => {
4217
+ const id = `plugin:${plugin.pkg}`;
3614
4218
  const name = plugin.name ?? plugin.pkg;
3615
4219
  const outdated = plugin.installed !== void 0 && plugin.latest !== void 0 && plugin.latest !== plugin.installed;
3616
4220
  const note = noteOf(plugin);
3617
4221
  return {
3618
- id: `plugin:${plugin.pkg}`,
4222
+ id,
3619
4223
  titleKey: plugin.pkg,
3620
4224
  label: name,
3621
4225
  plugin: true,
3622
- state: outdated ? "outdated" : "installed",
4226
+ state: outdated ? "outdated" : plugin.broken === true ? "broken" : "installed",
3623
4227
  canInstall: false,
3624
4228
  canUpdate: outdated,
3625
4229
  canUninstall: true,
3626
4230
  ...plugin.local === true ? { local: true } : {},
3627
4231
  ...plugin.broken === true ? { broken: true } : {},
4232
+ defaultShown: defaults.has(id),
4233
+ defaultChanged: changed[id] ?? 0,
3628
4234
  ...note === void 0 ? {} : { note },
4235
+ ...plugin.installed === void 0 ? {} : { versionLabel: `${plugin.pkg}@${plugin.installed}` },
3629
4236
  pkg: plugin.pkg,
3630
4237
  ...plugin.installed === void 0 ? {} : { version: {
3631
4238
  installed: plugin.installed,
@@ -3634,8 +4241,315 @@ window.__ModuleLoader__.load({
3634
4241
  };
3635
4242
  });
3636
4243
  }
4244
+ var MarketPage_module_default = {
4245
+ marketList: "_marketList_csyus_1",
4246
+ marketRow: "_marketRow_csyus_10",
4247
+ marketIcon: "_marketIcon_csyus_20",
4248
+ marketMain: "_marketMain_csyus_32",
4249
+ marketName: "_marketName_csyus_39",
4250
+ marketDesc: "_marketDesc_csyus_48",
4251
+ marketUsedBy: "_marketUsedBy_csyus_59",
4252
+ marketVersion: "_marketVersion_csyus_73",
4253
+ marketLocalTag: "_marketLocalTag_csyus_95",
4254
+ marketEnd: "_marketEnd_csyus_106",
4255
+ marketSwitchSeat: "_marketSwitchSeat_csyus_113",
4256
+ marketActions: "_marketActions_csyus_126",
4257
+ marketUpdateAction: "_marketUpdateAction_csyus_132",
4258
+ marketSelfDivider: "_marketSelfDivider_csyus_138",
4259
+ marketSection: "_marketSection_csyus_143",
4260
+ marketSectionHead: "_marketSectionHead_csyus_150",
4261
+ marketSectionIcon: "_marketSectionIcon_csyus_156",
4262
+ marketSectionTitle: "_marketSectionTitle_csyus_163",
4263
+ marketSectionCount: "_marketSectionCount_csyus_169",
4264
+ marketProgress: "_marketProgress_csyus_176",
4265
+ marketNote: "_marketNote_csyus_186",
4266
+ marketNotePlain: "_marketNotePlain_csyus_193",
4267
+ marketFailure: "_marketFailure_csyus_201",
4268
+ marketEmpty: "_marketEmpty_csyus_208",
4269
+ marketPage: "_marketPage_csyus_213",
4270
+ marketPageHead: "_marketPageHead_csyus_231",
4271
+ marketPageTitle: "_marketPageTitle_csyus_239",
4272
+ marketPageIntro: "_marketPageIntro_csyus_244",
4273
+ marketPageTools: "_marketPageTools_csyus_250",
4274
+ marketIconButton: "_marketIconButton_csyus_259",
4275
+ marketIconWrap: "_marketIconWrap_csyus_284",
4276
+ marketIconButtonSpinning: "_marketIconButtonSpinning_csyus_288",
4277
+ "wb-spin": "_wb-spin_csyus_1",
4278
+ marketAddButton: "_marketAddButton_csyus_292",
4279
+ marketChecking: "_marketChecking_csyus_309",
4280
+ marketEmptyTitle: "_marketEmptyTitle_csyus_317"
4281
+ };
4282
+ //#endregion
4283
+ //#region src/app/layouts/rightbar/MarketStates.tsx
4284
+ function MarketChecking({ t }) {
4285
+ return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketChecking }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4286
+ state: "ongoing",
4287
+ size: 14
4288
+ }), t("panels.market.checking")));
4289
+ }
4290
+ function MarketEmpty({ t }) {
4291
+ return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmptyTitle }, t("panels.market.empty")));
4292
+ }
4293
+ //#endregion
4294
+ //#region src/app/layouts/rightbar/market-section-icon.ts
4295
+ var SIZE$1 = 14;
4296
+ function marketSectionIcon(kind) {
4297
+ switch (kind) {
4298
+ case "installed": return h(IconModules, { size: SIZE$1 });
4299
+ case "pending": return h(_deepseek_ai_dsh_client_ui_primitives.IconDownloadOutlineRegular, { size: SIZE$1 });
4300
+ case "plugins": return h(_deepseek_ai_dsh_client_ui_primitives.IconCordisPluginOutlineRegular, { size: SIZE$1 });
4301
+ case "shared": return h(_deepseek_ai_dsh_client_ui_primitives.IconLinkOutlineRegular, { size: SIZE$1 });
4302
+ }
4303
+ }
4304
+ //#endregion
4305
+ //#region src/app/layouts/rightbar/market-row-icon.ts
4306
+ var SIZE = 18;
4307
+ function packageIcon(kind) {
4308
+ switch (kind) {
4309
+ case "module": return h(_deepseek_ai_dsh_client_ui_primitives.IconArchiveOutlineRegular, { size: SIZE });
4310
+ case "plugin": return h(IconOpencli, { size: SIZE });
4311
+ case "lib": return h(IconNpm, { size: SIZE });
4312
+ case "workbench": return h(IconPanelScreen, { size: SIZE });
4313
+ }
4314
+ }
4315
+ function marketRowKind(row) {
4316
+ if (row.workbench === true) return "workbench";
4317
+ if (row.plugin === true) return "plugin";
4318
+ return "module";
4319
+ }
4320
+ function sharedRowKind(row) {
4321
+ return row.kind === "plugin" ? "plugin" : "lib";
4322
+ }
4323
+ //#endregion
4324
+ //#region src/app/layouts/rightbar/market-view-text.ts
4325
+ var PROGRESS_KEY = {
4326
+ install: "panels.market.installing",
4327
+ update: "panels.market.updating",
4328
+ "update-bundle": "panels.market.updating",
4329
+ "remove-bundle": "panels.market.uninstalling",
4330
+ uninstall: "panels.market.uninstalling",
4331
+ "update-dependency": "panels.market.updating",
4332
+ "update-plugin": "panels.market.updating",
4333
+ "uninstall-plugin": "panels.market.uninstalling",
4334
+ "update-workbench": "panels.market.updating"
4335
+ };
4336
+ var ACTION_LABEL_KEY = {
4337
+ install: "panels.market.install",
4338
+ update: "panels.market.update",
4339
+ "update-bundle": "panels.market.update",
4340
+ "remove-bundle": "panels.market.uninstall",
4341
+ uninstall: "panels.market.uninstall",
4342
+ "update-dependency": "panels.market.update",
4343
+ "update-plugin": "panels.market.update",
4344
+ "uninstall-plugin": "panels.market.uninstall",
4345
+ "update-workbench": "panels.market.update"
4346
+ };
4347
+ function pendingRowOf(input) {
4348
+ const { pending, removing } = input;
4349
+ if (removing === null || pending === null) return void 0;
4350
+ if (input.rows.some((row) => row.id === removing)) return void 0;
4351
+ return {
4352
+ id: removing,
4353
+ titleKey: pending.titleKey ?? input.titles.get(removing) ?? removing,
4354
+ state: "installed",
4355
+ canInstall: false,
4356
+ canUpdate: false,
4357
+ canUninstall: true,
4358
+ ...pending.pkg === void 0 ? {} : { pkg: pending.pkg },
4359
+ ...pending.version === void 0 ? {} : { version: { installed: pending.version } }
4360
+ };
4361
+ }
4362
+ //#endregion
4363
+ //#region src/app/layouts/rightbar/SharedSection.tsx
4364
+ function SharedLine({ t, row, pending, failure, onAct }) {
4365
+ const running = pending !== null && pending.id === row.id ? pending : null;
4366
+ const locked = pending !== null;
4367
+ const actions = sharedActions(row);
4368
+ const stateText = t(SHARED_STATE_KEY[row.state]);
4369
+ const version = row.version;
4370
+ 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", {
4371
+ from: version.installed,
4372
+ to: version.latest
4373
+ }) : version.installed ?? version.latest ?? ""));
4374
+ return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
4375
+ className: MarketPage_module_default.marketIcon,
4376
+ "aria-hidden": "true"
4377
+ }, 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", {
4378
+ className: MarketPage_module_default.marketDesc,
4379
+ role: "img",
4380
+ "aria-label": stateText
4381
+ }, row.state === "checking" ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4382
+ state: "ongoing",
4383
+ size: 14
4384
+ }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4385
+ state: SHARED_DOT[row.state],
4386
+ size: 9
4387
+ }), 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(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4388
+ state: "ongoing",
4389
+ size: 14
4390
+ }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
4391
+ key: action,
4392
+ type: "button",
4393
+ size: "sm",
4394
+ variant: "outline",
4395
+ disabled: locked,
4396
+ onClick: () => onAct(action)
4397
+ }, t(ACTION_LABEL_KEY[action]))))), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
4398
+ }
4399
+ function SharedSection({ t, rows, pending, failureOf, act }) {
4400
+ if (rows.length === 0) return null;
4401
+ return /* @__PURE__ */ h("section", { className: MarketPage_module_default.marketSection }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ h("span", {
4402
+ className: MarketPage_module_default.marketSectionIcon,
4403
+ "aria-hidden": "true"
4404
+ }, 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, {
4405
+ key: row.id,
4406
+ t,
4407
+ row,
4408
+ pending,
4409
+ failure: failureOf(row.id),
4410
+ onAct: (action) => void act(row.id, action)
4411
+ }))));
4412
+ }
4413
+ //#endregion
4414
+ //#region src/app/layouts/rightbar/panel-write.ts
4415
+ var PANEL_SETTLE_MS = 4e3;
4416
+ function rowKey(row) {
4417
+ return `${row.id}:${row.shown ? "1" : "0"}:${row.source}`;
4418
+ }
4419
+ function rowKeys(rows) {
4420
+ return rows.map(rowKey).join(",");
4421
+ }
4422
+ function panelBoardSignature(units, plugins, own) {
4423
+ return `${rowKeys(units)}|${rowKeys(plugins)}|${own ? "1" : "0"}`;
4424
+ }
4425
+ function machineBoardSignature(defaults, changed) {
4426
+ const counts = Object.entries(changed).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0).map(([id, count]) => `${id}:${String(count)}`);
4427
+ return `${[...defaults].sort().join(",")}|${counts.join(",")}`;
4428
+ }
4429
+ function nextPending(pending, signature) {
4430
+ return pending !== null && pending !== signature ? null : pending;
4431
+ }
4432
+ function useBoardSettle(signature) {
4433
+ const [held, setHeld] = useState(null);
4434
+ useEffect(() => {
4435
+ setHeld((current) => nextPending(current, signature));
4436
+ }, [signature]);
4437
+ useEffect(() => {
4438
+ if (held === null) return void 0;
4439
+ const timer = setTimeout(() => setHeld(null), PANEL_SETTLE_MS);
4440
+ return () => clearTimeout(timer);
4441
+ }, [held]);
4442
+ return {
4443
+ pending: held !== null,
4444
+ begin: () => setHeld(signature),
4445
+ clear: () => setHeld(null)
4446
+ };
4447
+ }
4448
+ //#endregion
4449
+ //#region src/app/layouts/rightbar/market-section.tsx
4450
+ var dangerActions = [
4451
+ "uninstall",
4452
+ "remove-bundle",
4453
+ "uninstall-plugin"
4454
+ ];
4455
+ var updateActions = [
4456
+ "update",
4457
+ "update-bundle",
4458
+ "update-plugin",
4459
+ "update-workbench"
4460
+ ];
4461
+ function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy }) {
4462
+ const running = pending !== null && pending.id === row.id ? pending : null;
4463
+ const locked = pending !== null;
4464
+ const quiet = row.workbench === true && row.state === "installed" && row.hint === void 0;
4465
+ const actions = marketActions$1(row);
4466
+ const switchLocked = marketSwitchLocked(row);
4467
+ const stateText = t(MARKET_STATE_KEY[row.state]);
4468
+ return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
4469
+ className: MarketPage_module_default.marketIcon,
4470
+ "aria-hidden": "true"
4471
+ }, 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", {
4472
+ from: row.version.installed,
4473
+ to: row.version.latest
4474
+ }) : row.version.installed ?? row.version.latest ?? ""), row.local === true ? /* @__PURE__ */ h(Tip, { label: t("panels.market.localHint") }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketLocalTag }, t("panels.market.localMark"))) : null), quiet ? null : /* @__PURE__ */ h("span", {
4475
+ className: MarketPage_module_default.marketDesc,
4476
+ role: "img",
4477
+ "aria-label": stateText
4478
+ }, row.state === "checking" ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4479
+ state: "ongoing",
4480
+ size: 14
4481
+ }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4482
+ state: MARKET_DOT[row.state],
4483
+ size: 9
4484
+ }), 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(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4485
+ state: "ongoing",
4486
+ size: 14
4487
+ }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => {
4488
+ const danger = dangerActions.includes(action);
4489
+ const update = updateActions.includes(action);
4490
+ return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
4491
+ key: action,
4492
+ type: "button",
4493
+ size: "sm",
4494
+ variant: action === "install" ? "primary" : "outline",
4495
+ className: danger ? "wb-dangerAction" : update ? MarketPage_module_default.marketUpdateAction : void 0,
4496
+ icon: danger ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutlineRegular, { size: 13 }) : void 0,
4497
+ "aria-label": danger ? t("panels.market.uninstallLabel", { name: marketRowTitle(row, t) }) : void 0,
4498
+ disabled: locked,
4499
+ onClick: () => onAct(action)
4500
+ }, t(ACTION_LABEL_KEY[action]));
4501
+ })), row.defaultShown === void 0 ? null : /* @__PURE__ */ h(Tip, { label: t(switchLocked ? "panels.market.defaultLocked" : "panels.market.defaultHint") }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketSwitchSeat }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Switch, {
4502
+ checked: row.defaultShown,
4503
+ disabled: boardBusy === true || locked || switchLocked,
4504
+ label: `${marketRowTitle(row, t)} · ${t("panels.market.defaultLabel")}`,
4505
+ onChange: (next) => onDefault?.(next)
4506
+ })))), row.note === void 0 ? null : /* @__PURE__ */ h("div", {
4507
+ className: row.note.tone === "plain" ? MarketPage_module_default.marketNotePlain : MarketPage_module_default.marketNote,
4508
+ title: row.note.params.reason === void 0 ? void 0 : t("panels.market.moduleRefusedDetail", row.note.params)
4509
+ }, t(row.note.key, row.note.params)), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
4510
+ }
4511
+ function MarketSection({ t, titleKey, icon, rows, pending, failureOf, act, confirmActions, onConfirming, onDefault, boardBusy }) {
4512
+ if (rows.length === 0) return null;
4513
+ return /* @__PURE__ */ h("section", { className: MarketPage_module_default.marketSection }, titleKey === void 0 ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ h("span", {
4514
+ className: MarketPage_module_default.marketSectionIcon,
4515
+ "aria-hidden": "true"
4516
+ }, 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, {
4517
+ key: row.id,
4518
+ t,
4519
+ row,
4520
+ pending,
4521
+ failure: failureOf(row.id),
4522
+ onAct: (action) => confirmActions.includes(action) ? onConfirming(row.id) : void act(row.id, action),
4523
+ onDefault: (next) => onDefault?.(row.id, next),
4524
+ boardBusy
4525
+ }))));
4526
+ }
3637
4527
  //#endregion
3638
4528
  //#region src/app/layouts/market/add-module-text.ts
4529
+ function previewOf(inspection, fallback) {
4530
+ if (inspection.status === "plugin") return {
4531
+ kind: "plugin",
4532
+ name: inspection.pkg,
4533
+ version: inspection.version ?? "",
4534
+ description: "",
4535
+ registry: inspection.registry ?? "",
4536
+ ...inspection.pluginName === void 0 ? {} : { pluginName: inspection.pluginName }
4537
+ };
4538
+ return {
4539
+ kind: "module",
4540
+ name: inspection.name ?? fallback,
4541
+ version: inspection.version ?? "",
4542
+ description: inspection.description ?? "",
4543
+ registry: inspection.registry ?? ""
4544
+ };
4545
+ }
4546
+ function resultKindOf(input) {
4547
+ if (input.plugin) return "plugin";
4548
+ if (input.change.application === "failed") return "failed";
4549
+ if (input.change.application === "restart-required") return "restart";
4550
+ if (input.change.application === "cancelled" || input.supplyState === "not-a-module") return "quiet";
4551
+ return "took-effect";
4552
+ }
3639
4553
  var GUIDE_ITEMS = [
3640
4554
  {
3641
4555
  titleKey: "panels.market.add.guideIdTitle",
@@ -3823,128 +4737,60 @@ window.__ModuleLoader__.load({
3823
4737
  if (change === void 0 || SHIPPED.includes(change.application)) return void 0;
3824
4738
  return failureReason(failureCode(change), change.application, t);
3825
4739
  }
3826
- var MarketPage_module_default = {
3827
- marketList: "_marketList_z6vtq_1",
3828
- marketRow: "_marketRow_z6vtq_10",
3829
- marketIcon: "_marketIcon_z6vtq_20",
3830
- marketMain: "_marketMain_z6vtq_32",
3831
- marketName: "_marketName_z6vtq_39",
3832
- marketDesc: "_marketDesc_z6vtq_48",
3833
- marketUsedBy: "_marketUsedBy_z6vtq_59",
3834
- marketVersion: "_marketVersion_z6vtq_73",
3835
- marketEnd: "_marketEnd_z6vtq_95",
3836
- marketActions: "_marketActions_z6vtq_102",
3837
- marketSection: "_marketSection_z6vtq_108",
3838
- marketSectionHead: "_marketSectionHead_z6vtq_115",
3839
- marketSectionTitle: "_marketSectionTitle_z6vtq_121",
3840
- marketSectionCount: "_marketSectionCount_z6vtq_127",
3841
- marketProgress: "_marketProgress_z6vtq_133",
3842
- marketNote: "_marketNote_z6vtq_143",
3843
- marketFailure: "_marketFailure_z6vtq_150",
3844
- marketEmpty: "_marketEmpty_z6vtq_157",
3845
- marketPage: "_marketPage_z6vtq_162",
3846
- marketPageHead: "_marketPageHead_z6vtq_180",
3847
- marketPageTitle: "_marketPageTitle_z6vtq_188",
3848
- marketPageIntro: "_marketPageIntro_z6vtq_193",
3849
- marketPageTools: "_marketPageTools_z6vtq_199",
3850
- marketIconButton: "_marketIconButton_z6vtq_208",
3851
- marketIconWrap: "_marketIconWrap_z6vtq_233",
3852
- marketIconButtonSpinning: "_marketIconButtonSpinning_z6vtq_237",
3853
- "wb-spin": "_wb-spin_z6vtq_1",
3854
- marketAddButton: "_marketAddButton_z6vtq_241",
3855
- marketChecking: "_marketChecking_z6vtq_258",
3856
- marketEmptyTitle: "_marketEmptyTitle_z6vtq_266"
3857
- };
3858
4740
  //#endregion
3859
- //#region src/app/layouts/rightbar/MarketStates.tsx
3860
- function MarketChecking({ t }) {
3861
- return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketChecking }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3862
- state: "ongoing",
3863
- size: 14
3864
- }), t("panels.market.checking")));
3865
- }
3866
- function MarketEmpty({ t }) {
3867
- return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmptyTitle }, t("panels.market.empty")));
3868
- }
3869
- //#endregion
3870
- //#region src/app/layouts/rightbar/market-view-text.ts
3871
- var PROGRESS_KEY = {
3872
- install: "panels.market.installing",
3873
- update: "panels.market.updating",
3874
- "update-bundle": "panels.market.updating",
3875
- "remove-bundle": "panels.market.uninstalling",
3876
- uninstall: "panels.market.uninstalling",
3877
- "update-dependency": "panels.market.updating",
3878
- "update-plugin": "panels.market.updating",
3879
- "uninstall-plugin": "panels.market.uninstalling"
3880
- };
3881
- var ACTION_LABEL_KEY = {
3882
- install: "panels.market.install",
3883
- update: "panels.market.update",
3884
- "update-bundle": "panels.market.update",
3885
- "remove-bundle": "panels.market.uninstall",
3886
- uninstall: "panels.market.uninstall",
3887
- "update-dependency": "panels.market.update",
3888
- "update-plugin": "panels.market.update",
3889
- "uninstall-plugin": "panels.market.uninstall"
3890
- };
3891
- //#endregion
3892
- //#region src/app/layouts/rightbar/SharedSection.tsx
3893
- function SharedLine({ t, row, pending, failure, onAct }) {
3894
- const running = pending !== null && pending.id === row.id ? pending : null;
3895
- const locked = pending !== null;
3896
- const actions = sharedActions(row);
3897
- const stateText = t(SHARED_STATE_KEY[row.state]);
3898
- const version = row.version;
3899
- 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", {
3900
- from: version.installed,
3901
- to: version.latest
3902
- }) : version.installed ?? version.latest ?? ""));
3903
- return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
3904
- className: MarketPage_module_default.marketIcon,
3905
- "aria-hidden": "true"
3906
- }, /* @__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", {
3907
- className: MarketPage_module_default.marketDesc,
3908
- role: "img",
3909
- "aria-label": stateText
3910
- }, row.state === "checking" ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3911
- state: "ongoing",
3912
- size: 14
3913
- }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3914
- state: SHARED_DOT[row.state],
3915
- size: 9
3916
- }), 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(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3917
- state: "ongoing",
3918
- size: 14
3919
- }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3920
- key: action,
3921
- type: "button",
3922
- size: "sm",
3923
- variant: "outline",
3924
- disabled: locked,
3925
- onClick: () => onAct(action)
3926
- }, t(ACTION_LABEL_KEY[action]))))), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
3927
- }
3928
- function SharedSection({ t, rows, pending, failureOf, act }) {
3929
- if (rows.length === 0) return null;
3930
- 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, {
3931
- key: row.id,
3932
- t,
3933
- row,
3934
- pending,
3935
- failure: failureOf(row.id),
3936
- onAct: (action) => void act(row.id, action)
3937
- }))));
4741
+ //#region src/app/layouts/rightbar/market-act.ts
4742
+ function marketActOf(options) {
4743
+ const { t, mocked, rowOf, seats, send, onChanged } = options;
4744
+ return async (id, action) => {
4745
+ if (mocked) return;
4746
+ const row = rowOf(id);
4747
+ seats.setPending({
4748
+ id,
4749
+ action,
4750
+ ...row?.titleKey === void 0 ? {} : { titleKey: row.titleKey },
4751
+ ...row?.pkg === void 0 ? {} : { pkg: row.pkg },
4752
+ ...row?.version?.installed === void 0 ? {} : { version: row.version.installed }
4753
+ });
4754
+ seats.setConfirming(null);
4755
+ seats.setFailed(null);
4756
+ if (action !== "uninstall-plugin") seats.setNotice(null);
4757
+ const outcome = await send(action === "update-dependency" ? {
4758
+ action,
4759
+ id
4760
+ } : action === "remove-bundle" || action === "update-plugin" || action === "uninstall-plugin" || action === "update-workbench" ? {
4761
+ action,
4762
+ name: row?.pkg ?? ""
4763
+ } : {
4764
+ action,
4765
+ unit: id
4766
+ });
4767
+ seats.setPending(null);
4768
+ if (!outcome.ok) {
4769
+ onChanged();
4770
+ seats.setFailed({
4771
+ id,
4772
+ message: t("panels.market.failed", { reason: outcome.message })
4773
+ });
4774
+ return;
4775
+ }
4776
+ if (action === "uninstall-plugin") seats.setNotice(installedPluginNotice(outcome.value, t));
4777
+ const reason = changeFailure(changeOf(outcome.value), t);
4778
+ onChanged();
4779
+ if (reason !== void 0) seats.setFailed({
4780
+ id,
4781
+ message: t("panels.market.failed", { reason })
4782
+ });
4783
+ };
3938
4784
  }
3939
4785
  var PanelFoot_module_default = {
3940
- foot: "_foot_1us83_1",
3941
- footText: "_footText_1us83_12",
3942
- footTextMd: "_footTextMd_1us83_17"
4786
+ foot: "_foot_1ud1j_1",
4787
+ footText: "_footText_1ud1j_13",
4788
+ footTextMd: "_footTextMd_1ud1j_18"
3943
4789
  };
3944
4790
  //#endregion
3945
4791
  //#region src/shared/components/PanelFoot.tsx
3946
4792
  function PanelFoot({ text, size = "sm", children }) {
3947
- 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);
4793
+ return /* @__PURE__ */ h("footer", { className: PanelFoot_module_default.foot }, text === void 0 ? null : /* @__PURE__ */ h("span", { className: size === "md" ? PanelFoot_module_default.footTextMd : PanelFoot_module_default.footText }, text), children ?? null);
3948
4794
  }
3949
4795
  //#endregion
3950
4796
  //#region src/app/layouts/rightbar/MarketView.tsx
@@ -3953,49 +4799,6 @@ window.__ModuleLoader__.load({
3953
4799
  "remove-bundle",
3954
4800
  "uninstall-plugin"
3955
4801
  ];
3956
- var CONFIRM_REMOVE = ["remove-bundle"];
3957
- function MarketLine({ t, row, pending, failure, onAct }) {
3958
- const running = pending !== null && pending.id === row.id ? pending : null;
3959
- const locked = pending !== null;
3960
- const actions = marketActions$1(row);
3961
- const stateText = t(row.moduleUpdate === void 0 ? MARKET_STATE_KEY[row.state] : "panels.market.moduleOutdated");
3962
- return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
3963
- className: MarketPage_module_default.marketIcon,
3964
- "aria-hidden": "true"
3965
- }, /* @__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", {
3966
- from: row.version.installed,
3967
- to: row.version.latest
3968
- }) : row.version.installed ?? row.version.latest ?? "")), /* @__PURE__ */ h("span", {
3969
- className: MarketPage_module_default.marketDesc,
3970
- role: "img",
3971
- "aria-label": stateText
3972
- }, row.state === "checking" ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3973
- state: "ongoing",
3974
- size: 14
3975
- }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3976
- state: MARKET_DOT[row.state],
3977
- size: 9
3978
- }), 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(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3979
- state: "ongoing",
3980
- size: 14
3981
- }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => {
3982
- const danger = action === "uninstall" || action === "remove-bundle";
3983
- return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3984
- key: action,
3985
- type: "button",
3986
- size: "sm",
3987
- variant: action === "install" ? "primary" : "outline",
3988
- className: danger ? "wb-dangerAction" : void 0,
3989
- icon: danger ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutlineRegular, { size: 13 }) : void 0,
3990
- "aria-label": danger ? t("panels.market.uninstallLabel", { name: marketRowTitle(row, t) }) : void 0,
3991
- disabled: locked,
3992
- onClick: () => onAct(action)
3993
- }, t(ACTION_LABEL_KEY[action]));
3994
- }))), row.note === void 0 ? null : /* @__PURE__ */ h("div", {
3995
- className: MarketPage_module_default.marketNote,
3996
- title: row.note.params.reason === void 0 ? void 0 : t("panels.market.moduleRefusedDetail", row.note.params)
3997
- }, t(row.note.key, row.note.params)), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
3998
- }
3999
4802
  function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
4000
4803
  const [acknowledged, setAcknowledged] = useState(false);
4001
4804
  return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.RiskConfirmation, {
@@ -4010,26 +4813,31 @@ window.__ModuleLoader__.load({
4010
4813
  onAcknowledgedChange: setAcknowledged,
4011
4814
  onCancel,
4012
4815
  onConfirm
4013
- });
4014
- }
4015
- function MarketSection({ t, titleKey, rows, pending, failureOf, act, confirmActions, onConfirming }) {
4016
- if (rows.length === 0) return null;
4017
- 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, {
4018
- key: row.id,
4019
- t,
4020
- row,
4021
- pending,
4022
- failure: failureOf(row.id),
4023
- onAct: (action) => confirmActions.includes(action) ? onConfirming(row.id) : void act(row.id, action)
4024
- }))));
4816
+ });
4025
4817
  }
4026
- function MarketBody({ t, shown, pluginList, installedList, shared, pending, failed, notice, act, onConfirming }) {
4818
+ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending, failed, notice, act, onConfirming, setDefault, boardBusy }) {
4027
4819
  const failureOf = (id) => failed?.id === id ? failed.message : null;
4028
- return /* @__PURE__ */ h(Fragment, null, notice === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketNote }, notice), marketSections(shown).map((section) => /* @__PURE__ */ h(MarketSection, {
4820
+ return /* @__PURE__ */ h(Fragment, null, notice === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketNote }, notice), /* @__PURE__ */ h(MarketSection, {
4821
+ t,
4822
+ rows: self === void 0 ? [] : [self],
4823
+ onDefault: setDefault,
4824
+ boardBusy,
4825
+ pending,
4826
+ failureOf,
4827
+ act,
4828
+ confirmActions: CONFIRM_UNINSTALL,
4829
+ onConfirming
4830
+ }), self === void 0 ? null : /* @__PURE__ */ h("div", {
4831
+ className: MarketPage_module_default.marketSelfDivider,
4832
+ "aria-hidden": "true"
4833
+ }), marketSections([...shown, ...installedList]).map((section) => /* @__PURE__ */ h(MarketSection, {
4029
4834
  key: section.id,
4030
4835
  t,
4031
4836
  titleKey: section.titleKey,
4837
+ icon: marketSectionIcon(section.id === "installed" ? "installed" : "pending"),
4032
4838
  rows: section.rows,
4839
+ onDefault: setDefault,
4840
+ boardBusy,
4033
4841
  pending,
4034
4842
  failureOf,
4035
4843
  act,
@@ -4038,21 +4846,15 @@ window.__ModuleLoader__.load({
4038
4846
  })), /* @__PURE__ */ h(MarketSection, {
4039
4847
  t,
4040
4848
  titleKey: "panels.market.sectionPlugins",
4849
+ icon: marketSectionIcon("plugins"),
4041
4850
  rows: pluginList,
4851
+ onDefault: setDefault,
4852
+ boardBusy,
4042
4853
  pending,
4043
4854
  failureOf,
4044
4855
  act,
4045
4856
  confirmActions: CONFIRM_UNINSTALL,
4046
4857
  onConfirming
4047
- }), /* @__PURE__ */ h(MarketSection, {
4048
- t,
4049
- titleKey: installedList.length > 0 && installedList.every((row) => row.local === true) ? "panels.market.sectionLocal" : "panels.market.sectionUnlisted",
4050
- rows: installedList,
4051
- pending,
4052
- failureOf,
4053
- act,
4054
- confirmActions: CONFIRM_REMOVE,
4055
- onConfirming
4056
4858
  }), /* @__PURE__ */ h(PanelFoot, {
4057
4859
  size: "md",
4058
4860
  text: t("panels.market.foot")
@@ -4064,95 +4866,91 @@ window.__ModuleLoader__.load({
4064
4866
  act
4065
4867
  }));
4066
4868
  }
4067
- function MarketView({ t, manifests, capabilities, freshness, onChanged, updates, installed, installedRead, plugins, settling, mock }) {
4869
+ function MarketView({ t, manifests, installable, capabilities, freshness, onChanged, onPending, updates, installed, installedRead, workbench, plugins, settling, mock, defaults = [], changed = {} }) {
4068
4870
  const [titles, setTitles] = useState(/* @__PURE__ */ new Map());
4069
4871
  useEffect(() => {
4070
4872
  if (mock === void 0) setTitles((known) => mergeTitles(known, manifests));
4071
4873
  }, [manifests, mock]);
4072
4874
  const catalog = mock?.manifests ?? manifests;
4875
+ const marketable = mock === void 0 ? marketCatalog(manifests, installable) : catalog;
4073
4876
  const effective = mock === void 0 ? capabilities : mock.capabilities;
4074
- const source = liveManifests(catalog, effective, mock === void 0 && installed !== void 0 ? new Set(installed.map((item) => item.unit)) : null);
4075
- const rows = marketRows(source, effective, mock?.updates ?? updates ?? {});
4877
+ const source = liveManifests(marketable, effective, mock === void 0 && installed !== void 0 ? new Set(installed.map((item) => item.unit)) : null);
4878
+ const byDefault = new Set(defaults);
4879
+ const rows = marketRows(source, effective, mock?.updates ?? updates ?? {}, byDefault, changed);
4076
4880
  const shared = sharedRows(source, effective);
4077
4881
  const [pending, setPending] = useState(mock?.pending ?? null);
4882
+ useEffect(() => {
4883
+ onPending?.(pending !== null);
4884
+ return () => onPending?.(false);
4885
+ }, [pending, onPending]);
4078
4886
  const provision = useHostWrite({
4079
4887
  channel: "provision",
4080
4888
  networkText: t("panels.failed")
4081
4889
  });
4890
+ const boardWrite = useHostWrite({
4891
+ channel: "prefs",
4892
+ resource: "panels",
4893
+ networkText: t("panels.failed")
4894
+ });
4895
+ const [writingDefault, setWritingDefault] = useState(false);
4896
+ const settleDefault = useBoardSettle(machineBoardSignature(defaults, changed));
4897
+ const { busy: boardBusy } = useVisibleBusy(writingDefault || settleDefault.pending, 500);
4898
+ const setDefault = async (id, next) => {
4899
+ if (mock !== void 0) return;
4900
+ setWritingDefault(true);
4901
+ settleDefault.begin();
4902
+ const outcome = await boardWrite.send({
4903
+ action: next ? "show" : "hide",
4904
+ id,
4905
+ scope: "machine"
4906
+ });
4907
+ setWritingDefault(false);
4908
+ if (!outcome.ok) {
4909
+ settleDefault.clear();
4910
+ setNotice(t("panels.failed"));
4911
+ }
4912
+ };
4082
4913
  const [confirming, setConfirming] = useState(mock?.confirming ?? null);
4083
4914
  const [failed, setFailed] = useState(mock?.failure ?? null);
4084
4915
  const [notice, setNotice] = useState(mock?.notice ?? null);
4085
4916
  const removing = pending !== null && pending.action === "remove-bundle" && failed?.id !== pending.id ? pending.id : null;
4086
- 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);
4087
- const pendingRow = removing === null || pending === null || rows.some((row) => row.id === removing) ? void 0 : {
4088
- id: removing,
4089
- titleKey: pending.titleKey ?? titles.get(removing) ?? removing,
4090
- state: "installed",
4091
- canInstall: false,
4092
- canUpdate: false,
4093
- canUninstall: true,
4094
- ...pending.pkg === void 0 ? {} : { pkg: pending.pkg },
4095
- ...pending.version === void 0 ? {} : { version: { installed: pending.version } }
4096
- };
4917
+ 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);
4918
+ const pendingRow = pendingRowOf({
4919
+ pending,
4920
+ removing,
4921
+ rows,
4922
+ titles
4923
+ });
4097
4924
  const shown = pendingRow === void 0 ? rows : [...rows, pendingRow];
4098
- const pluginList = installedPluginRows(mock?.plugins ?? plugins ?? []);
4925
+ const self = workbenchRow(mock === void 0 ? workbench : mock.workbench);
4926
+ const pluginList = installedPluginRows(mock?.plugins ?? plugins ?? [], byDefault, changed);
4099
4927
  const rowById = new Map([
4100
4928
  ...shown,
4929
+ ...self === void 0 ? [] : [self],
4101
4930
  ...installedList,
4102
4931
  ...pluginList
4103
4932
  ].map((row) => [row.id, row]));
4104
4933
  const confirmingRow = confirming === null ? void 0 : rowById.get(confirming);
4105
- const act = async (id, action) => {
4106
- if (mock !== void 0) return;
4107
- const row = rowById.get(id);
4108
- setPending({
4109
- id,
4110
- action,
4111
- ...row?.titleKey === void 0 ? {} : { titleKey: row.titleKey },
4112
- ...row?.pkg === void 0 ? {} : { pkg: row.pkg },
4113
- ...row?.version?.installed === void 0 ? {} : { version: row.version.installed }
4114
- });
4115
- setConfirming(null);
4116
- setFailed(null);
4117
- if (action !== "uninstall-plugin") setNotice(null);
4118
- const dependency = action === "update-dependency";
4119
- const byName = action === "remove-bundle" || action === "update-plugin" || action === "uninstall-plugin";
4120
- const outcome = await provision.send(dependency ? {
4121
- action,
4122
- id
4123
- } : byName ? {
4124
- action,
4125
- name: row?.pkg ?? ""
4126
- } : {
4127
- action,
4128
- unit: id
4129
- });
4130
- setPending(null);
4131
- if (!outcome.ok) {
4132
- onChanged();
4133
- setFailed({
4134
- id,
4135
- message: t("panels.market.failed", { reason: outcome.message })
4136
- });
4137
- return;
4138
- }
4139
- if (action === "uninstall-plugin") {
4140
- const kept = installedPluginKept(outcome.value);
4141
- setNotice(kept === void 0 ? null : t(kept.key, kept.names === void 0 ? {} : { names: kept.names.join(t("panels.market.listSeparator")) }));
4142
- }
4143
- const reason = changeFailure(changeOf(outcome.value), t);
4144
- onChanged();
4145
- if (reason !== void 0) setFailed({
4146
- id,
4147
- message: t("panels.market.failed", { reason })
4148
- });
4149
- };
4934
+ const act = marketActOf({
4935
+ t,
4936
+ mocked: mock !== void 0,
4937
+ rowOf: (id) => rowById.get(id),
4938
+ seats: {
4939
+ setPending,
4940
+ setConfirming,
4941
+ setFailed,
4942
+ setNotice
4943
+ },
4944
+ send: (body) => provision.send(body),
4945
+ onChanged
4946
+ });
4150
4947
  const settled = marketSettled(freshness, installedRead);
4151
- const nothing = shown.length === 0 && installedList.length === 0 && pluginList.length === 0;
4948
+ const nothing = shown.length === 0 && self === void 0 && installedList.length === 0 && pluginList.length === 0;
4152
4949
  if (!settled || (settling?.size ?? 0) > 0 && shown.length === 0 && installedList.length === 0) return /* @__PURE__ */ h(MarketChecking, { t });
4153
4950
  if (nothing) return /* @__PURE__ */ h(MarketEmpty, { t });
4154
4951
  return /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(MarketBody, {
4155
4952
  t,
4953
+ self,
4156
4954
  shown,
4157
4955
  pluginList,
4158
4956
  installedList,
@@ -4161,7 +4959,9 @@ window.__ModuleLoader__.load({
4161
4959
  failed,
4162
4960
  notice,
4163
4961
  act,
4164
- onConfirming: setConfirming
4962
+ onConfirming: setConfirming,
4963
+ setDefault,
4964
+ boardBusy
4165
4965
  }), /* @__PURE__ */ h(ConfirmUninstall, {
4166
4966
  key: confirming ?? "",
4167
4967
  t,
@@ -4177,6 +4977,182 @@ window.__ModuleLoader__.load({
4177
4977
  }));
4178
4978
  }
4179
4979
  //#endregion
4980
+ //#region src/modules/sessions/model/session-node.ts
4981
+ function visiblePendingKind(kind) {
4982
+ switch (kind) {
4983
+ case "approval":
4984
+ case "plan-review":
4985
+ case "question": return kind;
4986
+ default: return;
4987
+ }
4988
+ }
4989
+ function sessionNode(summary, statusById, list, pinnedIds, archivedIds) {
4990
+ const status = statusById.get(summary.id);
4991
+ const catalog = list.projectionsBySession[summary.id]?.values?.subagentCatalog;
4992
+ let runningSubagentCount = 0;
4993
+ for (const child of catalog ?? []) {
4994
+ const childStatus = statusById.get(child.id);
4995
+ const childRow = list.byId[child.id];
4996
+ if ((childStatus?.running ?? childRow?.running) === true) runningSubagentCount += 1;
4997
+ }
4998
+ return {
4999
+ id: summary.id,
5000
+ title: summary.blank ? "" : summary.displayTitle,
5001
+ blank: summary.blank,
5002
+ running: status?.running ?? summary.running,
5003
+ runningSubagentCount,
5004
+ completed: status?.completionUnread === true,
5005
+ pinned: !archivedIds.has(summary.id) && pinnedIds.has(summary.id),
5006
+ updatedAt: summary.updatedAt,
5007
+ pendingInteraction: visiblePendingKind(status?.pendingInteraction?.kind)
5008
+ };
5009
+ }
5010
+ function sessionStatuses(node, t) {
5011
+ const subagents = node.runningSubagentCount > 0 ? {
5012
+ state: "ongoing",
5013
+ label: t(node.runningSubagentCount === 1 ? "status.subagentsRunning.one" : "status.subagentsRunning.other", { n: node.runningSubagentCount })
5014
+ } : void 0;
5015
+ let pending;
5016
+ switch (node.pendingInteraction) {
5017
+ case "approval":
5018
+ pending = {
5019
+ state: "warning",
5020
+ label: t("status.waitingApproval")
5021
+ };
5022
+ break;
5023
+ case "plan-review":
5024
+ pending = {
5025
+ state: "warning",
5026
+ label: t("status.planReview")
5027
+ };
5028
+ break;
5029
+ case "question":
5030
+ pending = {
5031
+ state: "warning",
5032
+ label: t("status.waitingAnswer")
5033
+ };
5034
+ break;
5035
+ default: pending = void 0;
5036
+ }
5037
+ if (pending !== void 0) return subagents === void 0 ? [pending] : [pending, subagents];
5038
+ if (node.running) {
5039
+ const primary = {
5040
+ state: "ongoing",
5041
+ label: t("status.running")
5042
+ };
5043
+ return subagents === void 0 ? [primary] : [primary, subagents];
5044
+ }
5045
+ if (subagents !== void 0) return [subagents];
5046
+ if (node.completed) return [{
5047
+ state: "done",
5048
+ label: t("status.completed")
5049
+ }];
5050
+ return [{
5051
+ state: "idle",
5052
+ label: t("status.idle")
5053
+ }];
5054
+ }
5055
+ function currentSessionId(list, panelActive) {
5056
+ if (panelActive) return void 0;
5057
+ return Object.values(list.byId).find((session) => (session.retainedBy?.mainView ?? 0) > 0)?.id;
5058
+ }
5059
+ function orderSessionRows(rows, pinnedIds, archivedIds) {
5060
+ const placeholders = [];
5061
+ const leading = [];
5062
+ const rest = [];
5063
+ for (const row of rows) if (row.blank) placeholders.push(row);
5064
+ else if (!archivedIds.has(row.id) && pinnedIds.has(row.id)) leading.push(row);
5065
+ else rest.push(row);
5066
+ return [
5067
+ ...placeholders,
5068
+ ...leading,
5069
+ ...rest
5070
+ ];
5071
+ }
5072
+ function workspaceOfSession(workspaces, sessionId) {
5073
+ if (sessionId === void 0) return null;
5074
+ return workspaces.find((workspace) => workspace.sessionIds.includes(sessionId)) ?? null;
5075
+ }
5076
+ function sessionRows(workspaceSessionIds, list, archivedIds, current) {
5077
+ const rows = [];
5078
+ for (const id of workspaceSessionIds) {
5079
+ if (archivedIds.has(id)) continue;
5080
+ const row = list.byId[id];
5081
+ if (row === void 0 || row.origin === "subagent") continue;
5082
+ if (row.blank && row.id !== current) continue;
5083
+ rows.push(row);
5084
+ }
5085
+ return rows;
5086
+ }
5087
+ //#endregion
5088
+ //#region src/app/layouts/project-selection.ts
5089
+ var listeners$1 = /* @__PURE__ */ new Set();
5090
+ function selectedProjectId() {
5091
+ const stored = readText(STORAGE_KEY_PROJECT);
5092
+ return stored === "" ? null : stored;
5093
+ }
5094
+ function selectProject(workspaceId) {
5095
+ writeText(STORAGE_KEY_PROJECT, workspaceId);
5096
+ for (const listener of [...listeners$1]) try {
5097
+ listener();
5098
+ } catch {}
5099
+ }
5100
+ function subscribeProject(listener) {
5101
+ listeners$1.add(listener);
5102
+ return () => {
5103
+ listeners$1.delete(listener);
5104
+ };
5105
+ }
5106
+ //#endregion
5107
+ //#region src/app/layouts/rightbar/use-panels.ts
5108
+ function shouldDropPanels(workspace, previous) {
5109
+ return workspace !== previous;
5110
+ }
5111
+ function useEnabledUnits(refreshToken, workspace) {
5112
+ const [enabled, setEnabled] = useState(null);
5113
+ const lastWorkspace = useRef(workspace);
5114
+ useEffect(() => {
5115
+ let cancelled = false;
5116
+ if (shouldDropPanels(workspace, lastWorkspace.current)) {
5117
+ lastWorkspace.current = workspace;
5118
+ setEnabled(null);
5119
+ }
5120
+ const read = async () => {
5121
+ const response = await apiGet("panels", workspace === null ? {} : { path: workspace }).catch(() => null);
5122
+ if (cancelled) return;
5123
+ if (response?.ok === true && Array.isArray(response.units)) setEnabled({
5124
+ units: response.units,
5125
+ plugins: Array.isArray(response.plugins) ? response.plugins : [],
5126
+ defaults: Array.isArray(response.defaults) ? response.defaults : [],
5127
+ own: response.own === true,
5128
+ changed: response.changed ?? {}
5129
+ });
5130
+ };
5131
+ read();
5132
+ return () => {
5133
+ cancelled = true;
5134
+ };
5135
+ }, [
5136
+ refreshToken,
5137
+ useFactRevision("panels"),
5138
+ workspace
5139
+ ]);
5140
+ return enabled;
5141
+ }
5142
+ function useSelectedProjectId() {
5143
+ const [id, setId] = useState(() => selectedProjectId());
5144
+ useEffect(() => subscribeProject(() => setId(selectedProjectId())), []);
5145
+ return id;
5146
+ }
5147
+ function useBoardWorkspace(workspaces, sessions) {
5148
+ const projectId = useSelectedProjectId();
5149
+ const workspace = workspaces.items.find((item) => item.workspaceId === projectId) ?? workspaceOfSession(workspaces.items, currentSessionId(sessions, false));
5150
+ return {
5151
+ workspace,
5152
+ path: workspace?.path ?? null
5153
+ };
5154
+ }
5155
+ //#endregion
4180
5156
  //#region src/shared/api/bundle-install.ts
4181
5157
  var BUNDLE_REGISTRIES_ROUTE = "bundle-registries";
4182
5158
  var BUNDLE_INSPECT_ROUTE = "bundle-inspect";
@@ -4206,10 +5182,11 @@ window.__ModuleLoader__.load({
4206
5182
  var state = {
4207
5183
  modules: null,
4208
5184
  plugins: null,
5185
+ workbench: null,
4209
5186
  read: false,
4210
5187
  checkedAt: null
4211
5188
  };
4212
- var listeners$1 = /* @__PURE__ */ new Set();
5189
+ var listeners = /* @__PURE__ */ new Set();
4213
5190
  var inFlight = null;
4214
5191
  var readSeq = 0;
4215
5192
  var newestForceSeq = -1;
@@ -4217,14 +5194,14 @@ window.__ModuleLoader__.load({
4217
5194
  return state;
4218
5195
  }
4219
5196
  function subscribeModuleVersions(listener) {
4220
- listeners$1.add(listener);
5197
+ listeners.add(listener);
4221
5198
  return () => {
4222
- listeners$1.delete(listener);
5199
+ listeners.delete(listener);
4223
5200
  };
4224
5201
  }
4225
5202
  function publish(next) {
4226
5203
  state = next;
4227
- for (const listener of [...listeners$1]) listener();
5204
+ for (const listener of [...listeners]) listener();
4228
5205
  }
4229
5206
  function runModuleVersionsRead(force = false) {
4230
5207
  if (inFlight !== null && inFlight.force === force) return inFlight.promise;
@@ -4237,6 +5214,7 @@ window.__ModuleLoader__.load({
4237
5214
  publish({
4238
5215
  modules: versions?.ok === true ? versions.modules : state.modules,
4239
5216
  plugins: plugins?.ok === true ? plugins.plugins : state.plugins,
5217
+ workbench: versions?.ok === true ? versions.workbench ?? null : state.workbench,
4240
5218
  read: true,
4241
5219
  checkedAt: Date.now()
4242
5220
  });
@@ -4269,6 +5247,7 @@ window.__ModuleLoader__.load({
4269
5247
  return {
4270
5248
  modules: value.modules,
4271
5249
  plugins: value.plugins,
5250
+ workbench: value.workbench,
4272
5251
  read: value.read,
4273
5252
  checkedAt: value.checkedAt,
4274
5253
  reload
@@ -4493,7 +5472,9 @@ window.__ModuleLoader__.load({
4493
5472
  const preview = state.preview;
4494
5473
  if (preview === null) return null;
4495
5474
  const source = preview.registry === "" ? t("panels.market.add.registryDefault") : preview.registry;
4496
- 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)));
5475
+ const plugin = preview.kind === "plugin";
5476
+ const pluginName = plugin ? preview.pluginName : void 0;
5477
+ 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);
4497
5478
  }
4498
5479
  function AddModuleResult({ t, state }) {
4499
5480
  const outcome = state.outcome;
@@ -4501,26 +5482,27 @@ window.__ModuleLoader__.load({
4501
5482
  const reason = failureReason(failureCode(outcome.change), outcome.change.application, t);
4502
5483
  const supply = supplyKey(outcome.supply.state);
4503
5484
  const builds = state.builds;
4504
- const failed = outcome.change.application === "failed";
4505
- const restart = outcome.change.application === "restart-required";
4506
- const cancelled = outcome.change.application === "cancelled";
4507
- const notModule = outcome.supply.state === "not-a-module";
4508
5485
  const plugin = outcome.plugin;
5486
+ const kind = resultKindOf({
5487
+ change: outcome.change,
5488
+ supplyState: outcome.supply.state,
5489
+ plugin: plugin !== void 0
5490
+ });
4509
5491
  const name = outcome.module.kind === "module" ? outcome.module.unit : outcome.module.pkg;
4510
5492
  return /* @__PURE__ */ h("div", { className: AddModule_module_default.body }, /* @__PURE__ */ h("div", { className: AddModule_module_default.hero }, /* @__PURE__ */ h("span", {
4511
5493
  className: AddModule_module_default.heroIcon,
4512
- "data-state": failed ? "error" : cancelled ? "idle" : "done",
5494
+ "data-state": kind === "failed" ? "error" : kind === "cancelled" ? "idle" : "done",
4513
5495
  "aria-hidden": "true"
4514
- }, failed ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutlineRegular, { size: 28 }) : cancelled ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
5496
+ }, kind === "failed" ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutlineRegular, { size: 28 }) : kind === "cancelled" ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4515
5497
  state: "idle",
4516
5498
  size: 28
4517
5499
  }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconCheckCircleFillRegular, { size: 28 })), /* @__PURE__ */ h("h2", {
4518
5500
  className: AddModule_module_default.wizardTitle,
4519
- role: failed ? "alert" : "status"
4520
- }, 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", {
5501
+ role: kind === "failed" ? "alert" : "status"
5502
+ }, 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", {
4521
5503
  className: AddModule_module_default.resultWarn,
4522
5504
  role: "alert"
4523
- }, 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)));
5505
+ }, 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)));
4524
5506
  }
4525
5507
  //#endregion
4526
5508
  //#region src/app/layouts/market/add-module-mock.ts
@@ -4597,6 +5579,7 @@ window.__ModuleLoader__.load({
4597
5579
  phase: "preview",
4598
5580
  spec: "@dsh-workbench/module-hello",
4599
5581
  preview: {
5582
+ kind: "module",
4600
5583
  name: "@dsh-workbench/module-hello",
4601
5584
  version: "0.1.2",
4602
5585
  description: "最小样本模块:一枚「你好」卡片",
@@ -4604,15 +5587,30 @@ window.__ModuleLoader__.load({
4604
5587
  }
4605
5588
  },
4606
5589
  {
4607
- id: "preview-no-source",
4608
- label: "预览(问不出源)",
5590
+ id: "preview-no-source",
5591
+ label: "预览(问不出源)",
5592
+ phase: "preview",
5593
+ spec: "@dsh-workbench/module-hello",
5594
+ preview: {
5595
+ kind: "module",
5596
+ name: "@dsh-workbench/module-hello",
5597
+ version: "",
5598
+ description: "",
5599
+ registry: ""
5600
+ }
5601
+ },
5602
+ {
5603
+ id: "preview-plugin",
5604
+ label: "预览(opencli 插件)",
4609
5605
  phase: "preview",
4610
- spec: "@dsh-workbench/module-hello",
5606
+ spec: "opencli-plugin-grafana",
4611
5607
  preview: {
4612
- name: "@dsh-workbench/module-hello",
4613
- version: "",
5608
+ kind: "plugin",
5609
+ name: "opencli-plugin-grafana",
5610
+ version: "1.0.16",
4614
5611
  description: "",
4615
- registry: ""
5612
+ registry: "registry.npmmirror.com",
5613
+ pluginName: "grafana"
4616
5614
  }
4617
5615
  },
4618
5616
  {
@@ -4783,42 +5781,6 @@ window.__ModuleLoader__.load({
4783
5781
  };
4784
5782
  }
4785
5783
  //#endregion
4786
- //#region src/shared/hooks/use-visible-busy.ts
4787
- var use_visible_busy_exports = /* @__PURE__ */ __exportAll({
4788
- busyView: () => busyView,
4789
- heldPhase: () => heldPhase,
4790
- useVisibleBusy: () => useVisibleBusy
4791
- });
4792
- function heldPhase(phase, refreshing) {
4793
- return refreshing && phase === "ready" ? "loading" : phase;
4794
- }
4795
- function busyView(active, visible) {
4796
- return {
4797
- busy: visible,
4798
- settling: visible && !active
4799
- };
4800
- }
4801
- function useVisibleBusy(active, floorMs) {
4802
- const [visible, setVisible] = useState(active);
4803
- const since = useRef(null);
4804
- useEffect(() => {
4805
- if (active) {
4806
- if (since.current === null) since.current = Date.now();
4807
- setVisible(true);
4808
- return;
4809
- }
4810
- const held = holdBusy(since.current, Date.now(), floorMs);
4811
- since.current = null;
4812
- if (!held.visible) {
4813
- setVisible(false);
4814
- return;
4815
- }
4816
- const timer = setTimeout(() => setVisible(false), held.releaseInMs);
4817
- return () => clearTimeout(timer);
4818
- }, [active, floorMs]);
4819
- return busyView(active, visible);
4820
- }
4821
- //#endregion
4822
5784
  //#region src/app/layouts/market/use-add-module.ts
4823
5785
  function newRequestId() {
4824
5786
  return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
@@ -4904,12 +5866,7 @@ window.__ModuleLoader__.load({
4904
5866
  setPhase("idle");
4905
5867
  return;
4906
5868
  }
4907
- setPreview({
4908
- name: inspection.name ?? wanted,
4909
- version: inspection.version ?? "",
4910
- description: inspection.description ?? "",
4911
- registry: inspection.registry ?? ""
4912
- });
5869
+ setPreview(previewOf(inspection, wanted));
4913
5870
  setPhase("preview");
4914
5871
  });
4915
5872
  }, [spec, registry]);
@@ -4957,14 +5914,21 @@ window.__ModuleLoader__.load({
4957
5914
  requestId: requestIdRef.current
4958
5915
  });
4959
5916
  }, [cancel]);
5917
+ const [removing, setRemoving] = useState(false);
4960
5918
  const removeIt = useCallback(() => {
4961
5919
  const pkg = outcome?.module.pkg;
4962
5920
  if (pkg === void 0) return;
5921
+ setRemoving(true);
5922
+ setFailure(null);
4963
5923
  remove.send({
4964
5924
  action: "remove-bundle",
4965
5925
  name: pkg
4966
5926
  }).then((result) => {
4967
- if (!result.ok) return;
5927
+ setRemoving(false);
5928
+ if (!result.ok) {
5929
+ setFailure(result.message);
5930
+ return;
5931
+ }
4968
5932
  onInstalled();
4969
5933
  });
4970
5934
  }, [
@@ -4991,6 +5955,7 @@ window.__ModuleLoader__.load({
4991
5955
  preview,
4992
5956
  outcome,
4993
5957
  failure,
5958
+ removing,
4994
5959
  builds: outcome?.change.pendingBuilds ?? [],
4995
5960
  setSpec,
4996
5961
  setChoice: useCallback((next) => {
@@ -5064,8 +6029,13 @@ window.__ModuleLoader__.load({
5064
6029
  variant: "outline",
5065
6030
  size: "md",
5066
6031
  className: "wb-dangerAction",
6032
+ disabled: state.removing,
6033
+ "aria-busy": state.removing,
5067
6034
  onClick: state.removeIt
5068
- }, t("panels.market.add.remove")) : null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
6035
+ }, state.removing ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
6036
+ state: "ongoing",
6037
+ size: 12
6038
+ }) : null, t(state.removing ? "panels.market.uninstalling" : "panels.market.add.remove")) : null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
5069
6039
  type: "button",
5070
6040
  variant: "outline",
5071
6041
  size: "md",
@@ -5127,12 +6097,17 @@ window.__ModuleLoader__.load({
5127
6097
  useSyncExternalStore(useCallback((listener) => units.subscribe(listener), [units]), useCallback(() => units.version(), [units]));
5128
6098
  return units.manifests();
5129
6099
  }
6100
+ function useInstallableUnits(units) {
6101
+ useSyncExternalStore(useCallback((listener) => units.subscribe(listener), [units]), useCallback(() => units.version(), [units]));
6102
+ return units.installable();
6103
+ }
5130
6104
  function makeMarketEntryIcon(units) {
5131
6105
  return function MarketEntryIcon({ size = 16 }) {
5132
6106
  const manifests = useLiveManifests(units);
6107
+ const installable = useInstallableUnits(units);
5133
6108
  const { capabilities } = useCapabilityMap(0);
5134
- const { modules } = useModuleVersions();
5135
- const hasUpdates = marketHintVisible(manifests, capabilities, modules);
6109
+ const { modules, workbench } = useModuleVersions();
6110
+ const hasUpdates = marketHintVisible(marketCatalog(manifests, installable), capabilities, modules, workbench);
5136
6111
  useEffect(() => {
5137
6112
  publishPanelHint(MARKET_PANEL_ID, hasUpdates ? { labelKey: "panels.market.hasNew" } : null);
5138
6113
  return () => publishPanelHint(MARKET_PANEL_ID, null);
@@ -5142,9 +6117,13 @@ window.__ModuleLoader__.load({
5142
6117
  }
5143
6118
  function MarketPanel({ t, units }) {
5144
6119
  const manifests = useLiveManifests(units);
6120
+ const installable = useInstallableUnits(units);
5145
6121
  const { capabilities, checkedAt, checking, forceProbe, reload: reloadCapability } = useCapabilityMap(0);
5146
- const { modules, plugins, read: installedRead, reload: reloadVersions } = useModuleVersions();
6122
+ const { modules, plugins, workbench, read: installedRead, reload: reloadVersions } = useModuleVersions();
6123
+ const machineBoard = useEnabledUnits(0, null);
5147
6124
  const [adding, setAdding] = useState(false);
6125
+ const [acting, setActing] = useState(false);
6126
+ const openAddModule = useCallback(() => setAdding(true), []);
5148
6127
  const updates = useMemo(() => marketUpdatesOf(modules), [modules]);
5149
6128
  const installed = modules === null ? void 0 : withClientRefusals(modules, units.refusals());
5150
6129
  const reload = useCallback(() => {
@@ -5205,7 +6184,7 @@ window.__ModuleLoader__.load({
5205
6184
  const mockNonce = fixturePick.nonce;
5206
6185
  const shownFreshness = mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS;
5207
6186
  const shownRead = mock === void 0 ? installedRead : mock.installedRead ?? true;
5208
- const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking;
6187
+ const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking || acting;
5209
6188
  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", {
5210
6189
  type: "button",
5211
6190
  className: `${MarketPage_module_default.marketIconButton}${shownFreshness.checking ? ` ${MarketPage_module_default.marketIconButtonSpinning}` : ""}`,
@@ -5224,7 +6203,7 @@ window.__ModuleLoader__.load({
5224
6203
  className: MarketPage_module_default.marketAddButton,
5225
6204
  icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutlineRegular, { size: 13 }),
5226
6205
  disabled: busy,
5227
- onClick: () => setAdding(true)
6206
+ onClick: openAddModule
5228
6207
  }, t("panels.market.add.open")))), fixturePick.enabled ? /* @__PURE__ */ h(MockStrip, {
5229
6208
  mocks: marketMocks,
5230
6209
  index: fixturePick.index,
@@ -5233,15 +6212,20 @@ window.__ModuleLoader__.load({
5233
6212
  key: `${mock?.id ?? "real-market"}-${mockNonce}`,
5234
6213
  t,
5235
6214
  manifests,
6215
+ installable,
5236
6216
  capabilities,
5237
6217
  freshness: shownFreshness,
5238
6218
  onChanged: reload,
6219
+ onPending: setActing,
5239
6220
  updates,
5240
6221
  installed,
5241
6222
  installedRead: shownRead,
6223
+ workbench,
5242
6224
  plugins,
5243
6225
  settling: mock === void 0 ? settling : void 0,
5244
- mock
6226
+ mock,
6227
+ defaults: machineBoard?.defaults ?? [],
6228
+ changed: machineBoard?.changed ?? {}
5245
6229
  }), /* @__PURE__ */ h(AddModuleDialog, {
5246
6230
  t,
5247
6231
  open: adding,
@@ -5266,25 +6250,6 @@ window.__ModuleLoader__.load({
5266
6250
  }, MarketPanel));
5267
6251
  }
5268
6252
  //#endregion
5269
- //#region src/app/layouts/project-selection.ts
5270
- var listeners = /* @__PURE__ */ new Set();
5271
- function selectedProjectId() {
5272
- const stored = readText(STORAGE_KEY_PROJECT);
5273
- return stored === "" ? null : stored;
5274
- }
5275
- function selectProject(workspaceId) {
5276
- writeText(STORAGE_KEY_PROJECT, workspaceId);
5277
- for (const listener of [...listeners]) try {
5278
- listener();
5279
- } catch {}
5280
- }
5281
- function subscribeProject(listener) {
5282
- listeners.add(listener);
5283
- return () => {
5284
- listeners.delete(listener);
5285
- };
5286
- }
5287
- //#endregion
5288
6253
  //#region src/shared/api/diy.ts
5289
6254
  var DIY_PRESET_ID = "workbench-diy";
5290
6255
  var WORKSHOP_TITLE = "工作台DIY";
@@ -5313,7 +6278,7 @@ window.__ModuleLoader__.load({
5313
6278
  inFlight = true;
5314
6279
  try {
5315
6280
  const response = await apiGet(UNIT_MANIFESTS_ROUTE).catch(() => null);
5316
- if (response?.ok === true && Array.isArray(response.manifests)) registry.setManifests(response.manifests);
6281
+ if (response?.ok === true && Array.isArray(response.manifests)) registry.setManifests(response.manifests, Array.isArray(response.installable) ? response.installable : void 0);
5317
6282
  } finally {
5318
6283
  inFlight = false;
5319
6284
  if (queued) {
@@ -6150,6 +7115,131 @@ window.__ModuleLoader__.load({
6150
7115
  }
6151
7116
  };
6152
7117
  }
7118
+ //#endregion
7119
+ //#region src/app/layouts/rightbar/dsh-surface.ts
7120
+ var DSH_SEAT_ATTRIBUTE = "data-sidebar-right-session";
7121
+ function dshSeatOnScreen(host) {
7122
+ if (host === void 0) return false;
7123
+ return host.querySelector(`[${DSH_SEAT_ATTRIBUTE}]`) !== null;
7124
+ }
7125
+ function createDshSurfaceWatch(read, onReady, intervalMs) {
7126
+ let timer;
7127
+ const disarm = () => {
7128
+ if (timer === void 0) return;
7129
+ clearInterval(timer);
7130
+ timer = void 0;
7131
+ };
7132
+ const tick = () => {
7133
+ if (!read()) return;
7134
+ disarm();
7135
+ onReady();
7136
+ };
7137
+ return {
7138
+ arm() {
7139
+ if (timer !== void 0) return;
7140
+ timer = setInterval(tick, intervalMs);
7141
+ },
7142
+ disarm
7143
+ };
7144
+ }
7145
+ //#endregion
7146
+ //#region src/app/layouts/rightbar/dsh-borrow.ts
7147
+ function createDshBorrow(host) {
7148
+ let pendingOpen = false;
7149
+ let pendingCall;
7150
+ let unsubscribe;
7151
+ let restore;
7152
+ let shimmed = false;
7153
+ const flush = () => {
7154
+ const official = host.official();
7155
+ if (official === void 0 || !dshSeatOnScreen(document)) return;
7156
+ if (pendingOpen) {
7157
+ pendingOpen = false;
7158
+ if (!official.isExpanded()) official.toggleExpanded();
7159
+ }
7160
+ const call = pendingCall;
7161
+ pendingCall = void 0;
7162
+ call?.();
7163
+ };
7164
+ const watch = createDshSurfaceWatch(() => dshSeatOnScreen(document), flush, 60);
7165
+ const subscribe = () => {
7166
+ const official = host.official();
7167
+ if (official === void 0 || unsubscribe !== void 0) return;
7168
+ unsubscribe = official.mounted.subscribe(() => {
7169
+ watch.arm();
7170
+ flush();
7171
+ });
7172
+ };
7173
+ const enter = (call) => {
7174
+ const official = host.official();
7175
+ if (official === void 0) return false;
7176
+ if (dshSeatOnScreen(document)) {
7177
+ if (!official.isExpanded()) official.toggleExpanded();
7178
+ call?.();
7179
+ return true;
7180
+ }
7181
+ subscribe();
7182
+ watch.arm();
7183
+ host.yieldColumn();
7184
+ pendingOpen = true;
7185
+ if (call !== void 0) pendingCall = call;
7186
+ return false;
7187
+ };
7188
+ const takeSeat = (call) => {
7189
+ shim();
7190
+ if (host.official() === void 0) return;
7191
+ enter(call);
7192
+ };
7193
+ const shim = () => {
7194
+ const official = host.official();
7195
+ if (official === void 0 || shimmed) return;
7196
+ const { openResource, openTab } = official;
7197
+ if (typeof openResource !== "function" || typeof openTab !== "function") return;
7198
+ shimmed = true;
7199
+ official.openResource = (address, options) => takeSeat(() => openResource.call(official, address, options));
7200
+ official.openTab = (kind, options) => takeSeat(() => openTab.call(official, kind, options));
7201
+ restore = () => {
7202
+ official.openResource = openResource;
7203
+ official.openTab = openTab;
7204
+ shimmed = false;
7205
+ };
7206
+ };
7207
+ return {
7208
+ open() {
7209
+ const official = host.official();
7210
+ if (official === void 0) return false;
7211
+ return official.mounted.getSnapshot() === void 0 || official.isExpanded();
7212
+ },
7213
+ use: takeSeat,
7214
+ toggle() {
7215
+ const official = host.official();
7216
+ if (official === void 0) return;
7217
+ if (!dshSeatOnScreen(document)) {
7218
+ pendingOpen = true;
7219
+ watch.arm();
7220
+ return;
7221
+ }
7222
+ official.toggleExpanded();
7223
+ },
7224
+ back() {
7225
+ pendingOpen = false;
7226
+ pendingCall = void 0;
7227
+ watch.disarm();
7228
+ host.reclaimColumn();
7229
+ },
7230
+ start() {
7231
+ shim();
7232
+ subscribe();
7233
+ },
7234
+ dispose() {
7235
+ unsubscribe?.();
7236
+ unsubscribe = void 0;
7237
+ watch.disarm();
7238
+ restore?.();
7239
+ restore = void 0;
7240
+ }
7241
+ };
7242
+ }
6153
7243
  var Breadcrumbs_module_default = {
6154
7244
  stripTabs: "_stripTabs_1dqp4_1",
6155
7245
  tab: "_tab_1dqp4_9",
@@ -6222,20 +7312,29 @@ window.__ModuleLoader__.load({
6222
7312
  });
6223
7313
  }
6224
7314
  var ModulesPage_module_default = {
6225
- trigger: "_trigger_1weg4_1",
6226
- pop: "_pop_1weg4_7",
6227
- head: "_head_1weg4_21",
6228
- title: "_title_1weg4_29",
6229
- reset: "_reset_1weg4_37",
6230
- list: "_list_1weg4_59",
6231
- row: "_row_1weg4_68",
6232
- rowOver: "_rowOver_1weg4_83",
6233
- ghost: "_ghost_1weg4_93",
6234
- grip: "_grip_1weg4_108",
6235
- label: "_label_1weg4_116",
6236
- name: "_name_1weg4_123",
6237
- error: "_error_1weg4_134",
6238
- dep: "_dep_1weg4_142"
7315
+ trigger: "_trigger_15ptp_1",
7316
+ pop: "_pop_15ptp_6",
7317
+ head: "_head_15ptp_20",
7318
+ title: "_title_15ptp_28",
7319
+ rowControls: "_rowControls_15ptp_36",
7320
+ reset: "_reset_15ptp_43",
7321
+ list: "_list_15ptp_65",
7322
+ row: "_row_15ptp_36",
7323
+ rowDragging: "_rowDragging_15ptp_85",
7324
+ rowBlocked: "_rowBlocked_15ptp_89",
7325
+ listDragging: "_listDragging_15ptp_93",
7326
+ rowOff: "_rowOff_15ptp_101",
7327
+ rowOver: "_rowOver_15ptp_109",
7328
+ ghost: "_ghost_15ptp_119",
7329
+ grip: "_grip_15ptp_134",
7330
+ gripDragging: "_gripDragging_15ptp_144",
7331
+ gripBlocked: "_gripBlocked_15ptp_148",
7332
+ label: "_label_15ptp_152",
7333
+ name: "_name_15ptp_159",
7334
+ error: "_error_15ptp_170",
7335
+ dep: "_dep_15ptp_178",
7336
+ group: "_group_15ptp_186",
7337
+ groupTitle: "_groupTitle_15ptp_191"
6239
7338
  };
6240
7339
  //#endregion
6241
7340
  //#region src/app/layouts/rightbar/panel-mock.ts
@@ -6248,6 +7347,32 @@ window.__ModuleLoader__.load({
6248
7347
  hasCard: true
6249
7348
  };
6250
7349
  }
7350
+ function noCardRow(id, titleKey) {
7351
+ return {
7352
+ id,
7353
+ titleKey,
7354
+ shown: false,
7355
+ source: "user",
7356
+ hasCard: false
7357
+ };
7358
+ }
7359
+ function plugin(id, pkg, title, shown) {
7360
+ return {
7361
+ id,
7362
+ pkg,
7363
+ title,
7364
+ shown,
7365
+ source: "user"
7366
+ };
7367
+ }
7368
+ var PLUGIN_MOCK = {
7369
+ id: "plugin",
7370
+ label: "opencli 插件行(标出是插件,能开能关)",
7371
+ units: [],
7372
+ plugins: [plugin("plugin:opencli-plugin-cmdb", "opencli-plugin-cmdb", "cmdb", true), plugin("plugin:opencli-plugin-notes", "opencli-plugin-notes", "notes", false)],
7373
+ capabilities: {},
7374
+ expect: { rows: 0 }
7375
+ };
6251
7376
  function probe(unit, status) {
6252
7377
  return { [unit]: {
6253
7378
  unit,
@@ -6265,7 +7390,7 @@ window.__ModuleLoader__.load({
6265
7390
  units: [],
6266
7391
  capabilities: {},
6267
7392
  expect: { rows: 0 }
6268
- }];
7393
+ }, PLUGIN_MOCK];
6269
7394
  const titleKey = found.card?.titleKey ?? found.id;
6270
7395
  const id = found.id;
6271
7396
  const on = row$1(id, titleKey, true);
@@ -6350,6 +7475,20 @@ window.__ModuleLoader__.load({
6350
7475
  on: true
6351
7476
  }
6352
7477
  },
7478
+ {
7479
+ id: "no-card",
7480
+ label: "没看板的模块(只有基座命令那种):也列出来、带「无看板」标签,开关照常能用,只是不参与排序",
7481
+ units: [on, noCardRow(`${id}-c`, `${titleKey}(无看板)`)],
7482
+ capabilities: {
7483
+ ...probe(id, "ok"),
7484
+ ...probe(`${id}-c`, "ok")
7485
+ },
7486
+ expect: {
7487
+ rows: 2,
7488
+ badge: null,
7489
+ on: true
7490
+ }
7491
+ },
6353
7492
  {
6354
7493
  id: "long",
6355
7494
  label: "超长模块名",
@@ -6400,7 +7539,7 @@ window.__ModuleLoader__.load({
6400
7539
  ...probe(`${id}-c`, "ok")
6401
7540
  },
6402
7541
  drag: {
6403
- from: 2,
7542
+ from: 1,
6404
7543
  over: 0,
6405
7544
  at: {
6406
7545
  x: 1230,
@@ -6411,7 +7550,34 @@ window.__ModuleLoader__.load({
6411
7550
  rows: 3,
6412
7551
  on: true
6413
7552
  }
6414
- }
7553
+ },
7554
+ {
7555
+ id: "drag-off",
7556
+ label: "拖到未开启的那一行上:落点不亮(松手也不动)",
7557
+ units: [
7558
+ on,
7559
+ twin,
7560
+ third
7561
+ ],
7562
+ capabilities: {
7563
+ ...probe(id, "ok"),
7564
+ ...probe(`${id}-b`, "ok"),
7565
+ ...probe(`${id}-c`, "ok")
7566
+ },
7567
+ drag: {
7568
+ from: 0,
7569
+ over: null,
7570
+ at: {
7571
+ x: 1230,
7572
+ y: 300
7573
+ }
7574
+ },
7575
+ expect: {
7576
+ rows: 3,
7577
+ on: true
7578
+ }
7579
+ },
7580
+ PLUGIN_MOCK
6415
7581
  ];
6416
7582
  }
6417
7583
  //#endregion
@@ -6424,6 +7590,22 @@ window.__ModuleLoader__.load({
6424
7590
  function selectPanelUnits(units, capabilities) {
6425
7591
  return units.filter((unit) => available(capabilities?.[unit.id]));
6426
7592
  }
7593
+ function panelDropTarget(rows, index) {
7594
+ if (index === null) return null;
7595
+ const row = rows[index];
7596
+ return row?.shown === true && row.hasCard !== false ? index : null;
7597
+ }
7598
+ function rowAtPoint(boxes, y) {
7599
+ const last = boxes.length - 1;
7600
+ for (let at = 0; at <= last; at += 1) {
7601
+ const box = boxes[at];
7602
+ const next = boxes[at + 1];
7603
+ if (box === void 0) continue;
7604
+ const end = next === void 0 ? box.bottom : next.top;
7605
+ if (y >= box.top && (next === void 0 ? y <= end : y < end)) return at;
7606
+ }
7607
+ return null;
7608
+ }
6427
7609
  function panelBadgeKey(capability) {
6428
7610
  if (capability === void 0 || capability.status === "ok") return void 0;
6429
7611
  if (capability.status === "failed") return "panels.dep.failed";
@@ -6431,6 +7613,31 @@ window.__ModuleLoader__.load({
6431
7613
  if (capability.status === "missing-commands") return "panels.dep.missingCommands";
6432
7614
  return "panels.dep.unchecked";
6433
7615
  }
7616
+ function moduleRow(unit, capability) {
7617
+ const badge = panelBadgeKey(capability);
7618
+ return {
7619
+ id: unit.id,
7620
+ titleKey: unit.titleKey,
7621
+ plugin: false,
7622
+ hasCard: unit.hasCard,
7623
+ ...badge === void 0 ? {} : { badgeKey: badge },
7624
+ shown: unit.shown,
7625
+ source: unit.source
7626
+ };
7627
+ }
7628
+ function pluginRow(plugin) {
7629
+ return {
7630
+ id: plugin.id,
7631
+ title: plugin.title,
7632
+ plugin: true,
7633
+ shown: plugin.shown,
7634
+ source: plugin.source
7635
+ };
7636
+ }
7637
+ function selectPanelRows(units, plugins, capabilities) {
7638
+ const listed = new Set(plugins.map((plugin) => plugin.id));
7639
+ return [...selectPanelUnits(units, capabilities).filter((unit) => !listed.has(unit.id)).map((unit) => moduleRow(unit, capabilities?.[unit.id])), ...plugins.map(pluginRow)];
7640
+ }
6434
7641
  function selectBoardModules(units, byId, capabilities) {
6435
7642
  if (units === null) return [];
6436
7643
  return units.filter((unit) => unit.shown && available(capabilities?.[unit.id])).map((unit) => byId(unit.id)).filter((module) => module !== void 0);
@@ -6444,49 +7651,106 @@ window.__ModuleLoader__.load({
6444
7651
  };
6445
7652
  }
6446
7653
  //#endregion
6447
- //#region src/app/layouts/rightbar/ModulesPage.tsx
6448
- var BLANK_DRAG_IMAGE = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
6449
- function ModulesPage({ t, units, workspace, capabilities, loading = false, onOpenMarket, mocked = false, mock }) {
6450
- const [drag, setDrag] = useState(mock?.drag ?? null);
6451
- const [busy, setBusy] = useState(mock?.busy ?? false);
6452
- const [failed, setFailed] = useState(mock?.failed ?? false);
6453
- const rows = selectPanelUnits(units, capabilities);
6454
- const empty = !loading && rows.length === 0;
6455
- const prefWrite = useHostWrite({
6456
- channel: "prefs",
6457
- resource: "panels",
6458
- networkText: t("panels.failed")
7654
+ //#region src/app/layouts/rightbar/PanelRowControls.tsx
7655
+ function PanelRowControls({ t, unit, label, busy, onWrite }) {
7656
+ return /* @__PURE__ */ h("span", { className: ModulesPage_module_default.rowControls }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Switch, {
7657
+ checked: unit.shown,
7658
+ label: `${label} · ${unit.shown ? t("panels.enabled") : t("panels.disabled")}`,
7659
+ disabled: busy,
7660
+ onChange: (next) => onWrite({
7661
+ action: next ? "show" : "hide",
7662
+ id: unit.id
7663
+ })
7664
+ }));
7665
+ }
7666
+ //#endregion
7667
+ //#region src/app/layouts/rightbar/PanelGroupRows.tsx
7668
+ function PanelGroupRows({ t, rows, titleKey, busy, onWrite }) {
7669
+ if (rows.length === 0) return null;
7670
+ return /* @__PURE__ */ h("div", { className: ModulesPage_module_default.group }, /* @__PURE__ */ h("h3", { className: ModulesPage_module_default.groupTitle }, t(titleKey)), /* @__PURE__ */ h("ul", { className: ModulesPage_module_default.list }, rows.map((row) => {
7671
+ const title = row.title ?? t(row.titleKey ?? row.id);
7672
+ return /* @__PURE__ */ h("li", {
7673
+ key: row.id,
7674
+ className: `${ModulesPage_module_default.row} ${row.shown ? "" : ModulesPage_module_default.rowOff}`
7675
+ }, /* @__PURE__ */ h("span", { "aria-hidden": "true" }), /* @__PURE__ */ h("span", { className: ModulesPage_module_default.label }, /* @__PURE__ */ h("span", { className: ModulesPage_module_default.name }, title), row.badgeKey === void 0 ? null : /* @__PURE__ */ h("span", { className: ModulesPage_module_default.dep }, t(row.badgeKey))), /* @__PURE__ */ h(PanelRowControls, {
7676
+ t,
7677
+ unit: row,
7678
+ label: title,
7679
+ busy,
7680
+ onWrite
7681
+ }));
7682
+ })));
7683
+ }
7684
+ //#endregion
7685
+ //#region src/app/layouts/rightbar/use-drag-listeners.ts
7686
+ function useDragListeners(active, handlers) {
7687
+ const latestRef = useRef(handlers);
7688
+ useEffect(() => {
7689
+ latestRef.current = handlers;
6459
7690
  });
6460
- const write = async (body) => {
6461
- if (mocked) return;
6462
- setBusy(true);
6463
- setFailed(false);
6464
- const outcome = await prefWrite.send({
6465
- ...body,
6466
- ...workspace === null ? {} : { path: workspace }
6467
- });
6468
- setBusy(false);
6469
- if (!outcome.ok) setFailed(true);
6470
- };
6471
- const drop = () => {
6472
- if (drag === null) return;
6473
- const moved = rows[drag.from];
6474
- setDrag(null);
6475
- if (moved === void 0 || drag.from === drag.over) return;
6476
- write({
6477
- action: "move",
6478
- id: moved.id,
6479
- index: drag.over
6480
- });
6481
- };
6482
- const dragging = drag === null ? void 0 : rows[drag.from];
6483
- return /* @__PURE__ */ h(Fragment, null, drag?.at === void 0 || dragging === void 0 ? null : /* @__PURE__ */ h("div", {
6484
- className: ModulesPage_module_default.ghost,
6485
- style: {
6486
- left: `${drag.at.x + 12}px`,
6487
- top: `${drag.at.y - 12}px`
7691
+ useEffect(() => {
7692
+ if (!active) return;
7693
+ const onMove = (event) => latestRef.current.move(event.clientX, event.clientY);
7694
+ const onUp = (event) => latestRef.current.drop(event.clientY);
7695
+ const onCancel = () => latestRef.current.cancel();
7696
+ window.addEventListener("pointermove", onMove);
7697
+ window.addEventListener("pointerup", onUp);
7698
+ window.addEventListener("pointercancel", onCancel);
7699
+ window.addEventListener("blur", onCancel);
7700
+ return () => {
7701
+ window.removeEventListener("pointermove", onMove);
7702
+ window.removeEventListener("pointerup", onUp);
7703
+ window.removeEventListener("pointercancel", onCancel);
7704
+ window.removeEventListener("blur", onCancel);
7705
+ };
7706
+ }, [active]);
7707
+ }
7708
+ //#endregion
7709
+ //#region src/app/layouts/rightbar/ModulesPage.tsx
7710
+ function rowBoxes(list) {
7711
+ return list === null ? [] : Array.from(list.children).map((item) => item.getBoundingClientRect());
7712
+ }
7713
+ function rowClass(row, index, drag) {
7714
+ const parts = [ModulesPage_module_default.row];
7715
+ if (!row.shown) parts.push(ModulesPage_module_default.rowOff);
7716
+ if (drag !== null) parts.push(row.shown ? ModulesPage_module_default.rowDragging : ModulesPage_module_default.rowBlocked);
7717
+ if (drag?.over === index) parts.push(ModulesPage_module_default.rowOver);
7718
+ return parts.join(" ");
7719
+ }
7720
+ function gripClass(drag) {
7721
+ if (drag === null) return ModulesPage_module_default.grip;
7722
+ return `${ModulesPage_module_default.grip} ${drag.over === null ? ModulesPage_module_default.gripBlocked : ModulesPage_module_default.gripDragging}`;
7723
+ }
7724
+ function RowLabel({ t, row }) {
7725
+ return /* @__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)));
7726
+ }
7727
+ function PanelRowItem({ t, row, index, drag, handlers, tipEpoch, busy, onWrite }) {
7728
+ return /* @__PURE__ */ h("li", { className: rowClass(row, index, drag) }, row.shown && row.hasCard !== false ? /* @__PURE__ */ h(Tip, {
7729
+ key: tipEpoch,
7730
+ label: t("panels.dragHint"),
7731
+ disabled: drag !== null
7732
+ }, /* @__PURE__ */ h("span", {
7733
+ className: gripClass(drag),
7734
+ "aria-hidden": "true",
7735
+ onPointerDown: (event) => {
7736
+ if (event.button !== 0) return;
7737
+ event.preventDefault();
7738
+ event.currentTarget.setPointerCapture(event.pointerId);
7739
+ handlers.begin(index, event.clientX, event.clientY);
6488
7740
  }
6489
- }, t(dragging.titleKey)), empty ? /* @__PURE__ */ h(CenteredState, {
7741
+ }, "⠿")) : /* @__PURE__ */ h("span", { "aria-hidden": "true" }), /* @__PURE__ */ h(RowLabel, {
7742
+ t,
7743
+ row
7744
+ }), /* @__PURE__ */ h(PanelRowControls, {
7745
+ t,
7746
+ unit: row,
7747
+ label: t(row.titleKey ?? row.id),
7748
+ busy,
7749
+ onWrite
7750
+ }));
7751
+ }
7752
+ function PanelEmpty({ t, onOpenMarket }) {
7753
+ return /* @__PURE__ */ h(CenteredState, {
6490
7754
  compact: true,
6491
7755
  icon: null,
6492
7756
  title: t("panels.noneInstalled"),
@@ -6497,60 +7761,178 @@ window.__ModuleLoader__.load({
6497
7761
  variant: "outline",
6498
7762
  onClick: onOpenMarket
6499
7763
  }, t("panels.browseMarket"))
6500
- }) : /* @__PURE__ */ h("ul", { className: ModulesPage_module_default.list }, rows.map((unit, index) => {
6501
- const badge = panelBadgeKey(capabilities?.[unit.id]);
6502
- const dep = badge === void 0 ? void 0 : t(badge);
6503
- return /* @__PURE__ */ h("li", {
6504
- className: `${ModulesPage_module_default.row}${drag?.over === index ? ` ${ModulesPage_module_default.rowOver}` : ""}`,
6505
- key: unit.id,
6506
- draggable: true,
6507
- onDragStart: (event) => {
6508
- const blank = new Image();
6509
- blank.src = BLANK_DRAG_IMAGE;
6510
- event.dataTransfer.setDragImage(blank, 0, 0);
6511
- setDrag({
6512
- from: index,
6513
- over: index,
6514
- at: {
6515
- x: event.clientX,
6516
- y: event.clientY
6517
- }
6518
- });
6519
- },
6520
- onDragOver: (event) => {
6521
- event.preventDefault();
6522
- if (drag !== null) setDrag({
6523
- from: drag.from,
6524
- over: index,
6525
- at: {
6526
- x: event.clientX,
6527
- y: event.clientY
6528
- }
6529
- });
6530
- },
6531
- onDragEnd: drop,
6532
- onDrop: (event) => {
6533
- event.preventDefault();
6534
- drop();
7764
+ });
7765
+ }
7766
+ function DragGhost({ label, at }) {
7767
+ return /* @__PURE__ */ h("div", {
7768
+ className: ModulesPage_module_default.ghost,
7769
+ style: {
7770
+ left: `${at.x + 12}px`,
7771
+ top: `${at.y - 12}px`
7772
+ }
7773
+ }, label);
7774
+ }
7775
+ function ResetConfirmation({ t, open, busy, onCancel, onConfirm }) {
7776
+ const [acknowledged, setAcknowledged] = useState(false);
7777
+ const close = (next) => {
7778
+ setAcknowledged(false);
7779
+ next();
7780
+ };
7781
+ return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.RiskConfirmation, {
7782
+ open,
7783
+ title: t("panels.followAllConfirmTitle"),
7784
+ description: t("panels.followAllConfirmDetail"),
7785
+ acknowledgeLabel: t("panels.followAllConfirmAck"),
7786
+ cancelLabel: t("panels.followAllConfirmNo"),
7787
+ closeLabel: t("panels.followAllConfirmNo"),
7788
+ confirmLabel: t("panels.followAllConfirmYes"),
7789
+ acknowledged,
7790
+ disabled: busy,
7791
+ onAcknowledgedChange: setAcknowledged,
7792
+ onCancel: () => close(onCancel),
7793
+ onConfirm: () => close(onConfirm)
7794
+ });
7795
+ }
7796
+ function ModulesPage({ t, units, plugins = [], workspace, capabilities, loading = false, onOpenMarket, mocked = false, mock, own = false }) {
7797
+ const [drag, setDrag] = useState(mock?.drag ?? null);
7798
+ const [tipEpoch, setTipEpoch] = useState(0);
7799
+ const [writing, setWriting] = useState(mock?.busy ?? false);
7800
+ const [failed, setFailed] = useState(mock?.failed ?? false);
7801
+ const [confirmingReset, setConfirmingReset] = useState(false);
7802
+ const listRef = useRef(null);
7803
+ const rows = selectPanelRows(units, plugins, capabilities);
7804
+ const modules = rows.filter((row) => !row.plugin);
7805
+ const carded = modules.filter((row) => row.hasCard !== false);
7806
+ const boardless = modules.filter((row) => row.hasCard === false);
7807
+ const pluginRows = rows.filter((row) => row.plugin);
7808
+ const empty = !loading && rows.length === 0;
7809
+ const settle = useBoardSettle(panelBoardSignature(units, plugins, own));
7810
+ const { busy } = useVisibleBusy(writing || settle.pending, 500);
7811
+ const prefWrite = useHostWrite({
7812
+ channel: "prefs",
7813
+ resource: "panels",
7814
+ networkText: t("panels.failed")
7815
+ });
7816
+ const write = async (body) => {
7817
+ if (mocked) return;
7818
+ setWriting(true);
7819
+ setFailed(false);
7820
+ settle.begin();
7821
+ const outcome = await prefWrite.send({
7822
+ ...body,
7823
+ ...workspace === null ? {} : { path: workspace }
7824
+ });
7825
+ setWriting(false);
7826
+ if (!outcome.ok) {
7827
+ settle.clear();
7828
+ setFailed(true);
7829
+ }
7830
+ };
7831
+ const writeRow = (body) => void write(body);
7832
+ const dropTargetAt = (y) => panelDropTarget(carded, rowAtPoint(rowBoxes(listRef.current), y));
7833
+ const beginDrag = (index, x, y) => {
7834
+ if (carded[index]?.shown !== true) return;
7835
+ setDrag({
7836
+ from: index,
7837
+ over: index,
7838
+ at: {
7839
+ x,
7840
+ y
6535
7841
  }
6536
- }, /* @__PURE__ */ h(Tip, { label: t("panels.dragHint") }, /* @__PURE__ */ h("span", {
6537
- className: ModulesPage_module_default.grip,
6538
- "aria-hidden": "true"
6539
- }, "⠿")), /* @__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(_deepseek_ai_dsh_client_ui_primitives.Switch, {
6540
- checked: unit.shown,
6541
- label: `${t(unit.titleKey)} · ${unit.shown ? t("panels.enabled") : t("panels.disabled")}`,
6542
- disabled: busy,
6543
- onChange: (next) => void write({
6544
- action: next ? "show" : "hide",
6545
- id: unit.id
6546
- })
6547
- }));
6548
- })), /* @__PURE__ */ h(PanelFoot, { text: t("panels.hintEffect") }, /* @__PURE__ */ h("button", {
7842
+ });
7843
+ };
7844
+ const trackDrag = (x, y) => {
7845
+ if (drag === null) return;
7846
+ setDrag({
7847
+ from: drag.from,
7848
+ over: dropTargetAt(y),
7849
+ at: {
7850
+ x,
7851
+ y
7852
+ }
7853
+ });
7854
+ };
7855
+ const settleDrag = (y) => {
7856
+ const from = drag?.from;
7857
+ setDrag(null);
7858
+ setTipEpoch((epoch) => epoch + 1);
7859
+ if (from === void 0) return;
7860
+ const moved = carded[from];
7861
+ const over = dropTargetAt(y);
7862
+ if (moved === void 0 || over === null || over === from) return;
7863
+ write({
7864
+ action: "move",
7865
+ id: moved.id,
7866
+ index: over
7867
+ });
7868
+ };
7869
+ const cancelDrag = () => {
7870
+ setDrag(null);
7871
+ setTipEpoch((epoch) => epoch + 1);
7872
+ };
7873
+ const handlers = {
7874
+ begin: beginDrag,
7875
+ move: trackDrag,
7876
+ drop: settleDrag,
7877
+ cancel: cancelDrag
7878
+ };
7879
+ useDragListeners(drag !== null, handlers);
7880
+ const dragged = drag === null ? void 0 : carded[drag.from];
7881
+ return /* @__PURE__ */ h(Fragment, null, drag?.at === void 0 || dragged === void 0 ? null : /* @__PURE__ */ h(DragGhost, {
7882
+ label: t(dragged.titleKey ?? dragged.id),
7883
+ at: drag.at
7884
+ }), empty ? /* @__PURE__ */ h(PanelEmpty, {
7885
+ t,
7886
+ onOpenMarket
7887
+ }) : null, carded.length === 0 ? null : /* @__PURE__ */ h("ul", {
7888
+ ref: listRef,
7889
+ className: `${ModulesPage_module_default.list}${drag === null ? "" : ` ${ModulesPage_module_default.listDragging}`}`
7890
+ }, carded.map((row, index) => /* @__PURE__ */ h(PanelRowItem, {
7891
+ key: row.id,
7892
+ t,
7893
+ row,
7894
+ index,
7895
+ drag,
7896
+ handlers,
7897
+ tipEpoch,
7898
+ busy,
7899
+ onWrite: writeRow
7900
+ }))), /* @__PURE__ */ h(PanelGroupRows, {
7901
+ t,
7902
+ rows: boardless,
7903
+ titleKey: "panels.groupBoardless",
7904
+ busy,
7905
+ onWrite: writeRow
7906
+ }), /* @__PURE__ */ h(PanelGroupRows, {
7907
+ t,
7908
+ rows: pluginRows,
7909
+ titleKey: "panels.groupPlugins",
7910
+ busy,
7911
+ onWrite: writeRow
7912
+ }), own ? /* @__PURE__ */ h(PanelFoot, null, /* @__PURE__ */ h("button", {
6549
7913
  type: "button",
6550
7914
  className: ModulesPage_module_default.reset,
6551
7915
  disabled: busy,
6552
- onClick: () => void write({ action: "reset" })
6553
- }, t("panels.reset"))), failed ? /* @__PURE__ */ h("p", { className: ModulesPage_module_default.error }, t("panels.failed")) : null);
7916
+ onClick: () => setConfirmingReset(true)
7917
+ }, t("panels.followAll"))) : null, /* @__PURE__ */ h(ResetConfirmation, {
7918
+ t,
7919
+ open: confirmingReset,
7920
+ busy,
7921
+ onCancel: () => setConfirmingReset(false),
7922
+ onConfirm: () => {
7923
+ setConfirmingReset(false);
7924
+ write({ action: "reset" });
7925
+ }
7926
+ }), failed ? /* @__PURE__ */ h("p", { className: ModulesPage_module_default.error }, t("panels.failed")) : null);
7927
+ }
7928
+ //#endregion
7929
+ //#region src/app/layouts/rightbar/panel-dismiss.ts
7930
+ function hasOpenModal(scope) {
7931
+ return scope.querySelector("[aria-modal=\"true\"]") !== null;
7932
+ }
7933
+ function dismissPanelByPointer(next, scope, onOpenChange) {
7934
+ if (!next && hasOpenModal(scope)) return;
7935
+ onOpenChange(next);
6554
7936
  }
6555
7937
  //#endregion
6556
7938
  //#region src/app/layouts/rightbar/PanelModules.tsx
@@ -6581,8 +7963,8 @@ window.__ModuleLoader__.load({
6581
7963
  });
6582
7964
  const panelMock = fixturePick.enabled ? fixturePick.current : void 0;
6583
7965
  const mockNonce = fixturePick.nonce;
6584
- (0, _deepseek_ai_dsh_client_ui_primitives.useDismissOnOutsidePointer)(root, open, onOpenChange);
6585
- const units = enabledUnits ?? [];
7966
+ (0, _deepseek_ai_dsh_client_ui_primitives.useDismissOnOutsidePointer)(root, open, (next) => dismissPanelByPointer(next, document, onOpenChange));
7967
+ const units = enabledUnits?.units ?? [];
6586
7968
  return /* @__PURE__ */ h("div", {
6587
7969
  className: ModulesPage_module_default.trigger,
6588
7970
  ref: root
@@ -6607,8 +7989,10 @@ window.__ModuleLoader__.load({
6607
7989
  key: `${panelMock?.id ?? "real-modules"}-${mockNonce}`,
6608
7990
  t,
6609
7991
  units: panelMock?.units ?? units,
7992
+ plugins: panelMock?.plugins ?? enabledUnits?.plugins ?? [],
6610
7993
  capabilities: panelMock === void 0 ? fixturePick.enabled ? null : capabilities : panelMock.capabilities,
6611
7994
  loading: enabledUnits === null,
7995
+ own: enabledUnits?.own === true,
6612
7996
  onOpenMarket,
6613
7997
  mocked: fixturePick.enabled,
6614
7998
  workspace,
@@ -6785,114 +8169,6 @@ window.__ModuleLoader__.load({
6785
8169
  };
6786
8170
  }
6787
8171
  //#endregion
6788
- //#region src/modules/sessions/model/session-node.ts
6789
- function visiblePendingKind(kind) {
6790
- switch (kind) {
6791
- case "approval":
6792
- case "plan-review":
6793
- case "question": return kind;
6794
- default: return;
6795
- }
6796
- }
6797
- function sessionNode(summary, statusById, list, pinnedIds, archivedIds) {
6798
- const status = statusById.get(summary.id);
6799
- const catalog = list.projectionsBySession[summary.id]?.values?.subagentCatalog;
6800
- let runningSubagentCount = 0;
6801
- for (const child of catalog ?? []) {
6802
- const childStatus = statusById.get(child.id);
6803
- const childRow = list.byId[child.id];
6804
- if ((childStatus?.running ?? childRow?.running) === true) runningSubagentCount += 1;
6805
- }
6806
- return {
6807
- id: summary.id,
6808
- title: summary.blank ? "" : summary.displayTitle,
6809
- blank: summary.blank,
6810
- running: status?.running ?? summary.running,
6811
- runningSubagentCount,
6812
- completed: status?.completionUnread === true,
6813
- pinned: !archivedIds.has(summary.id) && pinnedIds.has(summary.id),
6814
- updatedAt: summary.updatedAt,
6815
- pendingInteraction: visiblePendingKind(status?.pendingInteraction?.kind)
6816
- };
6817
- }
6818
- function sessionStatuses(node, t) {
6819
- const subagents = node.runningSubagentCount > 0 ? {
6820
- state: "ongoing",
6821
- label: t(node.runningSubagentCount === 1 ? "status.subagentsRunning.one" : "status.subagentsRunning.other", { n: node.runningSubagentCount })
6822
- } : void 0;
6823
- let pending;
6824
- switch (node.pendingInteraction) {
6825
- case "approval":
6826
- pending = {
6827
- state: "warning",
6828
- label: t("status.waitingApproval")
6829
- };
6830
- break;
6831
- case "plan-review":
6832
- pending = {
6833
- state: "warning",
6834
- label: t("status.planReview")
6835
- };
6836
- break;
6837
- case "question":
6838
- pending = {
6839
- state: "warning",
6840
- label: t("status.waitingAnswer")
6841
- };
6842
- break;
6843
- default: pending = void 0;
6844
- }
6845
- if (pending !== void 0) return subagents === void 0 ? [pending] : [pending, subagents];
6846
- if (node.running) {
6847
- const primary = {
6848
- state: "ongoing",
6849
- label: t("status.running")
6850
- };
6851
- return subagents === void 0 ? [primary] : [primary, subagents];
6852
- }
6853
- if (subagents !== void 0) return [subagents];
6854
- if (node.completed) return [{
6855
- state: "done",
6856
- label: t("status.completed")
6857
- }];
6858
- return [{
6859
- state: "idle",
6860
- label: t("status.idle")
6861
- }];
6862
- }
6863
- function currentSessionId(list, panelActive) {
6864
- if (panelActive) return void 0;
6865
- return Object.values(list.byId).find((session) => (session.retainedBy?.mainView ?? 0) > 0)?.id;
6866
- }
6867
- function orderSessionRows(rows, pinnedIds, archivedIds) {
6868
- const placeholders = [];
6869
- const leading = [];
6870
- const rest = [];
6871
- for (const row of rows) if (row.blank) placeholders.push(row);
6872
- else if (!archivedIds.has(row.id) && pinnedIds.has(row.id)) leading.push(row);
6873
- else rest.push(row);
6874
- return [
6875
- ...placeholders,
6876
- ...leading,
6877
- ...rest
6878
- ];
6879
- }
6880
- function workspaceOfSession(workspaces, sessionId) {
6881
- if (sessionId === void 0) return null;
6882
- return workspaces.find((workspace) => workspace.sessionIds.includes(sessionId)) ?? null;
6883
- }
6884
- function sessionRows(workspaceSessionIds, list, archivedIds, current) {
6885
- const rows = [];
6886
- for (const id of workspaceSessionIds) {
6887
- if (archivedIds.has(id)) continue;
6888
- const row = list.byId[id];
6889
- if (row === void 0 || row.origin === "subagent") continue;
6890
- if (row.blank && row.id !== current) continue;
6891
- rows.push(row);
6892
- }
6893
- return rows;
6894
- }
6895
- //#endregion
6896
8172
  //#region src/app/layouts/rightbar/suite-world.ts
6897
8173
  function createSuiteWorld(input) {
6898
8174
  const sessionId = currentSessionId(input.sessions, false);
@@ -6909,47 +8185,52 @@ window.__ModuleLoader__.load({
6909
8185
  };
6910
8186
  }
6911
8187
  //#endregion
6912
- //#region src/app/layouts/rightbar/use-panels.ts
6913
- function shouldDropPanels(workspace, previous) {
6914
- return workspace !== previous;
6915
- }
6916
- function useEnabledUnits(refreshToken, workspace) {
6917
- const [enabled, setEnabled] = useState(null);
6918
- const lastWorkspace = useRef(workspace);
6919
- useEffect(() => {
6920
- let cancelled = false;
6921
- if (shouldDropPanels(workspace, lastWorkspace.current)) {
6922
- lastWorkspace.current = workspace;
6923
- setEnabled(null);
6924
- }
6925
- const read = async () => {
6926
- const response = await apiGet("panels", workspace === null ? {} : { path: workspace }).catch(() => null);
6927
- if (cancelled) return;
6928
- if (response?.ok === true && Array.isArray(response.units)) setEnabled(response.units);
6929
- };
6930
- read();
6931
- return () => {
6932
- cancelled = true;
6933
- };
6934
- }, [
6935
- refreshToken,
6936
- useFactRevision("panels"),
6937
- workspace
6938
- ]);
6939
- return enabled;
6940
- }
6941
- function useSelectedProjectId() {
6942
- const [id, setId] = useState(() => selectedProjectId());
6943
- useEffect(() => subscribeProject(() => setId(selectedProjectId())), []);
6944
- return id;
6945
- }
6946
- function useBoardWorkspace(workspaces, sessions) {
6947
- const projectId = useSelectedProjectId();
6948
- const workspace = workspaces.items.find((item) => item.workspaceId === projectId) ?? workspaceOfSession(workspaces.items, currentSessionId(sessions, false));
6949
- return {
6950
- workspace,
6951
- path: workspace?.path ?? null
6952
- };
8188
+ //#region src/shared/hooks/panel-state-report.ts
8189
+ var FLUSH_MS = 400;
8190
+ var workspace = null;
8191
+ var timer = null;
8192
+ var pending = /* @__PURE__ */ new Map();
8193
+ function unitOfRoute(route) {
8194
+ const cut = route.indexOf("/");
8195
+ return cut <= 0 ? null : route.slice(0, cut);
8196
+ }
8197
+ function setPanelWorkspace(path) {
8198
+ if (path === workspace) return;
8199
+ const previous = workspace;
8200
+ workspace = path;
8201
+ if (previous !== null) pending.clear();
8202
+ }
8203
+ function reportPanelRead(input) {
8204
+ pending.set(`${input.unit}\u0000${input.route}`, {
8205
+ unit: input.unit,
8206
+ route: input.route,
8207
+ phase: input.phase,
8208
+ at: Date.now(),
8209
+ ...input.error === void 0 ? {} : { error: input.error }
8210
+ });
8211
+ if (timer !== null) return;
8212
+ timer = setTimeout(flush, FLUSH_MS);
8213
+ }
8214
+ function reportPanelCrash(input) {
8215
+ const target = workspace;
8216
+ if (target === null) return;
8217
+ apiPost(`${PANEL_STATE_PATH}/crash`, {
8218
+ workspace: target,
8219
+ unit: input.unit,
8220
+ reason: input.reason,
8221
+ at: Date.now()
8222
+ }).catch(() => void 0);
8223
+ }
8224
+ function flush() {
8225
+ timer = null;
8226
+ const target = workspace;
8227
+ const cards = [...pending.values()];
8228
+ pending.clear();
8229
+ if (target === null || cards.length === 0) return;
8230
+ apiPost(`${PANEL_STATE_PATH}/cards`, {
8231
+ workspace: target,
8232
+ cards
8233
+ }).catch(() => void 0);
6953
8234
  }
6954
8235
  var Rightbar_module_default = {
6955
8236
  panel: "_panel_135e7_1",
@@ -7004,7 +8285,7 @@ window.__ModuleLoader__.load({
7004
8285
  onClick: onCollapse
7005
8286
  })))));
7006
8287
  }
7007
- function BoardContent({ top, plan, world, board, twoColumns, panelToken, onPanelRefresh, onNavigate, onOpenMarket, onSummary, onOpenModules, buildModule, t }) {
8288
+ function BoardContent({ top, plan, world, board, twoColumns, panelToken, onPanelRefresh, onNavigate, onOpenMarket, onSummary, onOpenModules, onCardFailure, buildModule, t }) {
7008
8289
  if (top.kind !== "board") {
7009
8290
  const owner = board.stepOwner(top.kind);
7010
8291
  if (owner === void 0) return /* @__PURE__ */ h(CenteredState, {
@@ -7016,7 +8297,8 @@ window.__ModuleLoader__.load({
7016
8297
  key,
7017
8298
  unit: owner.id,
7018
8299
  resetKey: `${key}:${panelToken}:${workspacePathOf(world)}`,
7019
- t
8300
+ t,
8301
+ onFailure: (reason) => onCardFailure(owner.id, reason)
7020
8302
  }, /* @__PURE__ */ h(ModuleHost, {
7021
8303
  module: owner,
7022
8304
  step: top.kind,
@@ -7049,7 +8331,8 @@ window.__ModuleLoader__.load({
7049
8331
  key,
7050
8332
  unit: module.id,
7051
8333
  resetKey: `${key}:${panelToken}:${workspacePathOf(world)}`,
7052
- t
8334
+ t,
8335
+ onFailure: (reason) => onCardFailure(module.id, reason)
7053
8336
  }, /* @__PURE__ */ h(ModuleHost, {
7054
8337
  module,
7055
8338
  world,
@@ -7075,13 +8358,14 @@ window.__ModuleLoader__.load({
7075
8358
  const { capabilities } = useCapabilityMap(panelToken);
7076
8359
  const board = useBoardWorkspace(workspaces, sessions);
7077
8360
  const boardWorkspace = board.path;
7078
- const enabledUnits = useEnabledUnits(panelToken, boardWorkspace);
8361
+ const panelBoard = useEnabledUnits(panelToken, boardWorkspace);
8362
+ const enabledUnits = panelBoard?.units ?? null;
7079
8363
  const [modulesOpen, setModulesOpen] = useState(false);
7080
8364
  const fixtures = useBoardMock(fixtureRoster(manifests));
7081
8365
  const visibleModules = selectBoardModules(enabledUnits, (id) => modules.byId(id), capabilities);
7082
8366
  const plan = planBoard(fixtures.shape, {
7083
8367
  modules: visibleModules,
7084
- configRead: enabledUnits !== null
8368
+ configRead: panelBoard !== null
7085
8369
  }, fixtureSeed(manifests, modules.all(), crashModeOn(window.location.search)));
7086
8370
  const world = createSuiteWorld({
7087
8371
  workspaces,
@@ -7098,6 +8382,16 @@ window.__ModuleLoader__.load({
7098
8382
  [id]: next
7099
8383
  }));
7100
8384
  }, []);
8385
+ const onCardFailure = useCallback((unit, reason) => {
8386
+ reportPanelCrash({
8387
+ unit,
8388
+ reason
8389
+ });
8390
+ }, []);
8391
+ const fixtureMode = mockModeOn(window.location.search) || crashModeOn(window.location.search);
8392
+ useEffect(() => {
8393
+ setPanelWorkspace(fixtureMode ? null : boardWorkspace);
8394
+ }, [boardWorkspace, fixtureMode]);
7101
8395
  const summary = aggregateSummaries(plan.modules.map((entry) => summaries[entry.module.id]).filter((item) => item !== void 0));
7102
8396
  const feedEnabled = plan.modules.length > 0 || plan.reading;
7103
8397
  const shown = state.expanded;
@@ -7142,7 +8436,7 @@ window.__ModuleLoader__.load({
7142
8436
  onRefresh: refreshPanel,
7143
8437
  modulesOpen,
7144
8438
  onModulesOpenChange: setModulesOpen,
7145
- enabledUnits,
8439
+ enabledUnits: panelBoard,
7146
8440
  manifests,
7147
8441
  workspace: boardWorkspace,
7148
8442
  refreshToken: panelToken,
@@ -7163,6 +8457,7 @@ window.__ModuleLoader__.load({
7163
8457
  onOpenMarket: openMarket,
7164
8458
  onSummary,
7165
8459
  onOpenModules: () => setModulesOpen(true),
8460
+ onCardFailure,
7166
8461
  buildModule: props.buildModule,
7167
8462
  t: props.t
7168
8463
  })));
@@ -7663,10 +8958,7 @@ window.__ModuleLoader__.load({
7663
8958
  if (node.blank) return null;
7664
8959
  const primary = statuses[0];
7665
8960
  if (primary === void 0 || primary.state === "idle") return /* @__PURE__ */ h(Fragment, null, renderSlot("sidebar.session.row.leading", { sessionId: node.id }));
7666
- return /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
7667
- state: primary.state,
7668
- size: 10
7669
- }), statuses.map((status) => /* @__PURE__ */ h("span", {
8961
+ return /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: primary.state }), statuses.map((status) => /* @__PURE__ */ h("span", {
7670
8962
  className: "wb-visuallyHidden",
7671
8963
  key: status.label
7672
8964
  }, status.label)));
@@ -7741,6 +9033,21 @@ window.__ModuleLoader__.load({
7741
9033
  function panelLabel(entry) {
7742
9034
  return typeof entry.label === "function" ? entry.label() : entry.label;
7743
9035
  }
9036
+ function addWorkspace(input) {
9037
+ input.add().catch(() => null).then((path) => {
9038
+ if (path === null || path === "") return;
9039
+ input.onBusy(true);
9040
+ input.onFailed(false);
9041
+ input.create(path).catch(() => void 0).then((view) => {
9042
+ input.onBusy(false);
9043
+ if (view?.workspaceId === void 0) {
9044
+ input.onFailed(true);
9045
+ return;
9046
+ }
9047
+ input.onCreated(view.workspaceId);
9048
+ });
9049
+ });
9050
+ }
7744
9051
  function Sidebar(props) {
7745
9052
  const { collapsed, renderSlot, t, useWorkspaces, usePanelInfo } = props;
7746
9053
  const items = useWorkspaces((state) => state.items);
@@ -7750,6 +9057,8 @@ window.__ModuleLoader__.load({
7750
9057
  const sessions = props.useSessions((state) => state);
7751
9058
  const [storedId, setStoredId] = useState(() => selectedProjectId());
7752
9059
  const [panelEntries, setPanelEntries] = useState(() => props.listPanels());
9060
+ const [creating, setCreating] = useState(false);
9061
+ const [createFailed, setCreateFailed] = useState(false);
7753
9062
  useEffect(() => props.subscribePanels(() => setPanelEntries(props.listPanels())), [props]);
7754
9063
  useEffect(() => subscribeProject(() => setStoredId(selectedProjectId())), []);
7755
9064
  const current = items.find((workspace) => workspace.workspaceId === storedId) ?? items[0] ?? null;
@@ -7767,11 +9076,12 @@ window.__ModuleLoader__.load({
7767
9076
  });
7768
9077
  };
7769
9078
  const addProject = () => {
7770
- props.pickDirectory().then((path) => {
7771
- if (path === null || path === "") return;
7772
- props.createWorkspace(path).then((view) => {
7773
- if (view?.workspaceId !== void 0) pickProject(view.workspaceId);
7774
- });
9079
+ addWorkspace({
9080
+ add: props.pickDirectory,
9081
+ create: props.createWorkspace,
9082
+ onBusy: setCreating,
9083
+ onFailed: setCreateFailed,
9084
+ onCreated: pickProject
7775
9085
  });
7776
9086
  };
7777
9087
  const wide = !collapsed;
@@ -7802,14 +9112,20 @@ window.__ModuleLoader__.load({
7802
9112
  size: isWide ? 16 : 18,
7803
9113
  active
7804
9114
  }, { only: id })
7805
- }))), wide ? /* @__PURE__ */ h(ProjectSwitcher, {
9115
+ }))), wide ? /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(ProjectSwitcher, {
7806
9116
  items,
7807
9117
  current,
7808
9118
  onPick: pickProject,
7809
9119
  onAdd: addProject,
7810
9120
  onRename: props.renameWorkspace,
7811
9121
  t
7812
- }) : null, /* @__PURE__ */ h(WorkspaceSection, {
9122
+ }), creating ? /* @__PURE__ */ h("p", {
9123
+ className: "wb-workspaceBusy",
9124
+ role: "status"
9125
+ }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
9126
+ state: "ongoing",
9127
+ size: 12
9128
+ }), t("project.add.busy")) : null, createFailed ? /* @__PURE__ */ h("p", { className: "wb-workspaceError" }, t("project.add.failed")) : null) : null, /* @__PURE__ */ h(WorkspaceSection, {
7813
9129
  t,
7814
9130
  wide,
7815
9131
  onNewSession: () => {
@@ -7848,7 +9164,7 @@ window.__ModuleLoader__.load({
7848
9164
  var scale_default = ":root {\n --wb-dur-0-12: 0.12s;\n --wb-dur-0-15: 0.15s;\n --wb-dur-0-9: 0.9s;\n --wb-dur-1-4: 1.4s;\n --wb-dur-1-5: 1.5s;\n --wb-font-10: 10px;\n --wb-font-11-5: 11.5px;\n --wb-font-12-5: 12.5px;\n --wb-font-17: 17px;\n --wb-font-18: 18px;\n --wb-font-6: 6px;\n --wb-len-0-5: 0.5px;\n --wb-len-1: 1px;\n --wb-len-10: 10px;\n --wb-len-12: 12px;\n --wb-len-120: 120px;\n --wb-len-13: 13px;\n --wb-len-132: 132px;\n --wb-len-14: 14px;\n --wb-len-144: 144px;\n --wb-len-15: 15px;\n --wb-len-16: 16px;\n --wb-len-18: 18px;\n --wb-len-2: 2px;\n --wb-len-20: 20px;\n --wb-len-200: 200px;\n --wb-len-22: 22px;\n --wb-len-220: 220px;\n --wb-len-24: 24px;\n --wb-len-240: 240px;\n --wb-len-26: 26px;\n --wb-len-260: 260px;\n --wb-len-28: 28px;\n --wb-len-3: 3px;\n --wb-len-3-4em: 3.4em;\n --wb-len-30: 30px;\n --wb-len-300: 300px;\n --wb-len-32: 32px;\n --wb-len-320: 320px;\n --wb-len-34: 34px;\n --wb-len-36: 36px;\n --wb-len-360: 360px;\n --wb-len-38: 38px;\n --wb-len-4: 4px;\n --wb-len-440: 440px;\n --wb-len-40: 40px;\n --wb-len-420: 420px;\n --wb-len-42em: 42em;\n --wb-len-44: 44px;\n --wb-len-48: 48px;\n --wb-len-5: 5px;\n --wb-len-52: 52px;\n --wb-len-520: 520px;\n --wb-len-56: 56px;\n --wb-len-560: 560px;\n --wb-len-6: 6px;\n --wb-len-60: 60px;\n --wb-len-64: 64px;\n --wb-len-7: 7px;\n --wb-len-72: 72px;\n --wb-len-8: 8px;\n --wb-len-800: 800px;\n --wb-len-9: 9px;\n --wb-len-96: 96px;\n --wb-len-960: 960px;\n --wb-len-neg-0-5: -0.5px;\n --wb-len-neg-1-5: -1.5px;\n --wb-len-neg-12: -12px;\n --wb-len-neg-2: -2px;\n --wb-len-neg-3: -3px;\n --wb-len-neg-4: -4px;\n --wb-len-neg-6: -6px;\n --wb-len-neg-8: -8px;\n --wb-line-10: 10px;\n --wb-line-13: 13px;\n --wb-line-14: 14px;\n --wb-line-15: 15px;\n --wb-line-16: 16px;\n --wb-line-17: 17px;\n --wb-line-18: 18px;\n --wb-line-19: 19px;\n --wb-line-20: 20px;\n --wb-line-22: 22px;\n --wb-line-24: 24px;\n --wb-radius-14: 14px;\n --wb-radius-2: 2px;\n --wb-radius-6: 6px;\n --wb-radius-pill: 999px;\n --wb-track-brand: .04em;\n --wb-z-1100: 1100;\n --wb-z-10: 10;\n --wb-z-30: 30;\n --wb-z-40: 40;\n --wb-z-top: 2147483000;\n --wb-project-menu-min-width: 0;\n}\n";
7849
9165
  //#endregion
7850
9166
  //#region src/shared/styles/sidebar-app.css?raw
7851
- var sidebar_app_default = ".wb-wsSection {\n position: relative;\n flex: none;\n --dsh-session-list-edge-inset: var(--dsh-sidebar-inline-padding);\n --dsh-session-list-scrollbar-width: 5px;\n --dsh-session-list-scrollbar-offset: 2px;\n margin: 0 var(--dsh-session-list-scrollbar-offset) var(--wb-len-4) 0;\n padding-right: calc( var(--dsh-session-list-edge-inset) - var(--dsh-session-list-scrollbar-width) - var(--dsh-session-list-scrollbar-offset) );\n}.wb-sectionHeader {\n box-sizing: border-box;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n gap: var(--wb-len-4);\n height: var(--wb-len-36);\n flex: none;\n margin-bottom: var(--wb-len-4);\n padding-left: var(--wb-len-8);\n padding-right: var(--wb-len-2);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-tertiary);\n overflow: hidden;\n}.wb-wsNew {\n margin-left: auto;\n}.wb-sectionLabel {\n flex: none;\n min-width: 0;\n max-width: 45%;\n overflow: hidden;\n white-space: nowrap;\n line-height: var(--wb-line-20);\n}.wb-collapsed .wb-wsSection {\n margin: 0 0 var(--wb-len-12);\n padding-right: 0;\n}.wb-collapsed .wb-sectionHeader {\n justify-content: flex-start;\n gap: 0;\n margin-bottom: 0;\n padding-left: 0;\n padding-right: 0;\n}.wb-collapsed .wb-wsNew {\n margin-left: 0;\n}.wb-project {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}.wb-projectAnchor {\n display: block;\n width: 100%;\n min-width: var(--wb-project-menu-min-width, 0);\n}.wb-projectButton {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n width: 100%;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n text-align: left;\n cursor: pointer;\n user-select: none;\n}.wb-projectButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}.wb-projectButton:focus-visible {\n outline: var(--dsw-focus-ring-width) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}.wb-collapsed .wb-projectButton {\n justify-content: center;\n width: var(--wb-bar-height);\n height: var(--wb-bar-height);\n padding: 0;\n}.wb-collapsed .wb-projectName,\n.wb-collapsed .wb-projectChevron {\n display: none;\n}.wb-projectGlyph {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}.wb-projectGlyphActive {\n color: var(--dsw-alias-state-business-primary);\n}.wb-projectName {\n flex: 1;\n min-width: 0;\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}.wb-projectChevron {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n transition: transform var(--wb-dur-0-15) var(--ds-ease-in-out);\n}.wb-projectChevronOpen {\n transform: rotate(180deg);\n}.wb-sessions {\n --dsh-session-list-edge-inset: var(--dsh-sidebar-inline-padding);\n --dsh-session-list-scrollbar-width: 5px;\n --dsh-session-list-scrollbar-offset: 2px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n margin-left: var(--wb-len-neg-4);\n margin-right: var(--dsh-session-list-scrollbar-offset);\n padding-left: var(--wb-len-4);\n padding-right: calc( var(--dsh-session-list-edge-inset) - var(--dsh-session-list-scrollbar-width) - var(--dsh-session-list-scrollbar-offset) );\n padding-bottom: var(--wb-len-16);\n scrollbar-gutter: stable;\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n}.wb-sessions > * + * {\n margin-top: var(--wb-len-2);\n}.wb-sessionLeading {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}.wb-sessionPin {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n margin-left: var(--wb-len-6);\n color: var(--dsw-alias-label-caption);\n}.wb-rowActions {\n flex: none;\n display: none;\n align-items: center;\n gap: var(--wb-len-10);\n}.wb-rowActions .wb-iconButton {\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n}.wb-sessionRow:hover .wb-rowActions,\n.wb-sessionRow.wb-menuOpen .wb-rowActions {\n display: inline-flex;\n}.wb-sessionRow:hover .wb-sessionTime,\n.wb-sessionRow.wb-menuOpen .wb-sessionTime,\n.wb-sessionRow:hover .wb-sessionPin,\n.wb-sessionRow.wb-menuOpen .wb-sessionPin {\n display: none;\n}.wb-sessionRow.wb-menuOpen {\n background: var(--dsw-alias-interactive-bg-hover);\n}.wb-rowMenu {\n left: auto;\n right: 0;\n min-width: var(--wb-len-144);\n max-width: var(--wb-len-260);\n}.wb-sessionRow {\n position: relative;\n flex: none;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: 0;\n width: 100%;\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-8);\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n text-align: left;\n cursor: pointer;\n user-select: none;\n}.wb-sessionRow:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}.wb-sessionRow:focus-visible {\n outline: var(--dsw-focus-ring-width) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}.wb-visuallyHidden {\n clip: rect(0 0 0 0);\n white-space: nowrap;\n width: var(--wb-len-1);\n height: var(--wb-len-1);\n position: absolute;\n overflow: hidden;\n}.wb-sessionTitle {\n flex: 1;\n min-width: 0;\n margin: 0 var(--wb-len-6) 0 var(--wb-len-4);\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}.wb-sessionTime {\n flex: none;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}.wb-empty {\n padding: var(--wb-len-16) var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n color: var(--dsw-alias-label-tertiary);\n}@media (prefers-reduced-motion: reduce) {\n .wb-projectChevron {\n transition: none;\n }}.wb-sessionRow.wb-selected {\n background: var(--dsw-alias-interactive-bg-hover);\n}.wb-panelTag {\n flex: none;\n margin-left: auto;\n}.wb-panelGlyph {\n position: relative;\n}.wb-panelDot {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: var(--wb-len-neg-3);\n right: var(--wb-len-neg-3);\n}button.pXSMma_workspace {\n display: none;\n}";
9167
+ var sidebar_app_default = ".wb-wsSection {\n position: relative;\n flex: none;\n --dsh-session-list-edge-inset: var(--dsh-sidebar-inline-padding);\n --dsh-session-list-scrollbar-width: 5px;\n --dsh-session-list-scrollbar-offset: 2px;\n margin: 0 var(--dsh-session-list-scrollbar-offset) var(--wb-len-4) 0;\n padding-right: calc( var(--dsh-session-list-edge-inset) - var(--dsh-session-list-scrollbar-width) - var(--dsh-session-list-scrollbar-offset) );\n}.wb-sectionHeader {\n box-sizing: border-box;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n gap: var(--wb-len-4);\n height: var(--wb-len-36);\n flex: none;\n margin-bottom: var(--wb-len-4);\n padding-left: var(--wb-len-8);\n padding-right: var(--wb-len-2);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-tertiary);\n overflow: hidden;\n}.wb-wsNew {\n margin-left: auto;\n}.wb-sectionLabel {\n flex: none;\n min-width: 0;\n max-width: 45%;\n overflow: hidden;\n white-space: nowrap;\n line-height: var(--wb-line-20);\n}.wb-collapsed .wb-wsSection {\n margin: 0 0 var(--wb-len-12);\n padding-right: 0;\n}.wb-collapsed .wb-sectionHeader {\n justify-content: flex-start;\n gap: 0;\n margin-bottom: 0;\n padding-left: 0;\n padding-right: 0;\n}.wb-collapsed .wb-wsNew {\n margin-left: 0;\n}.wb-project {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}.wb-projectAnchor {\n display: block;\n width: 100%;\n min-width: var(--wb-project-menu-min-width, 0);\n}.wb-projectButton {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n width: 100%;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n text-align: left;\n cursor: pointer;\n user-select: none;\n}.wb-projectButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}.wb-projectButton:focus-visible {\n outline: var(--dsw-focus-ring-width) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}.wb-collapsed .wb-projectButton {\n justify-content: center;\n width: var(--wb-bar-height);\n height: var(--wb-bar-height);\n padding: 0;\n}.wb-collapsed .wb-projectName,\n.wb-collapsed .wb-projectChevron {\n display: none;\n}.wb-projectGlyph {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}.wb-projectGlyphActive {\n color: var(--dsw-alias-state-business-primary);\n}.wb-projectName {\n flex: 1;\n min-width: 0;\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}.wb-projectChevron {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n transition: transform var(--wb-dur-0-15) var(--ds-ease-in-out);\n}.wb-projectChevronOpen {\n transform: rotate(180deg);\n}.wb-sessions {\n --dsh-session-list-edge-inset: var(--dsh-sidebar-inline-padding);\n --dsh-session-list-scrollbar-width: 5px;\n --dsh-session-list-scrollbar-offset: 2px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n margin-left: var(--wb-len-neg-4);\n margin-right: var(--dsh-session-list-scrollbar-offset);\n padding-left: var(--wb-len-4);\n padding-right: calc( var(--dsh-session-list-edge-inset) - var(--dsh-session-list-scrollbar-width) - var(--dsh-session-list-scrollbar-offset) );\n padding-bottom: var(--wb-len-16);\n scrollbar-gutter: stable;\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n}.wb-sessions > * + * {\n margin-top: var(--wb-len-2);\n}.wb-sessionLeading {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}.wb-sessionPin {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n margin-left: var(--wb-len-6);\n color: var(--dsw-alias-label-caption);\n}.wb-rowActions {\n flex: none;\n display: none;\n align-items: center;\n gap: var(--wb-len-10);\n}.wb-rowActions .wb-iconButton {\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n}.wb-sessionRow:hover .wb-rowActions,\n.wb-sessionRow.wb-menuOpen .wb-rowActions {\n display: inline-flex;\n}.wb-sessionRow:hover .wb-sessionTime,\n.wb-sessionRow.wb-menuOpen .wb-sessionTime,\n.wb-sessionRow:hover .wb-sessionPin,\n.wb-sessionRow.wb-menuOpen .wb-sessionPin {\n display: none;\n}.wb-sessionRow.wb-menuOpen {\n background: var(--dsw-alias-interactive-bg-hover);\n}.wb-rowMenu {\n left: auto;\n right: 0;\n min-width: var(--wb-len-144);\n max-width: var(--wb-len-260);\n}.wb-sessionRow {\n position: relative;\n flex: none;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: 0;\n width: 100%;\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-8);\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n text-align: left;\n cursor: pointer;\n user-select: none;\n}.wb-sessionRow:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}.wb-sessionRow:focus-visible {\n outline: var(--dsw-focus-ring-width) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}.wb-visuallyHidden {\n clip: rect(0 0 0 0);\n white-space: nowrap;\n width: var(--wb-len-1);\n height: var(--wb-len-1);\n position: absolute;\n overflow: hidden;\n}.wb-sessionTitle {\n flex: 1;\n min-width: 0;\n margin: 0 var(--wb-len-6) 0 var(--wb-len-4);\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}.wb-sessionTime {\n flex: none;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}.wb-workspaceBusy {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: var(--wb-len-4) var(--wb-len-8) 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}.wb-workspaceError {\n margin: var(--wb-len-4) var(--wb-len-8) 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n}.wb-empty {\n padding: var(--wb-len-16) var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n color: var(--dsw-alias-label-tertiary);\n}@media (prefers-reduced-motion: reduce) {\n .wb-projectChevron {\n transition: none;\n }}.wb-sessionRow.wb-selected {\n background: var(--dsw-alias-interactive-bg-hover);\n}.wb-panelTag {\n flex: none;\n margin-left: auto;\n}.wb-panelGlyph {\n position: relative;\n}.wb-panelDot {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: var(--wb-len-neg-3);\n right: var(--wb-len-neg-3);\n}button.pXSMma_workspace {\n display: none;\n}";
7852
9168
  //#endregion
7853
9169
  //#region src/shared/styles/sidebar.css?raw
7854
9170
  var sidebar_default = ".wb-root{--dsh-sidebar-inline-padding:12px;height:100%;padding:var(--wb-len-6) var(--dsh-sidebar-inline-padding);box-sizing:border-box;background:var(--dsw-specific-sidebar-fill);color:var(--dsw-alias-label-primary);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);flex-direction:column;font-size:var(--dsw-font-s-14-font-size);display:flex}[data-platform=darwin] .wb-root{background:0 0}.wb-root.wb-collapsed{padding:var(--wb-len-18) var(--wb-len-10) var(--wb-len-6)}[data-windows-titlebar] .wb-root .wb-logoRow{height:var(--wb-len-40);margin:0;padding:0}[data-windows-titlebar] .wb-toggle{top:calc((var(--dsh-windows-titlebar-height) - var(--wb-len-28)) / 2);z-index:var(--wb-z-30);-webkit-app-region:no-drag;position:fixed;left:var(--wb-len-12)}[data-windows-titlebar] .wb-root.wb-collapsed .wb-logoRow{height:0}[data-windows-titlebar] .wb-root:not(.wb-collapsed) .wb-brand{padding-left:var(--wb-len-4)}[data-windows-titlebar] .wb-brandIdentity{transform:translateY(1px)}[data-windows-titlebar] .wb-brandMark{transform:translate(1px)}[data-windows-titlebar] .wb-brandName{font-weight:400}[data-windows-titlebar] .wb-root.wb-collapsed{padding:0}[data-windows-titlebar] .wb-root:not(.wb-collapsed) .wb-newSession{margin-top:var(--wb-len-8);margin-left:0}[data-windows-titlebar] .wb-collapsed .wb-panelList,[data-windows-titlebar] .wb-collapsed .wb-regionArea,[data-windows-titlebar] .wb-collapsed .wb-footArea{display:none}html[data-windows-titlebar]:has([data-sidebar-collapsed=true]){--dsh-windows-menu-start:84px}[data-windows-titlebar] .wb-collapsed .wb-newSession{top:calc((var(--dsh-windows-titlebar-height) - var(--wb-len-28)) / 2);z-index:var(--wb-z-30);-webkit-app-region:no-drag;border:none;margin:0;padding:0;position:fixed;left:var(--wb-len-48)}[data-windows-titlebar] .wb-railIn .wb-iconButton,[data-windows-titlebar] .wb-railIn .wb-newSession{animation:none}[data-windows-titlebar] .wb-collapsed .wb-toggle,[data-windows-titlebar] .wb-collapsed .wb-newSession{corner-shape:round;width:var(--wb-len-28);height:var(--wb-len-28);color:var(--dsw-alias-label-secondary);border-radius:50%}[data-windows-titlebar] .wb-collapsed .wb-toggle .wb-panelIcon{display:inline-flex}.wb-root.wb-quietBars{--dsh-scrollbar-thumb:transparent;--dsh-scrollbar-thumb-hover:transparent}.wb-fading>*{opacity:0;transition:opacity var(--wb-dur-0-15) var(--ds-ease-in-out)}.wb-wide{animation:wb-wide-in var(--ds-transition-duration) var(--ds-ease-in-out)}@keyframes wb-wide-in{0%{opacity:0}}.wb-railIn .wb-iconButton,.wb-railIn .wb-newSession,.wb-railIn .wb-panelList,.wb-railIn .wb-regionArea{animation:wb-rail-in var(--wb-dur-0-15) var(--ds-ease-in-out) backwards}.wb-railIn .wb-footArea{animation:wb-rail-fade-in var(--wb-dur-0-15) var(--ds-ease-in-out) backwards}@keyframes wb-rail-in{0%{opacity:0;transform:translate(49px)}}@keyframes wb-rail-fade-in{0%{opacity:0}}.wb-topStrip{box-sizing:border-box;height:var(--wb-len-52);margin:var(--wb-len-neg-6) calc(-1 * var(--dsh-sidebar-inline-padding)) 0;flex:none;justify-content:flex-end;align-items:center;padding:0 var(--wb-len-12) var(--wb-len-2);display:flex}[data-fullscreen] .wb-topStrip{justify-content:flex-start}.wb-topStrip+.wb-logoRow{margin-top:var(--wb-len-neg-12)}.wb-logoRow{box-sizing:border-box;flex:none;justify-content:flex-end;align-items:center;gap:var(--wb-len-8);height:var(--wb-len-60);margin-bottom:var(--wb-len-4);padding:var(--wb-len-8) 0 var(--wb-len-8) var(--wb-len-4);display:flex;overflow:hidden}.wb-collapsed .wb-logoRow{justify-content:flex-start;height:var(--wb-len-36);margin-bottom:var(--wb-len-12);padding:0;overflow:visible}.wb-brand{min-width:0;color:inherit;cursor:pointer;background:0 0;border:none;flex:1;align-items:center;padding:0;display:inline-flex;overflow:hidden}[data-platform=darwin] .wb-brand{cursor:default}.wb-brandIdentity{align-items:center;gap:var(--wb-len-8);min-width:0;height:var(--wb-len-24);display:inline-flex}.wb-brandMark{flex:none;justify-content:center;align-items:center;display:inline-flex}.wb-brandName{letter-spacing:var(--wb-track-brand);align-items:center;gap:var(--wb-len-6);min-width:0;height:var(--wb-len-24);font-size:var(--wb-font-18);font-weight:600;line-height:var(--wb-line-24);display:inline-flex}.wb-fallbackBrandName{letter-spacing:0;white-space:nowrap;font-size:var(--wb-font-17)}.wb-localBuildBrand{white-space:nowrap;flex-direction:column;flex:none;justify-content:center;align-items:flex-start;gap:var(--wb-len-1);height:var(--wb-len-24);display:inline-flex}.wb-localBuildTitle{letter-spacing:0;font-size:var(--dsw-font-xxs-12-font-size);line-height:var(--wb-line-13)}.wb-panelIcon{display:inline-flex;align-items:center;justify-content:center}.wb-iconButton{border-radius:var(--dsw-radius-sm);cursor:pointer;width:var(--wb-len-28);height:var(--wb-len-28);color:var(--dsw-alias-label-secondary);background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex;position:relative}.wb-iconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.wb-iconButton.wb-toggle:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}.wb-collapsed .wb-iconButton{border-radius:var(--dsw-radius-md);width:var(--wb-len-36);height:var(--wb-len-36)}.wb-collapsed .wb-toggle .wb-panelIcon{display:none}.wb-collapsed .wb-toggle:hover .wb-panelIcon{display:inline}.wb-collapsed .wb-toggle:hover .wb-railMark{display:none}.wb-railMark{justify-content:center;align-items:center;display:inline-flex}.wb-collapsed .wb-iconButton{color:var(--dsw-alias-label-primary)}.wb-buildVersion{height:var(--wb-len-10);color:var(--dsw-alias-label-primary-inverted);background:var(--dsw-alias-label-primary);font-family:var(--ds-font-family-code);white-space:nowrap;border-radius:var(--wb-radius-2);flex:none;align-items:center;padding:0 var(--wb-len-3);font-size:var(--wb-font-6);font-weight:500;line-height:var(--wb-line-10);display:inline-flex}.wb-newSession{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-button-elevated-fill);height:var(--wb-len-38);color:var(--dsw-alias-label-primary);cursor:pointer;flex:none;justify-content:center;align-items:center;gap:0;margin:0 var(--wb-len-2) var(--wb-len-12);padding:var(--wb-len-8) var(--wb-len-12);font-size:var(--dsw-font-s-14-font-size);font-weight:500;line-height:var(--wb-line-22);display:flex;position:relative;overflow:hidden;container-type:inline-size}.wb-newSession:hover{background:var(--dsw-alias-button-floating-hover)}[data-platform=darwin] .wb-newSession{background:var(--wb-static-titlebar-fill)}[data-platform=darwin] .wb-newSession:hover{background:var(--wb-static-titlebar-fill-hover)}[data-platform=darwin] [data-ds-dark-theme] .wb-newSession{background:var(--wb-static-titlebar-fill-dark)}[data-platform=darwin] [data-ds-dark-theme] .wb-newSession:hover{background:var(--wb-static-titlebar-fill-dark-hover)}.wb-collapsed .wb-newSession{background:0 0;border-color:transparent;align-self:flex-start;gap:0;width:var(--wb-len-36);height:var(--wb-len-36);margin:0 0 var(--wb-len-12);padding:0}.wb-collapsed .wb-newSession:hover{background:var(--dsw-alias-interactive-bg-hover)}.wb-newSessionLabel{white-space:nowrap;max-width:var(--wb-len-200);overflow:hidden}.wb-collapsed .wb-newSessionLabel{max-width:0}.wb-newSessionLabelMask{flex:1;min-width:0}.wb-newSession:is(:hover,:focus-visible) .wb-newSessionLabelMask:has(+.wb-newSessionShortcut){overflow:hidden;mask-image:linear-gradient(90deg,var(--wb-static-mask-opaque) calc(100% - var(--wb-len-16)),transparent)}.wb-newSessionContent{justify-content:center;align-items:center;gap:var(--wb-len-6);width:100cqw;display:flex}.wb-newSessionContent>svg{flex:none}.wb-newSessionShortcut{opacity:0;pointer-events:none;flex:none;font-weight:400;display:inline-flex}.wb-newSession:is(:hover,:focus-visible) .wb-newSessionShortcut{opacity:1}.wb-panelList{flex-direction:column;flex:none;gap:var(--wb-len-4);margin-bottom:var(--wb-len-8);display:flex}.wb-panelRow{box-sizing:border-box;border-radius:var(--dsw-radius-md);min-height:var(--wb-len-36);color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:var(--wb-len-8);margin:0 var(--wb-len-2);padding:var(--wb-len-7) var(--wb-len-8);line-height:var(--wb-line-22);display:flex}.wb-panelRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.wb-panelRow.wb-panelActive{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.wb-panelRow:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}.wb-panelGlyph{flex:none;justify-content:center;align-items:center;display:inline-flex}.wb-panelTitle{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.wb-collapsed .wb-panelList{gap:var(--wb-len-12);margin-bottom:var(--wb-len-12)}.wb-collapsed .wb-panelRow{width:var(--wb-len-36);height:var(--wb-len-36);color:var(--dsw-alias-label-primary);justify-content:center;margin:0;padding:0}.wb-regionArea{min-height:0;margin-left:var(--wb-len-neg-4);margin-right:calc(-1 * var(--dsh-sidebar-inline-padding));flex-direction:column;flex:1;padding-left:var(--wb-len-4);display:flex;overflow:hidden}.wb-collapsed .wb-regionArea{margin-left:0;margin-right:0;padding-left:0}.wb-footArea{flex-direction:column;flex:none;display:flex}.wb-settingsArea,.wb-footerActions{flex:none;width:100%;min-width:0}.wb-footerActions{display:flex}.wb-collapsed .wb-footArea{align-items:center}.wb-collapsed .wb-settingsArea,.wb-collapsed .wb-footerActions{justify-content:center;width:auto;display:flex}@media (prefers-reduced-motion:reduce){.wb-wide,.wb-fading>*,.wb-railIn .wb-iconButton,.wb-railIn .wb-newSession,.wb-railIn .wb-panelList,.wb-railIn .wb-footArea,.wb-railIn .wb-regionArea{transition:none;animation:none}}\n";
@@ -7935,6 +9251,12 @@ window.__ModuleLoader__.load({
7935
9251
  ...prev.at === void 0 ? {} : { at: prev.at }
7936
9252
  } : { phase: "loading" });
7937
9253
  const flight = requestResource(route, queryRef.current, key);
9254
+ const owner = unitOfRoute(route);
9255
+ if (owner !== null) reportPanelRead({
9256
+ unit: owner,
9257
+ route,
9258
+ phase: "loading"
9259
+ });
7938
9260
  flight.task.then((response) => {
7939
9261
  if (cancelled) return;
7940
9262
  if (response.ok) {
@@ -7943,19 +9265,43 @@ window.__ModuleLoader__.load({
7943
9265
  value: response,
7944
9266
  at: Date.now()
7945
9267
  });
9268
+ if (owner !== null) reportPanelRead({
9269
+ unit: owner,
9270
+ route,
9271
+ phase: "ready"
9272
+ });
7946
9273
  return;
7947
9274
  }
7948
9275
  setState({
7949
9276
  phase: "error",
7950
9277
  error: response.error
7951
9278
  });
9279
+ if (owner !== null) reportPanelRead({
9280
+ unit: owner,
9281
+ route,
9282
+ phase: "error",
9283
+ error: {
9284
+ code: response.error.code,
9285
+ message: response.error.message
9286
+ }
9287
+ });
7952
9288
  }).catch((reason) => {
7953
9289
  if (cancelled) return;
9290
+ const message = reason instanceof Error ? reason.message : String(reason);
7954
9291
  setState({
7955
9292
  phase: "error",
7956
9293
  error: {
7957
9294
  code: "network",
7958
- message: reason instanceof Error ? reason.message : String(reason)
9295
+ message
9296
+ }
9297
+ });
9298
+ if (owner !== null) reportPanelRead({
9299
+ unit: owner,
9300
+ route,
9301
+ phase: "error",
9302
+ error: {
9303
+ code: "network",
9304
+ message
7959
9305
  }
7960
9306
  });
7961
9307
  });
@@ -8224,7 +9570,7 @@ window.__ModuleLoader__.load({
8224
9570
  ...face.messages === void 0 ? {} : { messages: face.messages }
8225
9571
  }));
8226
9572
  }
8227
- 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*/";
9573
+ 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_csyus_1 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._marketRow_csyus_10 {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--wb-len-14);\n row-gap: var(--wb-len-4);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-lg);\n}\n\n._marketIcon_csyus_20 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-40);\n height: var(--wb-len-40);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketMain_csyus_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_csyus_39 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketDesc_csyus_48 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketUsedBy_csyus_59 {\n margin-left: var(--wb-len-8);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n opacity: 0.75;\n}\n\n._marketUsedBy_csyus_59::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_csyus_39 ._marketVersion_csyus_73 {\n margin-left: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n}\n\n._marketVersion_csyus_73 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_csyus_73::before {\n content: '';\n display: inline-block;\n width: var(--wb-len-1);\n height: var(--wb-len-10);\n margin: 0 var(--wb-len-8) 0 var(--wb-len-2);\n vertical-align: -1px;\n background: var(--dsw-alias-border-l2);\n}\n\n._marketLocalTag_csyus_95 {\n margin-left: var(--wb-len-8);\n padding: 0 var(--wb-len-6);\n border: var(--wb-len-1) solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n}\n\n._marketEnd_csyus_106 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113::before {\n content: '';\n width: 0;\n height: var(--wb-len-14);\n border-left: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketActions_csyus_126 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_csyus_132 {\n color: var(--dsw-alias-state-warn-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._marketSelfDivider_csyus_138 {\n height: 0;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_csyus_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_csyus_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_csyus_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_csyus_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_csyus_169 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n\n._marketProgress_csyus_176 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-height: var(--wb-len-32);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketNote_csyus_186 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-warn-primary);\n overflow-wrap: anywhere;\n}\n\n._marketNotePlain_csyus_193 {\n grid-column: 2 / -1;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n overflow-wrap: anywhere;\n}\n\n._marketFailure_csyus_201 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._marketEmpty_csyus_208 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_csyus_213 {\n box-sizing: border-box;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-32);\n padding: 0 clamp(var(--wb-len-24), 4vw, var(--wb-len-48)) var(--wb-len-48);\n overflow-x: hidden;\n overflow-y: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_csyus_213 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_csyus_231 {\n box-sizing: border-box;\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-16);\n padding-top: var(--wb-len-28);\n}\n\n._marketPageTitle_csyus_239 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_csyus_244 {\n margin: var(--wb-len-4) 0 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketPageTools_csyus_250 {\n flex: none;\n align-self: center;\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--wb-len-16);\n}\n\n._marketIconButton_csyus_259 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n color: var(--dsw-alias-label-caption);\n cursor: pointer;\n}\n\n._marketIconButton_csyus_259:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_csyus_259:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_csyus_284 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_csyus_288 svg {\n animation: _wb-spin_csyus_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_csyus_292 {\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n border-radius: var(--dsw-radius-md);\n}\n\n._marketEmpty_csyus_208 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-64) var(--wb-len-16);\n text-align: center;\n}\n\n._marketChecking_csyus_309 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketEmptyTitle_csyus_317 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_csyus_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._foot_1ud1j_1 {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._footText_1ud1j_13 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1ud1j_18 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._wide_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_15ptp_1 {\n display: flex;\n align-items: center;\n}\n\n._pop_15ptp_6 {\n position: absolute;\n top: calc(var(--wb-len-38) + var(--wb-len-8));\n right: var(--wb-len-6);\n z-index: var(--wb-z-30);\n width: min(var(--wb-len-360), calc(100% - var(--wb-len-12)));\n max-width: calc(100vw - var(--wb-len-48));\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-2);\n box-shadow: var(--dsw-shadow-lv3);\n overflow: hidden;\n}\n\n._head_15ptp_20 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10) var(--wb-len-12) var(--wb-len-9) var(--wb-len-14);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._title_15ptp_28 {\n flex: 1;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._rowControls_15ptp_36 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._reset_15ptp_43 {\n flex: none;\n padding: var(--wb-len-3) var(--wb-len-8);\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._reset_15ptp_43:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_15ptp_43:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_15ptp_65 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._row_15ptp_36 {\n position: relative;\n display: grid;\n grid-template-columns: 12px minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-sm);\n cursor: default;\n}\n\n._rowDragging_15ptp_85 {\n cursor: grabbing;\n}\n\n._rowBlocked_15ptp_89 {\n cursor: not-allowed;\n}\n\n._listDragging_15ptp_93 ._rowControls_15ptp_36 {\n pointer-events: none;\n}\n\n._row_15ptp_36:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOff_15ptp_101 {\n opacity: 0.55;\n}\n\n._rowOff_15ptp_101:hover {\n opacity: 1;\n}\n\n._rowOver_15ptp_109::before {\n content: '';\n position: absolute;\n top: var(--wb-len-neg-3);\n left: var(--wb-len-8);\n right: var(--wb-len-8);\n height: var(--wb-len-2);\n background: var(--dsw-alias-brand-primary);\n}\n\n._ghost_15ptp_119 {\n position: fixed;\n z-index: var(--wb-z-40);\n pointer-events: none;\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--wb-static-shadow-ghost);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n}\n\n._grip_15ptp_134 {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n text-align: center;\n color: var(--dsw-alias-label-tertiary);\n user-select: none;\n cursor: grab;\n touch-action: none;\n}\n\n._gripDragging_15ptp_144 {\n cursor: grabbing;\n}\n\n._gripBlocked_15ptp_148 {\n cursor: not-allowed;\n}\n\n._label_15ptp_152 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_15ptp_159 {\n min-width: 0;\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n\n._error_15ptp_170 {\n margin: 0;\n padding: 0 var(--wb-len-14) var(--wb-len-10);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._dep_15ptp_178 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n\n._group_15ptp_186 {\n padding-top: var(--wb-len-6);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._groupTitle_15ptp_191 {\n margin: 0;\n padding: var(--wb-len-2) var(--wb-len-8) 0 var(--wb-len-14);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n font-weight: 400;\n color: var(--dsw-alias-label-tertiary);\n}\n._panel_135e7_1 {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: var(--wb-z-10);\n visibility: hidden;\n}\n\n._panel_135e7_1[data-fullscreen] {\n z-index: var(--wb-z-40);\n}\n\n._panel_135e7_1[data-open] {\n visibility: visible;\n}\n\n._columns_135e7_18 {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n align-items: start;\n gap: var(--wb-len-12);\n}\n\n._columns_135e7_18[data-two] {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n._column_135e7_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._root_1vd78_1 {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}\n\n._anchor_1vd78_7 {\n display: block;\n width: 100%;\n}\n\n._menu_1vd78_12 {\n min-width: var(--wb-len-240);\n max-width: var(--wb-len-360);\n}\n\n._trigger_1vd78_17 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n width: 100%;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n._trigger_1vd78_17:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._trigger_1vd78_17:focus-visible {\n outline: var(--dsw-focus-ring-width) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n._glyph_1vd78_44 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._glyphActive_1vd78_54 {\n color: var(--dsw-alias-state-business-primary);\n}\n\n._triggerName_1vd78_58 {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n._dir_1vd78_69 {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._name_1vd78_77 {\n flex: 0 1 auto;\n max-width: 50%;\n font-size: var(--dsw-font-xxs-12-font-size);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._triggerName_1vd78_58 ._name_1vd78_77 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._chevron_1vd78_90 {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n}\n\n._row_1vd78_96 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n width: 100%;\n min-width: 0;\n}\n\n._trailing_1vd78_104 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n margin-inline-start: auto;\n}\n\n._trailing_1vd78_104 ._rowAction_1vd78_114 {\n width: var(--wb-len-20);\n min-width: var(--wb-len-20);\n height: var(--wb-len-20);\n min-height: var(--wb-len-20);\n padding: 0;\n border-radius: var(--dsw-radius-sm);\n}\n\n._row_1vd78_96 ._name_1vd78_77 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._current_1vd78_127 {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-primary);\n}\n\n._field_1vd78_134 {\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n box-sizing: border-box;\n width: 100%;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._field_1vd78_134:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n}\n\n._searchIcon_1vd78_151 {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._field_1vd78_134 ._search_1vd78_151 {\n flex: 1;\n min-width: 0;\n height: var(--wb-len-24);\n border: none;\n background: transparent;\n}\n\n._field_1vd78_134 ._search_1vd78_151:focus {\n border-color: transparent;\n box-shadow: none;\n}\n._dialog_1vye5_1 {\n width: min(var(--wb-len-420), 100%);\n}\n\n._stack_1vye5_5 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._input_1vye5_12 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-12);\n}\n\n._meta_1vye5_18 {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._blocker_1oaj0_1 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-20) var(--wb-len-16);\n text-align: center;\n}\n\n._icon_1oaj0_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_1oaj0_15 {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_1oaj0_23 {\n margin: 0;\n max-width: var(--wb-len-42em);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n text-wrap: pretty;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 {\n align-items: flex-start;\n gap: var(--wb-len-6);\n padding: var(--wb-len-4) 0 var(--wb-len-2);\n text-align: left;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._title_1oaj0_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._hint_1oaj0_23 {\n max-width: 100%;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._actions_1oaj0_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._raw_1oaj0_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_1oaj0_48 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-6);\n}\n\n._raw_1oaj0_52 {\n margin-top: var(--wb-len-10);\n width: 100%;\n max-width: var(--wb-len-360);\n text-align: left;\n}\n\n._notice_1oaj0_71 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n column-gap: var(--wb-len-10);\n margin: 0 0 var(--wb-len-10);\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-left: 2px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._notice_1oaj0_71._noticeFlat_1oaj0_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_1oaj0_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_1oaj0_98 {\n font-size: var(--wb-font-12-5);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._noticeHint_1oaj0_105 {\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._noticeActions_1oaj0_112 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin-top: var(--wb-len-neg-2);\n}\n\n._failure_1oaj0_119 {\n margin: var(--wb-len-8) 0 0;\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._failureDetail_1oaj0_127 {\n display: block;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-label-tertiary);\n white-space: pre-wrap;\n}\n\n._inlineAction_1oaj0_134 {\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n}\n\n._inlineAction_1oaj0_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n._rawText_1oaj0_146 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
8228
9574
  function workbenchCss() {
8229
9575
  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}`;
8230
9576
  }
@@ -8358,16 +9704,6 @@ window.__ModuleLoader__.load({
8358
9704
  };
8359
9705
  const rightbarHooks = { hooks: { rightbar: observable } };
8360
9706
  const sidebarRight = () => ctx.get("sidebarRight");
8361
- const dshColumn = createDshColumnSource(() => {
8362
- const official = sidebarRight();
8363
- if (official === void 0) return false;
8364
- return official.mounted.getSnapshot() === void 0 || official.isExpanded();
8365
- }, 400);
8366
- let pendingDshOpen = false;
8367
- let pendingOfficialCall;
8368
- let unsubscribeOfficial;
8369
- let restoreOfficial;
8370
- let officialShimmed = false;
8371
9707
  let workbenchColumnArmed = false;
8372
9708
  let disposeWorkbenchColumn;
8373
9709
  const armWorkbenchColumn = () => {
@@ -8389,87 +9725,37 @@ window.__ModuleLoader__.load({
8389
9725
  disposeWorkbenchColumn?.();
8390
9726
  disposeWorkbenchColumn = void 0;
8391
9727
  };
8392
- const flushOfficialCall = () => {
8393
- const official = sidebarRight();
8394
- if (official === void 0 || official.mounted.getSnapshot() === void 0) return;
8395
- if (pendingDshOpen) {
8396
- pendingDshOpen = false;
8397
- if (!official.isExpanded()) official.toggleExpanded();
8398
- }
8399
- const call = pendingOfficialCall;
8400
- pendingOfficialCall = void 0;
8401
- call?.();
8402
- };
8403
- const watchOfficial = () => {
8404
- const official = sidebarRight();
8405
- if (official === void 0 || unsubscribeOfficial !== void 0) return;
8406
- unsubscribeOfficial = official.mounted.subscribe(flushOfficialCall);
8407
- };
8408
- const armDshColumn = () => {
8409
- const official = sidebarRight();
8410
- if (official === void 0) return false;
8411
- if (official.mounted.getSnapshot() !== void 0) {
8412
- if (!official.isExpanded()) official.toggleExpanded();
8413
- return true;
8414
- }
8415
- watchOfficial();
8416
- store.setColumn("dsh");
8417
- ctx.layout.closeRightbar();
8418
- releaseWorkbenchColumn();
8419
- pendingDshOpen = true;
8420
- return false;
8421
- };
8422
- const openInDshColumn = (call) => {
8423
- shimOfficialNavigation();
8424
- if (sidebarRight() === void 0) return;
8425
- if (armDshColumn()) {
8426
- call();
8427
- return;
9728
+ const borrow = createDshBorrow({
9729
+ official: sidebarRight,
9730
+ yieldColumn: () => {
9731
+ store.setColumn("dsh");
9732
+ ctx.layout.closeRightbar();
9733
+ releaseWorkbenchColumn();
9734
+ },
9735
+ reclaimColumn: () => {
9736
+ store.setColumn("workbench");
9737
+ armWorkbenchColumn();
9738
+ store.setExpanded(true);
8428
9739
  }
8429
- pendingOfficialCall = call;
8430
- };
8431
- const shimOfficialNavigation = () => {
8432
- const official = sidebarRight();
8433
- if (official === void 0 || officialShimmed) return;
8434
- const { openResource, openTab } = official;
8435
- if (typeof openResource !== "function" || typeof openTab !== "function") return;
8436
- officialShimmed = true;
8437
- official.openResource = (address, options) => openInDshColumn(() => openResource.call(official, address, options));
8438
- official.openTab = (kind, options) => openInDshColumn(() => openTab.call(official, kind, options));
8439
- restoreOfficial = () => {
8440
- official.openResource = openResource;
8441
- official.openTab = openTab;
8442
- officialShimmed = false;
8443
- };
8444
- };
9740
+ });
9741
+ const dshColumn = createDshColumnSource(() => borrow.open(), 400);
8445
9742
  const selectColumn = (column) => {
8446
9743
  if (store.getSnapshot().column === column) {
8447
9744
  if (column === "workbench") {
8448
9745
  rightbarActions.toggleRightbar();
8449
9746
  return;
8450
9747
  }
8451
- const current = sidebarRight();
8452
- if (current === void 0 || current.mounted.getSnapshot() === void 0) return;
8453
- current.toggleExpanded();
9748
+ borrow.toggle();
8454
9749
  return;
8455
9750
  }
8456
9751
  if (column === "workbench") {
8457
- store.setColumn("workbench");
8458
- pendingDshOpen = false;
8459
- armWorkbenchColumn();
8460
- store.setExpanded(true);
9752
+ borrow.back();
8461
9753
  return;
8462
9754
  }
8463
- openInDshColumn(() => {});
8464
- };
8465
- ctx.effect(() => () => {
8466
- unsubscribeOfficial?.();
8467
- unsubscribeOfficial = void 0;
8468
- restoreOfficial?.();
8469
- restoreOfficial = void 0;
8470
- }, "dsh-workbench: 官方椅面订阅与借道");
8471
- shimOfficialNavigation();
8472
- watchOfficial();
9755
+ borrow.use();
9756
+ };
9757
+ ctx.effect(() => () => borrow.dispose(), "dsh-workbench: 官方椅面订阅与借道");
9758
+ borrow.start();
8473
9759
  if (store.getSnapshot().column === "workbench") armWorkbenchColumn();
8474
9760
  ctx.slots.inject("sidebar", () => ctx.slots.register({
8475
9761
  name: "sidebar",